pidgin/gtkrequest.c

branch
soc.2013.gobjectification.plugins
changeset 36766
d7628b96df7e
parent 36762
e83ad7c340e7
parent 34953
14109bfbe008
child 36783
8eadcfdb65ca
equal deleted inserted replaced
36765:19adace8b7a9 36766:d7628b96df7e
64 64
65 union 65 union
66 { 66 {
67 struct 67 struct
68 { 68 {
69 GtkProgressBar *progress_bar;
70 } wait;
71
72 struct
73 {
69 GtkWidget *entry; 74 GtkWidget *entry;
70 75
71 gboolean multiline; 76 gboolean multiline;
72 gchar *hint; 77 gchar *hint;
73 78
374 379
375 return g_markup_escape_text(text, -1); 380 return g_markup_escape_text(text, -1);
376 } 381 }
377 382
378 static GtkWidget * 383 static GtkWidget *
379 pidgin_request_dialog_icon(PurpleRequestCommonParameters *cpar) 384 pidgin_request_dialog_icon(PurpleRequestType dialog_type,
385 PurpleRequestCommonParameters *cpar)
380 { 386 {
381 GtkWidget *img = NULL; 387 GtkWidget *img = NULL;
382 PurpleRequestIconType icon_type; 388 PurpleRequestIconType icon_type;
383 gconstpointer icon_data; 389 gconstpointer icon_data;
384 gsize icon_size; 390 gsize icon_size;
425 431
426 icon_type = purple_request_cpar_get_icon(cpar); 432 icon_type = purple_request_cpar_get_icon(cpar);
427 switch (icon_type) 433 switch (icon_type)
428 { 434 {
429 case PURPLE_REQUEST_ICON_DEFAULT: 435 case PURPLE_REQUEST_ICON_DEFAULT:
436 icon_stock = NULL;
437 break;
430 case PURPLE_REQUEST_ICON_REQUEST: 438 case PURPLE_REQUEST_ICON_REQUEST:
431 icon_stock = PIDGIN_STOCK_DIALOG_QUESTION; 439 icon_stock = PIDGIN_STOCK_DIALOG_QUESTION;
432 break; 440 break;
433 case PURPLE_REQUEST_ICON_DIALOG: 441 case PURPLE_REQUEST_ICON_DIALOG:
434 case PURPLE_REQUEST_ICON_INFO: 442 case PURPLE_REQUEST_ICON_INFO:
442 icon_stock = PIDGIN_STOCK_DIALOG_ERROR; 450 icon_stock = PIDGIN_STOCK_DIALOG_ERROR;
443 break; 451 break;
444 /* intentionally no default value */ 452 /* intentionally no default value */
445 } 453 }
446 454
455 if (icon_stock == NULL) {
456 switch (dialog_type) {
457 case PURPLE_REQUEST_INPUT:
458 case PURPLE_REQUEST_CHOICE:
459 case PURPLE_REQUEST_ACTION:
460 case PURPLE_REQUEST_FIELDS:
461 case PURPLE_REQUEST_FILE:
462 case PURPLE_REQUEST_FOLDER:
463 icon_stock = PIDGIN_STOCK_DIALOG_QUESTION;
464 break;
465 case PURPLE_REQUEST_WAIT:
466 icon_stock = PIDGIN_STOCK_DIALOG_INFO;
467 break;
468 /* intentionally no default value */
469 }
470 }
471
447 img = gtk_image_new_from_stock(icon_stock, 472 img = gtk_image_new_from_stock(icon_stock,
448 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE)); 473 gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE));
449 474
450 if (img || icon_type == PURPLE_REQUEST_ICON_REQUEST) 475 if (img || icon_type == PURPLE_REQUEST_ICON_REQUEST)
451 return img; 476 return img;
542 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); 567 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
543 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), 568 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
544 hbox); 569 hbox);
545 570
546 /* Dialog icon. */ 571 /* Dialog icon. */
547 img = pidgin_request_dialog_icon(cpar); 572 img = pidgin_request_dialog_icon(PURPLE_REQUEST_INPUT, cpar);
548 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); 573 gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
549 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); 574 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
550 575
551 pidgin_request_add_help(GTK_DIALOG(dialog), cpar); 576 pidgin_request_add_help(GTK_DIALOG(dialog), cpar);
552 577
702 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); 727 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
703 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), 728 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
704 hbox); 729 hbox);
705 730
706 /* Dialog icon. */ 731 /* Dialog icon. */
707 img = pidgin_request_dialog_icon(cpar); 732 img = pidgin_request_dialog_icon(PURPLE_REQUEST_CHOICE, cpar);
708 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); 733 gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
709 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); 734 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
710 735
711 pidgin_widget_decorate_account(hbox, purple_request_cpar_get_account(cpar)); 736 pidgin_widget_decorate_account(hbox, purple_request_cpar_get_account(cpar));
712 737
824 /* Setup the main horizontal box */ 849 /* Setup the main horizontal box */
825 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); 850 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
826 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), 851 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
827 hbox); 852 hbox);
828 853
829 img = pidgin_request_dialog_icon(cpar); 854 img = pidgin_request_dialog_icon(PURPLE_REQUEST_ACTION, cpar);
830 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); 855 gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
831 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); 856 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
832 857
833 /* Vertical box */ 858 /* Vertical box */
834 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER); 859 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER);
877 pidgin_auto_parent_window(dialog); 902 pidgin_auto_parent_window(dialog);
878 903
879 gtk_widget_show_all(dialog); 904 gtk_widget_show_all(dialog);
880 905
881 return data; 906 return data;
907 }
908
909 static void
910 wait_cancel_cb(GtkWidget *button, PidginRequestData *data)
911 {
912 generic_response_start(data);
913
914 if (data->cbs[0] != NULL)
915 ((PurpleRequestCancelCb)data->cbs[0])(data->user_data);
916
917 purple_request_close(PURPLE_REQUEST_FIELDS, data);
918 }
919
920 static void *
921 pidgin_request_wait(const char *title, const char *primary,
922 const char *secondary, gboolean with_progress,
923 PurpleRequestCancelCb cancel_cb, PurpleRequestCommonParameters *cpar,
924 void *user_data)
925 {
926 PidginRequestData *data;
927 GtkWidget *dialog;
928 GtkWidget *hbox, *vbox, *img, *label, *button;
929 gchar *primary_esc, *secondary_esc, *label_text;
930
931 data = g_new0(PidginRequestData, 1);
932 data->type = PURPLE_REQUEST_WAIT;
933 data->user_data = user_data;
934
935 data->cb_count = 1;
936 data->cbs = g_new0(GCallback, 1);
937 data->cbs[0] = (GCallback)cancel_cb;
938
939 data->dialog = dialog = gtk_dialog_new();
940
941 gtk_window_set_deletable(GTK_WINDOW(data->dialog), cancel_cb != NULL);
942
943 if (title != NULL)
944 gtk_window_set_title(GTK_WINDOW(dialog), title);
945 else
946 gtk_window_set_title(GTK_WINDOW(dialog), _("Please wait"));
947
948 /* Setup the dialog */
949 gtk_container_set_border_width(GTK_CONTAINER(dialog),
950 PIDGIN_HIG_BORDER / 2);
951 gtk_container_set_border_width(GTK_CONTAINER(
952 gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
953 PIDGIN_HIG_BORDER / 2);
954 gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
955 gtk_box_set_spacing(GTK_BOX(gtk_dialog_get_content_area(
956 GTK_DIALOG(dialog))), PIDGIN_HIG_BORDER);
957
958 /* Setup the main horizontal box */
959 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
960 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(
961 GTK_DIALOG(dialog))), hbox);
962
963 img = pidgin_request_dialog_icon(PURPLE_REQUEST_WAIT, cpar);
964 gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
965 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
966
967 /* Cancel button */
968 button = pidgin_dialog_add_button(GTK_DIALOG(dialog),
969 text_to_stock(_("Cancel")), G_CALLBACK(wait_cancel_cb), data);
970 gtk_widget_set_can_default(button, FALSE);
971
972 /* Vertical box */
973 vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER);
974 gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
975
976 pidgin_widget_decorate_account(hbox,
977 purple_request_cpar_get_account(cpar));
978
979 pidgin_request_add_help(GTK_DIALOG(dialog), cpar);
980
981 /* Descriptive label */
982 primary_esc = pidgin_request_escape(cpar, primary);
983 secondary_esc = pidgin_request_escape(cpar, secondary);
984 label_text = g_strdup_printf((primary ? "<span weight=\"bold\" "
985 "size=\"larger\">%s</span>%s%s" : "%s%s%s"),
986 (primary ? primary_esc : ""),
987 ((primary && secondary) ? "\n\n" : ""),
988 (secondary ? secondary_esc : ""));
989 g_free(primary_esc);
990 g_free(secondary_esc);
991
992 label = gtk_label_new(NULL);
993
994 gtk_label_set_markup(GTK_LABEL(label), label_text);
995 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
996 gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
997 gtk_label_set_selectable(GTK_LABEL(label), FALSE);
998 gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
999
1000 g_free(label_text);
1001
1002 if (with_progress) {
1003 GtkProgressBar *bar;
1004
1005 bar = data->u.wait.progress_bar =
1006 GTK_PROGRESS_BAR(gtk_progress_bar_new());
1007 gtk_progress_bar_set_fraction(bar, 0);
1008 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(bar),
1009 FALSE, FALSE, 0);
1010 }
1011
1012 /* Move focus out of cancel button. */
1013 gtk_widget_set_can_default(img, TRUE);
1014 gtk_widget_set_can_focus(img, TRUE);
1015 gtk_widget_grab_focus(img);
1016 gtk_widget_grab_default(img);
1017
1018 /* Show everything. */
1019 pidgin_auto_parent_window(dialog);
1020
1021 gtk_widget_show_all(dialog);
1022
1023 return data;
1024 }
1025
1026 static void
1027 pidgin_request_wait_update(void *ui_handle, gboolean pulse, gfloat fraction)
1028 {
1029 GtkProgressBar *bar;
1030 PidginRequestData *data = ui_handle;
1031
1032 g_return_if_fail(data->type == PURPLE_REQUEST_WAIT);
1033
1034 bar = data->u.wait.progress_bar;
1035 if (pulse)
1036 gtk_progress_bar_pulse(bar);
1037 else
1038 gtk_progress_bar_set_fraction(bar, fraction);
882 } 1039 }
883 1040
884 static void 1041 static void
885 req_entry_field_changed_cb(GtkWidget *entry, PurpleRequestField *field) 1042 req_entry_field_changed_cb(GtkWidget *entry, PurpleRequestField *field)
886 { 1043 {
1456 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER); 1613 hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
1457 gtk_container_add(GTK_CONTAINER(pidgin_dialog_get_vbox(GTK_DIALOG(win))), hbox); 1614 gtk_container_add(GTK_CONTAINER(pidgin_dialog_get_vbox(GTK_DIALOG(win))), hbox);
1458 gtk_widget_show(hbox); 1615 gtk_widget_show(hbox);
1459 1616
1460 /* Dialog icon. */ 1617 /* Dialog icon. */
1461 img = pidgin_request_dialog_icon(cpar); 1618 img = pidgin_request_dialog_icon(PURPLE_REQUEST_FIELDS, cpar);
1462 gtk_misc_set_alignment(GTK_MISC(img), 0, 0); 1619 gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
1463 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); 1620 gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
1464 gtk_widget_show(img); 1621 gtk_widget_show(img);
1465 1622
1466 pidgin_request_add_help(GTK_DIALOG(win), cpar); 1623 pidgin_request_add_help(GTK_DIALOG(win), cpar);
2012 { 2169 {
2013 PURPLE_REQUEST_FEATURE_HTML, 2170 PURPLE_REQUEST_FEATURE_HTML,
2014 pidgin_request_input, 2171 pidgin_request_input,
2015 pidgin_request_choice, 2172 pidgin_request_choice,
2016 pidgin_request_action, 2173 pidgin_request_action,
2017 NULL, 2174 pidgin_request_wait,
2175 pidgin_request_wait_update,
2018 pidgin_request_fields, 2176 pidgin_request_fields,
2019 pidgin_request_file, 2177 pidgin_request_file,
2020 pidgin_request_folder, 2178 pidgin_request_folder,
2021 pidgin_close_request, 2179 pidgin_close_request,
2022 NULL, 2180 NULL,

mercurial