Linux auto tiling manager with hot corner support for Openbox, Fluxbox, IceWM, Xfwm, KWin, Marco, Muffin, Mutter and other EWMH compliant window managers using the X11 window system. Therefore, this project provides dynamic tiling for XFCE, LXDE, LXQt, KDE and GNOME (Mate, Deepin, Cinnamon, Budgie) based desktop environments.
Simply keep your current window manager and install cortile on top of it.
Once enabled, the tiling manager will handle resizing and positioning of existing and new windows.
Support for keyboard and mouse events sets cortile apart from other tiling solutions. The go implementation ensures a fast and responsive system, where multiple layouts, keyboard shortcuts, drag & drop and hot corner events simplify and speed up your daily work.
Manually download the latest binary file from releases or use wget:
wget -qO- $(wget -qO- https://api.github.com/repos/leukipp/cortile/releases/latest | \
jq -r '.assets[] | select(.name | contains ("linux_amd64.tar.gz")) | .browser_download_url') | \
tar -xvz
Execute the binary file and cortile will automatically begin tiling windows until you choose to stop it:
./cortile
Another installation method can be found in the development section. The latest official release is published on GitHub. Versions distributed via package managers are community supported and may be outdated.
To enable auto tiling on startup, you can run cortile as a service after the graphical user interface has been loaded.
A template to run cortile as a systemd service is provided in the services folder.
You may have to adjust the filepath/symlink under ExecStart
and enable the user service:
# copy systemd service file
cp cortile.service ~/.config/systemd/user/
# reload systemd configuration
systemctl --user daemon-reload
# enable systemd service
systemctl --user enable cortile.service
# start systemd service
systemctl --user start cortile.service
The layouts are based on the master-slave concept, where one side of the screen is considered to be the master area and the other side is considered to be the slave area:
vertical-right:
split the screen vertically, master area on the right.vertical-left:
split the screen vertically, master area on the left.horizontal-top:
split the screen horizontally, master area on the top.horizontal-bottom:
split the screen horizontally, master area on the bottom.maximized:
single window that fills the entire tiling area.fullscreen:
single window that fills the entire screen.The number of windows per side and the occupied space can be changed dynamically. Adjustments to window sizes are considered to be proportion changes of the underlying layout.
Windows placed on the master side are static and the layout will only change as long the space is not fully occupied. Once the master area is full, the slave area is used, where the layout changes dynamically based on available space and configuration settings.
The configuration file is located at ~/.config/cortile/config.toml
(or XDG_CONFIG_HOME
) and is created with default values during the first startup.
Additional information about individual entries can be found in the comments section of the config.toml file.
The default keyboard shortcuts are assigned as shown below.
If some of them are already in use by your system, update the default values in the [keys] section of the configuration file: |
Keys | Description |
---|---|---|
Ctrl+Shift+Home | Enable tiling on the current screen | |
Ctrl+Shift+End | Disable tiling on the current screen | |
Ctrl+Shift+T | Toggle between enable and disable | |
Ctrl+Shift+D | Toggle window decoration on and off | |
Ctrl+Shift+R | Disable tiling and restore windows | |
Ctrl+Shift+BackSpace | Reset layouts to default proportions | |
Ctrl+Shift+Next | Cycle through next layouts | |
Ctrl+Shift+Prior | Cycle through previous layouts | |
Ctrl+Shift+Left | Activate vertical-left layout | |
Ctrl+Shift+Right | Activate vertical-right layout | |
Ctrl+Shift+Up | Activate horizontal-top layout | |
Ctrl+Shift+Down | Activate horizontal-bottom layout | |
Ctrl+Shift+Space | Activate maximized layout | |
Ctrl+Shift+Return | Activate fullscreen layout | |
Ctrl+Shift+Plus | Increase number of maximum slave windows | |
Ctrl+Shift+Minus | Decrease number of maximum slave windows | |
Ctrl+Shift+KP_Add | Increase number of master windows | |
Ctrl+Shift+KP_Subtract | Decrease number of master windows | |
Ctrl+Shift+KP_2 | Move focus to the next window | |
Ctrl+Shift+KP_8 | Move focus to the previous window | |
Ctrl+Shift+KP_9 | Move the active window to the next screen | |
Ctrl+Shift+KP_7 | Move the active window to the previous screen | |
Ctrl+Shift+KP_5 | Make the active window master | |
Ctrl+Shift+KP_6 | Make the next window master | |
Ctrl+Shift+KP_4 | Make the previous window master | |
Ctrl+Shift+KP_3 | Increase proportion of master-slave area | |
Ctrl+Shift+KP_1 | Decrease proportion of master-slave area |
Hot corner events are defined under the [corners] section and are triggered when the pointer enters one of the target areas: |
Corners | Description |
---|---|---|
Top-Left | Focus previous window | |
Top-Right | Make the active window master | |
Bottom-Right | Increase proportion of master-slave area | |
Bottom-Left | Decrease proportion of master-slave area |
Systray events are defined under the [systray] section and are triggered when the pointer keys are pressed while hovering the icon: |
Pointer | Description |
---|---|---|
Middle-Click | Toggle between enable and disable | |
Scroll-Up | Cycle through previous layouts | |
Scroll-Down | Cycle through next layouts | |
Scroll-Right | Increase proportion of master-slave area | |
Scroll-Left | Decrease proportion of master-slave area |
Common pointer shortcuts used in some environments:
External processes may communicate with cortile by using dbus directly or via the cortile-addons python bindings.
Running cortile
starts a dbus server instance that makes internal properties and method calls available.
Since using dbus communication directly with an external process, bash script, etc. is possible, the development requires some knowledge of dbus and is quite messy.
Therefore, there is a built-in dbus client incorporated in the same cortile binary that can be started via cortile dbus -...
as a secondary process.
This client instance communicates with the running server instance and allows to listen for events and to execute remote procedure calls.
The documentation of available properties and method calls can be found via cortile dbus -help
.
Additional python bindings are available to further simplify communication with cortile and to build a community-based library of useful snippets and examples.
For simplicity, the python bindings just spawn another cortile instance via cortile dbus -...
running in the background and wrapping all available interfaces in easy-to-use python methods.
Example scripts and detailed information's on how to get started can be found in the cortile-addons repository.
You need go >= 1.22 to compile cortile.
Verify the installed go version:
go env | grep "GOPATH\|GOVERSION"
Start cortile in verbose mode:
$GOPATH/bin/cortile -v
Special use cases:
window_slaves_max
property to limit the number of windows.
window_slaves_max = 2
, all windows following the third window are stacked behind the two slaves.edge_margin
property to account for additional spaces.
tiling_enabled = false
if you prefer to enable tiling only when needed.
Security concerns:
cortile disable-dbus-interface
.~/.config/cortile/addons/
folder will be executed when the application starts.
This provides the possibility to run custom cortile-addons scripts without worrying much about startup behavior and dependency issues.
However, it also creates a potential security risk, as malicious code could place files in this folder to be executed by cortile.
cortile disable-addons-folder
.cortile disable-issue-info
.cortile disable-release-info
. Cortile works best with Xfwm and Openbox window systems. However, it`s still possible that you may encounter problems during usage.
Windows:
edge_margin
property to adjust for additional margins.Systray:
[systray]
section, as some pointer events may not fire across different desktop environments.Debugging:
cortile -vv
, which provides additional debug outputs./tmp/cortile.log
.Based on zentile (Berin Larson) and pytyle3 (Andrew Gallant).
The main libraries used in this project are xgbutil, toml, dbus, systray, gopsutil, fsnotify, selfupdate and logrus.