pidgin/gtkrequest.c

branch
soc.2013.gobjectification
changeset 34940
c0aef3b64c56
parent 34892
65e25c679ca5
parent 34338
c652670afac5
child 34941
e5530c2b896e
equal deleted inserted replaced
34939:e093c956c5e5 34940:c0aef3b64c56
185 generic_response_start(data); 185 generic_response_start(data);
186 186
187 if (id >= 0 && (gsize)id < data->cb_count && data->cbs[id] != NULL) 187 if (id >= 0 && (gsize)id < data->cb_count && data->cbs[id] != NULL)
188 while (group) { 188 while (group) {
189 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group->data))) { 189 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(group->data))) {
190 ((PurpleRequestChoiceCb)data->cbs[id])(data->user_data, GPOINTER_TO_INT(g_object_get_data(G_OBJECT(group->data), "choice_id"))); 190 ((PurpleRequestChoiceCb)data->cbs[id])(data->user_data, g_object_get_data(G_OBJECT(group->data), "choice_value"));
191 break; 191 break;
192 } 192 }
193 group = group->next; 193 group = group->next;
194 } 194 }
195 purple_request_close(PURPLE_REQUEST_INPUT, data); 195 purple_request_close(PURPLE_REQUEST_INPUT, data);
230 } 230 }
231 231
232 static void 232 static void
233 field_choice_menu_cb(GtkComboBox *menu, PurpleRequestField *field) 233 field_choice_menu_cb(GtkComboBox *menu, PurpleRequestField *field)
234 { 234 {
235 purple_request_field_choice_set_value(field, 235 int active = gtk_combo_box_get_active(menu);
236 gtk_combo_box_get_active(menu)); 236 gpointer *values = g_object_get_data(G_OBJECT(menu), "values");
237
238 g_return_if_fail(values != NULL);
239 g_return_if_fail(active >= 0);
240
241 purple_request_field_choice_set_value(field, values[active]);
237 } 242 }
238 243
239 static void 244 static void
240 field_choice_option_cb(GtkRadioButton *button, PurpleRequestField *field) 245 field_choice_option_cb(GtkRadioButton *button, PurpleRequestField *field)
241 { 246 {
242 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) 247 int active;
243 purple_request_field_choice_set_value(field, 248 gpointer *values = g_object_get_data(G_OBJECT(g_object_get_data(
244 (g_slist_length(gtk_radio_button_get_group(button)) - 249 G_OBJECT(button), "box")), "values");
245 g_slist_index(gtk_radio_button_get_group(button), button)) - 1); 250
251 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
252 return;
253
254 active = (g_slist_length(gtk_radio_button_get_group(button)) -
255 g_slist_index(gtk_radio_button_get_group(button), button)) - 1;
256
257 g_return_if_fail(values != NULL);
258 g_return_if_fail(active >= 0);
259
260 purple_request_field_choice_set_value(field, values[active]);
246 } 261 }
247 262
248 static void 263 static void
249 field_account_cb(GObject *w, PurpleAccount *account, PurpleRequestField *field) 264 field_account_cb(GObject *w, PurpleAccount *account, PurpleRequestField *field)
250 { 265 {
307 STOCK_ITEMIZE(_("Alias"), PIDGIN_STOCK_ALIAS); 322 STOCK_ITEMIZE(_("Alias"), PIDGIN_STOCK_ALIAS);
308 323
309 return text; 324 return text;
310 } 325 }
311 326
327 static gchar *
328 pidgin_request_escape(PurpleRequestCommonParameters *cpar, const gchar *text)
329 {
330 if (text == NULL)
331 return NULL;
332
333 if (purple_request_cpar_is_html(cpar)) {
334 gboolean valid;
335
336 valid = pango_parse_markup(text, -1, 0, NULL, NULL, NULL, NULL);
337
338 if (valid)
339 return g_strdup(text);
340 else {
341 purple_debug_error("pidgin", "Passed label text is not "
342 "a valid markup. Falling back to plain text.");
343 }
344 }
345
346 return g_markup_escape_text(text, -1);
347 }
348
349 static GtkWidget *
350 pidgin_request_dialog_icon(PurpleRequestCommonParameters *cpar)
351 {
352 GtkWidget *img = NULL;
353 PurpleRequestIconType icon_type;
354 gconstpointer icon_data;
355 gsize icon_size;
356 const gchar *icon_stock = PIDGIN_STOCK_DIALOG_QUESTION;
357
358 /* Dialog icon. */
359 icon_data = purple_request_cpar_get_custom_icon(cpar, &icon_size);
360 if (icon_data) {
361 GdkPixbuf *pixbuf;
362
363 pixbuf = pidgin_pixbuf_from_data(icon_data, icon_size);
364 if (pixbuf) {
365 /* scale the image if it is too large */
366 int width = gdk_pixbuf_get_width(pixbuf);
367 int height = gdk_pixbuf_get_height(pixbuf);
368 if (width > 128 || height > 128) {
369 int scaled_width = width > height ?
370 128 : (128 * width) / height;
371 int scaled_height = height > width ?
372 128 : (128 * height) / width;
373 GdkPixbuf *scaled;
374
375 purple_debug_info("pidgin", "dialog icon was "
376 "too large, scaling it down");
377
378 scaled = gdk_pixbuf_scale_simple(pixbuf,
379 scaled_width, scaled_height,
380 GDK_INTERP_BILINEAR);
381 if (scaled) {
382 g_object_unref(pixbuf);
383 pixbuf = scaled;
384 }
385 }
386 img = gtk_image_new_from_pixbuf(pixbuf);
387 g_object_unref(pixbuf);
388 } else {
389 purple_debug_info("pidgin",
390 "failed to parse dialog icon");
391 }
392 }
393
394 if (img)
395 return img;
396
397 icon_type = purple_request_cpar_get_icon(cpar);
398 switch (icon_type)
399 {
400 case PURPLE_REQUEST_ICON_REQUEST:
401 icon_stock = PIDGIN_STOCK_DIALOG_QUESTION;
402 break;
403 case PURPLE_REQUEST_ICON_DIALOG:
404 case PURPLE_REQUEST_ICON_INFO:
405 icon_stock = PIDGIN_STOCK_DIALOG_INFO;
406 break;
407 case PURPLE_REQUEST_ICON_WARNING:
408 icon_stock = PIDGIN_STOCK_DIALOG_WARNING;
409 break;
410 case PURPLE_REQUEST_ICON_ERROR:
411 icon_stock = PIDGIN_STOCK_DIALOG_ERROR;
412 break;
413 /* intentionally no default value */
414 }
415
416 img = gtk_image_new_from_stock(icon_stock,
417 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE));
418
419 if (img || icon_type == PURPLE_REQUEST_ICON_REQUEST)
420 return img;
421
422 return gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION,
423 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE));
424 }
425
312 static void * 426 static void *
313 pidgin_request_input(const char *title, const char *primary, 427 pidgin_request_input(const char *title, const char *primary,
314 const char *secondary, const char *default_value, 428 const char *secondary, const char *default_value,
315 gboolean multiline, gboolean masked, gchar *hint, 429 gboolean multiline, gboolean masked, gchar *hint,
316 const char *ok_text, GCallback ok_cb, 430 const char *ok_text, GCallback ok_cb,
317 const char *cancel_text, GCallback cancel_cb, 431 const char *cancel_text, GCallback cancel_cb,
318 PurpleAccount *account, const char *who, PurpleConversation *conv, 432 PurpleRequestCommonParameters *cpar,
319 void *user_data) 433 void *user_data)
320 { 434 {
321 PidginRequestData *data; 435 PidginRequestData *data;
322 GtkWidget *dialog; 436 GtkWidget *dialog;
323 GtkWidget *vbox; 437 GtkWidget *vbox;
363 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); 477 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
364 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), 478 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
365 hbox); 479 hbox);
366 480
367 /* Dialog icon. */ 481 /* Dialog icon. */
368 img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION, 482 img = pidgin_request_dialog_icon(cpar);
369 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE));
370 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); 483 gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
371 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); 484 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
372 485
373 /* Vertical box */ 486 /* Vertical box */
374 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); 487 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER);
375 488
376 gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); 489 gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
377 490
378 pidgin_widget_decorate_account(hbox, account); 491 pidgin_widget_decorate_account(hbox, purple_request_cpar_get_account(cpar));
379 492
380 /* Descriptive label */ 493 /* Descriptive label */
381 primary_esc = (primary != NULL) ? g_markup_escape_text(primary, -1) : NULL; 494 primary_esc = pidgin_request_escape(cpar, primary);
382 secondary_esc = (secondary != NULL) ? g_markup_escape_text(secondary, -1) : NULL; 495 secondary_esc = pidgin_request_escape(cpar, secondary);
383 label_text = g_strdup_printf((primary ? "<span weight=\"bold\" size=\"larger\">" 496 label_text = g_strdup_printf((primary ? "<span weight=\"bold\" size=\"larger\">"
384 "%s</span>%s%s" : "%s%s%s"), 497 "%s</span>%s%s" : "%s%s%s"),
385 (primary ? primary_esc : ""), 498 (primary ? primary_esc : ""),
386 ((primary && secondary) ? "\n\n" : ""), 499 ((primary && secondary) ? "\n\n" : ""),
387 (secondary ? secondary_esc : "")); 500 (secondary ? secondary_esc : ""));
466 return data; 579 return data;
467 } 580 }
468 581
469 static void * 582 static void *
470 pidgin_request_choice(const char *title, const char *primary, 583 pidgin_request_choice(const char *title, const char *primary,
471 const char *secondary, int default_value, 584 const char *secondary, gpointer default_value, const char *ok_text,
472 const char *ok_text, GCallback ok_cb, 585 GCallback ok_cb, const char *cancel_text, GCallback cancel_cb,
473 const char *cancel_text, GCallback cancel_cb, 586 PurpleRequestCommonParameters *cpar, void *user_data, va_list args)
474 PurpleAccount *account, const char *who, PurpleConversation *conv,
475 void *user_data, va_list args)
476 { 587 {
477 PidginRequestData *data; 588 PidginRequestData *data;
478 GtkWidget *dialog; 589 GtkWidget *dialog;
479 GtkWidget *vbox, *vbox2; 590 GtkWidget *vbox, *vbox2;
480 GtkWidget *hbox; 591 GtkWidget *hbox;
524 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); 635 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
525 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), 636 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
526 hbox); 637 hbox);
527 638
528 /* Dialog icon. */ 639 /* Dialog icon. */
529 img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION, 640 img = pidgin_request_dialog_icon(cpar);
530 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE));
531 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); 641 gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
532 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); 642 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
533 643
534 pidgin_widget_decorate_account(hbox, account); 644 pidgin_widget_decorate_account(hbox, purple_request_cpar_get_account(cpar));
535 645
536 /* Vertical box */ 646 /* Vertical box */
537 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); 647 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER);
538 gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); 648 gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
539 649
540 /* Descriptive label */ 650 /* Descriptive label */
541 primary_esc = (primary != NULL) ? g_markup_escape_text(primary, -1) : NULL; 651 primary_esc = pidgin_request_escape(cpar, primary);
542 secondary_esc = (secondary != NULL) ? g_markup_escape_text(secondary, -1) : NULL; 652 secondary_esc = pidgin_request_escape(cpar, secondary);
543 label_text = g_strdup_printf((primary ? "<span weight=\"bold\" size=\"larger\">" 653 label_text = g_strdup_printf((primary ? "<span weight=\"bold\" size=\"larger\">"
544 "%s</span>%s%s" : "%s%s%s"), 654 "%s</span>%s%s" : "%s%s%s"),
545 (primary ? primary_esc : ""), 655 (primary ? primary_esc : ""),
546 ((primary && secondary) ? "\n\n" : ""), 656 ((primary && secondary) ? "\n\n" : ""),
547 (secondary ? secondary_esc : "")); 657 (secondary ? secondary_esc : ""));
558 g_free(label_text); 668 g_free(label_text);
559 669
560 vbox2 = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 670 vbox2 = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
561 gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, FALSE, 0); 671 gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, FALSE, 0);
562 while ((radio_text = va_arg(args, char*))) { 672 while ((radio_text = va_arg(args, char*))) {
563 int resp = va_arg(args, int); 673 gpointer resp = va_arg(args, gpointer);
564 radio = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio), radio_text); 674 radio = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(radio), radio_text);
565 gtk_box_pack_start(GTK_BOX(vbox2), radio, FALSE, FALSE, 0); 675 gtk_box_pack_start(GTK_BOX(vbox2), radio, FALSE, FALSE, 0);
566 g_object_set_data(G_OBJECT(radio), "choice_id", GINT_TO_POINTER(resp)); 676 g_object_set_data(G_OBJECT(radio), "choice_value", resp);
567 if (resp == default_value) 677 if (resp == default_value)
568 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE); 678 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE);
569 } 679 }
570 680
571 g_object_set_data(G_OBJECT(dialog), "radio", radio); 681 g_object_set_data(G_OBJECT(dialog), "radio", radio);
577 687
578 return data; 688 return data;
579 } 689 }
580 690
581 static void * 691 static void *
582 pidgin_request_action_with_icon(const char *title, const char *primary, 692 pidgin_request_action(const char *title, const char *primary,
583 const char *secondary, int default_action, 693 const char *secondary, int default_action,
584 PurpleAccount *account, const char *who, 694 PurpleRequestCommonParameters *cpar, void *user_data,
585 PurpleConversation *conv, gconstpointer icon_data, 695 size_t action_count, va_list actions)
586 gsize icon_size,
587 void *user_data, size_t action_count, va_list actions)
588 { 696 {
589 PidginRequestData *data; 697 PidginRequestData *data;
590 GtkWidget *dialog; 698 GtkWidget *dialog;
591 GtkWidget *vbox; 699 GtkWidget *vbox;
592 GtkWidget *hbox; 700 GtkWidget *hbox;
647 /* Setup the main horizontal box */ 755 /* Setup the main horizontal box */
648 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); 756 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
649 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), 757 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
650 hbox); 758 hbox);
651 759
652 /* Dialog icon. */ 760 img = pidgin_request_dialog_icon(cpar);
653 if (icon_data) {
654 GdkPixbuf *pixbuf = pidgin_pixbuf_from_data(icon_data, icon_size);
655 if (pixbuf) {
656 /* scale the image if it is too large */
657 int width = gdk_pixbuf_get_width(pixbuf);
658 int height = gdk_pixbuf_get_height(pixbuf);
659 if (width > 128 || height > 128) {
660 int scaled_width = width > height ? 128 : (128 * width) / height;
661 int scaled_height = height > width ? 128 : (128 * height) / width;
662 GdkPixbuf *scaled =
663 gdk_pixbuf_scale_simple(pixbuf, scaled_width, scaled_height,
664 GDK_INTERP_BILINEAR);
665
666 purple_debug_info("pidgin",
667 "dialog icon was too large, scaled it down\n");
668 if (scaled) {
669 g_object_unref(pixbuf);
670 pixbuf = scaled;
671 }
672 }
673 img = gtk_image_new_from_pixbuf(pixbuf);
674 g_object_unref(pixbuf);
675 } else {
676 purple_debug_info("pidgin", "failed to parse dialog icon\n");
677 }
678 }
679
680 if (!img) {
681 img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION,
682 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE));
683 }
684 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); 761 gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
685 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); 762 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
686 763
687 /* Vertical box */ 764 /* Vertical box */
688 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); 765 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER);
689 gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); 766 gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
690 767
691 pidgin_widget_decorate_account(hbox, account); 768 pidgin_widget_decorate_account(hbox,
769 purple_request_cpar_get_account(cpar));
692 770
693 /* Descriptive label */ 771 /* Descriptive label */
694 primary_esc = (primary != NULL) ? g_markup_escape_text(primary, -1) : NULL; 772 primary_esc = pidgin_request_escape(cpar, primary);
695 secondary_esc = (secondary != NULL) ? g_markup_escape_text(secondary, -1) : NULL; 773 secondary_esc = pidgin_request_escape(cpar, secondary);
696 label_text = g_strdup_printf((primary ? "<span weight=\"bold\" size=\"larger\">" 774 label_text = g_strdup_printf((primary ? "<span weight=\"bold\" size=\"larger\">"
697 "%s</span>%s%s" : "%s%s%s"), 775 "%s</span>%s%s" : "%s%s%s"),
698 (primary ? primary_esc : ""), 776 (primary ? primary_esc : ""),
699 ((primary && secondary) ? "\n\n" : ""), 777 ((primary && secondary) ? "\n\n" : ""),
700 (secondary ? secondary_esc : "")); 778 (secondary ? secondary_esc : ""));
728 pidgin_auto_parent_window(dialog); 806 pidgin_auto_parent_window(dialog);
729 807
730 gtk_widget_show_all(dialog); 808 gtk_widget_show_all(dialog);
731 809
732 return data; 810 return data;
733 }
734
735 static void *
736 pidgin_request_action(const char *title, const char *primary,
737 const char *secondary, int default_action,
738 PurpleAccount *account, const char *who, PurpleConversation *conv,
739 void *user_data, size_t action_count, va_list actions)
740 {
741 return pidgin_request_action_with_icon(title, primary, secondary,
742 default_action, account, who, conv, NULL, 0, user_data, action_count,
743 actions);
744 } 811 }
745 812
746 static void 813 static void
747 req_entry_field_changed_cb(GtkWidget *entry, PurpleRequestField *field) 814 req_entry_field_changed_cb(GtkWidget *entry, PurpleRequestField *field)
748 { 815 {
953 1020
954 static GtkWidget * 1021 static GtkWidget *
955 create_choice_field(PurpleRequestField *field) 1022 create_choice_field(PurpleRequestField *field)
956 { 1023 {
957 GtkWidget *widget; 1024 GtkWidget *widget;
958 GList *labels = purple_request_field_choice_get_labels(field); 1025 GList *elements = purple_request_field_choice_get_elements(field);
959 int num_labels = g_list_length(labels); 1026 int num_labels = g_list_length(elements) / 2;
960 GList *l; 1027 GList *l;
961 1028 gpointer *values = g_new(gpointer, num_labels);
1029 gpointer default_value;
1030 int i, default_index = -1;
1031
1032 default_value = purple_request_field_choice_get_default_value(field);
962 if (num_labels > 5) 1033 if (num_labels > 5)
963 { 1034 {
964 widget = gtk_combo_box_text_new(); 1035 widget = gtk_combo_box_text_new();
965 1036
966 for (l = labels; l != NULL; l = l->next) 1037 i = 0;
1038 l = elements;
1039 while (l != NULL)
967 { 1040 {
968 const char *text = l->data; 1041 const char *text;
1042 gpointer *value;
1043
1044 text = l->data;
1045 l = g_list_next(l);
1046 value = l->data;
1047 l = g_list_next(l);
1048
969 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget), text); 1049 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget), text);
1050 if (value == default_value)
1051 default_index = i;
1052 values[i++] = value;
970 } 1053 }
971 1054
972 gtk_combo_box_set_active(GTK_COMBO_BOX(widget), 1055 gtk_combo_box_set_active(GTK_COMBO_BOX(widget), default_index);
973 purple_request_field_choice_get_default_value(field));
974 1056
975 gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field)); 1057 gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field));
976 1058
977 g_signal_connect(G_OBJECT(widget), "changed", 1059 g_signal_connect(G_OBJECT(widget), "changed",
978 G_CALLBACK(field_choice_menu_cb), field); 1060 G_CALLBACK(field_choice_menu_cb), field);
980 else 1062 else
981 { 1063 {
982 GtkWidget *box; 1064 GtkWidget *box;
983 GtkWidget *first_radio = NULL; 1065 GtkWidget *first_radio = NULL;
984 GtkWidget *radio; 1066 GtkWidget *radio;
985 gint i;
986 1067
987 if (num_labels == 2) 1068 if (num_labels == 2)
988 box = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE); 1069 box = gtk_hbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
989 else 1070 else
990 box = gtk_vbox_new(FALSE, 0); 1071 box = gtk_vbox_new(FALSE, 0);
991 1072
992 widget = box; 1073 widget = box;
993 1074
994 gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field)); 1075 gtk_widget_set_tooltip_text(widget, purple_request_field_get_tooltip(field));
995 1076
996 for (l = labels, i = 0; l != NULL; l = l->next, i++) 1077 i = 0;
1078 l = elements;
1079 while (l != NULL)
997 { 1080 {
998 const char *text = l->data; 1081 const char *text;
1082 gpointer *value;
1083
1084 text = l->data;
1085 l = g_list_next(l);
1086 value = l->data;
1087 l = g_list_next(l);
999 1088
1000 radio = gtk_radio_button_new_with_label_from_widget( 1089 radio = gtk_radio_button_new_with_label_from_widget(
1001 GTK_RADIO_BUTTON(first_radio), text); 1090 GTK_RADIO_BUTTON(first_radio), text);
1091 g_object_set_data(G_OBJECT(radio), "box", box);
1002 1092
1003 if (first_radio == NULL) 1093 if (first_radio == NULL)
1004 first_radio = radio; 1094 first_radio = radio;
1005 1095
1006 if (i == purple_request_field_choice_get_default_value(field)) 1096 if (value == default_value)
1007 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE); 1097 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE);
1098 values[i++] = value;
1008 1099
1009 gtk_box_pack_start(GTK_BOX(box), radio, TRUE, TRUE, 0); 1100 gtk_box_pack_start(GTK_BOX(box), radio, TRUE, TRUE, 0);
1010 gtk_widget_show(radio); 1101 gtk_widget_show(radio);
1011 1102
1012 g_signal_connect(G_OBJECT(radio), "toggled", 1103 g_signal_connect(G_OBJECT(radio), "toggled",
1013 G_CALLBACK(field_choice_option_cb), field); 1104 G_CALLBACK(field_choice_option_cb), field);
1014 } 1105 }
1015 } 1106 }
1107
1108 g_object_set_data_full(G_OBJECT(widget), "values", values, g_free);
1016 1109
1017 return widget; 1110 return widget;
1018 } 1111 }
1019 1112
1020 static GtkWidget * 1113 static GtkWidget *
1219 #endif 1312 #endif
1220 } 1313 }
1221 1314
1222 static void * 1315 static void *
1223 pidgin_request_fields(const char *title, const char *primary, 1316 pidgin_request_fields(const char *title, const char *primary,
1224 const char *secondary, PurpleRequestFields *fields, 1317 const char *secondary, PurpleRequestFields *fields, const char *ok_text,
1225 const char *ok_text, GCallback ok_cb, 1318 GCallback ok_cb, const char *cancel_text, GCallback cancel_cb,
1226 const char *cancel_text, GCallback cancel_cb, 1319 PurpleRequestCommonParameters *cpar, void *user_data)
1227 PurpleAccount *account, const char *who, PurpleConversation *conv,
1228 void *user_data)
1229 { 1320 {
1230 PidginRequestData *data; 1321 PidginRequestData *data;
1231 GtkWidget *win; 1322 GtkWidget *win;
1232 GtkWidget *vbox; 1323 GtkWidget *vbox;
1233 GtkWidget *vbox2; 1324 GtkWidget *vbox2;
1272 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); 1363 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
1273 gtk_container_add(GTK_CONTAINER(pidgin_dialog_get_vbox(GTK_DIALOG(win))), hbox); 1364 gtk_container_add(GTK_CONTAINER(pidgin_dialog_get_vbox(GTK_DIALOG(win))), hbox);
1274 gtk_widget_show(hbox); 1365 gtk_widget_show(hbox);
1275 1366
1276 /* Dialog icon. */ 1367 /* Dialog icon. */
1277 img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION, 1368 img = pidgin_request_dialog_icon(cpar);
1278 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE));
1279 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); 1369 gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
1280 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); 1370 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
1281 gtk_widget_show(img); 1371 gtk_widget_show(img);
1282 1372
1283 /* Cancel button */ 1373 /* Cancel button */
1288 button = pidgin_dialog_add_button(GTK_DIALOG(win), text_to_stock(ok_text), G_CALLBACK(multifield_ok_cb), data); 1378 button = pidgin_dialog_add_button(GTK_DIALOG(win), text_to_stock(ok_text), G_CALLBACK(multifield_ok_cb), data);
1289 data->ok_button = button; 1379 data->ok_button = button;
1290 gtk_widget_set_can_default(button, TRUE); 1380 gtk_widget_set_can_default(button, TRUE);
1291 gtk_window_set_default(GTK_WINDOW(win), button); 1381 gtk_window_set_default(GTK_WINDOW(win), button);
1292 1382
1293 pidgin_widget_decorate_account(hbox, account); 1383 pidgin_widget_decorate_account(hbox,
1384 purple_request_cpar_get_account(cpar));
1294 1385
1295 /* Setup the vbox */ 1386 /* Setup the vbox */
1296 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); 1387 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER);
1297 gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); 1388 gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
1298 gtk_widget_show(vbox); 1389 gtk_widget_show(vbox);
1299 1390
1300 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); 1391 sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
1301 1392
1302 if(primary) { 1393 if(primary) {
1303 primary_esc = g_markup_escape_text(primary, -1); 1394 primary_esc = pidgin_request_escape(cpar, primary);
1304 label_text = g_strdup_printf( 1395 label_text = g_strdup_printf(
1305 "<span weight=\"bold\" size=\"larger\">%s</span>", primary_esc); 1396 "<span weight=\"bold\" size=\"larger\">%s</span>", primary_esc);
1306 g_free(primary_esc); 1397 g_free(primary_esc);
1307 label = gtk_label_new(NULL); 1398 label = gtk_label_new(NULL);
1308 1399
1339 } else { 1430 } else {
1340 vbox2 = vbox; 1431 vbox2 = vbox;
1341 } 1432 }
1342 1433
1343 if (secondary) { 1434 if (secondary) {
1344 secondary_esc = g_markup_escape_text(secondary, -1); 1435 secondary_esc = pidgin_request_escape(cpar, secondary);
1345 label = gtk_label_new(NULL); 1436 label = gtk_label_new(NULL);
1346 1437
1347 gtk_label_set_markup(GTK_LABEL(label), secondary_esc); 1438 gtk_label_set_markup(GTK_LABEL(label), secondary_esc);
1348 g_free(secondary_esc); 1439 g_free(secondary_esc);
1349 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); 1440 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
1616 } 1707 }
1617 if ((data->u.file.savedialog == TRUE) && 1708 if ((data->u.file.savedialog == TRUE) &&
1618 (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) { 1709 (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) {
1619 purple_request_action(data, NULL, _("That file already exists"), 1710 purple_request_action(data, NULL, _("That file already exists"),
1620 _("Would you like to overwrite it?"), 0, 1711 _("Would you like to overwrite it?"), 0,
1621 NULL, NULL, NULL, 1712 NULL,
1622 data, 2, 1713 data, 2,
1623 _("Overwrite"), G_CALLBACK(file_yes_no_cb), 1714 _("Overwrite"), G_CALLBACK(file_yes_no_cb),
1624 _("Choose New Name"), G_CALLBACK(file_yes_no_cb)); 1715 _("Choose New Name"), G_CALLBACK(file_yes_no_cb));
1625 } else 1716 } else
1626 file_yes_no_cb(data, 1); 1717 file_yes_no_cb(data, 1);
1627 } 1718 }
1628 1719
1629 static void * 1720 static void *
1630 pidgin_request_file(const char *title, const char *filename, 1721 pidgin_request_file(const char *title, const char *filename,
1631 gboolean savedialog, 1722 gboolean savedialog, GCallback ok_cb, GCallback cancel_cb,
1632 GCallback ok_cb, GCallback cancel_cb, 1723 PurpleRequestCommonParameters *cpar, void *user_data)
1633 PurpleAccount *account, const char *who, PurpleConversation *conv,
1634 void *user_data)
1635 { 1724 {
1636 PidginRequestData *data; 1725 PidginRequestData *data;
1637 GtkWidget *filesel; 1726 GtkWidget *filesel;
1638 #ifdef _WIN32 1727 #ifdef _WIN32
1639 const gchar *current_folder; 1728 const gchar *current_folder;
1704 1793
1705 return (void *)data; 1794 return (void *)data;
1706 } 1795 }
1707 1796
1708 static void * 1797 static void *
1709 pidgin_request_folder(const char *title, const char *dirname, 1798 pidgin_request_folder(const char *title, const char *dirname, GCallback ok_cb,
1710 GCallback ok_cb, GCallback cancel_cb, 1799 GCallback cancel_cb, PurpleRequestCommonParameters *cpar,
1711 PurpleAccount *account, const char *who, PurpleConversation *conv, 1800 void *user_data)
1712 void *user_data)
1713 { 1801 {
1714 PidginRequestData *data; 1802 PidginRequestData *data;
1715 GtkWidget *dirsel; 1803 GtkWidget *dirsel;
1716 1804
1717 data = g_new0(PidginRequestData, 1); 1805 data = g_new0(PidginRequestData, 1);
1788 g_free(data); 1876 g_free(data);
1789 } 1877 }
1790 1878
1791 static PurpleRequestUiOps ops = 1879 static PurpleRequestUiOps ops =
1792 { 1880 {
1881 PURPLE_REQUEST_FEATURE_HTML,
1793 pidgin_request_input, 1882 pidgin_request_input,
1794 pidgin_request_choice, 1883 pidgin_request_choice,
1795 pidgin_request_action, 1884 pidgin_request_action,
1796 pidgin_request_fields, 1885 pidgin_request_fields,
1797 pidgin_request_file, 1886 pidgin_request_file,
1798 pidgin_close_request, 1887 pidgin_close_request,
1799 pidgin_request_folder, 1888 pidgin_request_folder,
1800 pidgin_request_action_with_icon, 1889 NULL,
1801 NULL, 1890 NULL,
1802 NULL, 1891 NULL,
1803 NULL 1892 NULL
1804 }; 1893 };
1805 1894

mercurial