bug-gnubg
[Top][All Lists]
Advanced

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

Re: [Bug-gnubg] gnubg hangs when closing Appearance prefs on MacOS X


From: Jon Kinsey
Subject: Re: [Bug-gnubg] gnubg hangs when closing Appearance prefs on MacOS X
Date: Tue, 20 Apr 2004 11:49:46 +0100
User-agent: Mozilla Thunderbird 0.5 (Windows/20040207)

Olivier, Michael or any other mac users...

I've created a very simple test program which should narrow things down to gnubg or gtkglext.

I've attached a makefile too, but I'm building on windows so may be of limited use - should be easy to build anyway.

Just click the test button and see if the dialog closes ok.

Jon

NAME=exttest

LIBFLAGS=-mwindows
FLAGS=-fnative-struct -Wall -O3
RM=del
CC=gcc

INCLUDE= \
        -I$(BASEDIR)\include\gtk-2.0 \
        -I$(BASEDIR)\include\pango-1.0 \
        -I$(BASEDIR)\include\atk-1.0 \
        -I$(BASEDIR)\lib\gtk-2.0\include \
        -I$(BASEDIR)/lib/glib-2.0/include \
        -I$(BASEDIR)/include/libxml2 \
        -I$(BASEDIR)/include/gtkglext-1.0 \
        -I$(BASEDIR)/lib/gtkglext-1.0/include \
        -I$(BASEDIR)/include/glib-2.0 \
        -I$(BASEDIR)/include/freetype2

LIBS= \
        -lintl.dll -lgdbm.dll\
        -lgobject-2.0.dll -lglib-2.0.dll -lgtk-win32-2.0 -lgdk-win32-2.0 \
        -liconv -lpng -lz -lwinmm -lm -lpango-1.0 -lgdk_pixbuf-2.0 \
        -lopengl32 -lglu32 -lglut32 \
        -lgdkglext-win32-1.0.dll -lgtkglext-win32-1.0.dll

TARGET=$(NAME).exe
SOURCE=$(NAME)
OBJECTS=$(patsubst %,%.o,$(SOURCE))
HEADERS=

all: $(TARGET)
        @echo done
        $(TARGET)

$(TARGET): $(OBJECTS)
        @echo linking
        $(CC) -o $@ $+ $(LIBFLAGS) $(LIBS)

address@hidden compiling $(patsubst bin/gtk/int/../../../%,%,$<)
COMP2=${CC} $(FLAGS) $(INCLUDE) -o $@ -c $<

%.o: %.c $(HEADERS)
        $(COMP1)
        $(COMP2)
        
clean:
        $(RM) $(OBJECTS)
        @echo clean
#include <gtk/gtk.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <gtk/gtkgl.h>

void realize(GtkWidget *widget, void* data)
{
        GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(widget);
        if (!gdk_gl_drawable_gl_begin(gldrawable, 
gtk_widget_get_gl_context(widget)))
        {
                g_print("gdk_gl_drawable_gl_begin failed\n");
                return;
        }

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0,100,100,0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        
        glClearColor(0,0,0,1);

        gdk_gl_drawable_gl_end(gldrawable);
}

static gboolean configure_event(GtkWidget *widget, GdkEventConfigure *notused, 
void* data)
{
        GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(widget);
        if (!gdk_gl_drawable_gl_begin(gldrawable, 
gtk_widget_get_gl_context(widget)))
        {
                g_print("gdk_gl_drawable_gl_begin failed\n");
                return FALSE;
        }

        glViewport(0, 0, widget->allocation.width, widget->allocation.height);

        gdk_gl_drawable_gl_end(gldrawable);

        return TRUE;
}

void CheckOpenglError()
{
        GLenum glErr = glGetError();
        if (glErr != GL_NO_ERROR)
                g_print("OpenGL Error: %s\n", gluErrorString(glErr));
}

void Draw(int red)
{
        CheckOpenglError();
        glClear(GL_COLOR_BUFFER_BIT);
        glColor3f(red,1,1);
        glBegin(GL_TRIANGLES);
        glVertex2f(10,10);
        glVertex2f(10,90);
        glVertex2f(90,90);
        glEnd();
}

static gboolean expose_event(GtkWidget *widget, GdkEventExpose *notused, int 
red)
{
        GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(widget);
        if (!gdk_gl_drawable_gl_begin(gldrawable, 
gtk_widget_get_gl_context(widget)))
        {
                g_print("gdk_gl_drawable_gl_begin failed\n");
                return FALSE;
        }

        Draw(red);

        gdk_gl_drawable_swap_buffers(gldrawable);
        gdk_gl_drawable_gl_end(gldrawable);

        return TRUE;
}

GdkGLConfig *glconfig;

extern GtkWidget* CreateGLWidget(int red)
{
        GtkWidget* drawing_area;
        drawing_area = gtk_drawing_area_new();
        gtk_widget_set_gl_capability(drawing_area, glconfig, NULL, TRUE, 
GDK_GL_RGBA_TYPE);
        gtk_widget_set_size_request(drawing_area, 200, 200);

        if (drawing_area == NULL)
        {
                g_print("Can't create opengl drawing widget\n");
                return NULL;
        }

        gtk_widget_set_events(drawing_area, GDK_EXPOSURE_MASK);
        gtk_signal_connect(GTK_OBJECT(drawing_area), "realize", 
GTK_SIGNAL_FUNC(realize), 0);
        gtk_signal_connect(GTK_OBJECT(drawing_area), "configure_event", 
GTK_SIGNAL_FUNC(configure_event), 0);
        gtk_signal_connect(GTK_OBJECT(drawing_area), "expose_event", 
GTK_SIGNAL_FUNC(expose_event), (void*)red);

        return drawing_area;
}

GtkWidget *window;

static void Test(GtkWidget *pw, void* data)
{
        GtkWidget *pwDialog = gtk_dialog_new();
        g_signal_connect(G_OBJECT(pwDialog), "delete_event", 
G_CALLBACK(gtk_main_quit), NULL);
        gtk_container_add(GTK_CONTAINER(GTK_DIALOG(pwDialog)->vbox), 
CreateGLWidget(0));
        gtk_window_set_modal(GTK_WINDOW(pwDialog), TRUE);
        gtk_window_set_transient_for(GTK_WINDOW(pwDialog), GTK_WINDOW(window));
        gtk_widget_show_all(pwDialog);
        gtk_main();
}

int main (int argc, char *argv[])
{
  GtkWidget *vbox;
  GtkWidget *button;

        gtk_init(&argc, &argv);
        gtk_gl_init(&argc, &argv);
        
        glconfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGB | 
GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE | GDK_GL_MODE_STENCIL);
        if (!glconfig)
        {
                g_print("*** Cannot find OpenGL-capable visual ***\n");
                return 0;
        }
        
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        g_signal_connect(G_OBJECT(window), "delete_event", 
G_CALLBACK(gtk_main_quit), NULL);

  vbox = gtk_vbox_new (FALSE, 0);
  gtk_container_add (GTK_CONTAINER (window), vbox);
  gtk_widget_show (vbox);

  gtk_box_pack_start (GTK_BOX (vbox), CreateGLWidget(1), TRUE, TRUE, 0);

  button = gtk_button_new_with_label ("Test");
  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK(Test), NULL);

  gtk_widget_show_all (window);

  gtk_main ();

  return 0;
}

reply via email to

[Prev in Thread] Current Thread [Next in Thread]