--- a/pidgin/gtkaccount.c Sun Sep 29 00:58:53 2019 -0400
+++ b/pidgin/gtkaccount.c Sun Sep 29 02:30:18 2019 -0400
@@ -125,7 +125,7 @@
- GtkWidget *icon_filesel;
+ GtkFileChooserNative *icon_filesel; @@ -340,14 +340,14 @@
set_dialog_icon(dialog, data, len, g_strdup(filename));
- dialog->icon_filesel = NULL;
+ g_clear_object(&dialog->icon_filesel); icon_select_cb(GtkWidget *button, AccountPrefsDialog *dialog)
dialog->icon_filesel = pidgin_buddy_icon_chooser_new(GTK_WINDOW(dialog->window), icon_filesel_choose_cb, dialog);
- gtk_widget_show_all(dialog->icon_filesel);
+ gtk_native_dialog_show(GTK_NATIVE_DIALOG(dialog->icon_filesel)); @@ -1258,8 +1258,7 @@
g_object_unref(dialog->icon_img);
- if (dialog->icon_filesel)
- gtk_widget_destroy(dialog->icon_filesel);
+ g_clear_object(&dialog->icon_filesel); purple_signals_disconnect_by_handle(dialog);
--- a/pidgin/gtkblist.c Sun Sep 29 00:58:53 2019 -0400
+++ b/pidgin/gtkblist.c Sun Sep 29 02:30:18 2019 -0400
@@ -1686,14 +1686,15 @@
set_node_custom_icon(GtkWidget *w, PurpleBlistNode *node)
- GtkWidget *win = g_object_get_data(G_OBJECT(node), "buddy-icon-chooser");
+ GtkFileChooserNative *win = + g_object_get_data(G_OBJECT(node), "buddy-icon-chooser"); win = pidgin_buddy_icon_chooser_new(NULL, set_node_custom_icon_cb,
g_object_set_data_full(G_OBJECT(node), "buddy-icon-chooser", win,
- (GDestroyNotify)gtk_widget_destroy);
- gtk_widget_show_all(win);
+ gtk_native_dialog_show(GTK_NATIVE_DIALOG(win)); --- a/pidgin/gtkconv.c Sun Sep 29 00:58:53 2019 -0400
+++ b/pidgin/gtkconv.c Sun Sep 29 02:30:18 2019 -0400
@@ -2246,7 +2246,7 @@
set_custom_icon_cb(GtkWidget *widget, PurpleContact *contact)
+ GtkFileChooserNative *win = NULL; /* Should not happen as menu item should be disabled. */
g_return_if_fail(contact != NULL);
@@ -2259,9 +2259,9 @@
win = pidgin_buddy_icon_chooser_new(GTK_WINDOW(toplevel),
custom_icon_sel_cb, contact);
g_object_set_data_full(G_OBJECT(contact), "buddy-icon-chooser", win,
- (GDestroyNotify)gtk_widget_destroy);
- gtk_widget_show_all(win);
+ (GDestroyNotify)g_object_unref); + gtk_native_dialog_show(GTK_NATIVE_DIALOG(win)); --- a/pidgin/gtkrequest.c Sun Sep 29 00:58:53 2019 -0400
+++ b/pidgin/gtkrequest.c Sun Sep 29 02:30:18 2019 -0400
@@ -44,7 +44,8 @@
+ /* May be GtkWidget or GtkNativeDialog */ @@ -2351,8 +2352,6 @@
- generic_response_start(data);
if (response != GTK_RESPONSE_ACCEPT) {
if (data->cbs[0] != NULL)
((PurpleRequestFileCb)data->cbs[0])(data->user_data, NULL);
@@ -2382,7 +2381,7 @@
PurpleRequestCommonParameters *cpar, void *user_data)
+ GtkFileChooserNative *filesel; const gchar *current_folder;
gboolean folder_set = FALSE;
@@ -2397,23 +2396,16 @@
data->u.file.savedialog = savedialog;
- filesel = gtk_file_chooser_dialog_new(
- title ? title : (savedialog ? _("Save File...")
- savedialog ? GTK_FILE_CHOOSER_ACTION_SAVE
- : GTK_FILE_CHOOSER_ACTION_OPEN,
- _("_Cancel"), GTK_RESPONSE_CANCEL,
- savedialog ? _("_Save")
- gtk_dialog_set_default_response(GTK_DIALOG(filesel), GTK_RESPONSE_ACCEPT);
+ filesel = gtk_file_chooser_native_new( + : (savedialog ? _("Save File...") : _("Open File...")), + savedialog ? GTK_FILE_CHOOSER_ACTION_SAVE + : GTK_FILE_CHOOSER_ACTION_OPEN, + savedialog ? _("_Save") : _("_Open"), _("_Cancel")); gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(filesel),
- pidgin_request_add_help(GTK_DIALOG(filesel), cpar);
if ((filename != NULL) && (*filename != '\0')) {
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(filesel), filename);
@@ -2448,10 +2440,13 @@
g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(filesel)), "response",
G_CALLBACK(file_ok_check_if_exists_cb), data);
+ /* FIXME: Not implemented for native dialogs. */ pidgin_auto_parent_window(filesel);
- gtk_widget_show(filesel);
+ gtk_native_dialog_show(GTK_NATIVE_DIALOG(filesel)); @@ -2462,7 +2457,7 @@
+ GtkFileChooserNative *dirsel; data = g_new0(PidginRequestData, 1);
data->type = PURPLE_REQUEST_FOLDER;
@@ -2473,16 +2468,9 @@
data->u.file.savedialog = FALSE;
- dirsel = gtk_file_chooser_dialog_new(
- title ? title : _("Select Folder..."),
- GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
- _("_Cancel"), GTK_RESPONSE_CANCEL,
- _("_OK"), GTK_RESPONSE_ACCEPT,
- gtk_dialog_set_default_response(GTK_DIALOG(dirsel), GTK_RESPONSE_ACCEPT);
- pidgin_request_add_help(GTK_DIALOG(dirsel), cpar);
+ dirsel = gtk_file_chooser_native_new( + title ? title : _("Select Folder..."), NULL, + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, _("_OK"), _("_Cancel")); if ((dirname != NULL) && (*dirname != '\0'))
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dirsel), dirname);
@@ -2491,9 +2479,12 @@
G_CALLBACK(file_ok_check_if_exists_cb), data);
+ /* FIXME: Not implemented for native dialogs. */ pidgin_auto_parent_window(dirsel);
- gtk_widget_show(dirsel);
+ gtk_native_dialog_show(GTK_NATIVE_DIALOG(dirsel)); @@ -2533,9 +2524,14 @@
- pidgin_window_detach_children(GTK_WINDOW(data->dialog));
- gtk_widget_destroy(data->dialog);
+ if (type == PURPLE_REQUEST_FILE || type == PURPLE_REQUEST_FOLDER) { + /* Will be a GtkNativeDialog, not GtkDialog. */ + g_object_unref(data->dialog); + pidgin_window_detach_children(GTK_WINDOW(data->dialog)); + gtk_widget_destroy(data->dialog); if (type == PURPLE_REQUEST_FIELDS)
purple_request_fields_destroy(data->u.multifield.fields);
@@ -2553,6 +2549,13 @@
purple_request_is_valid_ui_handle(data, NULL), NULL);
+ if (data->type == PURPLE_REQUEST_FILE || + data->type == PURPLE_REQUEST_FOLDER) { + /* Not a GtkWidget, but a GtkFileChooserNative. Eventually this function + * should not be needed, once we don't need to auto-parent. */ return GTK_WINDOW(data->dialog);
--- a/pidgin/gtksmiley-manager.c Sun Sep 29 00:58:53 2019 -0400
+++ b/pidgin/gtksmiley-manager.c Sun Sep 29 02:30:18 2019 -0400
@@ -180,14 +180,15 @@
edit_dialog_image_choose(GtkWidget *widget, gpointer _edit_dialog)
- GtkWidget *file_chooser;
+ GtkFileChooserNative *file_chooser; file_chooser = pidgin_buddy_icon_chooser_new(
GTK_WINDOW(gtk_widget_get_toplevel(widget)),
edit_dialog_image_choosen, _edit_dialog);
gtk_window_set_title(GTK_WINDOW(file_chooser), _("Custom Smiley"));
gtk_window_set_role(GTK_WINDOW(file_chooser),
"file-selector-custom-smiley");
- gtk_widget_show_all(file_chooser);
+ gtk_native_dialog_run(GTK_NATIVE_DIALOG(file_chooser)); + g_object_unref(file_chooser); --- a/pidgin/gtkstatusbox.c Sun Sep 29 00:58:53 2019 -0400
+++ b/pidgin/gtkstatusbox.c Sun Sep 29 02:30:18 2019 -0400
@@ -445,7 +445,7 @@
g_clear_object(&statusbox->buddy_icon);
g_clear_object(&statusbox->buddy_icon_hover);
- g_clear_pointer(&statusbox->buddy_icon_sel, gtk_widget_destroy);
+ g_clear_object(&statusbox->buddy_icon_sel); g_clear_pointer(&statusbox->icon_box_menu, gtk_widget_destroy);
@@ -1410,12 +1410,10 @@
choose_buddy_icon_cb(GtkWidget *w, PidginStatusBox *box)
- if (box->buddy_icon_sel) {
- gtk_window_present(GTK_WINDOW(box->buddy_icon_sel));
+ if (box->buddy_icon_sel == NULL) { box->buddy_icon_sel = pidgin_buddy_icon_chooser_new(GTK_WINDOW(gtk_widget_get_toplevel(w)), icon_choose_cb, box);
- gtk_widget_show_all(box->buddy_icon_sel);
+ gtk_native_dialog_show(GTK_NATIVE_DIALOG(box->buddy_icon_sel)); @@ -1430,7 +1428,7 @@
buddy_icon_set_cb(filename, box);
- box->buddy_icon_sel = NULL;
+ g_clear_object(&box->buddy_icon_sel); --- a/pidgin/gtkstatusbox.h Sun Sep 29 00:58:53 2019 -0400
+++ b/pidgin/gtkstatusbox.h Sun Sep 29 02:30:18 2019 -0400
@@ -98,7 +98,7 @@
PurpleImage *buddy_icon_img;
GdkPixbuf *buddy_icon_hover;
- GtkWidget *buddy_icon_sel;
+ GtkFileChooserNative *buddy_icon_sel; GtkWidget *icon_box_menu;
--- a/pidgin/gtkutils.c Sun Sep 29 00:58:53 2019 -0400
+++ b/pidgin/gtkutils.c Sun Sep 29 02:30:18 2019 -0400
@@ -108,7 +108,7 @@
- GtkWidget *icon_filesel;
+ GtkFileChooserNative *icon_filesel; @@ -1900,10 +1900,6 @@
char *filename, *current_folder;
if (response != GTK_RESPONSE_ACCEPT) {
- if (response == GTK_RESPONSE_CANCEL) {
- gtk_widget_destroy(dialog->icon_filesel);
- dialog->icon_filesel = NULL;
dialog->callback(NULL, dialog->data);
@@ -1920,7 +1916,6 @@
dialog->callback(filename, dialog->data);
- gtk_widget_destroy(dialog->icon_filesel);
@@ -1964,8 +1959,11 @@
-GtkWidget *pidgin_buddy_icon_chooser_new(GtkWindow *parent, void(*callback)(const char *, gpointer), gpointer data) {
+pidgin_buddy_icon_chooser_new(GtkWindow *parent, + void (*callback)(const char *, gpointer), struct _icon_chooser *dialog = g_new0(struct _icon_chooser, 1);
@@ -1976,13 +1974,9 @@
current_folder = purple_prefs_get_path(PIDGIN_PREFS_ROOT "/filelocations/last_icon_folder");
- dialog->icon_filesel = gtk_file_chooser_dialog_new(_("Buddy Icon"),
- GTK_FILE_CHOOSER_ACTION_OPEN,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
- gtk_dialog_set_default_response(GTK_DIALOG(dialog->icon_filesel), GTK_RESPONSE_ACCEPT);
+ dialog->icon_filesel = gtk_file_chooser_native_new( + _("Buddy Icon"), parent, GTK_FILE_CHOOSER_ACTION_OPEN, _("_Open"), if ((current_folder != NULL) && (*current_folder != '\0'))
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog->icon_filesel),
@@ -2006,11 +2000,6 @@
G_CALLBACK(icon_filesel_choose_cb), dialog);
icon_preview_change_cb(NULL, dialog);
- g_signal_connect(G_OBJECT(dialog->icon_filesel), "show",
- G_CALLBACK(winpidgin_ensure_onscreen), dialog->icon_filesel);
return dialog->icon_filesel;
--- a/pidgin/gtkutils.h Sun Sep 29 00:58:53 2019 -0400
+++ b/pidgin/gtkutils.h Sun Sep 29 02:30:18 2019 -0400
@@ -538,7 +538,9 @@
* Returns: (transfer full): The file dialog
-GtkWidget *pidgin_buddy_icon_chooser_new(GtkWindow *parent, void(*callback)(const char*,gpointer), gpointer data);
+GtkFileChooserNative *pidgin_buddy_icon_chooser_new( + GtkWindow *parent, void (*callback)(const char *, gpointer), * pidgin_convert_buddy_icon:
--- a/pidgin/gtkwhiteboard.c Sun Sep 29 00:58:53 2019 -0400
+++ b/pidgin/gtkwhiteboard.c Sun Sep 29 02:30:18 2019 -0400
@@ -499,28 +499,23 @@
PidginWhiteboard *gtkwb = _gtkwb;
+ GtkFileChooserNative *chooser; - dialog = gtk_file_chooser_dialog_new(
- _("Save File"), GTK_WINDOW(gtkwb), GTK_FILE_CHOOSER_ACTION_SAVE,
- _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Save"),
- GTK_RESPONSE_ACCEPT, NULL);
+ chooser = gtk_file_chooser_native_new(_("Save File"), GTK_WINDOW(gtkwb), + GTK_FILE_CHOOSER_ACTION_SAVE, + _("_Save"), _("_Cancel")); - gtk_file_chooser_set_do_overwrite_confirmation(
- GTK_FILE_CHOOSER(dialog), TRUE);
+ gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(chooser), + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(chooser), - gtk_file_chooser_set_current_name(
- GTK_FILE_CHOOSER(dialog), "whiteboard.png");
- result = gtk_dialog_run(GTK_DIALOG(dialog));
+ result = gtk_native_dialog_run(GTK_NATIVE_DIALOG(chooser)); if (result == GTK_RESPONSE_ACCEPT) {
- gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
- gtk_widget_destroy(dialog);
+ gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(chooser)); pixbuf = gdk_pixbuf_get_from_surface(
gtkwb->surface, 0, 0, gtkwb->width, gtkwb->height);
@@ -538,8 +533,9 @@
"couldn't be saved to \"%s\"", filename);
- } else if (result == GTK_RESPONSE_CANCEL)
- gtk_widget_destroy(dialog);
+ g_object_unref(chooser);