I’m replace native window with GtkGLArea, but there are some problems:
-
how do i knows the type of gl context created by gtk, EGL or GLX?
-
is there a api like eglGetProcAddress and glXGetProcAddress?
-
gl area couldn’t receive key press/release events even if i add related event masks to the widget, test code is here:
#include <GL/gl.h>
#include <gtk/gtk.h>
static gboolean key_press(GtkGLArea *area, GdkEvent *event, gpointer data) {
printf("key press: %d\n", ((GdkEventKey *)event)->keyval);
return TRUE;
}
static gboolean key_release(GtkGLArea *area, GdkEvent *event, gpointer data) {
printf("key release: %d\n", ((GdkEventKey *)event)->keyval);
return TRUE;
}
static gboolean render(GtkGLArea *area, GdkGLContext *context, gpointer data) {
printf("draw\n");
GtkAllocation alloc;
gtk_widget_get_allocation(GTK_WIDGET(area), &alloc);
glViewport(0, 0, alloc.width, alloc.height);
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.3, 0.3, 0.0, 1.0);
glFlush();
return TRUE;
}
int main(int argc, char **argv) {
gtk_init(&argc, &argv);
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL),
*gl_area = gtk_gl_area_new();
gtk_widget_add_events(gl_area, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
g_signal_connect(window, "delete-event", G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(gl_area, "render", G_CALLBACK(render), NULL);
g_signal_connect(gl_area, "key-press-event", G_CALLBACK(key_press), NULL);
g_signal_connect(gl_area, "key-release-event", G_CALLBACK(key_release), NULL);
gtk_container_add(GTK_CONTAINER(window), gl_area);
gtk_widget_show_all(window);
gtk_widget_grab_focus(GTK_WIDGET(gl_area));
gtk_main();
return 0;
}
``