Je code un projet sous GTK/GDK. Je souhaite afficher une image de fond sur laquelle je dessine. Je souhaite produire également une animation.

Pour cela j'ai crée une pixmap que je réactualise en permanence dans un drawing area. je dessine sur ma pixmap et je produit une animation sans soucis.
Mais quand je charge mon image de fond depuis un fichier dans un pixbuf, puis dans la pixmap avec un gdk_draw_pixbuf. J'obtiens bien le résultat souhaité dans mon drawingarea mais le reste de ma fenetre GTK plante, notamment ma barre de menu qui ne s'affiche plus et qui est transparente.

Que faire ?

Voici ma source de dessin de mon image :
Code : 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
static void draw_image (GtkWidget *widget, gdouble x, gdouble y, gdouble w, gdouble h)
{
 
	GdkPixbuf *image_carte=NULL;
	GtkWidget* image;
	GdkGC* gc;
 
 
	gc = gdk_gc_new (widget->window);
 
	image_carte=gdk_pixbuf_new_from_file("images/carte.png", NULL);
 
 
	gdk_draw_pixbuf(pixmap,
                                gc,
                                image_carte,
                                x,
                                y,
                                x,
                                y,
                                w,
                                h,
                                GDK_RGB_DITHER_MAX,
                                0,
                                0);
 
	g_object_unref (gc);
 
	gdk_pixbuf_unref(image_carte);
 
}
Voici ma source d'affichage :
Code : 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
gboolean affichage(gpointer * d)
{
	// ADV + init
	DATA * data=(DATA*) d;
 
	// je dessine mon image de fond
	draw_image (data->plan, 0, 0, 500,500);
 
	// Je dessine ici un caré pour faire une animation
	draw_rect (data->plan, data->perso->pos_x, data->perso->pos_y, 5,5,65535, 0, 0);
 
	GdkRectangle update_rect;
 
	update_rect.x = 0;
	update_rect.y = 0;
	update_rect.width = 500;
	update_rect.height = 500;
 
	gtk_widget_draw (data->plan, &update_rect);
 
	return TRUE;
}