From: Markus Volk <f_l_k@t-online.de>
To: openembedded-devel@lists.openembedded.org
Subject: Re: [oe] [meta-gnome][PATCHv3] gnome-online-accounts-gtk: add recipe
Date: Mon, 07 Sep 2026 07:53:43 +0200 [thread overview]
Message-ID: <JDCZKT.GS4THQSDE2DK2@t-online.de> (raw)
In-Reply-To: <18D2F4123820CD99.4159725@lists.openembedded.org>
[-- Attachment #1: Type: text/plain, Size: 13407 bytes --]
v3: add tag=${PV}
On Mon, Sep 7 2026 at 07:52:27 +02:00:00, Markus Volk via
lists.openembedded.org <f_l_k=t-online.de@lists.openembedded.org> wrote:
> GNOME Online Accounts only provides the daemon and library that
> applications such as gnome-calendar, gnome-contacts and evolution use
> for their calendar, mail and contact accounts. The only user interface
> for adding accounts is the online-accounts panel of
> gnome-control-center,
> which pulls in gnome-shell and its settings daemon. Desktops built on
> wlroots compositors or other GTK environments have no way to configure
> these accounts at all.
>
> gnome-online-accounts-gtk from the xapp project is a standalone GTK4
> and
> libadwaita application for exactly that job and works without GNOME
> Shell.
>
> GNOME applications open the accounts settings by activating the
> "launch-panel" action of org.gnome.Settings on the session bus. The
> included patch provides that name and action from
> gnome-online-accounts-gtk together with a D-Bus service file, so these
> buttons work here too. Since only one package can own the bus name,
> the
> package conflicts with gnome-control-center.
>
> Build tested on corei7-64.
>
> AI-Generated: Uses Claude Code (Claude Fable 5.1)
> Signed-off-by: Markus Volk <f_l_k@t-online.de
> <mailto:f_l_k@t-online.de>>
> ---
> ...nome.Settings-launch-panel-interface.patch | 261
> ++++++++++++++++++
> .../gnome-online-accounts-gtk_3.50.10.bb | 29 ++
> 2 files changed, 290 insertions(+)
> create mode 100644
> meta-gnome/recipes-extended/gnome-online-accounts-gtk/files/0001-Provide-the-org.gnome.Settings-launch-panel-interface.patch
> create mode 100644
> meta-gnome/recipes-extended/gnome-online-accounts-gtk/gnome-online-accounts-gtk_3.50.10.bb
>
> diff --git
> a/meta-gnome/recipes-extended/gnome-online-accounts-gtk/files/0001-Provide-the-org.gnome.Settings-launch-panel-interface.patch
> b/meta-gnome/recipes-extended/gnome-online-accounts-gtk/files/0001-Provide-the-org.gnome.Settings-launch-panel-interface.patch
> new file mode 100644
> index 0000000000..c352138985
> --- /dev/null
> +++
> b/meta-gnome/recipes-extended/gnome-online-accounts-gtk/files/0001-Provide-the-org.gnome.Settings-launch-panel-interface.patch
> @@ -0,0 +1,261 @@
> +From 08e3b37df99f89c8e36cea80304e2bc1f2986659 Mon Sep 17 00:00:00
> 2001
> +From: Markus Volk <f_l_k@t-online.de <mailto:f_l_k@t-online.de>>
> +Date: Sun, 6 Sep 2026 18:36:48 +0200
> +Subject: [PATCH] Provide the org.gnome.Settings launch-panel
> interface
> +
> +GNOME applications such as gnome-calendar, gnome-contacts or
> evolution
> +open the online accounts settings by activating the "launch-panel"
> +action of org.gnome.Settings on the session bus, which is only
> provided
> +by gnome-control-center. On desktops that ship
> gnome-online-accounts-gtk
> +instead, these buttons silently do nothing.
> +
> +Export the application actions on /org/gnome/Settings as well, own
> the
> +org.gnome.Settings name once the application has started and install
> a
> +D-Bus service file so the application gets activated on demand. The
> +"online-accounts" panel presents the main window; when an account id
> is
> +passed as the first argument, the matching account is opened,
> mirroring
> +the behaviour of the gnome-control-center panel. Other panel ids are
> +ignored with a warning.
> +
> +Upstream-Status: Pending
> +AI-Generated: Uses Claude Code (Claude Fable 5.1)
> +---
> + data/meson.build | 8 ++
> + data/org.gnome.Settings.service.in | 3 +
> + src/gnome-online-accounts-gtk.c | 152
> ++++++++++++++++++++++++++++-
> + 3 files changed, 159 insertions(+), 4 deletions(-)
> + create mode 100644 data/org.gnome.Settings.service.in
> +
> +diff --git a/data/meson.build b/data/meson.build
> +index deadf44..71e27aa 100644
> +--- a/data/meson.build
> ++++ b/data/meson.build
> +@@ -24,4 +24,12 @@ i18n.merge_file(
> + install_dir: datadir / 'applications'
> + )
> +
> ++configure_file(
> ++ input: 'org.gnome.Settings.service.in',
> ++ output: 'org.gnome.Settings.service',
> ++ configuration: bin_conf,
> ++ install: true,
> ++ install_dir: datadir / 'dbus-1' / 'services',
> ++)
> ++
> + subdir('icons')
> +\ No newline at end of file
> +diff --git a/data/org.gnome.Settings.service.in
> b/data/org.gnome.Settings.service.in
> +new file mode 100644
> +index 0000000..ab4b5a1
> +--- /dev/null
> ++++ b/data/org.gnome.Settings.service.in
> +@@ -0,0 +1,3 @@
> ++[D-BUS Service]
> ++Name=org.gnome.Settings
> ++Exec=@bindir@/gnome-online-accounts-gtk --gapplication-service
> +diff --git a/src/gnome-online-accounts-gtk.c
> b/src/gnome-online-accounts-gtk.c
> +index 25bd116..60d3472 100644
> +--- a/src/gnome-online-accounts-gtk.c
> ++++ b/src/gnome-online-accounts-gtk.c
> +@@ -32,6 +32,8 @@ struct _OaWindow
> + GtkWidget *accounts_label;
> +
> + GtkWidget *offline_revealer;
> ++
> ++ gchar *pending_account_id;
> + };
> +
> + G_DEFINE_TYPE (OaWindow, oa_window, GTK_TYPE_APPLICATION_WINDOW)
> +@@ -102,6 +104,43 @@ show_account (OaWindow *window,
> + }
> + }
> +
> ++static void
> ++show_account_by_id (OaWindow *window,
> ++ const gchar *account_id)
> ++{
> ++ guint n_items;
> ++ guint i;
> ++
> ++ if (window->client == NULL)
> ++ {
> ++ g_free (window->pending_account_id);
> ++ window->pending_account_id = g_strdup (account_id);
> ++ return;
> ++ }
> ++
> ++ n_items = g_list_model_get_n_items (window->accounts_model);
> ++
> ++ for (i = 0; i < n_items; i++)
> ++ {
> ++ GoaObject *object;
> ++ GoaAccount *account;
> ++
> ++ object = g_list_model_get_item (window->accounts_model, i);
> ++ account = goa_object_peek_account (object);
> ++
> ++ if (g_strcmp0 (goa_account_get_id (account), account_id) ==
> 0)
> ++ {
> ++ show_account (window, object);
> ++ g_object_unref (object);
> ++ return;
> ++ }
> ++
> ++ g_object_unref (object);
> ++ }
> ++
> ++ g_warning ("No account with id '%s'", account_id);
> ++}
> ++
> + static void
> + add_account_cb (GoaProvider *provider,
> + GAsyncResult *res,
> +@@ -418,6 +457,15 @@ new_client_cb (GObject *source_object,
> GAsyncResult *res, gpointer user_data)
> +
> + populate_accounts (window);
> + goa_provider_get_all (get_all_providers_cb, window);
> ++
> ++ if (window->pending_account_id != NULL)
> ++ {
> ++ gchar *account_id;
> ++
> ++ account_id = g_steal_pointer (&window->pending_account_id);
> ++ show_account_by_id (window, account_id);
> ++ g_free (account_id);
> ++ }
> + }
> +
> + static void
> +@@ -440,6 +488,7 @@ oa_window_dispose (GObject *object)
> + }
> +
> + g_clear_object (&window->client);
> ++ g_clear_pointer (&window->pending_account_id, g_free);
> +
> + G_OBJECT_CLASS (oa_window_parent_class)->dispose (object);
> + }
> +@@ -507,18 +556,112 @@ oa_window_new (void)
> + return g_object_new (oa_window_get_type (), NULL);
> + }
> +
> ++static OaWindow *
> ++get_window (GtkApplication *app)
> ++{
> ++ OaWindow *window;
> ++ GList *l;
> ++
> ++ for (l = gtk_application_get_windows (app); l != NULL; l =
> l->next)
> ++ {
> ++ if (OA_IS_WINDOW (l->data))
> ++ {
> ++ return OA_WINDOW (l->data);
> ++ }
> ++ }
> ++
> ++ window = oa_window_new ();
> ++ gtk_window_set_application (GTK_WINDOW (window), app);
> ++
> ++ return window;
> ++}
> ++
> + static void
> + on_app_activate (GtkApplication *app, gpointer user_data)
> + {
> +- static OaWindow *window = NULL;
> ++ gtk_window_present (GTK_WINDOW (get_window (app)));
> ++}
> ++
> ++static void
> ++launch_panel_activated (GSimpleAction *action,
> ++ GVariant *parameter,
> ++ gpointer user_data)
> ++{
> ++ GtkApplication *app = GTK_APPLICATION (user_data);
> ++ OaWindow *window;
> ++ const gchar *panel_id;
> ++ GVariant *parameters;
> ++
> ++ g_variant_get (parameter, "(&s@av)", &panel_id, ¶meters);
> +
> +- if (window == NULL)
> ++ if (g_strcmp0 (panel_id, "online-accounts") != 0)
> + {
> +- window = oa_window_new ();
> +- gtk_window_set_application (GTK_WINDOW (window), app);
> ++ g_warning ("Panel '%s' is not provided by
> gnome-online-accounts-gtk", panel_id);
> ++ g_variant_unref (parameters);
> ++ return;
> + }
> +
> ++ window = get_window (app);
> + gtk_window_present (GTK_WINDOW (window));
> ++
> ++ if (g_variant_n_children (parameters) > 0)
> ++ {
> ++ GVariant *value;
> ++
> ++ g_variant_get_child (parameters, 0, "v", &value);
> ++
> ++ if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING) &&
> ++ g_variant_get_string (value, NULL)[0] != '\0')
> ++ {
> ++ show_account_by_id (window, g_variant_get_string
> (value, NULL));
> ++ }
> ++
> ++ g_variant_unref (value);
> ++ }
> ++
> ++ g_variant_unref (parameters);
> ++}
> ++
> ++static const GActionEntry app_actions[] = {
> ++ { "launch-panel", launch_panel_activated, "(sav)", NULL, NULL,
> { 0 } },
> ++ { "launch-single-panel-mode", launch_panel_activated, "(sav)",
> NULL, NULL, { 0 } },
> ++};
> ++
> ++static void
> ++on_app_startup (GApplication *app, gpointer user_data)
> ++{
> ++ GDBusConnection *connection;
> ++ GError *error = NULL;
> ++
> ++ g_action_map_add_action_entries (G_ACTION_MAP (app),
> ++ app_actions,
> ++ G_N_ELEMENTS (app_actions),
> ++ app);
> ++
> ++ connection = g_application_get_dbus_connection (app);
> ++
> ++ if (connection == NULL)
> ++ {
> ++ return;
> ++ }
> ++
> ++ if (g_dbus_connection_export_action_group (connection,
> ++
> "/org/gnome/Settings",
> ++ G_ACTION_GROUP (app),
> ++ &error) == 0)
> ++ {
> ++ g_warning ("Failed to export actions on
> /org/gnome/Settings: %s", error->message);
> ++ g_error_free (error);
> ++ return;
> ++ }
> ++
> ++ g_bus_own_name_on_connection (connection,
> ++ "org.gnome.Settings",
> ++ G_BUS_NAME_OWNER_FLAGS_NONE,
> ++ NULL,
> ++ NULL,
> ++ NULL,
> ++ NULL);
> + }
> +
> + int main(int argc, char *argv[]) {
> +@@ -541,6 +684,7 @@ int main(int argc, char *argv[]) {
> +
> + g_application_set_option_context_summary (G_APPLICATION (app),
> "gnome-online-accounts-gtk: A GTK Frontend for GNOME Online
> Accounts");
> +
> ++ g_signal_connect (app, "startup", G_CALLBACK (on_app_startup),
> NULL);
> + g_signal_connect (app, "activate", G_CALLBACK
> (on_app_activate), NULL);
> +
> + ret = g_application_run (G_APPLICATION (app), argc, argv);
> diff --git
> a/meta-gnome/recipes-extended/gnome-online-accounts-gtk/gnome-online-accounts-gtk_3.50.10.bb
> b/meta-gnome/recipes-extended/gnome-online-accounts-gtk/gnome-online-accounts-gtk_3.50.10.bb
> new file mode 100644
> index 0000000000..a28f24814f
> --- /dev/null
> +++
> b/meta-gnome/recipes-extended/gnome-online-accounts-gtk/gnome-online-accounts-gtk_3.50.10.bb
> @@ -0,0 +1,29 @@
> +# AI-Generated: Uses Claude Code (Claude Fable 5.1)
> +SUMMARY = "GTK frontend for configuring GNOME Online Accounts"
> +DESCRIPTION = "Standalone GTK4/libadwaita application to add and
> manage \
> +GNOME Online Accounts on desktops that do not ship
> gnome-control-center."
> +HOMEPAGE =
> "<https://github.com/xapp-project/gnome-online-accounts-gtk>"
> +SECTION = "x11/gnome"
> +LICENSE = "GPL-3.0-or-later"
> +LIC_FILES_CHKSUM =
> "file://COPYING;md5=d32239bcb673463ab874e80d47fae504"
> <file://copying;md5=d32239bcb673463ab874e80d47fae504/>
> +
> +DEPENDS = " \
> + glib-2.0 \
> + glib-2.0-native \
> + gnome-online-accounts \
> + gtk4 \
> + libadwaita \
> + libxml2-native \
> +"
> +
> +SRC_URI = " \
> +
> git://github.com/xapp-project/gnome-online-accounts-gtk.git;protocol=https;branch=master;tag=${PV}
> \
> +
> file://0001-Provide-the-org.gnome.Settings-launch-panel-interface.patch
> <file://0001-provide-the-org.gnome.settings-launch-panel-interface.patch/>
> \
> +"
> +SRCREV = "b42482522bc9089c139ceda9b8a7d81a7a149cf9"
> +
> +inherit meson pkgconfig gettext gtk-icon-cache
> +
> +FILES:${PN} += "${datadir}/dbus-1/services"
> +
> +RCONFLICTS:${PN} += "gnome-control-center"
> --
> 2.55.0
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#129802):
> <https://lists.openembedded.org/g/openembedded-devel/message/129802>
> Mute This Topic: <https://lists.openembedded.org/mt/121124941/3618223>
> Group Owner: openembedded-devel+owner@lists.openembedded.org
> <mailto:openembedded-devel+owner@lists.openembedded.org>
> Unsubscribe:
> <https://lists.openembedded.org/g/openembedded-devel/unsub>
> [f_l_k@t-online.de <mailto:f_l_k@t-online.de>]
> -=-=-=-=-=-=-=-=-=-=-=-
>
[-- Attachment #2: Type: text/html, Size: 13310 bytes --]
parent reply other threads:[~2026-09-07 5:54 UTC|newest]
Thread overview: expand[flat|nested] mbox.gz Atom feed
[parent not found: <18D2F4123820CD99.4159725@lists.openembedded.org>]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=JDCZKT.GS4THQSDE2DK2@t-online.de \
--to=f_l_k@t-online.de \
--cc=openembedded-devel@lists.openembedded.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox