{"id":16587502,"url":"https://github.com/numirias/qtile-plasma","last_synced_at":"2025-03-17T15:13:43.243Z","repository":{"id":49773510,"uuid":"112121644","full_name":"numirias/qtile-plasma","owner":"numirias","description":" 🔮 A flexible, tree-based layout for Qtile","archived":false,"fork":false,"pushed_at":"2024-04-06T17:51:44.000Z","size":110,"stargazers_count":101,"open_issues_count":18,"forks_count":12,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-03-04T22:58:25.117Z","etag":null,"topics":["python","qtile","window-manager"],"latest_commit_sha":null,"homepage":"","language":"Python","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/numirias.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":"2017-11-26T22:25:41.000Z","updated_at":"2025-01-04T00:47:53.000Z","dependencies_parsed_at":"2024-10-26T20:29:14.744Z","dependency_job_id":"583f4dfb-dbd7-4c87-b215-0c4afb35eea7","html_url":"https://github.com/numirias/qtile-plasma","commit_stats":{"total_commits":79,"total_committers":3,"mean_commits":"26.333333333333332","dds":"0.10126582278481011","last_synced_commit":"4b57f313ed6948212582de05205a3ae4372ed812"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numirias%2Fqtile-plasma","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numirias%2Fqtile-plasma/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numirias%2Fqtile-plasma/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/numirias%2Fqtile-plasma/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/numirias","download_url":"https://codeload.github.com/numirias/qtile-plasma/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244056424,"owners_count":20390719,"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":["python","qtile","window-manager"],"created_at":"2024-10-11T22:54:22.726Z","updated_at":"2025-03-17T15:13:43.223Z","avatar_url":"https://github.com/numirias.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Plasma\n\n[![Build Status](https://travis-ci.org/numirias/qtile-plasma.svg?branch=master)](https://travis-ci.org/numirias/qtile-plasma)\n[![codecov](https://codecov.io/gh/numirias/qtile-plasma/branch/master/graph/badge.svg)](https://codecov.io/gh/numirias/qtile-plasma)\n[![PyPI Version](https://img.shields.io/pypi/v/qtile-plasma.svg)](https://pypi.python.org/pypi/qtile-plasma)\n[![Python Versions](https://img.shields.io/pypi/pyversions/qtile-plasma.svg)](https://pypi.python.org/pypi/qtile-plasma)\n\nPlasma is a flexible, tree-based layout for [Qtile](https://github.com/qtile/qtile/).\n\nIf you're looking for a well-tested and maintained alternative to Qtile's default layouts, give it a try.\n\n## About\n\nPlasma works on a tree structure. Each node represents a container with child containers aligned either horizontally or vertically (similar to [i3](https://i3wm.org/)). Each window is attached to a leaf, taking either a proportional or a specific custom amount of space in its parent container. Windows can be resized, rearranged and integrated into other containers, enabling lots of different setups.\n\n## Demo\n\nHere is a quick demo showing some of the main features (adding modes, moving, integrating and resizing):\n\n![Demo](https://i.imgur.com/N3CMonP.gif)\n\n## Installation\n\nInstall the package. You can [get it from PyPI](https://pypi.python.org/pypi/qtile-plasma/):\n\n```\npip install --upgrade qtile-plasma\n```\n\nThen, add the layout to your config (`~/.config/qtile/config.py`):\n\n```python\nfrom plasma import Plasma\n...\nlayouts = [\n    Plasma(\n        border_normal='#333333',\n        border_focus='#00e891',\n        border_normal_fixed='#006863',\n        border_focus_fixed='#00e8dc',\n        border_width=1,\n        border_width_single=0,\n        margin=0\n    ),\n    ...\n]\n```\n\nAdd some key bindings, too. I am using these:\n\n```python\nfrom libqtile.command import lazy\nfrom libqtile.config import EzKey\n...\nkeymap = {\n    'M-h': lazy.layout.left(),\n    'M-j': lazy.layout.down(),\n    'M-k': lazy.layout.up(),\n    'M-l': lazy.layout.right(),\n    'M-S-h': lazy.layout.move_left(),\n    'M-S-j': lazy.layout.move_down(),\n    'M-S-k': lazy.layout.move_up(),\n    'M-S-l': lazy.layout.move_right(),\n    'M-A-h': lazy.layout.integrate_left(),\n    'M-A-j': lazy.layout.integrate_down(),\n    'M-A-k': lazy.layout.integrate_up(),\n    'M-A-l': lazy.layout.integrate_right(),\n    'M-d': lazy.layout.mode_horizontal(),\n    'M-v': lazy.layout.mode_vertical(),\n    'M-S-d': lazy.layout.mode_horizontal_split(),\n    'M-S-v': lazy.layout.mode_vertical_split(),\n    'M-a': lazy.layout.grow_width(30),\n    'M-x': lazy.layout.grow_width(-30),\n    'M-S-a': lazy.layout.grow_height(30),\n    'M-S-x': lazy.layout.grow_height(-30),\n    'M-C-5': lazy.layout.size(500),\n    'M-C-8': lazy.layout.size(800),\n    'M-n': lazy.layout.reset_size(),\n}\nkeys = [EzKey(k, v) for k, v in keymap.items()]\n```\n\nDone!\n\n## Commands\n\nThe layout exposes the following commands:\n\n\u003c!--commands-start--\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003enext()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eFocus next window.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003eprevious()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eFocus previous window.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003erecent()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eFocus most recently focused window.\u003cbr\u003e\n(Toggles between the two latest active windows.)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003eleft()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eFocus window to the left.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003eright()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eFocus window to the right.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003eup()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eFocus window above.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003edown()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eFocus window below.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003emove_left()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eMove current window left.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003emove_right()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eMove current window right.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003emove_up()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eMove current window up.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003emove_down()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eMove current window down.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003eintegrate_left()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eIntegrate current window left.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003eintegrate_right()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eIntegrate current window right.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003eintegrate_up()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eIntegrate current window up.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003eintegrate_down()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eIntegrate current window down.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003emode_horizontal()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eNext window will be added horizontally.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003emode_vertical()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eNext window will be added vertically.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003emode_horizontal_split()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eNext window will be added horizontally, splitting space of current\nwindow.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003emode_vertical_split()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eNext window will be added vertically, splitting space of current\nwindow.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003esize(x)\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eChange size of current window.\u003cbr\u003e\n(It's recommended to use \u003ccode\u003ewidth()\u003c/code\u003e/\u003ccode\u003eheight()\u003c/code\u003e instead.)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003ewidth(x)\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet width of current window.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003eheight(x)\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eSet height of current window.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003ereset_size()\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eReset size of current window to automatic (relative) sizing.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003egrow(x)\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eGrow size of current window.\u003cbr\u003e\n(It's recommended to use \u003ccode\u003egrow_width()\u003c/code\u003e/\u003ccode\u003egrow_height()\u003c/code\u003e instead.)\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003egrow_width(x)\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eGrow width of current window.\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003ccode\u003egrow_height(x)\u003c/code\u003e\u003c/td\u003e\n    \u003ctd\u003eGrow height of current window.\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\u003c!--commands-end--\u003e\n\n## Contributing\n\nIf you have found a bug or want to suggest a feature, please [file an issue](https://github.com/numirias/qtile-plasma/issues/new).\n\n\nTo work on Plasma locally, you need to clone submodules too, since the layout integration tests use some of Qtile's test fixtures:\n\n```\ngit clone --recursive https://github.com/numirias/qtile-plasma/\n```\n\nAlso make sure you meet the [hacking requirements of Qtile](http://docs.qtile.org/en/latest/manual/hacking.html). In particular, have `xserver-xephyr` installed. Then run:\n\n```\nmake init\n```\n\nIf that fails, run the `init` instructions from the [Makefile](https://github.com/numirias/qtile-plasma/blob/master/Makefile) one by one.\n\nAll new changes need to be fully test-covered and pass the linting:\n\n```\nmake lint\nmake test\n```\n\nIf you made changes to the layout API, also re-build this README's [commands](#commands) section:\n\n```\nmake readme\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnumirias%2Fqtile-plasma","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnumirias%2Fqtile-plasma","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnumirias%2Fqtile-plasma/lists"}