GDK + GLib main loop



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;
}



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