Re: GDK + GLib main loop



You don't manually loop for events, but instead set up your drawing in the
expose handle of the drawing widget. You then connect to this handle
through:

    g_signal_connect(drawing_area, "expose-event",
                     G_CALLBACK(my_expose_handler),
                     user_data);

See the simple.c example in the gtkglarea source archive.

Regards,
Dov

2009/7/23 Mihai Draghicioiu <mihai draghicioiu gmail com>

Hi all! I'm making an OpenGL application based on GDK + GtkGLArea. My code
so far works, but it has two issues:

1. It does not handle events in a blocking fashion.
2. Somehow the window does not receive an Expose event.

I was told that for blocking until an event arrives, I'd have to use GLib
main loop. I have looked at the GLib main loop reference page, but I have
no
idea how to make the this work. So I need some hints here.

And for the GDK_EXPOSE event thing, I even set the all events mask, and
there was still no expose event. I went around this by drawing outside the
event switch, after each event is processed. This is not so important, but
I'm curious why it happens. With Xlib programs, an Expose event is received
when the window pops up, and every time it is 'made dirty' by other windows
or dragging on-screen from off-screen or whatever.

Here is my code:

// g++ *gdkgl.cpp* `pkg-config gdk-2.0 gtkglext-1.0 --libs --cflags`
-ogdkgl

#include <stdlib.h>
#include <gdk/gdk.h>
#include <gdk/gdkgl.h>
#include <GL/gl.h>

int main(int argc, char **argv) {
       gdk_init(&argc, &argv);
       gdk_gl_init(&argc, &argv);

       int config_attributes[] = {
               GDK_GL_DOUBLEBUFFER,
               GDK_GL_RGBA,
               GDK_GL_RED_SIZE,        1,
               GDK_GL_GREEN_SIZE,      1,
               GDK_GL_BLUE_SIZE,       1,
               GDK_GL_DEPTH_SIZE,      12,
               GDK_GL_ATTRIB_LIST_NONE
       };
       GdkGLConfig *glc = gdk_gl_config_new(config_attributes);

       GdkWindowAttr attr;
       attr.title = argv[0];
       attr.event_mask = GDK_KEY_PRESS_MASK | GDK_STRUCTURE_MASK |
GDK_EXPOSURE_MASK;
       attr.window_type = GDK_WINDOW_TOPLEVEL;
       attr.wclass = GDK_INPUT_OUTPUT;
       attr.width = 800;
       attr.height = 600;
       GdkWindow *win = gdk_window_new(NULL, &attr, 0);

       gdk_window_show(win);

       GdkGLWindow *glwin = NULL;
       GdkGLContext *glcontext = NULL;
       glwin = gdk_window_set_gl_capability(win, glc, NULL);
       glcontext = gdk_gl_context_new(GDK_GL_DRAWABLE(glwin), NULL, true,
GDK_GL_RGBA_TYPE);

       bool done = false;
       while(!done) {
               GdkEvent *ev = gdk_event_get();
               if(ev) {
                       switch(ev->type) {
                               case GDK_MAP:
                                       break;
                               case GDK_DELETE:
                                       done = true;
                                       break;
                               case GDK_KEY_PRESS:
                                       printf("key pressed\n");
                                       break;
                               case GDK_EXPOSE:
                                       printf("got expose\n");
                                       break;
                               case GDK_CONFIGURE:

if(gdk_gl_drawable_gl_begin(gdk_window_get_gl_drawable(win), glcontext)) {
                                               glViewport(0, 0,
ev->configure.width, ev->configure.height);

if(gdk_gl_drawable_is_double_buffered(gdk_window_get_gl_drawable(win))) {

gdk_gl_drawable_swap_buffers(gdk_window_get_gl_drawable(win));
                                               } else
                                                       glFlush();

gdk_gl_drawable_gl_end(gdk_window_get_gl_drawable(win));
                                       }
                                       break;
                       }

if(gdk_gl_drawable_gl_begin(gdk_window_get_gl_drawable(win), glcontext)) {
                                               glClearColor(1.0, .5, .2,
1.0);

glClear(GL_COLOR_BUFFER_BIT);
                                               glMatrixMode(GL_PROJECTION);
                                               glLoadIdentity();
                                               glOrtho(0, 800, 600, 0, -1,
1);
                                               glMatrixMode(GL_MODELVIEW);
                                               glLoadIdentity();
                                               glBegin(GL_QUADS);
                                               glVertex2i(100, 100);
                                               glVertex2i(400, 100);
                                               glVertex2i(400, 500);
                                               glVertex2i(100, 500);
                                               glEnd();


if(gdk_gl_drawable_is_double_buffered(gdk_window_get_gl_drawable(win))) {

gdk_gl_drawable_swap_buffers(gdk_window_get_gl_drawable(win));
                                               } else
                                                       glFlush();

gdk_gl_drawable_gl_end(gdk_window_get_gl_drawable(win));
                                       }
                       gdk_event_free(ev);
               }
       }

       gdk_gl_window_destroy(glwin);
       gdk_window_destroy(win);

       return 0;
}
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list gnome org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]