1. ryudo(1)
  2. ryudo(1)


ryudo - The floatiling window manager that flows


ryudo [ -font FONTNAME ] [ -term TERMPROG ] [ -virtuals NUMVIRTS ] [ -ffm ] [ -version ] [ exit | restart ]


Ryudo is a window manager for X which is a fork of rio from plan9port by Russ Cox, which is itself a fork of David Hogan's 9wm. Ryudo aims to be a more dynamic and configurable window manager while keeping most of the behavior of Rio.

The -font option sets the font in ryudo's menu to FONTNAME, overriding the default/fallback list in the config.h. As in rio, this is an X11 font, not a Plan 9 font.

The -term option sets the default terminal emulator, overriding the builtin defaults of urxvt, 9term, and xterm.

The -virtuals option sets the number of virtual desktops (an integer from 1 to 12). The default, and their names, is set in the config.h.

The -ffm option sets the focus model to "focus-follows-mouse", instead of "click-to-focus".

The -version option prints the current version to stderr and then exits.

If either exit or restart is given, the appropriate message is sent to an already-running ryudo instance to execute the named action.


Run the provided build.sh and install.sh scripts to build and install ryudo. If run as root, they will install the program and manual pages to the PLAN9 installation path and install the startryudo session wrapper to /usr/bin/ and a .desktop file to /usr/share/xsessions/ If run as a regular user, they will install the program to ~/bin/9/ and not install the manual pages, wrapper, or .desktop file.

Building requires plan9port and the libX11 and libXT headers. Optionally, libnotify is used to show notifications when switching virtual desktops.


Many configuration options have been enabled as compile-time options configured in the config.h configuration file. The config.def.h file shipped with the source code documents all of the options and contains what I hope are sane defaults. If config.h does not exist in the source directory, it will be copied from config.def.h on build. After changing the configuration file, it is necessary to run the build.sh and/or install.sh script again and restart the program.

Session autostart programs can be placed in ~/.ryudorc, and command line arguments to ryudo can be placed in ~/.ryudo.conf -- these are sourced by startryudo.


Right-clicking on the desktop or an inactive window opens a menu with the following options (not all enabled by default):

Windows may be arranged by dragging their borders. Mouse buttons 1 or 2 can be used to drag an individual side/corner of a window around, resizing it. Mouse button 3 can be used to move the whole window.

Mouse button 2 on the desktop or an inactive window opens the virtual desktop list.

Mouse button 1 focuses a window. The click is not transferred to the window (you can only interact with it once it has been made active).

Alt-Tab cycles focus through all windows on the current desktop.

The following operations are bindable to key combinations (shown are the default bindings):


Multimonitor output is not currently supported -- the whole "screen" (collection of active monitors) is treated as one monitor, and keybinds and automatic window placement will not work properly.

Click events don't pass through when clicking to activate a window.

Clicking mouse button 2/3 on an inactive window brings up the Button 2/3 Menu instead of focusing the window. I personally sometimes find this behavior useful.

Programs that expect to run fullscreen will probably just open in a window the size of whatever resolution they expect to run at. Depending on the implementation, they may respond well to being maximized or you may have to change your screen resolution manually before doing so.

Fullscreen Virtualbox VM windows are a strange outlier and start with their graphics offset. Maximize the window after opening and it should be good.

While there is naitive support for per-window opacity via the OPACITY and TRANSPARENTLIST configuration macros, there is no support for per-pixel opacity. Programs that expect this behavior will render all pixels at the same opacity (unless using the XSHAPE extension for boolean opacity per-pixel (eg, xeyes), which works.)



rio(1), 9term(1)

  1. November 2021
  2. ryudo(1)