Mercurial > pidgin
comparison pidgin/minidialog.c @ 31443:1551c9a140fd
Finally merged the code that fixes #5038 to i.p.p.
applied changes from 563c6a79e1266b750fe4bd608890195cfbcd8a2c
through d00e5622c7b15359775cf6892019db8af29ed8fe
author | ivan.komarov@pidgin.im |
---|---|
date | Wed, 30 Mar 2011 22:36:30 +0000 |
parents | a8cc50c2279f |
children | e2a1510da13d |
comparison
equal
deleted
inserted
replaced
31442:c7af571e5b79 | 31443:1551c9a140fd |
---|---|
74 { | 74 { |
75 PROP_TITLE = 1, | 75 PROP_TITLE = 1, |
76 PROP_DESCRIPTION, | 76 PROP_DESCRIPTION, |
77 PROP_ICON_NAME, | 77 PROP_ICON_NAME, |
78 PROP_CUSTOM_ICON, | 78 PROP_CUSTOM_ICON, |
79 PROP_ENABLE_DESCRIPTION_MARKUP, | |
79 | 80 |
80 LAST_PROPERTY | 81 LAST_PROPERTY |
81 } HazeConnectionProperties; | 82 } HazeConnectionProperties; |
82 | 83 |
83 typedef struct _PidginMiniDialogPrivate | 84 typedef struct _PidginMiniDialogPrivate |
85 GtkImage *icon; | 86 GtkImage *icon; |
86 GtkBox *title_box; | 87 GtkBox *title_box; |
87 GtkLabel *title; | 88 GtkLabel *title; |
88 GtkLabel *desc; | 89 GtkLabel *desc; |
89 GtkBox *buttons; | 90 GtkBox *buttons; |
91 gboolean enable_description_markup; | |
90 | 92 |
91 guint idle_destroy_cb_id; | 93 guint idle_destroy_cb_id; |
92 } PidginMiniDialogPrivate; | 94 } PidginMiniDialogPrivate; |
93 | 95 |
94 #define PIDGIN_MINI_DIALOG_GET_PRIVATE(dialog) \ | 96 #define PIDGIN_MINI_DIALOG_GET_PRIVATE(dialog) \ |
136 { | 138 { |
137 g_object_set(G_OBJECT(mini_dialog), "description", description, NULL); | 139 g_object_set(G_OBJECT(mini_dialog), "description", description, NULL); |
138 } | 140 } |
139 | 141 |
140 void | 142 void |
143 pidgin_mini_dialog_enable_description_markup(PidginMiniDialog *mini_dialog) | |
144 { | |
145 g_object_set(G_OBJECT(mini_dialog), "enable-description-markup", TRUE, NULL); | |
146 } | |
147 | |
148 gboolean | |
149 pidgin_mini_dialog_links_supported() | |
150 { | |
151 #if GTK_CHECK_VERSION(2,18,0) | |
152 return TRUE; | |
153 #else | |
154 return FALSE; | |
155 #endif | |
156 } | |
157 | |
158 void pidgin_mini_dialog_set_link_callback(PidginMiniDialog *mini_dialog, GCallback cb, gpointer user_data) | |
159 { | |
160 g_signal_connect(PIDGIN_MINI_DIALOG_GET_PRIVATE(mini_dialog)->desc, "activate-link", cb, user_data); | |
161 } | |
162 | |
163 void | |
141 pidgin_mini_dialog_set_icon_name(PidginMiniDialog *mini_dialog, | 164 pidgin_mini_dialog_set_icon_name(PidginMiniDialog *mini_dialog, |
142 const char *icon_name) | 165 const char *icon_name) |
143 { | 166 { |
144 g_object_set(G_OBJECT(mini_dialog), "icon-name", icon_name, NULL); | 167 g_object_set(G_OBJECT(mini_dialog), "icon-name", icon_name, NULL); |
145 } | 168 } |
153 struct _mini_dialog_button_clicked_cb_data | 176 struct _mini_dialog_button_clicked_cb_data |
154 { | 177 { |
155 PidginMiniDialog *mini_dialog; | 178 PidginMiniDialog *mini_dialog; |
156 PidginMiniDialogCallback callback; | 179 PidginMiniDialogCallback callback; |
157 gpointer user_data; | 180 gpointer user_data; |
181 gboolean close_dialog_after_click; | |
158 }; | 182 }; |
159 | 183 |
160 guint | 184 guint |
161 pidgin_mini_dialog_get_num_children(PidginMiniDialog *mini_dialog) | 185 pidgin_mini_dialog_get_num_children(PidginMiniDialog *mini_dialog) |
162 { | 186 { |
176 { | 200 { |
177 struct _mini_dialog_button_clicked_cb_data *data = user_data; | 201 struct _mini_dialog_button_clicked_cb_data *data = user_data; |
178 PidginMiniDialogPrivate *priv = | 202 PidginMiniDialogPrivate *priv = |
179 PIDGIN_MINI_DIALOG_GET_PRIVATE(data->mini_dialog); | 203 PIDGIN_MINI_DIALOG_GET_PRIVATE(data->mini_dialog); |
180 | 204 |
181 /* Set up the destruction callback before calling the clicked callback, | 205 if (data->close_dialog_after_click) { |
182 * so that if the mini-dialog gets destroyed during the clicked callback | 206 /* Set up the destruction callback before calling the clicked callback, |
183 * the idle_destroy_cb is correctly removed by _finalize. | 207 * so that if the mini-dialog gets destroyed during the clicked callback |
184 */ | 208 * the idle_destroy_cb is correctly removed by _finalize. |
185 priv->idle_destroy_cb_id = | 209 */ |
186 g_idle_add((GSourceFunc) idle_destroy_cb, data->mini_dialog); | 210 priv->idle_destroy_cb_id = |
211 g_idle_add((GSourceFunc) idle_destroy_cb, data->mini_dialog); | |
212 } | |
187 | 213 |
188 if (data->callback != NULL) | 214 if (data->callback != NULL) |
189 data->callback(data->mini_dialog, button, data->user_data); | 215 data->callback(data->mini_dialog, button, data->user_data); |
190 | 216 |
191 } | 217 } |
196 { | 222 { |
197 struct _mini_dialog_button_clicked_cb_data *data = user_data; | 223 struct _mini_dialog_button_clicked_cb_data *data = user_data; |
198 g_free(data); | 224 g_free(data); |
199 } | 225 } |
200 | 226 |
201 void | 227 static void |
202 pidgin_mini_dialog_add_button(PidginMiniDialog *self, | 228 mini_dialog_add_button(PidginMiniDialog *self, |
203 const char *text, | 229 const char *text, |
204 PidginMiniDialogCallback clicked_cb, | 230 PidginMiniDialogCallback clicked_cb, |
205 gpointer user_data) | 231 gpointer user_data, |
232 gboolean close_dialog_after_click) | |
206 { | 233 { |
207 PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self); | 234 PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self); |
208 struct _mini_dialog_button_clicked_cb_data *callback_data | 235 struct _mini_dialog_button_clicked_cb_data *callback_data |
209 = g_new0(struct _mini_dialog_button_clicked_cb_data, 1); | 236 = g_new0(struct _mini_dialog_button_clicked_cb_data, 1); |
210 GtkWidget *button = gtk_button_new(); | 237 GtkWidget *button = gtk_button_new(); |
216 g_free(button_text); | 243 g_free(button_text); |
217 | 244 |
218 callback_data->mini_dialog = self; | 245 callback_data->mini_dialog = self; |
219 callback_data->callback = clicked_cb; | 246 callback_data->callback = clicked_cb; |
220 callback_data->user_data = user_data; | 247 callback_data->user_data = user_data; |
248 callback_data->close_dialog_after_click = close_dialog_after_click; | |
221 g_signal_connect(G_OBJECT(button), "clicked", | 249 g_signal_connect(G_OBJECT(button), "clicked", |
222 (GCallback) mini_dialog_button_clicked_cb, callback_data); | 250 (GCallback) mini_dialog_button_clicked_cb, callback_data); |
223 g_signal_connect(G_OBJECT(button), "destroy", | 251 g_signal_connect(G_OBJECT(button), "destroy", |
224 (GCallback) mini_dialog_button_destroy_cb, callback_data); | 252 (GCallback) mini_dialog_button_destroy_cb, callback_data); |
225 | 253 |
227 gtk_container_add(GTK_CONTAINER(button), label); | 255 gtk_container_add(GTK_CONTAINER(button), label); |
228 | 256 |
229 gtk_box_pack_end(GTK_BOX(priv->buttons), button, FALSE, FALSE, | 257 gtk_box_pack_end(GTK_BOX(priv->buttons), button, FALSE, FALSE, |
230 0); | 258 0); |
231 gtk_widget_show_all(GTK_WIDGET(button)); | 259 gtk_widget_show_all(GTK_WIDGET(button)); |
260 } | |
261 | |
262 void | |
263 pidgin_mini_dialog_add_button(PidginMiniDialog *self, | |
264 const char *text, | |
265 PidginMiniDialogCallback clicked_cb, | |
266 gpointer user_data) | |
267 { | |
268 mini_dialog_add_button(self, text, clicked_cb, user_data, TRUE); | |
269 } | |
270 | |
271 void | |
272 pidgin_mini_dialog_add_non_closing_button(PidginMiniDialog *self, | |
273 const char *text, | |
274 PidginMiniDialogCallback clicked_cb, | |
275 gpointer user_data) | |
276 { | |
277 mini_dialog_add_button(self, text, clicked_cb, user_data, FALSE); | |
232 } | 278 } |
233 | 279 |
234 static void | 280 static void |
235 pidgin_mini_dialog_get_property(GObject *object, | 281 pidgin_mini_dialog_get_property(GObject *object, |
236 guint property_id, | 282 guint property_id, |
256 break; | 302 break; |
257 } | 303 } |
258 case PROP_CUSTOM_ICON: | 304 case PROP_CUSTOM_ICON: |
259 g_value_set_object(value, gtk_image_get_pixbuf(priv->icon)); | 305 g_value_set_object(value, gtk_image_get_pixbuf(priv->icon)); |
260 break; | 306 break; |
307 case PROP_ENABLE_DESCRIPTION_MARKUP: | |
308 g_value_set_boolean(value, priv->enable_description_markup); | |
309 break; | |
261 default: | 310 default: |
262 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); | 311 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); |
263 } | 312 } |
264 } | 313 } |
265 | 314 |
285 const char *description) | 334 const char *description) |
286 { | 335 { |
287 PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self); | 336 PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self); |
288 if(description) | 337 if(description) |
289 { | 338 { |
290 char *desc_esc = g_markup_escape_text(description, -1); | 339 char *desc_esc = priv->enable_description_markup ? g_strdup(description) : g_markup_escape_text(description, -1); |
291 char *desc_markup = g_strdup_printf( | 340 char *desc_markup = g_strdup_printf( |
292 "<span size=\"smaller\">%s</span>", desc_esc); | 341 "<span size=\"smaller\">%s</span>", desc_esc); |
293 | 342 |
294 gtk_label_set_markup(priv->desc, desc_markup); | 343 gtk_label_set_markup(priv->desc, desc_markup); |
295 | 344 |
331 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)); | 380 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL)); |
332 break; | 381 break; |
333 case PROP_CUSTOM_ICON: | 382 case PROP_CUSTOM_ICON: |
334 gtk_image_set_from_pixbuf(priv->icon, g_value_get_object(value)); | 383 gtk_image_set_from_pixbuf(priv->icon, g_value_get_object(value)); |
335 break; | 384 break; |
385 case PROP_ENABLE_DESCRIPTION_MARKUP: | |
386 priv->enable_description_markup = g_value_get_boolean(value); | |
387 break; | |
336 default: | 388 default: |
337 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); | 389 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); |
338 } | 390 } |
339 } | 391 } |
340 | 392 |
388 "Pixbuf to use as the dialog's icon", | 440 "Pixbuf to use as the dialog's icon", |
389 GDK_TYPE_PIXBUF, | 441 GDK_TYPE_PIXBUF, |
390 G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | | 442 G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | |
391 G_PARAM_READWRITE); | 443 G_PARAM_READWRITE); |
392 g_object_class_install_property (object_class, PROP_CUSTOM_ICON, param_spec); | 444 g_object_class_install_property (object_class, PROP_CUSTOM_ICON, param_spec); |
445 | |
446 param_spec = g_param_spec_boolean("enable-description-markup", "enable-description-markup", | |
447 "Use GMarkup in the description text", FALSE, | |
448 G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | | |
449 G_PARAM_READWRITE); | |
450 g_object_class_install_property (object_class, PROP_ENABLE_DESCRIPTION_MARKUP, param_spec); | |
393 } | 451 } |
394 | 452 |
395 /* 16 is the width of the icon, due to PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL */ | 453 /* 16 is the width of the icon, due to PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL */ |
396 #define BLIST_WIDTH_OTHER_THAN_LABEL \ | 454 #define BLIST_WIDTH_OTHER_THAN_LABEL \ |
397 ((PIDGIN_HIG_BOX_SPACE * 3) + 16) | 455 ((PIDGIN_HIG_BOX_SPACE * 3) + 16) |