@@ -386,6 +386,117 @@ 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+ /**
408+ * xdp_portal_register:
409+ * @portal: a [class@Portal]
410+ * @app_id: an application ID matching the basename of a desktop file
411+ * @cancellable: (nullable): optional [[email protected] ] 412+ * @callback: (scope async): a callback to call when the request is done
413+ * @data: (closure): data to pass to @callback
414+ *
415+ * Registers the application ID with the org.freedesktop.host.Registry portal.
416+ * Doing this when sandboxed is a no-op, but when running on the host, it will
417+ * help associating portal requests with an application.
418+ *
419+ * When the request is done, @callback will be called. You can then
420+ * call [[email protected] _finish] to get the results. 421+ */
422+ void
423+ xdp_portal_register (XdpPortal * portal ,
424+ const char * app_id ,
425+ GCancellable * cancellable ,
426+ GAsyncReadyCallback callback ,
427+ gpointer user_data )
428+ {
429+ g_autoptr (GTask ) task = NULL ;
430+ GVariantBuilder options ;
431+ g_autoptr (GError ) error = NULL ;
432+
433+ g_return_if_fail (XDP_IS_PORTAL (portal ));
434+ g_return_if_fail (app_id );
435+ g_return_if_fail (g_strcmp0 (app_id , "" ) != 0 );
436+
437+ task = g_task_new (portal , cancellable , callback , user_data );
438+ g_task_set_source_tag (task , xdp_portal_register );
439+
440+ if (xdp_portal_running_under_flatpak ())
441+ {
442+ g_task_return_boolean (task , TRUE);
443+ return ;
444+ }
445+
446+ if (xdp_portal_running_under_snap (& error ))
447+ {
448+ g_task_return_boolean (task , TRUE);
449+ return ;
450+ }
451+
452+ if (error )
453+ {
454+ g_task_return_error (task , error );
455+ return ;
456+ }
457+
458+ g_variant_builder_init (& options , G_VARIANT_TYPE_VARDICT );
459+
460+ g_dbus_connection_call (portal -> bus ,
461+ PORTAL_BUS_NAME ,
462+ PORTAL_OBJECT_PATH ,
463+ "org.freedesktop.host.portal.Registry" ,
464+ "Register" ,
465+ g_variant_new ("(sa{sv})" , app_id , & options ),
466+ NULL ,
467+ G_DBUS_CALL_FLAGS_NONE ,
468+ -1 ,
469+ NULL ,
470+ register_cb ,
471+ g_object_ref (task ));
472+ }
473+
474+ /**
475+ * xdp_portal_register_finish:
476+ * @portal: a [class@Portal]
477+ 478+ * @error: return location for an error
479+ *
480+ * Finishes the registry registration request.
481+ *
482+ * Returns %TRUE if the registration succeeded, or app was sandboxed, in which
483+ * case, the operation was a no-op.
484+ *
485+ * Returns: %TRUE on success
486+ */
487+ gboolean
488+ xdp_portal_register_finish (XdpPortal * portal ,
489+ GAsyncResult * result ,
490+ GError * * error )
491+ {
492+ g_return_val_if_fail (XDP_IS_PORTAL (portal ), FALSE);
493+ g_return_val_if_fail (g_task_is_valid (result , portal ), FALSE);
494+ g_return_val_if_fail (g_task_get_source_tag (G_TASK (result )) ==
495+ xdp_portal_register , FALSE);
496+
497+ return g_task_propagate_boolean (G_TASK (result ), error );
498+ }
499+
389500/* This function is copied from xdg-desktop-portal */
390501static int
391502_xdp_parse_cgroup_file (FILE * f , gboolean * is_snap )
0 commit comments