summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2020-03-23 14:56:43 +0100
committerBastien Nocera <hadess@hadess.net>2020-03-30 18:31:23 +0200
commit027ca22defe39ad48033dee3e0f38cf3f5a33116 (patch)
treee02cca8a1443947030dd4e77f025f3c4229d5e86
parentbd55c5842e77331d46ec377542861710a56e1541 (diff)
downloadgtk+-027ca22defe39ad48033dee3e0f38cf3f5a33116.tar.gz
Add portal version checking helper
Add gtk_get_portal_interface_version() to check the version of a portal.
-rw-r--r--gtk/gtkprivate.c57
-rw-r--r--gtk/gtkprivate.h2
2 files changed, 59 insertions, 0 deletions
diff --git a/gtk/gtkprivate.c b/gtk/gtkprivate.c
index 8de1e81a5e..9a6cd584dc 100644
--- a/gtk/gtkprivate.c
+++ b/gtk/gtkprivate.c
@@ -268,6 +268,63 @@ _gtk_ensure_resources (void)
g_once (&register_resources_once, register_resources, NULL);
}
+/*
+ * gtk_get_portal_interface_version:
+ * @connection: a session #GDBusConnection
+ * @interface_name: the interface name for the portal interface
+ * we're interested in.
+ *
+ * Returns: the version number of the portal, or 0 on error.
+ */
+guint
+gtk_get_portal_interface_version (GDBusConnection *connection,
+ const char *interface_name)
+{
+ GDBusProxy *proxy = NULL;
+ GError *error = NULL;
+ GVariant *ret = NULL;
+ char *owner = NULL;
+ guint version = 0;
+
+ proxy = g_dbus_proxy_new_sync (connection,
+ 0,
+ NULL,
+ "org.freedesktop.portal.Desktop",
+ "/org/freedesktop/portal/desktop",
+ interface_name,
+ NULL,
+ &error);
+ if (!proxy)
+ {
+ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ g_warning ("Could not query portal version on interface '%s': %s",
+ interface_name, error->message);
+ goto out;
+ }
+
+ owner = g_dbus_proxy_get_name_owner (proxy);
+ if (owner == NULL)
+ {
+ g_debug ("%s not provided by any service", interface_name);
+ goto out;
+ }
+
+ ret = g_dbus_proxy_get_cached_property (proxy, "version");
+ if (ret)
+ version = g_variant_get_uint32 (ret);
+
+ g_debug ("Got version %u for portal interface '%s'",
+ version, interface_name);
+
+out:
+ g_clear_object (&proxy);
+ g_clear_error (&error);
+ g_clear_pointer (&ret, g_variant_unref);
+ g_clear_pointer (&owner, g_free);
+
+ return version;
+}
+
static char *
get_portal_path (GDBusConnection *connection,
const char *kind,
diff --git a/gtk/gtkprivate.h b/gtk/gtkprivate.h
index 6cac03c763..f4ba489ba6 100644
--- a/gtk/gtkprivate.h
+++ b/gtk/gtkprivate.h
@@ -115,6 +115,8 @@ char *gtk_get_portal_request_path (GDBusConnection *connection,
char **token);
char *gtk_get_portal_session_path (GDBusConnection *connection,
char **token);
+guint gtk_get_portal_interface_version (GDBusConnection *connection,
+ const char *interface_name);
#define PORTAL_BUS_NAME "org.freedesktop.portal.Desktop"
#define PORTAL_OBJECT_PATH "/org/freedesktop/portal/desktop"