| 29 #include "pidginaccountrow.h" |
29 #include "pidginaccountrow.h" |
| 30 #include "pidgincore.h" |
30 #include "pidgincore.h" |
| 31 |
31 |
| 32 #include <gdk/gdkkeysyms.h> |
32 #include <gdk/gdkkeysyms.h> |
| 33 |
33 |
| 34 typedef struct |
34 typedef struct { |
| 35 { |
|
| 36 PurpleRequestType type; |
35 PurpleRequestType type; |
| 37 |
36 PurpleRequestPage *page; |
| 38 void *user_data; |
37 |
| 39 /* May be GtkWidget or GtkFileDialog. */ |
38 gpointer user_data; |
| 40 gpointer dialog; |
39 GtkWidget *dialog; |
| 41 GCancellable *cancellable; |
40 GCancellable *cancellable; |
| 42 |
41 |
| 43 GtkWidget *ok_button; |
42 GtkWidget *ok_button; |
| |
43 |
| |
44 PurpleRequestHelpCb help_cb; |
| |
45 gpointer help_data; |
| 44 |
46 |
| 45 size_t cb_count; |
47 size_t cb_count; |
| 46 GCallback *cbs; |
48 GCallback *cbs; |
| 47 |
|
| 48 union |
|
| 49 { |
|
| 50 struct |
|
| 51 { |
|
| 52 GtkProgressBar *progress_bar; |
|
| 53 } wait; |
|
| 54 |
|
| 55 struct |
|
| 56 { |
|
| 57 GtkWidget *entry; |
|
| 58 |
|
| 59 gboolean multiline; |
|
| 60 gchar *hint; |
|
| 61 |
|
| 62 } input; |
|
| 63 |
|
| 64 struct |
|
| 65 { |
|
| 66 PurpleRequestPage *page; |
|
| 67 |
|
| 68 } multifield; |
|
| 69 |
|
| 70 struct |
|
| 71 { |
|
| 72 gboolean savedialog; |
|
| 73 |
|
| 74 } file; |
|
| 75 |
|
| 76 } u; |
|
| 77 |
|
| 78 } PidginRequestData; |
49 } PidginRequestData; |
| 79 |
50 |
| 80 static void |
51 static void |
| 81 pidgin_widget_decorate_account(GtkWidget *cont, PurpleAccount *account) |
52 pidgin_widget_decorate_account(GtkWidget *cont, PurpleAccount *account) |
| 82 { |
53 { |
| 91 } |
62 } |
| 92 |
63 |
| 93 display = pidgin_account_display_new(account); |
64 display = pidgin_account_display_new(account); |
| 94 gtk_widget_set_halign(display, GTK_ALIGN_CENTER); |
65 gtk_widget_set_halign(display, GTK_ALIGN_CENTER); |
| 95 gtk_box_append(GTK_BOX(cont), display); |
66 gtk_box_append(GTK_BOX(cont), display); |
| 96 } |
|
| 97 |
|
| 98 static void |
|
| 99 generic_response_start(PidginRequestData *data) |
|
| 100 { |
|
| 101 g_return_if_fail(data != NULL); |
|
| 102 |
|
| 103 g_object_set_data(G_OBJECT(data->dialog), |
|
| 104 "pidgin-window-is-closing", GINT_TO_POINTER(TRUE)); |
|
| 105 gtk_widget_set_visible(GTK_WIDGET(data->dialog), FALSE); |
|
| 106 } |
67 } |
| 107 |
68 |
| 108 static void |
69 static void |
| 109 field_choice_option_cb(GObject *obj, G_GNUC_UNUSED GParamSpec *pspec, |
70 field_choice_option_cb(GObject *obj, G_GNUC_UNUSED GParamSpec *pspec, |
| 110 gpointer data) |
71 gpointer data) |
| 136 gpointer data) |
97 gpointer data) |
| 137 { |
98 { |
| 138 PidginRequestData *req_data = data; |
99 PidginRequestData *req_data = data; |
| 139 PurpleRequestFieldsCb cb = NULL; |
100 PurpleRequestFieldsCb cb = NULL; |
| 140 |
101 |
| 141 generic_response_start(req_data); |
102 gtk_widget_set_visible(GTK_WIDGET(req_data->dialog), FALSE); |
| 142 |
103 |
| 143 if(response == GTK_RESPONSE_OK) { |
104 if(response == GTK_RESPONSE_OK) { |
| 144 cb = (PurpleRequestFieldsCb)req_data->cbs[0]; |
105 cb = (PurpleRequestFieldsCb)req_data->cbs[0]; |
| 145 } else if(response == GTK_RESPONSE_CANCEL || |
106 } else if(response == GTK_RESPONSE_CANCEL || |
| 146 response == GTK_RESPONSE_DELETE_EVENT) |
107 response == GTK_RESPONSE_DELETE_EVENT) |
| 149 } else if(2 <= response && (gsize)response < req_data->cb_count) { |
110 } else if(2 <= response && (gsize)response < req_data->cb_count) { |
| 150 cb = (PurpleRequestFieldsCb)req_data->cbs[response]; |
111 cb = (PurpleRequestFieldsCb)req_data->cbs[response]; |
| 151 } |
112 } |
| 152 |
113 |
| 153 if(cb != NULL) { |
114 if(cb != NULL) { |
| 154 cb(req_data->user_data, req_data->u.multifield.page); |
115 cb(req_data->user_data, req_data->page); |
| 155 } |
116 } |
| 156 |
117 |
| 157 purple_request_close(PURPLE_REQUEST_FIELDS, data); |
118 purple_request_close(PURPLE_REQUEST_FIELDS, data); |
| 158 } |
119 } |
| 159 |
120 |
| 255 |
216 |
| 256 return img; |
217 return img; |
| 257 } |
218 } |
| 258 |
219 |
| 259 static void |
220 static void |
| 260 pidgin_request_help_clicked(GtkButton *button, G_GNUC_UNUSED gpointer _unused) |
221 pidgin_request_help_clicked(G_GNUC_UNUSED GtkButton *button, gpointer data) |
| 261 { |
222 { |
| 262 PurpleRequestHelpCb cb; |
223 PidginRequestData *req_data = data; |
| 263 gpointer data; |
224 |
| 264 |
225 g_return_if_fail(req_data->help_cb != NULL); |
| 265 cb = g_object_get_data(G_OBJECT(button), "pidgin-help-cb"); |
226 req_data->help_cb(req_data->help_data); |
| 266 data = g_object_get_data(G_OBJECT(button), "pidgin-help-data"); |
|
| 267 |
|
| 268 g_return_if_fail(cb != NULL); |
|
| 269 cb(data); |
|
| 270 } |
227 } |
| 271 |
228 |
| 272 static void |
229 static void |
| 273 pidgin_request_add_help(GtkDialog *dialog, PurpleRequestCommonParameters *cpar) |
230 pidgin_request_add_help(PidginRequestData *req_data, |
| |
231 PurpleRequestCommonParameters *cpar) |
| 274 { |
232 { |
| 275 GtkWidget *button; |
233 GtkWidget *button; |
| 276 PurpleRequestHelpCb help_cb; |
234 PurpleRequestHelpCb help_cb; |
| 277 gpointer help_data; |
235 gpointer help_data; |
| 278 |
236 |
| 279 help_cb = purple_request_cpar_get_help_cb(cpar, &help_data); |
237 help_cb = purple_request_cpar_get_help_cb(cpar, &help_data); |
| 280 if (help_cb == NULL) |
238 if (help_cb == NULL) { |
| 281 return; |
239 return; |
| 282 |
240 } |
| 283 button = gtk_dialog_add_button(dialog, _("_Help"), GTK_RESPONSE_HELP); |
241 |
| 284 |
242 button = gtk_dialog_add_button(GTK_DIALOG(req_data->dialog), |
| 285 g_object_set_data(G_OBJECT(button), "pidgin-help-cb", help_cb); |
243 _("_Help"), GTK_RESPONSE_HELP); |
| 286 g_object_set_data(G_OBJECT(button), "pidgin-help-data", help_data); |
244 |
| |
245 req_data->help_cb = help_cb; |
| |
246 req_data->help_data = help_data; |
| 287 |
247 |
| 288 g_signal_connect(G_OBJECT(button), "clicked", |
248 g_signal_connect(G_OBJECT(button), "clicked", |
| 289 G_CALLBACK(pidgin_request_help_clicked), NULL); |
249 G_CALLBACK(pidgin_request_help_clicked), req_data); |
| 290 } |
250 } |
| 291 |
251 |
| 292 static GtkWidget * |
252 static GtkWidget * |
| 293 create_label_field(void) { |
253 create_label_field(void) { |
| 294 GtkWidget *row = NULL; |
254 GtkWidget *row = NULL; |
| 764 GtkWidget *page_widget = NULL; |
724 GtkWidget *page_widget = NULL; |
| 765 AdwPreferencesGroup *group_widget = NULL; |
725 AdwPreferencesGroup *group_widget = NULL; |
| 766 GtkWidget *vbox = NULL; |
726 GtkWidget *vbox = NULL; |
| 767 GtkWidget *img; |
727 GtkWidget *img; |
| 768 GtkWidget *content; |
728 GtkWidget *content; |
| 769 GtkSizeGroup *datasheet_buttons_sg; |
|
| 770 GSList *extra_actions; |
729 GSList *extra_actions; |
| 771 gint response; |
730 gint response; |
| 772 guint n_groups; |
731 guint n_groups; |
| 773 |
732 |
| 774 data = g_new0(PidginRequestData, 1); |
733 data = g_new0(PidginRequestData, 1); |
| 775 data->type = PURPLE_REQUEST_FIELDS; |
734 data->type = PURPLE_REQUEST_FIELDS; |
| 776 data->user_data = user_data; |
735 data->user_data = user_data; |
| 777 data->u.multifield.page = page; |
736 data->page = page; |
| 778 |
737 |
| 779 data->dialog = win = gtk_dialog_new(); |
738 data->dialog = win = gtk_dialog_new(); |
| 780 if(title != NULL) { |
739 if(title != NULL) { |
| 781 gtk_window_set_title(GTK_WINDOW(win), title); |
740 gtk_window_set_title(GTK_WINDOW(win), title); |
| 782 } else { |
741 } else { |
| 805 gtk_box_append(GTK_BOX(vbox), img); |
764 gtk_box_append(GTK_BOX(vbox), img); |
| 806 |
765 |
| 807 pidgin_widget_decorate_account(vbox, |
766 pidgin_widget_decorate_account(vbox, |
| 808 purple_request_cpar_get_account(cpar)); |
767 purple_request_cpar_get_account(cpar)); |
| 809 |
768 |
| 810 pidgin_request_add_help(GTK_DIALOG(win), cpar); |
769 pidgin_request_add_help(data, cpar); |
| 811 |
770 |
| 812 /* Add responses and callbacks. */ |
771 /* Add responses and callbacks. */ |
| 813 g_signal_connect(data->dialog, "response", |
772 g_signal_connect(data->dialog, "response", |
| 814 G_CALLBACK(multifield_response_cb), data); |
773 G_CALLBACK(multifield_response_cb), data); |
| 815 extra_actions = purple_request_cpar_get_extra_actions(cpar); |
774 extra_actions = purple_request_cpar_get_extra_actions(cpar); |
| 837 data->ok_button = gtk_dialog_add_button(GTK_DIALOG(win), ok_text, |
796 data->ok_button = gtk_dialog_add_button(GTK_DIALOG(win), ok_text, |
| 838 GTK_RESPONSE_OK); |
797 GTK_RESPONSE_OK); |
| 839 response = GTK_RESPONSE_OK; |
798 response = GTK_RESPONSE_OK; |
| 840 } |
799 } |
| 841 gtk_dialog_set_default_response(GTK_DIALOG(win), response); |
800 gtk_dialog_set_default_response(GTK_DIALOG(win), response); |
| 842 |
|
| 843 datasheet_buttons_sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); |
|
| 844 |
801 |
| 845 if(primary != NULL) { |
802 if(primary != NULL) { |
| 846 GtkWidget *label = gtk_label_new(primary); |
803 GtkWidget *label = gtk_label_new(primary); |
| 847 gtk_label_set_wrap(GTK_LABEL(label), TRUE); |
804 gtk_label_set_wrap(GTK_LABEL(label), TRUE); |
| 848 gtk_widget_add_css_class(label, "title-1"); |
805 gtk_widget_add_css_class(label, "title-1"); |
| 952 (GDestroyNotify)purple_key_value_pair_free); |
909 (GDestroyNotify)purple_key_value_pair_free); |
| 953 |
910 |
| 954 g_object_unref(group); |
911 g_object_unref(group); |
| 955 } |
912 } |
| 956 |
913 |
| 957 g_object_unref(datasheet_buttons_sg); |
|
| 958 |
|
| 959 g_object_bind_property(page, "valid", data->ok_button, "sensitive", 0); |
914 g_object_bind_property(page, "valid", data->ok_button, "sensitive", 0); |
| 960 |
915 |
| 961 gtk_widget_set_visible(win, TRUE); |
916 gtk_widget_set_visible(win, TRUE); |
| 962 |
917 |
| 963 return data; |
918 return data; |