pidgin/gtkrequest.c

changeset 42976
93f48383ac8c
parent 42837
1f1614e5468b
child 42977
72fd5614ea76
equal deleted inserted replaced
42975:c77cf8366ec6 42976:93f48383ac8c
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;
1005 } 960 }
1006 961
1007 void 962 void
1008 pidgin_request_uninit(void) 963 pidgin_request_uninit(void)
1009 { 964 {
1010 purple_signals_disconnect_by_handle(pidgin_request_get_handle()); 965 }
1011 }

mercurial