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 );
}
не рисуется квадрат.