river

From ArchWiki

river is a wlroots-based Wayland dynamic tiling compositor, inspired by, but not based on dwm, xmonad and bspwm. Configuration is by an external executable file.

Its declared design goals are:

  • Simple and predictable behavior, river should be easy to use and have a low cognitive load.
  • Window management based on a stack of views and tags.
  • Dynamic layouts generated by external, user-written executables. A default rivertile layout generator is provided.
  • Scriptable configuration and control through a custom Wayland protocol and separate riverctl binary implementing it.

Installation

River is installed with the river package or AUR git package river-gitAUR.

Starting

A single executable file is used as a configuration file. No initialisation file is set up for the user by default, so no keybindings or default applications are available until an init file is created. Note that this includes the exit keybinding, so set up in tty or another desktop environment before running river.

An example config init file is available in /usr/share/river/example/. Copy this as ~/.config/river/init and ensure it is executable.

Manually

Enter river (exits to tty with user still logged in) or exec river (more securely exits to tty with user logged out)

From TTY

River can be autostarted in a similar manner to startx, by setting up the environment variable checks in .bash_profile or the equivalent file for other shells. See Xinit#Autostart X at login, replacing $DISPLAY with $WAYLAND_DISPLAY, and running exec river.

Display manager

River does not officially support display managers but many will work with no or minimal effort. A session entry is installed by default in /usr/share/wayland-sessions/.

Configuration

The configuration file can be a shell script or executable program, comprising a list of riverctl individual commands which define key bindings, input settings and window rules. It is executed once at start-up but can be re-run like any other shell script (consider the effects of duplicating any autostarted spawned actions). Each setting can also be run individually by simply running the relevant riverctl line in a terminal. This allows temporary override of the init settings, dynamic updates and testing new settings.

For example, to map the shortcut Super+PrtSc to take a screenshot with the application grim and display a temporary notification:

riverctl map normal Super Print spawn "grim && notify-send -t 2000 'Screenshot taken'"

The spawn command can launch any application or script but expects a single word argument. Quote any longer expressions.

Keyboard layout

riverctl keyboard-layout gb

Multiple layouts can be entered as a comma-separated list, e.g. gb,fr.

Variables and other shell constructs can be used: mod='Mod4', set term foot, etc, as per your shell.

Touchpad examples

Certain touchpad behaviour and focus preferences are available.

riverctl input pointer-2-7-SynPS/2_Synaptics_TouchPad tap enabled
riverctl focus-follows-cursor normal

Exact keyboard, mouse and touchpad models for use in these settings can be identified using:

riverctl list-inputs

Window rules

It is sometimes desirable to set certain windows to be non-tiling by default. Floating windows can be defined by class or title:

riverctl float-filter-add app-id 'galculator'
riverctl float-filter-add title 'File Operation Progress'

Note that new rule-add settings will be introduced for River 0.3 and this syntax will change to fit these broader definitions:

riverctl rule-add -app-id 'galculator' float

Usage

Autostart

Use riverctl spawn without a keybinding to launch any executable at startup, for example:

riverctl spawn "i3-battery-popup -n -m 'Battery Low!'"

Tips and tricks

Scratchpads

River does not define any scratchpads by default, but these can be set up on any tag beyond the default 0-9. First, define the tag number, then the key mapping to move an application to the scratchpad tag and toggle its appearance, and, finally, prevent new windows being assigned to the scratchpad.

scratch_tag=$((1 << 20 ))

riverctl map normal Super P toggle-focused-tags ${scratch_tag}		# toggle the scratchpad
riverctl map normal Super+Shift P set-view-tags ${scratch_tag}		# send windows to the scratchpad

# Set spawn tagmask to ensure new windows do not have the scratchpad tag unless explicitly set.
all_but_scratch_tag=$(( ((1 << 32) - 1) ^ $scratch_tag ))
riverctl spawn-tagmask ${all_but_scratch_tag}

Modes

River supports modes for key mapping, which allows for reuse of mappings, and combinations of fewer keys. There are two default modes of 'normal' and 'locked' (defining allowed key mappings when the screen is locked). Custom modes can be added. Eg. if floating windows are rarely used, the key mapping to manipulate those windows can be defined in a 'float' mode. Entry and exit key mappings for the mode are set as the first and last mappings, with other mapping between these.

riverctl declare-mode float
riverctl map normal Super R enter-mode float		# Super+R to enter float mode
 
### Floating window mappings but note that these also apply to tiled windows.
#
# Super {Arrows} to move views
  riverctl map float Super Left move left 100
  riverctl map float Super Down move down 100
  riverctl map float Super Up move up 100
  riverctl map float Super Right move right 100
 
# Alt+{arrows} to snap views to screen edges
  riverctl map float Alt Left snap left
  riverctl map float Alt Down snap down
  riverctl map float Alt Up snap up
  riverctl map float Alt Right snap right
 
# Shift+{arrows} to resize views
  riverctl map float Shift Left resize horizontal -100
  riverctl map float Shift Down resize vertical 100
  riverctl map float Shift Up resize vertical -100
  riverctl map float Shift Right resize horizontal 100
 
riverctl map float None Escape enter-mode normal	# Escape to exit float mode and return to normal mode

External tools

In common with many other Wayland minimalist tiling clients, other tools are not included. Example external bars, screenshot tools, launchers, etc. are listed in the River wiki, including several with River-specific functionality.

Troubleshooting

Note that floating window modifiers also work on tiled windows, making them floating and giving potentially unpredictable layouts.

The current stable version of River does not support autostarting windows on specific workspaces, but the git version (0.3) introduces a rule-add option for riverctl, bringing this functionality.

See also