bonjour,

J'aurais bien voulu savoir ce qu'il y avait comme différence entre
- appeler gtk_destroy_widget sur la fenêtre principale et
- gtk_main_quit
dans le cas où on a une seule fenêtre top level, ceci afin de détruire définitivement la fenêtre.

Je poste à nouveau suite à mon autre post qui est lié en qq sorte.
Le code suivant est issu du tuto de zetcode.com pour partir sur un code propre. J'ai juste mis la fenêtre principale en variable globale.
Lorsqu'on sélectionne un élément du tree view, je voudrais détruire la fenêtre.

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <gtk/gtk.h>
 
enum
{
  LIST_ITEM = 0,
  N_COLUMNS
};
 
GtkWidget *window;
static _Bool hasChanged;
 
static void
init_list(GtkWidget *list)
{
 
  GtkCellRenderer *renderer;
  GtkTreeViewColumn *column;
  GtkListStore *store;
 
  renderer = gtk_cell_renderer_text_new();
  column = gtk_tree_view_column_new_with_attributes("List Items",
          renderer, "text", LIST_ITEM, NULL);
  gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
 
  store = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING);
 
  gtk_tree_view_set_model(GTK_TREE_VIEW(list), 
      GTK_TREE_MODEL(store));
 
  g_object_unref(store);
  haschanged = FALSE;
}
 
static void
add_to_list(GtkWidget *list, const gchar *str)
{
  GtkListStore *store;
  GtkTreeIter iter;
 
  store = GTK_LIST_STORE(gtk_tree_view_get_model
      (GTK_TREE_VIEW(list)));
 
  gtk_list_store_append(store, &iter);
  gtk_list_store_set(store, &iter, LIST_ITEM, str, -1);
}
 
 
void  on_changed(GtkWidget *widget, gpointer label) 
{
  if (hasChanged == TRUE) {
    GtkTreeIter iter;
    GtkTreeModel *model;
    char *value;
 
    if (gtk_tree_selection_get_selected(
        GTK_TREE_SELECTION(widget), &model, &iter)) {
 
      gtk_tree_model_get(model, &iter, LIST_ITEM, &value,  -1);
      gtk_label_set_text(GTK_LABEL(label), value);
      g_free(value);
      //gtk_main_quit();
      gtk_widget_destroy(window);
    }
  } else { hasChanged = TRUE;}
}
 
int main (int argc, char *argv[])
{
 
  GtkWidget *list;
 
  GtkWidget *vbox;
  GtkWidget *label;
  GtkTreeSelection *selection; 
 
  gtk_init(&argc, &argv);
 
 
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_container_set_border_width(GTK_CONTAINER(window), 10);
  gtk_widget_set_size_request(window, 270, 250);
  gtk_window_set_title(GTK_WINDOW(window), "List View");
 
  list = gtk_tree_view_new();
  gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), FALSE);
 
  vbox = gtk_vbox_new(FALSE, 0);
 
  gtk_box_pack_start(GTK_BOX(vbox), list, TRUE, TRUE, 5);
 
  label = gtk_label_new("");
  gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
  gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 5);
 
  gtk_container_add(GTK_CONTAINER(window), vbox);
 
  init_list(list);
  add_to_list(list, "Aliens");
  add_to_list(list, "Leon");
  add_to_list(list, "Capote");
  add_to_list(list, "Saving private Ryan");
  add_to_list(list, "Der Untergang");
 
 
  selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(list));
 
  g_signal_connect(selection, "changed", 
      G_CALLBACK(on_changed), label);
 
  g_signal_connect(G_OBJECT (window), "destroy",
      G_CALLBACK(gtk_main_quit), NULL);
 
  gtk_widget_show_all(window);
 
  gtk_main ();
 
  return 0;
}
Dans la fonction on_changed :
- si je rajoute gtk_main_quit(); aucun pb, la fenêtre est détruite sans erreur
- si je mets gtk_widget_destroy(window); a la place,
j'ai le fameux msg d'erreur : Gtk Critical : Gtk adjustment get value : assertion 'GTK_IS_ADJUSTMENT (adjustment)' failed, comme si gtk cherchait un adjustment qui n'existe plus car la fenêtre est déjà détruite.

Si qq'un pouvait m'expliquer la différence entre les 2 fonctions (que fait l'une plus que l'autre), ça serait génial.