Re: [GtkGLExt] GDK + gtkglext help



It can't work like that. You need to move your event handling to an
appropriate callback and call gtk_main from your main function,
otherwise you don't have an event loop so you can't hope any event will
be fired.
You should look at the samples to see how things work.

Regards,
Jean

Le mercredi 22 juillet 2009 à 13:19 +0300, Mihai Draghicioiu a écrit :
> Hi again! I figured it out in the meanwhile! Here is the new code.
> Seems that whatever I do, the GDK_EXPOSE event is never received, even
> if I set the proper event mask (or all events mask). This is a GDK
> issue, I guess, not glext. Also, I'll have to figure out a way to make
> the events block. Right now it uses up 100% cpu, cause the event
> function is non-blocking. Someone said I'll have to use a glib main
> loop.
> 
> Thanks! Hope this helps someone. It just displays a white rectangle on
> an orange background.
> 
> #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;
>         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);
>         printf("glwin=%p glcontext=%p\n", glwin, glcontext);
> 
>         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;
> }
> 
> 
> 
> On Wed, Jul 22, 2009 at 5:08 AM, Mihai Draghicioiu
> <mihai draghicioiu gmail com> wrote:
>         Hi guys! I'm trying to make a basic program that just displays
>         a quad, but all I get is a black window. Here is my code. Not
>         sure what I'm doing wrong. I don't want to use GTK+. I wasn't
>         able to find working GDK + GTKGLExt code in the examples.
>         
>         #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 = 0;
>                 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);
>         
>                 GdkGLWindow *glwin = gdk_gl_window_new(glc, win,
>         NULL);
>                 GdkGLContext *glcontext =
>         gdk_gl_context_new(GDK_GL_DRAWABLE(glwin), NULL, true,
>         GDK_GL_RGBA_TYPE);
>         
>                 gdk_window_show(win);
>         
>                 bool done = false;
>                 while(!done) {
>                         GdkEvent *ev = gdk_event_get();
>                         if(ev) {
>                                 switch(ev->type) {
>                                         case GDK_MAP:
>         
>         gdk_gl_drawable_make_current(GDK_GL_DRAWABLE(glwin),
>         glcontext);
>                                                 break;
>                                         case GDK_DELETE:
>                                                 done = true;
>                                                 break;
>                                         case GDK_EXPOSE:
>         
>         gdk_gl_drawable_gl_begin(GDK_GL_DRAWABLE(glwin), 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();
>         
>         gdk_gl_drawable_swap_buffers(GDK_GL_DRAWABLE(glwin));
>         
>         gdk_gl_drawable_gl_end(GDK_GL_DRAWABLE(glwin));
>                                                 break;
>                                 }
>                                 gdk_event_free(ev);
>                         }
>                 }
>         
>                 gdk_gl_window_destroy(glwin);
>                 gdk_window_destroy(win);
>         
>                 return 0;
>         }
>         
> 
> _______________________________________________
> gtkglext-list mailing list
> gtkglext-list gnome org
> http://mail.gnome.org/mailman/listinfo/gtkglext-list



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