#1 Le 26/02/2010, à 19:15
- superZozo
drawing_area + gtkGlExt -> 'gtk_widget_realized(widget)' failed
Bonjour,
J'essaie de d'utiliser openGL avec les drawing_area de gtk+ en langage C via gtkGlExt
A l'execution j'ai le message suivant
GtkGLExt-CRITICAL **: gtk_widget_set_gl_capability: assertion `!GTK_WIDGET_REALIZED (widget)' failed
Voici des extraits du code
main.c:
...
gui->da_Carte = gtk_drawing_area_new();
GtkWidget* cadreCarte = gtk_frame_new("Carte du ciel");
gtk_drawing_area_size(GTK_DRAWING_AREA(gui->da_Carte),800, 200);
gtk_container_add(GTK_CONTAINER(cadreCarte),gui->da_Carte);
//signaux
gtk_signal_connect (GTK_OBJECT (gui->da_Carte), "realize", (GtkSignalFunc) Carte_realize, NULL);
gtk_signal_connect (GTK_OBJECT (gui->da_Carte), "expose_event", (GtkSignalFunc) Carte_expose_event, NULL);
gtk_signal_connect (GTK_OBJECT(gui->da_Carte),"configure_event", (GtkSignalFunc) Carte_configure_event, NULL);
gtk_signal_connect (GTK_OBJECT (gui->da_Carte), "motion_notify_event", (GtkSignalFunc) Carte_motion_notify_event, NULL);
gtk_signal_connect (GTK_OBJECT (gui->da_Carte), "button_press_event", (GtkSignalFunc) Carte_button_press_event, NULL);
gtk_signal_connect (GTK_OBJECT (gui->da_Carte), "button_release_event", (GtkSignalFunc) Carte_button_release_event, NULL);
gtk_widget_set_events (gui->da_Carte, GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
| GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK);
gtk_box_pack_start(GTK_BOX(gui->vbox), cadreCarte, TRUE, TRUE, 2); //pack dans vbox
carte.c (gestion de la drawin_area)
static GdkPixmap* CartePixmap = NULL;
static GdkGC* gc = NULL;
gint Carte_realize (GtkWidget *widget, gpointer data)
{
//OpenGL via Gtkglext
GdkGLConfig * config;
config = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE);
GdkGLContext * context;
context = gtk_widget_get_gl_context(GTK_WIDGET(widget));
gtk_widget_set_gl_capability(GTK_WIDGET(widget), config, context, TRUE, GDK_GL_RGBA_TYPE);
// désactivation du contexte dans le cas des GtkGLExt
return TRUE;
}
gint Carte_configure_event (GtkWidget *widget, GdkEventConfigure *event)
{
//Creer une fenetre avec la zone de dessins
dessin(widget);
return TRUE;
}
//Redessine la zone de dessin en fonction du tracer
gint Carte_expose_event (GtkWidget *widget, GdkEventExpose *event)
{
dessin(widget);
//Permet de dessiner le tracer fait avec la souris
gdk_draw_drawable(GDK_DRAWABLE(widget->window), gc, GDK_DRAWABLE(CartePixmap), event->area.x, event->area.y, event->area.x, event->area.y,
event->area.width, event->area.height);
return FALSE;
}
//si on appuis sur le bouton de la souris
gint Carte_button_press_event (GtkWidget *widget, GdkEventButton *event)
{
return TRUE;
}
//si on relache le bouton
gint Carte_button_release_event (GtkWidget *widget, GdkEventButton *event)
{
return TRUE;
}
//si on déplace la souris
gint Carte_motion_notify_event (GtkWidget *widget, GdkEventMotion *event)
{
return TRUE;
}
void dessin(GtkWidget* widget)
{
if (CartePixmap != NULL)
gdk_pixmap_unref(CartePixmap);
CartePixmap = gdk_pixmap_new(GDK_DRAWABLE(widget->window), widget->allocation.width, widget->allocation.height, -1);
if (gc ==NULL)
gc = gdk_gc_new(widget->window);
//rectangle blanc
GdkColor blanc;
blanc.pixel=0xFFFFFF;
gdk_gc_set_foreground(gc, &blanc);
gdk_draw_rectangle(GDK_DRAWABLE(CartePixmap), gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height);
//cadre noir
GdkColor noir;
noir.pixel=0x0;
gdk_gc_set_foreground(gc, &noir);
gdk_draw_rectangle(GDK_DRAWABLE(CartePixmap), gc, FALSE, 0, 0, widget->allocation.width-1, widget->allocation.height-1);
gdk_draw_drawable(GDK_DRAWABLE(widget->window), gc, GDK_DRAWABLE(CartePixmap), 0, 0, 0, 0, widget->allocation.width, widget->allocation.height);
}
Le probleme vient de la ligne
gtk_widget_set_gl_capability(GTK_WIDGET(widget), config, context, TRUE, GDK_GL_RGBA_TYPE);
Mais comme je débute dans ce domaine je ne vois pas ce qui cloche...
Hors ligne