I have found the way. Here is my code. Any idea where I can post it as a
tutorial?

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

GdkGLWindow *glwin = NULL;
GdkGLContext *glcontext = NULL;
GMainLoop *mainloop;

static void event_func(GdkEvent *ev, gpointer data) {
    printf("event func\n");
            switch(ev->type) {
                case GDK_MAP:
                    break;
                case GDK_DELETE:
                    g_main_loop_quit(mainloop);
                    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(ev->configure.window),
glcontext)) {
                        glViewport(0, 0, ev->configure.width,
ev->configure.height);

if(gdk_gl_drawable_is_double_buffered(gdk_window_get_gl_drawable(ev->configure.window)))
{

gdk_gl_drawable_swap_buffers(gdk_window_get_gl_drawable(ev->configure.window));
                        } else
                            glFlush();

gdk_gl_drawable_gl_end(gdk_window_get_gl_drawable(ev->configure.window));
                    }
                    break;
            }

if(gdk_gl_drawable_gl_begin(gdk_window_get_gl_drawable(ev->any.window),
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(ev->any.window)))
{

gdk_gl_drawable_swap_buffers(gdk_window_get_gl_drawable(ev->any.window));
                        } else
                            glFlush();

gdk_gl_drawable_gl_end(gdk_window_get_gl_drawable(ev->any.window));
                    }
}

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

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

    gdk_event_handler_set(event_func, NULL, NULL); // this is used by GTK+
internally. We just use it for ourselves here

    mainloop = g_main_loop_new(g_main_context_default(), FALSE);
    g_main_loop_run(mainloop);

    gdk_gl_window_destroy(glwin);
    gdk_window_destroy(win);

    return 0;
}



On Thu, Jul 23, 2009 at 8:07 AM, Emmanuel Rodriguez <
emmanuel.rodrig...@gmail.com> wrote:

>
>
> On Thu, Jul 23, 2009 at 5:33 AM, Mihai Draghicioiu <
> mihai.draghici...@gmail.com> wrote:
>
>> Hi all! I'm making an OpenGL application based on GDK + GtkGLArea. My code
>> so far works, but it has two issues:
>
> Do you really need to have your application based on GDK? Can't you use GTK
> instead?
> By using GTK you can simply connect to the wanted signals and start a main
> loop. This is going to be easier.
>
> The tar.gz of gtkglext has an examples directory and you should be able to
> start from one of their sample programs.
>
> You should consider modifying your code to use GTK instead of GDK:
>
> #include <stdlib.h>
> #include <gtk/gtk.h>
> #include <gtk/gtkgl.h>
> #include <GL/gl.h>
>
>
> static void
> realize (GtkWidget *widget,
>          gpointer   data)
> {
>   GdkGLContext *glcontext = gtk_widget_get_gl_context (widget);
>   GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);
>
>   if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext)) {
>     return;
>   }
>
>   glClearColor(1.0, .5, .2, 1.0);
>   glClear(GL_COLOR_BUFFER_BIT);
>   glMatrixMode(GL_PROJECTION);
>   glLoadIdentity();
>   glOrtho(0, widget->allocation.width, widget->allocation.height, 0, -1,
> 1);
>   glMatrixMode(GL_MODELVIEW);
>   glLoadIdentity();
>
>   glColor3f(0.0, 1.0, 0.0);
>   glBegin(GL_QUADS);
>     glVertex2i(100, 100);
>     glVertex2i(400, 100);
>     glVertex2i(400, 500);
>     glVertex2i(100, 500);
>   glEnd();
>
>   /* swap backbuffer to front */
>   if (gdk_gl_drawable_is_double_buffered(gldrawable))
>     gdk_gl_drawable_swap_buffers(gldrawable);
>   else
>     glFlush();
>
>   gdk_gl_drawable_gl_end (gldrawable);
> }
>
> static gboolean
> configure_event (GtkWidget         *widget,
>                  GdkEventConfigure *event,
>                  gpointer           data)
> {
>   GdkGLContext *glcontext = gtk_widget_get_gl_context (widget);
>   GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);
>
>   /*** OpenGL BEGIN ***/
>   if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
>     return FALSE;
>
>   glViewport (0, 0,
>               widget->allocation.width, widget->allocation.height);
>
>   gdk_gl_drawable_gl_end (gldrawable);
>   /*** OpenGL END ***/
>
>   return TRUE;
> }
>
> static gboolean
> expose_event (GtkWidget      *widget,
>               GdkEventExpose *event,
>               gpointer        data)
> {
>   GdkGLContext *glcontext = gtk_widget_get_gl_context (widget);
>   GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);
>
>   /*** OpenGL BEGIN ***/
>   if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
>     return FALSE;
>
>   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
>
>   glCallList (1);
>
>   if (gdk_gl_drawable_is_double_buffered (gldrawable))
>     gdk_gl_drawable_swap_buffers (gldrawable);
>   else
>     glFlush ();
>
>   gdk_gl_drawable_gl_end (gldrawable);
>   /*** OpenGL END ***/
>
>   return TRUE;
> }
>
>
> int main(int argc, char **argv) {
>   gtk_init(&argc, &argv);
>   gtk_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 *glconfig = gdk_gl_config_new(config_attributes);
>
>
>   GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
>   gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
>   g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK
> (gtk_main_quit), NULL);
>
>   // Get automatically redrawn if any of their children changed allocation
>   gtk_container_set_reallocate_redraws (GTK_CONTAINER (window), TRUE);
>
>
>   // The widget where the OpenGL drawing will be done
>   GtkWidget *drawing_area = gtk_drawing_area_new ();
>   gtk_widget_set_size_request (drawing_area, 200, 200);
>   gtk_widget_set_gl_capability(drawing_area, glconfig, NULL, TRUE,
> GDK_GL_RGBA_TYPE);
>   gtk_widget_add_events(GTK_WIDGET(drawing_area), GDK_CONFIGURE);
>   gtk_widget_add_events(GTK_WIDGET(drawing_area), GDK_KEY_PRESS_MASK);
>   gtk_widget_add_events(GTK_WIDGET(drawing_area), GDK_STRUCTURE_MASK);
>   gtk_widget_add_events(GTK_WIDGET(drawing_area), GDK_EXPOSURE_MASK);
>
>
>   g_signal_connect_after (G_OBJECT (drawing_area), "realize", G_CALLBACK
> (realize), NULL);
>   g_signal_connect (G_OBJECT (drawing_area), "configure_event", G_CALLBACK
> (configure_event), NULL);
>   g_signal_connect (G_OBJECT (drawing_area), "expose_event", G_CALLBACK
> (expose_event), NULL);
>
>
>   gtk_container_add (GTK_CONTAINER (window), drawing_area);
>   gtk_widget_show_all(window);
>
>   gtk_main();
>
>   return 0;
> }
>
>
> This is a merge of your code and the example simple.c provided by
> gtkglext.tar.gz. Your current drawing method doesn't work but I'm not that
> good with OpenGL. Although if I substitue your drawing by the one of
> simple.c it works. I'm sure that you will be able to figure this bit out for
> me :)
>
> --
> Emmanuel Rodriguez
>
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to