Bonjour à tous,

J'écris un widget à partir d'un GtkWidget, et dessine avec Cairo dans sa GdkWindow, ça fonctionne
Cependant, j'ai un problème majeur : je ne vois les dessins effectués par Cairo dans gtk_***_expose() que pendant le redimentionnement de mon widget.
Je subodore que "quelqu'un" (le GtkWidget parent !?) redessine sur ma fenêtre juste après moi ou quelque chose dans le genre...

Voici ma gtk_***_expose() (avec en cadeau bonus ma gtk_***_realize au cas-où) :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
static gboolean
gtk_lonly_expose (GtkWidget* widget,
                  GdkEventExpose* event)
{
   g_return_val_if_fail (GTK_IS_LONLY (widget), FALSE);
   g_return_val_if_fail (event != NULL, FALSE);
 
   if (GTK_WIDGET_DRAWABLE (widget))
   {
      gtk_lonly_paint (GTK_LONLY (widget)); /* => fonction dessinant avec Cairo sur widget->window */
   }
 
   return FALSE;
}
 
 
static void
gtk_lonly_realize (GtkWidget* widget)
{
   GdkWindowAttr attributes;
   guint attributes_mask;
 
 
   g_return_if_fail (GTK_IS_LONLY (widget));
 
 
   GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
 
   attributes.window_type  = GDK_WINDOW_CHILD;
   attributes.x            = widget->allocation.x;
   attributes.y            = widget->allocation.y;
   attributes.width        = widget->allocation.width;
   attributes.height       = widget->allocation.height;
   attributes.wclass       = GDK_INPUT_OUTPUT;
   attributes.event_mask   = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK;
 
   attributes_mask = GDK_WA_X | GDK_WA_Y;
 
   widget->window = gdk_window_new (gtk_widget_get_parent_window (widget),
                                    &attributes, attributes_mask);
 
   /* create CairoRenderer now because of need of the GdkWindow */
   GTK_LONLY (widget)->cr = cairo_reference (gdk_cairo_create (widget->window));
 
   gdk_window_set_user_data (widget->window, widget);
 
   widget->style = gtk_style_attach (widget->style, widget->window);
   gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
}

Qu'ais-je fais de mal ?


Merci d'avance !