Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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