Tiling window manager for the river wayland compositor, inspired by dwm and xmonad
- Per-tag state
- Master/stack(s) left, right and wide layouts
- Monocle with alternate borders
- Layout toggling
- Dwindling, diminishing and even stacks
- Inner, outer and smart gaps
Layout | Symbol | Master | Stack | Directions |
---|---|---|---|---|
Left | │ ├─┤ |
Left | Right | Down, Right |
Right | ├─┤ │ |
Right | Left | Down, Left |
Top | ├─┬─┤ |
Top | Bottom | Right, Down |
Bottom | ├─┴─┤ |
Bottom | Top | Right, Up |
Wide | ├─┤ ├─┤ |
Mid | Left | Up, Left |
Right | Down, Right | |||
Monocle | │ n │ |
All | - | - |
- QUICK START
- EXAMPLE LAYOUTS AND STACKS
- LAYOUTS
- STACK ARRANGEMENTS
- GAPS
- INSTALL
- USAGE
- OPTIONS
- COMMANDS
- RECIPES
- FAQ
- ISSUES
$XDG_CONFIG_HOME/river/init
Set server side decorations.
Required to display borders on all windows.
riverctl rule-add ssd
Set the layout generator and start it.
All defaults shown here, none are required.
Log file is strongly recommended.
# set layout manager
riverctl default-layout wideriver
# start layout manager
wideriver \
--layout left \
--layout-alt monocle \
--stack dwindle \
--count-master 1 \
--ratio-master 0.50 \
--count-wide-left 0 \
--ratio-wide 0.35 \
--no-smart-gaps \
--inner-gaps 0 \
--outer-gaps 0 \
--border-width 2 \
--border-width-monocle 0 \
--border-width-smart-gaps 0 \
--border-color-focused "0x93a1a1" \
--border-color-focused-monocle "0x586e75" \
--border-color-unfocused "0x586e75" \
--log-threshold info \
> "/tmp/wideriver.${XDG_VTNR}.${USER}.log" 2>&1 &
Create some command mappings e.g.
riverctl map normal $mod1 up send-layout-cmd wideriver "--layout monocle"
riverctl map normal $mod1 down send-layout-cmd wideriver "--layout wide"
riverctl map normal $mod1 left send-layout-cmd wideriver "--layout left"
riverctl map normal $mod1 right send-layout-cmd wideriver "--layout right"
riverctl map normal $mod1 Space send-layout-cmd wideriver "--layout-toggle"
riverctl map normal $mod1 plus send-layout-cmd wideriver "--ratio +0.025"
riverctl map normal $mod1 equal send-layout-cmd wideriver "--ratio 0.35"
riverctl map normal $mod1 minus send-layout-cmd wideriver "--ratio -0.025"
riverctl map normal $mod2 plus send-layout-cmd wideriver "--count +1"
riverctl map normal $mod2 equal send-layout-cmd wideriver "--count 1"
riverctl map normal $mod2 minus send-layout-cmd wideriver "--count -1"
riverctl map normal $mod2 e send-layout-cmd wideriver "--stack even"
riverctl map normal $mod2 w send-layout-cmd wideriver "--stack dwindle"
riverctl map normal $mod2 i send-layout-cmd wideriver "--stack diminish"
riverctl send-layout-cmd wideriver "--layout left --stack dwindle --count 1 --ratio 0.5"
Master Stack
____________________________________________________________
| | |
| | |
| | 2 |
| | |
| | |
| 1 |_____________________________|
| | | |
| | | 4 |
| | 3 |______________|
| | | | |
| | | 5 | 6 |
|____________________________|______________|______|_______|
The master area occupies half of the available space and contains one view.
The stack is filled in a diminishing manner in a downward then rightward directions.
2 may be moved into the master area with riverctl send-layout-cmd wideriver "--count +1"
and will be evenly placed below 1.
riverctl send-layout-cmd wideriver "--layout right --stack even --count 2 --ratio 0.55"
Stack Master
____________________________________________________________
| | |
| | |
| 3 | 1 |
|_________________________| |
| | |
| |________________________________|
| 4 | |
|_________________________| |
| | 2 |
| | |
| 5 | |
|_________________________|________________________________|
The master area occupies 55% of the available width and contains two views split evenly.
The stack is split evenly and is filled in a downwards direction.
riverctl send-layout-cmd wideriver "--layout wide --stack diminish --count 3 --ratio 0.4"
Left Stack Master Right Stack
________________________________________________________________________________
| 1 | | |
|______________________| | |
| | | 5 |
| 2 | | |
| | |_______________________|
|______________________| | |
| | 4 | 6 |
| | | |
| | |_______________________|
| 3 | | 7 |
| | |_______________________|
|______________________|_______________________________|__________8____________|
The master area occupies 40% of the available with and contains one view.
The left stack contains 3 views, the right stack the remainder.
The left and right stacks each occupy 30% of the available width.
5 may be moved into the master area with riverctl send-layout-cmd wideriver "--count +1"
. 4 will be placed at the “top” of the stack, below 3.
riverctl send-layout-cmd wideriver "--layout monocle"
____________________________________________________________
| |
| |
| |
| |
| |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
|__________________________________________________________|
Only the currently focused view will be visible.
The symbol is the layout name which may be shown in a status bar such as Waybar’s river/layout module.
Dynamic settings are available via COMMANDS
ratio and count are persisted per tag and shared by all layouts except wide, which has its own values.
stack is persisted per tag and shared by all layouts.
When multiple tags are focused, the state is persisted for only the lowest tag.
One master area occupying the full height of the available area with a stack area to the left or right.
ratio is the proportion of the available area occupied by master.
count is the number of evenly evenly stacked views in the master area.
Left: │ ├─┤
when count > 0 otherwise │├──┤
Right: ├─┤ │
when count > 0 otherwise ├──┤│
One master area occupying the full height of the available area with a stack area to the left and the right.
ratio is the proportion of the available area occupied by master. Stacks occupy half of the remaining area.
count is the number of views in the left stack.
Master is centred when there are left and right stacks, otherwise it expands into the area that would be occupied the empty stacks.
├─┤ ├─┤
when count > 0 otherwise ││ ├─┤
Only one view is focused, occupying all of the available space.
│ n │
with n
showing number of views only when greater than 1.
3 arrangements are available for the stack area. It is persisted per tag and applied to all layouts for that tag. See above for an example of each arrangement.
Stacks follow one or two directions determined by the layout.
This is the “traditional” arrangement with uniformly sized stack views.
Arranged in a column or row in the first stack direction only.
Arranged in a column or row in the first stack direction only.
Height or width diminishes according to the view’s position in the stack:
2p / (n^2 + n)
n
number of views in the stack
p
position in the stack
Arranged in a dwindling manner alternating in both stack directions.
Each view occupies half the available / remaining area.
Gaps, in pixels, between windows may be injected. They are off by default.
--inner-gaps
(i
) are between windows.
--outer-gaps
(o
) are between the edge of the screen and windows.
--smart-gaps
automatically hides the gaps when there is only one view or monocle layout.
--border-width-smart-gaps
the border width for when smart gaps hides the gaps, excluding monocle layout. For a seamless experience, set this to the same value as --border-width-monocle
----------------------------------------------------------
| o o o o o o o o o o o o |
| ---------------------- ----------------------- |
| o | | i | | o |
| | | | | |
| o | | i | | o |
| | | ----------------------- |
| o | | i i i i i i i o |
| | | ----------------------- |
| o | | i | | o |
| | | | | |
| o | | i | | o |
| ---------------------- ----------------------- |
| o o o o o o o o o o o o |
----------------------------------------------------------
See CONTRIBUTING.md
git clone clone git@github.com:alex-courtis/wideriver.git
cd wideriver
make
sudo make install
Should install under /usr/local
Usage: wideriver [OPTIONS...|COMMANDS...]
OPTIONS, startup:
--layout monocle|left|right|top|bottom|wide left
--layout-alt monocle|left|right|top|bottom|wide monocle
--stack even|diminish|dwindle dwindle
--count-master count 1 0 <= count
--ratio-master ratio 0.50 0.1 <= ratio <= 0.9
--count-wide-left count 0 0 <= count
--ratio-wide ratio 0.35 0.1 <= ratio <= 0.9
--(no-)smart-gaps
--inner-gaps pixels 0 0 <= gap size
--outer-gaps pixels 0 0 <= gap size
--border-width pixels 2 0 <= width
--border-width-monocle pixels 0 0 <= width
--border-width-smart-gaps pixels 0 0 <= width
--border-color-focused 0xRRGGBB[AA] 0x93a1a1
--border-color-focused-monocle 0xRRGGBB[AA] 0x586e75
--border-color-unfocused 0xRRGGBB[AA] 0x586e75
--help
--log-threshold debug|info|warning|error info
--version
COMMANDS, sent via riverctl(1):
--layout monocle|left|right|top|bottom|wide
--layout-toggle
--stack diminish|dwindle|dwindle
--count [+-]count 0 <= count
--ratio [+-]ratio 0.1 <= ratio <= 0.9
--layout
monocle
|left
|right
|top
|bottom
|wide
Initial layout, default left
.
--layout-alt
monocle
|left
|right
|top
|bottom
|wide
Initial alternate layout, default monocle
. Use --layout-toggle
to switch to alternate layout.
--stack
even
|diminish
|dwindle
Initial stacking method, default dwindle
.
--count-master
count
Initial number of views in the master area, default 1
, minimum 0
. Does not apply to wide layout.
--ratio-master
ratio
Initial proportion of the width or height the master area occupies, default 0.5
, minimum 0.1
, maximum 0.9
. Does not apply to wide layout.
--count-wide-left
count
Initial number of views in the wide layout’s left stack area, default 1
, minimum 0
. You may wish to set this to 0 for a more natural or intuitive feel when launching the first two views.
--ratio-wide
ratio
Initial proportion of the width the wide layout’s master area occupies, default 0.35
, minimum 0.1
, maximum 0.9
. The default value is best suited to ultrawide monitors, a value of 0.5
may be more useful for 16:9 monitors.
--(no-)smart-gaps
Automatically hides the gaps when there is only one view or monocle layout.
--inner-gaps
pixels
Inner gaps width, default 0
, minimum 0
.
--outer-gaps
pixels
Outer gaps width, default 0
, minimum 0
.
--border-width
pixels
Border width for all layouts except monocle, default 2
, minimum 0
.
--border-width-monocle
pixels
Border width for monocle layout, default 0
, minimum 0
.
--border-width-smart-gaps
pixels
Border width for when smart gaps hides the gaps for all layouts except monocle, default 0
, minimum 0
. Has no effect if --no-smart-gaps
.
--border-color-focused
0x
RRGGBB[AA]
Border color for focused views in all layouts excluding monocle, default 0x93a1a1
.
--border-color-focused-monocle
0x
RRGGBB[AA]
Border color for focused view in monocle layout, default 0x586e75
. It is recommended to set this to the unfocused color or a darker colour as an always focused border can be distracting.
--border-color-unfocused
0x
RRGGBB[AA]
Border color for unfocused views in all layouts, default 0x586e75
. Does not apply for monocle layout.
--log-threshold
debug
|info
|warning
|error
Minimum log level, default info
.
When multiple tags are focused, the command is applied to and persisted for only the lowest tag.
--layout
monocle
|left
|right
|top
|bottom
|wide
Set layout persistently for the tag, updating the alternate layout.
--layout-toggle
Set layout to the alternate (previous) for the tag.
--stack
diminish
|dwindle
|dwindle
Set stacking method persistently for the tag. Applies to all layouts for the tag.
--count
[+-
]count
Increment, decrement or set the master count, minimum 0
. For wide layout this is instead the left stack count. Discrete value for wide and all other layouts are persisted per tag. Prefix with +
to increment, -
to decrement, or an absolute value.
--ratio
[+-
]pixels
Increase, decrease or set the master ratio: the proportion of the width or height the master area occupies, minimum 0.1
, maximum 0.9
. Discrete tiling and wide values persisted per tag. Prefix with +
to increase, -
to decrease, or an absolute value.
You can “shuffle” views through master, focusing the new master using:
riverctl send-layout-cmd wideriver '--count +1' && riverctl focus-view next"
riverctl send-layout-cmd wideriver '--count -1' && riverctl focus-view previous"
The layout name will not update when there are no views for the selected tags. This can occurs when setting a tag with no views or changing the layout for a tag with no views.
This may be resolved with a river enhancement: #1004
Please ensure you have enabled server side decorations i.e. the borders:
riverctl rule-add ssd
You can still use client side decorations for specific applications e.g.:
riverctl rule-add -app-id audacity csd
This is a known river and wlroots issue: https://codeberg.org/river/river/issues/816
Workaround: set a river background colour other than default black 0x000000
riverctl background-color "0x010101"
is sufficiently close.
Please raise a Bug Report
Please create a Feature Request
Please raise an Issue
CONTRIBUTING.md is most gratefully appreciated.