Tips & Tricks - WayfireWM/wayfire GitHub Wiki
Tips & Tricks
Table of Contents
- Gtk+3 applications slow startup or .desktop files not opening
- Run xwayland apps as root
- Wine
- Screensavers
- Login and gtkgreet with wayfire
- Logout and shutdown
- Remote desktop
- Native webcam
- High CPU usage
- Catch crashes with systemd-coredump
- Screen sharing
- Setting up monitor frequency if wayfire.ini does not work
- GTK Theme not working
- Getting the title and app-id of windows
- Starting Wayfire as a systemd service
Gtk+3 applications slow startup or .desktop files not opening
This is due to GTK+ waiting for xdg-desktop-portal to start via D-Bus. This times out because the D-Bus activated service doesn't know what WAYLAND_DISPLAY
to connect to. This can also cause some .desktop files not to open on XDG Desktop Entry spec-compliant menus (like wf-panel
) if they are DBusActivatable=true
. Add the following to your configuration file:
[autostart]
0_environment = dbus-update-activation-environment --systemd WAYLAND_DISPLAY DISPLAY XAUTHORITY
For more details: https://github.com/WayfireWM/wayfire/issues/775
Run xwayland apps as root
This is a small wrapper script that uses xhost
and sudo
to launch x11 clients as root under xwayland. Save to a file, make executable and use in place of sudo to run an x11 client with privileges in wayfire.
#!/bin/bash
# small script to enable root access to x-windows system
# enable root access
xhost +SI:localuser:root
sudo -E $@
# disable root access after application terminates
xhost -SI:localuser:root
Wine
If you are having trouble with wine applications, such as input not responding, tearing windows, or buggy mouse behavior in some fullscreen games check the following:
- Make sure xwayland is enabled in wayfire meson configure output and in wayfire.ini [core] xwayland = 1
- In winecfg in the Graphics tab, enable 'Automatically capture mouse in full screen mode', disable 'Allow the window manager to decorate the windows', disable 'Allow the window manager to control the windows' and enable 'Emulate a virtual desktop'
Note for Wine/Proton games launched via Stream: you may need to set WINEPREFIX
and WINEARCH
and call the correct wine
executable for the game you are configuring. For example (adjusting the command for the particular game id and steam installation path):
WINEPREFIX=~/.local/share/Steam/steamapps/compatdata/11020/pfx/ WINEARCH=win64 ~/.local/share/Steam/steamapps/common/Proton\ -\ Experimental/files/bin/wine64 winecfg.exe
Screensavers
The Idle plugin offers a built in screensaver for wayfire. It has options to choose either DPMS or screensaver timeout. If the cube plugin is enabled, the Idle screensaver timeout will rotate the cube based on settings found in the Idle plugin. Otherwise, the screen will just become black on timeout. There is also swayidle which can be used in conjunction with a special version of xscreensaver. It is recommended to install this version of xscreensaver to a nonstandard prefix because it will not work correctly with X. To use it, make two entries in the Autostart plugin like so:
a2 = /opt/xscreensaver/bin/xscreensaver -nosplash
a3 = swayidle timeout 60 '/opt/xscreensaver/bin/xscreensaver-command -activate' resume '/opt/xscreensaver/bin/xscreensaver-command -deactivate'
Change the prefix accordingly. The first will start the daemon and the second will activate the screensaver after 60 seconds of inactivity. You may change this value to your liking.
Login and gtkgreet with wayfire
This is a sample config that uses gtkgreet and wayland-logout and can be used with wayfire -c
[autostart]
autostart_wf_shell = false
dm = gtkgreet -l && wayland-logout
[core]
plugins = autostart
vheight = 1
vwidth = 1
xwayland = false
Logout and shutdown
Wayfire has a hard coded keybinding Ctrl+Alt+BkSpc to shutdown. It also supports layer shell protocol, which makes it possible to use a program such as wlogout to log out and shut down. There is also wayland-logout which kills the current wayland compositor instance.
Remote desktop
With virtual pointer support, programs like wayvnc are possible.
If you find that your pointer is not following the cursor on the virtual desktop you might need to map the virtual input to the specific output wayvnc is running on. https://github.com/WayfireWM/wayfire/wiki/Configuration#input-device-specific-options
In your wayfire config file add:
[input-device:wlr_virtual_pointer_v1]
output = DP-1
[input-device:wlr_virtual_keyboard_v1]
output = DP-1
change device and output names accordingly.
You can get the name of the input device by reviewing the wayfire log when connecting to a wayvnc session. Wayfire should be run with the debug option wayfire -d
Native webcam
Use the following command to show /dev/video0 in a native window with gst-launch-1.0 (gstreamer). Note that glimagesink must be available.
gst-launch-1.0 -v v4l2src device=/dev/video0 ! glimagesink
High CPU usage
Compile wayfire with the release
buildtype to enable performance optimizations.
meson -Dbuildtype=release build
Catch crashes with systemd-coredump
Build wayfire with the flag -Dprint_trace=false
Screen sharing
To enable screen sharing in chromium
Add the following lines to the configuration file wayfire.ini
[autostart]
0_0 = systemctl --user import-environment
xdg = sleep 1 && (XDG_SESSION_TYPE=wayland XDG_CURRENT_DESKTOP=sway /usr/lib/xdg-desktop-portal --replace & /usr/lib/xdg-desktop-portal-wlr)
(This is for arch linux, for other distributions the path could have /libexec/ instead of /lib/)
Install xdg-desktop-portal
and xdg-desktop-portal-wlr
Edit the configuration file ~/.config/xdg-desktop-portal-wlr/config
[screencast]
output_name=
max_fps=30
chooser_cmd=slurp -f %o -or
chooser_type=simple
(you should add your output_name)
test that this script works: https://gitlab.gnome.org/-/snippets/19
set this flag on chrome
chrome://flags/#enable-webrtc-pipewire-capturer
Setting up monitor frequency if wayfire.ini does not work
If your output = kanshi as default, you may need to create a config file in $HOME/.config/kanshi/config with your desired settings e.g:
profile {
output DP-1 mode [email protected] position 0,0
}
See kanshi git for more info: https://github.com/emersion/kanshi
GTK Theme not working
This script from a sway article can set your theme for you, assuming you already had one set with X.
#!/bin/sh
# .config/setWaylandTheme.sh
# usage: import-gsettings
config="${XDG_CONFIG_HOME:-$HOME/.config}/gtk-3.0/settings.ini"
if [ ! -f "$config" ]; then exit 1; fi
gnome_schema="org.gnome.desktop.interface"
gtk_theme="$(grep 'gtk-theme-name' "$config" | sed 's/.*\s*=\s*//')"
icon_theme="$(grep 'gtk-icon-theme-name' "$config" | sed 's/.*\s*=\s*//')"
cursor_theme="$(grep 'gtk-cursor-theme-name' "$config" | sed 's/.*\s*=\s*//')"
font_name="$(grep 'gtk-font-name' "$config" | sed 's/.*\s*=\s*//')"
gsettings set "$gnome_schema" gtk-theme "$gtk_theme"
gsettings set "$gnome_schema" icon-theme "$icon_theme"
gsettings set "$gnome_schema" cursor-theme "$cursor_theme"
gsettings set "$gnome_schema" font-name "$font_name"
add the script to autostart in your wayfire.ini. don't forget to add exec permissons.
[autostart]
a0 = ~/.config/setWaylandTheme.sh
Getting the title and app-id of windows
Getting the title and/or app-id of a view/window (e.g. for use with the window-rules
plugin) requires the use of the wlr-foreign-toplevel-management-v1
protocol. Prior to Wayfire 0.8.0, this was implemented in core, but it's now implemented by the foreign-toplevel
plugin.
Once support is enabled, a list of the title and app-id of views/windows can be found via the lswt
program. Alternatively, one can compile and run the foreign-toplevel.c
program; prior to 2023-10-12, this was available in the examples
directory of the wlroots source, but is now part of the wlr-clients repository.
Starting Wayfire as a systemd service
System Unit
You should obviously consider the security implications that starting wayfire automatically could have.
These instructions are inspired from Weston's. In order to start wayfire, we need to have a libseat session running (which is why it's not possible eg. to start it directly from an ssh session), and the unit adds boilerplate that enables it.
[Unit]
Description=Wayland Compositor Service
After=systemd-user-sessions.service
After=graphical.target
After=session-c1.scope
[Service]
Type=simple
ExecStart=/usr/bin/wayfire
Restart=always
RestartSec=10
User=wayfireuser
# Reuse /etc/pam.d/login
PAMName=login
# Set some useful variables
Environment=XDG_RUNTIME_DIR=/run/user/%U
Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%U/bus
Environment=LIBSEAT_BACKEND=logind
Environment=XDG_SESSION_CLASS=greeter
Environment=XDG_SESSION_TYPE=wayland
# A virtual terminal is needed, we're using #7
TTYPath=/dev/tty7
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
# Fail to start if not controlling the tty.
StandardInput=tty-fail
# To get -d output
StandardOutput=journal
StandardError=journal
# Log this user with utmp, letting it show up with commands 'w' and 'who'.
UtmpIdentifier=tty7
UtmpMode=user
# Activate seat... cf. https://github.com/cage-kiosk/cage/issues/383
ExecStartPre=+chvt 7
[Install]
WantedBy=graphical.target