41
41
pidgin_mini_dialog_class_intern_init (gpointer klass)
43
pidgin_mini_dialog_parent_class = g_type_class_peek_parent (klass);
44
pidgin_mini_dialog_class_init ((PidginMiniDialogClass*) klass);
43
pidgin_mini_dialog_parent_class = g_type_class_peek_parent (klass);
44
pidgin_mini_dialog_class_init ( (PidginMiniDialogClass*) klass);
48
48
pidgin_mini_dialog_get_type (void)
50
static GType g_define_type_id = 0;
51
if (g_define_type_id == 0)
53
static const GTypeInfo g_define_type_info = {
54
sizeof (PidginMiniDialogClass),
56
(GBaseFinalizeFunc) NULL,
57
(GClassInitFunc) pidgin_mini_dialog_class_intern_init,
58
(GClassFinalizeFunc) NULL,
59
NULL, /* class_data */
60
sizeof (PidginMiniDialog),
62
(GInstanceInitFunc) pidgin_mini_dialog_init,
65
g_define_type_id = g_type_register_static (GTK_TYPE_VBOX,
66
"PidginMiniDialog", &g_define_type_info, 0);
68
return g_define_type_id;
50
static GType g_define_type_id = 0;
52
if (g_define_type_id == 0) {
53
static const GTypeInfo g_define_type_info = {
54
sizeof (PidginMiniDialogClass),
56
(GBaseFinalizeFunc) NULL,
57
(GClassInitFunc) pidgin_mini_dialog_class_intern_init,
58
(GClassFinalizeFunc) NULL,
59
NULL, /* class_data */
60
sizeof (PidginMiniDialog),
62
(GInstanceInitFunc) pidgin_mini_dialog_init,
65
g_define_type_id = g_type_register_static (GTK_TYPE_VBOX,
66
"PidginMiniDialog", &g_define_type_info, 0);
69
return g_define_type_id;
78
78
} HazeConnectionProperties;
80
typedef struct _PidginMiniDialogPrivate
80
typedef struct _PidginMiniDialogPrivate {
88
guint idle_destroy_cb_id;
87
guint idle_destroy_cb_id;
89
88
} PidginMiniDialogPrivate;
91
90
#define PIDGIN_MINI_DIALOG_GET_PRIVATE(dialog) \
92
91
((PidginMiniDialogPrivate *) ((dialog)->priv))
95
pidgin_mini_dialog_new(const gchar *title,
96
const gchar *description,
97
const gchar *icon_name)
99
PidginMiniDialog *mini_dialog = g_object_new(PIDGIN_TYPE_MINI_DIALOG,
101
"description", description,
102
"icon-name", icon_name,
109
pidgin_mini_dialog_set_title(PidginMiniDialog *mini_dialog,
112
g_object_set(G_OBJECT(mini_dialog), "title", title, NULL);
116
pidgin_mini_dialog_set_description(PidginMiniDialog *mini_dialog,
117
const char *description)
119
g_object_set(G_OBJECT(mini_dialog), "description", description, NULL);
123
pidgin_mini_dialog_set_icon_name(PidginMiniDialog *mini_dialog,
124
const char *icon_name)
126
g_object_set(G_OBJECT(mini_dialog), "icon_name", icon_name, NULL);
129
struct _mini_dialog_button_clicked_cb_data
131
PidginMiniDialog *mini_dialog;
132
PidginMiniDialogCallback callback;
94
pidgin_mini_dialog_new (const gchar *title,
95
const gchar *description,
96
const gchar *icon_name)
98
PidginMiniDialog *mini_dialog = g_object_new (PIDGIN_TYPE_MINI_DIALOG,
100
"description", description,
101
"icon-name", icon_name,
108
pidgin_mini_dialog_set_title (PidginMiniDialog *mini_dialog,
111
g_object_set (G_OBJECT (mini_dialog), "title", title, NULL);
115
pidgin_mini_dialog_set_description (PidginMiniDialog *mini_dialog,
116
const char *description)
118
g_object_set (G_OBJECT (mini_dialog), "description", description, NULL);
122
pidgin_mini_dialog_set_icon_name (PidginMiniDialog *mini_dialog,
123
const char *icon_name)
125
g_object_set (G_OBJECT (mini_dialog), "icon_name", icon_name, NULL);
128
struct _mini_dialog_button_clicked_cb_data {
129
PidginMiniDialog *mini_dialog;
130
PidginMiniDialogCallback callback;
137
pidgin_mini_dialog_get_num_children(PidginMiniDialog *mini_dialog)
135
pidgin_mini_dialog_get_num_children (PidginMiniDialog *mini_dialog)
139
return g_list_length(mini_dialog->contents->children);
137
return g_list_length (mini_dialog->contents->children);
143
idle_destroy_cb(GtkWidget *mini_dialog)
145
gtk_widget_destroy(mini_dialog);
150
mini_dialog_button_clicked_cb(GtkButton *button,
153
struct _mini_dialog_button_clicked_cb_data *data = user_data;
154
PidginMiniDialogPrivate *priv =
155
PIDGIN_MINI_DIALOG_GET_PRIVATE(data->mini_dialog);
157
/* Set up the destruction callback before calling the clicked callback,
158
* so that if the mini-dialog gets destroyed during the clicked callback
159
* the idle_destroy_cb is correctly removed by _finalize.
161
priv->idle_destroy_cb_id =
162
g_idle_add((GSourceFunc) idle_destroy_cb, data->mini_dialog);
164
if (data->callback != NULL)
165
data->callback(data->mini_dialog, button, data->user_data);
170
mini_dialog_button_destroy_cb(GtkButton *button,
173
struct _mini_dialog_button_clicked_cb_data *data = user_data;
141
idle_destroy_cb (GtkWidget *mini_dialog)
143
gtk_widget_destroy (mini_dialog);
148
mini_dialog_button_clicked_cb (GtkButton *button,
151
struct _mini_dialog_button_clicked_cb_data *data = user_data;
152
PidginMiniDialogPrivate *priv =
153
PIDGIN_MINI_DIALOG_GET_PRIVATE (data->mini_dialog);
155
/* Set up the destruction callback before calling the clicked callback,
156
* so that if the mini-dialog gets destroyed during the clicked callback
157
* the idle_destroy_cb is correctly removed by _finalize.
159
priv->idle_destroy_cb_id =
160
g_idle_add ( (GSourceFunc) idle_destroy_cb, data->mini_dialog);
162
if (data->callback != NULL)
163
data->callback (data->mini_dialog, button, data->user_data);
168
mini_dialog_button_destroy_cb (GtkButton *button UNUSED,
171
struct _mini_dialog_button_clicked_cb_data *data = user_data;
178
pidgin_mini_dialog_add_button(PidginMiniDialog *self,
180
PidginMiniDialogCallback clicked_cb,
183
PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
184
struct _mini_dialog_button_clicked_cb_data *callback_data
185
= g_new0(struct _mini_dialog_button_clicked_cb_data, 1);
186
GtkWidget *button = gtk_button_new();
187
GtkWidget *label = gtk_label_new(NULL);
189
g_strdup_printf("<span size=\"smaller\">%s</span>", text);
191
gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), button_text);
194
callback_data->mini_dialog = self;
195
callback_data->callback = clicked_cb;
196
callback_data->user_data = user_data;
197
g_signal_connect(G_OBJECT(button), "clicked",
198
(GCallback) mini_dialog_button_clicked_cb, callback_data);
199
g_signal_connect(G_OBJECT(button), "destroy",
200
(GCallback) mini_dialog_button_destroy_cb, callback_data);
202
gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
203
gtk_container_add(GTK_CONTAINER(button), label);
205
gtk_box_pack_end(GTK_BOX(priv->buttons), button, FALSE, FALSE,
207
gtk_widget_show_all(GTK_WIDGET(button));
211
pidgin_mini_dialog_get_property(GObject *object,
216
PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object);
217
PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
219
switch (property_id) {
221
g_value_set_string(value, gtk_label_get_text(priv->title));
223
case PROP_DESCRIPTION:
224
g_value_set_string(value, gtk_label_get_text(priv->desc));
228
gchar *icon_name = NULL;
230
gtk_image_get_stock(priv->icon, &icon_name, &size);
231
g_value_set_string(value, icon_name);
235
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
240
mini_dialog_set_title(PidginMiniDialog *self,
243
PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
245
char *title_esc = g_markup_escape_text(title, -1);
246
char *title_markup = g_strdup_printf(
247
"<span weight=\"bold\" size=\"smaller\">%s</span>",
248
title_esc ? title_esc : "");
250
gtk_label_set_markup(priv->title, title_markup);
253
g_free(title_markup);
257
mini_dialog_set_description(PidginMiniDialog *self,
258
const char *description)
260
PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
263
char *desc_esc = g_markup_escape_text(description, -1);
264
char *desc_markup = g_strdup_printf(
265
"<span size=\"smaller\">%s</span>", desc_esc);
267
gtk_label_set_markup(priv->desc, desc_markup);
272
gtk_widget_show(GTK_WIDGET(priv->desc));
273
g_object_set(G_OBJECT(priv->desc), "no-show-all", FALSE, NULL);
277
gtk_label_set_text(priv->desc, NULL);
278
gtk_widget_hide(GTK_WIDGET(priv->desc));
279
/* make calling show_all() on the minidialog not affect desc
280
* even though it's packed inside it.
282
g_object_set(G_OBJECT(priv->desc), "no-show-all", TRUE, NULL);
287
pidgin_mini_dialog_set_property(GObject *object,
292
PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object);
293
PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
295
switch (property_id) {
297
mini_dialog_set_title(self, g_value_get_string(value));
299
case PROP_DESCRIPTION:
300
mini_dialog_set_description(self, g_value_get_string(value));
303
gtk_image_set_from_stock(priv->icon, g_value_get_string(value),
304
GTK_ICON_SIZE_BUTTON);
307
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
312
pidgin_mini_dialog_finalize(GObject *object)
314
PidginMiniDialog *self = PIDGIN_MINI_DIALOG(object);
315
PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
317
if (priv->idle_destroy_cb_id)
318
g_source_remove(priv->idle_destroy_cb_id);
324
G_OBJECT_CLASS (pidgin_mini_dialog_parent_class)->finalize (object);
328
pidgin_mini_dialog_class_init(PidginMiniDialogClass *klass)
330
GObjectClass *object_class = G_OBJECT_CLASS(klass);
331
GParamSpec *param_spec;
333
object_class->get_property = pidgin_mini_dialog_get_property;
334
object_class->set_property = pidgin_mini_dialog_set_property;
335
object_class->finalize = pidgin_mini_dialog_finalize;
337
param_spec = g_param_spec_string("title", "title",
338
"String specifying the mini-dialog's title", NULL,
339
G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
341
g_object_class_install_property (object_class, PROP_TITLE, param_spec);
343
param_spec = g_param_spec_string("description", "description",
344
"Description text for the mini-dialog, if desired", NULL,
345
G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
347
g_object_class_install_property (object_class, PROP_DESCRIPTION, param_spec);
349
param_spec = g_param_spec_string("icon-name", "icon-name",
350
"String specifying the Gtk stock name of the dialog's icon",
352
G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
354
g_object_class_install_property (object_class, PROP_ICON_NAME, param_spec);
176
pidgin_mini_dialog_add_button (PidginMiniDialog *self,
178
PidginMiniDialogCallback clicked_cb,
181
PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE (self);
182
struct _mini_dialog_button_clicked_cb_data *callback_data
183
= g_new0 (struct _mini_dialog_button_clicked_cb_data, 1);
184
GtkWidget *button = gtk_button_new();
185
GtkWidget *label = gtk_label_new (NULL);
187
g_strdup_printf ("<span size=\"smaller\">%s</span>", text);
189
gtk_label_set_markup_with_mnemonic (GTK_LABEL (label), button_text);
190
g_free (button_text);
192
callback_data->mini_dialog = self;
193
callback_data->callback = clicked_cb;
194
callback_data->user_data = user_data;
195
g_signal_connect (G_OBJECT (button), "clicked",
196
(GCallback) mini_dialog_button_clicked_cb, callback_data);
197
g_signal_connect (G_OBJECT (button), "destroy",
198
(GCallback) mini_dialog_button_destroy_cb, callback_data);
200
gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
201
gtk_container_add (GTK_CONTAINER (button), label);
203
gtk_box_pack_end (GTK_BOX (priv->buttons), button, FALSE, FALSE,
205
gtk_widget_show_all (GTK_WIDGET (button));
209
pidgin_mini_dialog_get_property (GObject *object,
214
PidginMiniDialog *self = PIDGIN_MINI_DIALOG (object);
215
PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE (self);
217
switch (property_id) {
219
g_value_set_string (value, gtk_label_get_text (priv->title));
221
case PROP_DESCRIPTION:
222
g_value_set_string (value, gtk_label_get_text (priv->desc));
224
case PROP_ICON_NAME: {
225
gchar *icon_name = NULL;
227
gtk_image_get_stock (priv->icon, &icon_name, &size);
228
g_value_set_string (value, icon_name);
232
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
237
mini_dialog_set_title (PidginMiniDialog *self,
240
PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE (self);
242
char *title_esc = g_markup_escape_text (title, -1);
243
char *title_markup = g_strdup_printf (
244
"<span weight=\"bold\" size=\"smaller\">%s</span>",
245
title_esc ? title_esc : "");
247
gtk_label_set_markup (priv->title, title_markup);
250
g_free (title_markup);
254
mini_dialog_set_description (PidginMiniDialog *self,
255
const char *description)
257
PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE (self);
260
char *desc_esc = g_markup_escape_text (description, -1);
261
char *desc_markup = g_strdup_printf (
262
"<span size=\"smaller\">%s</span>", desc_esc);
264
gtk_label_set_markup (priv->desc, desc_markup);
267
g_free (desc_markup);
269
gtk_widget_show (GTK_WIDGET (priv->desc));
270
g_object_set (G_OBJECT (priv->desc), "no-show-all", FALSE, NULL);
272
gtk_label_set_text (priv->desc, NULL);
273
gtk_widget_hide (GTK_WIDGET (priv->desc));
274
/* make calling show_all() on the minidialog not affect desc
275
* even though it's packed inside it.
277
g_object_set (G_OBJECT (priv->desc), "no-show-all", TRUE, NULL);
282
pidgin_mini_dialog_set_property (GObject *object,
287
PidginMiniDialog *self = PIDGIN_MINI_DIALOG (object);
288
PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE (self);
290
switch (property_id) {
292
mini_dialog_set_title (self, g_value_get_string (value));
294
case PROP_DESCRIPTION:
295
mini_dialog_set_description (self, g_value_get_string (value));
298
gtk_image_set_from_stock (priv->icon, g_value_get_string (value),
299
GTK_ICON_SIZE_BUTTON);
302
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
307
pidgin_mini_dialog_finalize (GObject *object)
309
PidginMiniDialog *self = PIDGIN_MINI_DIALOG (object);
310
PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE (self);
312
if (priv->idle_destroy_cb_id)
313
g_source_remove (priv->idle_destroy_cb_id);
319
G_OBJECT_CLASS (pidgin_mini_dialog_parent_class)->finalize (object);
323
pidgin_mini_dialog_class_init (PidginMiniDialogClass *klass)
325
GObjectClass *object_class = G_OBJECT_CLASS (klass);
326
GParamSpec *param_spec;
328
object_class->get_property = pidgin_mini_dialog_get_property;
329
object_class->set_property = pidgin_mini_dialog_set_property;
330
object_class->finalize = pidgin_mini_dialog_finalize;
332
param_spec = g_param_spec_string ("title", "title",
333
"String specifying the mini-dialog's title", NULL,
334
G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
336
g_object_class_install_property (object_class, PROP_TITLE, param_spec);
338
param_spec = g_param_spec_string ("description", "description",
339
"Description text for the mini-dialog, if desired", NULL,
340
G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
342
g_object_class_install_property (object_class, PROP_DESCRIPTION, param_spec);
344
param_spec = g_param_spec_string ("icon-name", "icon-name",
345
"String specifying the Gtk stock name of the dialog's icon",
347
G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
349
g_object_class_install_property (object_class, PROP_ICON_NAME, param_spec);
357
352
/* 16 is the width of the icon, due to PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL */
362
357
(PIDGIN_PREFS_ROOT "/blist/width")
365
blist_width_changed_cb(const char *name,
369
PidginMiniDialog *self = PIDGIN_MINI_DIALOG(data);
370
PidginMiniDialogPrivate *priv = PIDGIN_MINI_DIALOG_GET_PRIVATE(self);
371
guint blist_width = GPOINTER_TO_INT(val);
372
guint label_width = LABEL_WIDTH;
374
gtk_widget_set_size_request(GTK_WIDGET(priv->title), label_width, -1);
375
gtk_widget_set_size_request(GTK_WIDGET(priv->desc), label_width, -1);
379
pidgin_mini_dialog_init(PidginMiniDialog *self)
381
GtkBox *self_box = GTK_BOX(self);
382
guint label_width = LABEL_WIDTH;
384
PidginMiniDialogPrivate *priv = g_new0(PidginMiniDialogPrivate, 1);
387
gtk_container_set_border_width(GTK_CONTAINER(self), HIG_BOX_SPACE);
389
priv->title_box = GTK_BOX(gtk_hbox_new(FALSE, HIG_BOX_SPACE));
391
priv->icon = GTK_IMAGE(gtk_image_new());
392
gtk_misc_set_alignment(GTK_MISC(priv->icon), 0, 0);
394
priv->title = GTK_LABEL(gtk_label_new(NULL));
395
gtk_widget_set_size_request(GTK_WIDGET(priv->title), label_width, -1);
396
gtk_label_set_line_wrap(priv->title, TRUE);
397
gtk_label_set_selectable(priv->title, TRUE);
398
gtk_misc_set_alignment(GTK_MISC(priv->title), 0, 0);
400
gtk_box_pack_start(priv->title_box, GTK_WIDGET(priv->icon), FALSE, FALSE, 0);
401
gtk_box_pack_start(priv->title_box, GTK_WIDGET(priv->title), TRUE, TRUE, 0);
403
priv->desc = GTK_LABEL(gtk_label_new(NULL));
404
gtk_widget_set_size_request(GTK_WIDGET(priv->desc), label_width, -1);
405
gtk_label_set_line_wrap(priv->desc, TRUE);
406
gtk_misc_set_alignment(GTK_MISC(priv->desc), 0, 0);
407
gtk_label_set_selectable(priv->desc, TRUE);
408
/* make calling show_all() on the minidialog not affect desc even though
409
* it's packed inside it.
411
g_object_set(G_OBJECT(priv->desc), "no-show-all", TRUE, NULL);
413
self->contents = GTK_BOX(gtk_vbox_new(FALSE, 0));
415
priv->buttons = GTK_BOX(gtk_hbox_new(FALSE, 0));
417
gtk_box_pack_start(self_box, GTK_WIDGET(priv->title_box), FALSE, FALSE, 0);
418
gtk_box_pack_start(self_box, GTK_WIDGET(priv->desc), FALSE, FALSE, 0);
419
gtk_box_pack_start(self_box, GTK_WIDGET(self->contents), TRUE, TRUE, 0);
420
gtk_box_pack_start(self_box, GTK_WIDGET(priv->buttons), FALSE, FALSE, 0);
422
gtk_widget_show_all(GTK_WIDGET(self));
360
pidgin_mini_dialog_init (PidginMiniDialog *self)
362
GtkBox *self_box = GTK_BOX (self);
363
guint label_width = LABEL_WIDTH;
365
PidginMiniDialogPrivate *priv = g_new0 (PidginMiniDialogPrivate, 1);
368
gtk_container_set_border_width (GTK_CONTAINER (self), HIG_BOX_SPACE);
370
priv->title_box = GTK_BOX (gtk_hbox_new (FALSE, HIG_BOX_SPACE));
372
priv->icon = GTK_IMAGE (gtk_image_new());
373
gtk_misc_set_alignment (GTK_MISC (priv->icon), 0, 0);
375
priv->title = GTK_LABEL (gtk_label_new (NULL));
376
gtk_widget_set_size_request (GTK_WIDGET (priv->title), label_width, -1);
377
gtk_label_set_line_wrap (priv->title, TRUE);
378
gtk_label_set_selectable (priv->title, TRUE);
379
gtk_misc_set_alignment (GTK_MISC (priv->title), 0, 0);
381
gtk_box_pack_start (priv->title_box, GTK_WIDGET (priv->icon), FALSE, FALSE, 0);
382
gtk_box_pack_start (priv->title_box, GTK_WIDGET (priv->title), TRUE, TRUE, 0);
384
priv->desc = GTK_LABEL (gtk_label_new (NULL));
385
gtk_widget_set_size_request (GTK_WIDGET (priv->desc), label_width, -1);
386
gtk_label_set_line_wrap (priv->desc, TRUE);
387
gtk_misc_set_alignment (GTK_MISC (priv->desc), 0, 0);
388
gtk_label_set_selectable (priv->desc, TRUE);
389
/* make calling show_all() on the minidialog not affect desc even though
390
* it's packed inside it.
392
g_object_set (G_OBJECT (priv->desc), "no-show-all", TRUE, NULL);
394
self->contents = GTK_BOX (gtk_vbox_new (FALSE, 0));
396
priv->buttons = GTK_BOX (gtk_hbox_new (FALSE, 0));
398
gtk_box_pack_start (self_box, GTK_WIDGET (priv->title_box), FALSE, FALSE, 0);
399
gtk_box_pack_start (self_box, GTK_WIDGET (priv->desc), FALSE, FALSE, 0);
400
gtk_box_pack_start (self_box, GTK_WIDGET (self->contents), TRUE, TRUE, 0);
401
gtk_box_pack_start (self_box, GTK_WIDGET (priv->buttons), FALSE, FALSE, 0);
403
gtk_widget_show_all (GTK_WIDGET (self));