pidgin/pidgin

Parents cc8312cb5017
Children 2ba47ec94b05
Remove the Pidgin implemenation of requests except for fields

We're in the progress of removing the requests API and this need to be removed
to do that.

Testing Done:
Checked in with the turtles and verified the fields api still worked with the idle plugin.

Reviewed at https://reviews.imfreedom.org/r/3145/
--- a/pidgin/gtkrequest.c Mon May 06 00:07:59 2024 -0500
+++ b/pidgin/gtkrequest.c Mon May 06 00:11:54 2024 -0500
@@ -108,79 +108,6 @@
}
static void
-input_response_cb(G_GNUC_UNUSED GtkDialog *dialog, gint id,
- PidginRequestData *data)
-{
- const char *value;
- char *multiline_value = NULL;
-
- generic_response_start(data);
-
- if(data->u.input.multiline || purple_strequal(data->u.input.hint, "html")) {
- GtkTextBuffer *buffer = NULL;
-
- buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(data->u.input.entry));
-
- if (purple_strequal(data->u.input.hint, "html")) {
- multiline_value = pidgin_text_buffer_get_html(buffer);
- } else {
- GtkTextIter start_iter, end_iter;
-
- gtk_text_buffer_get_start_iter(buffer, &start_iter);
- gtk_text_buffer_get_end_iter(buffer, &end_iter);
-
- multiline_value = gtk_text_buffer_get_text(buffer, &start_iter,
- &end_iter, FALSE);
- }
-
- value = multiline_value;
- } else {
- value = gtk_editable_get_text(GTK_EDITABLE(data->u.input.entry));
- }
-
- if (id >= 0 && (gsize)id < data->cb_count && data->cbs[id] != NULL)
- ((PurpleRequestInputCb)data->cbs[id])(data->user_data, value);
- else if (data->cbs[1] != NULL)
- ((PurpleRequestInputCb)data->cbs[1])(data->user_data, value);
-
- if (data->u.input.multiline) {
- g_free(multiline_value);
- }
-
- purple_request_close(PURPLE_REQUEST_INPUT, data);
-}
-
-static void
-action_response_cb(G_GNUC_UNUSED GtkDialog *dialog, gint id,
- PidginRequestData *data)
-{
- generic_response_start(data);
-
- if (id >= 0 && (gsize)id < data->cb_count && data->cbs[id] != NULL)
- ((PurpleRequestActionCb)data->cbs[id])(data->user_data, id);
-
- purple_request_close(PURPLE_REQUEST_INPUT, data);
-}
-
-
-static void
-choice_response_cb(GtkDialog *dialog, gint id, PidginRequestData *data) {
- GtkDropDown *dropdown = g_object_get_data(G_OBJECT(dialog), "dropdown");
-
- generic_response_start(data);
-
- if(0 <= id && (gsize)id < data->cb_count && data->cbs[id] != NULL) {
- GObject *item = gtk_drop_down_get_selected_item(dropdown);
- if(G_IS_OBJECT(item)) {
- gpointer value = g_object_get_data(item, "choice_value");
- ((PurpleRequestChoiceCb)data->cbs[id])(data->user_data, value);
- }
- }
-
- purple_request_close(PURPLE_REQUEST_INPUT, data);
-}
-
-static void
field_choice_option_cb(GObject *obj, G_GNUC_UNUSED GParamSpec *pspec,
gpointer data)
{
@@ -232,28 +159,6 @@
purple_request_close(PURPLE_REQUEST_FIELDS, data);
}
-static gchar *
-pidgin_request_escape(PurpleRequestCommonParameters *cpar, const gchar *text)
-{
- if (text == NULL)
- return NULL;
-
- if (purple_request_cpar_is_html(cpar)) {
- gboolean valid;
-
- valid = pango_parse_markup(text, -1, 0, NULL, NULL, NULL, NULL);
-
- if (valid)
- return g_strdup(text);
- else {
- purple_debug_error("pidgin", "Passed label text is not "
- "a valid markup. Falling back to plain text.");
- }
- }
-
- return g_markup_escape_text(text, -1);
-}
-
static GtkWidget *
pidgin_request_dialog_icon(PurpleRequestType dialog_type,
PurpleRequestCommonParameters *cpar)
@@ -386,563 +291,6 @@
G_CALLBACK(pidgin_request_help_clicked), NULL);
}
-static void *
-pidgin_request_input(const char *title, const char *primary,
- const char *secondary, const char *default_value,
- gboolean multiline, gboolean masked, gchar *hint,
- const char *ok_text, GCallback ok_cb,
- const char *cancel_text, GCallback cancel_cb,
- PurpleRequestCommonParameters *cpar,
- void *user_data)
-{
- PidginRequestData *data;
- GtkWidget *dialog;
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkLabel *label;
- GtkWidget *img;
- GtkWidget *content;
- char *label_text;
- char *primary_esc, *secondary_esc;
-
- data = g_new0(PidginRequestData, 1);
- data->type = PURPLE_REQUEST_INPUT;
- data->user_data = user_data;
-
- data->cb_count = 2;
- data->cbs = g_new0(GCallback, 2);
-
- data->cbs[0] = ok_cb;
- data->cbs[1] = cancel_cb;
-
- /* Create the dialog. */
- dialog = gtk_dialog_new_with_buttons(title ? title : PIDGIN_ALERT_TITLE,
- NULL, 0,
- cancel_text, 1,
- ok_text, 0,
- NULL);
- data->dialog = dialog;
-
- g_signal_connect(G_OBJECT(dialog), "response",
- G_CALLBACK(input_response_cb), data);
-
- /* Setup the dialog */
- gtk_widget_set_margin_top(dialog, 6);
- gtk_widget_set_margin_bottom(dialog, 6);
- gtk_widget_set_margin_start(dialog, 6);
- gtk_widget_set_margin_end(dialog, 6);
-
- content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
- gtk_widget_set_margin_top(content, 6);
- gtk_widget_set_margin_bottom(content, 6);
- gtk_widget_set_margin_start(content, 6);
- gtk_widget_set_margin_end(content, 6);
-
- if (!multiline)
- gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
- gtk_dialog_set_default_response(GTK_DIALOG(dialog), 0);
- gtk_box_set_spacing(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
- 12);
-
- /* Setup the main horizontal box */
- hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
- gtk_box_append(GTK_BOX(content), hbox);
-
- /* Dialog icon. */
- img = pidgin_request_dialog_icon(PURPLE_REQUEST_INPUT, cpar);
- gtk_widget_set_halign(img, GTK_ALIGN_START);
- gtk_widget_set_valign(img, GTK_ALIGN_START);
- gtk_box_append(GTK_BOX(hbox), img);
-
- pidgin_request_add_help(GTK_DIALOG(dialog), cpar);
-
- /* Vertical box */
- vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
- gtk_widget_set_hexpand(vbox, TRUE);
- gtk_box_append(GTK_BOX(hbox), vbox);
-
- pidgin_widget_decorate_account(vbox,
- purple_request_cpar_get_account(cpar));
-
- /* Descriptive label */
- primary_esc = pidgin_request_escape(cpar, primary);
- secondary_esc = pidgin_request_escape(cpar, secondary);
- label_text = g_strdup_printf((primary ? "<span weight=\"bold\" size=\"larger\">"
- "%s</span>%s%s" : "%s%s%s"),
- (primary ? primary_esc : ""),
- ((primary && secondary) ? "\n\n" : ""),
- (secondary ? secondary_esc : ""));
- g_free(primary_esc);
- g_free(secondary_esc);
-
- label = GTK_LABEL(gtk_label_new(NULL));
-
- gtk_label_set_markup(label, label_text);
- gtk_label_set_wrap(label, TRUE);
- gtk_label_set_xalign(label, 0);
- gtk_label_set_yalign(label, 0);
- gtk_box_append(GTK_BOX(vbox), GTK_WIDGET(label));
-
- g_free(label_text);
-
- /* Entry field. */
- data->u.input.multiline = multiline;
- data->u.input.hint = g_strdup(hint);
-
- if(multiline || purple_strequal(data->u.input.hint, "html")) {
- GtkWidget *sw = NULL;
- GtkWidget *view = NULL;
- GtkTextBuffer *buffer = NULL;
-
- sw = gtk_scrolled_window_new();
- gtk_widget_set_vexpand(sw, TRUE);
- gtk_box_append(GTK_BOX(vbox), sw);
-
- view = gtk_text_view_new();
- gtk_widget_set_size_request(view, 320, 130);
- gtk_widget_set_name(view, "pidgin_request_input");
- gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw), view);
-
- buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
-
- if(!purple_strempty(default_value)) {
- if(purple_strequal(data->u.input.hint, "html")) {
- GtkTextIter start;
-
- gtk_text_buffer_get_start_iter(buffer, &start);
- gtk_text_buffer_insert_markup(buffer, &start, default_value,
- -1);
- } else {
- gtk_text_buffer_set_text(buffer, default_value, -1);
- }
- }
-
- data->u.input.entry = view;
- } else {
- GtkWidget *entry = NULL;
-
- if(masked) {
- entry = gtk_password_entry_new();
- g_object_set(entry, "activates-default", TRUE,
- "show-peek-icon", TRUE, NULL);
- } else {
- entry = gtk_entry_new();
- gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
- }
-
- gtk_box_append(GTK_BOX(vbox), entry);
-
- if(default_value != NULL) {
- gtk_editable_set_text(GTK_EDITABLE(entry), default_value);
- }
-
- data->u.input.entry = entry;
- }
-
- pidgin_set_accessible_label(data->u.input.entry, label);
-
- pidgin_auto_parent_window(dialog);
-
- /* Show everything. */
- gtk_widget_set_visible(dialog, TRUE);
-
- return data;
-}
-
-static void *
-pidgin_request_choice(const char *title, const char *primary,
- const char *secondary, gpointer default_value, const char *ok_text,
- GCallback ok_cb, const char *cancel_text, GCallback cancel_cb,
- PurpleRequestCommonParameters *cpar, void *user_data, va_list args)
-{
- PidginRequestData *data;
- GtkWidget *dialog;
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *label;
- GtkWidget *img;
- GtkWidget *dropdown;
- GListModel *model;
- GtkWidget *content;
- char *label_text;
- const char *radio_text;
- char *primary_esc, *secondary_esc;
- guint index, selected;
-
- data = g_new0(PidginRequestData, 1);
- data->type = PURPLE_REQUEST_ACTION;
- data->user_data = user_data;
-
- data->cb_count = 2;
- data->cbs = g_new0(GCallback, 2);
- data->cbs[0] = cancel_cb;
- data->cbs[1] = ok_cb;
-
- /* Create the dialog. */
- data->dialog = dialog = gtk_dialog_new();
-
- if (title != NULL)
- gtk_window_set_title(GTK_WINDOW(dialog), title);
-#ifdef _WIN32
- gtk_window_set_title(GTK_WINDOW(dialog), PIDGIN_ALERT_TITLE);
-#endif
-
- gtk_dialog_add_button(GTK_DIALOG(dialog), cancel_text, 0);
- gtk_dialog_add_button(GTK_DIALOG(dialog), ok_text, 1);
-
- g_signal_connect(G_OBJECT(dialog), "response",
- G_CALLBACK(choice_response_cb), data);
-
- /* Setup the dialog */
- gtk_widget_set_margin_top(dialog, 6);
- gtk_widget_set_margin_bottom(dialog, 6);
- gtk_widget_set_margin_start(dialog, 6);
- gtk_widget_set_margin_end(dialog, 6);
- gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
-
- content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
- gtk_widget_set_margin_top(content, 6);
- gtk_widget_set_margin_bottom(content, 6);
- gtk_widget_set_margin_start(content, 6);
- gtk_widget_set_margin_end(content, 6);
- gtk_box_set_spacing(GTK_BOX(content), 12);
-
- /* Setup the main horizontal box */
- hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
- gtk_box_append(GTK_BOX(content), hbox);
-
- /* Dialog icon. */
- img = pidgin_request_dialog_icon(PURPLE_REQUEST_CHOICE, cpar);
- gtk_widget_set_halign(img, GTK_ALIGN_START);
- gtk_widget_set_valign(img, GTK_ALIGN_START);
- gtk_box_append(GTK_BOX(hbox), img);
-
- pidgin_request_add_help(GTK_DIALOG(dialog), cpar);
-
- /* Vertical box */
- vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
- gtk_box_append(GTK_BOX(hbox), vbox);
-
- pidgin_widget_decorate_account(vbox,
- purple_request_cpar_get_account(cpar));
-
- /* Descriptive label */
- primary_esc = pidgin_request_escape(cpar, primary);
- secondary_esc = pidgin_request_escape(cpar, secondary);
- label_text = g_strdup_printf((primary ? "<span weight=\"bold\" size=\"larger\">"
- "%s</span>%s%s" : "%s%s%s"),
- (primary ? primary_esc : ""),
- ((primary && secondary) ? "\n\n" : ""),
- (secondary ? secondary_esc : ""));
- g_free(primary_esc);
- g_free(secondary_esc);
-
- label = gtk_label_new(NULL);
-
- gtk_label_set_markup(GTK_LABEL(label), label_text);
- gtk_label_set_wrap(GTK_LABEL(label), TRUE);
- gtk_label_set_xalign(GTK_LABEL(label), 0);
- gtk_label_set_yalign(GTK_LABEL(label), 0);
- gtk_widget_set_vexpand(label, TRUE);
- gtk_box_append(GTK_BOX(vbox), label);
-
- g_free(label_text);
-
- dropdown = gtk_drop_down_new_from_strings(NULL);
- gtk_box_append(GTK_BOX(vbox), dropdown);
- g_object_set_data(G_OBJECT(dialog), "dropdown", dropdown);
-
- index = 0;
- selected = GTK_INVALID_LIST_POSITION;
- model = gtk_drop_down_get_model(GTK_DROP_DOWN(dropdown));
- while((radio_text = va_arg(args, const char *))) {
- GObject *item = NULL;
- gpointer resp = va_arg(args, gpointer);
-
- gtk_string_list_append(GTK_STRING_LIST(model), radio_text);
- item = g_list_model_get_item(model, index);
- g_object_set_data(item, "choice_value", resp);
- if (resp == default_value) {
- selected = index;
- }
-
- g_clear_object(&item);
- index++;
- }
-
- if(selected != GTK_INVALID_LIST_POSITION) {
- gtk_drop_down_set_selected(GTK_DROP_DOWN(dropdown), selected);
- }
-
- /* Show everything. */
- pidgin_auto_parent_window(dialog);
-
- gtk_widget_set_visible(dialog, TRUE);
-
- return data;
-}
-
-static void *
-pidgin_request_action(const char *title, const char *primary,
- const char *secondary, int default_action,
- PurpleRequestCommonParameters *cpar, void *user_data,
- size_t action_count, va_list actions)
-{
- PidginRequestData *data;
- GtkWidget *dialog;
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *label;
- GtkWidget *img = NULL;
- GtkWidget *content;
- void **buttons;
- char *label_text;
- char *primary_esc, *secondary_esc;
- gsize i;
-
- data = g_new0(PidginRequestData, 1);
- data->type = PURPLE_REQUEST_ACTION;
- data->user_data = user_data;
-
- data->cb_count = action_count;
- data->cbs = g_new0(GCallback, action_count);
-
- /* Reverse the buttons */
- buttons = g_new0(void *, action_count * 2);
-
- for (i = 0; i < action_count * 2; i += 2) {
- buttons[(action_count * 2) - i - 2] = va_arg(actions, char *);
- buttons[(action_count * 2) - i - 1] = va_arg(actions, GCallback);
- }
-
- /* Create the dialog. */
- data->dialog = dialog = gtk_dialog_new();
-
- gtk_window_set_deletable(GTK_WINDOW(data->dialog), FALSE);
-
- if (title != NULL)
- gtk_window_set_title(GTK_WINDOW(dialog), title);
-#ifdef _WIN32
- else
- gtk_window_set_title(GTK_WINDOW(dialog), PIDGIN_ALERT_TITLE);
-#endif
-
- for (i = 0; i < action_count; i++) {
- gtk_dialog_add_button(GTK_DIALOG(dialog), buttons[2 * i], i);
-
- data->cbs[i] = buttons[2 * i + 1];
- }
-
- g_free(buttons);
-
- g_signal_connect(G_OBJECT(dialog), "response",
- G_CALLBACK(action_response_cb), data);
-
- /* Setup the dialog */
- gtk_widget_set_margin_top(dialog, 6);
- gtk_widget_set_margin_bottom(dialog, 6);
- gtk_widget_set_margin_start(dialog, 6);
- gtk_widget_set_margin_end(dialog, 6);
- gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
-
- content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
- gtk_widget_set_margin_top(content, 6);
- gtk_widget_set_margin_bottom(content, 6);
- gtk_widget_set_margin_start(content, 6);
- gtk_widget_set_margin_end(content, 6);
- gtk_box_set_spacing(GTK_BOX(content), 12);
-
- /* Setup the main horizontal box */
- hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
- gtk_box_append(GTK_BOX(content), hbox);
-
- img = pidgin_request_dialog_icon(PURPLE_REQUEST_ACTION, cpar);
- gtk_widget_set_halign(img, GTK_ALIGN_START);
- gtk_widget_set_valign(img, GTK_ALIGN_START);
- gtk_box_append(GTK_BOX(hbox), img);
-
- /* Vertical box */
- vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
- gtk_box_append(GTK_BOX(hbox), vbox);
-
- pidgin_widget_decorate_account(vbox,
- purple_request_cpar_get_account(cpar));
-
- pidgin_request_add_help(GTK_DIALOG(dialog), cpar);
-
- /* Descriptive label */
- primary_esc = pidgin_request_escape(cpar, primary);
- secondary_esc = pidgin_request_escape(cpar, secondary);
- label_text = g_strdup_printf((primary ? "<span weight=\"bold\" size=\"larger\">"
- "%s</span>%s%s" : "%s%s%s"),
- (primary ? primary_esc : ""),
- ((primary && secondary) ? "\n\n" : ""),
- (secondary ? secondary_esc : ""));
- g_free(primary_esc);
- g_free(secondary_esc);
-
- label = gtk_label_new(NULL);
-
- gtk_label_set_markup(GTK_LABEL(label), label_text);
- gtk_label_set_wrap(GTK_LABEL(label), TRUE);
- gtk_label_set_xalign(GTK_LABEL(label), 0);
- gtk_label_set_yalign(GTK_LABEL(label), 0);
- gtk_label_set_selectable(GTK_LABEL(label), TRUE);
- gtk_widget_set_vexpand(label, TRUE);
- gtk_box_append(GTK_BOX(vbox), label);
-
- g_free(label_text);
-
-
- if (default_action != PURPLE_DEFAULT_ACTION_NONE) {
- /*
- * Need to invert the default_action number because the
- * buttons are added to the dialog in reverse order.
- */
- gtk_dialog_set_default_response(GTK_DIALOG(dialog), action_count - 1 - default_action);
- }
-
- /* Show everything. */
- pidgin_auto_parent_window(dialog);
-
- gtk_widget_set_visible(dialog, TRUE);
-
- return data;
-}
-
-static void
-wait_response_cb(G_GNUC_UNUSED GtkDialog *dialog, G_GNUC_UNUSED gint id,
- PidginRequestData *data)
-{
- generic_response_start(data);
-
- if (data->cbs[0] != NULL)
- ((PurpleRequestCancelCb)data->cbs[0])(data->user_data);
-
- purple_request_close(PURPLE_REQUEST_FIELDS, data);
-}
-
-static void *
-pidgin_request_wait(const char *title, const char *primary,
- const char *secondary, gboolean with_progress,
- PurpleRequestCancelCb cancel_cb, PurpleRequestCommonParameters *cpar,
- void *user_data)
-{
- PidginRequestData *data;
- GtkWidget *dialog, *content;
- GtkWidget *hbox, *vbox, *img, *label;
- gchar *primary_esc, *secondary_esc, *label_text;
-
- data = g_new0(PidginRequestData, 1);
- data->type = PURPLE_REQUEST_WAIT;
- data->user_data = user_data;
-
- data->cb_count = 1;
- data->cbs = g_new0(GCallback, 1);
- data->cbs[0] = (GCallback)cancel_cb;
-
- data->dialog = dialog = gtk_dialog_new();
-
- g_signal_connect(G_OBJECT(dialog), "response",
- G_CALLBACK(wait_response_cb), data);
-
- gtk_window_set_deletable(GTK_WINDOW(data->dialog), cancel_cb != NULL);
-
- if (title != NULL)
- gtk_window_set_title(GTK_WINDOW(dialog), title);
- else
- gtk_window_set_title(GTK_WINDOW(dialog), _("Please wait"));
-
- /* Setup the dialog */
- gtk_widget_set_margin_top(dialog, 6);
- gtk_widget_set_margin_bottom(dialog, 6);
- gtk_widget_set_margin_start(dialog, 6);
- gtk_widget_set_margin_end(dialog, 6);
- gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE);
-
- content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
- gtk_widget_set_margin_top(content, 6);
- gtk_widget_set_margin_bottom(content, 6);
- gtk_widget_set_margin_start(content, 6);
- gtk_widget_set_margin_end(content, 6);
- gtk_box_set_spacing(GTK_BOX(content), 12);
-
- /* Setup the main horizontal box */
- hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
- gtk_box_append(GTK_BOX(content), hbox);
-
- img = pidgin_request_dialog_icon(PURPLE_REQUEST_WAIT, cpar);
- gtk_widget_set_halign(img, GTK_ALIGN_START);
- gtk_widget_set_valign(img, GTK_ALIGN_START);
- gtk_box_append(GTK_BOX(hbox), img);
-
- /* Cancel button */
- gtk_dialog_add_button(GTK_DIALOG(dialog), _("Cancel"), GTK_RESPONSE_CANCEL);
-
- /* Vertical box */
- vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 12);
- gtk_box_append(GTK_BOX(hbox), vbox);
-
- pidgin_widget_decorate_account(vbox,
- purple_request_cpar_get_account(cpar));
-
- pidgin_request_add_help(GTK_DIALOG(dialog), cpar);
-
- /* Descriptive label */
- primary_esc = pidgin_request_escape(cpar, primary);
- secondary_esc = pidgin_request_escape(cpar, secondary);
- label_text = g_strdup_printf((primary ? "<span weight=\"bold\" "
- "size=\"larger\">%s</span>%s%s" : "%s%s%s"),
- (primary ? primary_esc : ""),
- ((primary && secondary) ? "\n\n" : ""),
- (secondary ? secondary_esc : ""));
- g_free(primary_esc);
- g_free(secondary_esc);
-
- label = gtk_label_new(NULL);
-
- gtk_label_set_markup(GTK_LABEL(label), label_text);
- gtk_label_set_wrap(GTK_LABEL(label), TRUE);
- gtk_label_set_xalign(GTK_LABEL(label), 0);
- gtk_label_set_yalign(GTK_LABEL(label), 0);
- gtk_label_set_selectable(GTK_LABEL(label), FALSE);
- gtk_widget_set_vexpand(label, TRUE);
- gtk_box_append(GTK_BOX(vbox), label);
-
- g_free(label_text);
-
- if (with_progress) {
- GtkProgressBar *bar;
-
- bar = data->u.wait.progress_bar =
- GTK_PROGRESS_BAR(gtk_progress_bar_new());
- gtk_progress_bar_set_fraction(bar, 0);
- gtk_box_append(GTK_BOX(vbox), GTK_WIDGET(bar));
- }
-
- /* Show everything. */
- pidgin_auto_parent_window(dialog);
-
- gtk_widget_set_visible(dialog, TRUE);
-
- return data;
-}
-
-static void
-pidgin_request_wait_update(void *ui_handle, gboolean pulse, gfloat fraction)
-{
- GtkProgressBar *bar;
- PidginRequestData *data = ui_handle;
-
- g_return_if_fail(data->type == PURPLE_REQUEST_WAIT);
-
- bar = data->u.wait.progress_bar;
- if (pulse)
- gtk_progress_bar_pulse(bar);
- else
- gtk_progress_bar_set_fraction(bar, fraction);
-}
-
static GtkWidget *
create_label_field(void) {
GtkWidget *row = NULL;
@@ -1619,265 +967,6 @@
return data;
}
-static void
-pidgin_request_file_response_cb(GObject *obj, GAsyncResult *result,
- gpointer user_data)
-{
- PidginRequestData *data = user_data;
- GFile *path = NULL;
- GFile *parent = NULL;
- GError *error = NULL;
-
- if(data->u.file.savedialog) {
- path = gtk_file_dialog_save_finish(GTK_FILE_DIALOG(obj), result,
- &error);
- } else {
- path = gtk_file_dialog_open_finish(GTK_FILE_DIALOG(obj), result,
- &error);
- }
- if(path == NULL) {
- if(!g_error_matches(error, GTK_DIALOG_ERROR, GTK_DIALOG_ERROR_CANCELLED)) {
- if(data->cbs[0] != NULL) {
- ((PurpleRequestFileCb)data->cbs[0])(data->user_data, NULL);
- }
- purple_request_close(data->type, data);
- }
- g_clear_error(&error);
- return;
- }
-
- parent = g_file_get_parent(path);
- if(parent != NULL) {
- char *current_folder = g_file_get_path(parent);
- if (data->u.file.savedialog) {
- purple_prefs_set_path(PIDGIN_PREFS_ROOT "/filelocations/last_save_folder",
- current_folder);
- } else {
- purple_prefs_set_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder",
- current_folder);
- }
- g_free(current_folder);
- }
-
- if(data->cbs[1] != NULL) {
- char *filename = g_file_get_path(path);
- ((PurpleRequestFileCb)data->cbs[1])(data->user_data, filename);
- g_free(filename);
- }
-
- g_clear_object(&parent);
- g_clear_object(&path);
- g_clear_object(&data->cancellable);
- purple_request_close(data->type, data);
-}
-
-static void
-pidgin_request_folder_response_cb(GObject *obj, GAsyncResult *result,
- gpointer user_data)
-{
- PidginRequestData *data = user_data;
- GFile *path = NULL;
- char *folder = NULL;
- GError *error = NULL;
-
- path = gtk_file_dialog_select_folder_finish(GTK_FILE_DIALOG(obj), result,
- &error);
- if(path == NULL) {
- if(!g_error_matches(error, GTK_DIALOG_ERROR, GTK_DIALOG_ERROR_CANCELLED)) {
- if(data->cbs[0] != NULL) {
- ((PurpleRequestFileCb)data->cbs[0])(data->user_data, NULL);
- }
- purple_request_close(data->type, data);
- }
- g_clear_error(&error);
- return;
- }
-
- folder = g_file_get_path(path);
- purple_prefs_set_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder",
- folder);
-
- if(data->cbs[1] != NULL) {
- ((PurpleRequestFileCb)data->cbs[1])(data->user_data, folder);
- }
-
- g_free(folder);
- g_clear_object(&path);
- g_clear_object(&data->cancellable);
- purple_request_close(data->type, data);
-}
-
-static void *
-pidgin_request_file(const char *title, const char *filename,
- gboolean savedialog, GCallback ok_cb, GCallback cancel_cb,
- G_GNUC_UNUSED PurpleRequestCommonParameters *cpar,
- gpointer user_data)
-{
- PidginRequestData *data;
- GtkFileDialog *dialog = NULL;
-#ifdef _WIN32
- const gchar *current_folder;
- gboolean folder_set = FALSE;
-#endif
-
- data = g_new0(PidginRequestData, 1);
- data->type = PURPLE_REQUEST_FILE;
- data->user_data = user_data;
- data->cb_count = 2;
- data->cbs = g_new0(GCallback, 2);
- data->cbs[0] = cancel_cb;
- data->cbs[1] = ok_cb;
- data->u.file.savedialog = savedialog;
-
- data->dialog = dialog = gtk_file_dialog_new();
- gtk_file_dialog_set_title(dialog,
- title ? title
- : (savedialog ? _("Save File...")
- : _("Open File...")));
-
- if(!purple_strempty(filename)) {
- GFile *path = g_file_new_for_path(filename);
-
- if(savedialog || g_file_test(filename, G_FILE_TEST_EXISTS)) {
- gtk_file_dialog_set_initial_file(dialog, path);
- }
-
- g_object_unref(path);
- }
-
-#ifdef _WIN32
- if (savedialog) {
- current_folder = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/filelocations/last_save_folder");
- } else {
- current_folder = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder");
- }
-
- if((purple_strempty(filename) || !g_file_test(filename, G_FILE_TEST_EXISTS)) &&
- !purple_strempty(current_folder))
- {
- GFile *file = g_file_new_for_path(current_folder);
- gtk_file_dialog_set_initial_folder(dialog, file);
- folder_set = TRUE;
- g_clear_object(&file);
- }
-
- if(!folder_set &&
- (purple_strempty(filename) || !g_file_test(filename, G_FILE_TEST_EXISTS)))
- {
- const char *my_documents = NULL;
-
- my_documents = g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS);
- if (my_documents != NULL) {
- GFile *file = g_file_new_for_path(my_documents);
-
- gtk_file_dialog_set_initial_folder(dialog, file);
-
- g_clear_object(&file);
- }
- }
-#endif
-
- data->cancellable = g_cancellable_new();
- if(savedialog) {
- gtk_file_dialog_save(dialog, NULL, data->cancellable,
- pidgin_request_file_response_cb, data);
- } else {
- gtk_file_dialog_open(dialog, NULL, data->cancellable,
- pidgin_request_file_response_cb, data);
- }
-
- return (void *)data;
-}
-
-static void *
-pidgin_request_folder(const char *title, const char *dirname, GCallback ok_cb,
- GCallback cancel_cb,
- G_GNUC_UNUSED PurpleRequestCommonParameters *cpar,
- gpointer user_data)
-{
- PidginRequestData *data;
- GtkFileDialog *dialog = NULL;
-
- data = g_new0(PidginRequestData, 1);
- data->type = PURPLE_REQUEST_FOLDER;
- data->user_data = user_data;
- data->cb_count = 2;
- data->cbs = g_new0(GCallback, 2);
- data->cbs[0] = cancel_cb;
- data->cbs[1] = ok_cb;
- data->u.file.savedialog = FALSE;
-
- data->cancellable = g_cancellable_new();
- data->dialog = dialog = gtk_file_dialog_new();
- gtk_file_dialog_set_title(dialog, title ? title : _("Select Folder..."));
-
- if(!purple_strempty(dirname)) {
- GFile *path = g_file_new_for_path(dirname);
- gtk_file_dialog_set_initial_folder(dialog, path);
- g_object_unref(path);
- }
-
- gtk_file_dialog_select_folder(dialog, NULL, data->cancellable,
- pidgin_request_folder_response_cb, data);
-
- return (void *)data;
-}
-
-/* if request callback issues another request, it should be attached to the
- * primary request parent */
-static void
-pidgin_window_detach_children(GtkWindow* win)
-{
- GList *it;
- GtkWindow *par;
-
- g_return_if_fail(win != NULL);
-
- par = gtk_window_get_transient_for(win);
- it = gtk_window_list_toplevels();
- for (it = g_list_first(it); it != NULL; it = g_list_delete_link(it, it)) {
- GtkWindow *child = GTK_WINDOW(it->data);
- if (gtk_window_get_transient_for(child) != win)
- continue;
- if (gtk_window_get_destroy_with_parent(child)) {
-#ifdef _WIN32
- /* XXX test/verify it: Win32 gtk ignores
- * gtk_window_set_destroy_with_parent(..., FALSE). */
- gtk_window_set_transient_for(child, NULL);
-#endif
- continue;
- }
- gtk_window_set_transient_for(child, par);
- }
-}
-
-static void
-pidgin_close_request(PurpleRequestType type, void *ui_handle)
-{
- PidginRequestData *data = (PidginRequestData *)ui_handle;
-
- if(data->cancellable != NULL) {
- g_cancellable_cancel(data->cancellable);
- }
-
- if (type == PURPLE_REQUEST_FILE || type == PURPLE_REQUEST_FOLDER) {
- /* Will be a GtkFileDialog, not GtkDialog. */
- g_clear_object(&data->dialog);
- } else {
- pidgin_window_detach_children(GTK_WINDOW(data->dialog));
-
- gtk_window_destroy(GTK_WINDOW(data->dialog));
- }
-
- if(type == PURPLE_REQUEST_FIELDS) {
- g_clear_object(&data->u.multifield.page);
- }
-
- g_clear_object(&data->cancellable);
- g_free(data->cbs);
- g_free(data);
-}
-
GtkWindow *
pidgin_request_get_dialog_window(void *ui_handle)
{
@@ -1897,16 +986,7 @@
}
static PurpleRequestUiOps ops = {
- .features = PURPLE_REQUEST_FEATURE_HTML,
- .request_input = pidgin_request_input,
- .request_choice = pidgin_request_choice,
- .request_action = pidgin_request_action,
- .request_wait = pidgin_request_wait,
- .request_wait_update = pidgin_request_wait_update,
.request_fields = pidgin_request_fields,
- .request_file = pidgin_request_file,
- .request_folder = pidgin_request_folder,
- .close_request = pidgin_close_request,
};
PurpleRequestUiOps *