[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
Re: GDK + GLib main loop
- From: Dov Grobgeld <dov grobgeld gmail com>
- To: Mihai Draghicioiu <mihai draghicioiu gmail com>
- Cc: gtk-app-devel-list gnome org
- Subject: Re: GDK + GLib main loop
- Date: Thu, 23 Jul 2009 08:06:28 +0300
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]