pidgin/pidgin

Convert to GtkFileChooserNative.

2019-09-29, Elliott Sales de Andrade
411f3df51bcd
Parents 51c9575bbdd2
Children 4afa2de42dc7
Convert to GtkFileChooserNative.

This produces a more-native dialog on Windows and macOS, plus it enables
portals in Flatpak so we don't need to request special permission to
access the file system.
--- 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_hbox;
GtkWidget *icon_check;
GtkWidget *icon_entry;
- GtkWidget *icon_filesel;
+ GtkFileChooserNative *icon_filesel;
GtkWidget *icon_preview;
GtkWidget *icon_text;
PurpleImage *icon_img;
@@ -340,14 +340,14 @@
set_dialog_icon(dialog, data, len, g_strdup(filename));
}
- dialog->icon_filesel = NULL;
+ g_clear_object(&dialog->icon_filesel);
}
static void
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));
}
static void
@@ -1258,8 +1258,7 @@
if (dialog->icon_img)
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 @@
static void
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");
if (win == NULL) {
win = pidgin_buddy_icon_chooser_new(NULL, set_node_custom_icon_cb,
node);
g_object_set_data_full(G_OBJECT(node), "buddy-icon-chooser", win,
- (GDestroyNotify)gtk_widget_destroy);
- }
- gtk_widget_show_all(win);
+ g_object_unref);
+ }
+ gtk_native_dialog_show(GTK_NATIVE_DIALOG(win));
}
static void
--- 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 @@
static void
set_custom_icon_cb(GtkWidget *widget, PurpleContact *contact)
{
- GtkWidget *win = NULL;
+ 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));
}
static void
--- 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 @@
PurpleRequestType type;
void *user_data;
- GtkWidget *dialog;
+ /* May be GtkWidget or GtkNativeDialog */
+ gpointer dialog;
GtkWidget *ok_button;
@@ -2351,8 +2352,6 @@
{
gchar *current_folder;
- 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)
{
PidginRequestData *data;
- GtkWidget *filesel;
+ GtkFileChooserNative *filesel;
#ifdef _WIN32
const gchar *current_folder;
gboolean folder_set = FALSE;
@@ -2397,23 +2396,16 @@
data->cbs[1] = ok_cb;
data->u.file.savedialog = savedialog;
- filesel = gtk_file_chooser_dialog_new(
- title ? title : (savedialog ? _("Save File...")
- : _("Open File...")),
- NULL,
- savedialog ? GTK_FILE_CHOOSER_ACTION_SAVE
- : GTK_FILE_CHOOSER_ACTION_OPEN,
- _("_Cancel"), GTK_RESPONSE_CANCEL,
- savedialog ? _("_Save")
- : _("_Open"),
- GTK_RESPONSE_ACCEPT,
- NULL);
- gtk_dialog_set_default_response(GTK_DIALOG(filesel), GTK_RESPONSE_ACCEPT);
+ filesel = gtk_file_chooser_native_new(
+ title ? title
+ : (savedialog ? _("Save File...") : _("Open File...")),
+ NULL,
+ 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),
TRUE);
- pidgin_request_add_help(GTK_DIALOG(filesel), cpar);
-
if ((filename != NULL) && (*filename != '\0')) {
if (savedialog)
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);
+#if 0
+ /* FIXME: Not implemented for native dialogs. */
pidgin_auto_parent_window(filesel);
+#endif
data->dialog = filesel;
- gtk_widget_show(filesel);
+ gtk_native_dialog_show(GTK_NATIVE_DIALOG(filesel));
return (void *)data;
}
@@ -2462,7 +2457,7 @@
void *user_data)
{
PidginRequestData *data;
- GtkWidget *dirsel;
+ GtkFileChooserNative *dirsel;
data = g_new0(PidginRequestData, 1);
data->type = PURPLE_REQUEST_FOLDER;
@@ -2473,16 +2468,9 @@
data->cbs[1] = ok_cb;
data->u.file.savedialog = FALSE;
- dirsel = gtk_file_chooser_dialog_new(
- title ? title : _("Select Folder..."),
- NULL,
- GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
- _("_Cancel"), GTK_RESPONSE_CANCEL,
- _("_OK"), GTK_RESPONSE_ACCEPT,
- NULL);
- 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);
data->dialog = dirsel;
+#if 0
+ /* FIXME: Not implemented for native dialogs. */
pidgin_auto_parent_window(dirsel);
-
- gtk_widget_show(dirsel);
+#endif
+
+ gtk_native_dialog_show(GTK_NATIVE_DIALOG(dirsel));
return (void *)data;
}
@@ -2533,9 +2524,14 @@
g_free(data->cbs);
- 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);
+ } else {
+ 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 @@
g_return_val_if_fail(
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 NULL;
+ }
+
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 @@
static void
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 @@
static void
choose_buddy_icon_cb(GtkWidget *w, PidginStatusBox *box)
{
- if (box->buddy_icon_sel) {
- gtk_window_present(GTK_WINDOW(box->buddy_icon_sel));
- } else {
+ 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));
}
static void
@@ -1430,7 +1428,7 @@
buddy_icon_set_cb(filename, box);
}
- box->buddy_icon_sel = NULL;
+ g_clear_object(&box->buddy_icon_sel);
}
static void
--- 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;
GdkPixbuf *buddy_icon_hover;
- GtkWidget *buddy_icon_sel;
+ GtkFileChooserNative *buddy_icon_sel;
GtkWidget *icon;
GtkWidget *icon_box;
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 @@
} PidginCompletionData;
struct _icon_chooser {
- GtkWidget *icon_filesel;
+ GtkFileChooserNative *icon_filesel;
GtkWidget *icon_preview;
GtkWidget *icon_text;
@@ -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;
if (dialog->callback)
dialog->callback(NULL, dialog->data);
g_free(dialog);
@@ -1920,7 +1916,6 @@
if (dialog->callback)
dialog->callback(filename, dialog->data);
- gtk_widget_destroy(dialog->icon_filesel);
g_free(filename);
g_free(dialog);
}
@@ -1964,8 +1959,11 @@
g_free(markup);
}
-
-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),
+ gpointer data)
+{
struct _icon_chooser *dialog = g_new0(struct _icon_chooser, 1);
GtkWidget *vbox;
@@ -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"),
- parent,
- GTK_FILE_CHOOSER_ACTION_OPEN,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
- NULL);
- 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"),
+ _("_Cancel"));
if ((current_folder != NULL) && (*current_folder != '\0'))
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog->icon_filesel),
current_folder);
@@ -2006,11 +2000,6 @@
G_CALLBACK(icon_filesel_choose_cb), dialog);
icon_preview_change_cb(NULL, dialog);
-#ifdef _WIN32
- g_signal_connect(G_OBJECT(dialog->icon_filesel), "show",
- G_CALLBACK(winpidgin_ensure_onscreen), dialog->icon_filesel);
-#endif
-
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),
+ gpointer data);
/**
* 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;
GdkPixbuf *pixbuf;
- GtkWidget *dialog;
+ GtkFileChooserNative *chooser;
int result;
- 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),
+ TRUE);
+ gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(chooser),
+ "whiteboard.png");
- 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) {
gboolean success;
gchar *filename =
- 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);
}
g_free(filename);
- } else if (result == GTK_RESPONSE_CANCEL)
- gtk_widget_destroy(dialog);
+ }
+
+ g_object_unref(chooser);
}
static void