[gnome-todo] background: Use libportal to request background permission
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-todo] background: Use libportal to request background permission
- Date: Sun, 26 Apr 2020 18:10:31 +0000 (UTC)
commit d0c1da8a4041ba5de91a7d4b2410b62a8a108a0c
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Sun Apr 26 15:07:34 2020 -0300
background: Use libportal to request background permission
plugins/background/gtd-plugin-background.c | 190 ++++++-----------------------
plugins/background/meson.build | 8 +-
2 files changed, 42 insertions(+), 156 deletions(-)
---
diff --git a/plugins/background/gtd-plugin-background.c b/plugins/background/gtd-plugin-background.c
index 341330d..82e0bbb 100644
--- a/plugins/background/gtd-plugin-background.c
+++ b/plugins/background/gtd-plugin-background.c
@@ -27,13 +27,8 @@
#include <gdk/gdk.h>
#include <gtk/gtk.h>
-#ifdef GDK_WINDOWING_WAYLAND
-#include <gdk/wayland/gdkwayland.h>
-#endif
-
-#ifdef GDK_WINDOWING_WAYLAND
-#include <gdk/x11/gdkx.h>
-#endif
+#include <libportal/portal.h>
+#include <libportal/portal-gtk4.h>
#define AUTOSTART_NOTIFICATION_ID "Gtd::BackgroundPlugin::autostart_notification"
#define AUTOSTART_NOTIFICATION_TIMEOUT 3 /* seconds */
@@ -58,6 +53,8 @@ struct _GtdPluginBackground
gboolean enabled;
gboolean autostart;
+ XdpPortal *portal;
+
guint startup_notification_timeout_id;
};
@@ -107,174 +104,55 @@ is_gnome_todo_active (void)
}
static void
-on_request_signal_emitted_cb (GDBusProxy *request_proxy,
- gchar *sender_name,
- gchar *signal_name,
- GVariant *parameters,
- GtdPluginBackground *self)
-{
- GTD_ENTRY;
-
- if (g_strcmp0 (signal_name, "Response") == 0)
- {
- g_autoptr (GVariant) results = NULL;
- gboolean run_in_background;
- gboolean autostart;
- guint response;
-
- g_variant_get (parameters, "(u@a{sv})", &response, &results);
-
- if (response != 0)
- {
- g_critical ("Error setting");
- return;
- }
-
- g_variant_lookup (results, "background", "b", &run_in_background);
- g_variant_lookup (results, "autostart", "b", &autostart);
-
- }
-
- g_object_unref (request_proxy);
-
- GTD_EXIT;
-}
-
-static void
-update_background_portal (GtdPluginBackground *self,
- const gchar *handle)
+on_request_background_called_cb (GObject *object,
+ GAsyncResult *result,
+ gpointer user_data)
{
- g_autoptr (GDBusProxy) request_proxy = NULL;
- g_autoptr (GVariant) result = NULL;
g_autoptr (GError) error = NULL;
- gchar *request_object_path;
- GVariantBuilder builder;
GTD_ENTRY;
- if (!self->desktop_portal)
- {
- self->desktop_portal = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
- G_DBUS_PROXY_FLAGS_NONE,
- NULL,
- "org.freedesktop.portal.Desktop",
- "/org/freedesktop/portal/desktop",
- "org.freedesktop.portal.Background",
- NULL,
- &error);
-
- if (error)
- {
- g_warning ("Failed to connect to the desktop portal: %s", error->message);
- GTD_RETURN ();
- }
- }
-
- g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
- g_variant_builder_add (&builder, "{sv}", "autostart", g_variant_new_boolean (self->autostart));
- if (self->autostart)
- {
- const gchar * commands[] = { "gnome-todo", "--gapplication-service", NULL };
-
- g_variant_builder_add (&builder, "{sv}", "commandline", g_variant_new_strv (commands, -1));
- }
-
- result = g_dbus_proxy_call_sync (self->desktop_portal,
- "RequestBackground",
- g_variant_new ("(sa{sv})", handle, &builder),
- G_DBUS_CALL_FLAGS_NONE,
- 30000,
- NULL,
- &error);
- if (error)
- {
- g_warning ("Error calling D-Bus method: %s", error->message);
- GTD_RETURN ();
- }
-
- g_variant_get (result, "(o)", &request_object_path);
- request_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
- G_DBUS_PROXY_FLAGS_NONE,
- NULL,
- "org.freedesktop.portal.Desktop",
- request_object_path,
- "org.freedesktop.portal.Request",
- NULL,
- &error);
+ xdp_portal_request_background_finish (XDP_PORTAL (object), result, &error);
if (error)
- {
- g_warning ("Error calling D-Bus method: %s", error->message);
- GTD_RETURN ();
- }
-
- g_signal_connect_object (g_steal_pointer (&request_proxy),
- "g-signal",
- G_CALLBACK (on_request_signal_emitted_cb),
- self,
- 0);
-
- GTD_EXIT;
-}
-
-#ifdef GDK_WINDOWING_WAYLAND
-static void
-on_wayland_surface_handle_exported_cb (GdkSurface *surface,
- const gchar *surface_handle,
- gpointer user_data)
-{
- GtdPluginBackground *self;
- g_autofree gchar *handle = NULL;
-
- GTD_ENTRY;
-
- self = GTD_PLUGIN_BACKGROUND (user_data);
- handle = g_strdup_printf ("wayland:%s", surface_handle);
-
- update_background_portal (self, handle);
-
- gdk_wayland_surface_unexport_handle (surface);
+ g_warning ("Error requesting background: %s", error->message);
GTD_EXIT;
}
-#endif
-
-static void
-stub_destroy (gpointer data)
-{
-}
static void
-acquire_surface_handle (GtdPluginBackground *self)
+update_background_portal (GtdPluginBackground *self)
{
- GdkSurface *surface;
+ g_autoptr (GPtrArray) commandline = NULL;
+ XdpBackgroundFlags background_flags;
+ XdpParent *parent = NULL;
GtkWindow *window;
GTD_ENTRY;
window = get_window ();
- surface = gtk_native_get_surface (GTK_NATIVE (window));
-
- g_assert (surface != NULL);
+ parent = xdp_parent_new_gtk (window);
+ background_flags = XDP_BACKGROUND_FLAG_ACTIVATABLE;
-#ifdef GDK_WINDOWING_WAYLAND
- if (GDK_IS_WAYLAND_SURFACE (surface))
- {
- gdk_wayland_surface_export_handle (surface, on_wayland_surface_handle_exported_cb, self, stub_destroy);
- }
- else
-#endif
-#ifdef GDK_WINDOWING_X11
- if (GDK_IS_X11_SURFACE (surface))
+ if (self->autostart)
{
- g_autofree gchar *handle = NULL;
+ commandline = g_ptr_array_new_with_free_func (g_free);
+ g_ptr_array_add (commandline, g_strdup ("gnome-todo"));
+ g_ptr_array_add (commandline, g_strdup ("--gapplication-service"));
- handle = g_strdup_printf ("x11:%lx", gdk_x11_surface_get_xid (surface));
- update_background_portal (self, handle);
+ background_flags |= XDP_BACKGROUND_FLAG_AUTOSTART;
}
- else
-#endif
- g_critical ("No valid backend");
+
+ xdp_portal_request_background (self->portal,
+ parent,
+ NULL,
+ commandline,
+ background_flags,
+ NULL,
+ on_request_background_called_cb,
+ self);
+
+ xdp_parent_free (parent);
GTD_EXIT;
}
@@ -287,7 +165,7 @@ on_window_active_changed_cb (GtkWindow *window,
GTD_ENTRY;
g_signal_handlers_disconnect_by_func (window, on_window_active_changed_cb, self);
- acquire_surface_handle (self);
+ update_background_portal (self);
GTD_EXIT;
}
@@ -302,7 +180,7 @@ start_update (GtdPluginBackground *self)
window = get_window ();
if (gtk_widget_get_visible (GTK_WIDGET (window)) && is_gnome_todo_active ())
{
- acquire_surface_handle (self);
+ update_background_portal (self);
}
else
{
@@ -655,6 +533,7 @@ gtd_plugin_background_finalize (GObject *object)
GtdPluginBackground *self = (GtdPluginBackground *)object;
g_clear_object (&self->settings);
+ g_clear_object (&self->portal);
G_OBJECT_CLASS (gtd_plugin_background_parent_class)->finalize (object);
}
@@ -713,6 +592,7 @@ gtd_plugin_background_init (GtdPluginBackground *self)
builder = gtk_builder_new_from_resource ("/org/gnome/todo/ui/background/preferences.ui");
self->preferences_panel = GTK_WIDGET (gtk_builder_get_object (builder, "main_box"));
+ self->portal = xdp_portal_new ();
g_settings_bind (self->settings,
"run-on-startup",
diff --git a/plugins/background/meson.build b/plugins/background/meson.build
index cfd41ff..2aea0e4 100644
--- a/plugins/background/meson.build
+++ b/plugins/background/meson.build
@@ -2,11 +2,17 @@ plugin_name = 'background'
plugins_ldflags += ['-Wl,--undefined=gtd_plugin_background_register_types']
+background_plugin_deps = [
+ dependency('libportal'),
+ vcs_identifier_h,
+ gnome_todo_deps,
+]
+
plugins_libs += static_library(
plugin_name,
sources: 'gtd-plugin-' + plugin_name + '.c',
include_directories: plugins_incs,
- dependencies: [ vcs_identifier_h, gnome_todo_deps ],
+ dependencies: background_plugin_deps,
c_args: '-DPACKAGE_DATA_DIR="@0@"'.format(gnome_todo_pkgdatadir),
)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]