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)