From 040dc0d641878ecea57bf0354f263ac20f197494 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3nio=20Fernandes?= Date: Sat, 20 Apr 2024 11:51:51 +0100 Subject: [PATCH] portal: Introduce implementation stub From now on nautilus claims to implement the FileChooser portal. For now it's a lie. But the next few commits will make it true. --- data/meson.build | 10 +++++ data/nautilus.portal.in | 4 ++ src/meson.build | 2 + src/nautilus-application.c | 15 ++++++++ src/nautilus-portal.c | 79 ++++++++++++++++++++++++++++++++++++++ src/nautilus-portal.h | 26 +++++++++++++ 6 files changed, 136 insertions(+) create mode 100644 data/nautilus.portal.in create mode 100644 src/nautilus-portal.c create mode 100644 src/nautilus-portal.h diff --git a/data/meson.build b/data/meson.build index 27438b5fe..41d3095df 100644 --- a/data/meson.build +++ b/data/meson.build @@ -146,5 +146,15 @@ if appstreamcli.found() ) endif +portal_impl_conf = configuration_data() +portal_impl_conf.set('appid', application_id) + +configure_file( + input: 'nautilus.portal.in', + output: 'nautilus.portal', + configuration: portal_impl_conf, + install_dir: datadir / 'xdg-desktop-portal' / 'portals', +) + subdir('ontology') subdir('tracker') diff --git a/data/nautilus.portal.in b/data/nautilus.portal.in new file mode 100644 index 000000000..5e861cb1f --- /dev/null +++ b/data/nautilus.portal.in @@ -0,0 +1,4 @@ +[portal] +DBusName=@appid@ +Interfaces=org.freedesktop.impl.portal.FileChooser; +UseIn=gnome \ No newline at end of file diff --git a/src/meson.build b/src/meson.build index 61d958422..ce98360a0 100644 --- a/src/meson.build +++ b/src/meson.build @@ -210,6 +210,8 @@ libnautilus_sources = [ 'nautilus-module.h', 'nautilus-monitor.c', 'nautilus-monitor.h', + 'nautilus-portal.c', + 'nautilus-portal.h', 'nautilus-progress-info.c', 'nautilus-progress-info.h', 'nautilus-progress-info-manager.c', diff --git a/src/nautilus-application.c b/src/nautilus-application.c index 93775405c..cec1312bb 100644 --- a/src/nautilus-application.c +++ b/src/nautilus-application.c @@ -54,6 +54,7 @@ #include "nautilus-global-preferences.h" #include "nautilus-icon-info.h" #include "nautilus-module.h" +#include "nautilus-portal.h" #include "nautilus-preferences-window.h" #include "nautilus-previewer.h" #include "nautilus-progress-persistence-handler.h" @@ -73,6 +74,7 @@ typedef struct NautilusProgressPersistenceHandler *progress_handler; NautilusDBusManager *dbus_manager; NautilusFreedesktopDBus *fdb_manager; + NautilusPortal *portal_implementation; NautilusBookmarkList *bookmark_list; @@ -1203,6 +1205,13 @@ nautilus_application_dbus_register (GApplication *app, return FALSE; } + priv->portal_implementation = nautilus_portal_new (); + if (g_strcmp0 (g_getenv ("RUNNING_TESTS"), "TRUE") != 0 && + !nautilus_portal_register (priv->portal_implementation, connection, error)) + { + return FALSE; + } + priv->search_provider = nautilus_shell_search_provider_new (); if (!nautilus_shell_search_provider_register (priv->search_provider, connection, error)) { @@ -1235,6 +1244,12 @@ nautilus_application_dbus_unregister (GApplication *app, g_clear_object (&priv->fdb_manager); } + if (priv->portal_implementation != NULL) + { + nautilus_portal_unregister (priv->portal_implementation); + g_clear_object (&priv->portal_implementation); + } + if (priv->search_provider) { nautilus_shell_search_provider_unregister (priv->search_provider); diff --git a/src/nautilus-portal.c b/src/nautilus-portal.c new file mode 100644 index 000000000..50cb198be --- /dev/null +++ b/src/nautilus-portal.c @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2024 GNOME Foundation Inc. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + * Original Author: António Fernandes + */ + +#define G_LOG_DOMAIN "nautilus-dbus" + +#include "nautilus-portal.h" + +#include +#include +#include + +#define DESKTOP_PORTAL_OBJECT_PATH "/org/freedesktop/portal/desktop" + +struct _NautilusPortal +{ + GObject parent; + + XdpImplFileChooser *implementation_skeleton; +}; + +G_DEFINE_TYPE (NautilusPortal, nautilus_portal, G_TYPE_OBJECT); + +static void +nautilus_portal_dispose (GObject *object) +{ + NautilusPortal *self = (NautilusPortal *) object; + + g_signal_handlers_disconnect_by_data (self->implementation_skeleton, self); + g_clear_object (&self->implementation_skeleton); + + G_OBJECT_CLASS (nautilus_portal_parent_class)->dispose (object); +} + +static void +nautilus_portal_class_init (NautilusPortalClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = nautilus_portal_dispose; +} + +static void +nautilus_portal_init (NautilusPortal *self) +{ + self->implementation_skeleton = xdp_impl_file_chooser_skeleton_new (); +} + +NautilusPortal * +nautilus_portal_new (void) +{ + return g_object_new (NAUTILUS_TYPE_PORTAL, NULL); +} + +gboolean +nautilus_portal_register (NautilusPortal *self, + GDBusConnection *connection, + GError **error) +{ + if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (self->implementation_skeleton), + connection, + DESKTOP_PORTAL_OBJECT_PATH, + error)) + { + return FALSE; + } + + return TRUE; +} + +void +nautilus_portal_unregister (NautilusPortal *self) +{ + g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (self->implementation_skeleton)); +} diff --git a/src/nautilus-portal.h b/src/nautilus-portal.h new file mode 100644 index 000000000..939383b35 --- /dev/null +++ b/src/nautilus-portal.h @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2024 GNOME Foundation Inc. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + * Original Author: António Fernandes + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +#define NAUTILUS_TYPE_PORTAL (nautilus_portal_get_type()) + +G_DECLARE_FINAL_TYPE (NautilusPortal, nautilus_portal, NAUTILUS, PORTAL, GObject) + +NautilusPortal * nautilus_portal_new (void); + +void nautilus_portal_unregister (NautilusPortal *self); +gboolean nautilus_portal_register (NautilusPortal *self, + GDBusConnection *connection, + GError **error); + +G_END_DECLS