diff options
author | Bastien Nocera <hadess@hadess.net> | 2020-03-23 14:56:43 +0100 |
---|---|---|
committer | Bastien Nocera <hadess@hadess.net> | 2020-03-30 18:31:23 +0200 |
commit | 027ca22defe39ad48033dee3e0f38cf3f5a33116 (patch) | |
tree | e02cca8a1443947030dd4e77f025f3c4229d5e86 | |
parent | bd55c5842e77331d46ec377542861710a56e1541 (diff) | |
download | gtk+-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.c | 57 | ||||
-rw-r--r-- | gtk/gtkprivate.h | 2 |
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 (®ister_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" |