Skip to content

Commit b9d19d3

Browse files
committed
Add API to register app ID
These are no-ops when running under flatpak or snap, but when running on the host, they will call Register() on org.freedesktop.host.portal.Registry.
1 parent 0f8f627 commit b9d19d3

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed

libportal/portal-helpers.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,18 @@ XdpPortal *xdp_portal_new (void);
4545
XDP_PUBLIC
4646
XdpPortal *xdp_portal_initable_new (GError **error);
4747

48+
XDP_PUBLIC
49+
void xdp_portal_register (XdpPortal *portal,
50+
const char *app_id,
51+
GCancellable *cancellable,
52+
GAsyncReadyCallback callback,
53+
gpointer user_data);
54+
55+
XDP_PUBLIC
56+
gboolean xdp_portal_register_finish (XdpPortal *portal,
57+
GAsyncResult *result,
58+
GError **error);
59+
4860
XDP_PUBLIC
4961
gboolean xdp_portal_running_under_flatpak (void);
5062

libportal/portal.c

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,89 @@ xdp_portal_new (void)
386386
return portal;
387387
}
388388

389+
static void
390+
register_cb (GObject *source_object,
391+
GAsyncResult *result,
392+
gpointer user_data)
393+
{
394+
g_autoptr(GTask) task = user_data;
395+
g_autoptr(GVariant) ret = NULL;
396+
g_autoptr(GError) error = NULL;
397+
398+
ret = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source_object),
399+
result,
400+
&error);
401+
if (error)
402+
g_task_return_error (task, g_steal_pointer (&error));
403+
else
404+
g_task_return_boolean (task, TRUE);
405+
}
406+
407+
void
408+
xdp_portal_register (XdpPortal *portal,
409+
const char *app_id,
410+
GCancellable *cancellable,
411+
GAsyncReadyCallback callback,
412+
gpointer user_data)
413+
{
414+
g_autoptr(GTask) task = NULL;
415+
GVariantBuilder options;
416+
g_autoptr(GError) error = NULL;
417+
418+
g_return_if_fail (XDP_IS_PORTAL (portal));
419+
g_return_if_fail (app_id);
420+
g_return_if_fail (g_strcmp0 (app_id, "") != 0);
421+
422+
task = g_task_new (portal, cancellable, callback, user_data);
423+
g_task_set_source_tag (task, xdp_portal_register);
424+
425+
if (xdp_portal_running_under_flatpak ())
426+
{
427+
g_task_return_boolean (task, TRUE);
428+
return;
429+
}
430+
431+
if (xdp_portal_running_under_snap (&error))
432+
{
433+
g_task_return_boolean (task, TRUE);
434+
return;
435+
}
436+
437+
if (error)
438+
{
439+
g_task_return_error (task, error);
440+
return;
441+
}
442+
443+
g_variant_builder_init (&options, G_VARIANT_TYPE_VARDICT);
444+
445+
g_dbus_connection_call (portal->bus,
446+
PORTAL_BUS_NAME,
447+
PORTAL_OBJECT_PATH,
448+
"org.freedesktop.host.portal.Registry",
449+
"Register",
450+
g_variant_new ("(sa{sv})", app_id, &options),
451+
NULL,
452+
G_DBUS_CALL_FLAGS_NONE,
453+
-1,
454+
NULL,
455+
register_cb,
456+
g_object_ref (task));
457+
}
458+
459+
gboolean
460+
xdp_portal_register_finish (XdpPortal *portal,
461+
GAsyncResult *result,
462+
GError **error)
463+
{
464+
g_return_val_if_fail (XDP_IS_PORTAL (portal), FALSE);
465+
g_return_val_if_fail (g_task_is_valid (result, portal), FALSE);
466+
g_return_val_if_fail (g_task_get_source_tag (G_TASK (result)) ==
467+
xdp_portal_register, FALSE);
468+
469+
return g_task_propagate_boolean (G_TASK (result), error);
470+
}
471+
389472
/* This function is copied from xdg-desktop-portal */
390473
static int
391474
_xdp_parse_cgroup_file (FILE *f, gboolean *is_snap)

0 commit comments

Comments
 (0)