How to render SDL2 texture into GTK3+ window?

后端 未结 1 974
抹茶落季
抹茶落季 2020-12-21 21:52

I am creating a music player and trying to use GTK3+ for creating user interface. I am using SDL_CreateWindowFrom function to let SDL2 use GTK3+ window rather than creating

相关标签:
1条回答
  • 2020-12-21 22:08

    Since example you put is effectively incomplete even on most important bits (e.g. renderer creation flags), and you don't specify which part gives you a problem, here is my example (which, on my system, works on both gtk2 and gtk3 - I wouldn't vouch it is completely fine though):

    #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 讨论(0)
自定义标题
段落格式
字体
字号
代码语言
提交回复
热议问题