| 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 } |
| 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 { |