{"id":13576552,"url":"https://github.com/leukipp/cortile","last_synced_at":"2025-05-15T01:06:59.651Z","repository":{"id":38420687,"uuid":"433187259","full_name":"leukipp/cortile","owner":"leukipp","description":"  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.","archived":false,"fork":false,"pushed_at":"2024-11-05T18:29:56.000Z","size":8083,"stargazers_count":647,"open_issues_count":13,"forks_count":22,"subscribers_count":9,"default_branch":"main","last_synced_at":"2025-05-12T04:58:57.453Z","etag":null,"topics":["dynamic-window-manager","ewmh","fluxbox","gnome","golang","hot-corners","icewm","kde","kwin","linux","lxde","lxqt","marco","muffin","mutter","openbox","tiling-window-manager","window-manager","x11","xfce"],"latest_commit_sha":null,"homepage":"https://github.com/leukipp/cortile-addons","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/leukipp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-11-29T20:28:42.000Z","updated_at":"2025-05-08T01:31:05.000Z","dependencies_parsed_at":"2023-01-19T03:48:27.008Z","dependency_job_id":"8097af10-d17d-44ca-be73-e93158f3eb43","html_url":"https://github.com/leukipp/cortile","commit_stats":null,"previous_names":[],"tags_count":32,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leukipp%2Fcortile","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leukipp%2Fcortile/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leukipp%2Fcortile/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/leukipp%2Fcortile/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/leukipp","download_url":"https://codeload.github.com/leukipp/cortile/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253678863,"owners_count":21946315,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dynamic-window-manager","ewmh","fluxbox","gnome","golang","hot-corners","icewm","kde","kwin","linux","lxde","lxqt","marco","muffin","mutter","openbox","tiling-window-manager","window-manager","x11","xfce"],"created_at":"2024-08-01T15:01:11.340Z","updated_at":"2025-05-15T01:06:54.601Z","avatar_url":"https://github.com/leukipp.png","language":"Go","readme":"# Cortile\n![build](https://img.shields.io/github/actions/workflow/status/leukipp/cortile/release.yaml?style=flat-square)\n![date](https://img.shields.io/github/release-date/leukipp/cortile?style=flat-square)\n![downloads](https://img.shields.io/github/downloads/leukipp/cortile/total?style=flat-square)\n![os](https://img.shields.io/badge/os-%20linux%20|%20freebsd%20-blue?style=flat-square)\n![platform](https://img.shields.io/badge/platform-%20amd64%20|%20arm64%20|%20armv6%20|%20386%20-teal?style=flat-square)\n\n\u003ca href=\"https://github.com/leukipp/cortile\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/leukipp/cortile/main/assets/images/logo.png\" style=\"display:inline-block;width:95px;margin-right:10px;\" align=\"left\"/\u003e\u003c/a\u003e\n\nLinux auto tiling manager with hot corner support for Openbox, Fluxbox, IceWM, Xfwm, KWin, Marco, Muffin, Mutter and other [EWMH](https://en.wikipedia.org/wiki/Extended_Window_Manager_Hints#List_of_window_managers_that_support_Extended_Window_Manager_Hints) compliant window managers using the [X11](https://en.wikipedia.org/wiki/X_Window_System) window system.\nTherefore, this project provides dynamic tiling for XFCE, LXDE, LXQt, KDE and GNOME (Mate, Deepin, Cinnamon, Budgie) based desktop environments.\n\nSimply keep your current window manager and install **cortile on top** of it.\nOnce enabled, the tiling manager will handle _resizing_ and _positioning_ of _existing_ and _new_ windows.\n\u003cbr clear=\"left\"/\u003e\n\n## Features [![features](https://img.shields.io/github/stars/leukipp/cortile?style=flat-square)](#features-)\n- [x] Workspace based tiling.\n- [x] Auto detection of panels.\n- [x] Toggle window decorations.\n- [x] User interface for tiling mode.\n- [x] Systray icon indicator and menu.\n- [x] Custom addons via python bindings.\n- [x] Keyboard, hot corner and systray bindings.\n- [x] Vertical, horizontal, maximized and fullscreen mode.\n- [x] Remember layout proportions.\n- [x] Floating and sticky windows.\n- [x] Drag \u0026 drop window swap.\n- [x] Workplace aware layouts.\n- [x] Multi monitor support.\n\nSupport for **keyboard and mouse** events sets cortile apart from other tiling solutions.\nThe _go_ implementation ensures a fast and responsive system, where _multiple layouts_, _keyboard shortcuts_, _drag \u0026 drop_ and _hot corner_ events simplify and speed up your daily work.\n\n[![demo](https://raw.githubusercontent.com/leukipp/cortile/main/assets/images/demo.gif)](https://github.com/leukipp/cortile/blob/main/assets/images/demo.gif)\n\n## Installation [![installation](https://img.shields.io/github/v/release/leukipp/cortile?style=flat-square)](#installation-)\nManually [download](https://github.com/leukipp/cortile/releases/latest) the latest binary file from [releases](https://github.com/leukipp/cortile/releases/latest) or use wget:\n```bash\nwget -qO- $(wget -qO- https://api.github.com/repos/leukipp/cortile/releases/latest | \\\njq -r '.assets[] | select(.name | contains (\"linux_amd64.tar.gz\")) | .browser_download_url') | \\\ntar -xvz\n```\n\nExecute the binary file and cortile will automatically begin tiling windows until you choose to stop it:\n```bash\n./cortile\n```\nAnother installation method can be found in the [development](#development-) section.\nThe latest official release is published on GitHub.\nVersions distributed via package managers are community supported and may be outdated.\n\n### Service\nTo enable auto tiling on startup, you can run cortile as a service after the graphical user interface has been loaded.\nA template to run cortile as a [systemd](https://en.wikipedia.org/wiki/Systemd) service is provided in the [services](https://github.com/leukipp/cortile/tree/main/assets/services) folder.\nYou may have to adjust the filepath/symlink under `ExecStart` and enable the user service:\n```bash\n# copy systemd service file\ncp cortile.service ~/.config/systemd/user/\n\n# reload systemd configuration\nsystemctl --user daemon-reload\n\n# enable systemd service\nsystemctl --user enable cortile.service\n\n# start systemd service\nsystemctl --user start cortile.service\n```\n\n### Usage\nThe 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:\n- `vertical-right:` split the screen vertically, master area on the right.\n- `vertical-left:` split the screen vertically, master area on the left.\n- `horizontal-top:` split the screen horizontally, master area on the top.\n- `horizontal-bottom:` split the screen horizontally, master area on the bottom.\n- `maximized:` single window that fills the entire tiling area.\n- `fullscreen:` single window that fills the entire screen.\n\nThe number of windows per side and the occupied space can be changed dynamically.\nAdjustments to window sizes are considered to be proportion changes of the underlying layout.\n\nWindows placed on the master side are static and the layout will only change as long the space is not fully occupied.\nOnce the master area is full, the slave area is used, where the layout changes dynamically based on available space and configuration settings.\n\n## Configuration [![configuration](https://img.shields.io/badge/file-%20config.toml%20-gold?style=flat-square)](#configuration-)\nThe configuration file is located at `~/.config/cortile/config.toml` (or `XDG_CONFIG_HOME`) and is created with default values during the first startup.\nAdditional information about individual entries can be found in the comments section of the [config.toml](https://github.com/leukipp/cortile/blob/main/config.toml) file.\n\n[![config](https://raw.githubusercontent.com/leukipp/cortile/main/assets/images/config.gif)](https://github.com/leukipp/cortile/blob/main/assets/images/config.gif)\n\n### Shortcuts\nThe default keyboard shortcuts are assigned as shown below.\nIf some of them are already in use by your system, update the default values in the `[keys]` section of the configuration file:\n| Keys                                                    | Description                                   |\n| ------------------------------------------------------- | --------------------------------------------- |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eHome\u003c/kbd\u003e        | Enable tiling on the current screen           |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eEnd\u003c/kbd\u003e         | Disable tiling on the current screen          |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eT\u003c/kbd\u003e           | Toggle between enable and disable             |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eD\u003c/kbd\u003e           | Toggle window decoration on and off           |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eR\u003c/kbd\u003e           | Disable tiling and restore windows            |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eBackSpace\u003c/kbd\u003e   | Reset layouts to default proportions          |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eNext\u003c/kbd\u003e        | Cycle through next layouts                    |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003ePrior\u003c/kbd\u003e       | Cycle through previous layouts                |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eLeft\u003c/kbd\u003e        | Activate vertical-left layout                 |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eRight\u003c/kbd\u003e       | Activate vertical-right layout                |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eUp\u003c/kbd\u003e          | Activate horizontal-top layout                |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eDown\u003c/kbd\u003e        | Activate horizontal-bottom layout             |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eSpace\u003c/kbd\u003e       | Activate maximized layout                     |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eReturn\u003c/kbd\u003e      | Activate fullscreen layout                    |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003ePlus\u003c/kbd\u003e        | Increase number of maximum slave windows      |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eMinus\u003c/kbd\u003e       | Decrease number of maximum slave windows      |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eKP_Add\u003c/kbd\u003e      | Increase number of master windows             |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eKP_Subtract\u003c/kbd\u003e | Decrease number of master windows             |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eKP_2\u003c/kbd\u003e        | Move focus to the next window                 |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eKP_8\u003c/kbd\u003e        | Move focus to the previous window             |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eKP_9\u003c/kbd\u003e        | Move the active window to the next screen     |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eKP_7\u003c/kbd\u003e        | Move the active window to the previous screen |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eKP_5\u003c/kbd\u003e        | Make the active window master                 |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eKP_6\u003c/kbd\u003e        | Make the next window master                   |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eKP_4\u003c/kbd\u003e        | Make the previous window master               |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eKP_3\u003c/kbd\u003e        | Increase proportion of master-slave area      |\n| \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eKP_1\u003c/kbd\u003e        | Decrease proportion of master-slave area      |\n\nHot corner events are defined under the `[corners]` section and are triggered when the pointer enters one of the target areas:\n| Corners                            | Description                              |\n| ---------------------------------- | ---------------------------------------- |\n| \u003ckbd\u003eTop\u003c/kbd\u003e-\u003ckbd\u003eLeft\u003c/kbd\u003e     | Focus previous window                    |\n| \u003ckbd\u003eTop\u003c/kbd\u003e-\u003ckbd\u003eRight\u003c/kbd\u003e    | Make the active window master            |\n| \u003ckbd\u003eBottom\u003c/kbd\u003e-\u003ckbd\u003eRight\u003c/kbd\u003e | Increase proportion of master-slave area |\n| \u003ckbd\u003eBottom\u003c/kbd\u003e-\u003ckbd\u003eLeft\u003c/kbd\u003e  | Decrease proportion of master-slave area |\n\nSystray events are defined under the `[systray]` section and are triggered when the pointer keys are pressed while hovering the icon:\n| Pointer                            | Description                              |\n| ---------------------------------- | ---------------------------------------- |\n| \u003ckbd\u003eMiddle\u003c/kbd\u003e-\u003ckbd\u003eClick\u003c/kbd\u003e | Toggle between enable and disable        |\n| \u003ckbd\u003eScroll\u003c/kbd\u003e-\u003ckbd\u003eUp\u003c/kbd\u003e    | Cycle through previous layouts           |\n| \u003ckbd\u003eScroll\u003c/kbd\u003e-\u003ckbd\u003eDown\u003c/kbd\u003e  | Cycle through next layouts               |\n| \u003ckbd\u003eScroll\u003c/kbd\u003e-\u003ckbd\u003eRight\u003c/kbd\u003e | Increase proportion of master-slave area |\n| \u003ckbd\u003eScroll\u003c/kbd\u003e-\u003ckbd\u003eLeft\u003c/kbd\u003e  | Decrease proportion of master-slave area |\n\nCommon pointer shortcuts used in some environments:\n- Move window: \u003ckbd\u003eAlt\u003c/kbd\u003e+\u003ckbd\u003eLeft-Click\u003c/kbd\u003e.\n- Resize window: \u003ckbd\u003eAlt\u003c/kbd\u003e+\u003ckbd\u003eRight-Click\u003c/kbd\u003e.\n- Maximize window: \u003ckbd\u003eAlt\u003c/kbd\u003e+\u003ckbd\u003eDouble-Click\u003c/kbd\u003e.\n\n## Addons [![addons](https://img.shields.io/badge/api-%20dbus%20|%20python%20-red?style=flat-square)](#addons-)\nExternal processes may communicate with cortile by using [dbus](https://en.wikipedia.org/wiki/D-Bus) directly or via the [cortile-addons](https://github.com/leukipp/cortile-addons) python bindings.\n\n### D-Bus\nRunning `cortile` starts a dbus server instance that makes internal properties and method calls available.\nSince using dbus communication directly with an external process, bash script, etc. is possible, the development requires some knowledge of dbus and is quite messy.\n\nTherefore, there is a built-in dbus client incorporated in the same cortile binary that can be started via `cortile dbus -...` as a secondary process.\nThis client instance communicates with the running server instance and allows to listen for events and to execute remote procedure calls.\n\nThe documentation of available properties and method calls can be found via `cortile dbus -help`.\n\n### Python\nAdditional python bindings are available to further simplify communication with cortile and to build a community-based library of useful snippets and examples.\n\nFor 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.\n\nExample scripts and detailed information's on how to get started can be found in the [cortile-addons](https://github.com/leukipp/cortile-addons) repository.\n\n## Development [![development](https://img.shields.io/github/go-mod/go-version/leukipp/cortile?label=go\u0026style=flat-square)](#development-)\nYou need [go \u003e= 1.22](https://go.dev/dl/) to compile cortile.\n\n\u003cdetails\u003e\u003csummary\u003eInstall - go\u003c/summary\u003e\u003cdiv\u003e\n\n### Option 1: Install go via package manager\nUse a package manager supported on your system:\n```bash\n# apt\nsudo apt install golang\n\n# yum\nsudo yum install golang\n\n# dnf\nsudo dnf install golang\n\n# pacman\nsudo pacman -S go\n```\n\n### Option 2: Install go via archive download\nDownload a binary release suitable for your system:\n```bash\ncd /tmp/ \u0026\u0026 wget https://dl.google.com/go/go1.22.8.linux-amd64.tar.gz\nsudo tar -xvf go1.22.8.linux-amd64.tar.gz\nsudo mv -fi go /usr/local\n```\n\nSet required environment variables:\n```bash\necho \"export PATH=$PATH:/usr/local/go/bin\" \u003e\u003e ~/.profile\necho \"export GOPATH=~/.go\" \u003e\u003e ~/.profile\nsource ~/.profile\n```\n\n\u003c/div\u003e\u003c/details\u003e\n\nVerify the installed go version:\n```bash\ngo env | grep \"GOPATH\\|GOVERSION\"\n```\n\n\u003cdetails\u003e\u003csummary\u003eInstall - cortile\u003c/summary\u003e\u003cdiv\u003e\n\n### Option 1: Install cortile via remote source\nInstall directly from develop branch:\n```bash\ngo install github.com/leukipp/cortile/v2@develop\n```\n\n### Option 2: Install cortile via local source\nClone source code from develop branch:\n```bash\ngit clone https://github.com/leukipp/cortile.git -b develop\ncd cortile\n```\n\nIf necessary you can make local changes, then execute:\n```bash\ngo install -ldflags=\"-X 'main.date=$(date --iso-8601=seconds)'\"\n```\n\n\u003c/div\u003e\u003c/details\u003e\n\nStart cortile in verbose mode:\n```bash\n$GOPATH/bin/cortile -v\n```\n\n## Additional [![additional](https://img.shields.io/github/issues-pr-closed/leukipp/cortile?style=flat-square)](#additional-)\nSpecial use cases:\n- Use the `window_slaves_max` property to limit the number of windows.\n  - e.g. with one active master and `window_slaves_max = 2`, all windows following the third window are stacked behind the two slaves.\n- Use the `edge_margin` property to account for additional spaces.\n  - e.g. for deskbar panels or conky infographics.\n- Use `tiling_enabled = false` if you prefer to enable tiling only when needed.\n  - e.g. or to mainly utilize the hot corner functionalities.\n- Use [cortile-addons](https://github.com/leukipp/cortile-addons) if you need any other specific logic.\n  This repository offers a range of extensions and enhancements specifically designed for cortile.\n\nSecurity concerns:\n- Since the [dbus api](https://github.com/leukipp/cortile/tree/develop?tab=readme-ov-file#addons-) exposes internal cortile properties to the outside, malicious code running on the same host could easily access them.\n  However, the information cortile holds (e.g. about open windows) can also be accessed using other tools interfacing with the X11 window system.\n  Therefore the decision was made that direct access to cortile provides greater flexibility for running custom logic without compromising security.\n  - If you want to disable this feature run cortile with `cortile disable-dbus-interface`.\n- Any scripts placed in the `~/.config/cortile/addons/` folder will be executed when the application starts.\n  This provides the possibility to run custom [cortile-addons](https://github.com/leukipp/cortile/tree/develop?tab=readme-ov-file#addons-) scripts without worrying much about startup behavior and dependency issues.\n  However, it also creates a potential security risk, as malicious code could place files in this folder to be executed by cortile.\n  - If you want to disable this feature run cortile with `cortile disable-addons-folder`.\n- Newly pinned issues appear as menu entries in a submenu within the systray.\n  This feature requires a network request to the GitHub API.\n  - If you want to disable this feature run cortile with `cortile disable-issue-info`.\n- Cortile checks for new releases and provides the option for an in-place upgrade of the current binary.\n  Similar to the GitHub issue information, this feature also requires a network request.\n  - If you want to disable this feature run cortile with `cortile disable-release-info`.  \n- The binary file runs perfectly fine with user permissions.\n  - Do not run cortile as root!\n\n## Issues [![issues](https://img.shields.io/github/issues-closed/leukipp/cortile?style=flat-square)](#issues-)\nCortile works best with Xfwm and Openbox window systems.\nHowever, it`s still possible that you may encounter problems during usage.\n\nWindows:\n- It's recommended to disable all build-in window snapping features (e.g. snap to other windows, snap to screen borders).\n- It's recommended to disable any logic that changes the window focus other than by clicking or opening a window (e.g. focus follow mouse, scroll wheel focus). \n- Automatic panel detection may not work under some window managers, use the `edge_margin` property to adjust for additional margins.\n- Particularly in GNOME based desktop environments, window displacements or resizing issues may occur.\n- Sticky windows may cause unwanted layout modifications during workspace changes.\n- Toggling window decoration may cause unwanted layout modifications.\n\nSystray:\n- Adjust the bindings in the `[systray]` section, as some pointer events may not fire across different desktop environments.\n- Window managers not supporting [StatusNotifierItem](https://freedesktop.org/wiki/Specifications/StatusNotifierItem) for displaying systray icons will need to install [snixembed](https://github.com/fyne-io/systray#linuxbsd).\n\nDebugging:\n- If you encounter problems start the process with `cortile -vv`, which provides additional debug outputs.\n- A log file is created by default under `/tmp/cortile.log`.\n\n## Credits [![credits](https://img.shields.io/github/contributors/leukipp/cortile?style=flat-square)](#credits-)\nBased on [zentile](https://github.com/blrsn/zentile) ([Berin Larson](https://github.com/blrsn)) and [pytyle3](https://github.com/BurntSushi/pytyle3) ([Andrew Gallant](https://github.com/BurntSushi)).  \nThe main libraries used in this project are [xgbutil](https://github.com/jezek/xgbutil), [toml](https://github.com/BurntSushi/toml), [dbus](https://github.com/godbus/dbus), [systray](https://github.com/fyne-io/systray), [gopsutil](https://github.com/shirou/gopsutil), [fsnotify](https://github.com/fsnotify/fsnotify), [selfupdate](https://github.com/minio/selfupdate) and [logrus](https://github.com/sirupsen/logrus).\n\n## License [![license](https://img.shields.io/github/license/leukipp/cortile?style=flat-square)](#license-)\n[MIT](https://github.com/leukipp/cortile/blob/main/LICENSE)\n","funding_links":[],"categories":["Go"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleukipp%2Fcortile","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleukipp%2Fcortile","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleukipp%2Fcortile/lists"}