Re: [GtkGLExt] GDK + gtkglext help
- From: Mihai Draghicioiu <mihai draghicioiu gmail com>
- To: gtkglext-list gnome org
- Subject: Re: [GtkGLExt] GDK + gtkglext help
- Date: Wed, 22 Jul 2009 13:19:54 +0300
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;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]