Project Name | Stars | Downloads | Repos Using This | Packages Using This | Most Recent Commit | Total Releases | Latest Release | Open Issues | License | Language |
---|---|---|---|---|---|---|---|---|---|---|
Dwl | 1,592 | a day ago | 33 | other | C | |||||
dwm for Wayland | ||||||||||
Awesome Wayland | 1,143 | 8 months ago | 5 | cc0-1.0 | ||||||
A curated list of Wayland code and resources. | ||||||||||
Orbment | 245 | 7 years ago | 23 | other | C | |||||
Modular Wayland compositor | ||||||||||
Chamferwm | 228 | 3 months ago | 7 | bsd-3-clause | C++ | |||||
A tiling X11 window manager with Vulkan compositor. | ||||||||||
Taiwins | 224 | 2 years ago | 36 | gpl-2.0 | C | |||||
taiwins, a modern wayland compositor | ||||||||||
Cagebreak | 182 | 3 days ago | 7 | mit | C | |||||
Cagebreak: A Wayland Tiling Compositor Inspired by Ratpoison | ||||||||||
Perceptia | 135 | 1 | 9 | 6 years ago | 4 | June 10, 2017 | 20 | Rust | ||
Dynamic window manager with support for Wayland | ||||||||||
Dotfiles | 69 | 7 months ago | gpl-2.0 | Lua | ||||||
My tiling configs | ||||||||||
Flis | 15 | 5 years ago | 3 | mit | Go | |||||
[WIP] Wayland Tiling Compositor inspired by sway and i3, written in Go. | ||||||||||
Cardboard | 14 | 2 years ago | gpl-3.0 | C++ | ||||||
Mirror of GitLab repo. Send PRs there! |
Cagebreak is a Wayland tiling compositor based on Cage and inspired by ratpoison.
The goal of this project is to provide a successor to ratpoison for Wayland. However, this is no reimplementation of ratpoison.
Should you want to know if a feature will be implemented, file a bug or get in touch, open an issue or write an e-mail (See SECURITY.md for details.).
The Roadmap section outlines what is planned for the future.
Cagebreak supports Arch Linux and uses the libraries (and software versions) as they are obtained through pacman at the time of release. Any other use is out of scope.
Most other setups probably work with a bit of luck. We make no guarantees.
This assumes Arch Linux:
$USER/.config/cagebreak/config
See the ArchWiki for details on getting started and the documentation for everything else.
See the Changelog.
pacman -R cagebreak
should be sufficient.
Cagebreak is based on Cage, a Wayland kiosk compositor. Since it breaks the kiosk into tiles the name Cagebreak seemed appropriate.
On Arch Linux, just use the PKGBUILDs from the AUR:
See cagebreak-pkgbuild for details.
There are different ways to obtain cagebreak source:
There are corresponding methods of verifying that you obtained the correct code:
You can build Cagebreak with the meson build system. It requires wayland, wlroots and xkbcommon to be installed. Note that Cagebreak is developed against the latest tag of wlroots, in order not to constantly chase breaking changes as soon as they occur.
Simply execute the following steps to build Cagebreak:
$ meson setup build
$ ninja -C build
By default, this builds a debug build. To build a release build, use meson setup build --buildtype=release
.
Cagebreak comes with compile-time support for XWayland. To enable this,
first make sure that your version of wlroots is compiled with this
option. Then, add -Dxwayland=true
to the meson
command above. Note
that you'll need to have the XWayland binary installed on your system
for this to work.
Cagebreak has man pages. To use them, make sure that you have scdoc
installed. Then, add -Dman-pages=true
to the meson
command.
You can start Cagebreak by running ./build/cagebreak
. If you run it from
within an existing X11 or Wayland session, it will open in a virtual output as
a window in your existing session. If you run it in a TTY, it'll run with the
KMS+DRM backend. Note that a configuration file is required. For more
configuration options, see the man pages.
Please see example_scripts/
for example scripts and a basis to customize
from.
Cagebreak was originally built to suit the needs of its creators. This section outlines how we intended some parts of cagebreak and might ease learning how to use cagebreak a little bit. Please note that this does not replace the man pages or the FAQ. Also, this is in no way intended as a guide on how cagebreak must be used but rather as a source of inspiration and explanations for certain particularities.
Cagebreak is keyboard-based. Everything regarding cagebreak can be done through the keyboard and it is our view that it should be. This does not mean that pointers, touchpads and such are not available for the few applications that do require them.
Cagebreak is a tiling compositor. Every view takes up as much screen space as possible. We believe this is useful, as only very few programs are typically necessary to complete a task. To manage multiple tasks concurrently, we use workspaces.
Each task deserves its own workspace. Any given task (the sort of thing you might find in your calendar or on your todo list) probably requires very few views and ideally, these take up as much of the screen as possible.
Combining 2. and 3. might look like this in practice:
- Task 1: Edit introduction section for paper on X
- Task 2: Coordinate event with person Y
- split screen vertically
- open web browser or pdf viewer to read literature
- focus next
- open editor
- change to a different workspace
- split screen vertically
- open calendar application
- focus next
- open chat application
Now each task has its own workspace and switching between tasks is possible by switching between workspaces.
Note that, for example by using the socket, more advanced setups are possible. But the user is warned that excessive tweaking eats into the work to be done.
In practice this means thinking about the applications and cagebreak commands you use and taking your keyboard layout into account when defining keybindings for your individual needs.
Example scripts can be found in the repository under
example_scripts/
.
Cagebreak is currently developed to fit the needs of its creators.
The feature set is intentionally limited - we removed support for a desktop background image for example.
Nonetheless, don't be intimidated by any other part of this file. Do your best and we will collaborate toward a solution.
Cagebreak supports Arch Linux and uses the libraries (and software versions) as they are obtained through pacman at the time of release. Any other use is out of scope.
However, Cagebreak may also work on other distributions given the proper library versions (Some package maintainers have done this and it seems to work (To date, we dealt with a few Issues and never felt the need to ask for the distribution the user was having the issue on.)).
You should use Arch Linux if you want to modify Cagebreak for yourself.
Project-repo will review your proposal before your implementation for feasibility and desirability. After your pull request, the code will be reviewed in conjunction with all other changes before the release as per the release procedure.
All reviews performed by project-repo are verified by at least two people internally.
On any pull requests please include a
signed-off-by: YOUR IDENTIFIER OR NAME
DCO statement.
By doing this you claim that you are legally allowed to contribute the code and agree to let project-repo publish it under the MIT License.
CAVEAT: This script works exclusively on Arch Linux, which, as outlined above, is the development distribution of Cagebreak.
Cloning the Cagebreak repository and building it is sufficient as a starting point.
All other dependencies can be installed by invoking
meson compile devel-install -C build
if meson is already available or
./scripts/install-development-environment
otherwise.
Cagebreak provides a few convenience tools to facilitate development.
If your fuzzing corpus is located in the directory fuzz_corpus
you can
just call:
meson compile fuzz -C build
If you want to use a different directory, configure cagebreak with
-Dcorpus=OTHERDIRECTORY
or call ./scripts/fuzz OTHERDIRECTORY
.
To facilitate the creation of reproducible man pages an arbitrary release
time has to be set in meson.build
:
meson compile adjust-epoch -C build
or
./scripts/adjust-epoch
If you are on the master branch, everything is ready and you want to create a release tag you can call:
meson compile git-tag -C build
If you want to use another signing key than the prespecified one, configure
Cagebreak with -Dgpg_id=GPGID
.
./scripts/git-tag GPGID CBVERSION
can be used alternatively.
Hashes of release versions of all binaries can be output to local-hashes.txt
via:
meson compile output-hashes -C build
Or
./scripts/output-hashes VERSION
if meson is unavailable.
Creation of signatures for releases can be achieved through:
meson compile create-sigs -C build
Configure Cagebreak with -Dgpg_id=GPGID
for a different gpg signing
key.
Without meson use:
./scripts/create-signatures GPGID
Once the version number is set within meson.build, you can use
meson compile set-ver -C build
to set the version number in the man pages and README repology minversion.
Use of the script without meson is discouraged because meson.build is not touched by the script.
The following command generates the release artefacts which must be created once a release is completely ready to be published (the commit is tagged with the version of the master branch, etc.):
meson compile create-artefacts -C build
Use of the script version is discouraged.
Cagebreak should compile with any reasonably new gcc or clang. Consider a gcc version of at least 10.1 if you want to get the benefit of the brand-new -fanalyzer flag. However, this new flag sometimes produces false-postives and we selectively disable warnings for affected code segments as described below.
Meson is configured to set CG_HAS_FANALYZE
if -fanalyzer
is available.
Therefore, to maintain portability, false-positive fanalyzer warnings are to be
disabled using the following syntax:
#if CG_HAS_FANALYZE
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "WARNING OPTION"
#endif
and after
#if CG_HAS_FANALYZE
#pragma GCC diagnostic pop
#endif
meson test -C build
invokes all tests. This is required for a release to occur.
There are four test suites:
release-non-auto-checks
and have to contain the release version and current date in
YYYY-mm-dd format on seperate lines. This is our imperfect attempt
to guarantee some hard-to-automate checks are carried out before
a release is undertaken.Every commit should pass at least the basic and devel suites.
It is expected that cagebreak passes at least the basic, devel and devel-long suites when commits are pushed:
meson test -C build --suite basic --suite devel
The basic suite can be used to test a binary. This is useful for PKGBUILDs and their equivalents in other systems.
meson test -C build --suite basic
Along with the project source code, a fuzzing framework based on libfuzzer
is
supplied. This allows for the testing of the parsing code responsible for reading
the cagebreak
configuration file. When libfuzzer
is available (please
use the clang
compiler to enable it), building the fuzz-testing software can
be enabled by passing -Dfuzz=true
to meson. This generates a build/fuzz/fuzz-parse
binary according to the libfuzzer
specifications. Further documentation on
how to run this binary can be found here.
Here is an example workflow:
rm -rf build
CC=clang meson setup build -Dfuzz=true -Db_sanitize=address,undefined -Db_lundef=false
ninja -C build/
mkdir build/fuzz_corpus
cp examples/config build/fuzz_corpus/
WLR_BACKENDS=headless ./build/fuzz-parse -jobs=12 -max_len=50000 -close_fd_mask=3 build/fuzz_corpus/
You may want to tweak -jobs
or add other options depending on your own setup.
We have found code path discovery to increase rapidly when the fuzzer is supplied
with an initial config file. We are working on improving our fuzzing coverage to
find bugs in other areas of the code.
Currently, there are memory leaks which do not seem to stem from our code but rather
the code of wlroots or some other library we depend on. We are working on the problem.
In the meantime, add -Db_detect-leaks=0
to the meson command to exclude memory leaks.
Cagebreak offers reproducible builds given the exact library versions specified
in meson.build
. Should a version mismatch occur, a warning will be emitted. We have
decided on this compromise to allow flexibility and security. In general we will
adapt the versions to the packages available under Arch Linux at the time of
release.
There are reproducibility issues up to and including release 1.2.0
. See
Issue 5
in Bugs.md.
All hashes and signatures are provided for the following build instructions.
meson setup build -Dxwayland=true -Dman-pages=true --buildtype=release
ninja -C build
For every release after 1.0.5, hashes will be provided.
For every release after 1.7.0, hashes will be provided for man pages too.
See Hashes.md
For every release after 1.0.5, a GPG signature will be provided in signatures
.
The current signature is called cagebreak.sig
, whereas all older signatures
will be named after their release version.
Due to errors in the release process, the releases 1.7.1 and 1.7.2 did not include the release signatures in the appropriate folder of the git repository. However, signatures were provided as release-artefacts at the time of release. The signatures were introduced into the repository with 1.7.3. The integrity of cagebreak is still the same because the signatures were provided as release-artefacts (which were themselves signed) and the hashes in Hashes.md are part of a signed release tag.
All releases are signed by at least one of the following collection of keys.
Should we at any point retire a key, we will only replace it with keys signed by at least one of the above collection.
We registered project-repo.co and added mail addresses after release 1.3.0
.
We now have a mail address and its key is signed by signing keys. See Security Bugs for details.
The full public keys can be found in keys/
along with any revocation certificates.
Cagebreak uses semantic versioning.
There are three permanent branches in cagebreak:
master
(for releases)development
(for polishing code between releases)hotfix
(for small emergent releases, usually up-to-date with master)Releases are merged to master as per the release procedure, with reasonable exceptions as the situation requires.
The release commit is tagged with the release version.
In the past, our git history did not perfectly reflect this scheme.
The release procedure outlines the process for a release to occur.
git checkout development
git pull origin development
git push origin development
meson test -C build/
just to get an overviewmeson compile set-ver -C build
git push origin development
meson compile adjust-epoch -C build
git push origin development
meson compile fuzz -C build
for at least one hourmeson compile output-hashes -C build
to add Hashes or aid in repro checkgit push origin development
meson compile create-sigs -C build
meson test -C build
passes everything except some release testsgit add
relevant filesgit commit
git push origin development
git checkout master
git merge --squash development
git commit
and insert messagemeson compile git-tag -C build
meson compile create-artefacts -C build
meson test -C build
THIS MUST PASS WITHOUT ANY FAILURES WHATSOEVERgit push --tags origin master
git checkout development
(merge to development depends on whether release was a hotfix)git merge master
git push --tags origin development
git checkout hotfix
(hotfix is to be kept current with master after releases)git merge master
git push --tags origin hotfix
Cagebreak plans to do or keep doing the following things in the future:
Cagebreak is managed by project-repo.
Project-repo is a pseudonym of at least two individuals acting as benevolent dictators for the project by the others mutual consent.
The individuals comprising project-repo are not otherwise associated by payment from any organisation or grant.
For all intents and purposes consider project-repo as a single benevolent dictator for life that happens to occupy at least two brains.
There are members of project-repo and those who are not.
There are no specific roles forced unto anyone.
The Bus Factor is a measure of how many people have to be incapacitated for a project to be unable to continue.
The current bus factor for Cagebreak is: 1
Project-repo could still react to issues (even confidential e-mails) and fix easier issues if any one individual were incapacitated.
However, not all aspects of the code or release engineering are fully resilient to the loss of any one individual.
We strive to improve the Bus Factor to at least two in all aspects of Cagebreak.
Anyone can use the information in SECURITY.md to contact the members of project-repo and bring governance issues to their attention.
For any bug, please create an issue on GitHub.
Fixed bugs are to be assigned a number and summarized inside Bugs.md for future reference independent of github, in case this service is unavailable.
For other means of contacting the Cagebreak authors and for security issues see SECURITY.md.
Copyright (c) 2020-2023 The Cagebreak authors Copyright (c) 2018-2020 Jente Hidskes Copyright (c) 2019 The Sway authors
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.