| 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 |