[legacy] Desktop App Support - GTK3 applications without extensions

:warning: This method is not recommended anymore. These instructions are outdated.

Please use the gnome-3-28 extension instead. It does everything explained here automatically, and it contains a number of improvements. See GTK3 applications for a complete tutorial on how to use the extension.

GTK3 for snaps using base property

The GTK3 libraries are available in the gnome-platform content snap and the snapcraft desktop helpers project provides the desktop-launch script to configure the environment for GTK3.

First copy the definition of the desktop-gnome-platform part from the Snapcraft Desktop Helpers snapcraft.yaml into your Snapcraft recipe, in the parts section. Change the source property of this part to https://github.com/ubuntu/snapcraft-desktop-helpers.git.

parts:
  # This part installs the `desktop-launch` script which initialises desktop
  # features such as fonts, themes and the XDG environment.
  #
  # It is copied straight from the snapcraft desktop helpers project. Please
  # periodically check the source for updates and copy the changes.
  #    https://github.com/ubuntu/snapcraft-desktop-helpers/blob/master/snapcraft.yaml
  #
  desktop-gnome-platform:
    source: https://github.com/ubuntu/snapcraft-desktop-helpers.git
    ...
    <please copy the rest of this part from the desktop helpers snapcraft.yaml>
    ...

Prepend the desktop-launch script in the app command.

apps:
  audiocoder:
    command: bin/desktop-launch $SNAP/bin/audiocoder-gtk

Add the following plugs to connect your snap to the gnome-platform snap for the GTK libraries and the gtk-common-themes snap for common GTK themes. This uses the content interface to mount files of the gnome-platform and the gtk-common-themes snaps into your snap.

plugs:
  # GTK libraries
  gnome-3-28-1804:
    interface: content
    target: $SNAP/gnome-platform
    default-provider: gnome-3-28-1804
  # Common GTK themes
  gtk-3-themes:
    interface: content
    target: $SNAP/data-dir/themes
    default-provider: gtk-common-themes
  icon-themes:
    interface: content
    target: $SNAP/data-dir/icons
    default-provider: gtk-common-themes
  sound-themes:
    interface: content
    target: $SNAP/data-dir/sounds
    default-provider: gtk-common-themes

Finally, connect your snap to the following desktop interfaces so it has permission to access desktop functionality.

apps:
  audiocoder:
    plugs:
    - desktop
    - desktop-legacy
    - wayland
    - x11
    - unity7

Snapcraft will warn you several libraries are not found in the snap and the base snap as some of them are provided via the gnome-platform content snap instead. Disregard those warning and only add the libraries that are really missing from the snap to the stage-packages.

apps:
  audiocoder:
    stage-packages:
    - gstreamer1.0-libav
    - gstreamer1.0-plugins-base
    - gstreamer1.0-plugins-good
    - gstreamer1.0-plugins-ugly
    - gstreamer1.0-pulseaudio
    - libappindicator3-1

Take a look at the GTK3 Demo snap for a fully working example.

GTK3 for snaps without base property set

GTK3 applications should reference the desktop-gtk3 remote part.

In this snippet, the remote part is referenced as a null part:

parts:
    desktop-gtk3:
        # You may optionally override parts of the remote part definition

    audiocoder:

Run snapcraft define _remote_part_name_ to check out the remote part’s definition.

In addition, the launcher script which sets up the environment should prepend the actual app command in the apps section. Typically it’s also necessary to specify the full path to the target binary after the launcher.

apps:
   command: desktop-launch $SNAP/usr/bin/audiocoder-gtk
       plugs: [network, desktop, desktop-legacy]

These pre-defined parts do not automatically pull in all necessary GTK libraries, but the minimum required by most applications.

The developer is expected to list any further libraries as stage-packages or additional parts.

References

1 Like