summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Borges <felipeborges@gnome.org>2020-08-24 12:24:55 +0200
committerOndrej Holy <oholy@redhat.com>2020-11-18 15:30:13 +0000
commitece6b8257047bfec13877a61d71d02bfa7384af0 (patch)
tree0b7ad3c570e245468b831cc09cda009bdb3a664f
parent7cab1cd76209a65e8ae86507dd07c78aa2f0b15a (diff)
downloadnautilus-ece6b8257047bfec13877a61d71d02bfa7384af0.tar.gz
files-view: Use xdg-desktop-portal for setting Wallpaper
If libportal was found during build, we can use libportal to set the Wallpaper. Otherwise, we fallback to the old Nautilus behavior of directly copying the image and updating the gsetting. Fixes #795
-rw-r--r--src/nautilus-files-view.c104
1 files changed, 80 insertions, 24 deletions
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
index b22bd8408..678ad98b6 100644
--- a/src/nautilus-files-view.c
+++ b/src/nautilus-files-view.c
@@ -90,6 +90,11 @@
#include "nautilus-window.h"
#include "nautilus-tracker-utilities.h"
+#ifdef HAVE_LIBPORTAL
+#include <libportal/portal.h>
+#include <libportal/portal-gtk3.h>
+#endif
+
/* Minimum starting update inverval */
#define UPDATE_INTERVAL_MIN 100
/* Maximum update interval */
@@ -6691,6 +6696,76 @@ can_set_wallpaper (GList *selection)
return TRUE;
}
+#ifdef HAVE_LIBPORTAL
+static void
+set_wallpaper_with_portal_cb (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ XdpPortal *portal = XDP_PORTAL (source);
+ g_autoptr (GError) error = NULL;
+
+ if (!xdp_portal_set_wallpaper_finish (portal, result, &error)
+ && !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ {
+ g_warning ("Failed to set wallpaper via portal: %s", error->message);
+ }
+}
+
+static void
+set_wallpaper_with_portal (NautilusFile *file,
+ gpointer user_data)
+{
+ g_autoptr (XdpPortal) portal = NULL;
+ g_autofree gchar *uri = NULL;
+ XdpParent *parent = NULL;
+ GtkWidget *toplevel;
+
+ portal = xdp_portal_new ();
+ toplevel = gtk_widget_get_ancestor (GTK_WIDGET (user_data), GTK_TYPE_WINDOW);
+ parent = xdp_parent_new_gtk (GTK_WINDOW (toplevel));
+ uri = nautilus_file_get_uri (file);
+
+ xdp_portal_set_wallpaper (portal,
+ parent,
+ uri,
+ XDP_WALLPAPER_FLAG_BACKGROUND | XDP_WALLPAPER_FLAG_PREVIEW,
+ NULL,
+ set_wallpaper_with_portal_cb,
+ NULL);
+ xdp_parent_free (parent);
+}
+#endif /* HAVE_LIBPORTAL */
+
+static void
+set_wallpaper_fallback (NautilusFile *file,
+ gpointer user_data)
+{
+ char *target_uri;
+ GList *uris;
+ GFile *parent;
+ GFile *target;
+
+ /* Copy the item to Pictures/Wallpaper (internationalized) since it may be
+ * remote. Then set it as the current wallpaper. */
+ parent = g_file_new_for_path (g_get_user_special_dir (G_USER_DIRECTORY_PICTURES));
+ target = g_file_get_child (parent, _("Wallpapers"));
+ g_object_unref (parent);
+ g_file_make_directory_with_parents (target, NULL, NULL);
+ target_uri = g_file_get_uri (target);
+ g_object_unref (target);
+ uris = g_list_prepend (NULL, nautilus_file_get_uri (file));
+ nautilus_file_operations_copy_move (uris,
+ target_uri,
+ GDK_ACTION_COPY,
+ GTK_WIDGET (user_data),
+ NULL,
+ wallpaper_copy_done_callback,
+ NULL);
+ g_free (target_uri);
+ g_list_free_full (uris, g_free);
+}
+
static void
action_set_as_wallpaper (GSimpleAction *action,
GVariant *state,
@@ -6698,39 +6773,20 @@ action_set_as_wallpaper (GSimpleAction *action,
{
g_autolist (NautilusFile) selection = NULL;
- /* Copy the item to Pictures/Wallpaper (internationalized) since it may be
- * remote. Then set it as the current wallpaper. */
-
g_assert (NAUTILUS_IS_FILES_VIEW (user_data));
selection = nautilus_view_get_selection (user_data);
-
if (can_set_wallpaper (selection))
{
NautilusFile *file;
- char *target_uri;
- GList *uris;
- GFile *parent;
- GFile *target;
file = NAUTILUS_FILE (selection->data);
- parent = g_file_new_for_path (g_get_user_special_dir (G_USER_DIRECTORY_PICTURES));
- target = g_file_get_child (parent, _("Wallpapers"));
- g_object_unref (parent);
- g_file_make_directory_with_parents (target, NULL, NULL);
- target_uri = g_file_get_uri (target);
- g_object_unref (target);
- uris = g_list_prepend (NULL, nautilus_file_get_uri (file));
- nautilus_file_operations_copy_move (uris,
- target_uri,
- GDK_ACTION_COPY,
- GTK_WIDGET (user_data),
- NULL,
- wallpaper_copy_done_callback,
- NULL);
- g_free (target_uri);
- g_list_free_full (uris, g_free);
+#ifdef HAVE_LIBPORTAL
+ set_wallpaper_with_portal (file, user_data);
+#else
+ set_wallpaper_fallback (file, user_data);
+#endif
}
}