pidgin/minidialog.c

changeset 21606
423607b9d0ca
parent 21518
91a5412958cf
child 21964
ee7d13612e4c
equal deleted inserted replaced
21597:ddb650523335 21606:423607b9d0ca
51 GtkImage *icon; 51 GtkImage *icon;
52 GtkBox *title_box; 52 GtkBox *title_box;
53 GtkLabel *title; 53 GtkLabel *title;
54 GtkLabel *desc; 54 GtkLabel *desc;
55 GtkBox *buttons; 55 GtkBox *buttons;
56
57 guint idle_destroy_cb_id;
56 } PidginMiniDialogPrivate; 58 } PidginMiniDialogPrivate;
57 59
58 #define PIDGIN_MINI_DIALOG_GET_PRIVATE(dialog) \ 60 #define PIDGIN_MINI_DIALOG_GET_PRIVATE(dialog) \
59 ((PidginMiniDialogPrivate *) ((dialog)->priv)) 61 ((PidginMiniDialogPrivate *) ((dialog)->priv))
60 62
116 static void 118 static void
117 mini_dialog_button_clicked_cb(GtkButton *button, 119 mini_dialog_button_clicked_cb(GtkButton *button,
118 gpointer user_data) 120 gpointer user_data)
119 { 121 {
120 struct _mini_dialog_button_clicked_cb_data *data = user_data; 122 struct _mini_dialog_button_clicked_cb_data *data = user_data;
123 PidginMiniDialogPrivate *priv =
124 PIDGIN_MINI_DIALOG_GET_PRIVATE(data->mini_dialog);
125
126 /* Set up the destruction callback before calling the clicked callback,
127 * so that if the mini-dialog gets destroyed during the clicked callback
128 * the idle_destroy_cb is correctly removed by _finalize.
129 */
130 priv->idle_destroy_cb_id =
131 g_idle_add((GSourceFunc) idle_destroy_cb, data->mini_dialog);
121 132
122 data->callback(data->mini_dialog, button, data->user_data); 133 data->callback(data->mini_dialog, button, data->user_data);
123 134
124 g_idle_add((GSourceFunc) idle_destroy_cb, data->mini_dialog);
125 } 135 }
126 136
127 static void 137 static void
128 mini_dialog_button_destroy_cb(GtkButton *button, 138 mini_dialog_button_destroy_cb(GtkButton *button,
129 gpointer user_data) 139 gpointer user_data)
270 pidgin_mini_dialog_finalize(GObject *object) 280 pidgin_mini_dialog_finalize(GObject *object)
271 { 281 {
272 PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object); 282 PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object);
273 PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self); 283 PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
274 284
285 if (priv->idle_destroy_cb_id)
286 g_source_remove(priv->idle_destroy_cb_id);
287
275 g_free(priv); 288 g_free(priv);
276 self->priv = NULL; 289 self->priv = NULL;
277 290
278 purple_prefs_disconnect_by_handle(self); 291 purple_prefs_disconnect_by_handle(self);
279 292

mercurial