@@ -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 */
390473static int
391474_xdp_parse_cgroup_file (FILE * f , gboolean * is_snap )
0 commit comments