2012-02-07 2 views
0

У меня есть некоторые проблемы с Gtk +, Glade и GtkGlext.Проблема Gtk, Glade и OpenGL

Код:

#include <gtk-2.0/gtk/gtk.h> 
#include <gtkglext-1.0/gtk/gtkgl.h> 
#include <GL/gl.h> 

GtkBuilder* mBuilder; 
GtkWidget* mWindow; 
GtkWidget* mAbout; 
GtkWidget* mGlArea; 
GdkGLConfig *mGlConfig; 
GdkGLConfigMode mGlConfigMode; 

extern "C" G_MODULE_EXPORT void on_window_destroy(GtkObject *object, gpointer user_data) 
{ 
    gtk_main_quit(); 
} 

extern "C" G_MODULE_EXPORT void on_menuHelpAbout_activate(GtkObject *object, gpointer user_data) 
{    
    gtk_widget_show(mAbout); 
} 

extern "C" G_MODULE_EXPORT void on_aboutdialog1_close(GtkObject *object, gpointer user_data) 
{ 
    gtk_widget_hide(mAbout); 
} 

extern "C" G_MODULE_EXPORT void configure(GtkWidget *drawarea, GdkEventConfigure *event, gpointer user_data) 
{ 
    printf("%x\n", drawarea); 
    GdkGLContext *mGlContext = gtk_widget_get_gl_context(drawarea); 
    GdkGLDrawable *mGlDrawable = gtk_widget_get_gl_drawable(drawarea); 

    gdk_gl_drawable_gl_begin(mGlDrawable, mGlContext); 

    glLoadIdentity(); 
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 

    gdk_gl_drawable_gl_end(mGlDrawable); 
} 

extern "C" G_MODULE_EXPORT void expose(GtkWidget *drawarea, GdkEventExpose *event, gpointer user_data) 
{ 
    GdkGLContext *mGlContext = gtk_widget_get_gl_context(drawarea); 
    GdkGLDrawable *mGlDrawable = gtk_widget_get_gl_drawable(drawarea); 

    gdk_gl_drawable_gl_begin(mGlDrawable, mGlContext); 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
    glLoadIdentity(); 

    gdk_gl_drawable_swap_buffers(mGlDrawable); 

    gdk_gl_drawable_gl_end(mGlDrawable); 
} 

int main(int argc, char *argv[]) 
{ 
    gtk_init(&argc, &argv); 
    gtk_gl_init(&argc, &argv); 

    mBuilder = gtk_builder_new(); 
    gtk_builder_add_from_file(mBuilder, "editor.xml", NULL); 
    mWindow = GTK_WIDGET(gtk_builder_get_object(mBuilder, "window")); 
    mAbout = GTK_WIDGET(gtk_builder_get_object(mBuilder, "aboutdialog1")); 
    mGlArea = GTK_WIDGET(gtk_builder_get_object(mBuilder, "drawingarea1")); 
    gtk_widget_set_events(mGlArea, GDK_EXPOSURE_MASK); 
    gtk_builder_connect_signals(mBuilder, NULL); 

    g_object_unref(G_OBJECT(mBuilder)); 

    gtk_widget_show(mWindow); 

    if(gtk_widget_get_realized(mGlArea)) 
    { 
     gtk_widget_unrealize(mGlArea); 
    } 

    mGlConfigMode = (GdkGLConfigMode)(GDK_GL_MODE_RGB | GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE | GDK_GL_MODE_STENCIL); 

    mGlConfig = gdk_gl_config_new_by_mode(mGlConfigMode); 
    if(!mGlConfig) 
    { 
     printf("Error: Can't get OpenGL configuration\n"); 
    } 

    if(!gtk_widget_set_gl_capability(mGlArea, mGlConfig, NULL, TRUE, GDK_GL_RGBA_TYPE)) 
    { 
     printf("Error: Can't set OpenGL capability to drawable area\n"); 
    } 

    g_signal_connect(mGlArea, "configure-event", G_CALLBACK(configure), NULL); 
    g_signal_connect(mGlArea, "expose-event", G_CALLBACK(expose), NULL); 

    gtk_widget_show_all(mWindow); 

    gtk_main(); 

    return 0; 
} 

Я на самом деле не знаю, почему я получаю ошибку сегментации в строке 30, как адрес, кажется, действует и инициализация OpenGL успешно. Может ли кто-нибудь указать мне в правильном направлении?

+3

Код идет в сообщении, а не в пастбине. Кроме того, вы попробовали отладить его? –

+0

Yup и проблема решена ... проблема не в коде, а во время компиляции и связывания фазы. Мой libgtkglext-x11-1.0 был каким-то образом поврежден (gdb закричал, что XVisualIDFromVisual сделал SIGSEGV), поэтому я подумал, что он может быть поврежден и перекомпилирован. В любом случае, спасибо за ваше время. – ZarakiKenpachi

+0

О, капитан отряда 11! Пожалуйста, ответьте на свой вопрос и примите его, чтобы было известно, что на вопрос был дан ответ, а другим, кто может столкнуться с подобной проблемой, будет решение для поиска –

ответ

0

Yup и проблема решена ... проблема не в коде, а во время компиляции и связывания фазы. Мой libgtkglext-x11-1.0 был каким-то образом поврежден (gdb закричал, что XVisualIDFromVisual сделал SIGSEGV), поэтому я подумал, что он может быть поврежден и перекомпилирован.

Смежные вопросы