forked from pool/xdg-desktop-portal
Accepting request 1112199 from GNOME:Factory
OBS-URL: https://build.opensuse.org/request/show/1112199 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/xdg-desktop-portal?expand=0&rev=35
This commit is contained in:
commit
2fc7bfafba
@ -1,305 +0,0 @@
|
||||
From bbcf5110d83147a552ad40841a733b49633e9208 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
|
||||
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 a55ba9e55..0b535d1e0 100644
|
||||
--- a/src/portal-impl.c
|
||||
+++ b/src/portal-impl.c
|
||||
@@ -29,9 +29,12 @@
|
||||
#include <glib.h>
|
||||
#include <gio/gio.h>
|
||||
|
||||
+#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 a5d792d38..63705a7b3 100644
|
||||
--- a/src/portal-impl.h
|
||||
+++ b/src/portal-impl.h
|
||||
@@ -23,6 +23,7 @@
|
||||
#define __PORTAL_IMPL_H__
|
||||
|
||||
#include <glib.h>
|
||||
+#include <gio/gio.h>
|
||||
|
||||
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 065ce502c..04f4081ea 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));
|
BIN
xdg-desktop-portal-1.16.0.tar.xz
(Stored with Git LFS)
BIN
xdg-desktop-portal-1.16.0.tar.xz
(Stored with Git LFS)
Binary file not shown.
3
xdg-desktop-portal-1.18.0.tar.xz
Normal file
3
xdg-desktop-portal-1.18.0.tar.xz
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:5ea35a6420a98b598c83355fc19feaea8ba999149641bf84079b0c572b00f5bd
|
||||
size 260788
|
@ -1,3 +1,100 @@
|
||||
-------------------------------------------------------------------
|
||||
Mon Sep 18 19:45:54 UTC 2023 - Bjørn Lie <bjorn.lie@gmail.com>
|
||||
|
||||
- Update to version 1.18.0:
|
||||
+ Highlights:
|
||||
- A new config-based portal matching mechanism that gives
|
||||
preciser control over which portal backends are picked for
|
||||
each portal.
|
||||
- New portals: Clipboard and Input Capture.
|
||||
- The settings portal now documents an 'accent-color' key.
|
||||
+ New portal APIs:
|
||||
- Introduce a new Clipboard portal. This portal extends the
|
||||
Remote Desktop portal by adding support for sharing clipboard
|
||||
between remote machines.
|
||||
- Introduce a new Input Capture portal. This portal adds
|
||||
mechanisms for taking control of input devices. The primary
|
||||
usage model is centered around the InputLeap and Synergy use
|
||||
cases, where local devices are used to control remote
|
||||
displays.
|
||||
- Add an "accept-label" option the the Print portal. This lets
|
||||
apps suggest a proper label to the print operation.
|
||||
- Document a new 'accent-color' key in the Settings portal.
|
||||
This key represents an arbitrary color in sRGB colorspace.
|
||||
How implementations of the portal provide this key is
|
||||
entirely dependent on their internal policies and design.
|
||||
- Support restoring remote desktop sessions.
|
||||
- Introduce the ReadOne() method in the Settings portal. This
|
||||
method is now preferred over the Read() method, as Read()
|
||||
mistakenly returned a variant inside a variant. The Read()
|
||||
method will continue to exist for compatibility with existing
|
||||
apps, but its usage is deprecated. We recommend apps to port
|
||||
to the ReadOne() method. Apps can decide whether to use
|
||||
ReadOne() or Read() by looking at the version of the Settings
|
||||
portal.
|
||||
+ Changes that might be relevant for distributors:
|
||||
- Rework how portal implementations are loaded. This new, more
|
||||
robust system allows selecting specific backends for specific
|
||||
portals, and layering them when necessary. Platforms that
|
||||
provide portals implementation are encouraged to provide a
|
||||
suitable configuration file.
|
||||
- Drop the Autotools build. Meson is now the only supported
|
||||
build system.
|
||||
- The PipeWire dependency is now mandatory.
|
||||
- Bump GLib dependency to 2.66.
|
||||
+ Misc changes:
|
||||
- Improve robustness of the OpenURI portal by validating more
|
||||
URIs.
|
||||
- Various small visual tweaks to the generated documentation.
|
||||
- Various fixes to the Global Shortcuts portal.
|
||||
- Stop using the deprecated GTimeVal struct.
|
||||
- Document xdg-desktop-portal versioning scheme.
|
||||
- Fix various issues in the OpenURI portal.
|
||||
- Bump interface version of the Printer portal to 2.
|
||||
- Validate addresses following the HTML specs in the Email
|
||||
portal.
|
||||
- Document minimum version of the new ReadOne() method of the
|
||||
Settings portal.
|
||||
- Add a mapping id property to the ScreenCast portal.
|
||||
- Add activation token parameter to the Email portal.
|
||||
- Test tarball generation in CI.
|
||||
- Updated translations.
|
||||
- Add docutils BuildRequires: New dependency.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Aug 9 10:53:54 UTC 2023 - Bjørn Lie <bjorn.lie@gmail.com>
|
||||
|
||||
- Update to version 1.17.0:
|
||||
+ Drop the Autotools build. Meson is now the only supported build
|
||||
system.
|
||||
+ Rework how portal implementations are loaded. This new, more
|
||||
robust system allows selecting specific backends for specific
|
||||
portals, and layering them when necessary. Platforms that
|
||||
provide portals implementation are encouraged to provide a
|
||||
suitable configuration file.
|
||||
+ Introduce a new Clipboard portal. This portal extends the
|
||||
Remote Desktop portal by adding support for sharing clipboard
|
||||
between remote machines.
|
||||
+ Introduce a new Input Capture portal. This portal adds
|
||||
mechanisms for taking control of input devices. The primary
|
||||
usage model is centered around the InputLeap and Synergy use
|
||||
cases, where local devices are used to control remote displays.
|
||||
+ Stop using the deprecated GTimeVal struct
|
||||
+ Bump GLib dependency to 2.66
|
||||
+ Add an "accept-label" option the the Print portal. This lets
|
||||
apps suggest a proper label to the print operation.
|
||||
+ Various fixes to the Global Shortcuts portal.
|
||||
+ Support restoring remote desktop sessions.
|
||||
+ Improve robustness of the OpenURI portal by validating more
|
||||
URIs.
|
||||
+ The PipeWire dependency is now mandatory.
|
||||
+ Various improvements for the test suite.
|
||||
+ Updated translations.
|
||||
- Drop 0001-portal-impl-Only-return-found-implementation-if-it-launched.patch
|
||||
fixed upstream.
|
||||
- Switch to meson buildsystem following upstream changes. Add meson
|
||||
BuildRequires and macros.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Fri Jun 23 09:54:14 UTC 2023 - Antonio Larrosa <alarrosa@suse.com>
|
||||
|
||||
|
@ -17,17 +17,16 @@
|
||||
|
||||
|
||||
Name: xdg-desktop-portal
|
||||
Version: 1.16.0
|
||||
Version: 1.18.0
|
||||
Release: 0
|
||||
Summary: A portal frontend service for Flatpak
|
||||
License: LGPL-2.1-or-later
|
||||
Group: System/Libraries
|
||||
URL: https://github.com/flatpak/xdg-desktop-portal
|
||||
Source0: %{url}/releases/download/%{version}/%{name}-%{version}.tar.xz
|
||||
# PATCH-FIX-UPSTREAM
|
||||
Patch0: 0001-portal-impl-Only-return-found-implementation-if-it-launched.patch
|
||||
|
||||
BuildRequires: libtool
|
||||
BuildRequires: docutils
|
||||
BuildRequires: meson
|
||||
BuildRequires: pkgconfig
|
||||
BuildRequires: systemd-rpm-macros
|
||||
BuildRequires: xmlto
|
||||
@ -75,18 +74,13 @@ This package contains convenience files for developers.
|
||||
%autosetup -p1
|
||||
|
||||
%build
|
||||
export LANG=C.UTF-8
|
||||
autoreconf -fiv
|
||||
%configure \
|
||||
--enable-geoclue \
|
||||
--enable-pipewire \
|
||||
--docdir=%{_defaultdocdir}/%{name} \
|
||||
%meson \
|
||||
-Dpytest=disabled \
|
||||
%{nil}
|
||||
%make_build
|
||||
%meson_build
|
||||
|
||||
%install
|
||||
export LANG=C.UTF-8
|
||||
%make_install
|
||||
%meson_install
|
||||
%find_lang %{name} %{?no_lang_C}
|
||||
|
||||
%post
|
||||
@ -113,9 +107,10 @@ export LANG=C.UTF-8
|
||||
%{_userunitdir}/xdg-document-portal.service
|
||||
%{_userunitdir}/xdg-permission-store.service
|
||||
%{_userunitdir}/xdg-desktop-portal-rewrite-launchers.service
|
||||
%{_mandir}/man5/portals.conf.5%{?ext_man}
|
||||
|
||||
%files devel
|
||||
%doc %{_defaultdocdir}/%{name}/
|
||||
%doc %{_datadir}/doc/%{name}/
|
||||
%{_datadir}/pkgconfig/%{name}.pc
|
||||
|
||||
%files lang -f %{name}.lang
|
||||
|
Loading…
Reference in New Issue
Block a user