Bonjour,
J'ai un problème de passage de GtkFileFilter en argument à une fonction callback d'un entry, qui s'active lorsque l'on clique dessus.
Le code fonctionne sans l'ajout du GtkFileFilter au GtkFileChooserDialog, et l'ajout du filtre fonctionne si je le met l'appel de la fenêtre lors du chargement du programme dans la fonction parente donc ce n'est pas mon GtkFileChooser qui est en cause.
Donc je pense que c'est le passage d'argument qui est en cause.
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 #define DO_TMPBOX(label, tooltip) \ tmpBox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); \ /* Add the tooltip to the box */ \ gtk_widget_set_tooltip_text (tmpBox, tooltip); \ gtk_box_pack_start (GTK_BOX(pBox), tmpBox, FALSE, FALSE, 0); \ \ /* Add the label */ \ gtk_box_pack_start (GTK_BOX(tmpBox), gtk_label_new (label), FALSE, FALSE, 8); #define DO_FILE(key, label, tooltip) \ DO_TMPBOX(label, tooltip) \ ctl = gtk_entry_new (); \ /* Disallow entry edition */ \ g_object_set (ctl, "editable", FALSE, NULL); \ /* Call filechooser onclick */ \ g_signal_connect (ctl, "button-press-event", G_CALLBACK (filechooser), filter); \ g_settings_bind (settings, key, ctl, "text", G_SETTINGS_BIND_DEFAULT); \ gtk_box_pack_end (GTK_BOX(tmpBox), ctl, TRUE, TRUE, 0);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 GtkFileFilter *filter; filter = gtk_file_filter_new (); gtk_file_filter_add_pattern (filter, ".png"); gtk_file_filter_add_pattern (filter, ".jpg"); gtk_file_filter_add_pattern (filter, ".gif"); gtk_file_filter_set_name (filter, _("Images")); DO_FILE( "bg-image", _("Background Image"), "")À l'exécution, ça crash (segfault), mais ni la compilation (tous les warnings de GCC activés) ni GTK ne me rapportent un problème de type.
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
32
33 void filechooser (GtkEntry *w, GtkFileFilter *filter) { static short running = 0; /* If a file selector is already running, we won't open another one */ if (!running) { GtkWidget *dialog; char *filename = NULL; running = 1; dialog = gtk_file_chooser_dialog_new (NULL, NULL, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(dialog), filter); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog)); if(filename) gtk_entry_set_text (w, filename); } gtk_widget_destroy (dialog); g_free(filename); running = 0; } }
GDB me confirme bien que le crash est dû à gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(dialog), filter);
Quelqu'un a une idée ?
Merci beaucoup.
Partager