diff --git a/.gitignore b/.gitignore index 4c671a1..45573d3 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,4 @@ /xdg-desktop-portal-1.14.6.tar.xz /xdg-desktop-portal-1.15.0.tar.xz /xdg-desktop-portal-1.16.0.tar.xz +/xdg-desktop-portal-1.17.0.tar.xz diff --git a/985.patch b/985.patch deleted file mode 100644 index 86ed7e3..0000000 --- a/985.patch +++ /dev/null @@ -1,305 +0,0 @@ -From bbcf5110d83147a552ad40841a733b49633e9208 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jonas=20=C3=85dahl?= -Date: Mon, 13 Mar 2023 12:38:17 +0100 -Subject: [PATCH] portal-impl: Only return found implementation if it launched - -If no portal backend for a given interface is found, a fallback is -always tried anyway, despite that fallback not being listed as -compatible with the current desktop environment. - -Sometimes it's good that a fallback is returned; e.g. the -xdg-desktop-portal-gtk file chooser backend is technically usable -anywhere, however, some backends might be specifically designed to only -work in a specific desktop environment, e.g. xdg-desktop-portal-gnome. - -In order to avoid creating portals with non-functional backends, make -sure it's possible to create a proxy object for the interface and D-Bus -name, and that it launched successfully (i.e. has no name owner after -creating the proxy). ---- - src/portal-impl.c | 67 +++++++++++++++++++++++++++++++++++++--- - src/portal-impl.h | 5 ++- - src/xdg-desktop-portal.c | 51 ++++++++++++++++++++---------- - 3 files changed, 101 insertions(+), 22 deletions(-) - -diff --git a/src/portal-impl.c b/src/portal-impl.c -index a55ba9e5..0b535d1e 100644 ---- a/src/portal-impl.c -+++ b/src/portal-impl.c -@@ -29,9 +29,12 @@ - #include - #include - -+#include "xdp-utils.h" -+ - static void - portal_implementation_free (PortalImplementation *impl) - { -+ g_clear_pointer (&impl->dummy_proxies, g_hash_table_unref); - g_free (impl->source); - g_free (impl->dbus_name); - g_strfreev (impl->interfaces); -@@ -55,6 +58,10 @@ register_portal (const char *path, gboolean opt_verbose, GError **error) - if (!g_key_file_load_from_file (keyfile, path, G_KEY_FILE_NONE, error)) - return FALSE; - -+ impl->dummy_proxies = g_hash_table_new_full (g_str_hash, -+ g_str_equal, -+ g_free, -+ g_object_unref); - impl->source = g_path_get_basename (path); - impl->dbus_name = g_key_file_get_string (keyfile, "portal", "DBusName", error); - if (impl->dbus_name == NULL) -@@ -198,8 +205,44 @@ load_installed_portals (gboolean opt_verbose) - implementations = g_list_sort (implementations, sort_impl_by_use_in_and_name); - } - -+static gboolean -+create_dummy_proxy (PortalImplementation *impl, -+ GDBusConnection *connection, -+ const char *interface, -+ GError **error) -+{ -+ g_autoptr(GDBusProxy) proxy = NULL; -+ -+ g_debug ("Creating dummy proxy for %s on %s", interface, impl->dbus_name); -+ proxy = g_dbus_proxy_new_sync (connection, -+ G_DBUS_PROXY_FLAGS_NONE, -+ NULL, -+ impl->dbus_name, -+ DESKTOP_PORTAL_OBJECT_PATH, -+ interface, -+ NULL, -+ error); -+ if (!proxy) -+ return FALSE; -+ -+ if (!g_dbus_proxy_get_name_owner (proxy)) -+ { -+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, -+ "Proxy has no owner"); -+ return FALSE; -+ } -+ -+ g_debug ("Dummy proxy created"); -+ -+ g_hash_table_insert (impl->dummy_proxies, -+ g_strdup (interface), -+ g_steal_pointer (&proxy)); -+ return TRUE; -+} -+ - PortalImplementation * --find_portal_implementation (const char *interface) -+find_portal_implementation (GDBusConnection *connection, -+ const char *interface) - { - const char *desktops_str = g_getenv ("XDG_CURRENT_DESKTOP"); - g_auto(GStrv) desktops = NULL; -@@ -216,15 +259,23 @@ find_portal_implementation (const char *interface) - for (l = implementations; l != NULL; l = l->next) - { - PortalImplementation *impl = l->data; -+ g_autoptr(GError) error = NULL; - - if (!g_strv_contains ((const char **)impl->interfaces, interface)) - continue; - -- if (g_strv_case_contains ((const char **)impl->use_in, desktops[i])) -+ if (!g_strv_case_contains ((const char **)impl->use_in, desktops[i])) -+ continue; -+ -+ if (!create_dummy_proxy (impl, connection, interface, &error)) - { -- g_debug ("Using %s for %s in %s", impl->source, interface, desktops[i]); -- return impl; -+ g_debug ("Failed to create dummy proxy on %s for %s: %s", -+ impl->dbus_name, interface, error->message); -+ continue; - } -+ -+ g_debug ("Using %s for %s in %s", impl->source, interface, desktops[i]); -+ return impl; - } - } - -@@ -232,10 +283,18 @@ find_portal_implementation (const char *interface) - for (l = implementations; l != NULL; l = l->next) - { - PortalImplementation *impl = l->data; -+ g_autoptr(GError) error = NULL; - - if (!g_strv_contains ((const char **)impl->interfaces, interface)) - continue; - -+ if (!create_dummy_proxy (impl, connection, interface, &error)) -+ { -+ g_debug ("Failed to create dummy fallback proxy on %s for %s: %s", -+ impl->dbus_name, interface, error->message); -+ continue; -+ } -+ - g_debug ("Falling back to %s for %s", impl->source, interface); - return impl; - } -diff --git a/src/portal-impl.h b/src/portal-impl.h -index a5d792d3..63705a7b 100644 ---- a/src/portal-impl.h -+++ b/src/portal-impl.h -@@ -23,6 +23,7 @@ - #define __PORTAL_IMPL_H__ - - #include -+#include - - typedef struct { - char *source; -@@ -30,10 +31,12 @@ typedef struct { - char **interfaces; - char **use_in; - int priority; -+ GHashTable *dummy_proxies; - } PortalImplementation; - - void load_installed_portals (gboolean opt_verbose); --PortalImplementation *find_portal_implementation (const char *interface); -+PortalImplementation *find_portal_implementation (GDBusConnection *connection, -+ const char *interface); - GPtrArray *find_all_portal_implementations (const char *interface); - - #endif /* __PORTAL_IMPL_H__ */ -diff --git a/src/xdg-desktop-portal.c b/src/xdg-desktop-portal.c -index 065ce502..04f4081e 100644 ---- a/src/xdg-desktop-portal.c -+++ b/src/xdg-desktop-portal.c -@@ -237,7 +237,8 @@ on_bus_acquired (GDBusConnection *connection, - init_document_proxy (connection); - init_permission_store (connection); - -- implementation = find_portal_implementation ("org.freedesktop.impl.portal.Lockdown"); -+ implementation = find_portal_implementation (connection, -+ "org.freedesktop.impl.portal.Lockdown"); - if (implementation != NULL) - lockdown = xdp_dbus_impl_lockdown_proxy_new_sync (connection, - G_DBUS_PROXY_FLAGS_NONE, -@@ -259,40 +260,48 @@ on_bus_acquired (GDBusConnection *connection, - export_portal_implementation (connection, settings_create (connection, impls)); - g_ptr_array_free (impls, TRUE); - -- implementation = find_portal_implementation ("org.freedesktop.impl.portal.FileChooser"); -+ implementation = find_portal_implementation (connection, -+ "org.freedesktop.impl.portal.FileChooser"); - if (implementation != NULL) - export_portal_implementation (connection, - file_chooser_create (connection, implementation->dbus_name, lockdown)); - -- implementation = find_portal_implementation ("org.freedesktop.impl.portal.AppChooser"); -+ implementation = find_portal_implementation (connection, -+ "org.freedesktop.impl.portal.AppChooser"); - if (implementation != NULL) - export_portal_implementation (connection, - open_uri_create (connection, implementation->dbus_name, lockdown)); - -- implementation = find_portal_implementation ("org.freedesktop.impl.portal.Print"); -+ implementation = find_portal_implementation (connection, -+ "org.freedesktop.impl.portal.Print"); - if (implementation != NULL) - export_portal_implementation (connection, - print_create (connection, implementation->dbus_name, lockdown)); - -- implementation = find_portal_implementation ("org.freedesktop.impl.portal.Notification"); -+ implementation = find_portal_implementation (connection, -+ "org.freedesktop.impl.portal.Notification"); - if (implementation != NULL) - export_portal_implementation (connection, - notification_create (connection, implementation->dbus_name)); - -- implementation = find_portal_implementation ("org.freedesktop.impl.portal.Inhibit"); -+ implementation = find_portal_implementation (connection, -+ "org.freedesktop.impl.portal.Inhibit"); - if (implementation != NULL) - export_portal_implementation (connection, - inhibit_create (connection, implementation->dbus_name)); - -- implementation = find_portal_implementation ("org.freedesktop.impl.portal.Access"); -- implementation2 = find_portal_implementation ("org.freedesktop.impl.portal.Screenshot"); -+ implementation = find_portal_implementation (connection, -+ "org.freedesktop.impl.portal.Access"); -+ implementation2 = find_portal_implementation (connection, -+ "org.freedesktop.impl.portal.Screenshot"); - if (implementation != NULL && implementation2 != NULL) - export_portal_implementation (connection, - screenshot_create (connection, - implementation->dbus_name, - implementation2->dbus_name)); - -- implementation2 = find_portal_implementation ("org.freedesktop.impl.portal.Background"); -+ implementation2 = find_portal_implementation (connection, -+ "org.freedesktop.impl.portal.Background"); - if (implementation != NULL) - { - export_portal_implementation (connection, -@@ -313,47 +322,55 @@ on_bus_acquired (GDBusConnection *connection, - implementation->dbus_name, - implementation2->dbus_name)); - -- implementation2 = find_portal_implementation ("org.freedesktop.impl.portal.Wallpaper"); -+ implementation2 = find_portal_implementation (connection, -+ "org.freedesktop.impl.portal.Wallpaper"); - if (implementation != NULL && implementation2 != NULL) - export_portal_implementation (connection, - wallpaper_create (connection, - implementation->dbus_name, - implementation2->dbus_name)); - -- implementation = find_portal_implementation ("org.freedesktop.impl.portal.Account"); -+ implementation = find_portal_implementation (connection, -+ "org.freedesktop.impl.portal.Account"); - if (implementation != NULL) - export_portal_implementation (connection, - account_create (connection, implementation->dbus_name)); - -- implementation = find_portal_implementation ("org.freedesktop.impl.portal.Email"); -+ implementation = find_portal_implementation (connection, -+ "org.freedesktop.impl.portal.Email"); - if (implementation != NULL) - export_portal_implementation (connection, - email_create (connection, implementation->dbus_name)); - -- implementation = find_portal_implementation ("org.freedesktop.impl.portal.Secret"); -+ implementation = find_portal_implementation (connection, -+ "org.freedesktop.impl.portal.Secret"); - if (implementation != NULL) - export_portal_implementation (connection, - secret_create (connection, implementation->dbus_name)); - -- implementation = find_portal_implementation ("org.freedesktop.impl.portal.GlobalShortcuts"); -+ implementation = find_portal_implementation (connection, -+ "org.freedesktop.impl.portal.GlobalShortcuts"); - if (implementation != NULL) - export_portal_implementation (connection, - global_shortcuts_create (connection, implementation->dbus_name)); - - #ifdef HAVE_GLIB_2_66 -- implementation = find_portal_implementation ("org.freedesktop.impl.portal.DynamicLauncher"); -+ implementation = find_portal_implementation (connection, -+ "org.freedesktop.impl.portal.DynamicLauncher"); - if (implementation != NULL) - export_portal_implementation (connection, - dynamic_launcher_create (connection, implementation->dbus_name)); - #endif - - #ifdef HAVE_PIPEWIRE -- implementation = find_portal_implementation ("org.freedesktop.impl.portal.ScreenCast"); -+ implementation = find_portal_implementation (connection, -+ "org.freedesktop.impl.portal.ScreenCast"); - if (implementation != NULL) - export_portal_implementation (connection, - screen_cast_create (connection, implementation->dbus_name)); - -- implementation = find_portal_implementation ("org.freedesktop.impl.portal.RemoteDesktop"); -+ implementation = find_portal_implementation (connection, -+ "org.freedesktop.impl.portal.RemoteDesktop"); - if (implementation != NULL) - export_portal_implementation (connection, - remote_desktop_create (connection, implementation->dbus_name)); diff --git a/sources b/sources index 7e571d6..4121dd1 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (xdg-desktop-portal-1.16.0.tar.xz) = f7e7e96d3a6757901fbc4c0310aac0afbf37882c279a2859e06f63528049cd9b50dd2d55445d1386f03f62557c1a2ec81d4ee081200367d6269d2dffc75f0912 +SHA512 (xdg-desktop-portal-1.17.0.tar.xz) = 1c5e95664bef8b977bdfa1dca001ec7853cc30e8327dbfeee6a32490e5763950c5d10777ff456605c0f6706932318a06e82f51423ecf60f985b9bb00e043ef3d diff --git a/xdg-desktop-portal.spec b/xdg-desktop-portal.spec index 083a4fd..9304ef6 100644 --- a/xdg-desktop-portal.spec +++ b/xdg-desktop-portal.spec @@ -4,17 +4,13 @@ %global pipewire_version 0.2.90 Name: xdg-desktop-portal -Version: 1.16.0 +Version: 1.17.0 Release: %autorelease Summary: Portal frontend service to flatpak License: LGPLv2+ URL: https://github.com/flatpak/xdg-desktop-portal/ Source0: https://github.com/flatpak/xdg-desktop-portal/releases/download/%{version}/%{name}-%{version}.tar.xz -# https://bugzilla.redhat.com/show_bug.cgi?id=2176759 -# https://github.com/flatpak/xdg-desktop-portal/pull/985 -# Help fix apps hanging on start in KDE with GNOME portal installed -Patch0: 985.patch BuildRequires: gcc BuildRequires: gettext @@ -29,6 +25,10 @@ BuildRequires: pkgconfig(libgeoclue-2.0) >= %{geoclue_version} BuildRequires: pkgconfig(libpipewire-0.3) >= %{pipewire_version} BuildRequires: pkgconfig(libportal) BuildRequires: pkgconfig(libsystemd) +BuildRequires: python3-dbusmock +BuildRequires: python3-gobject-base +BuildRequires: python3-pytest +BuildRequires: python3-pytest-xdist BuildRequires: /usr/bin/xmlto Requires: dbus