sdl2 + opengl + gtk3

захотелось попробывать связать sdl2 + opengl + gtk3. нашел в stackoverflow пример, но там не для opengl. но я всё равно попробывал и не получается. вот код.

#include <stdio.h>
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <gdk/x11/gdkx11window.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_video.h>
#include <SDL2/SDL_events.h>
#include "conf.h"
#include "box.h"
#include "shaders.h"

GtkApplication *app;
struct conf cf;
struct box *box;
static void *gdk_window;
static void *window_id;
GtkWidget *gl_area;

static void gl_area_resize_cb ( GtkGLArea *gl_area, gint width, gint height, gpointer data ) {
    printf ( "resize\n" );
    glViewport ( 0, 0, width, height );

}

static gboolean gl_area_render_cb ( GtkGLArea *area, GdkGLContext *context, gpointer data ) {

    glClear ( GL_COLOR_BUFFER_BIT );
    box_render ( box );
    printf ( "@\n" );
    return TRUE;
}
static void gl_area_realize_cb ( GtkWidget *widget, gpointer data ) {
    gdk_window = gtk_widget_get_window ( ( GtkWidget * ) gl_area );
    if ( !gdk_window ) {
        printf ( ">>\n" );
    }
    printf ( "!\n" );
    window_id = (void *) (intptr_t) GDK_WINDOW_XID ( gdk_window );
    printf ( "!\n" );

    SDL_Init ( SDL_INIT_VIDEO );

#if 0
        SDL_GL_SetAttribute ( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES );
        SDL_GL_SetAttribute ( SDL_GL_CONTEXT_MAJOR_VERSION, 3 );
        SDL_GL_SetAttribute ( SDL_GL_CONTEXT_MINOR_VERSION, 0 );
        SDL_GL_SetAttribute ( SDL_GL_ACCELERATED_VISUAL, 1 );
        SDL_GL_SetAttribute ( SDL_GL_DOUBLEBUFFER, 1 );
    SDL_GL_SetAttribute ( SDL_GL_DEPTH_SIZE, 24 );
#endif

    printf ( "!\n" );
    cf.window = SDL_CreateWindowFrom ( gdk_window );

    SDL_GLContext glc;
    glc = SDL_GL_CreateContext ( cf.window );
    SDL_GL_MakeCurrent ( cf.window, glc );
    shaders_init ( );
    box = calloc ( 1, sizeof ( struct box ) );
    box_init ( box );
    box_set_size ( box, 400, 400, 0xff7c7cff, 0x7cff7cff );
    box_transform ( box, 10, 10 );
}

static void create_window ( ) {
    GtkWidget *window = gtk_application_window_new ( app );

    gl_area = gtk_gl_area_new ( );
    gtk_widget_set_size_request ( gl_area, 1024, 600 );
    g_signal_connect ( gl_area, "resize", G_CALLBACK ( gl_area_resize_cb ), NULL );
    g_signal_connect ( gl_area, "render", G_CALLBACK ( gl_area_render_cb ), NULL );
    g_signal_connect ( gl_area, "realize", G_CALLBACK ( gl_area_realize_cb ), NULL );

    gtk_gl_area_set_use_es ( ( GtkGLArea * ) gl_area, TRUE );

    glViewport ( 0, 0, 1024, 600 );

    gtk_container_add ( ( GtkContainer * ) window, gl_area );
    gtk_widget_show_all ( window );
}

static void g_startup ( GtkApplication *app, gpointer data ) {
    GMainLoop *loop = g_main_loop_new ( NULL, FALSE );

    create_window ( );

    g_main_loop_run ( loop );
}

int main ( int argc, char **argv ) {
    app = gtk_application_new ( "org.xverizex.cengine", G_APPLICATION_FLAGS_NONE );
    g_application_register ( ( GApplication * ) app, NULL, NULL );
    g_signal_connect ( app, "activate", G_CALLBACK ( g_startup ), NULL );
    return g_application_run ( ( GApplication * ) app, argc, argv );
}

не рисуется квадрат.


Ответы (0 шт):