Mondrian
A tiling window manager for Windows 11, built with Rust.
Install / Use
/learn @policastro/MondrianREADME
<img src="./assets/mondrian.ico" width="20" height="20"> Mondrian
Mondrian is a tiling window manager built with Rust for Windows 11.
🌟 Key Features
- Automatic/manual window placement with different tiling layouts;
- Keybindings;
- Multi-monitor support;
- Mouse movements support (moving/resizing windows);
- Compatible with Virtual Desktops;
- Workspaces;
- System tray application;
- Multiple animations;
- Highly customizable.
Getting Started
Usage
To start Mondrian, just download the mondrian.exe executable from the latest release and run it.
The application takes the following arguments (all of them are optional):
./mondrian.exe --log <LOG_TYPE> --loglevel <LOGLEVEL> --dumpstateinfo --healthcheck
Where:
<LOG_TYPE>can be 0 (no log file is created), 1 (error log files is created) or 2 (all log files are created). By default, it is set to 1.<LOG_LEVEL>can be 0 (off), 1 (trace), 2 (debug), 3 (info), 4 (warn) or 5 (error). By default, it is set to 3.dumpstateinfodump the application state into a file (./logs/app_state.txt) at the start of the application;healthcheckenables health checks to detect freezes.
All the log files will be stored in the application directory under the logs subfolder. When a log file reaches 10MB, it will be archived in a .gz file (up to three previous versions).
Moving windows
You can swap two windows in the same monitor just by dragging one of them into the other. While dragging, you can:
- hold
ALT, to swap the windows and to invert the direction of the tiles;
When the window is dragged to another monitor, by default it will be inserted. In this case, you can:
- hold
SHIFTwhile dragging the window to swap the windows; - hold
ALTwhile dragging the window to insert the windows and to invert the direction of the tiles.
By changing the insert_in_monitor configuration option to false, the window will be swapped in the other monitor by default. In this case, you can:
- hold
SHIFTwhile dragging the window to insert the windows; - hold
ALTwhile dragging the window to insert the window and to invert the direction of the tiles.
If you drag a window while holding CTRL, you can place the window freely based on the cursor position relative to an other window.
In particular:
- if the cursor is at the top of an other window (i.e. <=20% of its height), the moving window will be placed above it;
- if the cursor is at the bottom of an other window (i.e. >=80% of its height), the moving window will be placed below it;
- if the cursor is to the left of an other window (i.e. <=50% of its width), the moving window will be placed to the left of it;
- if the cursor is to the right of an other window (i.e. >50% of its width), the moving window will be placed to the right of it.
Holding CTRL has the same effect when dragging the window to another monitor (by default).
You can set the free_move_in_monitor configuration option to true if you want to place the window freely in another monitor without holding CTRL (in this case, holding CTRL will position the window automatically).
Below a table that shows the keybindings for moving/swapping windows in different monitors, depending on the values of the insert_in_monitor and free_move_in_monitor configuration options:
| insert_in_monitor | free_move_in_monitor | No key | CTRL | SHIFT | ALT |
| :-----------------: | :--------------------: | :------------: | :------------: | :----------: | :--------------------------: |
| false | false/true | swaps | inserts freely | inserts auto | inserts auto + inverts tiles |
| true | false | inserts auto | inserts freely | swaps | inserts auto + inverts tiles |
| true | true | inserts freely | inserts auto | swaps | inserts auto + inverts tiles |
If more than one modifier is held, the precedence order is as follows: ALT > CTRL > SHIFT.
Resizing windows
Windows can be resized as usual just by dragging their borders.
Configuration
[!WARNING] The application is still evolving and changes between versions may introduce breaking changes. Be sure to check the release notes before updating.
Mondrian can be configured by editing the mondrian.toml file located in the ~/.config/mondrian directory.
If the configuration file does not exist, it will be created automatically when the application starts. The configuration generated by the application can be found here.
Configuration options
| Option | Description | Values | Default |
| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- |
| layout.tiling_strategy | Tiling strategy | "golden_ratio", "horizontal", "vertical", "twostep", "squared" | "golden_ratio" |
| layout.paddings.tiles | Padding between tiles (in px) | 0 - 100 | 12 |
| layout.paddings.borders | Padding between border and tiles (in px) | A number, a 2-tuple ([vertical, horizontal]) or a 4-tuple ([top, right, bottom, left]). All values must be between 0 and 140. | 18 |
| layout.half_focalized_paddings.tiles | Padding between tiles for half-focalized windows (in px) | 0 - 100 | 12 |
| layout.half_focalized_paddings.borders | Padding between border and tiles for half-focalized windows (in px) | A number, a 2-tuple ([vertical, horizontal]) or a 4-tuple ([top, right, bottom, left]). All values must be between 0 and 140. | 18 |
| layout.focalized_padding | Padding between border and focalized window (in px) | A number, a 2-tuple ([vertical, horizontal]) or a 4-tuple ([top, right, bottom, left]). All values must be between 0 and 140. | 8 |
| layout.strategy.golden_ratio.ratio | The ratio of the first split | 10 - 90 | 50 |
| layout.strategy.golden_ratio.clockwise | Places the windows clockwise or counterclockwise | true, false | true |
| layout.strategy.golden_ratio.vertical | If true, the layout will be vertical | true, false | false |
| layout.strategy.twostep.first_step | First insertion direction | "right", "left", "up", "down" | "right" |
| layout.strategy.twostep.second_step | Second insertion direction | "right", "left", "up", "down" | "down" |
| layout.strategy.twostep.ratio | Ratio of the first split | 10 - 90 | 50 |
| layout.strategy.horizontal.grow_right | If true, the layout will grow on the right side | true, false | true |
| layout.strategy.vertical.grow_down | If true, the layout will grow on the bottom side
Related Skills
node-connect
343.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
90.0kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
343.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
343.1kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
