Wayland Platform

The Wayland (wl) platform plug-in allows Cog to run under a compositor which supports the Wayland protocol. The following is a non-comprehensive list of compositors known to work:

  • GNOME Shell, in a Wayland session.
  • Weston, the reference compositor developed as part of the Wayland project.
  • Sway, a tiling compositor based on wlroots.
  • Cage, a kiosk-oriented compositor based on wlroots.
  • labwc, a lean stacking compositor based on wlroots.

The compositor needs to be running before attempting to launch Cog. The environment variables WAYLAND_DISPLAY and XDG_RUNTIME_DIR need to be defined with suitable values. The troubleshooting section provides some tips on how to obtain the needed values.

If you start Cog from within the compositor, e.g. running cog <url> from a terminal in a GNOME session, should work without any manual intervention.

A notable exception is Cage, because it is designed to run a single application under the compositor control. The command used to execute Cog needs to be provided when starting it:

cage -- cog wpewebkit.org

Weston and all the wlroots-based compositors listed above will run nested in their own window, inside another Wayland or X11 session, if the needed environment variables are set accordingly (XDG_RUNTIME_DIR, plus WAYLAND_DISPLAY, or DISPLAY for X11). This setup can be useful for development.

Requirements

The wl (Wayland) platform plug-in additionally requires the following libraries and packages:

  • WPEBackend-fdo
  • Wayland
  • libxkbcommon
  • wayland-protocols
  • wayland-scanner

Environment Variables

The following environment variables can be set to change how the Wayland surface used for output will be configured:

Variable Type Default
COG_PLATFORM_WL_VIEW_FULLSCREEN boolean 0
COG_PLATFORM_WL_VIEW_MAXIMIZE boolean 0
COG_PLATFORM_WL_VIEW_WIDTH number 1024
COG_PLATFORM_WL_VIEW_HEIGHT number 768

Setting COG_PLATFORM_WL_VIEW_FULLSCREEN will take precedence over COG_PLATFORM_WL_VIEW_MAXIMIZE, and if either of those are enabled the size specified with COG_PLATFORM_WL_VIEW_WIDTH and COG_PLATFORM_WL_VIEW_HEIGHT will be ignored.

Note that these are requests made to the Wayland compositor, which has the final say in how the surface is presented to the user. In general, surfaces which have been fullscreened completely cover the output (i.e. they take the whole screen), while for maximized surfaces the compositor my still show some user interface elements (like borders or buttons) while trying to make the surface as big as possible. Some compositors take faster approaches when there is only a single fullscreen surface being displayed.

Key Bindings

On top of the built-in keybindings, the additional following key bindings are supported:

Binding Action
F11 Toggle fullscreen.

Troubleshooting

Before looking further, check that:

  • There is a Wayland compositor running.
  • The XDG_RUNTIME_DIR environment variable points to a local path writable by the user account which will run Cog.
  • The WAYLAND_DISPLAY environment variable is defined and contains the name of an Unix socket which must be present at $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY.
  • The user account which will run Cog can access the device nodes needed for GPU rendering, typically present under /dev/dri.

If a compositor is running, the values needed for the WAYLAND_DISPLAY and XDG_RUNTIME_DIR environment variables can be found by pulling XDG_RUNTIME_DIR from the running process—make sure to replace cage when using a different compositor:

tr '\0' '\n' < /proc/$(pidof cage)/environ | grep '^XDG_RUNTIME_DIR='

Then look into the resulting location for a socket named wayland-N, where N is a number. The name of the socket is the value for WAYLAND_DISPLAY.

The following shell snippet will define both variables if needed:

# Needs Bash or Zsh

if [[ -z $XDG_RUNTIME_DIR ]] ; then
  eval "$(tr '\0' '\n' < /proc/$(pidof cage)/environ | grep '^XDG_RUNTIME_DIR=')"
fi

if [[ -z $WAYLAND_DISPLAY ]] ; then
  for path in "$XDG_RUNTIME_DIR"/* ; do
    name=${path#${XDG_RUNTIME_DIR}/}
    if [[ $name = wayland-* && -S $path ]] ; then
      WAYLAND_DISPLAY=$name
      break
    fi
  done
fi

if [[ -z $WAYLAND_DISPLAY ]] ; then
  echo 'No Wayland compositor running'
else
  export WAYLAND_DISPLAY XDG_RUNTIME_DIR
fi