pidgin/gtkrequest.c

changeset 42977
72fd5614ea76
parent 42976
93f48383ac8c
child 42979
d9f973ac3afd
equal deleted inserted replaced
42976:93f48383ac8c 42977:72fd5614ea76
37 37
38 gpointer user_data; 38 gpointer user_data;
39 GtkWidget *dialog; 39 GtkWidget *dialog;
40 GCancellable *cancellable; 40 GCancellable *cancellable;
41 41
42 GtkWidget *ok_button;
43
44 PurpleRequestHelpCb help_cb; 42 PurpleRequestHelpCb help_cb;
45 gpointer help_data; 43 gpointer help_data;
46 44
47 size_t cb_count; 45 GPtrArray *action_widgets;
48 GCallback *cbs; 46 GPtrArray *action_cbs;
49 } PidginRequestData; 47 } PidginRequestData;
50 48
51 static void 49 static void
52 pidgin_widget_decorate_account(GtkWidget *cont, PurpleAccount *account) 50 pidgin_widget_decorate_account(GtkWidget *cont, PurpleAccount *account)
53 { 51 {
91 PURPLE_REQUEST_FIELD_ACCOUNT(field), 89 PURPLE_REQUEST_FIELD_ACCOUNT(field),
92 pidgin_account_row_get_account(row)); 90 pidgin_account_row_get_account(row));
93 } 91 }
94 92
95 static void 93 static void
96 multifield_response_cb(G_GNUC_UNUSED GtkDialog *dialog, gint response, 94 multifield_response_cb(GtkButton *button, gpointer data) {
97 gpointer data)
98 {
99 PidginRequestData *req_data = data; 95 PidginRequestData *req_data = data;
100 PurpleRequestFieldsCb cb = NULL; 96 PurpleRequestFieldsCb cb = NULL;
97 guint index = 0;
101 98
102 gtk_widget_set_visible(GTK_WIDGET(req_data->dialog), FALSE); 99 gtk_widget_set_visible(GTK_WIDGET(req_data->dialog), FALSE);
103 100
104 if(response == GTK_RESPONSE_OK) { 101 if (g_ptr_array_find(req_data->action_widgets, button, &index)) {
105 cb = (PurpleRequestFieldsCb)req_data->cbs[0]; 102 cb = g_ptr_array_index(req_data->action_cbs, index);
106 } else if(response == GTK_RESPONSE_CANCEL ||
107 response == GTK_RESPONSE_DELETE_EVENT)
108 {
109 cb = (PurpleRequestFieldsCb)req_data->cbs[1];
110 } else if(2 <= response && (gsize)response < req_data->cb_count) {
111 cb = (PurpleRequestFieldsCb)req_data->cbs[response];
112 } 103 }
113 104
114 if(cb != NULL) { 105 if(cb != NULL) {
115 cb(req_data->user_data, req_data->page); 106 cb(req_data->user_data, req_data->page);
116 } 107 }
225 g_return_if_fail(req_data->help_cb != NULL); 216 g_return_if_fail(req_data->help_cb != NULL);
226 req_data->help_cb(req_data->help_data); 217 req_data->help_cb(req_data->help_data);
227 } 218 }
228 219
229 static void 220 static void
230 pidgin_request_add_help(PidginRequestData *req_data, 221 pidgin_request_add_help(PidginRequestData *req_data, GtkWidget *cbox,
231 PurpleRequestCommonParameters *cpar) 222 PurpleRequestCommonParameters *cpar)
232 { 223 {
233 GtkWidget *button; 224 GtkWidget *button;
234 PurpleRequestHelpCb help_cb; 225 PurpleRequestHelpCb help_cb;
235 gpointer help_data; 226 gpointer help_data;
237 help_cb = purple_request_cpar_get_help_cb(cpar, &help_data); 228 help_cb = purple_request_cpar_get_help_cb(cpar, &help_data);
238 if (help_cb == NULL) { 229 if (help_cb == NULL) {
239 return; 230 return;
240 } 231 }
241 232
242 button = gtk_dialog_add_button(GTK_DIALOG(req_data->dialog), 233 button = gtk_button_new_with_mnemonic(_("_Help"));
243 _("_Help"), GTK_RESPONSE_HELP); 234 gtk_center_box_set_start_widget(GTK_CENTER_BOX(cbox), button);
244 235
245 req_data->help_cb = help_cb; 236 req_data->help_cb = help_cb;
246 req_data->help_data = help_data; 237 req_data->help_data = help_data;
247 238
248 g_signal_connect(G_OBJECT(button), "clicked", 239 g_signal_connect(G_OBJECT(button), "clicked",
719 GCallback ok_cb, const char *cancel_text, GCallback cancel_cb, 710 GCallback ok_cb, const char *cancel_text, GCallback cancel_cb,
720 PurpleRequestCommonParameters *cpar, void *user_data) 711 PurpleRequestCommonParameters *cpar, void *user_data)
721 { 712 {
722 PidginRequestData *data; 713 PidginRequestData *data;
723 GtkWidget *win; 714 GtkWidget *win;
715 GtkWidget *content = NULL;
716 GtkWidget *cbox = NULL;
717 GtkWidget *action_area = NULL;
718 GtkWidget *button = NULL;
719 GtkWidget *ok_button = NULL;
724 GtkWidget *page_widget = NULL; 720 GtkWidget *page_widget = NULL;
725 AdwPreferencesGroup *group_widget = NULL; 721 AdwPreferencesGroup *group_widget = NULL;
726 GtkWidget *vbox = NULL; 722 GtkWidget *vbox = NULL;
727 GtkWidget *img; 723 GtkWidget *img;
728 GtkWidget *content;
729 GSList *extra_actions; 724 GSList *extra_actions;
730 gint response;
731 guint n_groups; 725 guint n_groups;
732 726
733 data = g_new0(PidginRequestData, 1); 727 data = g_new0(PidginRequestData, 1);
734 data->type = PURPLE_REQUEST_FIELDS; 728 data->type = PURPLE_REQUEST_FIELDS;
735 data->user_data = user_data; 729 data->user_data = user_data;
736 data->page = page; 730 data->page = page;
737 731
738 data->dialog = win = gtk_dialog_new(); 732 data->dialog = win = gtk_window_new();
739 if(title != NULL) { 733 if(title != NULL) {
740 gtk_window_set_title(GTK_WINDOW(win), title); 734 gtk_window_set_title(GTK_WINDOW(win), title);
741 } else { 735 } else {
742 gtk_window_set_title(GTK_WINDOW(win), PIDGIN_ALERT_TITLE); 736 gtk_window_set_title(GTK_WINDOW(win), PIDGIN_ALERT_TITLE);
743 } 737 }
744 gtk_window_set_resizable(GTK_WINDOW(win), TRUE); 738 gtk_window_set_resizable(GTK_WINDOW(win), TRUE);
745 gtk_window_set_default_size(GTK_WINDOW(win), 480, -1); 739 gtk_window_set_default_size(GTK_WINDOW(win), 480, -1);
746 740
747 content = gtk_dialog_get_content_area(GTK_DIALOG(win)); 741 content = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6);
742 gtk_window_set_child(GTK_WINDOW(win), content);
743
748 page_widget = adw_preferences_page_new(); 744 page_widget = adw_preferences_page_new();
749 gtk_widget_set_vexpand(page_widget, TRUE); 745 gtk_widget_set_vexpand(page_widget, TRUE);
750 gtk_box_append(GTK_BOX(content), page_widget); 746 gtk_box_append(GTK_BOX(content), page_widget);
751 747
752 /* Setup the general info box. */ 748 /* Setup the general info box. */
764 gtk_box_append(GTK_BOX(vbox), img); 760 gtk_box_append(GTK_BOX(vbox), img);
765 761
766 pidgin_widget_decorate_account(vbox, 762 pidgin_widget_decorate_account(vbox,
767 purple_request_cpar_get_account(cpar)); 763 purple_request_cpar_get_account(cpar));
768 764
769 pidgin_request_add_help(data, cpar); 765 cbox = gtk_center_box_new();
766 gtk_orientable_set_orientation(GTK_ORIENTABLE(cbox),
767 GTK_ORIENTATION_HORIZONTAL);
768 gtk_widget_set_margin_start(cbox, 6);
769 gtk_widget_set_margin_end(cbox, 6);
770 gtk_widget_set_margin_top(cbox, 6);
771 gtk_widget_set_margin_bottom(cbox, 6);
772 gtk_box_append(GTK_BOX(content), cbox);
773 action_area = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
774 gtk_widget_set_halign(action_area, GTK_ALIGN_END);
775 gtk_center_box_set_end_widget(GTK_CENTER_BOX(cbox), action_area);
776
777 pidgin_request_add_help(data, cbox, cpar);
770 778
771 /* Add responses and callbacks. */ 779 /* Add responses and callbacks. */
772 g_signal_connect(data->dialog, "response",
773 G_CALLBACK(multifield_response_cb), data);
774 extra_actions = purple_request_cpar_get_extra_actions(cpar); 780 extra_actions = purple_request_cpar_get_extra_actions(cpar);
775 data->cb_count = 2 + g_slist_length(extra_actions); 781 data->action_widgets = g_ptr_array_sized_new(2 + g_slist_length(extra_actions));
776 data->cbs = g_new0(GCallback, data->cb_count); 782 data->action_cbs = g_ptr_array_sized_new(2 + g_slist_length(extra_actions));
777 783
778 data->cbs[0] = ok_cb;
779 data->cbs[1] = cancel_cb;
780
781 response = 2; /* So that response == data->cbs index. */
782 for(; extra_actions != NULL; extra_actions = extra_actions->next) { 784 for(; extra_actions != NULL; extra_actions = extra_actions->next) {
783 PurpleKeyValuePair *extra_action = extra_actions->data; 785 PurpleKeyValuePair *extra_action = extra_actions->data;
784 786
785 gtk_dialog_add_button(GTK_DIALOG(win), extra_action->key, response); 787 button = gtk_button_new_with_label(extra_action->key);
786 data->cbs[response] = extra_action->value; 788 g_signal_connect(button, "clicked", G_CALLBACK(multifield_response_cb),
787 response++; 789 data);
790 gtk_box_append(GTK_BOX(action_area), button);
791 g_ptr_array_add(data->action_widgets, button);
792 g_ptr_array_add(data->action_cbs, extra_action->value);
788 } 793 }
789 794
790 /* Cancel button */ 795 /* Cancel button */
791 gtk_dialog_add_button(GTK_DIALOG(win), cancel_text, GTK_RESPONSE_CANCEL); 796 button = gtk_button_new_with_label(cancel_text);
792 response = GTK_RESPONSE_CANCEL; 797 g_signal_connect(button, "clicked", G_CALLBACK(multifield_response_cb),
798 data);
799 gtk_box_append(GTK_BOX(action_area), button);
800 gtk_window_set_default_widget(GTK_WINDOW(win), button);
801 g_ptr_array_add(data->action_widgets, button);
802 g_ptr_array_add(data->action_cbs, cancel_cb);
793 803
794 /* OK button */ 804 /* OK button */
795 if(ok_text != NULL) { 805 if(ok_text != NULL) {
796 data->ok_button = gtk_dialog_add_button(GTK_DIALOG(win), ok_text, 806 ok_button = gtk_button_new_with_label(ok_text);
797 GTK_RESPONSE_OK); 807 g_signal_connect(ok_button, "clicked",
798 response = GTK_RESPONSE_OK; 808 G_CALLBACK(multifield_response_cb), data);
799 } 809 gtk_box_append(GTK_BOX(action_area), ok_button);
800 gtk_dialog_set_default_response(GTK_DIALOG(win), response); 810 gtk_window_set_default_widget(GTK_WINDOW(win), ok_button);
811 g_ptr_array_add(data->action_widgets, ok_button);
812 g_ptr_array_add(data->action_cbs, ok_cb);
813 }
801 814
802 if(primary != NULL) { 815 if(primary != NULL) {
803 GtkWidget *label = gtk_label_new(primary); 816 GtkWidget *label = gtk_label_new(primary);
804 gtk_label_set_wrap(GTK_LABEL(label), TRUE); 817 gtk_label_set_wrap(GTK_LABEL(label), TRUE);
805 gtk_widget_add_css_class(label, "title-1"); 818 gtk_widget_add_css_class(label, "title-1");
909 (GDestroyNotify)purple_key_value_pair_free); 922 (GDestroyNotify)purple_key_value_pair_free);
910 923
911 g_object_unref(group); 924 g_object_unref(group);
912 } 925 }
913 926
914 g_object_bind_property(page, "valid", data->ok_button, "sensitive", 0); 927 if(ok_button != NULL) {
928 g_object_bind_property(page, "valid", ok_button, "sensitive", 0);
929 }
915 930
916 gtk_widget_set_visible(win, TRUE); 931 gtk_widget_set_visible(win, TRUE);
917 932
918 return data; 933 return data;
934 }
935
936 static void
937 pidgin_request_close_request(PurpleRequestType type, gpointer ui_handle) {
938 PidginRequestData *data = ui_handle;
939
940 if(type != PURPLE_REQUEST_FIELDS) {
941 /* This shouldn't happen as we don't support creating any others. */
942 return;
943 }
944
945 g_ptr_array_free(data->action_widgets, TRUE);
946 g_ptr_array_free(data->action_cbs, TRUE);
947 gtk_window_destroy(GTK_WINDOW(data->dialog));
948 g_free(data);
919 } 949 }
920 950
921 GtkWindow * 951 GtkWindow *
922 pidgin_request_get_dialog_window(void *ui_handle) 952 pidgin_request_get_dialog_window(void *ui_handle)
923 { 953 {
936 return GTK_WINDOW(data->dialog); 966 return GTK_WINDOW(data->dialog);
937 } 967 }
938 968
939 static PurpleRequestUiOps ops = { 969 static PurpleRequestUiOps ops = {
940 .request_fields = pidgin_request_fields, 970 .request_fields = pidgin_request_fields,
971 .close_request = pidgin_request_close_request,
941 }; 972 };
942 973
943 PurpleRequestUiOps * 974 PurpleRequestUiOps *
944 pidgin_request_get_ui_ops(void) 975 pidgin_request_get_ui_ops(void)
945 { 976 {

mercurial