2017-11-14 2 views
0

음악 플레이어를 만들고 GTK3 +를 사용하여 사용자 인터페이스를 만들려고합니다. SDL2가 GTK3 + 창을 사용하는 대신 SDL2를 사용하도록하기 위해 SDL_CreateWindowFrom 함수를 사용하고 있습니다. 그러나 SDL2 텍스처를 GTK3 + 창에 렌더링하기 위해 따라야 할 단계를 파악할 수 없습니다. 당신이 넣어 예를 효과적으로 불완전도에 가장 중요한 비트이기 때문에SDL2 텍스처를 GTK3 + 윈도우에 렌더링하는 방법은 무엇입니까?

코드 점점 GTK3 창 ID

window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
gtk_window_set_title(GTK_WINDOW(window), "---"); 
gtk_widget_show(window); 
gdkWin = gtk_widget_get_window(GTK_WIDGET(window)); 
data->playContext->winID = GDK_WINDOW_XID(gdkWin); 
gtk_main(); 

코드 설정 SDL2 창

playContext->display->window = SDL_CreateWindowFrom((const void *)playContext->winID); 
playContext->display->renderer = SDL_CreateRenderer(playContext->display->window, -1, playContext->display->render_flags); 

코드 렌더링 SDL2 텍스처

SDL_RenderClear(playContext->display->renderer); 
SDL_RenderCopy(playContext->display->renderer, playContext->textureQ.head->bmp, NULL, NULL); 
SDL_RenderPresent(playContext->display->renderer); 
+1

당신은 당신이 그렇게하려고 한 것을 설명하기위한 최소한의 예를 게시한다 멀리 그리고 당신이 성취하려는 것. 코드 없이는 무엇을하고 있는지보기가 어렵습니다. SDL2에 'SDL_WINDOWID'가 없으므로 설정 만해도 효과가 없습니다. SDL 소스의'tests/testnative.c'에서 볼 수 있듯이'SDL_CreateWindowFrom'을 사용해야하지만, OpenGL과 함께 사용하는 것은 다소 까다 롭습니다. – keltar

+0

많은 수색을 한 후 SDL_WINDOWID이 (가) 내 마음에 머물렀다. –

답변

2

(예 : 렌더러 생성 플래그), 어떤 부분이 문제는 여기에 내 예입니다 (내 시스템에, GTK2 및 gtk3 모두에서 작동 - 나는 그것이 비록 완전히 괜찮 보증 할 것이다) :

#include <stdio.h> 
#include <gtk/gtk.h> 
#include <gdk/gdkx.h> 
#include <SDL.h> 
#include <stdbool.h> 

static SDL_Window *sdl_window; 
static SDL_Renderer *sdl_renderer; 
static SDL_Surface *sdl_surface; 
static GtkWindow *gtk_window; 
static GtkWidget *gtk_da; 
static void *gdk_window; 
static void *window_id; 

static gboolean idle(void *ud) { 
    (void)ud; 
    if(!sdl_window) { 
     printf("creating SDL window for window id %p\n", window_id); 
     sdl_window = SDL_CreateWindowFrom(window_id); 
     printf("sdl_window=%p\n", sdl_window); 
     if(!sdl_window) { 
      printf("%s\n", SDL_GetError()); 
     } 
     sdl_renderer = SDL_CreateRenderer(sdl_window, -1, 0); 
     printf("sdl_renderer=%p\n", sdl_renderer); 
     if(!sdl_renderer) { 
      printf("%s\n", SDL_GetError()); 
     } 
    } else { 
     SDL_SetRenderDrawColor(sdl_renderer, 255, 0, 0, 255); 
     SDL_RenderClear(sdl_renderer); 
     SDL_RenderPresent(sdl_renderer); 
    } 
    return true; 
} 

int main(int argc, char **argv) { 
    gtk_init(&argc, &argv); 
    gtk_window = (GtkWindow*)gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title(gtk_window, "test"); 

    gtk_da = gtk_drawing_area_new(); 
    gtk_container_add(GTK_CONTAINER(gtk_window), gtk_da); 
    gtk_widget_show_all(GTK_WIDGET(gtk_window)); 

    gdk_window = gtk_widget_get_window(GTK_WIDGET(gtk_da)); 
    window_id = (void*)(intptr_t)GDK_WINDOW_XID(gdk_window); 

    SDL_Init(SDL_INIT_VIDEO); 

    g_idle_add(&idle, 0); 
    gtk_main(); 
    return 0; 
} 
+0

대단히 감사합니다. 사용 된 렌더링 플래그는 'SDL_RENDERER_SOFTWARE | SDL_RENDERER_TARGETTEXTURE '. –

관련 문제