tl;dr: If you want to be sure your application will be displayed with
the correct icon under different Wayland compositors make sure that
on GTK+3. On GTK+4 this is handled for you.
Details: While working on touch based window switching for the
Librem5 I noticed that lots of the GNOME application did not end up
with a proper icon when using
The desktop_id is determined from the Wayland xdg surface's app_id
as specified by in Wayland's xdg-shell protocol.
The protocol says:
The compositor shell will try to group application surfaces together
by their app ID. As a best practice, it is suggested to select app
ID's that match the basename of the application's .desktop file.
For example, "org.freedesktop.FooViewer" where the .desktop file is
It's even more explicit about the relation of the app_id to the D-Bus service name:
For D-Bus activatable applications, the app ID is used as the D-Bus
So why does this currently fail? It's because GTK+3 historically uses
g_get_prgname() to set the app_id and this defaults to
application's basename. But what we rather want is
g_application_id == D-Bus service name == $(basename desktop_file_path .desktop) == xdg app_id
This will also allow us to get rid of all the
the flatpak manifests too.
(The reason why this currently works in gnome-shell is because there's a private protocoll between GTK+ and GNOME Shell that (among other things) works around this).
Update: to check what app_id Wayland is seeing use:
WAYLAND_DEBUG=1 your_program |& grep 'xdg_toplevel@[0-9]\+\.set_app_id'