From bea18c7a6f0f709251d6e7670eed5d3d9ef1b02b Mon Sep 17 00:00:00 2001 From: project-repo Date: Mon, 17 Apr 2023 22:17:06 +0200 Subject: [PATCH 1/8] Release 2.1.1 - Adjust dependency versions - Add release tests - Add a quick installation script - Add small utility scripts - Add note on review and developer certificate of origin (DCO) - Add note on accessibility --- .gitignore | 2 + Hashes.md | 20 ++ README.md | 249 ++++++++++++++---- man/cagebreak-config.5.md | 2 +- man/cagebreak-socket.7.md | 2 +- man/cagebreak.1.md | 2 +- meson.build | 38 ++- meson_options.txt | 2 + release-non-auto-checks/Bugs.md | 2 + release-non-auto-checks/FAQ.md | 2 + release-non-auto-checks/SECURITY.md | 2 + release-non-auto-checks/WLR_XDG_VERSION | 2 + release-non-auto-checks/changelog-major-minor | 2 + release-non-auto-checks/internal-wiki | 2 + release-non-auto-checks/meson-epoch | 2 + release-non-auto-checks/release-note | 2 + .../reproducibility-checked | 2 + .../security-to-man-page-info-transfer | 2 + scripts/adjust-epoch | 13 + scripts/create-release-artefacts | 40 +++ scripts/create-signatures | 37 +++ scripts/fuzz | 17 ++ scripts/git-tag | 8 + scripts/install-development-environment | 13 + scripts/output-hashes | 50 ++++ scripts/set-version | 20 ++ signatures/2.1.0-cagebreak-config.5.sig | Bin 0 -> 566 bytes signatures/2.1.0-cagebreak-socket.7.sig | Bin 0 -> 566 bytes signatures/2.1.0-cagebreak.1.sig | Bin 0 -> 566 bytes signatures/2.1.0-cagebreak.sig | Bin 0 -> 566 bytes signatures/cagebreak-config.5.sig | Bin 566 -> 566 bytes signatures/cagebreak-socket.7.sig | Bin 566 -> 566 bytes signatures/cagebreak.1.sig | Bin 566 -> 566 bytes signatures/cagebreak.sig | Bin 566 -> 566 bytes test/check-artefacts | 27 ++ test/copyright-license | 4 +- test/git-tag | 16 ++ test/gpg-signatures | 43 +++ test/gpg-validity | 46 ++++ test/hashes-md | 53 ++++ test/non-auto-tests | 25 ++ test/shellcheck | 6 +- 42 files changed, 688 insertions(+), 67 deletions(-) create mode 100644 release-non-auto-checks/Bugs.md create mode 100644 release-non-auto-checks/FAQ.md create mode 100644 release-non-auto-checks/SECURITY.md create mode 100644 release-non-auto-checks/WLR_XDG_VERSION create mode 100644 release-non-auto-checks/changelog-major-minor create mode 100644 release-non-auto-checks/internal-wiki create mode 100644 release-non-auto-checks/meson-epoch create mode 100644 release-non-auto-checks/release-note create mode 100644 release-non-auto-checks/reproducibility-checked create mode 100644 release-non-auto-checks/security-to-man-page-info-transfer create mode 100755 scripts/adjust-epoch create mode 100755 scripts/create-release-artefacts create mode 100755 scripts/create-signatures create mode 100755 scripts/fuzz create mode 100755 scripts/git-tag create mode 100755 scripts/install-development-environment create mode 100755 scripts/output-hashes create mode 100755 scripts/set-version create mode 100644 signatures/2.1.0-cagebreak-config.5.sig create mode 100644 signatures/2.1.0-cagebreak-socket.7.sig create mode 100644 signatures/2.1.0-cagebreak.1.sig create mode 100644 signatures/2.1.0-cagebreak.sig create mode 100644 test/check-artefacts create mode 100644 test/git-tag create mode 100644 test/gpg-signatures create mode 100644 test/gpg-validity create mode 100644 test/hashes-md create mode 100644 test/non-auto-tests diff --git a/.gitignore b/.gitignore index 378eac2..a91faf5 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ build +fuzz_corpus +fuzzing-directory diff --git a/Hashes.md b/Hashes.md index 4e28e1e..e5da651 100644 --- a/Hashes.md +++ b/Hashes.md @@ -1,5 +1,25 @@ # Hashes +2.1.1 cagebreak + + * sha 256: 8632e7e49637e5a3e7ab425a05fbd63d71cf6025143c89d196f309dbf4efdd57 + * sha 512: ca853aca80bde974f00e4cfcb21a77159d2f9f639342e92d049a0c5290a57094a1b2b1f28ac76ebdf89cf76384bb1caca45813d25ba5ef8ba8996e8c10e51e7a + +2.1.1 cagebreak.1 + + * sha 256: 1d56762bcbe4ba5b9015dda3c19ab1d628d08c7a7c731042643c9f2e59cf3a7c + * sha 512: e421da32e8d6f9eec4559c53614427900fd7ae5c17bf9b9fdfa90764017d5d90c08e10e737aacbe46ed97966dbc4c76944b54bce367925fd9899ff8e41fa7947 + +2.1.1 cagebreak-config.5 + + * sha 256: f4405bd650d4cab29e536651f0d45443ebe51628c4dfef75576923ec903d781e + * sha 512: 451c85c7a02f724824499a43929ef6f05eee4d4c666186f766163c01e36503a36b7f6bbf2d5cb632cbd2cd0740b0b3becc2d8c388e914cb0bacfe6134a6ada92 + +2.1.1 cagebreak-socket.7 + + * sha 256: cd67c9de727d6f8727269bc06a80aa77ede26b5652eb4ab35c898939711ae429 + * sha 512: a572710972b19a3872269fd2c52f1afd09a11dd621b4108f6ec3cde383c088c52782d5a240b001328257a66143a045fbf967d327b434e2ca32c2ffafc3b18b7f + 2.1.0 cagebreak * sha 256: 0c90ba529ffc916306a1ca04d4c56a800c62a98d184d3cfcc2ce67dcdffad324 diff --git a/README.md b/README.md index f933980..aca03a6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Cagebreak: A Wayland Tiling Compositor -[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.1.0)](https://repology.org/project/cagebreak/versions) +[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.1.1)](https://repology.org/project/cagebreak/versions) ## Quick Introduction @@ -260,6 +260,156 @@ 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. +### Review Requirements + +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. + +### Developer Certificate of Origin (DCO) + +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. + +#### Development Environment + +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. + +#### Scripts + +Cagebreak provides a few convenience tools to facilitate development. + +##### Fuzzing + +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`. + +##### Adjusting Epoch + +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 +``` + +##### Git tag + +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. + +##### Output Hashes + +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. + +##### Create Signatures + +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 +``` + +##### Set Version Number + +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. + +##### Create Release Artefacts + +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. + ### GCC and -fanalyzer Cagebreak should compile with any reasonably new gcc or clang. Consider @@ -312,6 +462,11 @@ There are four test suites: * Note that this is only expected to pass just before a release. This checks mostly administrative things to check that a release is ready. + * Note that non-auto tests are files in `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. @@ -359,7 +514,7 @@ find bugs in other areas of the code. #### Caveat Currently, there are memory leaks which do not seem to stem from our code but rather -the code of wl-roots or some other library we depend on. We are working on the problem. +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. ### Reproducible Builds @@ -456,53 +611,47 @@ The release procedure outlines the process for a release to occur. * [ ] `git checkout development` * [ ] `git pull origin development` * [ ] `git push origin development` - * [ ] New semantic version number determined - * [ ] Adjust version number - * [ ] meson.build - * [ ] git tag - * [ ] Relevant Documentation completed + * [ ] Arch Build System is up to date + * [ ] `meson test -C build/` just to get an overview + * [ ] Update internal wiki + * [ ] Adjust version number in meson.build + * [ ] `meson compile set-ver -C build` + * [ ] Add new files to meson.build or hardcoded testing variable + * [ ] Commit changes + * [ ] `git push origin development` + * [ ] Complete relevant documentation * [ ] New features + * [ ] tests added and old test scripts adjusted * [ ] man pages * [ ] cagebreak * [ ] cagebreak-config * [ ] cagebreak-socket * [ ] example config - * [ ] Set EPOCH to release day in man generation in meson.build * [ ] FAQ.md * [ ] Changelog.md for major and minor releases but not patches - * [ ] Check features for SECURITY.md relevance (changes to socket scope - for example) + * [ ] Check changes for SECURITY.md relevance (changes to socket scope for example) * [ ] Synchronize any socket changes to cagebreak-socket man page - * [ ] Updated internal wiki - * [ ] Added new files to meson.build or hardcoded testing variable - * [ ] Fixed bugs documented in Bugs.md + * [ ] Document fixed bugs in Bugs.md * [ ] Include issue discussion from github, where applicable + * [ ] Commit changes + * [ ] `git push origin development` * [ ] Testing * [ ] Manual testing - * [ ] Libfuzzer testing - * [ ] Arch Build System is up to date - * [ ] wlr_xdg_shell version check - * [ ] Cagebreak is reproducible on multiple machines - * [ ] Documented reproducible build artefacts - * [ ] Hashes of the artefacts in Hashes.md - * [ ] Renamed previous signatures - * [ ] Created gpg signature of the artefacts - * [ ] `gpg --detach-sign -u keyid cagebreak` - * [ ] `gpg --detach-sign -u keyid cagebreak.1` - * [ ] `gpg --detach-sign -u keyid cagebreak-config.5` - * [ ] `gpg --detach-sign -u keyid cagebreak-socket.7` - * [ ] `meson test -C build` + * [ ] `meson compile fuzz -C build` for at least one hour + * [ ] Complete release-non-auto-checks + * [ ] Use `meson compile output-hashes -C build` to add Hashes or aid in repro check + * [ ] `meson compile create-signatures -C build` + * [ ] Commit and push signatures, hashes and non-auto-check files + * [ ] `meson test -C build` passes everything except some release tests * [ ] `git add` relevant files * [ ] `git commit` * [ ] `git push origin development` - * [ ] Determined commit and tag message (Start with "Release version_number\n\n") - * [ ] Mentioned fixed Bugs.md issues ("Fixed Issue n") - * [ ] Mentioned other important changes * [ ] `git checkout master` * [ ] `git merge --squash development` * [ ] `git commit` and insert message - * [ ] `git tag -u keyid version HEAD` and insert message - * [ ] `git tag -v version` and check output + * [ ] `meson compile git-tag -C build` + * [ ] `meson compile create-artefacts -C build` + * [ ] `meson test -C build` THIS MUST PASS WITHOUT ANY FAILURES WHATSOEVER * [ ] `git push --tags origin master` * [ ] `git checkout development` (merge to development depends on whether release was a hotfix) * [ ] `git merge master` @@ -510,33 +659,8 @@ The release procedure outlines the process for a release to occur. * [ ] `git checkout hotfix` (hotfix is to be kept current with master after releases) * [ ] `git merge master` * [ ] `git push --tags origin hotfix` - * [ ] `git archive --prefix=cagebreak/ -o release_version.tar.gz tags/version .` - * [ ] Create release-artefacts_version.tar.gz - * [ ] `mkdir release-artefacts_version` - * [ ] `cp build/cagebreak release-artefacts_version/` - * [ ] `cp build/cagebreak.sig release-artefacts_version/` - * [ ] `cp build/cagebreak.1 release-artefacts_version/` - * [ ] `cp build/cagebreak.1.sig release-artefacts_version/` - * [ ] `cp build/cagebreak-config.5 release-artefacts_version/` - * [ ] `cp build/cagebreak-config.5.sig release-artefacts_version/` - * [ ] `cp build/cagebreak-socket.7 release-artefacts_version/` - * [ ] `cp build/cagebreak-socket.7.sig release-artefacts_version/` - * [ ] `cp LICENSE release-artefacts_version/` - * [ ] `cp README.md release-artefacts_version/` - * [ ] `cp SECURITY.md release-artefacts_version/` - * [ ] `cp FAQ.md release-artefacts_version/` - * [ ] `export SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct) ; tar --sort=name --mtime= --owner=0 --group=0 --numeric-owner -czf release-artefacts_version.tar.gz release-artefacts_version` - * [ ] Checked archive - * [ ] tar -xvf release_version.tar.gz - * [ ] cd cagebreak - * [ ] meson setup build -Dxwayland=true -Dman-pages=true --buildtype=release - * [ ] ninja -C build - * [ ] gpg --verify ../signatures/cagebreak.sig build/cagebreak - * [ ] cd .. - * [ ] rm -rf cagebreak - * [ ] `gpg --detach-sign -u keyid release_version.tar.gz` - * [ ] `gpg --detach-sign -u keyid release-artefacts_version.tar.gz` * [ ] Upload archives and signatures as release assets + * [ ] Manage package release ## Roadmap @@ -600,6 +724,17 @@ independent of github, in case this service is unavailable. For other means of contacting the Cagebreak authors and for security issues see [SECURITY.md](SECURITY.md). +## Accessibility + + * We use text input/output to interact with the user whenever possible. For + example, sending text-based commands to the cagebreak sockets allows + one to change every configurable feature of cagebreak. + * Color is displayed but never a vital part to operating cagebreak. + * Text size can be increased and background color adjusted using text commands. + * There is no screen reader support per se but using a screen reader on socket output + would work and cagebreak does not preclude the use of a screen reader + for any software run with it. + ## Contributors * Aisha Tammy diff --git a/man/cagebreak-config.5.md b/man/cagebreak-config.5.md index 1c65b78..bb04547 100644 --- a/man/cagebreak-config.5.md +++ b/man/cagebreak-config.5.md @@ -1,4 +1,4 @@ -cagebreak-config(5) "Version 2.1.0" "Cagebreak Manual" +cagebreak-config(5) "VERSION 2.1.1" "Cagebreak Manual" # NAME diff --git a/man/cagebreak-socket.7.md b/man/cagebreak-socket.7.md index b8e8d9c..19b7370 100644 --- a/man/cagebreak-socket.7.md +++ b/man/cagebreak-socket.7.md @@ -1,4 +1,4 @@ -cagebreak-socket(7) "Version 2.1.0" "Cagebreak Manual" +cagebreak-socket(7) "VERSION 2.1.1" "Cagebreak Manual" # NAME diff --git a/man/cagebreak.1.md b/man/cagebreak.1.md index b3fd209..fdc2da1 100644 --- a/man/cagebreak.1.md +++ b/man/cagebreak.1.md @@ -1,4 +1,4 @@ -cagebreak(1) "Version 2.1.0" "Cagebreak Manual" +cagebreak(1) "VERSION 2.1.1" "Cagebreak Manual" # NAME diff --git a/meson.build b/meson.build index f9708e7..26b0746 100644 --- a/meson.build +++ b/meson.build @@ -3,7 +3,7 @@ project( 'cagebreak', 'c', -version : '2.1.0', +version : '2.1.1', license : 'MIT', default_options : ['c_std=c11', 'warning_level=3'] ) @@ -202,8 +202,8 @@ cagebreak_dependencies_dict = { reproducible_build_versions = { 'server_protos': '-1', 'wayland_server': '1.19.0', - 'wayland_client': '1.21.0', - 'wayland_cursor': '1.21.0', + 'wayland_client': '1.22.0', + 'wayland_cursor': '1.22.0', 'wlroots': '0.16.2', 'xkbcommon': '1.5.0', 'fontconfig': '2.14.2', @@ -260,7 +260,7 @@ install_data('LICENSE', install_dir : '/usr/share/licenses/' + meson.project_nam if get_option('man-pages') scdoc = find_program('scdoc') - secssinceepoch = 1680540192 + secssinceepoch = 1681758922 shcommand = 'export SOURCE_DATE_EPOCH=' + secssinceepoch.to_string() + ' ; @0@ < @INPUT@'.format(scdoc.path()) sh = find_program('sh') mandir1 = join_paths(get_option('mandir'), 'man1') @@ -344,6 +344,30 @@ summary = [ ] message('\n'.join(summary)) +run_target('devel-install', + command : ['scripts/install-development-environment']) + +run_target('fuzz', + command : ['scripts/fuzz', get_option('corpus')]) + +run_target('adjust-epoch', + command : ['scripts/adjust-epoch']) + +run_target('git-tag', + command : ['scripts/git-tag', get_option('gpg_id'), meson.project_version()]) + +run_target('output-hashes', + command : ['scripts/output-hashes', meson.project_version()]) + +run_target('create-sigs', + command : ['scripts/create-signatures', get_option('gpg_id')]) + +run_target('set-ver', + command : ['scripts/set-version', meson.project_version()]) + +run_target('create-artefacts', + command : ['scripts/create-release-artefacts', get_option('gpg_id'), meson.project_version()]) + # Test Suite test('Build without warnings', find_program('test/build-w-o-warnings'), env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel') @@ -351,7 +375,13 @@ test('Build without xwayland', find_program('test/build-w-o-xwayland'), env : [ test('Copyright and LICENSE', find_program('test/copyright-license'), args : [ cagebreak_main_file + cagebreak_source_strings + cagebreak_header_strings + fuzz_sources + fuzz_headers + fuzz_override_lib ], env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()), ''.join('MESONLICENSE=', meson.project_license())], suite: 'devel' ) test('Clang-format (formatting check)', find_program('test/clang-format'), args : [ cagebreak_main_file + cagebreak_source_strings + cagebreak_header_strings + fuzz_sources + fuzz_headers + fuzz_override_lib ], env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel') test('Shellcheck (script linting)', find_program('test/shellcheck'), env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel') +test('GPG key validity', find_program('test/gpg-validity'), args : [ meson.project_version() ], env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel') test('Scan-build (static analysis)', find_program('test/scan-build'), env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel-long') test('Arguments', find_program('test/arguments'), args : [ meson.project_version() ], env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'basic') test('Environment Variables', find_program('test/environment-variables'), env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'basic') test('Semantic versioning', find_program('test/versions'), args : [ meson.project_version() ], env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'release') +test('Signature validity', find_program('test/gpg-signatures'), suite: 'release') +test('Hashes.md', find_program('test/hashes-md'), args : [ meson.project_version() ], env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'release') +test('Non-auto tests', find_program('test/non-auto-tests'), args : [ meson.project_version() ], env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'release') +test('Git tag', find_program('test/git-tag'), args : [ meson.project_version() ], suite: 'release') +test('Release-artefacts', find_program('test/check-artefacts'), args : [ meson.project_version() ], env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'release') diff --git a/meson_options.txt b/meson_options.txt index b7fc956..eba2f60 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -4,3 +4,5 @@ option('xwayland', type: 'boolean', value: 'false', description: 'Enable support option('man-pages', type: 'boolean', value: 'false', description: 'Build man pages (requires pandoc)') option('fuzz', type: 'boolean', value: 'false', description: 'Enable building fuzzer targets') option('version_override', type: 'string', description: 'Set the project version to the string specified. Used for creating hashes for reproducible builds.') +option('corpus', type: 'string', value: 'fuzz_corpus', description: 'Set fuzzing corpus directory') +option('gpg_id', type: 'string', value: '4E82C72C6B3E58A7BC4FF8554909F84CA83BB867', description: 'Set gpg signing key for cagebreak') diff --git a/release-non-auto-checks/Bugs.md b/release-non-auto-checks/Bugs.md new file mode 100644 index 0000000..aa7d21e --- /dev/null +++ b/release-non-auto-checks/Bugs.md @@ -0,0 +1,2 @@ +2.1.1 +2023-04-17 diff --git a/release-non-auto-checks/FAQ.md b/release-non-auto-checks/FAQ.md new file mode 100644 index 0000000..aa7d21e --- /dev/null +++ b/release-non-auto-checks/FAQ.md @@ -0,0 +1,2 @@ +2.1.1 +2023-04-17 diff --git a/release-non-auto-checks/SECURITY.md b/release-non-auto-checks/SECURITY.md new file mode 100644 index 0000000..aa7d21e --- /dev/null +++ b/release-non-auto-checks/SECURITY.md @@ -0,0 +1,2 @@ +2.1.1 +2023-04-17 diff --git a/release-non-auto-checks/WLR_XDG_VERSION b/release-non-auto-checks/WLR_XDG_VERSION new file mode 100644 index 0000000..aa7d21e --- /dev/null +++ b/release-non-auto-checks/WLR_XDG_VERSION @@ -0,0 +1,2 @@ +2.1.1 +2023-04-17 diff --git a/release-non-auto-checks/changelog-major-minor b/release-non-auto-checks/changelog-major-minor new file mode 100644 index 0000000..aa7d21e --- /dev/null +++ b/release-non-auto-checks/changelog-major-minor @@ -0,0 +1,2 @@ +2.1.1 +2023-04-17 diff --git a/release-non-auto-checks/internal-wiki b/release-non-auto-checks/internal-wiki new file mode 100644 index 0000000..aa7d21e --- /dev/null +++ b/release-non-auto-checks/internal-wiki @@ -0,0 +1,2 @@ +2.1.1 +2023-04-17 diff --git a/release-non-auto-checks/meson-epoch b/release-non-auto-checks/meson-epoch new file mode 100644 index 0000000..aa7d21e --- /dev/null +++ b/release-non-auto-checks/meson-epoch @@ -0,0 +1,2 @@ +2.1.1 +2023-04-17 diff --git a/release-non-auto-checks/release-note b/release-non-auto-checks/release-note new file mode 100644 index 0000000..aa7d21e --- /dev/null +++ b/release-non-auto-checks/release-note @@ -0,0 +1,2 @@ +2.1.1 +2023-04-17 diff --git a/release-non-auto-checks/reproducibility-checked b/release-non-auto-checks/reproducibility-checked new file mode 100644 index 0000000..aa7d21e --- /dev/null +++ b/release-non-auto-checks/reproducibility-checked @@ -0,0 +1,2 @@ +2.1.1 +2023-04-17 diff --git a/release-non-auto-checks/security-to-man-page-info-transfer b/release-non-auto-checks/security-to-man-page-info-transfer new file mode 100644 index 0000000..aa7d21e --- /dev/null +++ b/release-non-auto-checks/security-to-man-page-info-transfer @@ -0,0 +1,2 @@ +2.1.1 +2023-04-17 diff --git a/scripts/adjust-epoch b/scripts/adjust-epoch new file mode 100755 index 0000000..362c840 --- /dev/null +++ b/scripts/adjust-epoch @@ -0,0 +1,13 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +if [[ -n ${MESON_SOURCE_ROOT} ]] +then + # shellcheck disable=2164 + cd "${MESON_SOURCE_ROOT}" +fi + +# shellcheck disable=2034 +ssepoch=$(date +%s) +sed -i -e "/secssinceepoch \=/s/[0-9]*$/$ssepoch/" meson.build diff --git a/scripts/create-release-artefacts b/scripts/create-release-artefacts new file mode 100755 index 0000000..4b16167 --- /dev/null +++ b/scripts/create-release-artefacts @@ -0,0 +1,40 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +if [[ -n ${MESON_SOURCE_ROOT} ]] +then + # shellcheck disable=2164 + cd "${MESON_SOURCE_ROOT}" +fi + +readonly gpg_id="${1}" +readonly version="${2}" + +git archive --prefix=cagebreak/ -o "release_${version}.tar.gz" "tags/${version}" . + +rm -rf "release-artefacts_${version}" +mkdir "release-artefacts_${version}" + +rm -rf temp-rel-artefacts +meson setup temp-rel-artefacts -Dxwayland=true -Dman-pages=true --buildtype=release +ninja -C temp-rel-artefacts + +cp LICENSE "release-artefacts_${version}" +cp SECURITY.md "release-artefacts_${version}" +cp FAQ.md "release-artefacts_${version}" +cp README.md "release-artefacts_${version}" +cp temp-rel-artefacts/cagebreak "release-artefacts_${version}" +cp temp-rel-artefacts/cagebreak.1 "release-artefacts_${version}" +cp temp-rel-artefacts/cagebreak-config.5 "release-artefacts_${version}" +cp temp-rel-artefacts/cagebreak-socket.7 "release-artefacts_${version}" +cp signatures/cagebreak*.sig "release-artefacts_${version}" + +# shellcheck disable=2155 +export SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct) ; tar --sort=name --mtime= --owner=0 --group=0 --numeric-owner -czf "release-artefacts_${version}.tar.gz" "release-artefacts_${version}" + +gpg -u "${gpg_id}" --detach-sign "release-artefacts_${version}.tar.gz" +gpg -u "${gpg_id}" --detach-sign "release_${version}.tar.gz" + + +rm -rf temp-rel-artefacts diff --git a/scripts/create-signatures b/scripts/create-signatures new file mode 100755 index 0000000..3292374 --- /dev/null +++ b/scripts/create-signatures @@ -0,0 +1,37 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +if [[ -n ${MESON_SOURCE_ROOT} ]] +then + # shellcheck disable=2164 + cd "${MESON_SOURCE_ROOT}" +fi + +readonly gpg_id="${1}" +# shellcheck disable=2155 +readonly old_tags=$(git tag| tail -1) + +mv signatures/cagebreak.sig "signatures/${old_tags}-cagebreak.sig" +mv signatures/cagebreak.1.sig "signatures/${old_tags}-cagebreak.1.sig" +mv signatures/cagebreak-config.5.sig "signatures/${old_tags}-cagebreak-config.5.sig" +mv signatures/cagebreak-socket.7.sig "signatures/${old_tags}-cagebreak-socket.7.sig" + +git add "signatures/${old_tags}-cagebreak.sig" +git add "signatures/${old_tags}-cagebreak.1.sig" +git add "signatures/${old_tags}-cagebreak-config.5.sig" +git add "signatures/${old_tags}-cagebreak-socket.7.sig" + +rm -rf temp-sigs +meson setup temp-sigs -Dxwayland=true -Dman-pages=true --buildtype=release +ninja -C temp-sigs + +gpg -u "${gpg_id}" --detach-sign temp-sigs/cagebreak +gpg -u "${gpg_id}" --detach-sign temp-sigs/cagebreak.1 +gpg -u "${gpg_id}" --detach-sign temp-sigs/cagebreak-config.5 +gpg -u "${gpg_id}" --detach-sign temp-sigs/cagebreak-socket.7 + +cp temp-sigs/*.sig signatures/ + + +rm -rf temp-sigs diff --git a/scripts/fuzz b/scripts/fuzz new file mode 100755 index 0000000..7f227ec --- /dev/null +++ b/scripts/fuzz @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +readonly fuzzing_corpus="${1}" + +if [[ -n ${MESON_SOURCE_ROOT} ]] +then + # shellcheck disable=2164 + cd "${MESON_SOURCE_ROOT}" +fi + +rm -rf fuzzing-directory +CC=clang meson setup fuzzing-directory -Dfuzz=true -Db_sanitize=address,undefined -Db_lundef=false -Db_detect-leaks=0 +ninja -C fuzzing-directory/ +WLR_BACKENDS=headless ./fuzzing-directory/fuzz-parse -jobs=12 -max_len=50000 -close_fd_mask=3 "${fuzzing_corpus}" +rm -rf fuzzing-directory diff --git a/scripts/git-tag b/scripts/git-tag new file mode 100755 index 0000000..bd8e541 --- /dev/null +++ b/scripts/git-tag @@ -0,0 +1,8 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +readonly gpg_id="${1}" +readonly version="${2}" + +git tag -u "${gpg_id}" "${version}" HEAD diff --git a/scripts/install-development-environment b/scripts/install-development-environment new file mode 100755 index 0000000..d1b9793 --- /dev/null +++ b/scripts/install-development-environment @@ -0,0 +1,13 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +sudo pacman -Syu --noconfirm git grep sed xev meson ninja clang gcc shellcheck jq openbsd-netcat gnupg binutils alacritty wlroots wayland libxkbcommon cairo pango fontconfig libinput libevdev systemd-libs # systemd-libs is included because of libudev + +if [[ -n ${MESON_SOURCE_ROOT} ]] +then + # shellcheck disable=2164 + cd "${MESON_SOURCE_ROOT}" +fi + +gpg --import keys/* diff --git a/scripts/output-hashes b/scripts/output-hashes new file mode 100755 index 0000000..cf7cacf --- /dev/null +++ b/scripts/output-hashes @@ -0,0 +1,50 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +if [[ -n ${MESON_SOURCE_ROOT} ]] +then + # shellcheck disable=2164 + cd "${MESON_SOURCE_ROOT}" +fi + +readonly version="${1}" + +rm -rf hashes +meson setup hashes -Dxwayland=true -Dman-pages=true --buildtype=release +ninja -C hashes + +cb256=$(sha256sum hashes/cagebreak | cut -d " " -f1) +cb512=$(sha512sum hashes/cagebreak | cut -d " " -f1) + +cb1man256=$(sha256sum hashes/cagebreak.1 | cut -d " " -f1) +cb1man512=$(sha512sum hashes/cagebreak.1 | cut -d " " -f1) + +cb5man256=$(sha256sum hashes/cagebreak-config.5 | cut -d " " -f1) +cb5man512=$(sha512sum hashes/cagebreak-config.5 | cut -d " " -f1) + +cb7man256=$(sha256sum hashes/cagebreak-socket.7 | cut -d " " -f1) +cb7man512=$(sha512sum hashes/cagebreak-socket.7 | cut -d " " -f1) + +echo "${version} cagebreak + + * sha 256: ${cb256} + * sha 512: ${cb512} + +${version} cagebreak.1 + + * sha 256: ${cb1man256} + * sha 512: ${cb1man512} + +${version} cagebreak-config.5 + + * sha 256: ${cb5man256} + * sha 512: ${cb5man512} + +${version} cagebreak-socket.7 + + * sha 256: ${cb7man256} + * sha 512: ${cb7man512} +" > local-hashes.txt + +rm -rf hashes diff --git a/scripts/set-version b/scripts/set-version new file mode 100755 index 0000000..c4506cb --- /dev/null +++ b/scripts/set-version @@ -0,0 +1,20 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +# TODO man pages + +if [[ -n ${MESON_SOURCE_ROOT} ]] +then + # shellcheck disable=2164 + cd "${MESON_SOURCE_ROOT}" +fi + +# shellcheck disable=2034 +version="${1}" +sed -i -e "s/minversion\=[0-9]*\.[0-9]*.[0-9]*/minversion=$version/" README.md + + +sed -i -e "s/Version [0-9]*\.[0-9]*.[0-9]*/VERSION $version/" man/cagebreak.1.md +sed -i -e "s/Version [0-9]*\.[0-9]*.[0-9]*/VERSION $version/" man/cagebreak-config.5.md +sed -i -e "s/Version [0-9]*\.[0-9]*.[0-9]*/VERSION $version/" man/cagebreak-socket.7.md diff --git a/signatures/2.1.0-cagebreak-config.5.sig b/signatures/2.1.0-cagebreak-config.5.sig new file mode 100644 index 0000000000000000000000000000000000000000..25072cbc7ec479dc03f8b0e58fb181f393b6019f GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%R-@H2?|;5J?I6 zOsG4!XTI7G{wRJJEi`J}KeQfb1JU@66Z3T<6NTy#--hMh*c8j3d2~hbi^ZX=-TrKn ztD7j~V&53Q9i%4h8U#_7hK7oj`CIlD=;Mc4GwQ>a)J-YmdG`Vl;8s)}69L&?L5d~& z$20iJNFBNWK|tDpKg-~|d82IW#CC`j7nDWB&(z58T;2M2wvtE4dP=d?zp?WD0=p9* zUPU`tsJ{U-0GdW{DSNRrlKUGFVqhO3@k!$cL3*Qp6odwyB-0xQnq)@N!PVe$1`L>|k=$CLVHK?O+TkwoVUh!Xj=V&t>{#C*0%ot(iIdi&^gyH8KlU zhBT+I4>=Rc$+O;JZ!`T~Bm7w_#GKcp?kq#s$P0|Y^(i`zme%V+VSapC^`l@oRL1{@BcO}re zf)i0-Wdr6R<0JhvON1>o?yPvCFw8vYk{DbTrXy>~v!h&yhCb5?O?zZ$sp$kzmLK)j EGK$X>3IG5A literal 0 HcmV?d00001 diff --git a/signatures/2.1.0-cagebreak-socket.7.sig b/signatures/2.1.0-cagebreak-socket.7.sig new file mode 100644 index 0000000000000000000000000000000000000000..67c2e166279805704204ef4ba7843177146a8340 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%R-@I{*p^5J?I6 zOsG4!XJ?rY{wb7ikpWvUjL5LXPboA72(rh}Um;IL{Hr(?cZ{Hcdvsw7)6JwNk7BnM zayXykj0YkR+Jh2Hwq|Y^A zPu`ugLAlCp?L0U!>F;Zuu;aVM2bI~8Xj333 zsC7lgX`xb^ETu!?Bw8FNyQ$U4&W>=On~*_~z-WZIC6s*H>m*Fo>YN z3NqSep3ktdUAbS8m_Vjw$@OzLcpWk*swcy9j=(Zt11%qsS1}G4A(U&PU%nG0<@*JgP<=etYs$Pl@IShl2ReE?BjM En*g&E-T(jq literal 0 HcmV?d00001 diff --git a/signatures/2.1.0-cagebreak.1.sig b/signatures/2.1.0-cagebreak.1.sig new file mode 100644 index 0000000000000000000000000000000000000000..b0c8dc15ac8fae31e58867f0a45a09b3ed2d1486 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%R-@FaQb(5J?I6 zOsG4!XQ9Rq`v;-NQB9`itOy7w8l=VA36V8d$O+C8V4siElG)?+-d>(fZ&kfv`E=xo zinXUoT!}dOjO)=zs&(12$gG=(A+U zCuHOF=LWtU(1Dednc%h`JboeK64+cz8-y0Yk7+1^yM3lwplgw@i?XqZjEFM^_-h0Z z@*BzMK7ViM?i+E-b1U5=bh>3>h#N%FkvtOpAiTrt%rBrS4;{wW z#YEh;zE>EsLm_eFyq|IMThIw)Ro#1BO`vWh!8CFn|>I$Jm(P9-y7 z!he0ilG@?m)J zJ{eq<2(d=d+Cpi7$j%0c)kbInMA%wt<+aJ-)*bD#_1BbxZ)|xCbL@ctO6~R@_Yax; ztz>7&y$BT!7q(-3!{XjbzOdope4li@9B$gEPsc6ep)BMU=j$b*W(L=2xx4%aHp6O( z7~7&h?CgJ;Y7fxOYMx`k^J-@2HA?d{Nqqb-Nx|}M5-;vQBp9R!+q}?FrR-=x3L{11 zX969$BPXz2{2CKuBWFU)jUhbLXVmrPv>nUqh3+4CF$V;Jk3r<2*J+2=tj2xT%|&ZHd?OR?L2P;|Rb_ANCh zPF{g+^Ao3WzoSl#rc9|q`MH>0@plcedJVZl=KE%i5jp}Oii=6Ioj%WE$eO}I?`J)d z0v84f93fy1zigPkk+j$?-pb1~hneUMuYKNRY_)GY8L#g!H@eW3r_OiO(=HN>$zcI9 EDjqQqh5!Hn literal 0 HcmV?d00001 diff --git a/signatures/cagebreak-config.5.sig b/signatures/cagebreak-config.5.sig index 25072cbc7ec479dc03f8b0e58fb181f393b6019f..e25e49c74428afbac6d7bd0466d556b92405bdfe 100644 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*$>l!Yw(LZP72CP}!49FYc2K|Kv0%Sd(xBv>V!tzCAjipv zwL*&XWDQ+NgCa63^5xd6*rRB5_M7Ys7zgiT1s~-o2YJ1 z);#uxIl2+qI$*0rlI_<5p|vN80hPq{9%)NYButb7%J%%KnV z2q1c)eISEOG|o0!{YFv#IK8B;M~-^UR+TC;oHi$U-&sQxB_Yrv&!_Me-|GPK$CZbO E66|6O`Tzg` literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%R-@H2?|;5J?I6 zOsG4!XTI7G{wRJJEi`J}KeQfb1JU@66Z3T<6NTy#--hMh*c8j3d2~hbi^ZX=-TrKn ztD7j~V&53Q9i%4h8U#_7hK7oj`CIlD=;Mc4GwQ>a)J-YmdG`Vl;8s)}69L&?L5d~& z$20iJNFBNWK|tDpKg-~|d82IW#CC`j7nDWB&(z58T;2M2wvtE4dP=d?zp?WD0=p9* zUPU`tsJ{U-0GdW{DSNRrlKUGFVqhO3@k!$cL3*Qp6odwyB-0xQnq)@N!PVe$1`L>|k=$CLVHK?O+TkwoVUh!Xj=V&t>{#C*0%ot(iIdi&^gyH8KlU zhBT+I4>=Rc$+O;JZ!`T~Bm7w_#GKcp?kq#s$P0|Y^(i`zme%V+VSapC^`l@oRL1{@BcO}re zf)i0-Wdr6R<0JhvON1>o?yPvCFw8vYk{DbTrXy>~v!h&yhCb5?O?zZ$sp$kzmLK)j EGK$X>3IG5A diff --git a/signatures/cagebreak-socket.7.sig b/signatures/cagebreak-socket.7.sig index 67c2e166279805704204ef4ba7843177146a8340..6b1a6a53bea5fd958f39e4e1a3b2630bc6bcfdd0 100644 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*$>l!Yw(LZP72CP}!49FYc2K|Kv0%Sd(xBv<1}Fi}wvC0q8gc5j<2D--xgVi`D}qC? zVas)^fv%k{3!i4=+1r}fNLnDFBz&I`+q}yv?MCPXEhv(V#gT*E1@Ms!jzt)>6e6+| zX-u`yGyy-#sngzXi1tX8NCm+~i~>#s;PTeX{a!7a)AGH=S63U0u!;hLXdA$#rdSc0 z6YA!rPx9cY;iCCLmvPHMB{^o!+s?Nfmnp>f(39do*$Ir=a042`w^^;rkBk4a&zP(I zU}8wkO#P-KAM&EkhPF(rf9_C}R_T`%KR{cI)*$4uPZiJS2XunIn^uGgXo>%`hPIXv z`D{%Sh{dJ2P+)I$w3HP7lho0qk)zWVu*`U7``v1rG;;X^I`?&U`=Am_vS{j<0lMUE zmuvJ^o-(sqCPjoa+y8hZxkM`*=hB4tB^ zh_^{u14_Mg3N{t3Qi;moRnhiUR}1deAKy`A zPu`ugLAlCp?L0U!>F;Zuu;aVM2bI~8Xj333 zsC7lgX`xb^ETu!?Bw8FNyQ$U4&W>=On~*_~z-WZIC6s*H>m*Fo>YN z3NqSep3ktdUAbS8m_Vjw$@OzLcpWk*swcy9j=(Zt11%qsS1}G4A(U&PU%nG0<@*JgP<=etYs$Pl@IShl2ReE?BjM En*g&E-T(jq diff --git a/signatures/cagebreak.1.sig b/signatures/cagebreak.1.sig index b0c8dc15ac8fae31e58867f0a45a09b3ed2d1486..7674f52c5525457b35e37630f7e174105cdf97d9 100644 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*$>l!Yw(LZP72CP}!49FYc2K|Kv0%Sd(w*U$W5ZnyN z8{h{0g$BP5|3+rAM~!0w2)qQtiHJcD&$F7&*Ws<|G9b8d%A9w%?95_vvKr+J)dzRT z7}Dgl#lO}{Xei>jJAKVPK7g8_Z;E9f2&>0R>{6hPo?`&kqf!UMp}tJ)Wsq+ISEiLc z7wO~hJp|Wc#X+~)`n?40XtTbraBHqbm7O6V;i}>0UJV#W;2C%VvTX#0btuAYjR6kK zV(WyW@T$+>F)0eIA#}TV0@9hAJJUyyy&M9IU|`_8J@ED)2L9y07q1&UNkZha0OUV- zzD8CJ_LtymJoE9Y+goAv*mFh$G!(CRd$NaiJ?a@9zGQOd|U9!Q9j1Hs(lb?99V8jsaHPjFUYU2Vou z5{B+uG9q~#=4~+u)zU8ZH5&c03;JsLZ`OT_OK~VtnV*H%Og}fPQLGtIKz<&l7hNw zXd}6GH50ZJcJ$7*KqSJ+o=(V*_Xs82+|+zDk=Tdh5m^n@F2~G0VK#2!Pg{B!-)gN& zw6%KZzQ%6kJxHm(P0kSI51z_n58^m{ogDeO4T6{-y(@0Q;GhiJ+aP^ E*P|>Ivj6}9 literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%R-@FaQb(5J?I6 zOsG4!XQ9Rq`v;-NQB9`itOy7w8l=VA36V8d$O+C8V4siElG)?+-d>(fZ&kfv`E=xo zinXUoT!}dOjO)=zs&(12$gG=(A+U zCuHOF=LWtU(1Dednc%h`JboeK64+cz8-y0Yk7+1^yM3lwplgw@i?XqZjEFM^_-h0Z z@*BzMK7ViM?i+E-b1U5=bh>3>h#N%FkvtOpAiTrt%rBrS4;{wW z#YEh;zE>EsLm_eFyq|IMThIw)Ro#1BO`vWh!8CFn|>I$Jm(P9-y7 z!he0ilG@?l!Yw(LZP72CP}!49FYc2K|Kv0%Sd(w*U$W5ZnyN z8{h{0g|O`p|93+h`>T39v=djZ0&wOd*$K{aopV$L6nt}hx`hB&5Pf-?SaHqLIQKWAKFY)eQIZhM_TsTyth9BBvr?NCuIW4avXTAIt@Y<2T&n7p3kNrY! zqSc2?p^pZ(*T>#NcFb>weL^n7E3W>$GC?NFrG23dM+(TyWnpJ0Gx3H;|>bN zb4u`nR4`|f>GZAb=#_=PzeB?U&iWE&nPq(yXa9ud%8?4xOz%Omilkz`{YlRd^H~E3 zx98;1k+8JlLoJbo6%@FZ`jLoSn_zx{I`)X*_k9X&K-^K)Hd7Cd7R^550PG4Oeg4-m<1JL!W$2>2kLobN-?OLq z|LzkmP}4FyS|(AAzV-Ft1r%Nw+tRy1fEVK9fRa<;&NO>1m_X=8F<`g0s%*;X%p-IT zK#Fz}rdXasS2uaDJFVCNrH64xK49yEpCUp8p|%F? E)OoZP+yDRo literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%R-@EdUA$5J?I6 zOsG4!XUo$N0E5~0P~h*DH~*A2hTro%z;sAA=WxosF)hl-_!M(1uj5Le+}S87X>m)J zJ{eq<2(d=d+Cpi7$j%0c)kbInMA%wt<+aJ-)*bD#_1BbxZ)|xCbL@ctO6~R@_Yax; ztz>7&y$BT!7q(-3!{XjbzOdope4li@9B$gEPsc6ep)BMU=j$b*W(L=2xx4%aHp6O( z7~7&h?CgJ;Y7fxOYMx`k^J-@2HA?d{Nqqb-Nx|}M5-;vQBp9R!+q}?FrR-=x3L{11 zX969$BPXz2{2CKuBWFU)jUhbLXVmrPv>nUqh3+4CF$V;Jk3r<2*J+2=tj2xT%|&ZHd?OR?L2P;|Rb_ANCh zPF{g+^Ao3WzoSl#rc9|q`MH>0@plcedJVZl=KE%i5jp}Oii=6Ioj%WE$eO}I?`J)d z0v84f93fy1zigPkk+j$?-pb1~hneUMuYKNRY_)GY8L#g!H@eW3r_OiO(=HN>$zcI9 EDjqQqh5!Hn diff --git a/test/check-artefacts b/test/check-artefacts new file mode 100644 index 0000000..9e62bb5 --- /dev/null +++ b/test/check-artefacts @@ -0,0 +1,27 @@ +#! /bin/sh +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +RESULT=0 + +readonly version="${1}" + +# shellcheck disable=SC2164 +cd "${MESONCURRENTCONFIGDIR}" + +gpg --verify "release_${version}.tar.gz.sig" || RESULT=1 +gpg --verify "release-artefacts_${version}.tar.gz.sig" || RESULT=1 + +tar -xvf "release_${version}.tar.gz" +cd cagebreak || exit 1 +meson setup build -Dxwayland=true -Dman-pages=true --buildtype=release +ninja -C build +gpg --verify ../signatures/cagebreak.sig build/cagebreak || RESULT=1 +gpg --verify ../signatures/cagebreak.1.sig build/cagebreak.1 || RESULT=1 +gpg --verify ../signatures/cagebreak-config.5.sig build/cagebreak-config.5 || RESULT=1 +gpg --verify ../signatures/cagebreak-socket.7.sig build/cagebreak-socket.7 || RESULT=1 +# shellcheck disable=2103 +cd .. +rm -rf cagebreak + +exit "${RESULT}" diff --git a/test/copyright-license b/test/copyright-license index 4fe517f..630f843 100644 --- a/test/copyright-license +++ b/test/copyright-license @@ -10,7 +10,9 @@ readonly test_deps=$(cd "${MESONCURRENTCONFIGDIR}" ; find . -type f | grep test/ readonly examples_deps=$(cd "${MESONCURRENTCONFIGDIR}" ; find . -type f | grep examples/) # shellcheck disable=2155,2164,2046 readonly example_scripts_deps=$(cd "${MESONCURRENTCONFIGDIR}" ; find . -type f | grep example_scripts/) -readonly deps="${declared_deps} ${hardcoded_deps} ${test_deps} ${examples_deps} ${example_scripts_deps}" +# shellcheck disable=2155,2164,2046 +readonly scripts_deps=$(cd "${MESONCURRENTCONFIGDIR}" ; find . -type f | grep scripts/) +readonly deps="${declared_deps} ${hardcoded_deps} ${test_deps} ${examples_deps} ${example_scripts_deps} ${scripts_deps}" # shellcheck disable=2046,2155 readonly curryear=$(date +%Y) diff --git a/test/git-tag b/test/git-tag new file mode 100644 index 0000000..f080060 --- /dev/null +++ b/test/git-tag @@ -0,0 +1,16 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +VERSION=$1 +RESULT=0 + +if git tag -v "${VERSION}" +then + echo "[x] git tag" +else + RESULT=1 + echo "[ ] git tag" +fi + +exit "${RESULT}" diff --git a/test/gpg-signatures b/test/gpg-signatures new file mode 100644 index 0000000..c5d63fd --- /dev/null +++ b/test/gpg-signatures @@ -0,0 +1,43 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +RESULT=0 + +# cagebreak +if gpg --verify ../signatures/cagebreak.sig cagebreak +then + echo "[x] cagebreak binary" +else + RESULT=1 + echo "[ ] cagebreak binary" +fi + +# cagebreak-man +if gpg --verify ../signatures/cagebreak.1.sig cagebreak.1 +then + echo "[x] cagebreak.1 man" +else + RESULT=1 + echo "[ ] cagebreak.1 man" +fi + +# cagebreak-config man +if gpg --verify ../signatures/cagebreak-config.5.sig cagebreak-config.5 +then + echo "[x] cagebreak-config.5 man" +else + RESULT=1 + echo "[ ] cagebreak-config.5 man" +fi + +# cagebreak-socket man +if gpg --verify ../signatures/cagebreak-socket.7.sig cagebreak-socket.7 +then + echo "[x] cagebreak-socket.7 man" +else + RESULT=1 + echo "[ ] cagebreak-socket.7 man" +fi + +exit "${RESULT}" diff --git a/test/gpg-validity b/test/gpg-validity new file mode 100644 index 0000000..6340105 --- /dev/null +++ b/test/gpg-validity @@ -0,0 +1,46 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +RESULT=0 + +# shellcheck disable=2164 +cd "${MESONCURRENTCONFIGDIR}/keys" +stoday=$(date +%s) +signingmargin=90 + +# shellcheck disable=2046 +skey11exptime=$(date --date=$(gpg --show-keys cagebreak_signing_key_11\@project-repo.co.pub | tail -2 | head -1 | cut -d " " -f 8 | rev | cut -c2- | rev) '+%s') +# shellcheck disable=2046 +skey12exptime=$(date --date=$(gpg --show-keys cagebreak_signing_key_12\@project-repo.co.pub | tail -2 | head -1 | cut -d " " -f 8 | rev | cut -c2- | rev) '+%s') +# shellcheck disable=2046 +mailexptime=$(date --date=$(gpg --show-keys cagebreak\@project-repo.co.pub | tail -2 | head -1 | cut -d " " -f 8 | rev | cut -c2- | rev) '+%s') + +# signing keys +## signing key 11 +if [[ $(( (stoday - skey11exptime) / 86400 )) -lt $signingmargin ]] +then + echo "[x] signign key 11" +else + RESULT=1 + echo "[ ] signing key 11" +fi +## signing key 12 +if [[ $(( (stoday - skey12exptime) / 86400 )) -lt $signingmargin ]] +then + echo "[x] signign key 12" +else + RESULT=1 + echo "[ ] signing key 12" +fi + +# email key +if [[ $(( (stoday - mailexptime) / 86400 )) -lt $signingmargin ]] +then + echo "[x] mail key" +else + RESULT=1 + echo "[ ] mail key" +fi + +exit "${RESULT}" diff --git a/test/hashes-md b/test/hashes-md new file mode 100644 index 0000000..30a5529 --- /dev/null +++ b/test/hashes-md @@ -0,0 +1,53 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +VERSION=$1 +RESULT=0 + +# shellcheck disable=2164 +cd "${MESONCURRENTCONFIGDIR}" + +cb256=$(sha256sum build/cagebreak | cut -d " " -f1 ) +cb256man1=$(sha256sum build/cagebreak.1 | cut -d " " -f1 ) +cb256man5=$(sha256sum build/cagebreak-config.5 | cut -d " " -f1 ) +cb256man7=$(sha256sum build/cagebreak-socket.7 | cut -d " " -f1 ) +cb512=$(sha512sum build/cagebreak | cut -d " " -f1 ) +cb512man1=$(sha512sum build/cagebreak.1 | cut -d " " -f1 ) +cb512man5=$(sha512sum build/cagebreak-config.5 | cut -d " " -f1 ) +cb512man7=$(sha512sum build/cagebreak-socket.7 | cut -d " " -f1 ) + +hashesdoc=$(head -21 Hashes.md) + +testdoc="# Hashes + +$VERSION cagebreak + + * sha 256: ${cb256} + * sha 512: ${cb512} + +$VERSION cagebreak.1 + + * sha 256: ${cb256man1} + * sha 512: ${cb512man1} + +$VERSION cagebreak-config.5 + + * sha 256: ${cb256man5} + * sha 512: ${cb512man5} + +$VERSION cagebreak-socket.7 + + * sha 256: ${cb256man7} + * sha 512: ${cb512man7}" + +# email key +if [[ "${hashesdoc}" = "${testdoc}" ]] +then + echo "[x] Hashes.md" +else + RESULT=1 + echo "[ ] Hashes.md" +fi + +exit "${RESULT}" diff --git a/test/non-auto-tests b/test/non-auto-tests new file mode 100644 index 0000000..470d494 --- /dev/null +++ b/test/non-auto-tests @@ -0,0 +1,25 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +VERSION=$1 +RESULT=0 + +# shellcheck disable=2164 +cd "${MESONCURRENTCONFIGDIR}/release-non-auto-checks" + +filevar="$VERSION +$(date +%Y-%m-%d)" + +for check in ./* +do + if [[ $(cat "$check") = "${filevar}" ]] + then + echo "[x] ${check}" + else + RESULT=1 + echo "[ ] ${check}" + fi +done + +exit "${RESULT}" diff --git a/test/shellcheck b/test/shellcheck index 0727178..8fa5f4e 100644 --- a/test/shellcheck +++ b/test/shellcheck @@ -4,13 +4,15 @@ RESULT=0 -set -x # shellcheck disable=2164 cd "${MESONCURRENTCONFIGDIR}/test" # shellcheck disable=2046 shellcheck --source-path=../example_scripts/ $(ls -Itesting-configurations) || RESULT=1 cd "${MESONCURRENTCONFIGDIR}/example_scripts/" || RESULT=1 -shellcheck ./* +shellcheck ./* || RESULT=1 + +cd "${MESONCURRENTCONFIGDIR}/scripts/" || RESULT=1 +shellcheck ./* || RESULT=1 exit "${RESULT}" From 9a4c07d8154f993ed9ca92a3fee1792e536bcccb Mon Sep 17 00:00:00 2001 From: project-repo Date: Mon, 24 Apr 2023 22:57:42 +0200 Subject: [PATCH 2/8] Release 2.1.2 - Adjust release procedure - Fix Issue 60 in Bugs.md (Thanks to Tom Greig) - Fix Issue 61 in Bugs.md --- Bugs.md | 17 +++++++++++++ Hashes.md | 20 +++++++++++++++ README.md | 12 ++++++--- example_scripts/focus_follows_cursor.sh | 23 ------------------ man/cagebreak-config.5.md | 2 +- man/cagebreak-socket.7.md | 2 +- man/cagebreak.1.md | 2 +- meson.build | 4 +-- output.c | 2 +- release-non-auto-checks/Bugs.md | 4 +-- release-non-auto-checks/FAQ.md | 4 +-- release-non-auto-checks/SECURITY.md | 4 +-- release-non-auto-checks/WLR_XDG_VERSION | 4 +-- release-non-auto-checks/changelog-major-minor | 4 +-- release-non-auto-checks/internal-wiki | 4 +-- release-non-auto-checks/meson-epoch | 2 -- release-non-auto-checks/release-note | 4 +-- .../reproducibility-checked | 4 +-- .../security-to-man-page-info-transfer | 4 +-- scripts/install-development-environment | 2 +- scripts/set-version | 6 ++--- signatures/2.1.1-cagebreak-config.5.sig | Bin 0 -> 566 bytes signatures/2.1.1-cagebreak-socket.7.sig | Bin 0 -> 566 bytes signatures/2.1.1-cagebreak.1.sig | Bin 0 -> 566 bytes signatures/2.1.1-cagebreak.sig | Bin 0 -> 566 bytes signatures/cagebreak-config.5.sig | Bin 566 -> 566 bytes signatures/cagebreak-socket.7.sig | Bin 566 -> 566 bytes signatures/cagebreak.1.sig | Bin 566 -> 566 bytes signatures/cagebreak.sig | Bin 566 -> 566 bytes 29 files changed, 74 insertions(+), 56 deletions(-) delete mode 100644 example_scripts/focus_follows_cursor.sh delete mode 100644 release-non-auto-checks/meson-epoch mode change 100755 => 100644 scripts/install-development-environment create mode 100644 signatures/2.1.1-cagebreak-config.5.sig create mode 100644 signatures/2.1.1-cagebreak-socket.7.sig create mode 100644 signatures/2.1.1-cagebreak.1.sig create mode 100644 signatures/2.1.1-cagebreak.sig diff --git a/Bugs.md b/Bugs.md index d8a33a1..4075383 100644 --- a/Bugs.md +++ b/Bugs.md @@ -1170,3 +1170,20 @@ leading to a termination of cagebreak. * Fixed: 2.1.0 Prior to release 2.1.0 `meson install` did not work perfectly. + +## Issue 60 + + * github issue number: N/A + * Fixed: 2.1.2 + +In the `merge_output_configs` function, when copying the properties of +one config to another, the `angles` element of an input structure was +being copied to the `status` element of the resultant structure. + +## Issue 61 + + * github issue number: N/A + * Fixed: 2.1.2 + +The script introduced with 2.1.1 `scripts/install-development-environment` had some +missing dependencies. This has been resolved and tested with bare arch containers. diff --git a/Hashes.md b/Hashes.md index e5da651..a6ceae1 100644 --- a/Hashes.md +++ b/Hashes.md @@ -1,5 +1,25 @@ # Hashes +2.1.2 cagebreak + + * sha 256: 7d07864a837ee577a52b2727bfbfe8834fe599712144f0685f458d508717e451 + * sha 512: 9429bace89affdd9f7e83f48168c1e119d1531a5eb9a320299924e469c0e43052e93580aee6ba5f4c2b878e5b85ec5fc4cf172940cb4c1d950329c175898b647 + +2.1.2 cagebreak.1 + + * sha 256: aec69b06cc8dd4328027a04a12847c91b6a176537cce7a6c2d68a4f004cdd47c + * sha 512: 1d6e882a1fa8bec84df189cd32a1ac8953fb61d0241b04296ecb8caadfc55733947037b3810ba28b73e2a32bc30dfd68794dd173220e1f8af8ba9d3d02abe19e + +2.1.2 cagebreak-config.5 + + * sha 256: 36e11b9d4437485a9671e72b3f6cc5669fb6a5b67b60198ee310efd6f3f3b093 + * sha 512: 8378924d81c2c35ddfeace15debafb0407fbbe76513f7a488815a1421ff1c49d7aa7f21812573043004a8fd4e481242fd6970be270fac8007771623ed8d92208 + +2.1.2 cagebreak-socket.7 + + * sha 256: 346f8e203210a1542ca31980628095dbfb267764e3c2228457dc5b0b43850fda + * sha 512: 84e40072c71a38449ec6a5409445458405009010ee47d3e26ba13f6fd13f0291e1c3b38f5e84ba5521b14955bd97ab6d1c636b72a093b6322d0879f98218ab7f + 2.1.1 cagebreak * sha 256: 8632e7e49637e5a3e7ab425a05fbd63d71cf6025143c89d196f309dbf4efdd57 diff --git a/README.md b/README.md index aca03a6..004239a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Cagebreak: A Wayland Tiling Compositor -[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.1.1)](https://repology.org/project/cagebreak/versions) +[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.1.2)](https://repology.org/project/cagebreak/versions) ## Quick Introduction @@ -633,14 +633,17 @@ The release procedure outlines the process for a release to occur. * [ ] Synchronize any socket changes to cagebreak-socket man page * [ ] Document fixed bugs in Bugs.md * [ ] Include issue discussion from github, where applicable + * [ ] `meson compile adjust-epoch -C build` * [ ] Commit changes * [ ] `git push origin development` * [ ] Testing * [ ] Manual testing * [ ] `meson compile fuzz -C build` for at least one hour + * [ ] Adjust Hashes.md - Use `meson compile output-hashes -C build` to add Hashes or aid in repro check + * [ ] Commit changes + * [ ] `git push origin development` * [ ] Complete release-non-auto-checks - * [ ] Use `meson compile output-hashes -C build` to add Hashes or aid in repro check - * [ ] `meson compile create-signatures -C build` + * [ ] `meson compile create-sigs -C build` * [ ] Commit and push signatures, hashes and non-auto-check files * [ ] `meson test -C build` passes everything except some release tests * [ ] `git add` relevant files @@ -660,6 +663,7 @@ The release procedure outlines the process for a release to occur. * [ ] `git merge master` * [ ] `git push --tags origin hotfix` * [ ] Upload archives and signatures as release assets + * [ ] Delete feature branches if appropriate * [ ] Manage package release ## Roadmap @@ -743,6 +747,8 @@ see [SECURITY.md](SECURITY.md). * Oliver Friedmann * [Add output scaling](https://github.com/project-repo/cagebreak/pull/34), released in 2.0.0 with slight modifications + * Tom Greig + * Fix bug in merge_output_configs in 2.1.2 ## License diff --git a/example_scripts/focus_follows_cursor.sh b/example_scripts/focus_follows_cursor.sh deleted file mode 100644 index e47bf88..0000000 --- a/example_scripts/focus_follows_cursor.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# Copyright 2023, project-repo and the cagebreak contributors -# SPDX-License-Identifier: MIT - -# This script uses the cagebreak socket to modify the compositor's behaviour in -# such a way that the currently focussed tile follows the cursor, i.e. that the -# currently focussed tile is always the one within which the cursor is located. - -# Start up the ipc link -source "$(dirname "${BASH_SOURCE[0]}")/cb_script_header.sh" - -while IFS= read -r -d $'\0' event -do - # Remove the cg-ipc header - event="${event:6}" - if [[ "$(echo "${event}" | jq ".event_name")" = "\"cursor_switch_tile\"" ]] - then - new_tile="$(echo "${event}"|jq -r ".new_tile")" - new_output_id="$(echo "${event}"|jq -r ".new_output_id")" - # Send the new tile to focus to cagebreak - echo -e "screen ${new_output_id}\nfocus_tile ${new_tile}" >&3 - fi -done <&4 diff --git a/man/cagebreak-config.5.md b/man/cagebreak-config.5.md index bb04547..b9632dd 100644 --- a/man/cagebreak-config.5.md +++ b/man/cagebreak-config.5.md @@ -1,4 +1,4 @@ -cagebreak-config(5) "VERSION 2.1.1" "Cagebreak Manual" +cagebreak-config(5) "Version 2.1.2" "Cagebreak Manual" # NAME diff --git a/man/cagebreak-socket.7.md b/man/cagebreak-socket.7.md index 19b7370..4c1a31a 100644 --- a/man/cagebreak-socket.7.md +++ b/man/cagebreak-socket.7.md @@ -1,4 +1,4 @@ -cagebreak-socket(7) "VERSION 2.1.1" "Cagebreak Manual" +cagebreak-socket(7) "Version 2.1.2" "Cagebreak Manual" # NAME diff --git a/man/cagebreak.1.md b/man/cagebreak.1.md index fdc2da1..c8fc85e 100644 --- a/man/cagebreak.1.md +++ b/man/cagebreak.1.md @@ -1,4 +1,4 @@ -cagebreak(1) "VERSION 2.1.1" "Cagebreak Manual" +cagebreak(1) "Version 2.1.2" "Cagebreak Manual" # NAME diff --git a/meson.build b/meson.build index 26b0746..777c8d3 100644 --- a/meson.build +++ b/meson.build @@ -3,7 +3,7 @@ project( 'cagebreak', 'c', -version : '2.1.1', +version : '2.1.2', license : 'MIT', default_options : ['c_std=c11', 'warning_level=3'] ) @@ -260,7 +260,7 @@ install_data('LICENSE', install_dir : '/usr/share/licenses/' + meson.project_nam if get_option('man-pages') scdoc = find_program('scdoc') - secssinceepoch = 1681758922 + secssinceepoch = 1682363199 shcommand = 'export SOURCE_DATE_EPOCH=' + secssinceepoch.to_string() + ' ; @0@ < @INPUT@'.format(scdoc.path()) sh = find_program('sh') mandir1 = join_paths(get_option('mandir'), 'man1') diff --git a/output.c b/output.c index b8fc627..506f5bd 100644 --- a/output.c +++ b/output.c @@ -399,7 +399,7 @@ merge_output_configs(struct cg_output_config *cfg1, out_cfg->scale = cfg1->scale; } if(cfg1->angle == out_cfg->angle) { - out_cfg->status = cfg2->angle; + out_cfg->angle = cfg2->angle; } else { out_cfg->angle = cfg1->angle; } diff --git a/release-non-auto-checks/Bugs.md b/release-non-auto-checks/Bugs.md index aa7d21e..5f93ac2 100644 --- a/release-non-auto-checks/Bugs.md +++ b/release-non-auto-checks/Bugs.md @@ -1,2 +1,2 @@ -2.1.1 -2023-04-17 +2.1.2 +2023-04-24 diff --git a/release-non-auto-checks/FAQ.md b/release-non-auto-checks/FAQ.md index aa7d21e..5f93ac2 100644 --- a/release-non-auto-checks/FAQ.md +++ b/release-non-auto-checks/FAQ.md @@ -1,2 +1,2 @@ -2.1.1 -2023-04-17 +2.1.2 +2023-04-24 diff --git a/release-non-auto-checks/SECURITY.md b/release-non-auto-checks/SECURITY.md index aa7d21e..5f93ac2 100644 --- a/release-non-auto-checks/SECURITY.md +++ b/release-non-auto-checks/SECURITY.md @@ -1,2 +1,2 @@ -2.1.1 -2023-04-17 +2.1.2 +2023-04-24 diff --git a/release-non-auto-checks/WLR_XDG_VERSION b/release-non-auto-checks/WLR_XDG_VERSION index aa7d21e..5f93ac2 100644 --- a/release-non-auto-checks/WLR_XDG_VERSION +++ b/release-non-auto-checks/WLR_XDG_VERSION @@ -1,2 +1,2 @@ -2.1.1 -2023-04-17 +2.1.2 +2023-04-24 diff --git a/release-non-auto-checks/changelog-major-minor b/release-non-auto-checks/changelog-major-minor index aa7d21e..5f93ac2 100644 --- a/release-non-auto-checks/changelog-major-minor +++ b/release-non-auto-checks/changelog-major-minor @@ -1,2 +1,2 @@ -2.1.1 -2023-04-17 +2.1.2 +2023-04-24 diff --git a/release-non-auto-checks/internal-wiki b/release-non-auto-checks/internal-wiki index aa7d21e..5f93ac2 100644 --- a/release-non-auto-checks/internal-wiki +++ b/release-non-auto-checks/internal-wiki @@ -1,2 +1,2 @@ -2.1.1 -2023-04-17 +2.1.2 +2023-04-24 diff --git a/release-non-auto-checks/meson-epoch b/release-non-auto-checks/meson-epoch deleted file mode 100644 index aa7d21e..0000000 --- a/release-non-auto-checks/meson-epoch +++ /dev/null @@ -1,2 +0,0 @@ -2.1.1 -2023-04-17 diff --git a/release-non-auto-checks/release-note b/release-non-auto-checks/release-note index aa7d21e..5f93ac2 100644 --- a/release-non-auto-checks/release-note +++ b/release-non-auto-checks/release-note @@ -1,2 +1,2 @@ -2.1.1 -2023-04-17 +2.1.2 +2023-04-24 diff --git a/release-non-auto-checks/reproducibility-checked b/release-non-auto-checks/reproducibility-checked index aa7d21e..5f93ac2 100644 --- a/release-non-auto-checks/reproducibility-checked +++ b/release-non-auto-checks/reproducibility-checked @@ -1,2 +1,2 @@ -2.1.1 -2023-04-17 +2.1.2 +2023-04-24 diff --git a/release-non-auto-checks/security-to-man-page-info-transfer b/release-non-auto-checks/security-to-man-page-info-transfer index aa7d21e..5f93ac2 100644 --- a/release-non-auto-checks/security-to-man-page-info-transfer +++ b/release-non-auto-checks/security-to-man-page-info-transfer @@ -1,2 +1,2 @@ -2.1.1 -2023-04-17 +2.1.2 +2023-04-24 diff --git a/scripts/install-development-environment b/scripts/install-development-environment old mode 100755 new mode 100644 index d1b9793..1b71ce5 --- a/scripts/install-development-environment +++ b/scripts/install-development-environment @@ -2,7 +2,7 @@ # Copyright 2023, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT -sudo pacman -Syu --noconfirm git grep sed xev meson ninja clang gcc shellcheck jq openbsd-netcat gnupg binutils alacritty wlroots wayland libxkbcommon cairo pango fontconfig libinput libevdev systemd-libs # systemd-libs is included because of libudev +sudo pacman -Syu --noconfirm git grep sed xorg-xev meson ninja clang gcc shellcheck jq openbsd-netcat gnupg binutils alacritty wlroots wayland wayland-protocols libxkbcommon cairo pango fontconfig libinput libevdev pkgconf scdoc systemd-libs # systemd-libs is included because of libudev if [[ -n ${MESON_SOURCE_ROOT} ]] then diff --git a/scripts/set-version b/scripts/set-version index c4506cb..3ee035c 100755 --- a/scripts/set-version +++ b/scripts/set-version @@ -15,6 +15,6 @@ version="${1}" sed -i -e "s/minversion\=[0-9]*\.[0-9]*.[0-9]*/minversion=$version/" README.md -sed -i -e "s/Version [0-9]*\.[0-9]*.[0-9]*/VERSION $version/" man/cagebreak.1.md -sed -i -e "s/Version [0-9]*\.[0-9]*.[0-9]*/VERSION $version/" man/cagebreak-config.5.md -sed -i -e "s/Version [0-9]*\.[0-9]*.[0-9]*/VERSION $version/" man/cagebreak-socket.7.md +sed -i -e "s/Version [0-9]*\.[0-9]*.[0-9]*/Version $version/" man/cagebreak.1.md +sed -i -e "s/Version [0-9]*\.[0-9]*.[0-9]*/Version $version/" man/cagebreak-config.5.md +sed -i -e "s/Version [0-9]*\.[0-9]*.[0-9]*/Version $version/" man/cagebreak-socket.7.md diff --git a/signatures/2.1.1-cagebreak-config.5.sig b/signatures/2.1.1-cagebreak-config.5.sig new file mode 100644 index 0000000000000000000000000000000000000000..e25e49c74428afbac6d7bd0466d556b92405bdfe GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*$>l!Yw(LZP72CP}!49FYc2K|Kv0%Sd(xBv>V!tzCAjipv zwL*&XWDQ+NgCa63^5xd6*rRB5_M7Ys7zgiT1s~-o2YJ1 z);#uxIl2+qI$*0rlI_<5p|vN80hPq{9%)NYButb7%J%%KnV z2q1c)eISEOG|o0!{YFv#IK8B;M~-^UR+TC;oHi$U-&sQxB_Yrv&!_Me-|GPK$CZbO E66|6O`Tzg` literal 0 HcmV?d00001 diff --git a/signatures/2.1.1-cagebreak-socket.7.sig b/signatures/2.1.1-cagebreak-socket.7.sig new file mode 100644 index 0000000000000000000000000000000000000000..6b1a6a53bea5fd958f39e4e1a3b2630bc6bcfdd0 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*$>l!Yw(LZP72CP}!49FYc2K|Kv0%Sd(xBv<1}Fi}wvC0q8gc5j<2D--xgVi`D}qC? zVas)^fv%k{3!i4=+1r}fNLnDFBz&I`+q}yv?MCPXEhv(V#gT*E1@Ms!jzt)>6e6+| zX-u`yGyy-#sngzXi1tX8NCm+~i~>#s;PTeX{a!7a)AGH=S63U0u!;hLXdA$#rdSc0 z6YA!rPx9cY;iCCLmvPHMB{^o!+s?Nfmnp>f(39do*$Ir=a042`w^^;rkBk4a&zP(I zU}8wkO#P-KAM&EkhPF(rf9_C}R_T`%KR{cI)*$4uPZiJS2XunIn^uGgXo>%`hPIXv z`D{%Sh{dJ2P+)I$w3HP7lho0qk)zWVu*`U7``v1rG;;X^I`?&U`=Am_vS{j<0lMUE zmuvJ^o-(sqCPjoa+y8hZxkM`*=hB4tB^ zh_^{u14_Mg3N{t3Qi;moRnhiUR}1deAKy`l!Yw(LZP72CP}!49FYc2K|Kv0%Sd(w*U$W5ZnyN z8{h{0g$BP5|3+rAM~!0w2)qQtiHJcD&$F7&*Ws<|G9b8d%A9w%?95_vvKr+J)dzRT z7}Dgl#lO}{Xei>jJAKVPK7g8_Z;E9f2&>0R>{6hPo?`&kqf!UMp}tJ)Wsq+ISEiLc z7wO~hJp|Wc#X+~)`n?40XtTbraBHqbm7O6V;i}>0UJV#W;2C%VvTX#0btuAYjR6kK zV(WyW@T$+>F)0eIA#}TV0@9hAJJUyyy&M9IU|`_8J@ED)2L9y07q1&UNkZha0OUV- zzD8CJ_LtymJoE9Y+goAv*mFh$G!(CRd$NaiJ?a@9zGQOd|U9!Q9j1Hs(lb?99V8jsaHPjFUYU2Vou z5{B+uG9q~#=4~+u)zU8ZH5&c03;JsLZ`OT_OK~VtnV*H%Og}fPQLGtIKz<&l7hNw zXd}6GH50ZJcJ$7*KqSJ+o=(V*_Xs82+|+zDk=Tdh5m^n@F2~G0VK#2!Pg{B!-)gN& zw6%KZzQ%6kJxHm(P0kSI51z_n58^m{ogDeO4T6{-y(@0Q;GhiJ+aP^ E*P|>Ivj6}9 literal 0 HcmV?d00001 diff --git a/signatures/2.1.1-cagebreak.sig b/signatures/2.1.1-cagebreak.sig new file mode 100644 index 0000000000000000000000000000000000000000..c71037ff63b412c8e4ee197d5ed9267706168b0c GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*$>l!Yw(LZP72CP}!49FYc2K|Kv0%Sd(w*U$W5ZnyN z8{h{0g|O`p|93+h`>T39v=djZ0&wOd*$K{aopV$L6nt}hx`hB&5Pf-?SaHqLIQKWAKFY)eQIZhM_TsTyth9BBvr?NCuIW4avXTAIt@Y<2T&n7p3kNrY! zqSc2?p^pZ(*T>#NcFb>weL^n7E3W>$GC?NFrG23dM+(TyWnpJ0Gx3H;|>bN zb4u`nR4`|f>GZAb=#_=PzeB?U&iWE&nPq(yXa9ud%8?4xOz%Omilkz`{YlRd^H~E3 zx98;1k+8JlLoJbo6%@FZ`jLoSn_zx{I`)X*_k9X&K-^K)Hd7Cd7R^550PG4Oeg4-m<1JL!W$2>2kLobN-?OLq z|LzkmP}4FyS|(AAzV-Ft1r%Nw+tRy1fEVK9fRa<;&NO>1m_X=8F<`g0s%*;X%p-IT zK#Fz}rdXasS2uaDJFVCNrH64xK49yEpCUp8p|%F? E)OoZP+yDRo literal 0 HcmV?d00001 diff --git a/signatures/cagebreak-config.5.sig b/signatures/cagebreak-config.5.sig index e25e49c74428afbac6d7bd0466d556b92405bdfe..f96713d95f03f5db4cb5d9f359f5a07efe261263 100644 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%S()fdC2#5J?I6 zOsG4!XN%(x{vno|Sj7x0L`Rsk` zzccF>sPdtgaU4+77ayFBN zL^y190up?k#V_WR^AIUpXARKF?>7Pi;N+0Lad*>|^}Rjv`Ht-`WO^?`ltx=!!sIC# z^G!&A7B+INK_M#jzyF%$+1LiW?U!5%MOQc26B8*GTlnd%8Gs-0Cgn}~T}@eGpvtkc z2|6({wHX<0T{+EhR2>^Qu3-&A%G>TykPPs0n75m>G5w!naEvg1&=TW;)NzxOQ)H;- zdyPhRslELoykhP2>JIQlaFf_qf;3A&`kRqsX?xGRY_m;^0Ssze;3I25@-&3jv{%LO zlt`NJBEZ0hE4D+0HmHM!j!XPoad8u>E$czw*o&rfvIjyILMlzJA%PU^WO29|T4_{) Ey-4Q{fB*mh literal 566 zcmV-60?GY}0y6{v0SEvc79j*$>l!Yw(LZP72CP}!49FYc2K|Kv0%Sd(xBv>V!tzCAjipv zwL*&XWDQ+NgCa63^5xd6*rRB5_M7Ys7zgiT1s~-o2YJ1 z);#uxIl2+qI$*0rlI_<5p|vN80hPq{9%)NYButb7%J%%KnV z2q1c)eISEOG|o0!{YFv#IK8B;M~-^UR+TC;oHi$U-&sQxB_Yrv&!_Me-|GPK$CZbO E66|6O`Tzg` diff --git a/signatures/cagebreak-socket.7.sig b/signatures/cagebreak-socket.7.sig index 6b1a6a53bea5fd958f39e4e1a3b2630bc6bcfdd0..fec631f4783791825b37c8b15a6c4e24cca58d55 100644 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%S()fdC2#5J?I6 zOsG4!XVo?CTq)#T*vDA8Uv0yd-^z|q<4hqC}C^c;56vGqqV62Z0uy0F_8W35NU8g;5AHC59BNy2{Q?7)R%MQUM`Tb zFv4dkl&*4`9`fA59G5+%c*$F><(@z?}Q_4rlof-K!}(ISCRNGVfw7&vuT$iT2Q zVWn@xp0K@o{>#Qo+54}2Gv&Ie*M@P$Fihu;Z>%`5l1R$1bJq$PcKxs!7vH1l$HSYy z25=-=ZZAhjUn)CT;B~FWgS_E>2VF|gB&V2gstyT9sHUEzMrDT}x+H8X_i7%_B&~SG zc$EpgnHN}f*FPwKB3N6xv*{nsJ0o4zyNLx7Q!ncY^a{fXJ@Esa@=vK;a4I z8_RhqV5KRy4RQ$`<*%w7xi{-nI3^0@?6iLUl|JA7`dsicN7B8sb~X01qEI9okTQ%W zOWuS5w!uKv3cn0ID(_u`!SgLEqIz;TBZrJ^#!ZwIg`kVr$r|}OTS~AVgz`8TEF)`r EcpuIZNB{r; literal 566 zcmV-60?GY}0y6{v0SEvc79j*$>l!Yw(LZP72CP}!49FYc2K|Kv0%Sd(xBv<1}Fi}wvC0q8gc5j<2D--xgVi`D}qC? zVas)^fv%k{3!i4=+1r}fNLnDFBz&I`+q}yv?MCPXEhv(V#gT*E1@Ms!jzt)>6e6+| zX-u`yGyy-#sngzXi1tX8NCm+~i~>#s;PTeX{a!7a)AGH=S63U0u!;hLXdA$#rdSc0 z6YA!rPx9cY;iCCLmvPHMB{^o!+s?Nfmnp>f(39do*$Ir=a042`w^^;rkBk4a&zP(I zU}8wkO#P-KAM&EkhPF(rf9_C}R_T`%KR{cI)*$4uPZiJS2XunIn^uGgXo>%`hPIXv z`D{%Sh{dJ2P+)I$w3HP7lho0qk)zWVu*`U7``v1rG;;X^I`?&U`=Am_vS{j<0lMUE zmuvJ^o-(sqCPjoa+y8hZxkM`*=hB4tB^ zh_^{u14_Mg3N{t3Qi;moRnhiUR}1deAKy`Bqcp_iBViwa^f(K{t0D?!V5CHZzL!ufR3! zyz?2YNBfCc<;3OqzTnrq{)>k(%&BnGYt+-axf3=(G}sl{lLQQd(H2-Q%@ZLau4>nu zNMW7d^VsREfMH!M$9$HYlEBM>|6kD35+1uI%UqIEo2^622DgP@O$tLHx$d*980Rch ze9j2`VDBw4m!f8}?pnyop;R#sbL;w(!;6n5Q?|ipbaVSgEArB?h2ZQ}bVO~HGhQ=o6v9P|u z4KR14ets86#>W%0L2u|GAFv`=<-QLkl{NUmeWNO1Vw-$QfZ}r)Hs?S_0^171zHVVB>-%pE z07BOgiY;zQt~Kpeg>xNLwD5d%byVna<{5cccreqy9i7=oUEYXECZ!VLI^CN@X*@eG zU?NWI*A_8U$?YU!z6ZQcoerhjMX#**W=jaACCetS+A0|TLm+B$cQw6#d+cxf&3K`i z&;|;4sZvB}Z)+zA)inhQsBVnI#q}>R5-8vgEvg!Ji!S;QKh1bCMttvf>C%l!Yw(LZP72CP}!49FYc2K|Kv0%Sd(w*U$W5ZnyN z8{h{0g$BP5|3+rAM~!0w2)qQtiHJcD&$F7&*Ws<|G9b8d%A9w%?95_vvKr+J)dzRT z7}Dgl#lO}{Xei>jJAKVPK7g8_Z;E9f2&>0R>{6hPo?`&kqf!UMp}tJ)Wsq+ISEiLc z7wO~hJp|Wc#X+~)`n?40XtTbraBHqbm7O6V;i}>0UJV#W;2C%VvTX#0btuAYjR6kK zV(WyW@T$+>F)0eIA#}TV0@9hAJJUyyy&M9IU|`_8J@ED)2L9y07q1&UNkZha0OUV- zzD8CJ_LtymJoE9Y+goAv*mFh$G!(CRd$NaiJ?a@9zGQOd|U9!Q9j1Hs(lb?99V8jsaHPjFUYU2Vou z5{B+uG9q~#=4~+u)zU8ZH5&c03;JsLZ`OT_OK~VtnV*H%Og}fPQLGtIKz<&l7hNw zXd}6GH50ZJcJ$7*KqSJ+o=(V*_Xs82+|+zDk=Tdh5m^n@F2~G0VK#2!Pg{B!-)gN& zw6%KZzQ%6kJxHm(P0kSI51z_n58^m{ogDeO4T6{-y(@0Q;GhiJ+aP^ E*P|>Ivj6}9 diff --git a/signatures/cagebreak.sig b/signatures/cagebreak.sig index c71037ff63b412c8e4ee197d5ed9267706168b0c..d729d108fda99f3c4a6433ce5ae228ab14dbf810 100644 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%S()fdC2#5J?I6 zOsG4!XMW!h0Eh!1R%k=hodX8nwACP9sFdtasp)hWtSn%_UH1!yDPCD!X4Y8UDKIVE zO)nk@R>7}qq(Zv6isAH)uV$hx9h5EgW5)k0pHgaa?dreFtjJ}VC2HAS-!2_VVT~S7 z{6U*9Cu|k%{*PikV04S2?Ev8Oci;@xz!x?3$)2s|Xnqk7b7QnkI#t zwVyvLx{CzDTgBJ=F-iyjBYM!{JQ7H>j-8}ugRvkD*P1CwehD6+%k@xn6=fU1iJcOP z&OPIBV2HPFk|h;oGCr3gcKN#{4kx=nwsf`+AGhtUxUKN!MgI{OMcn4rLlI(M1Sj@; z7)v089Y#=;RHKo#K7OLOaju2N%v`I5un~nncJ&)3Xj1aOM_>hO2=NC4mNQ|iPqwc_ zDhgzB^dL%&*>I#sE6mXceGoq4mDE?q?b)-QO|O%%;f{s|N_YXrue;sbY!zvg1b7RQ zTmJ>+R^LUI)KuX?eP6-c2T6~+4?iE{P_Xfq1rYPs=$%Cn$f6IjlvLn&z+Bfk%Ii{h zkG#@S4^bmNRX?m9@a>;|?+(*As=n+zcd%;jIbNcCB9o6ldd(5EnY|x{j51y6R4jC$ E=0t7`+5i9m literal 566 zcmV-60?GY}0y6{v0SEvc79j*$>l!Yw(LZP72CP}!49FYc2K|Kv0%Sd(w*U$W5ZnyN z8{h{0g|O`p|93+h`>T39v=djZ0&wOd*$K{aopV$L6nt}hx`hB&5Pf-?SaHqLIQKWAKFY)eQIZhM_TsTyth9BBvr?NCuIW4avXTAIt@Y<2T&n7p3kNrY! zqSc2?p^pZ(*T>#NcFb>weL^n7E3W>$GC?NFrG23dM+(TyWnpJ0Gx3H;|>bN zb4u`nR4`|f>GZAb=#_=PzeB?U&iWE&nPq(yXa9ud%8?4xOz%Omilkz`{YlRd^H~E3 zx98;1k+8JlLoJbo6%@FZ`jLoSn_zx{I`)X*_k9X&K-^K)Hd7Cd7R^550PG4Oeg4-m<1JL!W$2>2kLobN-?OLq z|LzkmP}4FyS|(AAzV-Ft1r%Nw+tRy1fEVK9fRa<;&NO>1m_X=8F<`g0s%*;X%p-IT zK#Fz}rdXasS2uaDJFVCNrH64xK49yEpCUp8p|%F? E)OoZP+yDRo From d946b62a4c41ba7b513c1eb56af8684ec6cc16cb Mon Sep 17 00:00:00 2001 From: project-repo Date: Wed, 31 May 2023 21:38:43 +0200 Subject: [PATCH 3/8] Release 2.2.0 - Add custom events - Fix Issue 62 (#46 Github) - Fix Issue 63 (environment variables test) - Fix Issue 64 (pointer focus bug) --- Bugs.md | 36 ++++++++++++++++++ Changelog.md | 7 ++++ Hashes.md | 20 ++++++++++ README.md | 2 +- ipc_server.c | 4 -- keybinding.c | 15 ++++++++ keybinding.h | 1 + man/cagebreak-config.5.md | 10 ++++- man/cagebreak-socket.7.md | 13 ++++++- man/cagebreak.1.md | 2 +- meson.build | 8 ++-- parse.c | 9 +++++ release-non-auto-checks/Bugs.md | 4 +- release-non-auto-checks/FAQ.md | 4 +- release-non-auto-checks/SECURITY.md | 4 +- release-non-auto-checks/WLR_XDG_VERSION | 4 +- release-non-auto-checks/changelog-major-minor | 4 +- release-non-auto-checks/internal-wiki | 4 +- release-non-auto-checks/release-note | 4 +- .../reproducibility-checked | 4 +- .../security-to-man-page-info-transfer | 4 +- seat.c | 1 + signatures/2.1.2-cagebreak-config.5.sig | Bin 0 -> 566 bytes signatures/2.1.2-cagebreak-socket.7.sig | Bin 0 -> 566 bytes signatures/2.1.2-cagebreak.1.sig | Bin 0 -> 566 bytes signatures/2.1.2-cagebreak.sig | Bin 0 -> 566 bytes signatures/cagebreak-config.5.sig | Bin 566 -> 566 bytes signatures/cagebreak-socket.7.sig | Bin 566 -> 566 bytes signatures/cagebreak.1.sig | Bin 566 -> 566 bytes signatures/cagebreak.sig | Bin 566 -> 566 bytes test/environment-variables | 2 +- workspace.c | 3 ++ 32 files changed, 138 insertions(+), 31 deletions(-) create mode 100644 signatures/2.1.2-cagebreak-config.5.sig create mode 100644 signatures/2.1.2-cagebreak-socket.7.sig create mode 100644 signatures/2.1.2-cagebreak.1.sig create mode 100644 signatures/2.1.2-cagebreak.sig diff --git a/Bugs.md b/Bugs.md index 4075383..4536616 100644 --- a/Bugs.md +++ b/Bugs.md @@ -1187,3 +1187,39 @@ being copied to the `status` element of the resultant structure. The script introduced with 2.1.1 `scripts/install-development-environment` had some missing dependencies. This has been resolved and tested with bare arch containers. + +## Issue 62 + + * github issue number: #46 + * Fixed: 2.2.0 + +When the readable flag of the IPC socket was set with 0 readable bytes +available, cagebreak entered an infinite loop which caused high CPU +usage before the first event was sent over the IPC socket. + +## Issue 63 + + * github issue number: N/A + * Fixed: 2.2.0 + +A file path in the environment-variables unit test was wrongly set, +causing this test to fail. + +## Issue 64 + + * github issue number: N/A + * Fixed: 2.2.0 + +Cagebreak did not update the pointer focus when focussing the +background. This means that the first pointer event after focussing the +background was sent to the previously focussed window. + +Steps to reproduce: + + * Open an application and hover the mouse over a clickable area. + * Switch to an empty desktop using a keybinding without moving the + mouse. + * Click the mouse without moving it. + * Observe that the element in the previously focussed window was + clicked. + diff --git a/Changelog.md b/Changelog.md index c33e179..b9f7461 100644 --- a/Changelog.md +++ b/Changelog.md @@ -119,3 +119,10 @@ Changelog: * Add miniscule test suite * Adjust Cagebreak to wlroots 0.16.2 * New GPG Keys + +## Release 2.2.0 + + * Add custom events + * Fix Issue 62 (#46 Github) + * Fix Issue 63 (environment variables test) + * Fix Issue 64 (pointer focus bug) diff --git a/Hashes.md b/Hashes.md index a6ceae1..22a179e 100644 --- a/Hashes.md +++ b/Hashes.md @@ -1,5 +1,25 @@ # Hashes +2.2.0 cagebreak + + * sha 256: 67660297290a18b7822a818d1d43343e4e6f4dc27427ed9099ff803f218aa9b4 + * sha 512: 9837e3901b2b10453db2663f5a3da6ec2393610c82984cbabe1c64a6d575e32b492cd3326a6fbb91faa912d14c58dfd1160168280b66417ce7f7f2306c5a501c + +2.2.0 cagebreak.1 + + * sha 256: 79caf055cb1c75f3751863718728cca5ea6231891d21b4364c877d5e4888e727 + * sha 512: 843e15e51f01ed25d0630eee8b6e12ebcc68934da49d6fb66e86f6a46d512145d9be22081b0c2b5f0356c2d0e15b9f13170f7ba1d34d5fba69c7e05a069db337 + +2.2.0 cagebreak-config.5 + + * sha 256: 7047333f5600d3b05caf04caf9910da1468efe49c1418ca3fcdc6163bade9e89 + * sha 512: 35203d3959594fe5130a561c440bf85a978384bc874fcce773bb02fa5c637ccc375f1b0ce1ad05603266dcdefed2570815363bc2c8ef81df7ff7be865de2cac5 + +2.2.0 cagebreak-socket.7 + + * sha 256: bf9bd35a17ab78cb93f0f5209daef27908bf02d0e31ae627ae05fabab162c984 + * sha 512: 023fb99c3a2c47543ae2870f19e8fd6fd8069834dc4fbeee93e890333b4ac24b4613d0e8dfd2bdffb2d5dc7f907868410b0c61f2e1346c76498955e15d0f3b89 + 2.1.2 cagebreak * sha 256: 7d07864a837ee577a52b2727bfbfe8834fe599712144f0685f458d508717e451 diff --git a/README.md b/README.md index 004239a..8f09d4f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Cagebreak: A Wayland Tiling Compositor -[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.1.2)](https://repology.org/project/cagebreak/versions) +[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.2.0)](https://repology.org/project/cagebreak/versions) ## Quick Introduction diff --git a/ipc_server.c b/ipc_server.c index ced183a..05614b3 100644 --- a/ipc_server.c +++ b/ipc_server.c @@ -127,10 +127,6 @@ ipc_client_handle_writable(int client_fd, uint32_t mask, void *data) { return 0; } - if(client->write_buffer_len <= 0) { - return 0; - } - if(fcntl(client->fd, F_GETFD) == -1) { return 0; } diff --git a/keybinding.c b/keybinding.c index 44ccffb..eaf2ae7 100644 --- a/keybinding.c +++ b/keybinding.c @@ -96,6 +96,12 @@ keybinding_free(struct keybinding *keybinding, bool recursive) { if(keybinding->data.c != NULL) { free(keybinding->data.c); } + break; + case KEYBINDING_SEND_CUSTOM_EVENT: + if(keybinding->data.c != NULL) { + free(keybinding->data.c); + } + break; default: break; } @@ -1245,6 +1251,12 @@ keybinding_display_message(struct cg_server *server, char *msg) { message_printf(server->curr_output, "%s", msg); } +void +keybinding_send_custom_event(struct cg_server *server, char *msg) { + ipc_send_event(server, + "{\"event_name\":\"custom_event\",\"message\":\"%s\"}", msg); +} + void keybinding_move_view_to_cycle_output(struct cg_server *server, bool reverse) { if(wl_list_length(&server->outputs) <= 1) { @@ -1706,6 +1718,9 @@ run_action(enum keybinding_action action, struct cg_server *server, case KEYBINDING_DISPLAY_MESSAGE: keybinding_display_message(server, data.c); break; + case KEYBINDING_SEND_CUSTOM_EVENT: + keybinding_send_custom_event(server, data.c); + break; case KEYBINDING_RESIZE_TILE_HORIZONTAL: resize_tile(server, data.i, 0); break; diff --git a/keybinding.h b/keybinding.h index 6d6cf87..a5958f0 100644 --- a/keybinding.h +++ b/keybinding.h @@ -63,6 +63,7 @@ struct cg_server; KEYBINDING(KEYBINDING_SHOW_TIME, time) \ KEYBINDING(KEYBINDING_SHOW_INFO, show_info) \ KEYBINDING(KEYBINDING_DISPLAY_MESSAGE, message) \ + KEYBINDING(KEYBINDING_SEND_CUSTOM_EVENT, custom_event) \ KEYBINDING(KEYBINDING_CURSOR, cursor) \ \ KEYBINDING(KEYBINDING_SWAP_LEFT, exchangeleft) \ diff --git a/man/cagebreak-config.5.md b/man/cagebreak-config.5.md index b9632dd..5bf01c3 100644 --- a/man/cagebreak-config.5.md +++ b/man/cagebreak-config.5.md @@ -1,4 +1,4 @@ -cagebreak-config(5) "Version 2.1.2" "Cagebreak Manual" +cagebreak-config(5) "Version 2.2.0" "Cagebreak Manual" # NAME @@ -81,9 +81,17 @@ configure_message display_time 4 *cursor [enable|disable]* Enable or disable cursor + This simply hides the cursor. Pointing and clicking is still possible. +*custom_event * + Send a custom event to the IPC socket + + This sends an event of type "custom_event" to all programs + listening to the IPC socket along with the string . + See *cagebreak-socket(7)* for more details. + *definekey * Bind to execute if pressed in - *definekey* is a more general version of *bind*. diff --git a/man/cagebreak-socket.7.md b/man/cagebreak-socket.7.md index 4c1a31a..2a5b623 100644 --- a/man/cagebreak-socket.7.md +++ b/man/cagebreak-socket.7.md @@ -1,4 +1,4 @@ -cagebreak-socket(7) "Version 2.1.2" "Cagebreak Manual" +cagebreak-socket(7) "Version 2.2.0" "Cagebreak Manual" # NAME @@ -113,6 +113,17 @@ cg-ipc{"event_name":"configure_output","output":"eDP-1","output_id":1} cg-ipc{"event_name":"cursor_switch_tile","old_output":"eDP-1","old_output_id":1,"old_tile":2,"new_output":"eDP-1","new_output_id":1,"new_tile":3} ``` +*custom_event* + - Trigger: Cagebreak receives the *custom_event* command, either in the config file or via the IPC socket (see *cagebreak-config(5)*). + - JSON + - event_name: "custom_event" + - message: The message passed to the *custom_event* command + +``` +custom_event Hello World! +cg-ipc{"event_name":"custom_event","message":"Hello World!"} +``` + *cycle_outputs* - Trigger: *nextscreen* and *prevscreen* commands - JSON diff --git a/man/cagebreak.1.md b/man/cagebreak.1.md index c8fc85e..051c7e9 100644 --- a/man/cagebreak.1.md +++ b/man/cagebreak.1.md @@ -1,4 +1,4 @@ -cagebreak(1) "Version 2.1.2" "Cagebreak Manual" +cagebreak(1) "Version 2.2.0" "Cagebreak Manual" # NAME diff --git a/meson.build b/meson.build index 777c8d3..5d782bb 100644 --- a/meson.build +++ b/meson.build @@ -3,7 +3,7 @@ project( 'cagebreak', 'c', -version : '2.1.2', +version : '2.2.0', license : 'MIT', default_options : ['c_std=c11', 'warning_level=3'] ) @@ -208,7 +208,7 @@ reproducible_build_versions = { 'xkbcommon': '1.5.0', 'fontconfig': '2.14.2', 'libinput': '1.23.0', - 'libevdev': '1.13.0', + 'libevdev': '1.13.1', 'libudev': '253', 'pango': '1.50.14', 'cairo': '1.17.8', @@ -238,7 +238,7 @@ foreach name, dep : cagebreak_dependencies_dict endforeach reproducible_build_compiler = 'gcc' -reproducible_build_compiler_version = '12.2.1' +reproducible_build_compiler_version = '13.1.1' if cc.get_id() != reproducible_build_compiler warning('The compiler "' + cc.get_id() + '" differs from the one used to generate to binary specified in Hashes.md (' + reproducible_build_compiler + ').') @@ -260,7 +260,7 @@ install_data('LICENSE', install_dir : '/usr/share/licenses/' + meson.project_nam if get_option('man-pages') scdoc = find_program('scdoc') - secssinceepoch = 1682363199 + secssinceepoch = 1685543842 shcommand = 'export SOURCE_DATE_EPOCH=' + secssinceepoch.to_string() + ' ; @0@ < @INPUT@'.format(scdoc.path()) sh = find_program('sh') mandir1 = join_paths(get_option('mandir'), 'man1') diff --git a/parse.c b/parse.c index 68767c6..c163b3a 100644 --- a/parse.c +++ b/parse.c @@ -811,6 +811,15 @@ parse_command(struct cg_server *server, struct keybinding *keybinding, return -1; } keybinding->data.c = strdup(saveptr); + } else if(strcmp(action, "custom_event") == 0) { + keybinding->action = KEYBINDING_SEND_CUSTOM_EVENT; + if(saveptr == NULL) { + *errstr = + log_error("Not enough paramaters to \"custom_event\". Expected " + "string to send."); + return -1; + } + keybinding->data.c = strdup(saveptr); } else if(strcmp(action, "time") == 0) { keybinding->action = KEYBINDING_SHOW_TIME; } else if(strcmp(action, "nextscreen") == 0) { diff --git a/release-non-auto-checks/Bugs.md b/release-non-auto-checks/Bugs.md index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/Bugs.md +++ b/release-non-auto-checks/Bugs.md @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/release-non-auto-checks/FAQ.md b/release-non-auto-checks/FAQ.md index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/FAQ.md +++ b/release-non-auto-checks/FAQ.md @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/release-non-auto-checks/SECURITY.md b/release-non-auto-checks/SECURITY.md index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/SECURITY.md +++ b/release-non-auto-checks/SECURITY.md @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/release-non-auto-checks/WLR_XDG_VERSION b/release-non-auto-checks/WLR_XDG_VERSION index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/WLR_XDG_VERSION +++ b/release-non-auto-checks/WLR_XDG_VERSION @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/release-non-auto-checks/changelog-major-minor b/release-non-auto-checks/changelog-major-minor index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/changelog-major-minor +++ b/release-non-auto-checks/changelog-major-minor @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/release-non-auto-checks/internal-wiki b/release-non-auto-checks/internal-wiki index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/internal-wiki +++ b/release-non-auto-checks/internal-wiki @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/release-non-auto-checks/release-note b/release-non-auto-checks/release-note index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/release-note +++ b/release-non-auto-checks/release-note @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/release-non-auto-checks/reproducibility-checked b/release-non-auto-checks/reproducibility-checked index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/reproducibility-checked +++ b/release-non-auto-checks/reproducibility-checked @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/release-non-auto-checks/security-to-man-page-info-transfer b/release-non-auto-checks/security-to-man-page-info-transfer index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/security-to-man-page-info-transfer +++ b/release-non-auto-checks/security-to-man-page-info-transfer @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/seat.c b/seat.c index cd085be..1c88f49 100644 --- a/seat.c +++ b/seat.c @@ -1043,6 +1043,7 @@ seat_set_focus(struct cg_seat *seat, struct cg_view *view) { view_activate(prev_view, false); } wlr_seat_keyboard_clear_focus(wlr_seat); + process_cursor_motion(seat, -1); return; } diff --git a/signatures/2.1.2-cagebreak-config.5.sig b/signatures/2.1.2-cagebreak-config.5.sig new file mode 100644 index 0000000000000000000000000000000000000000..f96713d95f03f5db4cb5d9f359f5a07efe261263 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%S()fdC2#5J?I6 zOsG4!XN%(x{vno|Sj7x0L`Rsk` zzccF>sPdtgaU4+77ayFBN zL^y190up?k#V_WR^AIUpXARKF?>7Pi;N+0Lad*>|^}Rjv`Ht-`WO^?`ltx=!!sIC# z^G!&A7B+INK_M#jzyF%$+1LiW?U!5%MOQc26B8*GTlnd%8Gs-0Cgn}~T}@eGpvtkc z2|6({wHX<0T{+EhR2>^Qu3-&A%G>TykPPs0n75m>G5w!naEvg1&=TW;)NzxOQ)H;- zdyPhRslELoykhP2>JIQlaFf_qf;3A&`kRqsX?xGRY_m;^0Ssze;3I25@-&3jv{%LO zlt`NJBEZ0hE4D+0HmHM!j!XPoad8u>E$czw*o&rfvIjyILMlzJA%PU^WO29|T4_{) Ey-4Q{fB*mh literal 0 HcmV?d00001 diff --git a/signatures/2.1.2-cagebreak-socket.7.sig b/signatures/2.1.2-cagebreak-socket.7.sig new file mode 100644 index 0000000000000000000000000000000000000000..fec631f4783791825b37c8b15a6c4e24cca58d55 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%S()fdC2#5J?I6 zOsG4!XVo?CTq)#T*vDA8Uv0yd-^z|q<4hqC}C^c;56vGqqV62Z0uy0F_8W35NU8g;5AHC59BNy2{Q?7)R%MQUM`Tb zFv4dkl&*4`9`fA59G5+%c*$F><(@z?}Q_4rlof-K!}(ISCRNGVfw7&vuT$iT2Q zVWn@xp0K@o{>#Qo+54}2Gv&Ie*M@P$Fihu;Z>%`5l1R$1bJq$PcKxs!7vH1l$HSYy z25=-=ZZAhjUn)CT;B~FWgS_E>2VF|gB&V2gstyT9sHUEzMrDT}x+H8X_i7%_B&~SG zc$EpgnHN}f*FPwKB3N6xv*{nsJ0o4zyNLx7Q!ncY^a{fXJ@Esa@=vK;a4I z8_RhqV5KRy4RQ$`<*%w7xi{-nI3^0@?6iLUl|JA7`dsicN7B8sb~X01qEI9okTQ%W zOWuS5w!uKv3cn0ID(_u`!SgLEqIz;TBZrJ^#!ZwIg`kVr$r|}OTS~AVgz`8TEF)`r EcpuIZNB{r; literal 0 HcmV?d00001 diff --git a/signatures/2.1.2-cagebreak.1.sig b/signatures/2.1.2-cagebreak.1.sig new file mode 100644 index 0000000000000000000000000000000000000000..78947664f97a829d9260f7b0ca9893af52431597 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%S()fdC2#5J?I6 zOsG4!XH&Qj|3vE2#Y^6LfBEt(FD&bm>Bqcp_iBViwa^f(K{t0D?!V5CHZzL!ufR3! zyz?2YNBfCc<;3OqzTnrq{)>k(%&BnGYt+-axf3=(G}sl{lLQQd(H2-Q%@ZLau4>nu zNMW7d^VsREfMH!M$9$HYlEBM>|6kD35+1uI%UqIEo2^622DgP@O$tLHx$d*980Rch ze9j2`VDBw4m!f8}?pnyop;R#sbL;w(!;6n5Q?|ipbaVSgEArB?h2ZQ}bVO~HGhQ=o6v9P|u z4KR14ets86#>W%0L2u|GAFv`=<-QLkl{NUmeWNO1Vw-$QfZ}r)Hs?S_0^171zHVVB>-%pE z07BOgiY;zQt~Kpeg>xNLwD5d%byVna<{5cccreqy9i7=oUEYXECZ!VLI^CN@X*@eG zU?NWI*A_8U$?YU!z6ZQcoerhjMX#**W=jaACCetS+A0|TLm+B$cQw6#d+cxf&3K`i z&;|;4sZvB}Z)+zA)inhQsBVnI#q}>R5-8vgEvg!Ji!S;QKh1bCMttvf>C%7}qq(Zv6isAH)uV$hx9h5EgW5)k0pHgaa?dreFtjJ}VC2HAS-!2_VVT~S7 z{6U*9Cu|k%{*PikV04S2?Ev8Oci;@xz!x?3$)2s|Xnqk7b7QnkI#t zwVyvLx{CzDTgBJ=F-iyjBYM!{JQ7H>j-8}ugRvkD*P1CwehD6+%k@xn6=fU1iJcOP z&OPIBV2HPFk|h;oGCr3gcKN#{4kx=nwsf`+AGhtUxUKN!MgI{OMcn4rLlI(M1Sj@; z7)v089Y#=;RHKo#K7OLOaju2N%v`I5un~nncJ&)3Xj1aOM_>hO2=NC4mNQ|iPqwc_ zDhgzB^dL%&*>I#sE6mXceGoq4mDE?q?b)-QO|O%%;f{s|N_YXrue;sbY!zvg1b7RQ zTmJ>+R^LUI)KuX?eP6-c2T6~+4?iE{P_Xfq1rYPs=$%Cn$f6IjlvLn&z+Bfk%Ii{h zkG#@S4^bmNRX?m9@a>;|?+(*As=n+zcd%;jIbNcCB9o6ldd(5EnY|x{j51y6R4jC$ E=0t7`+5i9m literal 0 HcmV?d00001 diff --git a/signatures/cagebreak-config.5.sig b/signatures/cagebreak-config.5.sig index f96713d95f03f5db4cb5d9f359f5a07efe261263..93f0f2b137cbd2db36c5d259df125d1ee4ce8865 100644 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*$>l!Yw(LZP72CP}!49FYc2K|Kv0%UifGXM$+5ZnyN z8{h{0g~AyR{0M+4*SYs%?X2XCrbAjt<-qtD?iV1Kfw1}o5o(7}#ldmfXe|Q8u&pUN z;1>pRlFj8Yk_EMN3sjM`D$qY&(#JfS9zLYZNbPtg%jnDr$o}gi@iba?1UHY}Mvbi1 zY9~$Wa>QV~IgblyBuBchM6UxhNgIv%DVT&=qZ^p~DV~Wi?>rtHa?L4$PVeu zGeNLKy3kI`Wv=$u2w3jk$&-FPJ#x@mun^;W7L^uSxh!a5(3e~VHC6$%s955WSf%ey zVJ1}ug<~oZrp6HAXfm;N3AsYJ?m@BDo@=%8QR+AOA?QH!C)ZXp`c~y6i;==GCtbI- z3|Gr%%}QK9NnWy*9SgR%nb#}vVx3(WB=f?S{LAIZL-CpIcyU|IhZLhP4~qRJuy0L`Rsk` zzccF>sPdtgaU4+77ayFBN zL^y190up?k#V_WR^AIUpXARKF?>7Pi;N+0Lad*>|^}Rjv`Ht-`WO^?`ltx=!!sIC# z^G!&A7B+INK_M#jzyF%$+1LiW?U!5%MOQc26B8*GTlnd%8Gs-0Cgn}~T}@eGpvtkc z2|6({wHX<0T{+EhR2>^Qu3-&A%G>TykPPs0n75m>G5w!naEvg1&=TW;)NzxOQ)H;- zdyPhRslELoykhP2>JIQlaFf_qf;3A&`kRqsX?xGRY_m;^0Ssze;3I25@-&3jv{%LO zlt`NJBEZ0hE4D+0HmHM!j!XPoad8u>E$czw*o&rfvIjyILMlzJA%PU^WO29|T4_{) Ey-4Q{fB*mh diff --git a/signatures/cagebreak-socket.7.sig b/signatures/cagebreak-socket.7.sig index fec631f4783791825b37c8b15a6c4e24cca58d55..6797b53851edea4d660a160ac39ba424933ae7f8 100644 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*$>l!Yw(LZP72CP}!49FYc2K|Kv0%UifGXM$+5ZnyN z8{h{0g+Zea{x)wi3b^5yc8v34hV_xo2U4*B64J?O@^ujB@SfR)`9N$WWv_9+w&by=n`Z10L;^t8vHM+X(iItm0}>qK*Og% zlbE9RmmRv)50SHwjoB*V&Y)0du^L~sExk1)VX05X@pZLLRhRCrMuitA;|@uH6tbyu z0=v$LZLZ9k2E-e@bVigM&&0h*d~LsyPGJljz#woGKwPs^_9n3kxi~cKRR{Gv!(o0fj$|i))kL)H%&VAlFOoJ_n{IAezk-IbJq?vjWj&)>SmAinpS^tE|?i1)xVIgfBKXjMFF2D_TDUUu?LI15@* E$Vc%83jhEB literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%S()fdC2#5J?I6 zOsG4!XVo?CTq)#T*vDA8Uv0yd-^z|q<4hqC}C^c;56vGqqV62Z0uy0F_8W35NU8g;5AHC59BNy2{Q?7)R%MQUM`Tb zFv4dkl&*4`9`fA59G5+%c*$F><(@z?}Q_4rlof-K!}(ISCRNGVfw7&vuT$iT2Q zVWn@xp0K@o{>#Qo+54}2Gv&Ie*M@P$Fihu;Z>%`5l1R$1bJq$PcKxs!7vH1l$HSYy z25=-=ZZAhjUn)CT;B~FWgS_E>2VF|gB&V2gstyT9sHUEzMrDT}x+H8X_i7%_B&~SG zc$EpgnHN}f*FPwKB3N6xv*{nsJ0o4zyNLx7Q!ncY^a{fXJ@Esa@=vK;a4I z8_RhqV5KRy4RQ$`<*%w7xi{-nI3^0@?6iLUl|JA7`dsicN7B8sb~X01qEI9okTQ%W zOWuS5w!uKv3cn0ID(_u`!SgLEqIz;TBZrJ^#!ZwIg`kVr$r|}OTS~AVgz`8TEF)`r EcpuIZNB{r; diff --git a/signatures/cagebreak.1.sig b/signatures/cagebreak.1.sig index 78947664f97a829d9260f7b0ca9893af52431597..feaa1b95be49162eb7671ea4979cc74164621b87 100644 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*$>l!Yw(LZP72CP}!49FYc2K|Kv0%UifGXM$+5ZnyN z8{h{0g}5gV|69{W6PqAyw{Ts${y}qxJn)v={wL^78q%**t^CNm5hKTaLL2ebp1?Be zkWZ>8?_`%dlJjtyvpdy{MP+oJgoMW$e{<&RqZqkNm=BXRw~jTr%#NL5m_uGm>kNFJ z)l5^#*!?1Q5vr;y%`xY~?{ejc71P)pbxfk(VkmMD%9Re~ZcJU{#LHAHZh1BH^ zSO@%TjHI%I6R%A|ynv^{bvVMwGaZY0+#ie^ctHCt#D0h4 z7unn1{xs;A%Hw-(fPoMkqcZ{y-Z|0Xsoy_d(;c~llUeY$1TKvAt;KETzE{NpmjL{> zESmaV>v#%hm!v~>#$$$_<9w`N0~L8sMo8)B&ha%tax<1~C~ouWaCq(yO#f{w7dd8x zz>0kc_o>Dz6v@L_#`OvdtezWObX?4H@cVhTWjQFG-_C5oY{$xWo8aAM80_<#;%{EW zW~ZB{sF?|bl}B0>Y2zH?WhD9tl?0o>I98#@HW|7Ppp~y!!+aZX$a|<%YK;pC{w9PY zyuC-~$>b8uOTPHsFAZUlT&O-1Bg-GsLif~x?~;VRj2@^}mSkCbMINUG7yi)2>FrF#}5yVG_VejcR@jO&U!ZL(}}!2c(Npv`1M`>dX~zf&PEw?{SXalnF+ E@3eXtpa1{> literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%S()fdC2#5J?I6 zOsG4!XH&Qj|3vE2#Y^6LfBEt(FD&bm>Bqcp_iBViwa^f(K{t0D?!V5CHZzL!ufR3! zyz?2YNBfCc<;3OqzTnrq{)>k(%&BnGYt+-axf3=(G}sl{lLQQd(H2-Q%@ZLau4>nu zNMW7d^VsREfMH!M$9$HYlEBM>|6kD35+1uI%UqIEo2^622DgP@O$tLHx$d*980Rch ze9j2`VDBw4m!f8}?pnyop;R#sbL;w(!;6n5Q?|ipbaVSgEArB?h2ZQ}bVO~HGhQ=o6v9P|u z4KR14ets86#>W%0L2u|GAFv`=<-QLkl{NUmeWNO1Vw-$QfZ}r)Hs?S_0^171zHVVB>-%pE z07BOgiY;zQt~Kpeg>xNLwD5d%byVna<{5cccreqy9i7=oUEYXECZ!VLI^CN@X*@eG zU?NWI*A_8U$?YU!z6ZQcoerhjMX#**W=jaACCetS+A0|TLm+B$cQw6#d+cxf&3K`i z&;|;4sZvB}Z)+zA)inhQsBVnI#q}>R5-8vgEvg!Ji!S;QKh1bCMttvf>C%l!Yw(LZP72CP}!49FYc2K|Kv0%UifGXM$+5ZnyN z8{h{0g*FTj0GBbR7ZKk&(;f$PRCOUZZ@;#u6kAhcBUSR2ZB!sriHqbS+drH+u~XCG z4se3GCD*Z8ZTu7~CR8y!*IeDPu<<@prQ|n}B<_w&YS!4ThnuQRF&Ufh_cmG;NyR=i z{5QwTudvO%g2aFbkA=0!DK|!+y9sM9(NREFLx)oIq0;)8 z`W>Yd{B?Qh>W>xpC}E(Mwv3k;lh;^M6YQXE4xZyCT9Ww`*V`x@T5Nwq#sFHQi%wZP zRY)V@aBW_asf3+O=qBvg0T5+p;G}fAYG5DFP-u!(dP5MMR0ZIKlZ2ZGTXb0W{U+TL zyZCUZ0vJE>M#Q6M-s9gx5m|~|CeedcgrJjL;9&09*Ll(?^sYqCLReE5(i~(FB%`#n zj}|@giK5}liydM0)ToXV5q#9e)LTdx0&kBhZ4UK>3T4^CU-229wv!r69t2aEERijS E8Y$-!@&Et; literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%S()fdC2#5J?I6 zOsG4!XMW!h0Eh!1R%k=hodX8nwACP9sFdtasp)hWtSn%_UH1!yDPCD!X4Y8UDKIVE zO)nk@R>7}qq(Zv6isAH)uV$hx9h5EgW5)k0pHgaa?dreFtjJ}VC2HAS-!2_VVT~S7 z{6U*9Cu|k%{*PikV04S2?Ev8Oci;@xz!x?3$)2s|Xnqk7b7QnkI#t zwVyvLx{CzDTgBJ=F-iyjBYM!{JQ7H>j-8}ugRvkD*P1CwehD6+%k@xn6=fU1iJcOP z&OPIBV2HPFk|h;oGCr3gcKN#{4kx=nwsf`+AGhtUxUKN!MgI{OMcn4rLlI(M1Sj@; z7)v089Y#=;RHKo#K7OLOaju2N%v`I5un~nncJ&)3Xj1aOM_>hO2=NC4mNQ|iPqwc_ zDhgzB^dL%&*>I#sE6mXceGoq4mDE?q?b)-QO|O%%;f{s|N_YXrue;sbY!zvg1b7RQ zTmJ>+R^LUI)KuX?eP6-c2T6~+4?iE{P_Xfq1rYPs=$%Cn$f6IjlvLn&z+Bfk%Ii{h zkG#@S4^bmNRX?m9@a>;|?+(*As=n+zcd%;jIbNcCB9o6ldd(5EnY|x{j51y6R4jC$ E=0t7`+5i9m diff --git a/test/environment-variables b/test/environment-variables index f1c9fac..a3753b5 100644 --- a/test/environment-variables +++ b/test/environment-variables @@ -22,7 +22,7 @@ cp "${MESONCURRENTCONFIGDIR}/test/testing-configurations/config" "${testdir}/env sed -i "s|CONFIGPATH|$testdir\/envvars\/socket|g" "${testdir}/envvars/config" (WLR_BACKENDS=headless ./cagebreak -e -c "${testdir}/envvars/config") sync -[[ ! $(cat "${testdir}/socket") = "${oldsocket}" ]] || RESULT=1 +[[ $(cat "${testdir}/envvars/socket") != "${oldsocket}" ]] || RESULT=1 # XDG_CONFIG_HOME cp "${MESONCURRENTCONFIGDIR}/test/testing-configurations/env-var-config" "${testdir}/cagebreak/config" diff --git a/workspace.c b/workspace.c index 3f84c6f..1dff244 100644 --- a/workspace.c +++ b/workspace.c @@ -107,6 +107,9 @@ workspace_free_tiles(struct cg_workspace *workspace) { workspace->focused_tile) { workspace->output->server->seat->cursor_tile = NULL; } + if(workspace->focused_tile == workspace->server->seat->cursor_tile) { + workspace->server->seat->cursor_tile = NULL; + } struct cg_tile *next = workspace->focused_tile->next; free(workspace->focused_tile); workspace->focused_tile = next; From 61e7f8aeffa5eb8695788453a94619476bee0b64 Mon Sep 17 00:00:00 2001 From: project-repo Date: Mon, 21 Aug 2023 09:33:36 +0200 Subject: [PATCH 4/8] Release 2.2.1 * Fix Issue 65 (fix calibration matrix) * Thanks to Oliver Friedmann for providing a PR * Fix minor inelegance in README * Adjust dependency versions --- Bugs.md | 12 +++++++++++ Hashes.md | 20 ++++++++++++++++++ README.md | 8 ++++--- input_manager.c | 5 +++++ man/cagebreak-config.5.md | 2 +- man/cagebreak-socket.7.md | 2 +- man/cagebreak.1.md | 2 +- meson.build | 8 +++---- release-non-auto-checks/Bugs.md | 4 ++-- release-non-auto-checks/FAQ.md | 4 ++-- release-non-auto-checks/SECURITY.md | 4 ++-- release-non-auto-checks/WLR_XDG_VERSION | 4 ++-- .../acknowledge-contributors | 2 ++ release-non-auto-checks/changelog-major-minor | 4 ++-- release-non-auto-checks/internal-wiki | 4 ++-- release-non-auto-checks/release-note | 4 ++-- .../reproducibility-checked | 4 ++-- .../security-to-man-page-info-transfer | 4 ++-- signatures/2.1.2-cagebreak-config.5.sig | Bin 566 -> 566 bytes signatures/2.1.2-cagebreak-socket.7.sig | Bin 566 -> 566 bytes signatures/2.1.2-cagebreak.1.sig | Bin 566 -> 566 bytes signatures/2.1.2-cagebreak.sig | Bin 566 -> 566 bytes signatures/cagebreak-config.5.sig | Bin 566 -> 566 bytes signatures/cagebreak-socket.7.sig | Bin 566 -> 566 bytes signatures/cagebreak.1.sig | Bin 566 -> 566 bytes signatures/cagebreak.sig | Bin 566 -> 566 bytes 26 files changed, 69 insertions(+), 28 deletions(-) create mode 100644 release-non-auto-checks/acknowledge-contributors diff --git a/Bugs.md b/Bugs.md index 4536616..ee38c63 100644 --- a/Bugs.md +++ b/Bugs.md @@ -1223,3 +1223,15 @@ Steps to reproduce: * Observe that the element in the previously focussed window was clicked. +## Issue 65 + + * github issue number: N/A + * Fixed: 2.2.1 + +Up until cagebreak 2.2.0, the configuration for the calibration matrix of +a libinput device was not propagated correctly when internally copying +the configuration. This meant that effectively, the calibration matrix +configuration was a NoOp. Starting with version 2.2.1, the calibration +matrix can be set as documented. + +Thanks to Oliver Friedmann for providing a pull request. diff --git a/Hashes.md b/Hashes.md index 22a179e..240925f 100644 --- a/Hashes.md +++ b/Hashes.md @@ -1,5 +1,25 @@ # Hashes +2.2.1 cagebreak + + * sha 256: 96469a78eeaddf9476c82e0ab8a0e35a95b3119bf83633a54feb8f3f5780df2f + * sha 512: 41135e9d81c79519a1db4955c742f50a375c4e4db80b51a02d618eb1520452c059a3df48013d11f17410a590ac43634da606daf6e95d0987af19284964bbcb5e + +2.2.1 cagebreak.1 + + * sha 256: 458259b066def0571b7604f4a87105f0ce608106abd7946e4697aa5ec5028ccf + * sha 512: aeed13e27e78ea8b30ee21f6ef41725f2808f484f0a3e6125cf70c601705954eb4a4a67ba9d6898ff994a79c20a0213557332d7f06a42098084aff3fe47ca21a + +2.2.1 cagebreak-config.5 + + * sha 256: 4ec5a18fae8d1170ff9d67126133a12ca7b1f7adae318d77f6fca8092c138761 + * sha 512: 9b35fde46191979dee5839873eaab4a673256f75dce533df141f43f7d8282381e1e3820d1cf97403c50846b1f4ddf1924271e961d519029ed58e76e31aef4c04 + +2.2.1 cagebreak-socket.7 + + * sha 256: 51911ee02637261e46164d861c4327ec338904221795a03895684582c361ef81 + * sha 512: db848faefbf5f1eff6d4f0ad1fc4e2169beb7fd0ada620b39fe64a319376e4c7e672c48a3e446943af40d23055467b001b8e1c38b4b72648258b6f7b14c1034d + 2.2.0 cagebreak * sha 256: 67660297290a18b7822a818d1d43343e4e6f4dc27427ed9099ff803f218aa9b4 diff --git a/README.md b/README.md index 8f09d4f..1781cc3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Cagebreak: A Wayland Tiling Compositor -[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.2.0)](https://repology.org/project/cagebreak/versions) +[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.2.1)](https://repology.org/project/cagebreak/versions) ## Quick Introduction @@ -582,8 +582,8 @@ 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. +We now have a mail address and its key is signed by signing keys. See [SECURITY.md](SECURITY.md) +for details. The full public keys can be found in `keys/` along with any revocation certificates. @@ -747,6 +747,8 @@ see [SECURITY.md](SECURITY.md). * Oliver Friedmann * [Add output scaling](https://github.com/project-repo/cagebreak/pull/34), released in 2.0.0 with slight modifications + * [Fix: calibration matrix](https://github.com/project-repo/cagebreak/pull/49), + released in 2.2.1 with slight modifications * Tom Greig * Fix bug in merge_output_configs in 2.1.2 diff --git a/input_manager.c b/input_manager.c index cfde2c9..fcdd684 100644 --- a/input_manager.c +++ b/input_manager.c @@ -229,6 +229,11 @@ input_manager_merge_input_configs(struct cg_input_config *cfg1, } else { out_cfg->repeat_rate = cfg1->repeat_rate; } + if(cfg1->calibration_matrix.configured == false) { + out_cfg->calibration_matrix = cfg2->calibration_matrix; + } else { + out_cfg->calibration_matrix = cfg1->calibration_matrix; + } return out_cfg; } diff --git a/man/cagebreak-config.5.md b/man/cagebreak-config.5.md index 5bf01c3..f894d04 100644 --- a/man/cagebreak-config.5.md +++ b/man/cagebreak-config.5.md @@ -1,4 +1,4 @@ -cagebreak-config(5) "Version 2.2.0" "Cagebreak Manual" +cagebreak-config(5) "Version 2.2.1" "Cagebreak Manual" # NAME diff --git a/man/cagebreak-socket.7.md b/man/cagebreak-socket.7.md index 2a5b623..210a4f9 100644 --- a/man/cagebreak-socket.7.md +++ b/man/cagebreak-socket.7.md @@ -1,4 +1,4 @@ -cagebreak-socket(7) "Version 2.2.0" "Cagebreak Manual" +cagebreak-socket(7) "Version 2.2.1" "Cagebreak Manual" # NAME diff --git a/man/cagebreak.1.md b/man/cagebreak.1.md index 051c7e9..d99a87a 100644 --- a/man/cagebreak.1.md +++ b/man/cagebreak.1.md @@ -1,4 +1,4 @@ -cagebreak(1) "Version 2.2.0" "Cagebreak Manual" +cagebreak(1) "Version 2.2.1" "Cagebreak Manual" # NAME diff --git a/meson.build b/meson.build index 5d782bb..fb83017 100644 --- a/meson.build +++ b/meson.build @@ -3,7 +3,7 @@ project( 'cagebreak', 'c', -version : '2.2.0', +version : '2.2.1', license : 'MIT', default_options : ['c_std=c11', 'warning_level=3'] ) @@ -209,7 +209,7 @@ reproducible_build_versions = { 'fontconfig': '2.14.2', 'libinput': '1.23.0', 'libevdev': '1.13.1', - 'libudev': '253', + 'libudev': '254', 'pango': '1.50.14', 'cairo': '1.17.8', 'pangocairo': '1.50.14', @@ -238,7 +238,7 @@ foreach name, dep : cagebreak_dependencies_dict endforeach reproducible_build_compiler = 'gcc' -reproducible_build_compiler_version = '13.1.1' +reproducible_build_compiler_version = '13.2.1' if cc.get_id() != reproducible_build_compiler warning('The compiler "' + cc.get_id() + '" differs from the one used to generate to binary specified in Hashes.md (' + reproducible_build_compiler + ').') @@ -260,7 +260,7 @@ install_data('LICENSE', install_dir : '/usr/share/licenses/' + meson.project_nam if get_option('man-pages') scdoc = find_program('scdoc') - secssinceepoch = 1685543842 + secssinceepoch = 1692353837 shcommand = 'export SOURCE_DATE_EPOCH=' + secssinceepoch.to_string() + ' ; @0@ < @INPUT@'.format(scdoc.path()) sh = find_program('sh') mandir1 = join_paths(get_option('mandir'), 'man1') diff --git a/release-non-auto-checks/Bugs.md b/release-non-auto-checks/Bugs.md index 85c0622..d340262 100644 --- a/release-non-auto-checks/Bugs.md +++ b/release-non-auto-checks/Bugs.md @@ -1,2 +1,2 @@ -2.2.0 -2023-05-31 +2.2.1 +2023-08-21 diff --git a/release-non-auto-checks/FAQ.md b/release-non-auto-checks/FAQ.md index 85c0622..d340262 100644 --- a/release-non-auto-checks/FAQ.md +++ b/release-non-auto-checks/FAQ.md @@ -1,2 +1,2 @@ -2.2.0 -2023-05-31 +2.2.1 +2023-08-21 diff --git a/release-non-auto-checks/SECURITY.md b/release-non-auto-checks/SECURITY.md index 85c0622..d340262 100644 --- a/release-non-auto-checks/SECURITY.md +++ b/release-non-auto-checks/SECURITY.md @@ -1,2 +1,2 @@ -2.2.0 -2023-05-31 +2.2.1 +2023-08-21 diff --git a/release-non-auto-checks/WLR_XDG_VERSION b/release-non-auto-checks/WLR_XDG_VERSION index 85c0622..d340262 100644 --- a/release-non-auto-checks/WLR_XDG_VERSION +++ b/release-non-auto-checks/WLR_XDG_VERSION @@ -1,2 +1,2 @@ -2.2.0 -2023-05-31 +2.2.1 +2023-08-21 diff --git a/release-non-auto-checks/acknowledge-contributors b/release-non-auto-checks/acknowledge-contributors new file mode 100644 index 0000000..d340262 --- /dev/null +++ b/release-non-auto-checks/acknowledge-contributors @@ -0,0 +1,2 @@ +2.2.1 +2023-08-21 diff --git a/release-non-auto-checks/changelog-major-minor b/release-non-auto-checks/changelog-major-minor index 85c0622..d340262 100644 --- a/release-non-auto-checks/changelog-major-minor +++ b/release-non-auto-checks/changelog-major-minor @@ -1,2 +1,2 @@ -2.2.0 -2023-05-31 +2.2.1 +2023-08-21 diff --git a/release-non-auto-checks/internal-wiki b/release-non-auto-checks/internal-wiki index 85c0622..d340262 100644 --- a/release-non-auto-checks/internal-wiki +++ b/release-non-auto-checks/internal-wiki @@ -1,2 +1,2 @@ -2.2.0 -2023-05-31 +2.2.1 +2023-08-21 diff --git a/release-non-auto-checks/release-note b/release-non-auto-checks/release-note index 85c0622..d340262 100644 --- a/release-non-auto-checks/release-note +++ b/release-non-auto-checks/release-note @@ -1,2 +1,2 @@ -2.2.0 -2023-05-31 +2.2.1 +2023-08-21 diff --git a/release-non-auto-checks/reproducibility-checked b/release-non-auto-checks/reproducibility-checked index 85c0622..d340262 100644 --- a/release-non-auto-checks/reproducibility-checked +++ b/release-non-auto-checks/reproducibility-checked @@ -1,2 +1,2 @@ -2.2.0 -2023-05-31 +2.2.1 +2023-08-21 diff --git a/release-non-auto-checks/security-to-man-page-info-transfer b/release-non-auto-checks/security-to-man-page-info-transfer index 85c0622..d340262 100644 --- a/release-non-auto-checks/security-to-man-page-info-transfer +++ b/release-non-auto-checks/security-to-man-page-info-transfer @@ -1,2 +1,2 @@ -2.2.0 -2023-05-31 +2.2.1 +2023-08-21 diff --git a/signatures/2.1.2-cagebreak-config.5.sig b/signatures/2.1.2-cagebreak-config.5.sig index f96713d95f03f5db4cb5d9f359f5a07efe261263..93f0f2b137cbd2db36c5d259df125d1ee4ce8865 100644 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*$>l!Yw(LZP72CP}!49FYc2K|Kv0%UifGXM$+5ZnyN z8{h{0g~AyR{0M+4*SYs%?X2XCrbAjt<-qtD?iV1Kfw1}o5o(7}#ldmfXe|Q8u&pUN z;1>pRlFj8Yk_EMN3sjM`D$qY&(#JfS9zLYZNbPtg%jnDr$o}gi@iba?1UHY}Mvbi1 zY9~$Wa>QV~IgblyBuBchM6UxhNgIv%DVT&=qZ^p~DV~Wi?>rtHa?L4$PVeu zGeNLKy3kI`Wv=$u2w3jk$&-FPJ#x@mun^;W7L^uSxh!a5(3e~VHC6$%s955WSf%ey zVJ1}ug<~oZrp6HAXfm;N3AsYJ?m@BDo@=%8QR+AOA?QH!C)ZXp`c~y6i;==GCtbI- z3|Gr%%}QK9NnWy*9SgR%nb#}vVx3(WB=f?S{LAIZL-CpIcyU|IhZLhP4~qRJuy0L`Rsk` zzccF>sPdtgaU4+77ayFBN zL^y190up?k#V_WR^AIUpXARKF?>7Pi;N+0Lad*>|^}Rjv`Ht-`WO^?`ltx=!!sIC# z^G!&A7B+INK_M#jzyF%$+1LiW?U!5%MOQc26B8*GTlnd%8Gs-0Cgn}~T}@eGpvtkc z2|6({wHX<0T{+EhR2>^Qu3-&A%G>TykPPs0n75m>G5w!naEvg1&=TW;)NzxOQ)H;- zdyPhRslELoykhP2>JIQlaFf_qf;3A&`kRqsX?xGRY_m;^0Ssze;3I25@-&3jv{%LO zlt`NJBEZ0hE4D+0HmHM!j!XPoad8u>E$czw*o&rfvIjyILMlzJA%PU^WO29|T4_{) Ey-4Q{fB*mh diff --git a/signatures/2.1.2-cagebreak-socket.7.sig b/signatures/2.1.2-cagebreak-socket.7.sig index fec631f4783791825b37c8b15a6c4e24cca58d55..6797b53851edea4d660a160ac39ba424933ae7f8 100644 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*$>l!Yw(LZP72CP}!49FYc2K|Kv0%UifGXM$+5ZnyN z8{h{0g+Zea{x)wi3b^5yc8v34hV_xo2U4*B64J?O@^ujB@SfR)`9N$WWv_9+w&by=n`Z10L;^t8vHM+X(iItm0}>qK*Og% zlbE9RmmRv)50SHwjoB*V&Y)0du^L~sExk1)VX05X@pZLLRhRCrMuitA;|@uH6tbyu z0=v$LZLZ9k2E-e@bVigM&&0h*d~LsyPGJljz#woGKwPs^_9n3kxi~cKRR{Gv!(o0fj$|i))kL)H%&VAlFOoJ_n{IAezk-IbJq?vjWj&)>SmAinpS^tE|?i1)xVIgfBKXjMFF2D_TDUUu?LI15@* E$Vc%83jhEB literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%S()fdC2#5J?I6 zOsG4!XVo?CTq)#T*vDA8Uv0yd-^z|q<4hqC}C^c;56vGqqV62Z0uy0F_8W35NU8g;5AHC59BNy2{Q?7)R%MQUM`Tb zFv4dkl&*4`9`fA59G5+%c*$F><(@z?}Q_4rlof-K!}(ISCRNGVfw7&vuT$iT2Q zVWn@xp0K@o{>#Qo+54}2Gv&Ie*M@P$Fihu;Z>%`5l1R$1bJq$PcKxs!7vH1l$HSYy z25=-=ZZAhjUn)CT;B~FWgS_E>2VF|gB&V2gstyT9sHUEzMrDT}x+H8X_i7%_B&~SG zc$EpgnHN}f*FPwKB3N6xv*{nsJ0o4zyNLx7Q!ncY^a{fXJ@Esa@=vK;a4I z8_RhqV5KRy4RQ$`<*%w7xi{-nI3^0@?6iLUl|JA7`dsicN7B8sb~X01qEI9okTQ%W zOWuS5w!uKv3cn0ID(_u`!SgLEqIz;TBZrJ^#!ZwIg`kVr$r|}OTS~AVgz`8TEF)`r EcpuIZNB{r; diff --git a/signatures/2.1.2-cagebreak.1.sig b/signatures/2.1.2-cagebreak.1.sig index 78947664f97a829d9260f7b0ca9893af52431597..feaa1b95be49162eb7671ea4979cc74164621b87 100644 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*$>l!Yw(LZP72CP}!49FYc2K|Kv0%UifGXM$+5ZnyN z8{h{0g}5gV|69{W6PqAyw{Ts${y}qxJn)v={wL^78q%**t^CNm5hKTaLL2ebp1?Be zkWZ>8?_`%dlJjtyvpdy{MP+oJgoMW$e{<&RqZqkNm=BXRw~jTr%#NL5m_uGm>kNFJ z)l5^#*!?1Q5vr;y%`xY~?{ejc71P)pbxfk(VkmMD%9Re~ZcJU{#LHAHZh1BH^ zSO@%TjHI%I6R%A|ynv^{bvVMwGaZY0+#ie^ctHCt#D0h4 z7unn1{xs;A%Hw-(fPoMkqcZ{y-Z|0Xsoy_d(;c~llUeY$1TKvAt;KETzE{NpmjL{> zESmaV>v#%hm!v~>#$$$_<9w`N0~L8sMo8)B&ha%tax<1~C~ouWaCq(yO#f{w7dd8x zz>0kc_o>Dz6v@L_#`OvdtezWObX?4H@cVhTWjQFG-_C5oY{$xWo8aAM80_<#;%{EW zW~ZB{sF?|bl}B0>Y2zH?WhD9tl?0o>I98#@HW|7Ppp~y!!+aZX$a|<%YK;pC{w9PY zyuC-~$>b8uOTPHsFAZUlT&O-1Bg-GsLif~x?~;VRj2@^}mSkCbMINUG7yi)2>FrF#}5yVG_VejcR@jO&U!ZL(}}!2c(Npv`1M`>dX~zf&PEw?{SXalnF+ E@3eXtpa1{> literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%S()fdC2#5J?I6 zOsG4!XH&Qj|3vE2#Y^6LfBEt(FD&bm>Bqcp_iBViwa^f(K{t0D?!V5CHZzL!ufR3! zyz?2YNBfCc<;3OqzTnrq{)>k(%&BnGYt+-axf3=(G}sl{lLQQd(H2-Q%@ZLau4>nu zNMW7d^VsREfMH!M$9$HYlEBM>|6kD35+1uI%UqIEo2^622DgP@O$tLHx$d*980Rch ze9j2`VDBw4m!f8}?pnyop;R#sbL;w(!;6n5Q?|ipbaVSgEArB?h2ZQ}bVO~HGhQ=o6v9P|u z4KR14ets86#>W%0L2u|GAFv`=<-QLkl{NUmeWNO1Vw-$QfZ}r)Hs?S_0^171zHVVB>-%pE z07BOgiY;zQt~Kpeg>xNLwD5d%byVna<{5cccreqy9i7=oUEYXECZ!VLI^CN@X*@eG zU?NWI*A_8U$?YU!z6ZQcoerhjMX#**W=jaACCetS+A0|TLm+B$cQw6#d+cxf&3K`i z&;|;4sZvB}Z)+zA)inhQsBVnI#q}>R5-8vgEvg!Ji!S;QKh1bCMttvf>C%l!Yw(LZP72CP}!49FYc2K|Kv0%UifGXM$+5ZnyN z8{h{0g*FTj0GBbR7ZKk&(;f$PRCOUZZ@;#u6kAhcBUSR2ZB!sriHqbS+drH+u~XCG z4se3GCD*Z8ZTu7~CR8y!*IeDPu<<@prQ|n}B<_w&YS!4ThnuQRF&Ufh_cmG;NyR=i z{5QwTudvO%g2aFbkA=0!DK|!+y9sM9(NREFLx)oIq0;)8 z`W>Yd{B?Qh>W>xpC}E(Mwv3k;lh;^M6YQXE4xZyCT9Ww`*V`x@T5Nwq#sFHQi%wZP zRY)V@aBW_asf3+O=qBvg0T5+p;G}fAYG5DFP-u!(dP5MMR0ZIKlZ2ZGTXb0W{U+TL zyZCUZ0vJE>M#Q6M-s9gx5m|~|CeedcgrJjL;9&09*Ll(?^sYqCLReE5(i~(FB%`#n zj}|@giK5}liydM0)ToXV5q#9e)LTdx0&kBhZ4UK>3T4^CU-229wv!r69t2aEERijS E8Y$-!@&Et; literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%S()fdC2#5J?I6 zOsG4!XMW!h0Eh!1R%k=hodX8nwACP9sFdtasp)hWtSn%_UH1!yDPCD!X4Y8UDKIVE zO)nk@R>7}qq(Zv6isAH)uV$hx9h5EgW5)k0pHgaa?dreFtjJ}VC2HAS-!2_VVT~S7 z{6U*9Cu|k%{*PikV04S2?Ev8Oci;@xz!x?3$)2s|Xnqk7b7QnkI#t zwVyvLx{CzDTgBJ=F-iyjBYM!{JQ7H>j-8}ugRvkD*P1CwehD6+%k@xn6=fU1iJcOP z&OPIBV2HPFk|h;oGCr3gcKN#{4kx=nwsf`+AGhtUxUKN!MgI{OMcn4rLlI(M1Sj@; z7)v089Y#=;RHKo#K7OLOaju2N%v`I5un~nncJ&)3Xj1aOM_>hO2=NC4mNQ|iPqwc_ zDhgzB^dL%&*>I#sE6mXceGoq4mDE?q?b)-QO|O%%;f{s|N_YXrue;sbY!zvg1b7RQ zTmJ>+R^LUI)KuX?eP6-c2T6~+4?iE{P_Xfq1rYPs=$%Cn$f6IjlvLn&z+Bfk%Ii{h zkG#@S4^bmNRX?m9@a>;|?+(*As=n+zcd%;jIbNcCB9o6ldd(5EnY|x{j51y6R4jC$ E=0t7`+5i9m diff --git a/signatures/cagebreak-config.5.sig b/signatures/cagebreak-config.5.sig index 93f0f2b137cbd2db36c5d259df125d1ee4ce8865..4a959e13f13ef5987a24bbb6bc8c7c921738b108 100644 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%YHX-2e&+5J?I6 zOsG4!XQo~c{So||y?|0?M)3u$CcFzF)_LZS7Pymc>5n`Ri!1#cUhO4VUuudz^%-%h zwJ)E8oVzp~{~R2H%V8C~W$3TAx;v0NVmnaz2@|gODF=%M4k9HzfgT0J%nc*ATOvuk z!^W^{qu(kzt+?JcqCkFrso8HuoOP2<1#A5qGZ7Fyw!1{(`!ufUYC+kNvDIJSvudkx zt1zJ{B-`}bP?t`+m!QeZ;R?u7m+ju=9J((NIsU48Dyjsa0^mzL5!)<|({8*RHb3c6 zK}5h3978c|e=VzESOfzCVw^D#1ZD2WXbDL-^YW#P^Bx1BQ8*$87o4V>w5G#o^@jiO z)GdC+b4SbUUd`E;Tz%?J;z>FbK~eWc=%q#}As&+aQm!7l) z$Fd^(t8!#twP8d?1;7`hEe3hq+RHp6G_?qSgxy-8KK=nL%CaSjkeA=mWs|NL9Gn-h EAUQ`3sQ>@~ literal 566 zcmV-60?GY}0y6{v0SEvc79j*$>l!Yw(LZP72CP}!49FYc2K|Kv0%UifGXM$+5ZnyN z8{h{0g~AyR{0M+4*SYs%?X2XCrbAjt<-qtD?iV1Kfw1}o5o(7}#ldmfXe|Q8u&pUN z;1>pRlFj8Yk_EMN3sjM`D$qY&(#JfS9zLYZNbPtg%jnDr$o}gi@iba?1UHY}Mvbi1 zY9~$Wa>QV~IgblyBuBchM6UxhNgIv%DVT&=qZ^p~DV~Wi?>rtHa?L4$PVeu zGeNLKy3kI`Wv=$u2w3jk$&-FPJ#x@mun^;W7L^uSxh!a5(3e~VHC6$%s955WSf%ey zVJ1}ug<~oZrp6HAXfm;N3AsYJ?m@BDo@=%8QR+AOA?QH!C)ZXp`c~y6i;==GCtbI- z3|Gr%%}QK9NnWy*9SgR%nb#}vVx3(WB=f?S{LAIZL-CpIcyU|IhZLhP4~qRJuy7+`G$243s*U-wVAgR7{w%0~6-t?7tf3~ahutq3?# zjl|Nnk6uqbhtavYDi!lu$o9qCCdpvf5e(nAVQASsYYp!dEvwi^ee0|PipH{?HXchI z&c75I{w!>=As-Gp;ayjxe&fU)RRjI54>%e7bw_zVx|J=FTFg8d3^+Q)Ofxvn{X9{` zT7~)InN|+RCKblN&hD9P$4FzYL2+kR|KR^ww6mxNAL11jcslAvV-&73!Pr0I1<$lL z)ObUzLz35 zip~M0*p34ZhN?t4s}T>e3mOIDU>T>LC!DVU+Ui#>i8A1$#w3!`u0#r%c;oC~Eh}Y5 zt1J7s=?e<2{yaxgO)t-w_0Fy9B2%x9x=Rh#YFZVD<7AoN_@0;v zOGEK1#gotcETyjpIyp)bKrl1*pxP71ME^Emzz)_#TuEZF7f1Me_x+EZG5{AqR#UAT EKn)iNFaQ7m literal 566 zcmV-60?GY}0y6{v0SEvc79j*$>l!Yw(LZP72CP}!49FYc2K|Kv0%UifGXM$+5ZnyN z8{h{0g+Zea{x)wi3b^5yc8v34hV_xo2U4*B64J?O@^ujB@SfR)`9N$WWv_9+w&by=n`Z10L;^t8vHM+X(iItm0}>qK*Og% zlbE9RmmRv)50SHwjoB*V&Y)0du^L~sExk1)VX05X@pZLLRhRCrMuitA;|@uH6tbyu z0=v$LZLZ9k2E-e@bVigM&&0h*d~LsyPGJljz#woGKwPs^_9n3kxi~cKRR{Gv!(o0fj$|i))kL)H%&VAlFOoJ_n{IAezk-IbJq?vjWj&)>SmAinpS^tE|?i1)xVIgfBKXjMFF2D_TDUUu?LI15@* E$Vc%83jhEB diff --git a/signatures/cagebreak.1.sig b/signatures/cagebreak.1.sig index feaa1b95be49162eb7671ea4979cc74164621b87..cdbd7812f165dad1f19ea2b2b9181f53b4825f6f 100644 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%YHX-2e&+5J?I6 zOsG4!XQlBF0Erx3YeY2@5K4l&J*~(huos~pT;6m~#SOJViF|eoCy;;jHjy zl64=uqIcd~)dw3^bjE)7*84}rS-@%%JEj@|uRxA&@B{s(Hv%B0vKLM!-a-2X_zll^ zC!tN`TGxcas0q4$69%gMMqiorHm3FvqUqff^os?^mZVNCS|Vjw(;()AR}Ue5)N#*T zY%wX6f0=6{uqA|=)gBh&JnryQRnF!A(1q?uV7;nZLz!OoZx99ADYs$M(Dv$KxR$|? zuA8V)y(;<1HAUW~j|}*Ld65^fTX}+#N#b=17R#3Z-$DA?e`RK1|Ol)RKy6n_G z<99;!K)q#7lBTggtU8V;yg8Y)pB5YPi4u^+@o=(}rj+l)g{LA6?GmC650m}u_^3ZC zI48;Ea8hF%R2oLfSt{)Il7!jvvGl~)*x=r1zWWl!Yw(LZP72CP}!49FYc2K|Kv0%UifGXM$+5ZnyN z8{h{0g}5gV|69{W6PqAyw{Ts${y}qxJn)v={wL^78q%**t^CNm5hKTaLL2ebp1?Be zkWZ>8?_`%dlJjtyvpdy{MP+oJgoMW$e{<&RqZqkNm=BXRw~jTr%#NL5m_uGm>kNFJ z)l5^#*!?1Q5vr;y%`xY~?{ejc71P)pbxfk(VkmMD%9Re~ZcJU{#LHAHZh1BH^ zSO@%TjHI%I6R%A|ynv^{bvVMwGaZY0+#ie^ctHCt#D0h4 z7unn1{xs;A%Hw-(fPoMkqcZ{y-Z|0Xsoy_d(;c~llUeY$1TKvAt;KETzE{NpmjL{> zESmaV>v#%hm!v~>#$$$_<9w`N0~L8sMo8)B&ha%tax<1~C~ouWaCq(yO#f{w7dd8x zz>0kc_o>Dz6v@L_#`OvdtezWObX?4H@cVhTWjQFG-_C5oY{$xWo8aAM80_<#;%{EW zW~ZB{sF?|bl}B0>Y2zH?WhD9tl?0o>I98#@HW|7Ppp~y!!+aZX$a|<%YK;pC{w9PY zyuC-~$>b8uOTPHsFAZUlT&O-1Bg-GsLif~x?~;VRj2@^}mSkCbMINUG7yi)2>FrF#}5yVG_VejcR@jO&U!ZL(}}!2c(Npv`1M`>dX~zf&PEw?{SXalnF+ E@3eXtpa1{> diff --git a/signatures/cagebreak.sig b/signatures/cagebreak.sig index 4e3a176d1b3d0b26465a5adc8f4e83e069da9a33..f24848b41bc840338eb87ca186d8f1e2fc61b9c7 100644 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%YHX-2e&+5J?I6 zOsG4!XF{_N{wD^_EjlrBNF8RJUth`RH`N1Vh}EIJH>TrLR-A$D$vn(8ppR$z`|@*t zdlat~vmxysYApsx)#+>|Qsg0oi)#=i*XRd-{NmC|E78#B>-kRju~Df3AqB)adYaVMaV0QXM>4W1aF{Y4d zW1W@fidlyGUbSc*L+%C|Yr2}$p2)+`)Nu5o(i)#}_j^qf{vW{edYxOxs=x;H&KCvS z+*qq!d`%&AIv{T>A`ls(1OIGZ(ZC5q$Hv+#Oi#Be8|tO(6W_*>g<>m!%ghD;=9!0K z(3N=YHgS$tFUnUAzno+B<&FctvxoC*0G+<`Xoe!pP$F)LEBUut|8P0NE-ppQOYB3a zkOQR*pRyWf9g&I#%kSX;y7E`I>2j4qxt)_aM95c3M)_~buX#*$TCx>WE+&y==Ic^D z2P1jjq%}y$o;~|=o%249x0{WCwq!-o&*BYiqS-Il!Yw(LZP72CP}!49FYc2K|Kv0%UifGXM$+5ZnyN z8{h{0g*FTj0GBbR7ZKk&(;f$PRCOUZZ@;#u6kAhcBUSR2ZB!sriHqbS+drH+u~XCG z4se3GCD*Z8ZTu7~CR8y!*IeDPu<<@prQ|n}B<_w&YS!4ThnuQRF&Ufh_cmG;NyR=i z{5QwTudvO%g2aFbkA=0!DK|!+y9sM9(NREFLx)oIq0;)8 z`W>Yd{B?Qh>W>xpC}E(Mwv3k;lh;^M6YQXE4xZyCT9Ww`*V`x@T5Nwq#sFHQi%wZP zRY)V@aBW_asf3+O=qBvg0T5+p;G}fAYG5DFP-u!(dP5MMR0ZIKlZ2ZGTXb0W{U+TL zyZCUZ0vJE>M#Q6M-s9gx5m|~|CeedcgrJjL;9&09*Ll(?^sYqCLReE5(i~(FB%`#n zj}|@giK5}liydM0)ToXV5q#9e)LTdx0&kBhZ4UK>3T4^CU-229wv!r69t2aEERijS E8Y$-!@&Et; From 61fb97b070b65335bab573daed4caeab97ad9a46 Mon Sep 17 00:00:00 2001 From: project-repo Date: Mon, 4 Dec 2023 12:22:24 +0100 Subject: [PATCH 5/8] Release 2.2.2 - Adjust Cagebreak to wlroot 0.17 - Improve README & SECURITY.md --- Hashes.md | 20 +++++++ README.md | 51 ++++++++---------- SECURITY.md | 33 ++++++------ cagebreak.c | 28 +++++----- fuzz/fuzz-lib.c | 10 ++-- idle_inhibit_v1.c | 4 +- keybinding.c | 24 ++++----- man/cagebreak-config.5.md | 2 +- man/cagebreak-socket.7.md | 2 +- man/cagebreak.1.md | 2 +- meson.build | 18 +++---- message.c | 1 - output.c | 37 ++++--------- output.h | 2 +- release-non-auto-checks/Bugs.md | 4 +- release-non-auto-checks/FAQ.md | 4 +- release-non-auto-checks/SECURITY.md | 4 +- release-non-auto-checks/WLR_XDG_VERSION | 4 +- .../acknowledge-contributors | 4 +- release-non-auto-checks/changelog-major-minor | 4 +- release-non-auto-checks/internal-wiki | 4 +- release-non-auto-checks/release-note | 4 +- .../reproducibility-checked | 4 +- .../security-to-man-page-info-transfer | 4 +- seat.c | 48 ++++++++--------- server.h | 4 +- signatures/2.2.1-cagebreak-config.5.sig | Bin 0 -> 566 bytes signatures/2.2.1-cagebreak-socket.7.sig | Bin 0 -> 566 bytes signatures/2.2.1-cagebreak.1.sig | Bin 0 -> 566 bytes signatures/2.2.1-cagebreak.sig | Bin 0 -> 566 bytes signatures/cagebreak-config.5.sig | Bin 566 -> 566 bytes signatures/cagebreak-socket.7.sig | Bin 566 -> 566 bytes signatures/cagebreak.1.sig | Bin 566 -> 566 bytes signatures/cagebreak.sig | Bin 566 -> 566 bytes view.c | 1 - view.h | 4 ++ workspace.c | 3 -- xdg_shell.c | 18 ++++--- xwayland.c | 40 ++++++++++---- xwayland.h | 2 + 40 files changed, 205 insertions(+), 189 deletions(-) create mode 100644 signatures/2.2.1-cagebreak-config.5.sig create mode 100644 signatures/2.2.1-cagebreak-socket.7.sig create mode 100644 signatures/2.2.1-cagebreak.1.sig create mode 100644 signatures/2.2.1-cagebreak.sig diff --git a/Hashes.md b/Hashes.md index 240925f..ace89e4 100644 --- a/Hashes.md +++ b/Hashes.md @@ -1,5 +1,25 @@ # Hashes +2.2.2 cagebreak + + * sha 256: 98e0dfe870a7242fdf7c6fb1a5c520cfe7d1154b3f139560da6cb86b2430b2a0 + * sha 512: c335f8f6e226203e797e232caead74db9b1e7f24d5edf80dd99a0c00c5f4e81351a5ddcad4f601a12618ebed5c62be547462c4f06ae4ccb6a622a869ee8741ec + +2.2.2 cagebreak.1 + + * sha 256: c655fff018377b5ee541854ee428559ba4c5080d44f87247fe608f18651b0764 + * sha 512: 7cbef17cbe3c59cde21466d6c76e1a34ffce748d2d9011a77bd7703f605b737e344cabaad1e3a599316321481524cb860b2533ab6bef2e7714c00b2641fe962c + +2.2.2 cagebreak-config.5 + + * sha 256: b799e0252d7224befc92bdd143d00dc3f42a38e39f510f3ace575b03f293a788 + * sha 512: 3778db9ff07429efb74b4b07476193844698e07ea91a742aac078391ba38fb07987dc61ba312c30b6eb04ad2d847ee552826e7a09be8dc572be5626c27059df3 + +2.2.2 cagebreak-socket.7 + + * sha 256: dd10359fd1840909bb817858668e67bdd433f367b0ed199328e4b29c99529322 + * sha 512: 67f8c39864472c9b2396946a943ce249297b1b9fc5e452a4051f0512fd61b4a22906e1a16aee1c2bf6cacb3b9cd7a11da19c5d760c192020402008eab379eee1 + 2.2.1 cagebreak * sha 256: 96469a78eeaddf9476c82e0ab8a0e35a95b3119bf83633a54feb8f3f5780df2f diff --git a/README.md b/README.md index 1781cc3..f2fd64d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Cagebreak: A Wayland Tiling Compositor -[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.2.1)](https://repology.org/project/cagebreak/versions) +[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.2.2)](https://repology.org/project/cagebreak/versions) ## Quick Introduction @@ -9,25 +9,21 @@ based on [Cage](https://github.com/Hjdskes/cage) and inspired by [ratpoison](htt ### Purpose -The goal of this project is to provide a successor to ratpoison for Wayland. +This project provides a successor to ratpoison for Wayland. However, this is no reimplementation of ratpoison. #### New Features, Bugs and Contact Information -Should you want to know if a feature will be implemented, file a bug or -get in touch, [open an issue](https://github.com/project-repo/cagebreak/issues/new) +You can [open an issue](https://github.com/project-repo/cagebreak/issues/new) or write an e-mail (See [SECURITY.md](SECURITY.md) for details.). -The Roadmap section outlines what is planned for the future. +The Roadmap section outlines our plans. #### Compatibility & Development Distribution Cagebreak supports [Arch Linux](https://archlinux.org/) and uses the libraries -(and software versions) as they are obtained through [pacman](https://wiki.archlinux.org/title/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. +and versions from extra and core at the time of release. +Most other setups work with a bit of luck. ### Quick Installation @@ -42,17 +38,12 @@ details on getting started and the documentation for everything else. ### Documentation - * the rest of this file - * the man pages: - * [cagebreak](man/cagebreak.1.md) - * [configuration](man/cagebreak-config.5.md) - * [socket](man/cagebreak-socket.7.md) - * the [FAQ](FAQ.md) - * [SECURITY.md](SECURITY.md) + * the man pages: [cagebreak](man/cagebreak.1.md), [configuration](man/cagebreak-config.5.md) & [socket](man/cagebreak-socket.7.md) + * the [README](README.md), [FAQ](FAQ.md) & [SECURITY.md](SECURITY.md) #### What's new? -See the [Changelog](Changelog.md). +Check the [Changelog](Changelog.md). ### Uninstallation @@ -60,9 +51,9 @@ See the [Changelog](Changelog.md). ### Contributing - * Just [open an issue](https://github.com/project-repo/cagebreak/issues/new) and state your idea. - We will consider the proposal and get back to you. - * Don't open a pull request. We might not accept your code and + * [Open an issue](https://github.com/project-repo/cagebreak/issues/new) and state your idea. + We will get back to you. + * Ask before you open a pull request. We might not accept your code and it would be sad to waste the effort. * Respect the [Code of Conduct](CODE_OF_CONDUCT.md) (To date, we never had to intervene - Keep it that way!) @@ -208,16 +199,16 @@ as a source of inspiration and explanations for certain particularities. ## Contributing * Read this document. - * Just [open an issue](https://github.com/project-repo/cagebreak/issues/new) and state your feature request. - We will consider the proposal and get back to you. - * Don't open a pull request without asking first. We might not accept your + * [Open an issue](https://github.com/project-repo/cagebreak/issues/new) and state your feature request. + We will get back to you. + * Ask before opening a pull request. We might not accept your code and it would be sad to waste the effort. * Respect the [Code of Conduct](CODE_OF_CONDUCT.md) (To date, we never had to intervene - Please keep it that way!) ### Good First Contributions - * Reviewing the project is always welcome. + * Reviews are always welcome. * Read the code. * Read the documentation. * Test whether the documentation matches the code. @@ -225,12 +216,12 @@ as a source of inspiration and explanations for certain particularities. * Compile the code. * Ideas on improving the testing and quality assurance are particularly welcome. - * If you want, you can share your cagebreak scripts and we might include them - in the repository provided you agree to release them under MIT and we agree - with the use case and coding style. - * Iff you are happy with Cagebreak and use Arch Linux, you may vote for + * You can share your cagebreak scripts and we might include them with Cagebreak + provided you agree to release them under MIT and we agree with the + use case and coding style. + * If you are happy with Cagebreak under Arch Linux, you may vote for [Cagebreak in the AUR](https://aur.archlinux.org/packages/cagebreak). - * The points above still apply. + * The points from the Contributing section above still apply. ### Philosophy diff --git a/SECURITY.md b/SECURITY.md index 2f33197..a55a2b4 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -51,11 +51,10 @@ public key or provide the fingerprint and directions to obtain the key. ## Threat Model -Cagebreak is a wayland compositor run by the user of the system -and thus has access to whichever resources this user has access to. -Cagebreak can restrict other programs in no way, because this would hamper -usability (consider a web browser unable to write a downloaded file to disk -for instance). +Cagebreak is a wayland compositor run by a user and has access to +the resources the user has access to. +Cagebreak cannot restrict other programs (consider a web browser +unable to write a downloaded file for instance). There is no transmission of information by cagebreak other than to the screens, ipc and potentially other documented local channels. @@ -63,38 +62,36 @@ screens, ipc and potentially other documented local channels. ### STRIDE Threat List This is not a thorough analysis, just an overview of the ways in which cagebreak -has (no) attack surface. Please reference the man pages for details but especially -the -e and --bs options. +has (no) attack surface. Please reference the man pages (especially options -e and --bs ). #### Spoofing -Not applicable - Using Cagebreak already requires a login as a user. +Not applicable - Cagebreak is executed after user login. #### Tampering -Not applicable - Cagebreak must allow system manipulation for user software. +Not applicable - Cagebreak allows system manipulation for user software. #### Repudiation Not applicable - There are no prohibited operations (See Tampering above.). -While cagebreak does send events over documented channels there is no logging -activated by default, though, of course, this can be changed by the user -by logging socket output (if enabled) for example. +Cagebreak sends events over documented channels. There is no logging +activated by default - this can be changed by logging the socket (if enabled) for example. #### Information Disclosure -Not applicable - Information disclosure over documented channels is a feature -and any software run by the user may exfiltrate any data the user has access to. +Not applicable - Information disclosure over documented channels is a feature. +Any user software may exfiltrate any data the user has access to. #### Denial of Service -Not applicable - Cagebreak offers functionality to terminate itself, which is -available to all user software over the socket if the socket is enabled. +Not applicable - Cagebreak offers functionality to terminate itself. This is +available to user software over the socket (if enabled). #### Elevation of Privilege -Software may gain arbitrary code execution rights if it has access to the -Cagebreak socket. Privilege escalation to root is unlikely since privileges +Software may gain arbitrary code execution if it has access to the +socket (if enabled). Privilege escalation to root is unlikely since privileges are dropped before any user input is accepted. ## GPG Keys of the Cagebreak Repository diff --git a/cagebreak.c b/cagebreak.c index 4437331..66afdf3 100644 --- a/cagebreak.c +++ b/cagebreak.c @@ -26,8 +26,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -368,7 +368,7 @@ main(int argc, char *argv[]) { wl_event_loop_add_signal(event_loop, SIGPIPE, handle_signal, &server); server.event_loop = event_loop; - backend = wlr_backend_autocreate(server.wl_display); + backend = wlr_backend_autocreate(server.wl_display, &server.session); if(!backend) { wlr_log(WLR_ERROR, "Unable to create the wlroots backend"); ret = 1; @@ -428,9 +428,10 @@ main(int argc, char *argv[]) { ret = 1; goto end; } - wlr_scene_attach_output_layout(server.scene, server.output_layout); + server.scene_output_layout = + wlr_scene_attach_output_layout(server.scene, server.output_layout); - compositor = wlr_compositor_create(server.wl_display, server.renderer); + compositor = wlr_compositor_create(server.wl_display, 6, server.renderer); if(!compositor) { wlr_log(WLR_ERROR, "Unable to create the wlroots compositor"); ret = 1; @@ -474,14 +475,8 @@ main(int argc, char *argv[]) { goto end; } - server.idle = wlr_idle_create(server.wl_display); - if(!server.idle) { - wlr_log(WLR_ERROR, "Unable to create the idle tracker"); - ret = 1; - goto end; - } - server.idle_inhibit_v1 = wlr_idle_inhibit_v1_create(server.wl_display); + server.idle = wlr_idle_notifier_v1_create(server.wl_display); if(!server.idle_inhibit_v1) { wlr_log(WLR_ERROR, "Cannot create the idle inhibitor"); ret = 1; @@ -687,6 +682,12 @@ main(int argc, char *argv[]) { wl_display_run(server.wl_display); +#if CG_HAS_XWAYLAND + if(server.xwayland != NULL) { + wlr_xwayland_destroy(server.xwayland); + } +#endif + wl_display_destroy_clients(server.wl_display); end: @@ -734,11 +735,6 @@ end: if(server.seat != NULL) { seat_destroy(server.seat); } -#if CG_HAS_XWAYLAND - if(server.xwayland != NULL) { - wlr_xwayland_destroy(server.xwayland); - } -#endif if(sigint_source != NULL) { wl_event_source_remove(sigint_source); diff --git a/fuzz/fuzz-lib.c b/fuzz/fuzz-lib.c index d331880..650d8a8 100644 --- a/fuzz/fuzz-lib.c +++ b/fuzz/fuzz-lib.c @@ -25,10 +25,9 @@ #include #include #include -#include #include +#include #include -#include #include #include #include @@ -271,9 +270,10 @@ LLVMFuzzerInitialize(int *argc, char ***argv) { ret = 1; goto end; } - wlr_scene_attach_output_layout(server.scene, server.output_layout); + server.scene_output_layout = + wlr_scene_attach_output_layout(server.scene, server.output_layout); - compositor = wlr_compositor_create(server.wl_display, server.renderer); + compositor = wlr_compositor_create(server.wl_display, 5, server.renderer); if(!compositor) { wlr_log(WLR_ERROR, "Unable to create the wlroots compositor"); ret = 1; @@ -310,7 +310,7 @@ LLVMFuzzerInitialize(int *argc, char ***argv) { goto end; } - server.idle = wlr_idle_create(server.wl_display); + server.idle = wlr_idle_notifier_v1_create(server.wl_display); if(!server.idle) { wlr_log(WLR_ERROR, "Unable to create the idle tracker"); ret = 1; diff --git a/idle_inhibit_v1.c b/idle_inhibit_v1.c index b4f91f9..019d47b 100644 --- a/idle_inhibit_v1.c +++ b/idle_inhibit_v1.c @@ -2,8 +2,8 @@ // SPDX-License-Identifier: MIT #include -#include #include +#include #include "idle_inhibit_v1.h" #include "server.h" @@ -24,7 +24,7 @@ idle_inhibit_v1_check_active(struct cg_server *server) { /* As of right now, this does not check whether the inhibitor * is visible or not.*/ bool inhibited = !wl_list_empty(&server->inhibitors); - wlr_idle_set_enabled(server->idle, NULL, !inhibited); + wlr_idle_notifier_v1_set_inhibited(server->idle, inhibited); } #if CG_HAS_FANALYZE #pragma GCC diagnostic pop diff --git a/keybinding.c b/keybinding.c index eaf2ae7..6da0cc6 100644 --- a/keybinding.c +++ b/keybinding.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include @@ -506,11 +505,10 @@ keybinding_workspace_fullscreen(struct cg_server *server) { // Switch to a differerent virtual terminal static int -keybinding_switch_vt(struct wlr_backend *backend, unsigned int vt) { - if(wlr_backend_is_multi(backend)) { - struct wlr_session *session = wlr_backend_get_session(backend); - if(session) { - wlr_session_change_vt(session, vt); +keybinding_switch_vt(struct cg_server *server, unsigned int vt) { + if(wlr_backend_is_multi(server->backend)) { + if(server->session) { + wlr_session_change_vt(server->session, vt); } return 0; } @@ -1627,11 +1625,11 @@ void set_cursor(bool enabled, struct cg_seat *seat) { if(enabled == true) { seat->enable_cursor = true; - wlr_xcursor_manager_set_cursor_image(seat->xcursor_manager, - DEFAULT_XCURSOR, seat->cursor); + wlr_cursor_set_xcursor(seat->cursor, seat->xcursor_manager, + DEFAULT_XCURSOR); } else { seat->enable_cursor = false; - wlr_cursor_set_image(seat->cursor, NULL, 0, 0, 0, 0, 0, 0); + wlr_cursor_unset_image(seat->cursor); } } @@ -1645,7 +1643,7 @@ run_action(enum keybinding_action action, struct cg_server *server, server->running = false; break; case KEYBINDING_CHANGE_TTY: - return keybinding_switch_vt(server->backend, data.u); + return keybinding_switch_vt(server, data.u); case KEYBINDING_CURSOR: set_cursor(data.i, server->seat); break; @@ -1688,9 +1686,9 @@ run_action(enum keybinding_action action, struct cg_server *server, if(data.u != server->seat->default_mode) { wlr_seat_pointer_notify_clear_focus(server->seat->seat); if(server->seat->enable_cursor == true) { - wlr_xcursor_manager_set_cursor_image( - server->seat->xcursor_manager, "dot_box_mask", - server->seat->cursor); + wlr_cursor_set_xcursor(server->seat->cursor, + server->seat->xcursor_manager, + "dot_box_mask"); } } server->seat->mode = data.u; diff --git a/man/cagebreak-config.5.md b/man/cagebreak-config.5.md index f894d04..c04c757 100644 --- a/man/cagebreak-config.5.md +++ b/man/cagebreak-config.5.md @@ -1,4 +1,4 @@ -cagebreak-config(5) "Version 2.2.1" "Cagebreak Manual" +cagebreak-config(5) "Version 2.2.2" "Cagebreak Manual" # NAME diff --git a/man/cagebreak-socket.7.md b/man/cagebreak-socket.7.md index 210a4f9..d61e498 100644 --- a/man/cagebreak-socket.7.md +++ b/man/cagebreak-socket.7.md @@ -1,4 +1,4 @@ -cagebreak-socket(7) "Version 2.2.1" "Cagebreak Manual" +cagebreak-socket(7) "Version 2.2.2" "Cagebreak Manual" # NAME diff --git a/man/cagebreak.1.md b/man/cagebreak.1.md index d99a87a..7e0c421 100644 --- a/man/cagebreak.1.md +++ b/man/cagebreak.1.md @@ -1,4 +1,4 @@ -cagebreak(1) "Version 2.2.1" "Cagebreak Manual" +cagebreak(1) "Version 2.2.2" "Cagebreak Manual" # NAME diff --git a/meson.build b/meson.build index fb83017..e28557e 100644 --- a/meson.build +++ b/meson.build @@ -3,7 +3,7 @@ project( 'cagebreak', 'c', -version : '2.2.1', +version : '2.2.2', license : 'MIT', default_options : ['c_std=c11', 'warning_level=3'] ) @@ -55,7 +55,7 @@ if is_freebsd ) endif -wlroots = dependency('wlroots', version: ['>=0.16.1', '< 0.17.0']) +wlroots = dependency('wlroots', version: ['>=0.16.1', '< 0.17.1']) wayland_protos = dependency('wayland-protocols', version: '>=1.14') wayland_server = dependency('wayland-server') wayland_cursor = dependency('wayland-cursor') @@ -204,15 +204,15 @@ reproducible_build_versions = { 'wayland_server': '1.19.0', 'wayland_client': '1.22.0', 'wayland_cursor': '1.22.0', - 'wlroots': '0.16.2', - 'xkbcommon': '1.5.0', + 'wlroots': '0.17.0', + 'xkbcommon': '1.6.0', 'fontconfig': '2.14.2', - 'libinput': '1.23.0', + 'libinput': '1.24.0', 'libevdev': '1.13.1', 'libudev': '254', - 'pango': '1.50.14', - 'cairo': '1.17.8', - 'pangocairo': '1.50.14', + 'pango': '1.51.0', + 'cairo': '1.18.0', + 'pangocairo': '1.51.0', 'math': '-1' } @@ -260,7 +260,7 @@ install_data('LICENSE', install_dir : '/usr/share/licenses/' + meson.project_nam if get_option('man-pages') scdoc = find_program('scdoc') - secssinceepoch = 1692353837 + secssinceepoch = 1701680868 shcommand = 'export SOURCE_DATE_EPOCH=' + secssinceepoch.to_string() + ' ; @0@ < @INPUT@'.format(scdoc.path()) sh = find_program('sh') mandir1 = join_paths(get_option('mandir'), 'man1') diff --git a/message.c b/message.c index 74b1d0a..d74b8cf 100644 --- a/message.c +++ b/message.c @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include diff --git a/output.c b/output.c index 506f5bd..d4fef70 100644 --- a/output.c +++ b/output.c @@ -15,9 +15,9 @@ #include #endif #include +#include #include #include -#include #include #include #include @@ -42,7 +42,7 @@ void output_clear(struct cg_output *output) { struct cg_server *server = output->server; - wlr_output_layout_remove(server->output_layout, output->wlr_output); + wlr_scene_output_destroy(output->scene_output); if(server->running && server->curr_output == output && wl_list_length(&server->outputs) > 1) { @@ -118,7 +118,6 @@ output_destroy(struct cg_output *output) { int outp_num = output_get_num(output); wl_list_remove(&output->destroy.link); - wl_list_remove(&output->mode.link); wl_list_remove(&output->commit.link); wl_list_remove(&output->frame.link); @@ -166,7 +165,7 @@ handle_output_frame(struct wl_listener *listener, void *data) { if(scene_output == NULL) { return; } - wlr_scene_output_commit(scene_output); + wlr_scene_output_commit(scene_output, NULL); struct timespec now = {0}; clock_gettime(CLOCK_MONOTONIC, &now); @@ -439,8 +438,9 @@ handle_output_commit(struct wl_listener *listener, void *data) { return; } - if(event->committed & - (WLR_OUTPUT_STATE_TRANSFORM | WLR_OUTPUT_STATE_SCALE)) { + if(event->state->committed & + (WLR_OUTPUT_STATE_TRANSFORM | WLR_OUTPUT_STATE_SCALE | + WLR_OUTPUT_STATE_MODE)) { struct cg_view *view; wl_list_for_each( view, &output->workspaces[output->curr_workspace]->views, link) { @@ -451,23 +451,6 @@ handle_output_commit(struct wl_listener *listener, void *data) { } } -static void -handle_output_mode(struct wl_listener *listener, void *data) { - struct cg_output *output = wl_container_of(listener, output, mode); - - if(!output->wlr_output->enabled || output->workspaces == NULL) { - return; - } - - struct cg_view *view; - wl_list_for_each(view, &output->workspaces[output->curr_workspace]->views, - link) { - if(view_is_visible(view)) { - view_maximize(view, view->tile); - } - } -} - void output_make_workspace_fullscreen(struct cg_output *output, int ws) { struct cg_server *server = output->server; @@ -517,6 +500,7 @@ handle_new_output(struct wl_listener *listener, void *data) { } struct cg_output *output = calloc(1, sizeof(struct cg_output)); + output->scene_output = wlr_scene_output_create(server->scene, wlr_output); if(!output) { wlr_log(WLR_ERROR, "Failed to allocate output"); return; @@ -568,8 +552,8 @@ handle_new_output(struct wl_listener *listener, void *data) { if(server->curr_output == NULL) { server->curr_output = output; } - wlr_xcursor_manager_set_cursor_image(server->seat->xcursor_manager, - DEFAULT_XCURSOR, server->seat->cursor); + wlr_cursor_set_xcursor(server->seat->cursor, server->seat->xcursor_manager, + DEFAULT_XCURSOR); wlr_cursor_warp(server->seat->cursor, NULL, 0, 0); output->destroy.notify = handle_output_destroy; @@ -578,8 +562,7 @@ handle_new_output(struct wl_listener *listener, void *data) { wl_signal_add(&wlr_output->events.frame, &output->frame); output->commit.notify = handle_output_commit; wl_signal_add(&wlr_output->events.commit, &output->commit); - output->mode.notify = handle_output_mode; - wl_signal_add(&wlr_output->events.mode, &output->mode); + ipc_send_event(server, "{\"event_name\":\"new_output\",\"output\":\"%s\",\"output_" "id\":%d,\"priority\":%d}", diff --git a/output.h b/output.h index 90cd615..c1d4853 100644 --- a/output.h +++ b/output.h @@ -16,8 +16,8 @@ struct cg_output { struct cg_server *server; struct wlr_output *wlr_output; struct wlr_scene_rect *bg; + struct wlr_scene_output *scene_output; - struct wl_listener mode; struct wl_listener commit; struct wl_listener destroy; struct wl_listener frame; diff --git a/release-non-auto-checks/Bugs.md b/release-non-auto-checks/Bugs.md index d340262..9388d0a 100644 --- a/release-non-auto-checks/Bugs.md +++ b/release-non-auto-checks/Bugs.md @@ -1,2 +1,2 @@ -2.2.1 -2023-08-21 +2.2.2 +2023-12-04 diff --git a/release-non-auto-checks/FAQ.md b/release-non-auto-checks/FAQ.md index d340262..9388d0a 100644 --- a/release-non-auto-checks/FAQ.md +++ b/release-non-auto-checks/FAQ.md @@ -1,2 +1,2 @@ -2.2.1 -2023-08-21 +2.2.2 +2023-12-04 diff --git a/release-non-auto-checks/SECURITY.md b/release-non-auto-checks/SECURITY.md index d340262..9388d0a 100644 --- a/release-non-auto-checks/SECURITY.md +++ b/release-non-auto-checks/SECURITY.md @@ -1,2 +1,2 @@ -2.2.1 -2023-08-21 +2.2.2 +2023-12-04 diff --git a/release-non-auto-checks/WLR_XDG_VERSION b/release-non-auto-checks/WLR_XDG_VERSION index d340262..9388d0a 100644 --- a/release-non-auto-checks/WLR_XDG_VERSION +++ b/release-non-auto-checks/WLR_XDG_VERSION @@ -1,2 +1,2 @@ -2.2.1 -2023-08-21 +2.2.2 +2023-12-04 diff --git a/release-non-auto-checks/acknowledge-contributors b/release-non-auto-checks/acknowledge-contributors index d340262..9388d0a 100644 --- a/release-non-auto-checks/acknowledge-contributors +++ b/release-non-auto-checks/acknowledge-contributors @@ -1,2 +1,2 @@ -2.2.1 -2023-08-21 +2.2.2 +2023-12-04 diff --git a/release-non-auto-checks/changelog-major-minor b/release-non-auto-checks/changelog-major-minor index d340262..9388d0a 100644 --- a/release-non-auto-checks/changelog-major-minor +++ b/release-non-auto-checks/changelog-major-minor @@ -1,2 +1,2 @@ -2.2.1 -2023-08-21 +2.2.2 +2023-12-04 diff --git a/release-non-auto-checks/internal-wiki b/release-non-auto-checks/internal-wiki index d340262..9388d0a 100644 --- a/release-non-auto-checks/internal-wiki +++ b/release-non-auto-checks/internal-wiki @@ -1,2 +1,2 @@ -2.2.1 -2023-08-21 +2.2.2 +2023-12-04 diff --git a/release-non-auto-checks/release-note b/release-non-auto-checks/release-note index d340262..9388d0a 100644 --- a/release-non-auto-checks/release-note +++ b/release-non-auto-checks/release-note @@ -1,2 +1,2 @@ -2.2.1 -2023-08-21 +2.2.2 +2023-12-04 diff --git a/release-non-auto-checks/reproducibility-checked b/release-non-auto-checks/reproducibility-checked index d340262..9388d0a 100644 --- a/release-non-auto-checks/reproducibility-checked +++ b/release-non-auto-checks/reproducibility-checked @@ -1,2 +1,2 @@ -2.2.1 -2023-08-21 +2.2.2 +2023-12-04 diff --git a/release-non-auto-checks/security-to-man-page-info-transfer b/release-non-auto-checks/security-to-man-page-info-transfer index d340262..9388d0a 100644 --- a/release-non-auto-checks/security-to-man-page-info-transfer +++ b/release-non-auto-checks/security-to-man-page-info-transfer @@ -1,2 +1,2 @@ -2.2.1 -2023-08-21 +2.2.2 +2023-12-04 diff --git a/seat.c b/seat.c index 1c88f49..80206e9 100644 --- a/seat.c +++ b/seat.c @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include #include @@ -59,10 +59,10 @@ update_capabilities(const struct cg_seat *seat) { /* Hide cursor if the seat doesn't have pointer capability. */ if(((caps & WL_SEAT_CAPABILITY_POINTER) == 0) || seat->enable_cursor == false) { - wlr_cursor_set_image(seat->cursor, NULL, 0, 0, 0, 0, 0, 0); + wlr_cursor_unset_image(seat->cursor); } else { - wlr_xcursor_manager_set_cursor_image(seat->xcursor_manager, - DEFAULT_XCURSOR, seat->cursor); + wlr_cursor_set_xcursor(seat->cursor, seat->xcursor_manager, + DEFAULT_XCURSOR); } } @@ -169,7 +169,7 @@ handle_modifier_event(struct wlr_input_device *device, struct cg_seat *seat) { wlr_seat_set_keyboard(seat->seat, keyboard); wlr_seat_keyboard_notify_modifiers(seat->seat, &keyboard->modifiers); - wlr_idle_notify_activity(seat->server->idle, seat->seat); + wlr_idle_notifier_v1_notify_activity(seat->server->idle, seat->seat); } void @@ -205,12 +205,11 @@ handle_command_key_bindings(struct cg_server *server, xkb_keysym_t sym, &server->scene->tree.node, server->seat->cursor->x, server->seat->cursor->y, &sx, &sy); if(server->seat->enable_cursor) { - wlr_xcursor_manager_set_cursor_image(server->seat->xcursor_manager, - "left_ptr", - server->seat->cursor); + wlr_cursor_set_xcursor(server->seat->cursor, + server->seat->xcursor_manager, "left_ptr"); if(node && node->type == WLR_SCENE_NODE_BUFFER) { struct wlr_scene_surface *scene_surface = - wlr_scene_surface_from_buffer( + wlr_scene_surface_try_from_buffer( wlr_scene_buffer_from_node(node)); if(scene_surface != NULL) { surface = scene_surface->surface; @@ -239,7 +238,7 @@ handle_command_key_bindings(struct cg_server *server, xkb_keysym_t sym, } message_clear(group->seat->server->curr_output); run_action((*keybinding)->action, server, (*keybinding)->data); - wlr_idle_notify_activity(server->idle, server->seat->seat); + wlr_idle_notifier_v1_notify_activity(server->idle, server->seat->seat); return true; } else if(mode != 0) { run_action(KEYBINDING_NOOP, server, (union keybinding_params){NULL}); @@ -312,7 +311,7 @@ handle_key_event(struct cg_keyboard_group *group, struct cg_seat *seat, event->keycode, event->state); } - wlr_idle_notify_activity(seat->server->idle, seat->seat); + wlr_idle_notifier_v1_notify_activity(seat->server->idle, seat->seat); } static void @@ -589,7 +588,7 @@ handle_touch_down(struct wl_listener *listener, void *data) { uint32_t serial = 0; if(node && node->type == WLR_SCENE_NODE_BUFFER) { struct wlr_scene_surface *scene_surface = - wlr_scene_surface_from_buffer(wlr_scene_buffer_from_node(node)); + wlr_scene_surface_try_from_buffer(wlr_scene_buffer_from_node(node)); if(scene_surface != NULL) { serial = wlr_seat_touch_notify_down( seat->seat, scene_surface->surface, event->time_msec, @@ -603,7 +602,7 @@ handle_touch_down(struct wl_listener *listener, void *data) { seat->touch_ly = ly; } - wlr_idle_notify_activity(seat->server->idle, seat->seat); + wlr_idle_notifier_v1_notify_activity(seat->server->idle, seat->seat); } static void @@ -616,7 +615,7 @@ handle_touch_up(struct wl_listener *listener, void *data) { } wlr_seat_touch_notify_up(seat->seat, event->time_msec, event->touch_id); - wlr_idle_notify_activity(seat->server->idle, seat->seat); + wlr_idle_notifier_v1_notify_activity(seat->server->idle, seat->seat); } static void @@ -638,7 +637,7 @@ handle_touch_motion(struct wl_listener *listener, void *data) { if(node && node->type == WLR_SCENE_NODE_BUFFER) { struct wlr_scene_surface *scene_surface = - wlr_scene_surface_from_buffer(wlr_scene_buffer_from_node(node)); + wlr_scene_surface_try_from_buffer(wlr_scene_buffer_from_node(node)); if(scene_surface != NULL) { wlr_seat_touch_point_focus(seat->seat, scene_surface->surface, @@ -657,7 +656,7 @@ handle_touch_motion(struct wl_listener *listener, void *data) { seat->touch_ly = ly; } - wlr_idle_notify_activity(seat->server->idle, seat->seat); + wlr_idle_notifier_v1_notify_activity(seat->server->idle, seat->seat); } static void @@ -665,7 +664,7 @@ handle_cursor_frame(struct wl_listener *listener, void *_data) { struct cg_seat *seat = wl_container_of(listener, seat, cursor_frame); wlr_seat_pointer_notify_frame(seat->seat); - wlr_idle_notify_activity(seat->server->idle, seat->seat); + wlr_idle_notifier_v1_notify_activity(seat->server->idle, seat->seat); } static void @@ -676,7 +675,7 @@ handle_cursor_axis(struct wl_listener *listener, void *data) { wlr_seat_pointer_notify_axis(seat->seat, event->time_msec, event->orientation, event->delta, event->delta_discrete, event->source); - wlr_idle_notify_activity(seat->server->idle, seat->seat); + wlr_idle_notifier_v1_notify_activity(seat->server->idle, seat->seat); } static void @@ -686,7 +685,7 @@ handle_cursor_button(struct wl_listener *listener, void *data) { wlr_seat_pointer_notify_button(seat->seat, event->time_msec, event->button, event->state); - wlr_idle_notify_activity(seat->server->idle, seat->seat); + wlr_idle_notifier_v1_notify_activity(seat->server->idle, seat->seat); } static void @@ -701,7 +700,7 @@ process_cursor_motion(struct cg_seat *seat, uint32_t time) { if(node && node->type == WLR_SCENE_NODE_BUFFER) { struct wlr_scene_surface *scene_surface = - wlr_scene_surface_from_buffer(wlr_scene_buffer_from_node(node)); + wlr_scene_surface_try_from_buffer(wlr_scene_buffer_from_node(node)); if(scene_surface != NULL) { surface = scene_surface->surface; if(surface != NULL) { @@ -722,7 +721,7 @@ process_cursor_motion(struct cg_seat *seat, uint32_t time) { drag_icon_update_position(drag_icon); } - wlr_idle_notify_activity(seat->server->idle, seat->seat); + wlr_idle_notifier_v1_notify_activity(seat->server->idle, seat->seat); /* Check if cursor switched tile */ struct wlr_output *c_outp = wlr_output_layout_output_at( @@ -749,7 +748,8 @@ process_cursor_motion(struct cg_seat *seat, uint32_t time) { break; } } - if(seat->cursor_tile != NULL && seat->cursor_tile != c_tile) { + if(seat->cursor_tile != NULL && seat->cursor_tile != c_tile && + seat->server->running) { ipc_send_event(seat->server, "{\"event_name\":\"cursor_switch_tile\",\"old_output\":" "\"%s\",\"old_output_id\":%d," @@ -772,7 +772,7 @@ handle_cursor_motion_absolute(struct wl_listener *listener, void *data) { wlr_cursor_warp_absolute(seat->cursor, &event->pointer->base, event->x, event->y); process_cursor_motion(seat, event->time_msec); - wlr_idle_notify_activity(seat->server->idle, seat->seat); + wlr_idle_notifier_v1_notify_activity(seat->server->idle, seat->seat); } static void @@ -783,7 +783,7 @@ handle_cursor_motion(struct wl_listener *listener, void *data) { wlr_cursor_move(seat->cursor, &event->pointer->base, event->delta_x, event->delta_y); process_cursor_motion(seat, event->time_msec); - wlr_idle_notify_activity(seat->server->idle, seat->seat); + wlr_idle_notifier_v1_notify_activity(seat->server->idle, seat->seat); } static void diff --git a/server.h b/server.h index 9f6eca6..0c067ec 100644 --- a/server.h +++ b/server.h @@ -26,17 +26,19 @@ struct cg_server { struct cg_seat *seat; struct cg_input_manager *input; struct wlr_backend *backend; - struct wlr_idle *idle; + struct wlr_idle_notifier_v1 *idle; struct wlr_idle_inhibit_manager_v1 *idle_inhibit_v1; struct wl_listener new_idle_inhibitor_v1; struct wl_list inhibitors; struct wlr_output_layout *output_layout; + struct wlr_scene_output_layout *scene_output_layout; struct wl_list disabled_outputs; struct wl_list outputs; struct cg_output *curr_output; struct wl_listener new_output; struct wl_list output_priorities; + struct wlr_session *session; struct wlr_renderer *renderer; struct wlr_allocator *allocator; diff --git a/signatures/2.2.1-cagebreak-config.5.sig b/signatures/2.2.1-cagebreak-config.5.sig new file mode 100644 index 0000000000000000000000000000000000000000..4a959e13f13ef5987a24bbb6bc8c7c921738b108 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%YHX-2e&+5J?I6 zOsG4!XQo~c{So||y?|0?M)3u$CcFzF)_LZS7Pymc>5n`Ri!1#cUhO4VUuudz^%-%h zwJ)E8oVzp~{~R2H%V8C~W$3TAx;v0NVmnaz2@|gODF=%M4k9HzfgT0J%nc*ATOvuk z!^W^{qu(kzt+?JcqCkFrso8HuoOP2<1#A5qGZ7Fyw!1{(`!ufUYC+kNvDIJSvudkx zt1zJ{B-`}bP?t`+m!QeZ;R?u7m+ju=9J((NIsU48Dyjsa0^mzL5!)<|({8*RHb3c6 zK}5h3978c|e=VzESOfzCVw^D#1ZD2WXbDL-^YW#P^Bx1BQ8*$87o4V>w5G#o^@jiO z)GdC+b4SbUUd`E;Tz%?J;z>FbK~eWc=%q#}As&+aQm!7l) z$Fd^(t8!#twP8d?1;7`hEe3hq+RHp6G_?qSgxy-8KK=nL%CaSjkeA=mWs|NL9Gn-h EAUQ`3sQ>@~ literal 0 HcmV?d00001 diff --git a/signatures/2.2.1-cagebreak-socket.7.sig b/signatures/2.2.1-cagebreak-socket.7.sig new file mode 100644 index 0000000000000000000000000000000000000000..c2006c13f278568e1f3dcf9c7987f024611c72d6 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%YHX-2e&+5J?I6 zOsG4!XGNqC0Hz9+wC;n0Gi?5@lJY#U^YIRf{|^*8eRtER7;$M0Qb${|8_~tEj))HH z=dd5<`J0kI!Ij%qLvdD_CVl}Rb&js>7+`G$243s*U-wVAgR7{w%0~6-t?7tf3~ahutq3?# zjl|Nnk6uqbhtavYDi!lu$o9qCCdpvf5e(nAVQASsYYp!dEvwi^ee0|PipH{?HXchI z&c75I{w!>=As-Gp;ayjxe&fU)RRjI54>%e7bw_zVx|J=FTFg8d3^+Q)Ofxvn{X9{` zT7~)InN|+RCKblN&hD9P$4FzYL2+kR|KR^ww6mxNAL11jcslAvV-&73!Pr0I1<$lL z)ObUzLz35 zip~M0*p34ZhN?t4s}T>e3mOIDU>T>LC!DVU+Ui#>i8A1$#w3!`u0#r%c;oC~Eh}Y5 zt1J7s=?e<2{yaxgO)t-w_0Fy9B2%x9x=Rh#YFZVD<7AoN_@0;v zOGEK1#gotcETyjpIyp)bKrl1*pxP71ME^Emzz)_#TuEZF7f1Me_x+EZG5{AqR#UAT EKn)iNFaQ7m literal 0 HcmV?d00001 diff --git a/signatures/2.2.1-cagebreak.1.sig b/signatures/2.2.1-cagebreak.1.sig new file mode 100644 index 0000000000000000000000000000000000000000..cdbd7812f165dad1f19ea2b2b9181f53b4825f6f GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%YHX-2e&+5J?I6 zOsG4!XQlBF0Erx3YeY2@5K4l&J*~(huos~pT;6m~#SOJViF|eoCy;;jHjy zl64=uqIcd~)dw3^bjE)7*84}rS-@%%JEj@|uRxA&@B{s(Hv%B0vKLM!-a-2X_zll^ zC!tN`TGxcas0q4$69%gMMqiorHm3FvqUqff^os?^mZVNCS|Vjw(;()AR}Ue5)N#*T zY%wX6f0=6{uqA|=)gBh&JnryQRnF!A(1q?uV7;nZLz!OoZx99ADYs$M(Dv$KxR$|? zuA8V)y(;<1HAUW~j|}*Ld65^fTX}+#N#b=17R#3Z-$DA?e`RK1|Ol)RKy6n_G z<99;!K)q#7lBTggtU8V;yg8Y)pB5YPi4u^+@o=(}rj+l)g{LA6?GmC650m}u_^3ZC zI48;Ea8hF%R2oLfSt{)Il7!jvvGl~)*x=r1zWWTrLR-A$D$vn(8ppR$z`|@*t zdlat~vmxysYApsx)#+>|Qsg0oi)#=i*XRd-{NmC|E78#B>-kRju~Df3AqB)adYaVMaV0QXM>4W1aF{Y4d zW1W@fidlyGUbSc*L+%C|Yr2}$p2)+`)Nu5o(i)#}_j^qf{vW{edYxOxs=x;H&KCvS z+*qq!d`%&AIv{T>A`ls(1OIGZ(ZC5q$Hv+#Oi#Be8|tO(6W_*>g<>m!%ghD;=9!0K z(3N=YHgS$tFUnUAzno+B<&FctvxoC*0G+<`Xoe!pP$F)LEBUut|8P0NE-ppQOYB3a zkOQR*pRyWf9g&I#%kSX;y7E`I>2j4qxt)_aM95c3M)_~buX#*$TCx>WE+&y==Ic^D z2P1jjq%}y$o;~|=o%249x0{WCwq!-o&*BYiqS-I+Hg={^|yMxhAMp#(r@TjP?IuP_3~Vk zdnB5WIxqxUM(1WfPPO#7agQOnJf*P+$lX&SlL}tj@{w|5hnD8j1_}>gi_nUBiv*Ac z1*oj{31I(2Wq%~EkUwErc1mnnLAbJe;0-8ACY7zE^ouZE$yA3d&;{&y6jl@o-a@7g zNO9A&W^oX28CD`};&`U3e2pnGZCyobS!bPflc4?q!XkQcpq9v*k3!X}oSxa|m9SBy zBLDxKoO%w0WJcI@`P`hHf2t44z%nA1ZEre9Q`2>L(|=;MyDvs;ZC}Hhw+rIJL2{(} zzT%?eQDqpytUf&f4k*err?qLMkuyxyq~Yv#`mJik@q@E{4%MtIWr%0~yEg=q!rA=> zaXGR~n77M0^g0bM1qdG$2fU#ftYD<&!x7l4TSBMS)5zVv&&j&j)Skqst%&j>rE}pz hL4_pcau|GV0%E3Ogq#{tp%vU9^+DsLs{GR9^L1@G3Ag|N delta 543 zcmV+)0^t3&1hxc_B7bDxh1~!O2@pvM_)MrfxM!wb5B(ARo4tTiW=8P^ttPw+A=Y{3 zj~2L-Zt0Ia5Q{7Q9A51uSYK+2KJ^)Ks-sK#+ zFA+KZs(LD_1fT-oOFR+VERNG|yc{+^=}|#Mz!DroF>HS=t6*3J0|H{4F%JY~?#E~e zNjLNIrHu0)1Am}VI3foZoTi(!ro(9UhX3%?Eq=vwN6YM9&Dob+edCG*%D(WNNE7%RntaZt&JyZoYs5|CYcGg;@(U`!+{r>dM(bQm!7l)$Fd^(t8!#twP8d?1;7`hEe3hq+RHp6 hG_?qSgc#jgpg#TqEXuMaijbGz(q)sb7#y4zupnI`2VMXG diff --git a/signatures/cagebreak-socket.7.sig b/signatures/cagebreak-socket.7.sig index c2006c13f278568e1f3dcf9c7987f024611c72d6..e46522fc40240c6f9b09db2bf27cfdd64bf76e96 100644 GIT binary patch delta 543 zcmV+)0^t3&1hxc_B7bFVu;Ks;2@pvM_)MrfxM%5#5CF-V!k0qVjS%xt1huT9r$2|3 zT$OuJ5cNENS_}C*d%QA-RB)snkED!%WW&up)p^F4HAv@XGGT{qPFsNAOkaxAC8MHV z;}HhfrUw;N7}gg@R}aAiGAB4B~qjQqjZtHD2aj+DBFz zT*e1-{P2J6*MDn$O;sNot(7}%dvsB)o&2*_^PkwxXu0yB0uHGJaE?CU7L*hu3=LD^ z<(=;%>%*QKN($bD)Jrl$oZ=^iw<#gfIzK=`2Po7Sofu#vDDqcYUdxPi-44B%ZXFoK zN~`c^VRsrnJ1^5VJ2Mr#Vx!ew<6mX@GCkRzpsg-5nSY@Vv^6E$u=xb|YNZIX5ZuXZ zY?6uBJypXYor5KI29?U?pk>oIb(2T0QQA9?3u67W|3Pd}fK>dfuQ4h8{-iQGo*$t{ z0u0{UFgf%A4!l9rH>ARW27GtA3hL>D`AdT~eNf~Q+eU>-5Pp}@Z3~eMNv}-71@`j& hN+Kd&R~UgX)(X>?Jk`_L^D&m?5#cM!Y|GY}pE3?Y04o3h delta 543 zcmV+)0^t3&1hxc_B7bDxh1~!O2@pvM_)MrfxMxMA5CEnMm9*}IgEMUYu9EURvGef` zivJH3I(>K3rx*uf^=J}hFKf#sTRzq=CnI?V#Aa#ze?HFKf z1qNR0^k4T+xP@R%f(t$#u|?pS&y}!mcJKcka!XaDE?fsH4}Ym)&}dV){(T|WFk{Le zi#4mz5e({B!-&d8_3EwZh+YhAx>~IWI8lwn(zcIYPd$gxxw$G8^IFLE#oH#yVAv51 z-?w3C**$9w?-VVo*hhWqtOJV1vYj>_OC8R?6dL|4Y_cIA4m#moSEPR9#2r-w{jLu< z8T)ldc|N+8Eq{?(%sd$kI6B2lGdRxuJW<42h56!{Ru0D|6~@2L?wM@INMo)+ac5Tl z;Qv{)v#16i;uRKnI_gGa6s|JC*gxV0&$Kqwcv0__j)!R)R!uz-LsxNug{HfE1G<+# z2laUQ&0o{do+;>ItsAJ@p9MObx?L5%mm)Wc&H<&^j(-CVhN?t4s}T>e3mOIDU>T>L zC!DVU+Ui#>i8A1$#w3!`u0#r%c;oC~Eh}Y5t1J7s=?e<2{yaxg zO)t-w_0Fy9B2%x9x=Rh#YFZVD<7AoN_@0;vOGEK1#gotcETyjpIyp)bKrl1*pxP71 hME^Emz!(nJL|jQ?u@^`9d-wg1oiYFyKvq+&8$dKf0p$Py diff --git a/signatures/cagebreak.1.sig b/signatures/cagebreak.1.sig index cdbd7812f165dad1f19ea2b2b9181f53b4825f6f..36b2c99c6362034807b3beb0c00a4aa236f3e13e 100644 GIT binary patch delta 543 zcmV+)0^t3&1hxc_B7bFVu;Ks;2@pvM_)MrfxMy_!5CEu?Eyqc}+97z+9jwQ zG=?LB$)6xBq7;qYA0~VSn6jb_lUO(zai%}KYRCd%Xl}Berhmt=pR++@jmz%?k?{l+ zT*06xQw|*Ip89!#w5>}VDxd|u!7n2{C~*hHwg_$7a;EMr`WYcpT%iyr*qo=zKi#J;Q7C@!BwGfOK4j1rq`p#pN}{qk{EmxMlF=*dVeF{0D21#XMOOGOW~@cLINRpP7->NaYty+7Fv-uZ!+?oMe0=$Y8rBN zddQajRrfPRIIdYixy*N*BNSCMX6v3weE^7+81)$5WmP-AUe=ew?=SkKgY#54DXFsr9?geAE{Tr7h0)KRsgm=2G$gXhc&3wH+jmVOg zDTITrvk?Ecfs zA6(vaL^uk~@9cE}3Oq$N?|w?G(&4P|XOeXvyP|jATh#{}R&>UG_tyJI#aX~=5<8|E z0k1%gZtw&BrZ)m0rm`1KCf-5&1^5lmcqgGvS4H+!H}+-s8PKt`N=g!-ldNW_<(tl7qMG;f|5z* zWBgi8SkM0)Gk>f1WD70H7~DgH3AGz5dknk2DJZT?Wuq>}t}#mBw{0Z^S4mhgA|(Kq zBWgk!J)5Pb9_`OojcvU()J(%aR|PDRUTpMO*8(mS$}*ND9~?t_&a_J@hr_H>P~TZD zLSp0Uy}KoBKZYWGRK|!AzUO zXO6-GxLPb|bb>2aB?Z$n>OGI_-0wnx3=va{Ygfn7TLvTdMt|L`3F)$9xMtwVGVe58 zLXnuq@3qN;`^1S8nmLY+FB7K?nR|y>50A$t_?V_r2lbje>Bo)a3IwlF0YBAoc}(EZ zI@03L-%yr3hXZ0cSJoH>SuW05KtZ;vZ{q@-JOA@2cG+-+3P9#@ zkns_jd?UPV5Py%+%sj~Ha~N*-|GQeRyKgdU4LhShXpYzL*c(?P$nb-YKI-=-MPbP8 zUxKoXXL$$fi8xFog4m{Oq|)Dq6wGAcOx?SUeWCClm&gZfL2)W$byv2G9nf>`cMDiP zmmlCQ8McuVD4oO)7*bOAS7%@S?>fGNsTbkw?gGiZOMfy=m~h?Ol_pt6b!a08qW7{` z8oBb#l1cngsaRgFFXKY}2t@I4!@$_2uy#(&n#EOT2&33>w_GZ6K%ERqS;&h0pUp}C zMb21sc@@Z~-r|$cL+Exh he5i+X!5C#`Ms3!3%fN+%`%r9;(fyl8TXlczjIq?=4Q&7b delta 543 zcmV+)0^t3&1hxc_B7bDxh1~!O2@pvM_)MrfxMxDM5B?_x%`G}Ha!4I!oL^tb=Qq^@ zWQf(Fy*H-gQ&yaT?a4gMHK31Y`up;8e|r?K6|*7j9%?NHNY&|VCQ{@fgo|qsCD-T& zfBfRoN-NRO=j-`S__0x`0U^w}8&Sm1!dX6L1wKxFQWs-(qJKYTgR%v2K3Gs1>4+Mt6h9eA#^$*Z!97Z8KMLKY+lj82}8%m z+AB;?w<;UzrGM-b-^P)JVk>~l%mx4EnTKJ}m3ZwoagJ6m%2y7*oMZLnjsw55hx2Oy zoxbyEh9b;RB5sK*`L|mCa5=&*E=A2t>_e!K1Ema~vKnU{k%|V(@8JNt@>jR%a+N~4 zos&64$X7{5`ESavc}#U$vK3Pry=jBYEDWHGfFRo;~|=o%249x0{WCwq!-o z&*BYiqS-I #include #include -#include #include #include #include diff --git a/view.h b/view.h index a3b61ed..b9ec0a1 100644 --- a/view.h +++ b/view.h @@ -28,6 +28,10 @@ struct cg_view { struct cg_tile *tile; struct wlr_scene_tree *scene_tree; + struct wl_listener destroy; + struct wl_listener unmap; + struct wl_listener map; + /* The view has a position in output coordinates. */ int ox, oy; diff --git a/workspace.c b/workspace.c index 1dff244..3f84c6f 100644 --- a/workspace.c +++ b/workspace.c @@ -107,9 +107,6 @@ workspace_free_tiles(struct cg_workspace *workspace) { workspace->focused_tile) { workspace->output->server->seat->cursor_tile = NULL; } - if(workspace->focused_tile == workspace->server->seat->cursor_tile) { - workspace->server->seat->cursor_tile = NULL; - } struct cg_tile *next = workspace->focused_tile->next; free(workspace->focused_tile); workspace->focused_tile = next; diff --git a/xdg_shell.c b/xdg_shell.c index afa3352..79f322f 100644 --- a/xdg_shell.c +++ b/xdg_shell.c @@ -23,12 +23,14 @@ static struct cg_view * popup_get_view(struct wlr_xdg_popup *popup) { while(true) { - if(popup->parent == NULL || - !wlr_surface_is_xdg_surface(popup->parent)) { + if(popup->parent == NULL) { return NULL; } struct wlr_xdg_surface *xdg_surface = - wlr_xdg_surface_from_wlr_surface(popup->parent); + wlr_xdg_surface_try_from_wlr_surface(popup->parent); + if(xdg_surface == NULL) { + return NULL; + } switch(xdg_surface->role) { case WLR_XDG_SURFACE_ROLE_TOPLEVEL: return xdg_surface->data; @@ -244,9 +246,10 @@ handle_xdg_shell_surface_new(struct wl_listener *listener, void *data) { xdg_shell_view->xdg_surface = xdg_surface; xdg_shell_view->map.notify = handle_xdg_shell_surface_map; - wl_signal_add(&xdg_surface->events.map, &xdg_shell_view->map); + wl_signal_add(&xdg_surface->surface->events.map, &xdg_shell_view->map); xdg_shell_view->unmap.notify = handle_xdg_shell_surface_unmap; - wl_signal_add(&xdg_surface->events.unmap, &xdg_shell_view->unmap); + wl_signal_add(&xdg_surface->surface->events.unmap, + &xdg_shell_view->unmap); xdg_shell_view->destroy.notify = handle_xdg_shell_surface_destroy; wl_signal_add(&xdg_surface->events.destroy, &xdg_shell_view->destroy); xdg_shell_view->request_fullscreen.notify = @@ -265,7 +268,10 @@ handle_xdg_shell_surface_new(struct wl_listener *listener, void *data) { struct wlr_scene_tree *parent_scene_tree = NULL; struct wlr_xdg_surface *parent = - wlr_xdg_surface_from_wlr_surface(popup->parent); + wlr_xdg_surface_try_from_wlr_surface(popup->parent); + if(parent == NULL) { + return; + } switch(parent->role) { case WLR_XDG_SURFACE_ROLE_TOPLEVEL:; parent_scene_tree = view->scene_tree; diff --git a/xwayland.c b/xwayland.c index ece9e5a..21cc2ba 100644 --- a/xwayland.c +++ b/xwayland.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -42,8 +41,12 @@ xwayland_view_should_manage(const struct cg_view *view) { static pid_t get_pid(const struct cg_view *view) { struct wlr_xwayland_surface *surf = - wlr_xwayland_surface_from_wlr_surface(view->wlr_surface); - return surf->pid; + wlr_xwayland_surface_try_from_wlr_surface(view->wlr_surface); + if(surf == NULL) { + return -1; + } else { + return surf->pid; + } } static char * @@ -154,8 +157,6 @@ handle_xwayland_surface_destroy(struct wl_listener *listener, void *_data) { wl_container_of(listener, xwayland_view, destroy); struct cg_view *view = &xwayland_view->view; - wl_list_remove(&xwayland_view->map.link); - wl_list_remove(&xwayland_view->unmap.link); wl_list_remove(&xwayland_view->destroy.link); wl_list_remove(&xwayland_view->request_fullscreen.link); xwayland_view->xwayland_surface = NULL; @@ -173,6 +174,25 @@ static const struct cg_view_impl xwayland_view_impl = { .destroy = destroy, }; +static void +handle_xwayland_surface_associate(struct wl_listener *listener, void *data) { + struct cg_xwayland_view *xwayland_view = + wl_container_of(listener, xwayland_view, associate); + struct wlr_xwayland_surface *xsurface = xwayland_view->xwayland_surface; + wl_signal_add(&xsurface->surface->events.unmap, &xwayland_view->unmap); + xwayland_view->unmap.notify = handle_xwayland_surface_unmap; + wl_signal_add(&xsurface->surface->events.map, &xwayland_view->map); + xwayland_view->map.notify = handle_xwayland_surface_map; +} + +static void +handle_xwayland_surface_dissociate(struct wl_listener *listener, void *data) { + struct cg_xwayland_view *xwayland_view = + wl_container_of(listener, xwayland_view, dissociate); + wl_list_remove(&xwayland_view->map.link); + wl_list_remove(&xwayland_view->unmap.link); +} + void handle_xwayland_surface_new(struct wl_listener *listener, void *data) { struct cg_server *server = @@ -190,10 +210,12 @@ handle_xwayland_surface_new(struct wl_listener *listener, void *data) { server); xwayland_view->xwayland_surface = xwayland_surface; - xwayland_view->map.notify = handle_xwayland_surface_map; - wl_signal_add(&xwayland_surface->events.map, &xwayland_view->map); - xwayland_view->unmap.notify = handle_xwayland_surface_unmap; - wl_signal_add(&xwayland_surface->events.unmap, &xwayland_view->unmap); + xwayland_view->associate.notify = handle_xwayland_surface_associate; + wl_signal_add(&xwayland_surface->events.associate, + &xwayland_view->associate); + xwayland_view->dissociate.notify = handle_xwayland_surface_dissociate; + wl_signal_add(&xwayland_surface->events.dissociate, + &xwayland_view->dissociate); xwayland_view->destroy.notify = handle_xwayland_surface_destroy; wl_signal_add(&xwayland_surface->events.destroy, &xwayland_view->destroy); xwayland_view->request_fullscreen.notify = diff --git a/xwayland.h b/xwayland.h index 71a0b7a..79c265a 100644 --- a/xwayland.h +++ b/xwayland.h @@ -13,6 +13,8 @@ struct cg_xwayland_view { struct wl_listener destroy; struct wl_listener unmap; struct wl_listener map; + struct wl_listener associate; + struct wl_listener dissociate; struct wl_listener request_fullscreen; }; From 5dbefccb59d93d3b9683fb243458674a9267da56 Mon Sep 17 00:00:00 2001 From: project-repo Date: Tue, 5 Dec 2023 14:42:22 +0100 Subject: [PATCH 6/8] Release 2.2.3 - Fix positioning of outputs (#66) - Fix version specification of wlroots (#65) - Add version check to prevent #65 in the future --- Bugs.md | 17 +++++++++++++++ Hashes.md | 20 ++++++++++++++++++ README.md | 2 +- man/cagebreak-config.5.md | 2 +- man/cagebreak-socket.7.md | 2 +- man/cagebreak.1.md | 2 +- meson.build | 6 +++--- output.c | 11 +++++++--- release-non-auto-checks/Bugs.md | 4 ++-- release-non-auto-checks/FAQ.md | 4 ++-- release-non-auto-checks/SECURITY.md | 4 ++-- release-non-auto-checks/WLR_XDG_VERSION | 4 ++-- .../acknowledge-contributors | 4 ++-- release-non-auto-checks/changelog-major-minor | 4 ++-- release-non-auto-checks/internal-wiki | 4 ++-- release-non-auto-checks/release-note | 4 ++-- .../reproducibility-checked | 4 ++-- .../security-to-man-page-info-transfer | 4 ++-- release-non-auto-checks/version-restrictions | 2 ++ signatures/2.2.2-cagebreak-config.5.sig | Bin 0 -> 566 bytes signatures/2.2.2-cagebreak-socket.7.sig | Bin 0 -> 566 bytes signatures/2.2.2-cagebreak.1.sig | Bin 0 -> 566 bytes signatures/2.2.2-cagebreak.sig | Bin 0 -> 566 bytes signatures/cagebreak-config.5.sig | Bin 566 -> 566 bytes signatures/cagebreak-socket.7.sig | Bin 566 -> 566 bytes signatures/cagebreak.1.sig | Bin 566 -> 566 bytes signatures/cagebreak.sig | Bin 566 -> 566 bytes 27 files changed, 74 insertions(+), 30 deletions(-) create mode 100644 release-non-auto-checks/version-restrictions create mode 100644 signatures/2.2.2-cagebreak-config.5.sig create mode 100644 signatures/2.2.2-cagebreak-socket.7.sig create mode 100644 signatures/2.2.2-cagebreak.1.sig create mode 100644 signatures/2.2.2-cagebreak.sig diff --git a/Bugs.md b/Bugs.md index ee38c63..be04464 100644 --- a/Bugs.md +++ b/Bugs.md @@ -1235,3 +1235,20 @@ configuration was a NoOp. Starting with version 2.2.1, the calibration matrix can be set as documented. Thanks to Oliver Friedmann for providing a pull request. + +## Issue 66 + + * github issue number: #65 + * Fixed 2.2.3 + +In Cagebreak 2.2.2 the compatible wlroots versions were wrongly specified. +To stop this from reoccurring, we have added a check to our release checks. + +## Issue 67 + + * github issue number: #66 + * Fixed 2.2.3 + +In Cagebreak 2.2.2 dual monitors were mirrored instead of extended, changing +established behaviour. + diff --git a/Hashes.md b/Hashes.md index ace89e4..867692b 100644 --- a/Hashes.md +++ b/Hashes.md @@ -1,5 +1,25 @@ # Hashes +2.2.3 cagebreak + + * sha 256: 265a9d09622272ca6ea79ddcdbdc6003704106814eb05a2b7547a77a982263de + * sha 512: 757f837a7e6ddd71fed88c4e1aab5cab9d4d07e8b76f280eed9afa35a2eaee23c0553299fe49a0139c754179d0df68c1303725f1f909921d078516e14ba3f21f + +2.2.3 cagebreak.1 + + * sha 256: 275698641476efa40fc1b33a8025e6dbba3ec931fbaf0a627c0748dad987ed4d + * sha 512: 617891ded06657e31daefee84a03191ad6e03892118f1790a5ebaa6e847c4d18d4b6849edc00841bd68abc9e0e0a111153efe102db02ce3d408c903b0d045927 + +2.2.3 cagebreak-config.5 + + * sha 256: 5967e9131d1ee16ffa046a732911c902e41f2e18f3170d11a47b9be596b4978a + * sha 512: 6d3c5fbb2b95a75d7c5a8ed8b5922cfcc4135857b389652572c5d9c211c6da9cf8ef0b5dc0e8eaa540c6b1c2dd215f512df2ef49ce80c34e8e5ad170bfb7134e + +2.2.3 cagebreak-socket.7 + + * sha 256: cb1bde8a6fb2a1fa2b7b8db7fdef9b933cd471ca604e15d1dd9133859fa6eea3 + * sha 512: 1d99672cb7ac7323790d47986d206bf8c392698db0cd52978963deb6e85118c6822e2d45c7fa66e8636e95214f8893d963a3157ca24239d2fd2d78b1e26f11e7 + 2.2.2 cagebreak * sha 256: 98e0dfe870a7242fdf7c6fb1a5c520cfe7d1154b3f139560da6cb86b2430b2a0 diff --git a/README.md b/README.md index f2fd64d..1ca4ce5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Cagebreak: A Wayland Tiling Compositor -[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.2.2)](https://repology.org/project/cagebreak/versions) +[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.2.3)](https://repology.org/project/cagebreak/versions) ## Quick Introduction diff --git a/man/cagebreak-config.5.md b/man/cagebreak-config.5.md index c04c757..d5b4969 100644 --- a/man/cagebreak-config.5.md +++ b/man/cagebreak-config.5.md @@ -1,4 +1,4 @@ -cagebreak-config(5) "Version 2.2.2" "Cagebreak Manual" +cagebreak-config(5) "Version 2.2.3" "Cagebreak Manual" # NAME diff --git a/man/cagebreak-socket.7.md b/man/cagebreak-socket.7.md index d61e498..19365d6 100644 --- a/man/cagebreak-socket.7.md +++ b/man/cagebreak-socket.7.md @@ -1,4 +1,4 @@ -cagebreak-socket(7) "Version 2.2.2" "Cagebreak Manual" +cagebreak-socket(7) "Version 2.2.3" "Cagebreak Manual" # NAME diff --git a/man/cagebreak.1.md b/man/cagebreak.1.md index 7e0c421..bdd469f 100644 --- a/man/cagebreak.1.md +++ b/man/cagebreak.1.md @@ -1,4 +1,4 @@ -cagebreak(1) "Version 2.2.2" "Cagebreak Manual" +cagebreak(1) "Version 2.2.3" "Cagebreak Manual" # NAME diff --git a/meson.build b/meson.build index e28557e..aeb3346 100644 --- a/meson.build +++ b/meson.build @@ -3,7 +3,7 @@ project( 'cagebreak', 'c', -version : '2.2.2', +version : '2.2.3', license : 'MIT', default_options : ['c_std=c11', 'warning_level=3'] ) @@ -55,7 +55,7 @@ if is_freebsd ) endif -wlroots = dependency('wlroots', version: ['>=0.16.1', '< 0.17.1']) +wlroots = dependency('wlroots', version: ['>=0.17.0', '< 0.18.0']) wayland_protos = dependency('wayland-protocols', version: '>=1.14') wayland_server = dependency('wayland-server') wayland_cursor = dependency('wayland-cursor') @@ -260,7 +260,7 @@ install_data('LICENSE', install_dir : '/usr/share/licenses/' + meson.project_nam if get_option('man-pages') scdoc = find_program('scdoc') - secssinceepoch = 1701680868 + secssinceepoch = 1701768836 shcommand = 'export SOURCE_DATE_EPOCH=' + secssinceepoch.to_string() + ' ; @0@ < @INPUT@'.format(scdoc.path()) sh = find_program('sh') mandir1 = join_paths(get_option('mandir'), 'man1') diff --git a/output.c b/output.c index d4fef70..0a482f0 100644 --- a/output.c +++ b/output.c @@ -282,15 +282,20 @@ output_apply_config(struct cg_server *server, struct cg_output *output, wlr_output_commit(wlr_output); return; } - wlr_output_layout_add(server->output_layout, wlr_output, config->pos.x, - config->pos.y); + struct wlr_output_layout_output *lo = wlr_output_layout_add( + server->output_layout, wlr_output, config->pos.x, config->pos.y); + wlr_scene_output_layout_add_output(server->scene_output_layout, lo, + output->scene_output); /* Since the size of the output may have changed, we * reinitialize all workspaces with a fullscreen layout */ for(unsigned int i = 0; i < output->server->nws; ++i) { output_make_workspace_fullscreen(output, i); } } else { - wlr_output_layout_add_auto(server->output_layout, wlr_output); + struct wlr_output_layout_output *lo = + wlr_output_layout_add_auto(server->output_layout, wlr_output); + wlr_scene_output_layout_add_output(server->scene_output_layout, lo, + output->scene_output); struct wlr_output_mode *preferred_mode = wlr_output_preferred_mode(wlr_output); diff --git a/release-non-auto-checks/Bugs.md b/release-non-auto-checks/Bugs.md index 9388d0a..16e03cd 100644 --- a/release-non-auto-checks/Bugs.md +++ b/release-non-auto-checks/Bugs.md @@ -1,2 +1,2 @@ -2.2.2 -2023-12-04 +2.2.3 +2023-12-05 diff --git a/release-non-auto-checks/FAQ.md b/release-non-auto-checks/FAQ.md index 9388d0a..16e03cd 100644 --- a/release-non-auto-checks/FAQ.md +++ b/release-non-auto-checks/FAQ.md @@ -1,2 +1,2 @@ -2.2.2 -2023-12-04 +2.2.3 +2023-12-05 diff --git a/release-non-auto-checks/SECURITY.md b/release-non-auto-checks/SECURITY.md index 9388d0a..16e03cd 100644 --- a/release-non-auto-checks/SECURITY.md +++ b/release-non-auto-checks/SECURITY.md @@ -1,2 +1,2 @@ -2.2.2 -2023-12-04 +2.2.3 +2023-12-05 diff --git a/release-non-auto-checks/WLR_XDG_VERSION b/release-non-auto-checks/WLR_XDG_VERSION index 9388d0a..16e03cd 100644 --- a/release-non-auto-checks/WLR_XDG_VERSION +++ b/release-non-auto-checks/WLR_XDG_VERSION @@ -1,2 +1,2 @@ -2.2.2 -2023-12-04 +2.2.3 +2023-12-05 diff --git a/release-non-auto-checks/acknowledge-contributors b/release-non-auto-checks/acknowledge-contributors index 9388d0a..16e03cd 100644 --- a/release-non-auto-checks/acknowledge-contributors +++ b/release-non-auto-checks/acknowledge-contributors @@ -1,2 +1,2 @@ -2.2.2 -2023-12-04 +2.2.3 +2023-12-05 diff --git a/release-non-auto-checks/changelog-major-minor b/release-non-auto-checks/changelog-major-minor index 9388d0a..16e03cd 100644 --- a/release-non-auto-checks/changelog-major-minor +++ b/release-non-auto-checks/changelog-major-minor @@ -1,2 +1,2 @@ -2.2.2 -2023-12-04 +2.2.3 +2023-12-05 diff --git a/release-non-auto-checks/internal-wiki b/release-non-auto-checks/internal-wiki index 9388d0a..16e03cd 100644 --- a/release-non-auto-checks/internal-wiki +++ b/release-non-auto-checks/internal-wiki @@ -1,2 +1,2 @@ -2.2.2 -2023-12-04 +2.2.3 +2023-12-05 diff --git a/release-non-auto-checks/release-note b/release-non-auto-checks/release-note index 9388d0a..16e03cd 100644 --- a/release-non-auto-checks/release-note +++ b/release-non-auto-checks/release-note @@ -1,2 +1,2 @@ -2.2.2 -2023-12-04 +2.2.3 +2023-12-05 diff --git a/release-non-auto-checks/reproducibility-checked b/release-non-auto-checks/reproducibility-checked index 9388d0a..16e03cd 100644 --- a/release-non-auto-checks/reproducibility-checked +++ b/release-non-auto-checks/reproducibility-checked @@ -1,2 +1,2 @@ -2.2.2 -2023-12-04 +2.2.3 +2023-12-05 diff --git a/release-non-auto-checks/security-to-man-page-info-transfer b/release-non-auto-checks/security-to-man-page-info-transfer index 9388d0a..16e03cd 100644 --- a/release-non-auto-checks/security-to-man-page-info-transfer +++ b/release-non-auto-checks/security-to-man-page-info-transfer @@ -1,2 +1,2 @@ -2.2.2 -2023-12-04 +2.2.3 +2023-12-05 diff --git a/release-non-auto-checks/version-restrictions b/release-non-auto-checks/version-restrictions new file mode 100644 index 0000000..16e03cd --- /dev/null +++ b/release-non-auto-checks/version-restrictions @@ -0,0 +1,2 @@ +2.2.3 +2023-12-05 diff --git a/signatures/2.2.2-cagebreak-config.5.sig b/signatures/2.2.2-cagebreak-config.5.sig new file mode 100644 index 0000000000000000000000000000000000000000..811fe372025fbcaaa8f497ef6bc25d9d37641be9 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%dKm;s6Q>5J?I6 zOsG4!XJMfb0E>`au^^z8E*v#Fd9jxSr%FdRbeic+={rm$M))f-=$6&xrq{OVP9ncaEXyy zAm(BmYFS|7U3ot(_njmrb6^i@efjvv!bFfE-9V|jzLe+S=)^oS4@KmC#38hfayR0W z7!ulWP+;}9dcB4!eG$@c=vPpaGFbKUT$6hwnvgm$1X@PtW<=F$cV4`7SXig}9!kOl>)to8|D|3hUYuaG}sS$0ZnSwXn6d*BTy zNhX!8r1Xn0UCC63EYJn)c@$O@3Eo1c4M=g*v}SP-Zy8o1Y~pyPt9*?qGHqQ&YFTHU zb(5g}0m34BaiEsSnvX)&tDK(M=asNgq$2vc++CFyDvs;ZC}Hhw+rIJL2{(}zT%?eQDqpytUf&f4k*err?qLMkuyxyq~Yv# z`mJik@q@E{4%MtIWr%0~yEg=q!rA=>aXGR~n77M0^g0bM1qdG$2fU#ftYD<&!x7l4 zTSBMS)5zVv&&j&j)Skqst%&j>rE}pzL4_pca(rz9Vy0q*oElM~72F{8LF1&V{Li0{{R3 literal 0 HcmV?d00001 diff --git a/signatures/2.2.2-cagebreak-socket.7.sig b/signatures/2.2.2-cagebreak-socket.7.sig new file mode 100644 index 0000000000000000000000000000000000000000..e46522fc40240c6f9b09db2bf27cfdd64bf76e96 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%dKm;s6Q>5J?I6 zOsG4!XX%O%0LhxdmqOQ#5c5z3wXCA2KZlfDm3vSS^*n!C3;8>HyfTMWaHJiNq>O-M z!_7U_dB&JENatoUVTW!`TY%q8Uy9QuqoQ8p5eC?%2NhHp))z-t55WX7Cr>E?I}sDZ zlY5I6_9_-Ev{PoIb(2T0QQA9? z3u67W|3Pd}fK>dfuQ4h8{-iQGo*$t{0u0{UFgf%A4!l9rH>ARW27GtA3hL>D`AdT~ zeNf~Q+eU>-5Pp}@Z3~eMNv}-71@`j&N+Kd&SAj6r3e%T7)zjJYF_z^K;Va5)%hs8n EGW&xDb^rhX literal 0 HcmV?d00001 diff --git a/signatures/2.2.2-cagebreak.1.sig b/signatures/2.2.2-cagebreak.1.sig new file mode 100644 index 0000000000000000000000000000000000000000..36b2c99c6362034807b3beb0c00a4aa236f3e13e GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%dKm;s6Q>5J?I6 zOsG4!XLSA$0H~8K$4S51D7#=L&$@HYeL^A-m#)@d(K;Fs##`LxdqzbB9uTZji zPb2qRTpo|xFBiRf@{*5~n_wlc^jwkJC8!)Uh9iQ>pCBxv6ph^agn)VAE>uBdeTNMl;?UQ-T-}k#R?8&lXydHg7WWoki+Z5NaB7b$ZB_{Z;ofML4cmLAlI#oFf!fG-m6bNqqo_ zl^FFH-epxgzFyXs!tXEo*?IS*Hgh&1Hi><4ys%p+`6EInLc%Wz*=!h!Q)fT0T5J?I6 zOsG4!X9fQd0J=kb54SFRiT$(tSOAYXE>H=2ikF(>)G421sRWpML`=yU9(L`jSXq;m zCDv57c`KO24HQJXhzxF<`#$z$DTV35Oq;`Jj=}=CS}bUEf-6@g1=BO?J&)|%??QnL z5mSq6SI5y?1|#=I-K+`evSYYr;K?%YG+aWFn8)w6$%FgEi4&SRj*c%Arwy5VhglDg z$0qogrcwv>nmg&ojpPahuTcR%)p2=D;L$qL;?LhumOO_8VmVjV7zJ4_&ROIFJbYMm z2nxv_y4xno_B!bwcYoyZOhZM|Y;7r}S zjeVi;AD74nY(a4w_GZ6K%ERqS;&h0pUp}CMb21sc@@Z~-r|$cL+Exhe5i+X!DVJfZPs|pz=eeSP;8IU{hLQyb${%P Ev8itpxBvhE literal 0 HcmV?d00001 diff --git a/signatures/cagebreak-config.5.sig b/signatures/cagebreak-config.5.sig index 811fe372025fbcaaa8f497ef6bc25d9d37641be9..6d7f6c16507165c9ac9b5646e45cb4cc3a89863b 100644 GIT binary patch delta 542 zcmV+(0^$9(1hxc_BY$rm&HxGt5J?I6OsG4!XG8W6|9R#;J{FE-UT8#I!Fi4#zi*ov z9Xy@$5_IOwHC)DCP)s(==UVe6N7@7-A^-dEBpXnVsr`4u3uKdL`06E&J>;c^ zGLT`#D);5PsU0#YBhuT9^r&UtpG(X0;-JsYjD3_^N;Ir-Z4`a^&NZPoP-LJkDQJ$o ztQ%ax0n<}on}0qm-E=?OPj+n3|IHg!ysgT4hzK_?Sq&d!Kgo1rnqfYJm8tUa_@E0X zGwBQWd8UZnmlLz7;_pf@-9yZ31Xv5g2Dp2_lGah%M#l3=wKveJy6lK`1$QE)a>i+V9|LMnm=&&EfQ)cl5iM@4?FK45J?I6OsG4!XJMfb0E>`au^^z8E*v#Fd9jxSr%FdR zbeic+={rm$M))f-=$6&xrq{OVP9ncaEXyyAm(BmYFS|7U3ot(_kW!vCUam9YJK_m$ihUB zA>BZ!y1ta>;ON9WG7m-MeZ(QOj&e8RlNb`(a8O|Nw|c#XDt!^sZ|GN0lQLNK@?4X9 zB$|*qFa%mg=Vm`nwe+}gk0H4{rLhRe-BTiy3SQgtk#b{)mgdq13J+k5(29AB1ds*= zsI2x0VE;p9B!91vKVeyRN^Ds{xUzfT4Jb(_m93=oi!fcuREI3k1?+hgRul=|LZ%H! zanrPBaS(4ARw8WTc&4j-jVUs1T}5hHXPtGEp#A~EB6@M4mdKiqLe;CBp4sP>uu-HU z|NoqvdJctTM%Z-u+?<_%st?M*G9s33Z#qX)({*^$Vt=)}FGg%_U&ETW3*y2-a-{mc z;-ceGWf;P&K0N^rD9SXawP~c0GfdT_;p}$$t!l;bgR^}O)vPRKh-d!0Hw2Qx+5HA_ zIkHTcx63*7It?!c2p<#&yrCJaV5H^45!kC+LZ{Z#$lbor$-3Cop2VoFi1H$(bKyck gg(T&2d>3s3Vy0q*oElM~72F{8LF1&V{L2q+@7Wxi}6Hz zo4QkhM=B3~=^{TsW09d;k=38L|LYbj1!=3-gW5sDChrA{ofASO33n6-ALc z``%qt;VT?b7m1kQtJ1;6F#huuPxn_#&+lo-{`EPe&XpXzX=C8`hoUcR6|+`!a|PN> zciV6IEV}yy0L@;GyI|86s8Dz`uciE$nd4J_no9tZ8B}nzsNyn-471wYEU68SG;1S3J5OeK%SL1K#C$M@LKZpTVt;c1ylX$o=)VKke_W<%YFJE| znZp2ZU7>pX<<~}N74ZYNtoct%N@|a#bq@LI-V}Ede@>@3<6^wVZZbir4 gMmn>Z>=$cw@HwBgkA;5J?I6OsG4!XX%O%0LhxdmqOQ#5c5z3wXCA2KZlfD zm3vSS^*n!C3;8>HyfTMWaHJiNq>O-M!_7U_dB&JENatoUVTW!`TY%q8Uy9QuqoQ8p z5eC?%2NhHp))z-t55WX7Cr>E?I}sDZlY5I6_9_-Ev{PX_4ygoijy~WPloTWk4O8Le zo$n*-!=4*T3f_d&OEN>8;wOc-DIw81KR`hTDAX987+@nP@>g13%Zzp14!xId9T>$* ztMF%GcN#uBFVi+VGZnjHqt#yHUuF3+J=vb1tu8Z}p??pwH6`1y`2_fCr3kYS+{tWg zl8M(nRl^~jgC%wbmCEIyWz#rylSi*n+B=U6V*RxLL2OWfRQ#;3F)982q%u05AE8GA z4Bp!?IrISzyg}19q{4v)e0RDE>gj{|OM^CjP~;NZMukccewWd03y};-uS~%O_VWEo gA|hT_ffq2=3e%T7)zjJYF_z^K;Va5)%hs8nGCKSJw*UYD diff --git a/signatures/cagebreak.1.sig b/signatures/cagebreak.1.sig index 36b2c99c6362034807b3beb0c00a4aa236f3e13e..14ac7ab7fd60b8337eaa18e060f7a24402925528 100644 GIT binary patch delta 542 zcmV+(0^$9(1hxc_BY$rm%>W7s5J?I6OsG4!XL#rj{T+Al-oPBN+x!MHM~QdkHzBr| zCl+us_ro^WM3!tDhfsBw7Pq%1Z{ zRD62N4N=i9+{y)3(Ru$V?xv1!7mfQcC$)a&YY~(X8+6uKa(^@a*FaJm=k2d5e#8K? zBk6`gZwAL|l3suRPlWha7l0#wTP{f8V%IzhA|Hj?QK3mn&r+$yiSr?mJIkC)*B8*l z^?kvE-xrH4amP7nO~E_Tu1Dh%2Xwp3baa*}C6f&Akz5Rxnu1dnOJ4}*c_2nu#Urv8 z0_Wt1JoS%$CVv2)?ob#t9F1I9CwmObFHhlK0B=@Gy2fFG=nutuJn!u0rEjd%hRr0L zDV&tKE^s7L=meU@45+$n^2=q2Z zKGSc-f6OXa(-RiFI5$3$B4FvEw0qnbznO;dx_atDeSg03=IHb!5N(c}OK?nzC0we5 ze-Mb7on$b#S2mp2$R?^F3`0olF1~xBqx2rE_C%c_i$VvgIG;0l7$1L9gu*LB)Yn5= zgL)0@BBh-*cY6YeN2O~J+*Fv<3Q0v*FLa<8B3v8CS{4i{UeNFo0`+wHghwX}jEorq g{nwU}ofqGe=tDjJ_J`^&YaK-^$7k{&2ct;QrwVKVasU7T delta 542 zcmV+(0^$9(1hxc_BY$nM;s6Q>5J?I6OsG4!XLSA$0H~8K$4S51D7#=L&$@HYeL^A- zm#)@d(K;Fs##`LxdqzbB9uTZjiPb2qRTpo|xFBiRf@{*5~n_wlc^jwkJC8!)U zh9iQ>pCBxv6ph^QxYG8gg}d z$d>(8_cKK}u3163%y*n46jd~4>z+w{0Em?s^%&k|RXe_3)|bNXFZ$Ve_oOy+HX$~N zeQ~_7TPXP>LMKAPFA3Rf7>ZM8Kd@Zx1!K1T8=51AF&=8-?(k8|=EJiVF?YLGRHU}Mc3##Z*-{!b*WBZ}?8(nZozCMtk6kL)X*~bp gq}hT_G#3N4Gj~13RXcEo3$FSz)?Jh1$@?FoWvD9$QUCw| diff --git a/signatures/cagebreak.sig b/signatures/cagebreak.sig index ca4ae146f6b80b7f5a7a9a0bf899cdcdbf702f21..b06130553f46759a6b0c15d2ec5e4a7f3fe3714d 100644 GIT binary patch delta 542 zcmV+(0^$9(1hxc_BY$rm%>W7s5J?I6OsG4!XRMG9{S^4?G%^Y3m5el0Q_7oaILK}l zji>EKqg2qNLmPHp`AzALIN3h@;a~B)ymaY@9KZ9Z?6L?yxsZ1pU=68cL;~wowNV!k z(}NRXx`~nO6O%vds-sG3-$iS`TqsdTy69<hg$9cnnvIX5buFPT?}bec==AAn%a)WHBcL;2;Q62OBxqO(ho2hv)@zL66N; zf(fQUFNaz;Kj!_GB!V1(u^jHTIy*BgL2T918hT0bUVf*l#8WDb5s0L1(=6n|n&9EXz2OXhW(;d5tfbi<^( z!ohzPb!2@G7VUn&`)d4m4?A&lzlu`&pJa~C+7%PdLU&*W1~(ns z?No(pk1)m;|NP?m;@)x*!ANT243?wj$lPbRVIgrP!IDVo?z54G1ivR!s delta 542 zcmV+(0^$9(1hxc_BY$nM;s6Q>5J?I6OsG4!X9fQd0J=kb54SFRiT$(tSOAYXE>H=2 zikF(>)G421sRWpML`=yU9(L`jSXq;mCDv57c`KO24HQJXhzxF<`#$z$DTV35Oq;`J zj=}=CS}bUEf-6@g1=BO?J&)|%??QnL5mSq6SI5y?1|#=I-G8hJ>9S+EX5h&(?=)OO zk(kHtwaJ6~#EBD{IgXAm6Q>QCdxu#MkH;qXn5I$(^_n~B$BpC)1g}v6Kh<%0OyJQv z(&EqGP?kK017bN>)))m@F3wrx0z7HslK<06f z@e!GPBfM=8kAKn3Jjm&D7;g9fyIQZiZ!&8QJEK2nj@R(m8&@O9@Pm&&>h~r^VaV-Y zg0hTfc?au>I7}ph*rscw(%**^%w*t9-Mfu_q3|D<$OmjeaVleVSGJ5D&~xs03s^pv zAK)z+wviJkox~3qQd0Lmp-2mk;8 From d19c32d7a4ce9e884dc0b82c698f6abfeddfc18e Mon Sep 17 00:00:00 2001 From: project-repo Date: Fri, 26 Jan 2024 10:53:03 +0000 Subject: [PATCH 7/8] Release 2.3.0 Functionality: * Add configuration to anchor position of messages (#60, 71 in Bugs.md). * Add output priorisation (#38, 68 in Bugs.md). * Print whether output is active in dump. Bug Fixes: * Fix gamma control (72 in Bugs.md). * Add missing commands to example config. * Add message_config to dump output. Example Scripts: * Add screenshot script. * Make example scripts standalone. Documentation: * Escape html tags in config man page. (#68, 69 in Bugs.md) * Improve README.md (#62, 70 in Bugs.md). * Improve SECURITY.md. * Add CONTRIBUTING.md (#62, 70 in Bugs.md). * FAQ: Add Firefox screenshare instructions for wayland. * FAQ: Add wlroots downgrading instructions for workaround in case of temporary wlroots incompatibility. * Update copyright notices to 2024. Development Tooling: * Add new gpg keys (signed by the old ones). * Add PR template. * Add dev-FAQ. * Remove now-unnecessary fanalyzer pragmas. --- Bugs.md | 52 ++ CONTRIBUTING.md | 464 ++++++++++++ Changelog.md | 184 +++-- FAQ.md | 37 +- Hashes.md | 20 + LICENSE | 2 +- README.md | 690 +++--------------- SECURITY.md | 69 +- cagebreak.c | 23 +- docs/dev-FAQ.md | 67 ++ docs/pull_request_template.md | 26 + example_scripts/screenshot_script | 44 ++ ...orkspace_views.sh => show_workspace_views} | 20 +- examples/config | 58 +- fuzz/execl_override.c | 2 +- fuzz/fuzz-lib.c | 4 +- fuzz/fuzz-lib.h | 2 +- fuzz/fuzz-parse.c | 2 +- idle_inhibit_v1.c | 9 +- idle_inhibit_v1.h | 2 +- img/archwiki.svg | 1 + img/aur.svg | 1 + img/contributing.svg | 1 + img/faq.svg | 1 + img/mail.svg | 1 + img/manuals.svg | 1 + img/web-artefacts.svg | 1 + img/web-open-issue.svg | 1 + input.h | 2 +- input_manager.c | 2 +- input_manager.h | 2 +- ipc_server.c | 2 +- ipc_server.h | 2 +- keybinding.c | 150 ++-- keybinding.h | 2 +- keys/cagebreak@project-repo.co.pub | 157 ++-- keys/cagebreak@project-repo.co.pub-legacy-4 | 87 +++ ...gebreak_signing_key_13@project-repo.co.pub | 76 ++ ...gebreak_signing_key_14@project-repo.co.pub | 76 ++ libinput.c | 4 +- man/cagebreak-config.5.md | 154 ++-- man/cagebreak-socket.7.md | 176 ++++- man/cagebreak.1.md | 10 +- manuals.md | 5 + meson.build | 24 +- meson_options.txt | 4 +- message.c | 105 ++- message.h | 10 +- output.c | 333 ++++++--- output.h | 21 +- pango.c | 2 +- pango.h | 2 +- parse.c | 41 +- parse.h | 2 +- release-non-auto-checks/Bugs.md | 4 +- release-non-auto-checks/FAQ.md | 4 +- release-non-auto-checks/SECURITY.md | 4 +- release-non-auto-checks/WLR_XDG_VERSION | 4 +- .../acknowledge-contributors | 4 +- release-non-auto-checks/archwiki | 2 + release-non-auto-checks/changelog-major-minor | 4 +- release-non-auto-checks/internal-wiki | 4 +- release-non-auto-checks/release-note | 4 +- .../reproducibility-checked | 4 +- .../security-to-man-page-info-transfer | 4 +- release-non-auto-checks/version-restrictions | 4 +- scripts/adjust-epoch | 2 +- scripts/create-release-artefacts | 2 +- scripts/create-signatures | 2 +- scripts/fuzz | 2 +- scripts/git-tag | 2 +- scripts/install-development-environment | 2 +- scripts/output-hashes | 2 +- scripts/set-version | 4 +- seat.c | 75 +- seat.h | 2 +- server.c | 5 +- server.h | 5 +- signatures/2.2.3-cagebreak-config.5.sig | Bin 0 -> 566 bytes signatures/2.2.3-cagebreak-socket.7.sig | Bin 0 -> 566 bytes signatures/2.2.3-cagebreak.1.sig | Bin 0 -> 566 bytes signatures/2.2.3-cagebreak.sig | Bin 0 -> 566 bytes signatures/cagebreak-config.5.sig | Bin 566 -> 566 bytes signatures/cagebreak-socket.7.sig | Bin 566 -> 566 bytes signatures/cagebreak.1.sig | Bin 566 -> 566 bytes signatures/cagebreak.sig | Bin 566 -> 566 bytes test/arguments | 2 +- test/build-w-o-warnings | 2 +- test/build-w-o-xwayland | 2 +- test/check-artefacts | 2 +- test/clang-format | 2 +- test/copyright-license | 4 +- test/environment-variables | 2 +- test/git-tag | 2 +- test/gpg-signatures | 2 +- test/gpg-validity | 24 +- test/hashes-md | 2 +- test/illegal-strings | 14 +- test/man-pages | 37 + test/non-auto-tests | 2 +- test/scan-build | 2 +- test/script-executability | 19 + test/script-header | 17 + test/shellcheck | 2 +- test/testing-configurations/-c-config | 2 +- .../cb_script_header.sh | 4 +- test/testing-configurations/config | 2 +- test/testing-configurations/env-var-config | 2 +- test/testing-configurations/my-scan-build | 2 +- test/versions | 2 +- util.c | 2 +- util.h | 2 +- view.c | 26 +- view.h | 2 +- workspace.c | 31 +- workspace.h | 3 +- xdg_shell.c | 24 +- xdg_shell.h | 2 +- xwayland.c | 24 +- xwayland.h | 2 +- 120 files changed, 2310 insertions(+), 1348 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 docs/dev-FAQ.md create mode 100644 docs/pull_request_template.md create mode 100755 example_scripts/screenshot_script rename example_scripts/{show_workspace_views.sh => show_workspace_views} (54%) mode change 100644 => 100755 create mode 100644 img/archwiki.svg create mode 100644 img/aur.svg create mode 100644 img/contributing.svg create mode 100644 img/faq.svg create mode 100644 img/mail.svg create mode 100644 img/manuals.svg create mode 100644 img/web-artefacts.svg create mode 100644 img/web-open-issue.svg create mode 100644 keys/cagebreak@project-repo.co.pub-legacy-4 create mode 100644 keys/cagebreak_signing_key_13@project-repo.co.pub create mode 100644 keys/cagebreak_signing_key_14@project-repo.co.pub create mode 100644 manuals.md create mode 100644 release-non-auto-checks/archwiki mode change 100644 => 100755 scripts/install-development-environment create mode 100644 signatures/2.2.3-cagebreak-config.5.sig create mode 100644 signatures/2.2.3-cagebreak-socket.7.sig create mode 100644 signatures/2.2.3-cagebreak.1.sig create mode 100644 signatures/2.2.3-cagebreak.sig create mode 100644 test/man-pages create mode 100644 test/script-executability create mode 100644 test/script-header rename {example_scripts => test/testing-configurations}/cb_script_header.sh (89%) diff --git a/Bugs.md b/Bugs.md index be04464..4ecef6c 100644 --- a/Bugs.md +++ b/Bugs.md @@ -1252,3 +1252,55 @@ To stop this from reoccurring, we have added a check to our release checks. In Cagebreak 2.2.2 dual monitors were mirrored instead of extended, changing established behaviour. +## Issue 68 + + * github issue numner: #38 + * Fixed: 2.3.0 + +After extensive discussion of how to deal with turning off outputs, the +output command was ammended by two settings (permanent & peripheral). +See man pages for details. + +Thanks to sodface for the great cooperation. + +## Issue 69 + + * github issue numner: #68 + * Fixed: 2.3.0 + +The config man page (5) was badly formatted up to version 2.3.0. + +Particularly unescaped html tags caused not all information to be +shown in the web browser view of our repo. + +## Issue 70 + + * github issue numner: #62 + * Fixed: 2.3.0 + +The README contained a few non-intuitive phrases up to version 2.3.0. + +To alleviate this, the following changes were made: + +- Rephrase README.md (for more clarity) +- Add CONTRIBUTING.md (to remove dev detail from README) +- Add PR template (to present relevant info during a PR) + +## Issue 71 + + * github issue numner: #60 + * Fixed: 2.3.0 + +Cagebreak up to 2.3.0 did not have configuration for the message location. + +This has been added through the initiative of unsigned-enby to improve +accessibility. + +## Issue 72 + + * github issue numner: N/A + * Fixed: 2.3.0 + +A Cagebreak version before 2.3.0 broke the gamma toolkit used to tune the +monitor colors. + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..4da2ae2 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,464 @@ +# Contributing + + * [Open an issue](https://github.com/project-repo/cagebreak/issues/new) and state your feature request. + We will get back to you. + * Read this document, [README.md](README.md) and [docs/dev-FAQ.md](docs/dev-FAQ.md). + * Ask before opening a pull request. We might not accept your + code and it would be sad to waste the effort. + * Respect the [Code of Conduct](CODE_OF_CONDUCT.md) (To date, we never + had to intervene - Please keep it that way!) + +## Good First Contributions + + * Reviews are always welcome. + * Read the code. + * Read the documentation. + * Test whether the documentation matches the code. + * Test Cagebreak in more esoteric setups (many monitors, for instance). + * Compile the code. + * Ideas on improving the testing and quality assurance are particularly + welcome. + * You can share your cagebreak scripts and we might include them with Cagebreak + provided you agree to release them under MIT and we agree with the + use case and coding style. + * If you are happy with Cagebreak under Arch Linux, you may vote for + [Cagebreak in the AUR](https://aur.archlinux.org/packages/cagebreak). + * The points from the Contributing section above still apply. + +## Philosophy + +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. + +# Development + +## Compatibility & Development Distribution + +Cagebreak supports [Arch Linux](https://archlinux.org/) and uses the libraries +versions as they are obtained from extra and core +at the time of release. + +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.)). + +[![Packaging status](https://repology.org/badge/vertical-allrepos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) + +You should use Arch Linux if you want to modify Cagebreak +for yourself. + +## Review Requirements + +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. + +## Developer Certificate of Origin (DCO) + +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. + +### Development Environment + +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. + +### Scripts + +Cagebreak provides a few convenience tools to facilitate development. + +#### Fuzzing + +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`. + +#### Adjusting Epoch + +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 +``` + +#### Git tag + +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. + +#### Output Hashes + +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. + +#### Create Signatures + +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 +``` + +#### Set Version Number + +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. + +#### Create Release Artefacts + +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. + +## GCC and -fanalyzer + +Cagebreak should compile with any reasonably new gcc or clang. Consider +a gcc version of at least [10.1](https://gcc.gnu.org/gcc-10/changes.html) if +you want to get the benefit of the +[-fanalyzer](https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html) +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 +``` + +## Test Suite + +``` +meson test -C build +``` + +invokes all tests. This is required for a release to occur. + +There are four test suites: + + * basic: tests actual outward-facing functionality + * Note optional dependencies for efficient socket interaction + * nc (openbsd-netcat) + * jq + * devel: tests internal properties of the repository + * Note potentially heavier dependencies such as + * shellcheck + * clang-format + * devel-long: applies more costly testing + * Note potentially heavier dependencies such as + * scan-build (static analysis (including security-relevant issues)) + * release: tests release specific considerations + * Note that this is only expected to pass just before + a release. This checks mostly administrative things + to check that a release is ready. + * Note that non-auto tests are files in `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 +``` + +## Fuzzing + +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](https://llvm.org/docs/LibFuzzer.html). + +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. + +### Caveat + +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. + +## Reproducible Builds + +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](Bugs.md). + +### Reproducible Build Instructions + +All hashes and signatures are provided for the following build instructions. + +``` +meson setup build -Dxwayland=true -Dman-pages=true --buildtype=release +ninja -C build +``` + +### Hashes for Builds + +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](Hashes.md) + +### GPG Signatures + +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. + +### Signing Keys + +All releases are signed by at least one of the following collection of +keys. + + * E79F6D9E113529F4B1FFE4D5C4F974D70CEC2C5B (expired) + * 4739D329C9187A1C2795C20A02ABFDEC3A40545F (expired) + * 7535AB89220A5C15A728B75F74104CC7DCA5D7A8 (expired) + * 827BC2320D535AEAD0540E6E2E66F65D99761A6F (expired) + * A88D7431E5BAAD0B6EAE550AC8D61D8BD4FA3C46 (expired) + * 8F872885968EB8C589A32E9539ACC012896D450F (expired) + * 896B92AF738C974E0065BF42F2576BD366156BB9 (expired) + * AA927AFD50AF7C6810E69FE8274F2C605359E31B (expired) + * BE2DED372287BC4EB2213E13A0C743848A638955 (expired) + * 0F3476E4B2404F95EC41600683D5810F7911B020 (expired) + * [4E82C72C6B3E58A7BC4FF8554909F84CA83BB867](keys/cagebreak_signing_key_11@project-repo.co.pub) + * [5AEB1A2EB0D13F67E306AC59DC0CC81BE006FD85](keys/cagebreak_signing_key_12@project-repo.co.pub) + * [438C27DDB5D174673DF4D67B451205B3528C7C63](keys/cagebreak_signing_key_13@project-repo.co.pub) + * [81372DDB8124349F0303B77448D7E2EE3343E3AA](keys/cagebreak_signing_key_14@project-repo.co.pub) + +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.md](SECURITY.md) +for details. + +The full public keys can be found in `keys/` along with any revocation certificates. + +## Versioning & Branching Strategy + +Cagebreak uses [semantic versioning](https://semver.org). + +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. + +## Release Procedure + +The release procedure outlines the process for a release to occur. + + * [ ] `git checkout development` + * [ ] `git pull origin development` + * [ ] `git push origin development` + * [ ] Arch Build System is up to date + * [ ] `meson test -C build/` just to get an overview + * [ ] Update internal wiki + * [ ] Adjust version number in meson.build + * [ ] `meson compile set-ver -C build` + * [ ] Add new files to meson.build or hardcoded testing variable + * [ ] Commit changes + * [ ] `git push origin development` + * [ ] Complete relevant documentation + * [ ] New features + * [ ] tests added and old test scripts adjusted + * [ ] man pages + * [ ] cagebreak + * [ ] cagebreak-config + * [ ] cagebreak-socket + * [ ] example config + * [ ] FAQ.md + * [ ] Changelog.md for major and minor releases but not patches + * [ ] Check changes for SECURITY.md relevance (changes to socket scope for example) + * [ ] Synchronize any socket changes to cagebreak-socket man page + * [ ] Document fixed bugs in Bugs.md + * [ ] Include issue discussion from github, where applicable + * [ ] `meson compile adjust-epoch -C build` + * [ ] Commit changes + * [ ] `git push origin development` + * [ ] Testing + * [ ] Manual testing + * [ ] `meson compile fuzz -C build` for at least one hour + * [ ] Adjust Hashes.md - Use `meson compile output-hashes -C build` to add Hashes or aid in repro check + * [ ] Commit changes + * [ ] `git push origin development` + * [ ] Complete release-non-auto-checks + * [ ] `meson compile create-sigs -C build` + * [ ] Commit and push signatures, hashes and non-auto-check files + * [ ] `meson test -C build` passes everything except some release tests + * [ ] `git add` relevant files + * [ ] `git commit` + * [ ] `git push origin development` + * [ ] `git checkout master` + * [ ] `git pull --tags origin master` + * [ ] `git merge --squash development` + * [ ] `git commit` and insert message + * [ ] `meson compile git-tag -C build` + * [ ] `meson compile create-artefacts -C build` + * [ ] `meson test -C build` THIS MUST PASS WITHOUT ANY FAILURES WHATSOEVER + * [ ] `git 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` + * [ ] Upload archives and signatures as release assets + * [ ] Delete feature branches if appropriate + * [ ] Manage package release + diff --git a/Changelog.md b/Changelog.md index b9f7461..a3223e5 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,40 +1,100 @@ # Changelog -## Release 1.0.0 +## Release 2.3.0 -Adds basic tiling window manager functionality to cage. +Functionality: + * Add configuration to anchor position of messages (#60, 71 in Bugs.md). + * Add output priorisation (#38, 68 in Bugs.md). + * Print whether output is active in dump. -## Release 1.1.0 +Bug Fixes: + * Fix gamma control (72 in Bugs.md). + * Add missing commands to example config. + * Add message_config to dump output. -Unifies commands and actions. See Issue 4 in Bugs.md. +Example Scripts: + * Add screenshot script. + * Make example scripts standalone. -## Release 1.2.0 +Documentation: + * Escape html tags in config man page. (#68, 69 in Bugs.md) + * Improve README.md (#62, 70 in Bugs.md). + * Improve SECURITY.md. + * Add CONTRIBUTING.md (#62, 70 in Bugs.md). + * FAQ: Add Firefox screenshare instructions for wayland. + * FAQ: Add wlroots downgrading instructions for workaround in case of temporary wlroots incompatibility. + * Update copyright notices to 2024. -Adds output configuration as described in the man pages. +Development Tooling: + * Add new gpg keys (signed by the old ones). + * Add PR template. + * Add dev-FAQ. + * Remove now-unnecessary fanalyzer pragmas. -## Release 1.3.0 +## Release 2.2.0 -Adds IPC as described in the man pages. + * Add custom events + * Fix Issue 62 (#46 Github) + * Fix Issue 63 (environment variables test) + * Fix Issue 64 (pointer focus bug) -## Release 1.4.0 +## Release 2.1.0 -Adds close command for windows as described in the man pages. + * Add -bs (bad security) option + * Fix Issue 57 (SPDX spelling error #39) + * Fix Issue 59 (meson install settings) + * Fix Issue 55 (npd) + * Fix Issue 56 (npd) + * Fix Issue 58 (#40 config) + * Improve release procedure + * Add miniscule test suite + * Adjust Cagebreak to wlroots 0.16.2 + * New GPG Keys -## Release 1.5.0 +## Release 2.0.0 -Adds options to disable or enable outputs. See Issue 22 in Bugs.md and Issue #2 on github. +This is a major release and includes BREAKING changes! -## Release 1.6.0 +Breaking Changes: -Adds support for non-build dependencies and an option for builds without pandoc. + * More intuitive switch of focus, next, prev and exchange (#20, 40 in Bugs.md) + Cagebreak will probably still feel broadly the same though. + * Remove -r flag - This is replaced by output configuration. + * Socket disabled by default - The socket is enabled by invoking Cagebreak with the -e flag. + * Socket permissions restricted to the user of the Cagebreak process (700) + This may require modification of scripts interacting with the socket with + different UIDs than the UID of the Cagebreak process. + * Rename "Current frame" indicator to "Current tile" -## Release 1.7.0 +Changelog: -Improves window ordering. - -## Release 1.8.0 - -Adds libinput configuration and virtual keyboard and pointer support. + * Move to wlr_scene + * Add events displaying change over the socket + * this enables scripting tools + * Add support for scaling outputs (thanks to Oliver Friedmann) + * Remove -r flag + * Add rotation to output configuration + * Add cursor enable|disable flag + * Add input keyboard configuration + * Custom path flag for configuration file + * Restrict socket permissions to the user running cagebreak (700) + * Fix Issue #31 (resolve some terminology) 38 in Bugs.md + * Fix Issue #30 - 39 in Bugs.md + * Fix Issue #20 - 40 in Bugs.md + * Fix Issue #12 - 41 in Bugs.md (dump + events over socket) + * Fix Bugs found via scan-build static analysis (42 - 45 in Bugs.md) + * Fix Issue #33 - 46 in Bugs.md + * Fix Issue #32 - 47 in Bugs.md + * Fix Issue #16 - 48 in Bugs.md + * Fix Issue #3 - 49 in Bugs.md (disabling keybinding interpretation for specific keyboards is now possible) + * Fix Issue #26 - 50 in Bugs.md + * Fix Issue #7 - 51 in Bugs.md (Change cursor to square while Cagebreak is waiting for a key) + * Fix config bug for some commands - 52 in Bugs.md + * Fix Issue #35 - 53 in Bugs.md (update to wlroots 0.16.1) + * Improve FAQ.md (related to some Issues) + * Disable outputs when unable to set any mode (crashed previously) + * Add Code of Conduct + * Print version number on startup ## Release 1.9.0 @@ -64,65 +124,39 @@ Adds libinput configuration and virtual keyboard and pointer support. - Add new cagebreak email contact gpg key - Add new project-repo AUR gpg key (relevant for cagebreak-pkgbuild) -## Release 2.0.0 +## Release 1.8.0 -This is a major release and includes BREAKING changes! +Adds libinput configuration and virtual keyboard and pointer support. -Breaking Changes: - * More intuitive switch of focus, next, prev and exchange (#20, 40 in Bugs.md) - Cagebreak will probably still feel broadly the same though. - * Remove -r flag - This is replaced by output configuration. - * Socket disabled by default - The socket is enabled by invoking Cagebreak with the -e flag. - * Socket permissions restricted to the user of the Cagebreak process (700) - This may require modification of scripts interacting with the socket with - different UIDs than the UID of the Cagebreak process. - * Rename "Current frame" indicator to "Current tile" +## Release 1.7.0 -Changelog: - * Move to wlr_scene - * Add events displaying change over the socket - * this enables scripting tools - * Add support for scaling outputs (thanks to Oliver Friedmann) - * Remove -r flag - * Add rotation to output configuration - * Add cursor enable|disable flag - * Add input keyboard configuration - * Custom path flag for configuration file - * Restrict socket permissions to the user running cagebreak (700) - * Fix Issue #31 (resolve some terminology) 38 in Bugs.md - * Fix Issue #30 - 39 in Bugs.md - * Fix Issue #20 - 40 in Bugs.md - * Fix Issue #12 - 41 in Bugs.md (dump + events over socket) - * Fix Bugs found via scan-build static analysis (42 - 45 in Bugs.md) - * Fix Issue #33 - 46 in Bugs.md - * Fix Issue #32 - 47 in Bugs.md - * Fix Issue #16 - 48 in Bugs.md - * Fix Issue #3 - 49 in Bugs.md (disabling keybinding interpretation for specific keyboards is now possible) - * Fix Issue #26 - 50 in Bugs.md - * Fix Issue #7 - 51 in Bugs.md (Change cursor to square while Cagebreak is waiting for a key) - * Fix config bug for some commands - 52 in Bugs.md - * Fix Issue #35 - 53 in Bugs.md (update to wlroots 0.16.1) - * Improve FAQ.md (related to some Issues) - * Disable outputs when unable to set any mode (crashed previously) - * Add Code of Conduct - * Print version number on startup +Improves window ordering. -## Release 2.1.0 +## Release 1.6.0 - * Add -bs (bad security) option - * Fix Issue 57 (SPDX spelling error #39) - * Fix Issue 59 (meson install settings) - * Fix Issue 55 (npd) - * Fix Issue 56 (npd) - * Fix Issue 58 (#40 config) - * Improve release procedure - * Add miniscule test suite - * Adjust Cagebreak to wlroots 0.16.2 - * New GPG Keys +Adds support for non-build dependencies and an option for builds without pandoc. -## Release 2.2.0 +## Release 1.5.0 + +Adds options to disable or enable outputs. See Issue 22 in Bugs.md and Issue #2 on github. + +## Release 1.4.0 + +Adds close command for windows as described in the man pages. + +## Release 1.3.0 + +Adds IPC as described in the man pages. + +## Release 1.2.0 + +Adds output configuration as described in the man pages. + +## Release 1.1.0 + +Unifies commands and actions. See Issue 4 in Bugs.md. + +## Release 1.0.0 + +Adds basic tiling window manager functionality to cage. - * Add custom events - * Fix Issue 62 (#46 Github) - * Fix Issue 63 (environment variables test) - * Fix Issue 64 (pointer focus bug) diff --git a/FAQ.md b/FAQ.md index d8918a0..83fd29b 100644 --- a/FAQ.md +++ b/FAQ.md @@ -2,14 +2,9 @@ ## How do I do a particular thing with cagebreak? - * Check the man pages - * [cagebreak config](man/cagebreak-config.5.md) (probably where you find the answer) - * [cagebreak](man/cagebreak.1.md) (command line options etc.) - * [cagebreak-socket](man/cagebreak-socket.7.md) (socket information, mostly useful for scritping) - * Check the rest of this FAQ - * [Open an issue](https://github.com/project-repo/cagebreak/issues/new) or otherwise get in touch with the development team (See section Email Contact in [SECURITY.md](SECURITY.md)). - -Note that the feature set of cagebreak is intentionally limited. + * Check the [man pages](manuals.md). + * Check the rest of this file. + * [Open an issue](https://github.com/project-repo/cagebreak/issues/new) or get in touch (See section Email Contact in [SECURITY.md](SECURITY.md)). ## How do I remap Caps Lock? @@ -17,6 +12,21 @@ Remapping Caps Lock globally seems to be the best option. Follow instructions [here](https://wiki.archlinux.org/title/Linux_console/Keyboard_configuration) to achieve this (should be roughly distribution-agnostic). +## What do I do if Cagebreak does not work with the current wlroots version? + +You can probably downgrade wlroots with + +``` +$ pacman -U /var/cache/pacman/pkg/old-version +``` + +If you have cleared your package cache, see instructions in the [ArchWiki](https://wiki.archlinux.org/title/downgrading_packages#Return_to_an_earlier_package_version). + +Cagebreak should start working again after the downgrade. + +After a new release, the downgrading will no longer be necessary (in fact, +downgrading will probably break your setup). + ## How do I get firefox to run under wayland? Set the following environment variables @@ -26,6 +36,17 @@ Set the following environment variables to activate wayland support for firefox. +## How do I get firefox to screenshare properly? + +Execute the following commands with the appropriate env vars: + +``` +export XDG_SESSION_TYPE=wayland +export XDG_CURRENT_DESKTIP=sway +/usr/lib/xdg-desktop-portal -r +/usr/lib/xdg-desktop-portal-wlr +``` + ## How do I map characters which are not on the Keyboard? Suppose you want to use a command like `bind` for a character diff --git a/Hashes.md b/Hashes.md index 867692b..2930148 100644 --- a/Hashes.md +++ b/Hashes.md @@ -1,5 +1,25 @@ # Hashes +2.3.0 cagebreak + + * sha 256: 549e82f6bb1af87c9272fb92d39c6f235b0f780885b066c32db5a5c7588da378 + * sha 512: d05e5ac9e4295bed93b8872a815b1f8aaf8ddc2448c01f84d5d29b4d5610bb5c0c50f87b15653bb663a9f772a899dc7b8215042db3ac86aa1ba3000ccb9757d2 + +2.3.0 cagebreak.1 + + * sha 256: 11cbe6ea82fa19064ee5b9d8346dbaa8ca8251948c5f5eee7387516edcfbeab0 + * sha 512: 76f15788aeebb2cab5a0a477f1427646964c6011c20d64f43f6c445bf08e5371971607a7565017fd05f4f2d75c66da5d79948643618eeb4d3619bc7e6128cffe + +2.3.0 cagebreak-config.5 + + * sha 256: dc8755bbed108cd0cf76f05eee0c6d08550373eab5f75895755abddb7b86e84c + * sha 512: b93caa7cd4ec9085409472982ce72a8e55a369cb830a7d3132801b24db0660e4259a3e9b229dbaf960bc28c4d8a384a19f7bbb11e74f7c4e3f90b04d2b5280ee + +2.3.0 cagebreak-socket.7 + + * sha 256: f33abe5f18cb087ab421c3b647437c31a01e5c731638cac859a9b9ea1f88099e + * sha 512: f973bd2a67d9ca8b4bf2d150c4f1151163f379c7048e1e4be098d8032a424c77bd4dfaa98635bb8cdefa0b2da147b9b6a87bcbcaa87c378b5040e708f8ca5a97 + 2.2.3 cagebreak * sha 256: 265a9d09622272ca6ea79ddcdbdc6003704106814eb05a2b7547a77a982263de diff --git a/LICENSE b/LICENSE index e0aba93..462eccf 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2020-2023 The Cagebreak authors +Copyright (c) 2020-2024 The Cagebreak authors Copyright (c) 2018-2020 Jente Hidskes Copyright (c) 2019 The Sway authors diff --git a/README.md b/README.md index 1ca4ce5..79397ea 100644 --- a/README.md +++ b/README.md @@ -1,81 +1,55 @@ -# Cagebreak: A Wayland Tiling Compositor +# Cagebreak: A Tiling Wayland Compositor -[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.2.3)](https://repology.org/project/cagebreak/versions) +[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.3.0)](https://repology.org/project/cagebreak/versions) -## Quick Introduction +[![Contact](img/mail.svg)](SECURITY.md) [![Manuals](img/manuals.svg)](manuals.md) [![FAQ](img/faq.svg)](FAQ.md) [![CONTRIBUTING](img/contributing.svg)](CONTRIBUTING.md) [![ArchWiki](img/archwiki.svg)](https://wiki.archlinux.org/title/Cagebreak) [![AUR](img/aur.svg)](https://aur.archlinux.org/packages?O=0&K=cagebreak) -Cagebreak is a [Wayland](https://wayland.freedesktop.org/) tiling compositor -based on [Cage](https://github.com/Hjdskes/cage) and inspired by [ratpoison](https://www.nongnu.org/ratpoison/). +## Introduction -### Purpose +Cagebreak provides a [ratpoison](https://www.nongnu.org/ratpoison/)-inspired, [cage](https://github.com/Hjdskes/cage)-based, tiling [Wayland](https://wayland.freedesktop.org/) compositor. -This project provides a successor to ratpoison for Wayland. -However, this is no reimplementation of ratpoison. - -#### New Features, Bugs and Contact Information - -You can [open an issue](https://github.com/project-repo/cagebreak/issues/new) -or write an e-mail (See [SECURITY.md](SECURITY.md) for details.). - -The Roadmap section outlines our plans. - -#### Compatibility & Development Distribution - -Cagebreak supports [Arch Linux](https://archlinux.org/) and uses the libraries -and versions from extra and core at the time of release. -Most other setups work with a bit of luck. - -### Quick Installation - -This assumes Arch Linux: - -1. Use the [cagebreak PKGBUILD](https://aur.archlinux.org/packages/cagebreak). -2. Add an example config such as [config](examples/config) to `$USER/.config/cagebreak/config` -3. Execute cagebreak like any other binary. - -See the [ArchWiki](https://wiki.archlinux.org/title/Cagebreak#Getting_started) for -details on getting started and the documentation for everything else. - -### Documentation - - * the man pages: [cagebreak](man/cagebreak.1.md), [configuration](man/cagebreak-config.5.md) & [socket](man/cagebreak-socket.7.md) - * the [README](README.md), [FAQ](FAQ.md) & [SECURITY.md](SECURITY.md) - -#### What's new? - -Check the [Changelog](Changelog.md). - -### Uninstallation - -`pacman -R cagebreak` should be sufficient. - -### Contributing - - * [Open an issue](https://github.com/project-repo/cagebreak/issues/new) and state your idea. - We will get back to you. - * Ask before you open a pull request. We might not accept your code and - it would be sad to waste the effort. - * Respect the [Code of Conduct](CODE_OF_CONDUCT.md) (To date, we never - had to intervene - Keep it that way!) - -### Name - -Cagebreak is based on [Cage](https://github.com/Hjdskes/cage), a Wayland kiosk -compositor. Since it breaks the kiosk into tiles the name -Cagebreak seemed appropriate. + * Bugs, Contact Information and New Features: + * [Open an issue](https://github.com/project-repo/cagebreak/issues/new). + * Write an e-mail (See [SECURITY.md](SECURITY.md)). + * The Roadmap below outlines our plans. + * Compatibility & Development Distribution: + * Cagebreak supports [Arch Linux](https://archlinux.org/) and uses the library + versions from extra and core at the time of release. + Most other setups work with a [bit of luck](https://repology.org/project/cagebreak/versions). + * Quick Installation (on ArchLinux, more [here (ArchWiki)](https://wiki.archlinux.org/title/Cagebreak)): + 1. Use the [cagebreak PKGBUILD](https://aur.archlinux.org/packages/cagebreak). + 2. Add an example config such as [config](examples/config) to `$USER/.config/cagebreak/config` + 3. Execute cagebreak like any other binary. + * Documentation: + * [man pages](manuals.md) + * [README](README.md), [FAQ](FAQ.md) & [SECURITY.md](SECURITY.md) + * What's new?: [Changelog](Changelog.md) + * Uninstallation: `pacman -R cagebreak` + * Contributing: + * [Open an issue](https://github.com/project-repo/cagebreak/issues/new) and state your idea. + We will get back to you. + * Ask before you open a pull request. We might not accept your code and + it would be sad to waste the effort. + * Respect the [Code of Conduct](CODE_OF_CONDUCT.md) (To date, we've never + had to intervene. - Keep it that way!) + * Name: Cagebreak breaks the kiosk of [Cage](https://github.com/Hjdskes/cage) into tiles, hence the name. ## Installation -On Arch Linux, just use the PKGBUILDs from the [AUR](https://aur.archlinux.org/): +On [Arch Linux](https://archlinux.org/), use the [AUR](https://aur.archlinux.org/) [PKGBUILDs](https://wiki.archlinux.org/title/PKGBUILD): * Using [cagebreak](https://aur.archlinux.org/packages/cagebreak), Cagebreak is - compiled on the target system (since release 1.3.0) + built on the target system (since release 1.3.0) * Using [cagebreak-bin](https://aur.archlinux.org/packages/cagebreak-bin), - the pre-built binaries are extracted to - appropriate paths on the target system (since release 1.3.2) + pre-built binaries are extracted + to the target system (since release 1.3.2) See [cagebreak-pkgbuild](https://github.com/project-repo/cagebreak-pkgbuild) for details. +You may check out other distros here: + +[![Packaging status](https://repology.org/badge/vertical-allrepos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) + ### Obtaining Source Code There are different ways to obtain cagebreak source: @@ -85,61 +59,69 @@ There are different ways to obtain cagebreak source: #### Verifying Source Code -There are corresponding methods of verifying that you obtained the correct code: +There are ways to verify that you obtained the correct source (See `keys/` +and [CONTRIBUTING](CONTRIBUTING.md)): - * our git history includes signed tags for releases - * release assets starting at release 1.2.1 contain a signature for the tarball + * signature for the tarball of release assets starting at release 1.2.1 + * signed tags for releases in the git history ## Building Cagebreak -You can build Cagebreak with the [meson](https://mesonbuild.com/) 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. +Cagebreak uses the [meson](https://mesonbuild.com/) build system. -Simply execute the following steps to build Cagebreak: +Cagebreak is developed against the latest tag of wlroots, so as not to constantly +chase breaking changes. + +Execute the following commands to build Cagebreak: ``` -$ meson setup build +$ meson setup build -Dxwayland=true -Dman-pages=true --buildtype=release $ ninja -C build ``` -#### Release Build +### Man Pages -By default, this builds a debug build. To build a release build, use `meson -setup build --buildtype=release`. +Remove `-Dman-pages=true` to disable man page generation. -##### Xwayland Support +To generate man pages, make sure that you have [scdoc](https://archlinux.org/packages/extra/x86_64/scdoc/) installed. -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. +### Release Build -##### Man Pages +To obtain a debug build, remove `--buildtype=release`. -Cagebreak has man pages. To use them, make sure that you have `scdoc` -installed. Then, add `-Dman-pages=true` to the `meson` command. +The release build is reproducible under conditions outlined in [CONTRIBUTING](CONTRIBUTING.md). -### Running Cagebreak +### Xwayland Support -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. +To build Cagebreak without XWayland support, remove `-Dxwayland=true`. -Please see `example_scripts/` for example scripts and a basis to customize -from. +To use XWayland make sure that your version of wlroots is compiled with +XWayland support. -#### Usage Philosophy +You'll need to have [XWayland](https://archlinux.org/packages/extra/x86_64/xorg-xwayland/) installed for XWayland support to work. -Cagebreak was originally built to suit the needs of its creators. This section outlines +## Running Cagebreak + +``` +$ ./build/cagebreak +``` + +If you run Cagebreak 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](manuals.md). + +Please see `example_scripts/` for a basis to customize from. + +### Usage Philosophy + +Cagebreak was built to suit the needs of its creators. This 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. +little bit. Please note that this does not replace the [man pages](manuals.md) or the [FAQ](FAQ.md). +Also, this is not intended as a guide on how cagebreak must be used but +as a source of inspiration and explanation for certain particularities. 1. 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 @@ -196,467 +178,6 @@ as a source of inspiration and explanations for certain particularities. > Example scripts can be found in the repository under `example_scripts/`. -## Contributing - - * Read this document. - * [Open an issue](https://github.com/project-repo/cagebreak/issues/new) and state your feature request. - We will get back to you. - * Ask before opening a pull request. We might not accept your - code and it would be sad to waste the effort. - * Respect the [Code of Conduct](CODE_OF_CONDUCT.md) (To date, we never - had to intervene - Please keep it that way!) - -### Good First Contributions - - * Reviews are always welcome. - * Read the code. - * Read the documentation. - * Test whether the documentation matches the code. - * Test Cagebreak in more esoteric setups (many monitors, for instance). - * Compile the code. - * Ideas on improving the testing and quality assurance are particularly - welcome. - * You can share your cagebreak scripts and we might include them with Cagebreak - provided you agree to release them under MIT and we agree with the - use case and coding style. - * If you are happy with Cagebreak under Arch Linux, you may vote for - [Cagebreak in the AUR](https://aur.archlinux.org/packages/cagebreak). - * The points from the Contributing section above still apply. - -### Philosophy - -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. - -## Development - -### Compatibility & Development Distribution - -Cagebreak supports [Arch Linux](https://archlinux.org/) and uses the libraries -(and software versions) as they are obtained through [pacman](https://wiki.archlinux.org/title/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.)). - -[![Packaging status](https://repology.org/badge/vertical-allrepos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) - -You should use Arch Linux if you want to modify Cagebreak -for yourself. - -### Review Requirements - -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. - -### Developer Certificate of Origin (DCO) - -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. - -#### Development Environment - -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. - -#### Scripts - -Cagebreak provides a few convenience tools to facilitate development. - -##### Fuzzing - -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`. - -##### Adjusting Epoch - -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 -``` - -##### Git tag - -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. - -##### Output Hashes - -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. - -##### Create Signatures - -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 -``` - -##### Set Version Number - -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. - -##### Create Release Artefacts - -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. - -### GCC and -fanalyzer - -Cagebreak should compile with any reasonably new gcc or clang. Consider -a gcc version of at least [10.1](https://gcc.gnu.org/gcc-10/changes.html) if -you want to get the benefit of the brand-new -[-fanalyzer](https://gcc.gnu.org/onlinedocs/gcc/Static-Analyzer-Options.html) -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 -``` - -### Test Suite - -``` -meson test -C build -``` - -invokes all tests. This is required for a release to occur. - -There are four test suites: - - * basic: tests actual outward-facing functionality - * Note optional dependencies for efficient socket interaction - * nc (openbsd-netcat) - * jq - * devel: tests internal properties of the repository - * Note potentially heavier dependencies such as - * shellcheck - * clang-format - * devel-long: applies more costly testing - * Note potentially heavier dependencies such as - * scan-build (static analysis (including security-relevant issues)) - * release: tests release specific considerations - * Note that this is only expected to pass just before - a release. This checks mostly administrative things - to check that a release is ready. - * Note that non-auto tests are files in `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 -``` - -### Fuzzing - -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](https://llvm.org/docs/LibFuzzer.html). - -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. - -#### Caveat - -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. - -### Reproducible Builds - -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](Bugs.md). - -#### Reproducible Build Instructions - -All hashes and signatures are provided for the following build instructions. - -``` -meson setup build -Dxwayland=true -Dman-pages=true --buildtype=release -ninja -C build -``` - -#### Hashes for Builds - -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](Hashes.md) - -#### GPG Signatures - -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. - -#### Signing Keys - -All releases are signed by at least one of the following collection of -keys. - - * E79F6D9E113529F4B1FFE4D5C4F974D70CEC2C5B - * 4739D329C9187A1C2795C20A02ABFDEC3A40545F - * 7535AB89220A5C15A728B75F74104CC7DCA5D7A8 - * 827BC2320D535AEAD0540E6E2E66F65D99761A6F - * A88D7431E5BAAD0B6EAE550AC8D61D8BD4FA3C46 - * 8F872885968EB8C589A32E9539ACC012896D450F - * 896B92AF738C974E0065BF42F2576BD366156BB9 - * AA927AFD50AF7C6810E69FE8274F2C605359E31B - * BE2DED372287BC4EB2213E13A0C743848A638955 - * 0F3476E4B2404F95EC41600683D5810F7911B020 - * 4E82C72C6B3E58A7BC4FF8554909F84CA83BB867 - * 5AEB1A2EB0D13F67E306AC59DC0CC81BE006FD85 - -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.md](SECURITY.md) -for details. - -The full public keys can be found in `keys/` along with any revocation certificates. - -### Versioning & Branching Strategy - -Cagebreak uses [semantic versioning](https://semver.org). - -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. - -### Release Procedure - -The release procedure outlines the process for a release to occur. - - * [ ] `git checkout development` - * [ ] `git pull origin development` - * [ ] `git push origin development` - * [ ] Arch Build System is up to date - * [ ] `meson test -C build/` just to get an overview - * [ ] Update internal wiki - * [ ] Adjust version number in meson.build - * [ ] `meson compile set-ver -C build` - * [ ] Add new files to meson.build or hardcoded testing variable - * [ ] Commit changes - * [ ] `git push origin development` - * [ ] Complete relevant documentation - * [ ] New features - * [ ] tests added and old test scripts adjusted - * [ ] man pages - * [ ] cagebreak - * [ ] cagebreak-config - * [ ] cagebreak-socket - * [ ] example config - * [ ] FAQ.md - * [ ] Changelog.md for major and minor releases but not patches - * [ ] Check changes for SECURITY.md relevance (changes to socket scope for example) - * [ ] Synchronize any socket changes to cagebreak-socket man page - * [ ] Document fixed bugs in Bugs.md - * [ ] Include issue discussion from github, where applicable - * [ ] `meson compile adjust-epoch -C build` - * [ ] Commit changes - * [ ] `git push origin development` - * [ ] Testing - * [ ] Manual testing - * [ ] `meson compile fuzz -C build` for at least one hour - * [ ] Adjust Hashes.md - Use `meson compile output-hashes -C build` to add Hashes or aid in repro check - * [ ] Commit changes - * [ ] `git push origin development` - * [ ] Complete release-non-auto-checks - * [ ] `meson compile create-sigs -C build` - * [ ] Commit and push signatures, hashes and non-auto-check files - * [ ] `meson test -C build` passes everything except some release tests - * [ ] `git add` relevant files - * [ ] `git commit` - * [ ] `git push origin development` - * [ ] `git checkout master` - * [ ] `git merge --squash development` - * [ ] `git commit` and insert message - * [ ] `meson compile git-tag -C build` - * [ ] `meson compile create-artefacts -C build` - * [ ] `meson test -C build` THIS MUST PASS WITHOUT ANY FAILURES WHATSOEVER - * [ ] `git 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` - * [ ] Upload archives and signatures as release assets - * [ ] Delete feature branches if appropriate - * [ ] Manage package release - ## Roadmap Cagebreak plans to do or keep doing the following things @@ -664,20 +185,24 @@ in the future: * React to all issues. * Add or modify features, which the authors find convenient or important. - * Improve the [OpenSSF Best Practices Badge Program](https://bestpractices.coreinfrastructure.org/en) level + * Improve the [OpenSSF Best Practices Badge Program](https://bestpractices.coreinfrastructure.org/en) level. ## Governance Cagebreak is managed by project-repo. +Consider project-repo a single benevolent dictator for life that happens +to occupy at least two brains. + 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. +### Governance Issues + +Use [SECURITY.md](SECURITY.md) to contact project-repo. ### Roles @@ -687,37 +212,20 @@ There are no specific roles forced unto anyone. ### Bus Factor +The current bus factor for Cagebreak is: 1 + 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 +Project-repo could 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. - -### Governance Issues - -Anyone can use the information in [SECURITY.md](SECURITY.md) to -contact the members of project-repo and bring governance -issues to their attention. - -## Bugs - -For any bug, please [create an issue](https://github.com/project-repo/cagebreak/issues/new) on -[GitHub](https://github.com/project-repo/cagebreak). - -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](SECURITY.md). +We strive to increase the bus factor to at least 2 in all +aspects. ## Accessibility @@ -730,6 +238,14 @@ see [SECURITY.md](SECURITY.md). would work and cagebreak does not preclude the use of a screen reader for any software run with it. +## Bugs + +[Open an issue](https://github.com/project-repo/cagebreak/issues/new) is you find something. + +See [SECURITY.md](SECURITY.md) for other means of contacting the Cagebreak authors and security issues. + +Fixed bugs are assigned a number and summarized in [Bugs.md](Bugs.md) for future reference. + ## Contributors * Aisha Tammy @@ -742,10 +258,14 @@ see [SECURITY.md](SECURITY.md). released in 2.2.1 with slight modifications * Tom Greig * Fix bug in merge_output_configs in 2.1.2 + * sodface + * Add a screenshot example script in 2.3.0 + * Luca Kennedy (unsigned-enby) + * [Add option to configure the anchor position of messages](https://github.com/project-repo/cagebreak/pull/61) in 2.3.0 ## License -Copyright (c) 2020-2023 The Cagebreak authors +Copyright (c) 2020-2024 The Cagebreak authors Copyright (c) 2018-2020 Jente Hidskes Copyright (c) 2019 The Sway authors diff --git a/SECURITY.md b/SECURITY.md index a55a2b4..110d48d 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,17 +1,33 @@ # Security -The main possibility for security bugs in cagebreak is by privilege -escalation through the socket. Any program with access to the socket -immediately gains arbitrary code execution rights. The socket -is restricted to the user of the cagebreak process (700) and has to -be explicitely enabled using the `-e` flag on invocation. +The main possibility for security bugs in cagebreak is privilege +escalation via the socket. Any program with access to the socket +immediately gains arbitrary code execution rights. The socket has to +be explicitely enabled using the `-e` flag on invocation and +is restricted to the user of the cagebreak process (700). -If you disagree with this threat model, you may contact us via email (See -section Email Contact below.) or [open an issue on github](https://github.com/project-repo/cagebreak/issues/new). +## Email Contact -Should any problem with the github issue system arise or any other reason -for (potentially confidential) contact with the Cagebreak authors appear, -you may contact us via email (See section Email Contact below.). +If you want to get in touch with project-repo via email, contact +`cagebreak @ project-repo . co`. + +We try to respond to everything that is not obvious spam. + +### GPG-Encrypted Emails + +If you can, please encrypt your email with the appropriate GPG key found +in `keys/` and sign your message with your own key. + +* B15B92642760E11FE002DE168708D42451A94AB5 (expired) +* F8DD9F8DD12B85A28F5827C4678E34D2E753AA3C (expired) +* 3ACEA46CCECD59E4C8222F791CBEB493681E8693 (expired) +* 0A268C188D7949FEB39FD1462F2AD980247E4918 (soon to expire) +* [283D10F54201B0C6CCEE2C561DE04E4B056C749D](keys/cagebreak@project-repo.co.pub) + +Note that our keys are signed by cagebreak signing keys. + +If you want us to respond via GPG-encrypted email, please include your own +public key or provide the fingerprint and directions to obtain the key. ## Supported Versions @@ -24,30 +40,7 @@ Builds are reproducible under conditions outlined in [README.md](README.md). For normal bugs you may [open an issue on github](https://github.com/project-repo/cagebreak/issues/new). For everything else, an email contact (with gpg encryption and signature) -is available below. - -## Email Contact - -If you want to get in touch with the developers of cagebreak to report -a security vulnerability or anything else via email, contact -`cagebreak @ project-repo . co`. - -We try to respond to everything that is not obvious spam. - -### GPG-Encrypted Emails - -If you can, please encrypt your email with the appropriate GPG key found -in `keys/` and sign your message with your own key. - -* B15B92642760E11FE002DE168708D42451A94AB5 -* F8DD9F8DD12B85A28F5827C4678E34D2E753AA3C -* 3ACEA46CCECD59E4C8222F791CBEB493681E8693 -* 0A268C188D7949FEB39FD1462F2AD980247E4918 - -Note that our keys are signed by cagebreak signing keys. - -If you want us to respond via GPG-encrypted email, please include your own -public key or provide the fingerprint and directions to obtain the key. +is available above. ## Threat Model @@ -57,7 +50,7 @@ Cagebreak cannot restrict other programs (consider a web browser unable to write a downloaded file for instance). There is no transmission of information by cagebreak other than to the -screens, ipc and potentially other documented local channels. +screens, ipc (if enabled with `-e`) and potentially other documented local channels. ### STRIDE Threat List @@ -76,7 +69,7 @@ Not applicable - Cagebreak allows system manipulation for user software. Not applicable - There are no prohibited operations (See Tampering above.). Cagebreak sends events over documented channels. There is no logging -activated by default - this can be changed by logging the socket (if enabled) for example. +activated by default - this can be changed by logging the socket for example. #### Information Disclosure @@ -86,12 +79,12 @@ Any user software may exfiltrate any data the user has access to. #### Denial of Service Not applicable - Cagebreak offers functionality to terminate itself. This is -available to user software over the socket (if enabled). +available to user software over the socket. #### Elevation of Privilege Software may gain arbitrary code execution if it has access to the -socket (if enabled). Privilege escalation to root is unlikely since privileges +socket. Privilege escalation to root is unlikely since privileges are dropped before any user input is accepted. ## GPG Keys of the Cagebreak Repository diff --git a/cagebreak.c b/cagebreak.c index 66afdf3..9ce99b8 100644 --- a/cagebreak.c +++ b/cagebreak.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #define _DEFAULT_SOURCE @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -279,7 +280,6 @@ main(int argc, char *argv[]) { struct wlr_viewporter *viewporter = NULL; struct wlr_presentation *presentation = NULL; struct wlr_xdg_output_manager_v1 *output_manager = NULL; - struct wlr_gamma_control_manager_v1 *gamma_control_manager = NULL; struct wlr_xdg_shell *xdg_shell = NULL; wl_list_init(&server.input_config); wl_list_init(&server.output_config); @@ -356,6 +356,7 @@ main(int argc, char *argv[]) { server.message_config.display_time = 2; server.message_config.font = strdup("pango:Monospace 10"); + server.message_config.anchor = CG_MESSAGE_TOP_RIGHT; event_loop = wl_display_get_event_loop(server.wl_display); sigint_source = @@ -369,6 +370,7 @@ main(int argc, char *argv[]) { server.event_loop = event_loop; backend = wlr_backend_autocreate(server.wl_display, &server.session); + server.headless_backend = wlr_headless_backend_create(server.wl_display); if(!backend) { wlr_log(WLR_ERROR, "Unable to create the wlroots backend"); ret = 1; @@ -563,13 +565,17 @@ main(int argc, char *argv[]) { goto end; } - gamma_control_manager = + server.gamma_control = wlr_gamma_control_manager_v1_create(server.wl_display); - if(!gamma_control_manager) { + if(!server.gamma_control) { wlr_log(WLR_ERROR, "Unable to create the gamma control manager"); ret = 1; goto end; } + server.gamma_control_set_gamma.notify = + handle_output_gamma_control_set_gamma; + wl_signal_add(&server.gamma_control->events.set_gamma, + &server.gamma_control_set_gamma); #if CG_HAS_XWAYLAND server.xwayland = wlr_xwayland_create(server.wl_display, compositor, true); @@ -671,6 +677,8 @@ main(int argc, char *argv[]) { wl_list_init(&server.outputs); struct cg_output *output, *output_tmp; wl_list_for_each_safe(output, output_tmp, &tmp_list, link) { + wl_list_remove(&output->link); + output_insert(&server, output); output_configure(&server, output); } server.curr_output = @@ -692,10 +700,6 @@ main(int argc, char *argv[]) { end: if(server.modes != NULL) { -#if CG_HAS_FANALYZE -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wanalyzer-double-free" -#endif for(unsigned int i = 0; server.modes[i] != NULL; ++i) { free(server.modes[i]); } @@ -761,6 +765,3 @@ end: return ret; } -#if CG_HAS_FANALYZE -#pragma GCC diagnostic pop -#endif diff --git a/docs/dev-FAQ.md b/docs/dev-FAQ.md new file mode 100644 index 0000000..46c7669 --- /dev/null +++ b/docs/dev-FAQ.md @@ -0,0 +1,67 @@ +# FAQ for Development + +## How is cagebreak adjusted to a new wlroots version? + +There are three steps: + +1. Try to compile Cagebreak with the new wlroots. +2. Fix the compiler errors one-by-one using the wlroots + changelog for reference (https://gitlab.freedesktop.org/wlroots/wlroots/-/releases). +3. Debug until Cagebreak works again. + +## How do I add a new test? + +1. Add a shell script to `test/` +2. Optionally add test configs to `test/testing-configurations/` +3. Make sure the files have shebang, copyright and SPDX License identifiers + (use the other files for reference) +4. Add the test to `meson.build` as in the example below. +5. Add paths and env vars as shown in the other tests +6. Make sure the test is added to the correct suite + (check out CONTRIBUTING.md for details) + +``` +test('Scan-build (static analysis)', find_program('test/scan-build'), env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel-long') +``` + +## How do I add a new script? + +1. Add a shell script to `scripts/` +2. Make sure the files have shebang, copyright and SPDX License identifiers + (use the other files for reference) +3. Add the script to CONTRIBUTING.md +4. Add the script to meson.build as shown below + +``` +run_target('create-sigs', + command : ['scripts/create-signatures', get_option('gpg_id')]) +``` + +## How do I add an example script? + +Extrapolate from the examples in the `example_scripts` directory. + +The script should be executable standalone. See `test/script-header` for a possible +library. + +License, contributors etc. should be appropriate. + +Shellcheck must pass on any script (use of shellcheck pragmas is allowed but +discouraged). + +## How do I add a new gpg key? + +1. Check which gpg key versions are currently valid. +2. Generate keys with incremented numbers/emails/dates/passphrase. + * Use 4096 Bit RSA Keys +3. Sign the new keys with at least one then-old signing key. +4. Genereate new cagebreak@project-repo.co key +5. Sign the new mail key with the new signing keys. +6. Generate new pkgbuild key. +7. Sign the pkgbuild key with the new signing keys. +8. Add public keys to `keys/`. +9. Update meson_options.txt +10. Update [all man pages](../manuals.md), [CONTRIBUTING](../CONTRIBUTING.md), gpg-validity test & [SECURITY.md](../SECURITY.md) +11. Update the pkgbuild repo with the new key (key and readme). +12. Update git config email. +13. Securely distribute private keys and revocation certificates as per the internal wiki. diff --git a/docs/pull_request_template.md b/docs/pull_request_template.md new file mode 100644 index 0000000..589cd0c --- /dev/null +++ b/docs/pull_request_template.md @@ -0,0 +1,26 @@ +# Description + + + + +## Type of Change + + * [ ] Fix + * [ ] Backwards-compatible Feature + * [ ] Breaking Change + +## Considerations + + + + +## Credit + + * [ ] I want to be credited as YOUR_NAME_OR_PSEUDONYM in your contributor section + * [ ] I don't want to be credited. + + + + +signed-off-by: YOUR_NAME_OR_PSEUDONYM + diff --git a/example_scripts/screenshot_script b/example_scripts/screenshot_script new file mode 100755 index 0000000..59cf524 --- /dev/null +++ b/example_scripts/screenshot_script @@ -0,0 +1,44 @@ +#!/bin/bash +# Copyright 2023 - 2024, project-repo, sodface and the cagebreak contributors +# SPDX-License-Identifier: MIT +# +# Execute this script if you want to take a screenshot. +# Please supply your chosen cropping/editing tool as a +# command-line argument. The filepath to the temporary +# file will be given as an argument to your command. +# +# Example: +# screenshot_script "gwenview" + +named_pipe_send="$(mktemp -u)" +named_pipe_recv="$(mktemp -u)" +mkfifo "${named_pipe_send}" +mkfifo "${named_pipe_recv}" +nc -U "${CAGEBREAK_SOCKET}" < "${named_pipe_send}" > "${named_pipe_recv}"& +# The file descriptor 3 is set up to send commands to cagebreak and file +# descriptor 4 can be used to read events. Notice that events will pile up in +# file descriptor 4, so it is a good idea to continuously read from it or to +# clear it before starting a new transaction. +exec 3>"${named_pipe_send}" +exec 4<"${named_pipe_recv}" +# When the script exits, the os will clean up the pipe +rm "${named_pipe_recv}" +rm "${named_pipe_send}" + +if [[ ${#} -lt 1 ]] +then + echo "Expected a single command line argument specifying the command to edit the screenshot." + exit 1 +fi + +edit_cmd="${1}" + +echo "dump" >&3 +IFS= read -r -d $'\0' event <&4 + +co="$(echo "${event:6}"|jq -r ".curr_output")" +tmpfile="$(mktemp)" +grim -t png -o "${co}" "${tmpfile}" +bash -c "${edit_cmd} \"${tmpfile}\"" +wl-copy < "${tmpfile}" +rm "${tmpfile}" diff --git a/example_scripts/show_workspace_views.sh b/example_scripts/show_workspace_views old mode 100644 new mode 100755 similarity index 54% rename from example_scripts/show_workspace_views.sh rename to example_scripts/show_workspace_views index be6f0f9..33d76bc --- a/example_scripts/show_workspace_views.sh +++ b/example_scripts/show_workspace_views @@ -1,11 +1,23 @@ #!/bin/bash -# Copyright 2020 - 2023, project-repo and the cagebreak contributors +# Copyright 2020 - 2024, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT - +# # This script displays the process names of the views on the current workspace. -# Start up the ipc link -source "$(dirname "${BASH_SOURCE[0]}")/cb_script_header.sh" +named_pipe_send="$(mktemp -u)" +named_pipe_recv="$(mktemp -u)" +mkfifo "${named_pipe_send}" +mkfifo "${named_pipe_recv}" +nc -U "${CAGEBREAK_SOCKET}" < "${named_pipe_send}" > "${named_pipe_recv}"& +# The file descriptor 3 is set up to send commands to cagebreak and file +# descriptor 4 can be used to read events. Notice that events will pile up in +# file descriptor 4, so it is a good idea to continuously read from it or to +# clear it before starting a new transaction. +exec 3>"${named_pipe_send}" +exec 4<"${named_pipe_recv}" +# When the script exits, the os will clean up the pipe +rm "${named_pipe_recv}" +rm "${named_pipe_send}" echo "dump" >&3 diff --git a/examples/config b/examples/config index 6708e42..b0883cb 100644 --- a/examples/config +++ b/examples/config @@ -1,8 +1,7 @@ -# Copyright 2020 - 2023, project-repo and the cagebreak contributors +# Copyright 2020 - 2024, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT -###################### -# General settings an key bindings -###################### + +# General settings and key bindings exec xterm @@ -36,19 +35,21 @@ bind k focusup bind l focusright bind t exec xterm bind C-k close -#bind m message Hello World! +# bind m message Hello World! definekey resize h resizeleft definekey resize l resizeright definekey resize j resizedown definekey resize k resizeup definekey resize Escape setmode top -#unhide cursor (default) +# unhide cursor (default) cursor enable -###################### -#Workspaces -###################### +# send a custom event over the socket +# custom_event Hello World! + +## Workspaces + bind 1 screen 1 bind 2 screen 2 bind 3 screen 3 @@ -84,28 +85,33 @@ definekey top XF86_Switch_VT_4 switchvt 4 definekey top XF86_Switch_VT_5 switchvt 5 definekey top XF86_Switch_VT_6 switchvt 6 -###################### -#Bind Function keys -###################### +## Bind Function keys + definekey top XF86AudioMute exec pactl set-sink-mute 0 toggle definekey top XF86AudioLowerVolume exec pactl set-sink-mute 0 off&&amixer set Master 1%- definekey top XF86AudioRaiseVolume exec pactl set-sink-mute 0 off&&amixer set Master 1%+ definekey top XF86MonBrightnessDown exec xbacklight -dec 1 definekey top XF86MonBrightnessUp exec xbacklight -inc 1 -###################### -#Output configuration -###################### -#output eDP-1 pos 0 0 res 1366x768 rate 60 -#output eDP-1 disable -#output eDP-1 enable -#output eDP-1 prio 1 -#output eDP-2 pos 0 0 res 1366x768 rate 60 scale 2.0 +## Output configuration -##################### -#Input configuration -##################### +# output eDP-1 pos 0 0 res 1366x768 rate 60 +output eDP-1 disable +output eDP-1 enable +output eDP-1 permanent -#input 1234:0:Device_Ident click_method clickfinger -#input type:pointer scroll_method two_finger -#input * calibration_matrix 1 2 3 4 5 6 +output eDP-1 peripheral +# output eDP-1 prio 1 +# output eDP-2 pos 0 0 res 1366x768 rate 60 scale 2.0 + + +## Input configuration + +# input 1234:0:Device_Ident click_method clickfinger +# input type:pointer scroll_method two_finger +# input * calibration_matrix 1 2 3 4 5 6 + +## Message configuration + +# configure_message display_time 1 +# configure_message anchor top_center diff --git a/fuzz/execl_override.c b/fuzz/execl_override.c index 275d4f0..0f9a19f 100644 --- a/fuzz/execl_override.c +++ b/fuzz/execl_override.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT // This file is used by the fuzzer in order to prevent executing shell commands. diff --git a/fuzz/fuzz-lib.c b/fuzz/fuzz-lib.c index 650d8a8..2d46e50 100644 --- a/fuzz/fuzz-lib.c +++ b/fuzz/fuzz-lib.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200812L @@ -273,7 +273,7 @@ LLVMFuzzerInitialize(int *argc, char ***argv) { server.scene_output_layout = wlr_scene_attach_output_layout(server.scene, server.output_layout); - compositor = wlr_compositor_create(server.wl_display, 5, server.renderer); + compositor = wlr_compositor_create(server.wl_display, 6, server.renderer); if(!compositor) { wlr_log(WLR_ERROR, "Unable to create the wlroots compositor"); ret = 1; diff --git a/fuzz/fuzz-lib.h b/fuzz/fuzz-lib.h index 46aefd2..2715978 100644 --- a/fuzz/fuzz-lib.h +++ b/fuzz/fuzz-lib.h @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #ifndef CG_FUZZ_LIB_H diff --git a/fuzz/fuzz-parse.c b/fuzz/fuzz-parse.c index d0bd5ab..9c35010 100644 --- a/fuzz/fuzz-parse.c +++ b/fuzz/fuzz-parse.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200812L diff --git a/idle_inhibit_v1.c b/idle_inhibit_v1.c index 019d47b..bc76ff7 100644 --- a/idle_inhibit_v1.c +++ b/idle_inhibit_v1.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #include @@ -15,10 +15,6 @@ struct cg_idle_inhibitor_v1 { struct wl_listener destroy; }; -#if CG_HAS_FANALYZE -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" -#endif static void idle_inhibit_v1_check_active(struct cg_server *server) { /* As of right now, this does not check whether the inhibitor @@ -26,9 +22,6 @@ idle_inhibit_v1_check_active(struct cg_server *server) { bool inhibited = !wl_list_empty(&server->inhibitors); wlr_idle_notifier_v1_set_inhibited(server->idle, inhibited); } -#if CG_HAS_FANALYZE -#pragma GCC diagnostic pop -#endif static void handle_destroy(struct wl_listener *listener, void *data) { diff --git a/idle_inhibit_v1.h b/idle_inhibit_v1.h index 74ae956..dc712bf 100644 --- a/idle_inhibit_v1.h +++ b/idle_inhibit_v1.h @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #ifndef CG_IDLE_INHIBIT_H #define CG_IDLE_INHIBIT_H diff --git a/img/archwiki.svg b/img/archwiki.svg new file mode 100644 index 0000000..635b400 --- /dev/null +++ b/img/archwiki.svg @@ -0,0 +1 @@ + : Wiki \ No newline at end of file diff --git a/img/aur.svg b/img/aur.svg new file mode 100644 index 0000000..c8af6f3 --- /dev/null +++ b/img/aur.svg @@ -0,0 +1 @@ + : AUR \ No newline at end of file diff --git a/img/contributing.svg b/img/contributing.svg new file mode 100644 index 0000000..6d58a85 --- /dev/null +++ b/img/contributing.svg @@ -0,0 +1 @@ + : Contrib \ No newline at end of file diff --git a/img/faq.svg b/img/faq.svg new file mode 100644 index 0000000..41bfdfe --- /dev/null +++ b/img/faq.svg @@ -0,0 +1 @@ + : FAQ \ No newline at end of file diff --git a/img/mail.svg b/img/mail.svg new file mode 100644 index 0000000..78cfd12 --- /dev/null +++ b/img/mail.svg @@ -0,0 +1 @@ + : Mail \ No newline at end of file diff --git a/img/manuals.svg b/img/manuals.svg new file mode 100644 index 0000000..8aebe59 --- /dev/null +++ b/img/manuals.svg @@ -0,0 +1 @@ + : Manuals \ No newline at end of file diff --git a/img/web-artefacts.svg b/img/web-artefacts.svg new file mode 100644 index 0000000..00072e8 --- /dev/null +++ b/img/web-artefacts.svg @@ -0,0 +1 @@ + : Mirror \ No newline at end of file diff --git a/img/web-open-issue.svg b/img/web-open-issue.svg new file mode 100644 index 0000000..8c2de01 --- /dev/null +++ b/img/web-open-issue.svg @@ -0,0 +1 @@ + : + Issue \ No newline at end of file diff --git a/input.h b/input.h index f45e735..358c385 100644 --- a/input.h +++ b/input.h @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #ifndef _CG_INPUT_H diff --git a/input_manager.c b/input_manager.c index fcdd684..47ce206 100644 --- a/input_manager.c +++ b/input_manager.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200812L diff --git a/input_manager.h b/input_manager.h index b3eb006..eb6f019 100644 --- a/input_manager.h +++ b/input_manager.h @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #ifndef CG_INPUT_MANAGER_H diff --git a/ipc_server.c b/ipc_server.c index 05614b3..37e59ad 100644 --- a/ipc_server.c +++ b/ipc_server.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #define _DEFAULT_SOURCE diff --git a/ipc_server.h b/ipc_server.h index 41d7b88..a8ae3ef 100644 --- a/ipc_server.h +++ b/ipc_server.h @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #ifndef CG_IPC_SERVER_H diff --git a/keybinding.c b/keybinding.c index 6da0cc6..2432e59 100644 --- a/keybinding.c +++ b/keybinding.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200809L @@ -90,6 +90,7 @@ keybinding_free(struct keybinding *keybinding, bool recursive) { if(keybinding->data.m_cfg->font != NULL) { free(keybinding->data.m_cfg->font); } + free(keybinding->data.m_cfg); break; case KEYBINDING_DISPLAY_MESSAGE: if(keybinding->data.c != NULL) { @@ -248,8 +249,7 @@ swap_tile(struct cg_tile *tile, "{\"event_name\":\"swap_tile\",\"tile_id\":%d,\"swap_" "tile_id\":%d,\"workspace\":%d,\"output\":\"%s\",\"output_id\":%d}", tile->id, swap_tile->id, tile->workspace->num + 1, - tile->workspace->output->wlr_output->name, - output_get_num(tile->workspace->output)); + tile->workspace->output->name, output_get_num(tile->workspace->output)); } void @@ -399,8 +399,7 @@ resize(struct cg_tile *tile, const struct cg_tile *parent, int coord_offset, "\"workspace\":%d,\"output\":\"%s\",\"output_id\":%d}", tile->id, old_x, old_y, old_height, old_width, tile->tile.x, tile->tile.y, tile->tile.height, tile->tile.width, - tile->workspace->num + 1, - tile->workspace->output->wlr_output->name, + tile->workspace->num + 1, tile->workspace->output->name, output_get_num(tile->workspace->output)); } @@ -455,18 +454,18 @@ resize_vertical(struct cg_tile *tile, struct cg_tile *parent, int y_offset, void resize_tile(struct cg_server *server, int hpixs, int vpixs) { struct cg_output *output = server->curr_output; - struct wlr_box output_box; - wlr_output_layout_get_box(output->server->output_layout, output->wlr_output, - &output_box); struct cg_tile *focused = output->workspaces[output->curr_workspace]->focused_tile; /* First do the horizontal adjustment */ - if(hpixs != 0 && focused->tile.width < output_box.width && - is_between_strict(0, output_box.width, focused->tile.width + hpixs)) { + if(hpixs != 0 && + focused->tile.width < output_get_layout_box(output).width && + is_between_strict(0, output_get_layout_box(output).width, + focused->tile.width + hpixs)) { int x_offset = 0; /* In case we are on the total right, move the left edge of the tile */ - if(focused->tile.x + focused->tile.width == output_box.width) { + if(focused->tile.x + focused->tile.width == + output_get_layout_box(output).width) { x_offset = -hpixs; } bool resize_allowed = @@ -476,10 +475,13 @@ resize_tile(struct cg_server *server, int hpixs, int vpixs) { } } /* Repeat for vertical */ - if(vpixs != 0 && focused->tile.height < output_box.height && - is_between_strict(0, output_box.height, focused->tile.height + vpixs)) { + if(vpixs != 0 && + focused->tile.height < output_get_layout_box(output).height && + is_between_strict(0, output_get_layout_box(output).height, + focused->tile.height + vpixs)) { int y_offset = 0; - if(focused->tile.y + focused->tile.height == output_box.height) { + if(focused->tile.y + focused->tile.height == + output_get_layout_box(output).height) { y_offset = -vpixs; } bool resize_allowed = @@ -500,7 +502,7 @@ keybinding_workspace_fullscreen(struct cg_server *server) { "\"workspace\":%d,\"output\":\"%s\",\"output_id\":%d}", output->workspaces[output->curr_workspace]->focused_tile->id, output->workspaces[output->curr_workspace]->num + 1, - output->wlr_output->name, output_get_num(output)); + output->name, output_get_num(output)); } // Switch to a differerent virtual terminal @@ -593,8 +595,8 @@ keybinding_split_output(struct cg_output *output, bool vertical) { "{\"event_name\":\"split\",\"tile_id\":%d,\"new_tile_id\":%d," "\"workspace\":%d,\"output\":\"%s\",\"output_id\":%d,\"vertical\":%d}", curr_workspace->focused_tile->id, new_tile->id, curr_workspace->num + 1, - curr_workspace->output->wlr_output->name, - output_get_num(curr_workspace->output), vertical); + curr_workspace->output->name, output_get_num(curr_workspace->output), + vertical); } static void @@ -612,8 +614,7 @@ keybinding_close_view(struct cg_view *view) { outp->server, "{\"event_name\":\"close\",\"view_id\":%d,\"view_pid\":%d,\"tile_id\":" "%d,\"workspace\":%d,\"output\":\"%s\",\"output_id\":%d}", - view_id, view_pid, tile_id, ws + 1, outp->wlr_output->name, - output_get_num(outp)); + view_id, view_pid, tile_id, ws + 1, outp->name, output_get_num(outp)); } static void @@ -628,7 +629,7 @@ keybinding_split_horizontal(struct cg_server *server) { static void into_process(const char *command) { - execl("/bin/sh", "sh", "-c", command, (char *)NULL); + execlp("sh", "sh", "-c", command, (char *)NULL); _exit(1); } @@ -668,8 +669,8 @@ keybinding_cycle_outputs(struct cg_server *server, bool reverse, "{\"event_name\":\"cycle_outputs\",\"old_output\":\"%s\",\"old_" "output_id\":%d," "\"new_output\":\"%s\",\"new_output_id\":%d,\"reverse\":%d}", - old_output->wlr_output->name, output_get_num(old_output), - output->wlr_output->name, output_get_num(output), reverse); + old_output->name, output_get_num(old_output), output->name, + output_get_num(output), reverse); } } @@ -719,7 +720,7 @@ keybinding_cycle_views(struct cg_server *server, bool reverse, bool ipc) { curr_id, curr_pid, next_view == NULL ? -1 : (int)next_view->id, next_view == NULL ? -1 : (int)next_view->impl->get_pid(next_view), next_view->tile->id, curr_workspace->num + 1, - curr_workspace->output->wlr_output->name, + curr_workspace->output->name, output_get_num(curr_workspace->output)); } } @@ -742,7 +743,7 @@ keybinding_focus_tile(struct cg_server *server, uint32_t tile_id) { "{\"event_name\":\"focus_tile\",\"old_tile_id\":%d,\"new_tile_" "id\":%d,\"workspace\":%d,\"output\":\"%s\",\"output_id\":%d}", old_tile->id, workspace->focused_tile->id, workspace->num + 1, - output->wlr_output->name, output_get_num(output)); + output->name, output_get_num(output)); break; } } @@ -776,8 +777,7 @@ keybinding_switch_ws(struct cg_server *server, uint32_t ws) { ipc_send_event(output->server, "{\"event_name\":\"switch_ws\",\"old_workspace\":%d," "\"new_workspace\":%d,\"output\":\"%s\",\"output_id\":%d}", - old_ws + 1, ws + 1, output->wlr_output->name, - output_get_num(output)); + old_ws + 1, ws + 1, output->name, output_get_num(output)); return 0; } @@ -834,6 +834,50 @@ print_str(struct dyn_str *outp, const char *fmt, ...) { return 0; } +char * +print_message_conf(struct cg_message_config *config) { + struct dyn_str outp_str; + outp_str.len = 0; + outp_str.cur_pos = 0; + uint32_t nmemb = 7; + outp_str.str_arr = calloc(nmemb, sizeof(char *)); + print_str(&outp_str, "\"message_config\": {"); + print_str(&outp_str, "\"font\": \"%s\",\n", config->font); + print_str(&outp_str, "\"display_time\": %d,\n", config->display_time); + print_str(&outp_str, "\"bg_color\": [%f,%f,%f,%f],\n", config->bg_color[0], + config->bg_color[1], config->bg_color[2], config->bg_color[3]); + print_str(&outp_str, "\"fg_color\": [%f,%f,%f,%f],\n", config->fg_color[0], + config->fg_color[1], config->fg_color[2], config->fg_color[3]); + switch(config->anchor) { + case CG_MESSAGE_TOP_LEFT: + print_str(&outp_str, "\"anchor\": \"top_left\"\n", config->font); + break; + case CG_MESSAGE_TOP_CENTER: + print_str(&outp_str, "\"anchor\": \"top_center\"\n", config->font); + break; + case CG_MESSAGE_TOP_RIGHT: + print_str(&outp_str, "\"anchor\": \"top_right\"\n", config->font); + break; + case CG_MESSAGE_BOTTOM_LEFT: + print_str(&outp_str, "\"anchor\": \"bottom_left\"\n", config->font); + break; + case CG_MESSAGE_BOTTOM_CENTER: + print_str(&outp_str, "\"anchor\": \"bottom_center\"\n", config->font); + break; + case CG_MESSAGE_BOTTOM_RIGHT: + print_str(&outp_str, "\"anchor\": \"bottom_right\"\n", config->font); + break; + case CG_MESSAGE_CENTER: + print_str(&outp_str, "\"anchor\": \"center\"\n", config->font); + break; + case CG_MESSAGE_NOPT: // This should actually never occur + print_str(&outp_str, "\"anchor\": \"no_op\"\n", config->font); + break; + } + print_str(&outp_str, "}"); + return dyn_str_to_str(&outp_str); +} + void print_modes(struct dyn_str *str, char **modes) { uint32_t len = 0; @@ -1017,19 +1061,19 @@ print_output(struct cg_output *outp) { struct dyn_str outp_str; outp_str.len = 0; outp_str.cur_pos = 0; - uint32_t nmemb = 8; - struct wlr_box outp_box; - wlr_output_layout_get_box(outp->server->output_layout, outp->wlr_output, - &outp_box); + uint32_t nmemb = 10; outp_str.str_arr = calloc(nmemb, sizeof(char *)); - print_str(&outp_str, "\"%s\": {\n", outp->wlr_output->name); + print_str(&outp_str, "\"%s\": {\n", outp->name); print_str(&outp_str, "\"priority\": %d,\n", outp->priority); - print_str(&outp_str, "\"coords\": {\"x\":%d,\"y\":%d},\n", outp_box.x, - outp_box.y); + print_str(&outp_str, "\"coords\": {\"x\":%d,\"y\":%d},\n", + output_get_layout_box(outp).x, output_get_layout_box(outp).y); print_str(&outp_str, "\"size\": {\"width\":%d,\"height\":%d},\n", outp->wlr_output->width, outp->wlr_output->height); print_str(&outp_str, "\"refresh_rate\": %f,\n", (float)outp->wlr_output->refresh / 1000.0); + print_str(&outp_str, "\"permanent\": %d,\n", + outp->role == OUTPUT_ROLE_PERMANENT); + print_str(&outp_str, "\"active\": %d,\n", !outp->destroyed); print_str(&outp_str, "\"curr_workspace\": %d,\n", outp->curr_workspace + 1); char *workspaces_str = print_workspaces(outp); if(workspaces_str != NULL) { @@ -1183,7 +1227,7 @@ keybinding_dump(struct cg_server *server) { struct dyn_str str; str.len = 0; str.cur_pos = 0; - uint32_t nmemb = 13; + uint32_t nmemb = 14; str.str_arr = calloc(nmemb, sizeof(char *)); print_str(&str, "{\"event_name\":\"dump\","); @@ -1200,11 +1244,15 @@ keybinding_dump(struct cg_server *server) { } print_str(&str, "\"views_curr_id\":%d,\n", curr_view_id); print_str(&str, "\"tiles_curr_id\":%d,\n", curr_tile_id); - print_str(&str, "\"curr_output\":\"%s\",\n", - server->curr_output->wlr_output->name); + print_str(&str, "\"curr_output\":\"%s\",\n", server->curr_output->name); print_str(&str, "\"default_mode\":\"%s\",\n", get_mode_name(server->modes, server->seat->default_mode)); print_modes(&str, server->modes); + char *message_string = print_message_conf(&server->message_config); + if(message_string != NULL) { + print_str(&str, "%s,", message_string); + free(message_string); + } char *outps_str = print_outputs(server); if(outps_str != NULL) { print_str(&str, "%s,", outps_str); @@ -1296,9 +1344,8 @@ keybinding_move_view_to_cycle_output(struct cg_server *server, bool reverse) { "{\"event_name\":\"move_view_to_cycle_output\",\"view_id\":%d,\"view_" "pid\":%d,\"old_output\":\"%s\",\"old_output_id\":%d,\"new_output\":\"%" "s\",\"new_output_id\":%d,\"old_tile_id\":%d,\"new_tile_id\":%d}", - id, pid, old_outp->wlr_output->name, output_get_num(old_outp), - server->curr_output->wlr_output->name, - output_get_num(server->curr_output), + id, pid, old_outp->name, output_get_num(old_outp), + server->curr_output->name, output_get_num(server->curr_output), old_outp->workspaces[old_outp->curr_workspace]->focused_tile->id, server->curr_output->workspaces[server->curr_output->curr_workspace] ->focused_tile->id); @@ -1420,8 +1467,8 @@ keybinding_switch_output(struct cg_server *server, int output) { "{\"event_name\":\"switch_output\",\"old_output\":" "\"%s\",\"old_output_id\":%d,\"new_output\":\"%s\"," "\"new_output_id\":%d}", - old_outp->wlr_output->name, output_get_num(old_outp), - it->wlr_output->name, output_get_num(it)); + old_outp->name, output_get_num(old_outp), it->name, + output_get_num(it)); return; } ++count; @@ -1467,8 +1514,7 @@ keybinding_move_view_to_output(struct cg_server *server, int output_num) { server, "{\"event_name\":\"move_view_to_output\",\"view_id\":%d,\"old_" "output\":\"%s\",\"new_output\":\"%s\"}", - view_id, old_outp->wlr_output->name, - server->curr_output->wlr_output->name); + view_id, old_outp->name, server->curr_output->name); } void @@ -1503,7 +1549,7 @@ keybinding_move_view_to_workspace(struct cg_server *server, uint32_t ws) { "\"old_workspace\":%d,\"new_workspace\":%d," "\"output\":\"%s\",\"output_id\":%d,\"view_pid\":%d}", view == NULL ? -1 : (int)view->id, old_ws + 1, ws + 1, - server->curr_output->wlr_output->name, + server->curr_output->name, output_get_num(server->curr_output), view == NULL ? 0 : view->impl->get_pid(view)); } @@ -1552,17 +1598,18 @@ keybinding_configure_output(struct cg_server *server, struct cg_output *output, *tmp_output; wl_list_for_each_safe(output, tmp_output, &server->outputs, link) { - if(strcmp(config->output_name, output->wlr_output->name) == 0) { + if(strcmp(config->output_name, output->name) == 0) { + int output_num = output_get_num(output); output_configure(server, output); - ipc_send_event(output->server, + ipc_send_event(server, "{\"event_name\":\"configure_output\",\"output\":\"%" "s\",\"output_id\":%d}", - cfg->output_name, output_get_num(output)); + cfg->output_name, output_num); return; } } wl_list_for_each_safe(output, tmp_output, &server->disabled_outputs, link) { - if(strcmp(config->output_name, output->wlr_output->name) == 0) { + if(strcmp(config->output_name, output->name) == 0) { output_configure(server, output); ipc_send_event( output->server, @@ -1618,6 +1665,9 @@ keybinding_configure_message(struct cg_server *server, server->message_config.fg_color[2] = config->fg_color[2]; server->message_config.fg_color[3] = config->fg_color[3]; } + if(config->anchor != CG_MESSAGE_NOPT) { + server->message_config.anchor = config->anchor; + } ipc_send_event(server, "{\"event_name\":\"configure_message\"}"); } @@ -1659,6 +1709,10 @@ run_action(enum keybinding_action action, struct cg_server *server, case KEYBINDING_RUN_COMMAND: { int pid; if((pid = fork()) == 0) { + setsid(); + sigset_t set; + sigemptyset(&set); + sigprocmask(SIG_SETMASK, &set, NULL); if(fork() == 0) { into_process(data.c); } diff --git a/keybinding.h b/keybinding.h index a5958f0..fca1271 100644 --- a/keybinding.h +++ b/keybinding.h @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #ifndef KEYBINDING_H diff --git a/keys/cagebreak@project-repo.co.pub b/keys/cagebreak@project-repo.co.pub index 648618b..4ef3235 100644 --- a/keys/cagebreak@project-repo.co.pub +++ b/keys/cagebreak@project-repo.co.pub @@ -1,87 +1,76 @@ -----BEGIN PGP PUBLIC KEY BLOCK----- -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 -=bl5A +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 +6arp +=AorA -----END PGP PUBLIC KEY BLOCK----- diff --git a/keys/cagebreak@project-repo.co.pub-legacy-4 b/keys/cagebreak@project-repo.co.pub-legacy-4 new file mode 100644 index 0000000..648618b --- /dev/null +++ b/keys/cagebreak@project-repo.co.pub-legacy-4 @@ -0,0 +1,87 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=bl5A +-----END PGP PUBLIC KEY BLOCK----- diff --git a/keys/cagebreak_signing_key_13@project-repo.co.pub b/keys/cagebreak_signing_key_13@project-repo.co.pub new file mode 100644 index 0000000..7c8a376 --- /dev/null +++ b/keys/cagebreak_signing_key_13@project-repo.co.pub @@ -0,0 +1,76 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBGWUZaEBEACb84wE6iLL+FjnziWKDUR0zeYLth3x10UZS7Yu0zmrZOFlht4M +OQJ7Fr7aOAu30XRrNWKMaXov5kBIaggpg3vMGT4bL0yoeWoHc39mU2JL78pP1c08 +H+I+KusCcsLtCT07k+YvUWCXYjRtSs/w14SS7Hj5CyMp4NNLqMRkLd4Hcd4CT5qp +PhlHAULVCEPsALk7krrNLG4XqAwvpvuWZR6FDgdxHHwpu2zI+43cfhZQ3XP88dk0 +WGI+owoD+yYib2xY2+gU5IbHoVNUCF7Zdkf+5a2K1mYU4hkCGQQyx3LBKEa45BVF +I25uxBQ/elH9r02K3ppAdixqEs+RlL5VFudM3/Cdl04qfgHOxmkNJzSAiZlhoYHw +uta0o0ynFwYJIi1EUnOAFsrGeE0XcKeT7DXjbAsSqBm1lev7s4ueKvCgfnY5S06k +JhQZsVFnF7XxW6Ar+32AxEH+8fO1KQUJlenzIupPg03hx2zQ9BxaXnS+3rDzXDaF +kbFTaHz5ldU1DyqmHaFH9NEZH+2k2b45nmoc2Ts5D24g59+siJzb/mWk/iQCioJ/ +pAFrDuEunHVoXMOlZ43cph3qAy7mjG+KnUY9QSIZl+SsHvJHUJXD3qJkoDPOwQI/ +jro66de7U3WS28z1yPEr5jGkBgnPMEN35QbrGQ2tUPDJl12vJgvU24HpmQARAQAB +tENDYWdlYnJlYWsgU2lnbmluZyBLZXkgMTMgPGNhZ2VicmVha19zaWduaW5nX2tl +eV8xM0Bwcm9qZWN0LXJlcG8uY28+iQJXBBMBCABBFiEEQ4wn3bXRdGc99NZ7RRIF +s1KMfGMFAmWUZaECGwMFCQHhM4AFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AA +CgkQRRIFs1KMfGMwUQ//RJZp4b2DgtBlJv7tCXMt+qcUes1nSvVhbhtbfdPGa7K4 +zh51UEYrhFz98fWAtER/ZRVouXNSpnnnR4fsqFP5yJDJWVbVFI7hnqcZ+SB4ojRz +5A6fnegv7CqgY7Ix8JH26eSahYwpSK2NDgs9ZUvUZk8RsOrke94wi/DaDQXVbnGr +Uz7/a+Umcg0P9J+3e1CVnTHu/u/NpyNmsqcc0LA6QNKwfZFKtfJ+Kv7xMkIsVIuZ +lnT5dcXYrTGDjf8IO+1Lr2ecg28ZAlyK69LFASvsnUA+WkUqlm1woZe7eimzRUhp +yD91d5R4mbrxoEWpU6atf6nam9o5qdr6a7P8iJXmx55oLe35kw7NIPKb9VAVq7Zb +Fz94F6xnfHNkWhUpiHWcXh3iJkHJgie2WrSstHJjRKpALr7VBhvNb7eykRpIkdnO +1D4J8Kjp2hRhPReRCoYHtkzixZYg9uxfODsm+rS1nj27R5Y6i0x4RXOdQcSs8V5j +eb+Lefd6xB7/SX4IkWsBr4f9wgiWL/ZVKvnOhMEaq0TuRb4KPFJ4aflTq7LvzMmG +wGqQaqzuWsxQdkB4BhfaPZlSrLkV6bOUhTAT25WbgiOsvDjhhUnItX3PR7T7Opcd +yzfVfJ+0cGm6os9wfZyOQ7aysBaBCQGn/aRlyOIbIdOO+WV0zfaNFeD20Z3le9mJ +AjMEEAEIAB0WIQROgscsaz5Yp7xP+FVJCfhMqDu4ZwUCZZV7BQAKCRBJCfhMqDu4 +Z/acD/92MiqYEugEo8JszGNugJ6jpoNVSCP8RFiHR2uxyorPx0MCgGcrbUMgpdZc +gHaCyEWYD9vSOiut3g71H/iY6iACV8L5AaVkkodwKX+YKg0FASdVeu3uekNvHX4D +GwhX+LMr2E0QYe98mhffCUnuJbPNFY5Oj6eQEJ525t0JxOUHPJ6k3WvgW/lmVsik +oLVC5iQzz+z96bZ/J+bN0Fgd+bCy7eT3c2I+O0UjtrUr9vBCpW8J/EzkiWVAqaJg +0tTZOCiQmDTADoSw+g3AhxdU1ilnuB1VDLVhLmijsu51yt6JWeSsB3wU8ga3GpE3 +HDbTBQji6aF6yt/zOtBVTsSNdfDrKUmb0FzfjdLKwUXfZjBaaXxM9LQLRkMqjnBX ++zqqkIqhRKgKbDT8y5Cq35I5rN6EjL8+Ck/LgeZ1x/wox0l6KLzu8H/rFHclt5VJ +0yAN0md9ZIDCmVqJQO7EVUQ3s1qU1rDrFjCZViJG9khBNvAZLkjnMx3BeJ9RJS2q +D3rMpk45A1Y88QS3fnttNGLHwp1sR6LW8FD1qyY0o1cQ09/b3JSkIiF3Bbl/X7Ze +qgm76Mj4nKcjfXtW15jdn78Hj7S2+yMcuyzexYSdsPVQONOuhkWaruoVH06RLTbT +MUQbgBaBfQqRaMyTzxkAL/u98seS0Limc9Gwtyttr2q1xy4i3IkCMwQQAQgAHRYh +BFrrGi6w0T9n4wasWdwMyBvgBv2FBQJllXtBAAoJENwMyBvgBv2Fc/YP/3dgkwXS +GOii3+rDFp+Xrz8Dp3fwFTjmpxsM+ODXsI0Yf2qVohkmzfrz3cDlpm+rpYu/Mp8/ +Ss5b70XCbFZV4lnPz4jmiOchdcgsZcI29x4u78LPvl3gAVuOWyvcf1SrMFcRM+rh +YdEp/nugfPk1+9TOWUISUxrLCnR4a1ezg50p7C9TOiPAnLstog2p0rFYrmzBdH5V +EPU++Znyk0U9vqmH/99kkppY4SU6Pnph/w2at5N+WKLJ9djShaNwpedF5dWJArMj +Qlem0giTJb3WcKLYzWjhthYeASMg+j9SYVWC3Sgk6kRyBEZeWg7zO/v0ovnTATU5 +34ABMkOTRYZr49qvUlrdleyN36uR7S9o+Gb+41q+EqHlVW4+eaFiNqN//WvuSG1a +9sNcDDOxTsEqSdhEpy1WCuHGnzlUk/VG2cI4xlNtDWbW4V0P/SYZ4BXasxdkHYCd +Hgg/81/PL57KlxyqzOEFOB/Fn6wPE/4ElFvcRhe3sLSbq+3OLHQLe/1Vc6Rxmwqx +KK34TWRZOW5/HM6KCyo6+YeEhaclV0q3GneGg/yvgO7AoMQG8nPxGFyLHgdlfeji +XEFIA4e4Z74N+Sx0GcyY41xTt9y3/Dg/WdJg6KO7Mqa4ecp44O+kPJz7Q8hZ6yS9 +Pd74UjYivJ2caK5BUc6t3YnP0XSxsGLLkf51uQINBGWUZaEBEADLl3EO9ZabLHbE +dTESl23Q2MokmHRY69JMNTFhldq6zFjgu4lz1Q9a0YQJQEuXSGFh4h+JXTKHij6y +IJSE8LZcD7Epd0ko2hbF2etcflFV4j0/2SByfnHLt2oqauhUFCsZZeuTpguysRGI +mvjhGsCjYi9nBZA42AgukPC/sh1onuVKejYjIZLJKyR47gowJxRSbnOtuSTkppYW +e/EEF4FJsV35C0t1N1aMvtc5sidVwuaxSVGJflNMGaoKlvoIex+vK1LrSum0Ji3t +9QfAerYL1ZnyU8dZ63c870vyY0cxFegtv/d9qDohjiUqUYrZ1jIUdY4o/IvDSMhc +x3iSOB1CB3oIup66oNpnmGP6CAN7UpnnGIYjMWb4eAeVSOHMEEzxdwQl/BEg/K3z +IbRM1BdCv82WGx0no1FNE/PmFkboHAQMSV+3gbO58aQEBnOROfnxVTG9lK7Ey4uc +LrZs0nJsvOQxXemQvcTTPL/C2L7y3Hyf2wQO/2JC+Z7cINiYpRuYRS37gwmuC5ik +P6yu1uLUpjHGpDMPv9yAB4qNUAkfnBT7Et59P0TznnYONwRZ8fVf8KZ8H2HiwpeI +CjIASrfCRMu4VInKZALYgF0kaqsuZW6LcHYIJ3K4/1GhEfVTDTiRSz1MqtjjRfDw +Avu3aOe7y2UKEkOaqWDf9a/Zs85ucwARAQABiQI8BBgBCAAmFiEEQ4wn3bXRdGc9 +9NZ7RRIFs1KMfGMFAmWUZaECGwwFCQHhM4AACgkQRRIFs1KMfGPg3w/9Hfu1haNG +v5CPojVlvfBWGhDdnQiqAAWuQpDwZIZB3CZ7HPBXAInH5J5dR/s3akZdwb6zvxdK +RuvbkIdw8hFWsc0M3tIIM3mWim9ctB3xYqC4O6gyFdqDNHk4B4j0xrbeSVgp+kPP +gV5J8rfegY09uxzPKlUgpIf8NRhdE/gLjm5nv1KrIe3G1Bk/0H7RhRkqug5rkAE8 +TfLGrvXkYCWJ0BHU3mivBJt/NaAgj/SF0YbomRPFt5BJzYGU6EEyj+G6AIHrm4np +88/5ZAqxfb37wtucXJ+IcjHZsEBAuh61xMWHpgxlJ1246+G+FJM1aHlqGbWruNlo +R6dymqN/kMbN4nKWG3j8549Av03ltpzxaASf4vjDHZ0GziXCovnzGaF9Bt5wyG7v +TyaUBFxacdtKCgMzGidIvPVrTqLxSr7Dwn8Iz3oZp4yVZpldEuTP5OxA/OP55ym1 +tAPEKVpa9Ui+R+5dwhRWzMxdZ7Ns0OrquFbZ6/rGafqie8fjVmEIoSjd0Ny+/40t +EGKSx//F90ZPS02ZRqy12rVV/i5Xyt38UCzlegFq9BAsz2IhXkUQSts0EAS3wE2Q +D+B+0RH+tcL4I8AzyE/LMpHBA7m1hi6kciCOHSzYANvuTJ3na6p0x6YBhcRkPgTD +XPUssBeVi6uNhWON/EjKc0cLAfNwuBrjj6I= +=5Ie4 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/keys/cagebreak_signing_key_14@project-repo.co.pub b/keys/cagebreak_signing_key_14@project-repo.co.pub new file mode 100644 index 0000000..974001d --- /dev/null +++ b/keys/cagebreak_signing_key_14@project-repo.co.pub @@ -0,0 +1,76 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +2rpj+N0DJVi3/r0GWYgBEzvO+yV1ly011sk= +=AVO4 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/libinput.c b/libinput.c index e980060..b6244aa 100644 --- a/libinput.c +++ b/libinput.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #include "input.h" @@ -219,7 +219,7 @@ output_by_name_or_id(const char *name_or_id, struct cg_server *server) { char identifier[128]; output_get_identifier(identifier, sizeof(identifier), output); if(strcasecmp(identifier, name_or_id) == 0 || - strcasecmp(output->wlr_output->name, name_or_id) == 0) { + strcasecmp(output->name, name_or_id) == 0) { return output; } } diff --git a/man/cagebreak-config.5.md b/man/cagebreak-config.5.md index d5b4969..ee68d72 100644 --- a/man/cagebreak-config.5.md +++ b/man/cagebreak-config.5.md @@ -1,8 +1,8 @@ -cagebreak-config(5) "Version 2.2.3" "Cagebreak Manual" +cagebreak-config(5) "Version 2.3.0" "Cagebreak Manual" # NAME -*cagebreak-config* — Cagebreak configuration file +*cagebreak-config* Cagebreak configuration file # SYNOPSIS @@ -17,9 +17,8 @@ are parsed sequentially but independently from the rest of the file. Each line starting with a "#" is a comment. -Note that nesting of commands is limited to 50 times, though lines -are arbitrarily long in practice, though a reasonable limit of 4Mb has -been set. +Note that nesting of commands is limited to 50 times. +Lines are arbitrarily long in practice, though a reasonable limit of 4Mb has been set. See *KEY DEFINITIONS* for details on modifier keys and *MODES* for details on modes. @@ -29,8 +28,8 @@ on modes. *abort* Return to default mode -*background * - Set RGB of background - <[r|g|b]> are floating point numbers +*background * + Set RGB of background - <[r|g|b]\> are floating point numbers between 0 and 1. There is no support for background images. @@ -39,8 +38,8 @@ on modes. background 1.0 0.0 0.0 ``` -*bind * - Bind to execute if pressed in root mode +*bind * + Bind to execute if pressed in root mode ``` bind @@ -52,15 +51,17 @@ definekey root Close current window - This may be useful for windows of applications which do not offer any method of closing them. -*configure_message [font |[f|b]g_color b> |display_time ]* +*configure_message [font |[f|b]g_color |display_time |anchor ]* Configure message characteristics - - - font sets - - is - - X core font description or - - FreeType font description via pango - - fg_color sets RGBA of foreground - - bg_color sets RGBA of background - - display_time sets display time in seconds + - font sets the font of the message. + Here, is either + - an X core font description or + - a FreeType font description via pango + - fg_color sets the RGBA of the foreground + - bg_color sets the RGBA of the background + - display_time sets the display time in seconds + - anchor sets the position of the message. + may be one of {top,bottom}\_{left,center,right} or center. ``` # Set font @@ -85,20 +86,20 @@ configure_message display_time 4 This simply hides the cursor. Pointing and clicking is still possible. -*custom_event * +*custom_event * Send a custom event to the IPC socket This sends an event of type "custom_event" to all programs - listening to the IPC socket along with the string . + listening to the IPC socket along with the string . See *cagebreak-socket(7)* for more details. -*definekey * - Bind to execute if pressed in - +*definekey * + Bind to execute if pressed in - *definekey* is a more general version of *bind*. -*definemode * - Define new mode - After a call to *definemode*, - can be used with *definekey* to create a custom key mapping. +*definemode * + Define new mode - After a call to *definemode*, + can be used with *definekey* to create a custom key mapping. ``` # define new mode and create a mapping for it @@ -109,8 +110,8 @@ definekey foo C-t abort *dump* Triggers the *dump* event, see *cagebreak-socket(7)* for details -*escape * - Set to switch to root mode to execute one command +*escape * + Set to switch to root mode to execute one command ``` escape @@ -130,8 +131,8 @@ definekey top mode root *exchangeup* Exchange current window with window in the tile to the top -*exec * - Execute using *sh -c* +*exec * + Execute using *sh -c* *focus* Focus next tile @@ -154,10 +155,10 @@ definekey top mode root *hsplit* Split current tile horizontally -*input * - Set to for device - - can be "\*" (wildcard), of the form - "type:" or the identifier of the device as printed +*input * + Set to for device - + can be "\*" (wildcard), of the form + "type:" or the identifier of the device as printed for example by *cagebreak -s*. The supported input types are - touchpad - pointer @@ -174,7 +175,7 @@ definekey top mode root *accel_profile adaptive|flat* Set pointer acceleration profile for specified input device - *calibration_matrix <6 space-separated floating point values>* + *calibration_matrix <6 space-separated floating point values\>* Set calibration matrix *click_method none|button_areas|clickfinger* @@ -207,26 +208,26 @@ definekey top mode root Enable or disable natural (inverted) scrolling for specified input device - *pointer_accel [<-1|1>]* + *pointer_accel [<-1|1\>]* Change the pointer acceleration for specified input device - *scroll_button disable|* + *scroll_button disable|* Set button used for scroll_method on_button_down - The button can be given as an event name or code, which can be obtained from *libinput debug-events*. If set to _disable_, it disables the scroll_method on_button_down. - *scroll_factor * + *scroll_factor * Change the scroll factor for the specified input device - Scroll speed will be scaled by the given value, which must be non-negative. *scroll_method none|two_finger|edge|on_button_down* Change scroll method for specified input device - *repeat_delay * + *repeat_delay * Repeat delay in ms for keyboards only - *repeat_rate * + *repeat_rate * Repeat rate in 1/s for keyboards only *tap enabled|disabled* @@ -238,11 +239,11 @@ definekey top mode root middle click. _lmr_ treats 1 finger as left click, 2 fingers as middle click, and 3 fingers as right click. -message +message Display a line of arbitrary text. -*mode * - Enter mode "" - Returns to default mode, after a command is +*mode * + Enter mode "" - Returns to default mode, after a command is executed. *movetonextscreen* @@ -253,12 +254,12 @@ message Move currently focused window to previous screen See *output* for differences between screen and output. -*movetoscreen * - Move currently focused window to -th screen +*movetoscreen * + Move currently focused window to -th screen See *output* for differences between screen and output. -*movetoworkspace * - Move currently focused window to -th workspace +*movetoworkspace * + Move currently focused window to -th workspace See *output* for differences between screen and output. *next* @@ -271,23 +272,32 @@ message *only* Remove all splits and make current window fill the entire screen -*output [[pos res x rate [scale ]] | enable | disable | prio | rotate ]* - Configure output "" - - - and are the position of the +*output [[pos res x rate [scale ]] | enable | disable | [permanent|peripheral] | prio | rotate ]* + Configure output "" - + - and are the position of the monitor in pixels. The top-left monitor should have the coordinates 0 0. - - and specify the resolution in pixels. - - sets the refresh rate of the monitor (often this is 50 or 60). - - sets the output scale (default is 1.0) - - enable and disable enable or disable . Note that if - is the only enabled output, *output disable* has + - and specify the resolution in pixels. + - sets the refresh rate of the monitor (often this is 50 or 60). + - sets the output scale (default is 1.0) + - enable and disable enable or disable . Note that if + is the only enabled output, *output disable* has no effect. - - prio is used to set the priority of an output. If + - permanent sets to persist even on disconnect. When + the physical monitor is disconnected, the output is + maintained and operates identically to the attached monitor. On reconnect, + the monitor operates as though it was never disconnected. Setting the + output role to peripheral when the monitor is disconnected, + destroys the output, as if the monitor were disconnected. + - peripheral sets the role of to peripheral, meaning that on + disconnecting the respective monitor, all views will be moved to another + available output. The default role is peripheral. + - prio is used to set the priority of an output. If nothing else is set, outputs are added as they request to be added - and have a numerical priority of -1. Using prio it is possible - to set priorities for outputs, where >= 1. The larger is, + and have a numerical priority of -1. Using prio it is possible + to set priorities for outputs, where >= 1. The larger is, the higher the priority is, that is to say, the earlier the output will appear in the list of outputs. - - rotate is used to rotate the output by ` mod 4 x 90` degrees + - rotate is used to rotate the output by ` mod 4 x 90` degrees counter-clockwise. ``` @@ -333,19 +343,19 @@ output DP-1 rotate 3 *resizeup* Resize current tile towards the top -*screen * - Change to -th screen +*screen * + Change to -th screen See *output* for differences between screen and output. *show_info* Display information about the current setup - In particular, print the identifiers of the available inputs and outputs. -*setmode * - Set default mode to +*setmode * + Set default mode to -*switchvt * - Switch to tty +*switchvt * + Switch to tty *time* Display time @@ -353,11 +363,11 @@ output DP-1 rotate 3 *vsplit* Split current tile vertically -*workspace * - Change to -th workspace +*workspace * + Change to -th workspace -*workspaces * - Set number of workspaces to - is a single integer larger than 1 +*workspaces * + Set number of workspaces to - is a single integer larger than 1 and less than 30. # MODES @@ -386,7 +396,7 @@ Keys are specified by their names as displayed for example by *xev*. Modifiers can be specified using the following syntax: - - + - The supported modifiers are: @@ -398,7 +408,7 @@ The supported modifiers are: *S - Shift* -*2 - Mod2* +*2 - Mod 2* *3 - Mod 3* @@ -425,14 +435,12 @@ Mail contact: `cagebreak @ project-repo . co` GPG Fingerprints: -- B15B92642760E11FE002DE168708D42451A94AB5 -- F8DD9F8DD12B85A28F5827C4678E34D2E753AA3C -- 3ACEA46CCECD59E4C8222F791CBEB493681E8693 - 0A268C188D7949FEB39FD1462F2AD980247E4918 +- 283D10F54201B0C6CCEE2C561DE04E4B056C749D # LICENSE -Copyright (c) 2020-2023 The Cagebreak authors +Copyright (c) 2020-2024 The Cagebreak authors Copyright (c) 2018-2020 Jente Hidskes diff --git a/man/cagebreak-socket.7.md b/man/cagebreak-socket.7.md index 19365d6..ed47f05 100644 --- a/man/cagebreak-socket.7.md +++ b/man/cagebreak-socket.7.md @@ -1,8 +1,8 @@ -cagebreak-socket(7) "Version 2.2.3" "Cagebreak Manual" +cagebreak-socket(7) "Version 2.3.0" "Cagebreak Manual" # NAME -*cagebreak-socket* — Cagebreak socket +*cagebreak-socket* Cagebreak socket # SYNOPSIS @@ -30,7 +30,10 @@ Here is an example of how this works using *only* as a command sent over the soc ``` only -cg-ipc{"event_name":"fullscreen","tile_id":2,"workspace":1,"output":"eDP-1"} +cg-ipc{"event_name":"fullscreen", +"tile_id":2, +"workspace":1, +"output":"eDP-1"} ``` This documentation describes the trigger for the events, the keys and the data @@ -45,7 +48,9 @@ type of the values of each event. ``` background 0 1.0 0 -cg-ipc{"event_name":"background","old_bg":[0.000000,1.000000,1.000000],"new_bg":[0.000000,1.000000,0.000000]} +cg-ipc{"event_name":"background", +"old_bg":[0.000000,1.000000,1.000000], +"new_bg":[0.000000,1.000000,0.000000]} ``` *close* @@ -61,7 +66,13 @@ cg-ipc{"event_name":"background","old_bg":[0.000000,1.000000,1.000000],"new_bg": ``` close -cg-ipc{"event_name":"close","view_id":47,"view_pid":30456,"tile_id":47,"workspace":1,"output":"eDP-1","output_id":1} +cg-ipc{"event_name":"close", +"view_id":47, +"view_pid":30456, +"tile_id":47, +"workspace":1, +"output":"eDP-1", +"output_id":1} ``` *configure_input* @@ -110,7 +121,13 @@ cg-ipc{"event_name":"configure_output","output":"eDP-1","output_id":1} ``` # Cursor switches tile -cg-ipc{"event_name":"cursor_switch_tile","old_output":"eDP-1","old_output_id":1,"old_tile":2,"new_output":"eDP-1","new_output_id":1,"new_tile":3} +cg-ipc{"event_name":"cursor_switch_tile", +"old_output":"eDP-1", +"old_output_id":1, +"old_tile":2, +"new_output":"eDP-1", +"new_output_id":1, +"new_tile":3} ``` *custom_event* @@ -136,7 +153,12 @@ cg-ipc{"event_name":"custom_event","message":"Hello World!"} ``` nextscreen -cg-ipc{"event_name":"cycle_outputs","old_output":"eDP-1","old_output_id":1,"new_output":"HDMI-A-1","new_output_id":2,"reverse":0} +cg-ipc{"event_name":"cycle_outputs", +"old_output":"eDP-1", +"old_output_id":1, +"new_output":"HDMI-A-1", +"new_output_id":2, +"reverse":0} ``` *cycle_views* @@ -154,7 +176,15 @@ cg-ipc{"event_name":"cycle_outputs","old_output":"eDP-1","old_output_id":1,"new_ ``` next -cg-ipc{"event_name":"cycle_views","old_view_id":11,"old_view_pid":32223,"new_view_id":4,"old_view_pid";53221,"tile_id":13,"workspace":1,"output":"eDP-1","output_id":1} +cg-ipc{"event_name":"cycle_views", +"old_view_id":11, +"old_view_pid":32223, +"new_view_id":4, +"old_view_pid";53221, +"tile_id":13, +"workspace":1, +"output":"eDP-1", +"output_id":1} ``` *definekey* @@ -220,12 +250,20 @@ cg-ipc{"event_name":"destroy_output","output":"HDMI-A-1","output_id":2} - curr_output: current output as a string - default_mode: name of the default mode as a string - modes: list of names of modes as strings + - message_config: the current configuration of the cagebreak messages + - font: the font used to display the messages + - display_time: the duration in seconds that the cagebreak messages are displayed + - bg_color: list of four floating point numbers denoting the background color in rgba + - fg_color: list of four floating point numbers denoting the foreground color in rgba + - anchor: the positioning of the messages on the screen (see *cagebreak-config(5)* for more information) - outputs: object of objects for each output - output name as string - priority: priority as per *output* prio in *cagebreak-config(5)* or default - coords: object of x and y coordinates of output - size: object of width and height as integers - refresh_rate: refresh rate as float + - permanent: 0 if peripheral, 1 if permanent + - active: 1 if the output is active, 0 if not - curr_workspace: current workspace as an integer - workspaces: list of objects for each workspace - views: list of objects for each view @@ -258,11 +296,18 @@ cg-ipc{"event_name":"dump","nws":1, "curr_output":"eDP-1", "default_mode":"top", "modes":["top","root","resize"], -"outputs": {"eDP-1": { +"message_config": {"font": "pango:Monospace 10", +"display_time": 2, +"bg_color": [0.900000,0.850000,0.850000,1.000000], +"fg_color": [0.000000,0.000000,0.000000,1.000000], +"anchor": "top_right" +},"outputs": {"eDP-1": { "priority": -1, "coords": {"x":0,"y":0}, "size": {"width":2560,"height":1440}, "refresh_rate": 60.012000, +"permanent": 0, +"active": 1, "curr_workspace": 0, "workspaces": [{"views": [{ "id": 16, @@ -351,7 +396,12 @@ cg-ipc{"event_name":"dump","nws":1, ``` focus -cg-ipc{"event_name":"focus_tile","old_tile_id":14,"new_tile_id":13,"workspace":1,"output":"eDP-1","output_id":1} +cg-ipc{"event_name":"focus_tile", +"old_tile_id":14, +"new_tile_id":13, +"workspace":1, +"output":"eDP-1", +"output_id":1} ``` *fullscreen* @@ -365,7 +415,11 @@ cg-ipc{"event_name":"focus_tile","old_tile_id":14,"new_tile_id":13,"workspace":1 ``` only -cg-ipc{"event_name":"fullscreen","tile_id":3,"workspace":1,"output":"eDP-1","output_id":1} +cg-ipc{"event_name":"fullscreen", +"tile_id":3, +"workspace":1, +"output":"eDP-1", +"output_id":1} ``` *move_view_to_cycle_output* @@ -381,8 +435,17 @@ cg-ipc{"event_name":"fullscreen","tile_id":3,"workspace":1,"output":"eDP-1","out ``` movetonextscreen -cg-ipc{"event_name":"cycle_outputs","old_output":"eDP-1","new_output":"HDMI-A-1","reverse":0} -cg-ipc{"event_name":"move_view_to_cycle_output","view_id":11,"view_pid":43123,"old_output":"eDP-1","old_output_id":1,"new_output":"HDMI-A-1","new_output_id":2} +cg-ipc{"event_name":"cycle_outputs", +"old_output":"eDP-1", +"new_output":"HDMI-A-1", +"reverse":0} +cg-ipc{"event_name":"move_view_to_cycle_output", +"view_id":11, +"view_pid":43123, +"old_output":"eDP-1", +"old_output_id":1, +"new_output":"HDMI-A-1", +"new_output_id":2} ``` *move_view_to_output* @@ -395,8 +458,13 @@ cg-ipc{"event_name":"move_view_to_cycle_output","view_id":11,"view_pid":43123,"o ``` movetoscreen 2 -cg-ipc{"event_name":"switch_output","old_output":"eDP-1","new_output":"HDMI-A-1"} -cg-ipc{"event_name":"move_view_to_output","view_id":78,"old_output":"eDP-1","new_output":"HDMI-A-1"} +cg-ipc{"event_name":"switch_output", +"old_output":"eDP-1", +"new_output":"HDMI-A-1"} +cg-ipc{"event_name":"move_view_to_output", +"view_id":78, +"old_output":"eDP-1", +"new_output":"HDMI-A-1"} ``` *move_view_to_ws* @@ -412,8 +480,17 @@ cg-ipc{"event_name":"move_view_to_output","view_id":78,"old_output":"eDP-1","new ``` movetoworkspace 1 -cg-ipc{"event_name":"switch_ws","old_workspace":1,"new_workspace":1,"output":"eDP-1"} -cg-ipc{"event_name":"move_view_to_ws","view_id":43,"old_workspace":0,"new_workspace":0,"output":"eDP-1","output_id":1,"view_pid":64908} +cg-ipc{"event_name":"switch_ws", +"old_workspace":1, +"new_workspace":1, +"output":"eDP-1"} +cg-ipc{"event_name":"move_view_to_ws", +"view_id":43, +"old_workspace":0, +"new_workspace":0, +"output":"eDP-1", +"output_id":1, +"view_pid":64908} ``` *new_output* @@ -442,8 +519,19 @@ cg-ipc{"event_name":"new_output","output":"HDMI-A-1","output_id":2,"priority":-1 ``` resizeleft -cg-ipc{"event_name":"resize_tile","tile_id":14,"old_dims":"[1280,0,1440,1280]","new_dims":"[1270,0,1440,1290]","workspace":1,"output":"eDP-1","output_id":1} -cg-ipc{"event_name":"resize_tile","tile_id":13,"old_dims":"[0,0,1440,1280]","new_dims":"[0,0,1440,1270]","workspace":1,"output":"eDP-1","output_id":1} +cg-ipc{"event_name":"resize_tile", +"tile_id":14, +"old_dims":"[1280,0,1440,1280]", +"new_dims":"[1270,0,1440,1290]", +"workspace":1,"output":"eDP-1", +"output_id":1} +cg-ipc{"event_name":"resize_tile", +"tile_id":13, +"old_dims":"[0,0,1440,1280]", +"new_dims":"[0,0,1440,1270]", +"workspace":1, +"output":"eDP-1", +"output_id":1} ``` *set_nws* @@ -471,7 +559,13 @@ cg-ipc{"event_name":"set_nws","old_nws":1,"new_nws":2} ``` hsplit -cg-ipc{"event_name":"split","tile_id":11,"new_tile_id":12,"workspace":1,"output":"eDP-1","output_id":1,"vertical":0} +cg-ipc{"event_name":"split", +"tile_id":11, +"new_tile_id":12, +"workspace":1, +"output":"eDP-1", +"output_id":1, +"vertical":0} ``` *swap_tile* @@ -488,7 +582,13 @@ cg-ipc{"event_name":"split","tile_id":11,"new_tile_id":12,"workspace":1,"output" ``` exchangeright -cg-ipc{"event_name":"swap_tile","tile_id":1,"tile_pid":53478,"swap_tile_id":3,"swap_tile_pid":98234,"workspace":1,"output":"eDP-1"} +cg-ipc{"event_name":"swap_tile", +"tile_id":1, +"tile_pid":53478, +"swap_tile_id":3, +"swap_tile_pid":98234, +"workspace":1, +"output":"eDP-1"} ``` *switch_default_mode* @@ -514,7 +614,11 @@ switch_output ``` screen 2 -cg-ipc{"event_name":"switch_output","old_output":"eDP-1","old_output_id":1,"new_output":"HDMI-A-1","new_output_id":2} +cg-ipc{"event_name":"switch_output", +"old_output":"eDP-1", +"old_output_id":1, +"new_output":"HDMI-A-1", +"new_output_id":2} ``` switch_ws @@ -528,7 +632,11 @@ switch_ws ``` workspace 2 -cg-ipc{"event_name":"switch_ws","old_workspace":1,"new_workspace":2,"output":"eDP-1","output_id":1} +cg-ipc{"event_name":"switch_ws", +"old_workspace":1, +"new_workspace":2, +"output":"eDP-1", +"output_id":1} ``` *view_map* @@ -544,7 +652,13 @@ cg-ipc{"event_name":"switch_ws","old_workspace":1,"new_workspace":2,"output":"eD ``` # process opens a view -cg-ipc{"event_name":"view_map","view_id":28,"tile_id":14,"workspace":1,"output":"eDP-1","output_id":1,"view_pid":39827} +cg-ipc{"event_name":"view_map", +"view_id":28, +"tile_id":14, +"workspace":1, +"output":"eDP-1", +"output_id":1, +"view_pid":39827} ``` *view_unmap* @@ -560,7 +674,13 @@ cg-ipc{"event_name":"view_map","view_id":28,"tile_id":14,"workspace":1,"output": ``` # view is closed by the process -cg-ipc{"event_name":"view_unmap","view_id":24,"tile_id":13,"workspace":1,"output":"eDP-1","output_id":1,"view_pid":39544} +cg-ipc{"event_name":"view_unmap", +"view_id":24, +"tile_id":13, +"workspace":1, +"output":"eDP-1", +"output_id":1, +"view_pid":39544} ``` ## SECURITY @@ -590,14 +710,12 @@ Mail contact: `cagebreak @ project-repo . co` GPG Fingerprints: -- B15B92642760E11FE002DE168708D42451A94AB5 -- F8DD9F8DD12B85A28F5827C4678E34D2E753AA3C -- 3ACEA46CCECD59E4C8222F791CBEB493681E8693 - 0A268C188D7949FEB39FD1462F2AD980247E4918 +- 283D10F54201B0C6CCEE2C561DE04E4B056C749D # LICENSE -Copyright (c) 2022 - 2023 The Cagebreak authors +Copyright (c) 2022 - 2024 The Cagebreak 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 diff --git a/man/cagebreak.1.md b/man/cagebreak.1.md index bdd469f..4dfd854 100644 --- a/man/cagebreak.1.md +++ b/man/cagebreak.1.md @@ -1,4 +1,4 @@ -cagebreak(1) "Version 2.2.3" "Cagebreak Manual" +cagebreak(1) "Version 2.3.0" "Cagebreak Manual" # NAME @@ -28,7 +28,7 @@ socket specified in the environment variable *\$CAGEBREAK_SOCKET*. The syntax accepted through this socket is identical to that of the configuration file (see *cagebreak-config(5)*). Errors which occur during interaction over IPC channel -are displayed in a message box at the top right of the screen. +are displayed in a message box on the screen. # OPTIONS @@ -87,14 +87,12 @@ Mail contact: `cagebreak @ project-repo . co` GPG Fingerprints: -- B15B92642760E11FE002DE168708D42451A94AB5 -- F8DD9F8DD12B85A28F5827C4678E34D2E753AA3C -- 3ACEA46CCECD59E4C8222F791CBEB493681E8693 - 0A268C188D7949FEB39FD1462F2AD980247E4918 +- 283D10F54201B0C6CCEE2C561DE04E4B056C749D # LICENSE -Copyright (c) 2020-2023 The Cagebreak authors +Copyright (c) 2020-2024 The Cagebreak authors Copyright (c) 2018-2020 Jente Hidskes diff --git a/manuals.md b/manuals.md new file mode 100644 index 0000000..dd5f84b --- /dev/null +++ b/manuals.md @@ -0,0 +1,5 @@ +# Cagebreak Manuals + + * [cagebreak-config (5)](man/cagebreak-config.5.md) (probably, what you are looking for, commands etc.) + * [cagebreak (1)](man/cagebreak.1.md) (command line arguments, environment variables etc.) + * [cagebreak-socket (7)](man/cagebreak-socket.7.md) (mostly useful for scripting, socket information) diff --git a/meson.build b/meson.build index aeb3346..b0b458d 100644 --- a/meson.build +++ b/meson.build @@ -1,9 +1,9 @@ -# Copyright 2020 - 2023, project-repo and the cagebreak contributors +# Copyright 2020 - 2024, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT project( 'cagebreak', 'c', -version : '2.2.3', +version : '2.3.0', license : 'MIT', default_options : ['c_std=c11', 'warning_level=3'] ) @@ -204,12 +204,12 @@ reproducible_build_versions = { 'wayland_server': '1.19.0', 'wayland_client': '1.22.0', 'wayland_cursor': '1.22.0', - 'wlroots': '0.17.0', + 'wlroots': '0.17.1', 'xkbcommon': '1.6.0', - 'fontconfig': '2.14.2', - 'libinput': '1.24.0', + 'fontconfig': '2.15.0', + 'libinput': '1.25.0', 'libevdev': '1.13.1', - 'libudev': '254', + 'libudev': '255', 'pango': '1.51.0', 'cairo': '1.18.0', 'pangocairo': '1.51.0', @@ -260,7 +260,7 @@ install_data('LICENSE', install_dir : '/usr/share/licenses/' + meson.project_nam if get_option('man-pages') scdoc = find_program('scdoc') - secssinceepoch = 1701768836 + secssinceepoch = 1706213605 shcommand = 'export SOURCE_DATE_EPOCH=' + secssinceepoch.to_string() + ' ; @0@ < @INPUT@'.format(scdoc.path()) sh = find_program('sh') mandir1 = join_paths(get_option('mandir'), 'man1') @@ -371,12 +371,16 @@ run_target('create-artefacts', # Test Suite test('Build without warnings', find_program('test/build-w-o-warnings'), env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel') +test('Example script header is consistent', find_program('test/script-header'), env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel') +test('Script executability is consistent', find_program('test/script-header'), env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel') +test('Man page consistency', find_program('test/man-pages'), env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel') test('Build without xwayland', find_program('test/build-w-o-xwayland'), env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel') test('Copyright and LICENSE', find_program('test/copyright-license'), args : [ cagebreak_main_file + cagebreak_source_strings + cagebreak_header_strings + fuzz_sources + fuzz_headers + fuzz_override_lib ], env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()), ''.join('MESONLICENSE=', meson.project_license())], suite: 'devel' ) -test('Clang-format (formatting check)', find_program('test/clang-format'), args : [ cagebreak_main_file + cagebreak_source_strings + cagebreak_header_strings + fuzz_sources + fuzz_headers + fuzz_override_lib ], env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel') -test('Shellcheck (script linting)', find_program('test/shellcheck'), env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel') +test('Formatting check (clang-format)', find_program('test/clang-format'), args : [ cagebreak_main_file + cagebreak_source_strings + cagebreak_header_strings + fuzz_sources + fuzz_headers + fuzz_override_lib ], env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel') +test('Script linting (shellcheck)', find_program('test/shellcheck'), env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel') test('GPG key validity', find_program('test/gpg-validity'), args : [ meson.project_version() ], env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel') -test('Scan-build (static analysis)', find_program('test/scan-build'), env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel-long') +test('Illegal Strings', find_program('test/illegal-strings'), env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel') +test('Static analysis (scan-build)', find_program('test/scan-build'), env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'devel-long') test('Arguments', find_program('test/arguments'), args : [ meson.project_version() ], env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'basic') test('Environment Variables', find_program('test/environment-variables'), env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'basic') test('Semantic versioning', find_program('test/versions'), args : [ meson.project_version() ], env : [ ''.join('MESONCURRENTCONFIGDIR=', meson.current_source_dir()) ], suite: 'release') diff --git a/meson_options.txt b/meson_options.txt index eba2f60..a4377b9 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,8 +1,8 @@ -# Copyright 2020 - 2023, project-repo and the cagebreak contributors +# Copyright 2020 - 2024, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT option('xwayland', type: 'boolean', value: 'false', description: 'Enable support for X11 applications') option('man-pages', type: 'boolean', value: 'false', description: 'Build man pages (requires pandoc)') option('fuzz', type: 'boolean', value: 'false', description: 'Enable building fuzzer targets') option('version_override', type: 'string', description: 'Set the project version to the string specified. Used for creating hashes for reproducible builds.') option('corpus', type: 'string', value: 'fuzz_corpus', description: 'Set fuzzing corpus directory') -option('gpg_id', type: 'string', value: '4E82C72C6B3E58A7BC4FF8554909F84CA83BB867', description: 'Set gpg signing key for cagebreak') +option('gpg_id', type: 'string', value: '438C27DDB5D174673DF4D67B451205B3528C7C63', description: 'Set gpg signing key for cagebreak') diff --git a/message.c b/message.c index d74b8cf..4b99aaf 100644 --- a/message.c +++ b/message.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #include @@ -174,13 +174,9 @@ create_message_texture(const char *string, const struct cg_output *output) { return buf; } -#if CG_HAS_FANALYZE -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" -#endif void message_set_output(struct cg_output *output, const char *string, - struct wlr_box *box, enum cg_message_align align) { + struct wlr_box *box, enum cg_message_anchor anchor) { struct cg_message *message = malloc(sizeof(struct cg_message)); if(!message) { wlr_log(WLR_ERROR, "Error allocating message structure"); @@ -202,26 +198,35 @@ message_set_output(struct cg_output *output, const char *string, int height = buf->base.height / scale; message->position->width = width; message->position->height = height; - switch(align) { - case CG_MESSAGE_TOP_RIGHT: { - message->position->x -= width; + switch(anchor) { + case CG_MESSAGE_TOP_LEFT: + message->position->x = 0; + message->position->y = 0; break; - } - case CG_MESSAGE_BOTTOM_LEFT: { + case CG_MESSAGE_TOP_CENTER: + message->position->x -= width / 2; + message->position->y = 0; + break; + case CG_MESSAGE_TOP_RIGHT: + message->position->x -= width; + message->position->y = 0; + break; + case CG_MESSAGE_BOTTOM_LEFT: + message->position->x = 0; message->position->y -= height; break; - } - case CG_MESSAGE_BOTTOM_RIGHT: { + case CG_MESSAGE_BOTTOM_CENTER: + message->position->x -= width / 2; + message->position->y -= height; + break; + case CG_MESSAGE_BOTTOM_RIGHT: message->position->x -= width; message->position->y -= height; break; - } - case CG_MESSAGE_CENTER: { + case CG_MESSAGE_CENTER: message->position->x -= width / 2; message->position->y -= height / 2; break; - } - case CG_MESSAGE_TOP_LEFT: default: break; } @@ -235,17 +240,18 @@ message_set_output(struct cg_output *output, const char *string, wlr_scene_buffer_create(&scene_output->scene->tree, &buf->base); wlr_scene_node_raise_to_top(&message->message->node); wlr_scene_node_set_enabled(&message->message->node, true); - struct wlr_box outp_box; - wlr_output_layout_get_box(output->server->output_layout, output->wlr_output, - &outp_box); wlr_scene_buffer_set_dest_size(message->message, width, height); - wlr_scene_node_set_position(&message->message->node, - message->position->x + outp_box.x, - message->position->y + outp_box.y); + wlr_scene_node_set_position( + &message->message->node, + message->position->x + output_get_layout_box(output).x, + message->position->y + output_get_layout_box(output).y); } void message_printf(struct cg_output *output, const char *fmt, ...) { + if(output->destroyed) { + return; + } va_list ap; va_start(ap, fmt); char *buffer = malloc_vsprintf_va_list(fmt, ap); @@ -261,26 +267,55 @@ message_printf(struct cg_output *output, const char *fmt, ...) { free(buffer); return; } - struct wlr_box output_box; - wlr_output_layout_get_box(output->server->output_layout, output->wlr_output, - &output_box); - - box->x = output_box.width; - box->y = 0; + struct wlr_box output_box = output_get_layout_box(output); box->width = 0; box->height = 0; + switch(output->server->message_config.anchor) { + case CG_MESSAGE_TOP_LEFT: + box->x = 0; + box->y = 0; + break; + case CG_MESSAGE_TOP_CENTER: + box->x = output_box.width / 2; + box->y = 0; + break; + case CG_MESSAGE_TOP_RIGHT: + box->x = output_box.width; + box->y = 0; + break; + case CG_MESSAGE_BOTTOM_LEFT: + box->x = 0; + box->y = output_box.height; + break; + case CG_MESSAGE_BOTTOM_CENTER: + box->x = output_box.width / 2; + box->y = output_box.height; + break; + case CG_MESSAGE_BOTTOM_RIGHT: + box->x = output_box.width; + box->y = output_box.height; + break; + case CG_MESSAGE_CENTER: + box->x = output_box.width / 2; + box->y = output_box.height / 2; + break; + default: + break; + } - message_set_output(output, buffer, box, CG_MESSAGE_TOP_RIGHT); + message_set_output(output, buffer, box, + output->server->message_config.anchor); free(buffer); alarm(output->server->message_config.display_time); } -#if CG_HAS_FANALYZE -#pragma GCC diagnostic pop -#endif void message_printf_pos(struct cg_output *output, struct wlr_box *position, - const enum cg_message_align align, const char *fmt, ...) { + const enum cg_message_anchor anchor, const char *fmt, ...) { + if(output->destroyed) { + free(position); + return; + } uint16_t buf_len = 256; char *buffer = (char *)malloc(buf_len * sizeof(char)); va_list ap; @@ -289,7 +324,7 @@ message_printf_pos(struct cg_output *output, struct wlr_box *position, vsnprintf(buffer, buf_len, fmt, ap); va_end(ap); - message_set_output(output, buffer, position, align); + message_set_output(output, buffer, position, anchor); free(buffer); alarm(output->server->message_config.display_time); } diff --git a/message.h b/message.h index 806307c..a1b8f13 100644 --- a/message.h +++ b/message.h @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #ifndef MESSAGE_H @@ -11,12 +11,15 @@ struct cg_output; struct wlr_box; struct wlr_buffer; -enum cg_message_align { +enum cg_message_anchor { CG_MESSAGE_TOP_LEFT, + CG_MESSAGE_TOP_CENTER, CG_MESSAGE_TOP_RIGHT, CG_MESSAGE_BOTTOM_LEFT, + CG_MESSAGE_BOTTOM_CENTER, CG_MESSAGE_BOTTOM_RIGHT, CG_MESSAGE_CENTER, + CG_MESSAGE_NOPT }; struct cg_message_config { @@ -24,6 +27,7 @@ struct cg_message_config { int display_time; float bg_color[4]; float fg_color[4]; + enum cg_message_anchor anchor; }; struct cg_message { @@ -37,7 +41,7 @@ void message_printf(struct cg_output *output, const char *fmt, ...); void message_printf_pos(struct cg_output *output, struct wlr_box *position, - enum cg_message_align, const char *fmt, ...); + enum cg_message_anchor, const char *fmt, ...); void message_clear(struct cg_output *output); diff --git a/output.c b/output.c index 0a482f0..c048b9b 100644 --- a/output.c +++ b/output.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200809L @@ -14,13 +14,16 @@ #if WLR_HAS_X11_BACKEND #include #endif +#include #include #include #include +#include #include #include #include #include +#include #include #include #if CG_HAS_XWAYLAND @@ -103,7 +106,7 @@ output_get_num(const struct cg_output *output) { struct cg_output *it; int count = 1; wl_list_for_each(it, &output->server->outputs, link) { - if(strcmp(output->wlr_output->name, it->wlr_output->name) == 0) { + if(strcmp(output->name, it->name) == 0) { return count; } ++count; @@ -111,33 +114,64 @@ output_get_num(const struct cg_output *output) { return -1; } +struct wlr_box +output_get_layout_box(struct cg_output *output) { + struct wlr_box box; + wlr_output_layout_get_box(output->server->output_layout, output->wlr_output, + &box); + if(!output->destroyed && !wlr_box_empty(&box)) { + output->layout_box.x = box.x; + output->layout_box.y = box.y; + output->layout_box.width = box.width; + output->layout_box.height = box.height; + } + return output->layout_box; +} + static void output_destroy(struct cg_output *output) { struct cg_server *server = output->server; - char *outp_name = strdup(output->wlr_output->name); + char *outp_name = strdup(output->name); int outp_num = output_get_num(output); - wl_list_remove(&output->destroy.link); - wl_list_remove(&output->commit.link); - wl_list_remove(&output->frame.link); - - output_clear(output); - - /*Important: due to unfortunate events, "workspace" and "output->workspace" - * have nothing in common. The former is the workspace of a single output, - * whereas the latter is the workspace of the outputs.*/ - for(unsigned int i = 0; i < server->nws; ++i) { - workspace_free(output->workspaces[i]); + if(output->destroyed == false) { + wl_list_remove(&output->destroy.link); + wl_list_remove(&output->commit.link); + wl_list_remove(&output->frame.link); + wlr_scene_output_destroy(output->scene_output); + output->scene_output = NULL; } - free(output->workspaces); + output->destroyed = true; + enum output_role role = output->role; + if(role == OUTPUT_ROLE_PERMANENT) { + output->wlr_output = wlr_headless_add_output(server->headless_backend, + output->layout_box.width, + output->layout_box.height); + output->scene_output = + wlr_scene_output_create(server->scene, output->wlr_output); + struct wlr_output_layout_output *lo = + wlr_output_layout_add(server->output_layout, output->wlr_output, + output->layout_box.x, output->layout_box.y); + wlr_scene_output_layout_add_output(server->scene_output_layout, lo, + output->scene_output); - free(output); + } else { + output_clear(output); + + for(unsigned int i = 0; i < server->nws; ++i) { + workspace_free(output->workspaces[i]); + } + free(output->workspaces); + free(output->name); + + free(output); + } if(outp_name != NULL) { ipc_send_event(server, "{\"event_name\":\"destroy_output\",\"output\":\"%s\"," - "\"output_id\":%d}", - outp_name, outp_num); + "\"output_id\":%d,\"permanent\":%d}", + outp_name, outp_num, role == OUTPUT_ROLE_PERMANENT); free(outp_name); } else { wlr_log(WLR_ERROR, @@ -154,6 +188,27 @@ handle_output_destroy(struct wl_listener *listener, void *data) { output_destroy(output); } +void +handle_output_gamma_control_set_gamma(struct wl_listener *listener, + void *data) { + struct cg_server *server = + wl_container_of(listener, server, gamma_control_set_gamma); + const struct wlr_gamma_control_manager_v1_set_gamma_event *event = data; + + struct wlr_gamma_control_v1 *gamma_control = + wlr_gamma_control_manager_v1_get_control(server->gamma_control, + event->output); + + struct wlr_output_state pending = {0}; + wlr_gamma_control_v1_apply(gamma_control, &pending); + if(!wlr_output_test_state(event->output, &pending)) { + wlr_gamma_control_v1_send_failed_and_destroy(gamma_control); + } else { + wlr_output_commit_state(event->output, &pending); + wlr_output_schedule_frame(event->output); + } +} + static void handle_output_frame(struct wl_listener *listener, void *data) { struct cg_output *output = wl_container_of(listener, output, frame); @@ -257,11 +312,24 @@ output_apply_config(struct cg_server *server, struct cg_output *output, struct cg_output_config *config) { struct wlr_output *wlr_output = output->wlr_output; - if(output->wlr_output->enabled) { - wlr_output_layout_remove(server->output_layout, wlr_output); + struct wlr_box prev_box; + prev_box.x = output->layout_box.x; + prev_box.y = output->layout_box.y; + prev_box.width = output->layout_box.width; + prev_box.height = output->layout_box.height; + bool prio_changed = false; + if(config->role != OUTPUT_ROLE_DEFAULT) { + output->role = config->role; + if((output->role == OUTPUT_ROLE_PERIPHERAL) && + (output->destroyed == true)) { + output_destroy(output); + wlr_output_destroy(wlr_output); + return; + } } if(config->priority != -1) { + prio_changed = (output->priority != config->priority); output->priority = config->priority; } @@ -282,18 +350,57 @@ output_apply_config(struct cg_server *server, struct cg_output *output, wlr_output_commit(wlr_output); return; } - struct wlr_output_layout_output *lo = wlr_output_layout_add( - server->output_layout, wlr_output, config->pos.x, config->pos.y); - wlr_scene_output_layout_add_output(server->scene_output_layout, lo, - output->scene_output); - /* Since the size of the output may have changed, we - * reinitialize all workspaces with a fullscreen layout */ - for(unsigned int i = 0; i < output->server->nws; ++i) { - output_make_workspace_fullscreen(output, i); + if(wlr_box_empty(&output->layout_box)) { + struct wlr_output_layout_output *lo = + wlr_output_layout_add(server->output_layout, wlr_output, + config->pos.x, config->pos.y); + wlr_scene_output_layout_add_output(server->scene_output_layout, lo, + output->scene_output); + } else { + wlr_scene_output_set_position(output->scene_output, config->pos.x, + config->pos.y); } - } else { + if(output->workspaces != NULL) { + wlr_output_layout_get_box(server->output_layout, output->wlr_output, + &output->layout_box); + /* Since the size of the output may have changed, we + * reinitialize all workspaces with a fullscreen layout */ + if(output->layout_box.width != prev_box.width || + output->layout_box.height != prev_box.height) { + for(unsigned int i = 0; i < output->server->nws; ++i) { + output_make_workspace_fullscreen(output, i); + } + } + if(prev_box.x != output->layout_box.x || + prev_box.y != output->layout_box.y) { + for(unsigned int i = 0; i < server->nws; ++i) { + struct cg_workspace *ws = output->workspaces[i]; + bool first = true; + for(struct cg_tile *tile = ws->focused_tile; + first || output->workspaces[i]->focused_tile != tile; + tile = tile->next) { + first = false; + if(tile->view != NULL) { + wlr_scene_node_set_position( + &tile->view->scene_tree->node, + tile->view->ox + output->layout_box.x, + tile->view->oy + output->layout_box.y); + } + } + } + } + } + } else if(wlr_box_empty(&output->layout_box)) { + wlr_output_layout_add_auto(server->output_layout, wlr_output); + // The following two lines make sure that the output is "manually" + // managed, so that its position doesn't change anymore in the + // future. + wlr_output_layout_get_box(server->output_layout, output->wlr_output, + &output->layout_box); + wlr_output_layout_remove(server->output_layout, output->wlr_output); struct wlr_output_layout_output *lo = - wlr_output_layout_add_auto(server->output_layout, wlr_output); + wlr_output_layout_add(server->output_layout, output->wlr_output, + output->layout_box.x, output->layout_box.y); wlr_scene_output_layout_add_output(server->scene_output_layout, lo, output->scene_output); @@ -311,8 +418,10 @@ output_apply_config(struct cg_server *server, struct cg_output *output, wlr_output_enable(wlr_output, false); wlr_output_commit(wlr_output); } else { - wl_list_remove(&output->link); - output_insert(server, output); + if(prio_changed) { + wl_list_remove(&output->link); + output_insert(server, output); + } wlr_output_enable(wlr_output, true); wlr_output_commit(wlr_output); } @@ -329,9 +438,8 @@ output_apply_config(struct cg_server *server, struct cg_output *output, output->bg = wlr_scene_rect_create( &scene_output->scene->tree, output->wlr_output->width, output->wlr_output->height, server->bg_color); - struct wlr_box box; - wlr_output_layout_get_box(server->output_layout, output->wlr_output, &box); - wlr_scene_node_set_position(&output->bg->node, box.x, box.y); + wlr_scene_node_set_position(&output->bg->node, scene_output->x, + scene_output->y); wlr_scene_node_lower_to_bottom(&output->bg->node); } @@ -344,6 +452,7 @@ empty_output_config(void) { } cfg->status = OUTPUT_DEFAULT; + cfg->role = OUTPUT_ROLE_DEFAULT; cfg->pos.x = -1; cfg->pos.y = -1; cfg->pos.width = -1; @@ -367,6 +476,11 @@ merge_output_configs(struct cg_output_config *cfg1, } else { out_cfg->status = cfg1->status; } + if(cfg1->role == out_cfg->role) { + out_cfg->role = cfg2->role; + } else { + out_cfg->role = cfg1->role; + } if(cfg1->pos.x == out_cfg->pos.x) { out_cfg->pos.x = cfg2->pos.x; out_cfg->pos.y = cfg2->pos.y; @@ -415,7 +529,7 @@ output_configure(struct cg_server *server, struct cg_output *output) { struct cg_output_config *tot_config = empty_output_config(); struct cg_output_config *config; wl_list_for_each(config, &server->output_config, link) { - if(strcmp(config->output_name, output->wlr_output->name) == 0) { + if(strcmp(config->output_name, output->name) == 0) { if(tot_config == NULL) { return; } @@ -459,9 +573,9 @@ handle_output_commit(struct wl_listener *listener, void *data) { void output_make_workspace_fullscreen(struct cg_output *output, int ws) { struct cg_server *server = output->server; - struct cg_view *current_view = seat_get_focus(server->seat); + struct cg_view *current_view = output->workspaces[ws]->focused_tile->view; - if(current_view == NULL || ws != output->curr_workspace) { + if(current_view == NULL) { struct cg_view *it = NULL; wl_list_for_each(it, &output->workspaces[ws]->views, link) { if(view_is_visible(it)) { @@ -472,7 +586,7 @@ output_make_workspace_fullscreen(struct cg_output *output, int ws) { } workspace_free_tiles(output->workspaces[ws]); - if(full_screen_workspace_tiles(server->output_layout, output->wlr_output, + if(full_screen_workspace_tiles(server->output_layout, output->workspaces[ws], &server->tiles_curr_id) != 0) { wlr_log(WLR_ERROR, "Failed to allocate space for fullscreen workspace"); @@ -484,19 +598,18 @@ output_make_workspace_fullscreen(struct cg_output *output, int ws) { it_view->tile = output->workspaces[ws]->focused_tile; } - if(ws == output->curr_workspace) { + workspace_tile_update_view(output->workspaces[ws]->focused_tile, + current_view); + if((ws == output->curr_workspace) && (output == server->curr_output)) { seat_set_focus(server->seat, current_view); } } -#if CG_HAS_FANALYZE -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" -#endif void handle_new_output(struct wl_listener *listener, void *data) { struct cg_server *server = wl_container_of(listener, server, new_output); struct wlr_output *wlr_output = data; + wlr_output_enable(wlr_output, true); if(!wlr_output_init_render(wlr_output, server->allocator, server->renderer)) { @@ -504,59 +617,102 @@ handle_new_output(struct wl_listener *listener, void *data) { return; } - struct cg_output *output = calloc(1, sizeof(struct cg_output)); - output->scene_output = wlr_scene_output_create(server->scene, wlr_output); + struct cg_output *ito; + bool reinit = false; + struct cg_output *output = NULL; + wl_list_for_each(ito, &server->outputs, link) { + if((strcmp(ito->name, wlr_output->name) == 0) && (ito->destroyed)) { + reinit = true; + output = ito; + } + } + if(reinit) { + wlr_output_layout_remove(server->output_layout, output->wlr_output); + wlr_scene_output_destroy(output->scene_output); + } else { + output = calloc(1, sizeof(struct cg_output)); + } if(!output) { wlr_log(WLR_ERROR, "Failed to allocate output"); return; } + output->scene_output = wlr_scene_output_create(server->scene, wlr_output); output->wlr_output = wlr_output; - output->server = server; - output->last_scanned_out_view = NULL; + output->destroyed = false; - struct cg_output_priorities *it; - int prio = -1; - wl_list_for_each(it, &server->output_priorities, link) { - if(strcmp(output->wlr_output->name, it->ident) == 0) { - prio = it->priority; + if(!reinit) { + output->server = server; + output->name = strdup(wlr_output->name); + + struct cg_output_priorities *it; + int prio = -1; + wl_list_for_each(it, &server->output_priorities, link) { + if(strcmp(output->name, it->ident) == 0) { + prio = it->priority; + } } - } - output->priority = prio; - wlr_output_set_transform(wlr_output, WL_OUTPUT_TRANSFORM_NORMAL); - output->workspaces = NULL; + output->priority = prio; + wlr_output_set_transform(wlr_output, WL_OUTPUT_TRANSFORM_NORMAL); + output->workspaces = NULL; - wl_list_init(&output->messages); + wl_list_init(&output->messages); - if(!wlr_xcursor_manager_load(server->seat->xcursor_manager, - wlr_output->scale)) { - wlr_log(WLR_ERROR, - "Cannot load XCursor theme for output '%s' with scale %f", - wlr_output->name, wlr_output->scale); - } - - output_insert(server, output); - output_configure(server, output); - - output->workspaces = malloc(server->nws * sizeof(struct cg_workspace *)); - for(unsigned int i = 0; i < server->nws; ++i) { - output->workspaces[i] = full_screen_workspace(output); - if(!output->workspaces[i]) { - wlr_log(WLR_ERROR, "Failed to allocate workspaces for output"); - return; + if(!wlr_xcursor_manager_load(server->seat->xcursor_manager, + wlr_output->scale)) { + wlr_log(WLR_ERROR, + "Cannot load XCursor theme for output '%s' with scale %f", + output->name, wlr_output->scale); } - output->workspaces[i]->num = i; - wl_list_init(&output->workspaces[i]->views); - wl_list_init(&output->workspaces[i]->unmanaged_views); + + output_insert(server, output); + // This is duplicated here only as a cue for the static analysis tool + output->destroyed = false; + output_configure(server, output); + wlr_output_layout_get_box(server->output_layout, output->wlr_output, + &output->layout_box); + + output->workspaces = + malloc(server->nws * sizeof(struct cg_workspace *)); + for(unsigned int i = 0; i < server->nws; ++i) { + output->workspaces[i] = full_screen_workspace(output); + if(!output->workspaces[i]) { + wlr_log(WLR_ERROR, "Failed to allocate workspaces for output"); + return; + } + output->workspaces[i]->num = i; + wl_list_init(&output->workspaces[i]->views); + wl_list_init(&output->workspaces[i]->unmanaged_views); + } + + wlr_scene_node_raise_to_top(&output->workspaces[0]->scene->node); + workspace_focus(output, 0); + + /* We are the first output. Set the current output to this one. */ + if(server->curr_output == NULL) { + server->curr_output = output; + } + } else { + struct wlr_output_layout_output *lo = + wlr_output_layout_add(server->output_layout, wlr_output, + output->layout_box.x, output->layout_box.y); + wlr_scene_output_layout_add_output(server->scene_output_layout, lo, + output->scene_output); + + struct wlr_output_mode *preferred_mode = + wlr_output_preferred_mode(wlr_output); + if(preferred_mode) { + wlr_output_set_mode(wlr_output, preferred_mode); + } + wlr_output_set_transform(wlr_output, WL_OUTPUT_TRANSFORM_NORMAL); + wlr_scene_output_set_position( + output->scene_output, output->layout_box.x, output->layout_box.y); + wlr_output_enable(wlr_output, true); + wlr_output_commit(wlr_output); + output_configure(server, output); + output_get_layout_box(output); } - wlr_scene_node_raise_to_top(&output->workspaces[0]->scene->node); - workspace_focus(output, 0); - - /* We are the first output. Set the current output to this one. */ - if(server->curr_output == NULL) { - server->curr_output = output; - } wlr_cursor_set_xcursor(server->seat->cursor, server->seat->xcursor_manager, DEFAULT_XCURSOR); wlr_cursor_warp(server->seat->cursor, NULL, 0, 0); @@ -570,10 +726,7 @@ handle_new_output(struct wl_listener *listener, void *data) { ipc_send_event(server, "{\"event_name\":\"new_output\",\"output\":\"%s\",\"output_" - "id\":%d,\"priority\":%d}", - output->wlr_output->name, output_get_num(output), - output->priority); + "id\":%d,\"priority\":%d,\"restart\":%d}", + output->name, output_get_num(output), output->priority, + reinit); } -#if CG_HAS_FANALYZE -#pragma GCC diagnostic pop -#endif diff --git a/output.h b/output.h index c1d4853..573c259 100644 --- a/output.h +++ b/output.h @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #ifndef CG_OUTPUT_H @@ -12,6 +12,12 @@ struct cg_view; struct wlr_output; struct wlr_surface; +enum output_role { + OUTPUT_ROLE_PERIPHERAL, + OUTPUT_ROLE_PERMANENT, + OUTPUT_ROLE_DEFAULT +}; + struct cg_output { struct cg_server *server; struct wlr_output *wlr_output; @@ -23,9 +29,12 @@ struct cg_output { struct wl_listener frame; struct cg_workspace **workspaces; struct wl_list messages; + struct wlr_box layout_box; int curr_workspace; int priority; - struct cg_view *last_scanned_out_view; + enum output_role role; + bool destroyed; + char *name; struct wl_list link; // cg_server::outputs }; @@ -40,6 +49,7 @@ enum output_status { OUTPUT_ENABLE, OUTPUT_DISABLE, OUTPUT_DEFAULT }; struct cg_output_config { enum output_status status; + enum output_role role; struct wlr_box pos; char *output_name; float refresh_rate; @@ -53,7 +63,8 @@ typedef void (*cg_surface_iterator_func_t)(struct cg_output *output, struct wlr_surface *surface, struct wlr_box *box, void *user_data); - +struct wlr_box +output_get_layout_box(struct cg_output *output); void handle_new_output(struct wl_listener *listener, void *data); void @@ -64,4 +75,8 @@ void output_make_workspace_fullscreen(struct cg_output *output, int ws); int output_get_num(const struct cg_output *output); +void +handle_output_gamma_control_set_gamma(struct wl_listener *listener, void *data); +void +output_insert(struct cg_server *server, struct cg_output *output); #endif diff --git a/pango.c b/pango.c index 3af6f7f..3006f5b 100644 --- a/pango.c +++ b/pango.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #include diff --git a/pango.h b/pango.h index 53a78cc..5aa6c8d 100644 --- a/pango.h +++ b/pango.h @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #ifndef _SWAY_PANGO_H diff --git a/parse.c b/parse.c index c163b3a..72d8295 100644 --- a/parse.c +++ b/parse.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200812L @@ -543,6 +543,10 @@ parse_output_config_keyword(char *key_str, enum output_status *status) { *status = OUTPUT_DEFAULT; } else if(strcmp(key_str, "enable") == 0) { *status = OUTPUT_ENABLE; + } else if(strcmp(key_str, "permanent") == 0) { + *status = OUTPUT_DEFAULT; + } else if(strcmp(key_str, "peripheral") == 0) { + *status = OUTPUT_DEFAULT; } else if(strcmp(key_str, "disable") == 0) { *status = OUTPUT_DISABLE; } else { @@ -566,6 +570,7 @@ parse_output_config(char **saveptr, char **errstr) { cfg->priority = -1; cfg->scale = -1; cfg->angle = -1; + cfg->role = OUTPUT_ROLE_DEFAULT; char *name = strtok_r(NULL, " ", saveptr); if(name == NULL) { *errstr = @@ -574,8 +579,9 @@ parse_output_config(char **saveptr, char **errstr) { } char *key_str = strtok_r(NULL, " ", saveptr); if(parse_output_config_keyword(key_str, &(cfg->status)) != 0) { - *errstr = log_error("Expected keyword \"pos\", \"prio\", \"enable\" or " - "\"disable\" in output configuration for output %s", + *errstr = log_error("Expected keyword \"pos\", \"prio\", \"enable\", " + "\"disable\", \"permanent\" or \"peripheral\" in " + "output configuration for output %s", name); goto error; } @@ -622,6 +628,18 @@ parse_output_config(char **saveptr, char **errstr) { return cfg; } + if(strcmp(key_str, "peripheral") == 0) { + cfg->output_name = strdup(name); + cfg->role = OUTPUT_ROLE_PERIPHERAL; + return cfg; + } + + if(strcmp(key_str, "permanent") == 0) { + cfg->output_name = strdup(name); + cfg->role = OUTPUT_ROLE_PERMANENT; + return cfg; + } + cfg->pos.x = parse_uint(saveptr, " "); if(cfg->pos.x < 0) { *errstr = log_error( @@ -702,6 +720,7 @@ parse_message_config(char **saveptr, char **errstr) { cfg->fg_color[0] = -1; cfg->display_time = -1; cfg->font = NULL; + cfg->anchor = CG_MESSAGE_NOPT; char *setting = strtok_r(NULL, " ", saveptr); if(setting == NULL) { @@ -745,6 +764,22 @@ parse_message_config(char **saveptr, char **errstr) { goto error; } } + } else if(strcmp(setting, "anchor") == 0) { + char *anchors[] = {"top_left", "top_center", "top_right", + "bottom_left", "bottom_center", "bottom_right", + "center"}; + for(int i = 0; i < 7; ++i) { + if(strcmp(*saveptr, anchors[i]) == 0) { + cfg->anchor = i; + break; + } + } + if(cfg->anchor == CG_MESSAGE_NOPT) { + *errstr = + log_error("Error parsing command \"configure_message anchor\", " + "the given anchor value is not a valid option"); + goto error; + } } else { *errstr = log_error("Invalid option to command \"configure_message\""); goto error; diff --git a/parse.h b/parse.h index 2949315..d78df94 100644 --- a/parse.h +++ b/parse.h @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #ifndef PARSE_H diff --git a/release-non-auto-checks/Bugs.md b/release-non-auto-checks/Bugs.md index 16e03cd..b196533 100644 --- a/release-non-auto-checks/Bugs.md +++ b/release-non-auto-checks/Bugs.md @@ -1,2 +1,2 @@ -2.2.3 -2023-12-05 +2.3.0 +2024-01-26 diff --git a/release-non-auto-checks/FAQ.md b/release-non-auto-checks/FAQ.md index 16e03cd..b196533 100644 --- a/release-non-auto-checks/FAQ.md +++ b/release-non-auto-checks/FAQ.md @@ -1,2 +1,2 @@ -2.2.3 -2023-12-05 +2.3.0 +2024-01-26 diff --git a/release-non-auto-checks/SECURITY.md b/release-non-auto-checks/SECURITY.md index 16e03cd..b196533 100644 --- a/release-non-auto-checks/SECURITY.md +++ b/release-non-auto-checks/SECURITY.md @@ -1,2 +1,2 @@ -2.2.3 -2023-12-05 +2.3.0 +2024-01-26 diff --git a/release-non-auto-checks/WLR_XDG_VERSION b/release-non-auto-checks/WLR_XDG_VERSION index 16e03cd..b196533 100644 --- a/release-non-auto-checks/WLR_XDG_VERSION +++ b/release-non-auto-checks/WLR_XDG_VERSION @@ -1,2 +1,2 @@ -2.2.3 -2023-12-05 +2.3.0 +2024-01-26 diff --git a/release-non-auto-checks/acknowledge-contributors b/release-non-auto-checks/acknowledge-contributors index 16e03cd..b196533 100644 --- a/release-non-auto-checks/acknowledge-contributors +++ b/release-non-auto-checks/acknowledge-contributors @@ -1,2 +1,2 @@ -2.2.3 -2023-12-05 +2.3.0 +2024-01-26 diff --git a/release-non-auto-checks/archwiki b/release-non-auto-checks/archwiki new file mode 100644 index 0000000..b196533 --- /dev/null +++ b/release-non-auto-checks/archwiki @@ -0,0 +1,2 @@ +2.3.0 +2024-01-26 diff --git a/release-non-auto-checks/changelog-major-minor b/release-non-auto-checks/changelog-major-minor index 16e03cd..b196533 100644 --- a/release-non-auto-checks/changelog-major-minor +++ b/release-non-auto-checks/changelog-major-minor @@ -1,2 +1,2 @@ -2.2.3 -2023-12-05 +2.3.0 +2024-01-26 diff --git a/release-non-auto-checks/internal-wiki b/release-non-auto-checks/internal-wiki index 16e03cd..b196533 100644 --- a/release-non-auto-checks/internal-wiki +++ b/release-non-auto-checks/internal-wiki @@ -1,2 +1,2 @@ -2.2.3 -2023-12-05 +2.3.0 +2024-01-26 diff --git a/release-non-auto-checks/release-note b/release-non-auto-checks/release-note index 16e03cd..b196533 100644 --- a/release-non-auto-checks/release-note +++ b/release-non-auto-checks/release-note @@ -1,2 +1,2 @@ -2.2.3 -2023-12-05 +2.3.0 +2024-01-26 diff --git a/release-non-auto-checks/reproducibility-checked b/release-non-auto-checks/reproducibility-checked index 16e03cd..b196533 100644 --- a/release-non-auto-checks/reproducibility-checked +++ b/release-non-auto-checks/reproducibility-checked @@ -1,2 +1,2 @@ -2.2.3 -2023-12-05 +2.3.0 +2024-01-26 diff --git a/release-non-auto-checks/security-to-man-page-info-transfer b/release-non-auto-checks/security-to-man-page-info-transfer index 16e03cd..b196533 100644 --- a/release-non-auto-checks/security-to-man-page-info-transfer +++ b/release-non-auto-checks/security-to-man-page-info-transfer @@ -1,2 +1,2 @@ -2.2.3 -2023-12-05 +2.3.0 +2024-01-26 diff --git a/release-non-auto-checks/version-restrictions b/release-non-auto-checks/version-restrictions index 16e03cd..b196533 100644 --- a/release-non-auto-checks/version-restrictions +++ b/release-non-auto-checks/version-restrictions @@ -1,2 +1,2 @@ -2.2.3 -2023-12-05 +2.3.0 +2024-01-26 diff --git a/scripts/adjust-epoch b/scripts/adjust-epoch index 362c840..14b935c 100755 --- a/scripts/adjust-epoch +++ b/scripts/adjust-epoch @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2023, project-repo and the cagebreak contributors +# Copyright 2023 - 2024, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT if [[ -n ${MESON_SOURCE_ROOT} ]] diff --git a/scripts/create-release-artefacts b/scripts/create-release-artefacts index 4b16167..05212a5 100755 --- a/scripts/create-release-artefacts +++ b/scripts/create-release-artefacts @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2023, project-repo and the cagebreak contributors +# Copyright 2023 - 2024, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT if [[ -n ${MESON_SOURCE_ROOT} ]] diff --git a/scripts/create-signatures b/scripts/create-signatures index 3292374..958825f 100755 --- a/scripts/create-signatures +++ b/scripts/create-signatures @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2023, project-repo and the cagebreak contributors +# Copyright 2023 - 2024, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT if [[ -n ${MESON_SOURCE_ROOT} ]] diff --git a/scripts/fuzz b/scripts/fuzz index 7f227ec..e90e17a 100755 --- a/scripts/fuzz +++ b/scripts/fuzz @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2023, project-repo and the cagebreak contributors +# Copyright 2023 - 2024, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT readonly fuzzing_corpus="${1}" diff --git a/scripts/git-tag b/scripts/git-tag index bd8e541..4b5dbbc 100755 --- a/scripts/git-tag +++ b/scripts/git-tag @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2023, project-repo and the cagebreak contributors +# Copyright 2023 - 2024, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT readonly gpg_id="${1}" diff --git a/scripts/install-development-environment b/scripts/install-development-environment old mode 100644 new mode 100755 index 1b71ce5..b799eec --- a/scripts/install-development-environment +++ b/scripts/install-development-environment @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2023, project-repo and the cagebreak contributors +# Copyright 2023 - 2024, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT sudo pacman -Syu --noconfirm git grep sed xorg-xev meson ninja clang gcc shellcheck jq openbsd-netcat gnupg binutils alacritty wlroots wayland wayland-protocols libxkbcommon cairo pango fontconfig libinput libevdev pkgconf scdoc systemd-libs # systemd-libs is included because of libudev diff --git a/scripts/output-hashes b/scripts/output-hashes index cf7cacf..d18088b 100755 --- a/scripts/output-hashes +++ b/scripts/output-hashes @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2023, project-repo and the cagebreak contributors +# Copyright 2023 - 2024, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT if [[ -n ${MESON_SOURCE_ROOT} ]] diff --git a/scripts/set-version b/scripts/set-version index 3ee035c..3f7875e 100755 --- a/scripts/set-version +++ b/scripts/set-version @@ -1,9 +1,7 @@ #!/bin/bash -# Copyright 2023, project-repo and the cagebreak contributors +# Copyright 2023 - 2024, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT -# TODO man pages - if [[ -n ${MESON_SOURCE_ROOT} ]] then # shellcheck disable=2164 diff --git a/seat.c b/seat.c index 80206e9..a011251 100644 --- a/seat.c +++ b/seat.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200812L @@ -95,7 +95,7 @@ new_touch(struct cg_seat *seat, struct cg_input_device *input_device) { if(wlr_touch->output_name != NULL) { struct cg_output *output; wl_list_for_each(output, &seat->server->outputs, link) { - if(strcmp(wlr_touch->output_name, output->wlr_output->name) == 0) { + if(strcmp(wlr_touch->output_name, output->name) == 0) { wlr_cursor_map_input_to_output(seat->cursor, device, output->wlr_output); break; @@ -133,8 +133,7 @@ new_pointer(struct cg_seat *seat, struct cg_input_device *input_device) { if(wlr_pointer->output_name != NULL) { struct cg_output *output; wl_list_for_each(output, &seat->server->outputs, link) { - if(strcmp(wlr_pointer->output_name, output->wlr_output->name) == - 0) { + if(strcmp(wlr_pointer->output_name, output->name) == 0) { wlr_cursor_map_input_to_output(seat->cursor, device, output->wlr_output); break; @@ -732,35 +731,39 @@ process_cursor_motion(struct cg_seat *seat, uint32_t time) { break; } } - struct cg_tile *c_tile; - bool first = true; - for(c_tile = cg_outp->workspaces[cg_outp->curr_workspace]->focused_tile; - first || - c_tile != cg_outp->workspaces[cg_outp->curr_workspace]->focused_tile; - c_tile = c_tile->next) { - first = false; - double ox = seat->cursor->x, oy = seat->cursor->y; - wlr_output_layout_output_coords(seat->server->output_layout, c_outp, - &ox, &oy); - if(c_tile->tile.x <= ox && c_tile->tile.y <= oy && - c_tile->tile.x + c_tile->tile.width >= ox && - c_tile->tile.y + c_tile->tile.height >= oy) { - break; + if(c_outp) { + struct cg_tile *c_tile; + bool first = true; + for(c_tile = cg_outp->workspaces[cg_outp->curr_workspace]->focused_tile; + first || + c_tile != + cg_outp->workspaces[cg_outp->curr_workspace]->focused_tile; + c_tile = c_tile->next) { + first = false; + double ox = seat->cursor->x, oy = seat->cursor->y; + wlr_output_layout_output_coords(seat->server->output_layout, c_outp, + &ox, &oy); + if(c_tile->tile.x <= ox && c_tile->tile.y <= oy && + c_tile->tile.x + c_tile->tile.width >= ox && + c_tile->tile.y + c_tile->tile.height >= oy) { + break; + } } + if(seat->cursor_tile != NULL && seat->cursor_tile != c_tile && + seat->server->running) { + ipc_send_event( + seat->server, + "{\"event_name\":\"cursor_switch_tile\",\"old_output\":" + "\"%s\",\"old_output_id\":%d," + "\"old_tile\":%d,\"new_output\":\"%s\",\"new_output_" + "id\":%d,\"new_tile\":%d}", + seat->cursor_tile->workspace->output->name, + output_get_num(seat->cursor_tile->workspace->output), + seat->cursor_tile->id, c_outp->name, output_get_num(cg_outp), + c_tile->id); + } + seat->cursor_tile = c_tile; } - if(seat->cursor_tile != NULL && seat->cursor_tile != c_tile && - seat->server->running) { - ipc_send_event(seat->server, - "{\"event_name\":\"cursor_switch_tile\",\"old_output\":" - "\"%s\",\"old_output_id\":%d," - "\"old_tile\":%d,\"new_output\":\"%s\",\"new_output_" - "id\":%d,\"new_tile\":%d}", - seat->cursor_tile->workspace->output->wlr_output->name, - output_get_num(seat->cursor_tile->workspace->output), - seat->cursor_tile->id, c_outp->name, - output_get_num(cg_outp), c_tile->id); - } - seat->cursor_tile = c_tile; } static void @@ -915,6 +918,7 @@ handle_destroy(struct wl_listener *listener, void *_data) { wl_list_remove(&seat->request_set_cursor.link); wl_list_remove(&seat->request_set_selection.link); wl_list_remove(&seat->request_set_primary_selection.link); + seat->server->seat = NULL; free(seat); } @@ -1095,9 +1099,8 @@ seat_set_focus(struct cg_seat *seat, struct cg_view *view) { wlr_scene_node_raise_to_top(&view->scene_tree->node); process_cursor_motion(seat, -1); - struct wlr_box box; - wlr_output_layout_get_box(server->output_layout, - view->workspace->output->wlr_output, &box); - wlr_scene_node_set_position(&view->workspace->output->bg->node, box.x, - box.y); + wlr_scene_node_set_position( + &view->workspace->output->bg->node, + output_get_layout_box(view->workspace->output).x, + output_get_layout_box(view->workspace->output).y); } diff --git a/seat.h b/seat.h index 74f4092..135c06a 100644 --- a/seat.h +++ b/seat.h @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #ifndef CG_SEAT_H diff --git a/server.c b/server.c index c50f528..98c7630 100644 --- a/server.c +++ b/server.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200809L @@ -43,8 +43,7 @@ server_show_info(struct cg_server *server) { return NULL; } output_str_tmp = output_str; - output_str = malloc_vsprintf("%s\t * %s\n", output_str, - output->wlr_output->name); + output_str = malloc_vsprintf("%s\t * %s\n", output_str, output->name); free(output_str_tmp); } char *input_str = strdup(""), *input_str_tmp; diff --git a/server.h b/server.h index 0c067ec..3224174 100644 --- a/server.h +++ b/server.h @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #ifndef CG_SERVER_H @@ -29,6 +29,8 @@ struct cg_server { struct wlr_idle_notifier_v1 *idle; struct wlr_idle_inhibit_manager_v1 *idle_inhibit_v1; struct wl_listener new_idle_inhibitor_v1; + struct wlr_gamma_control_manager_v1 *gamma_control; + struct wl_listener gamma_control_set_gamma; struct wl_list inhibitors; struct wlr_output_layout *output_layout; @@ -38,6 +40,7 @@ struct cg_server { struct cg_output *curr_output; struct wl_listener new_output; struct wl_list output_priorities; + struct wlr_backend *headless_backend; struct wlr_session *session; struct wlr_renderer *renderer; diff --git a/signatures/2.2.3-cagebreak-config.5.sig b/signatures/2.2.3-cagebreak-config.5.sig new file mode 100644 index 0000000000000000000000000000000000000000..6d7f6c16507165c9ac9b5646e45cb4cc3a89863b GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%dO=&HxGt5J?I6 zOsG4!XG8W6|9R#;J{FE-UT8#I!Fi4#zi*ov9Xy@$5_IOwHC)DCP)s(==UVe6N7@ z7-A^-dEBpXnVsr`4n6aH48XT2AyHl2pVYRfFaF(bzfgb5CP>9$GN1&xC*(lsKc$ES zs%PuSW{ZB7f7oK6icaf23!q$wo7AdmkJ8aL2E@?F2594cy;Bn5~L z9(UAzOi$oHQJh|t!#oTPbMGoOZ^%H@=|cd#EU(M^3U*H3e9_{g{BV#!>42q+@7Wxi}6Hzo4QkhM=B3~=^{TsW09d;k=38L|LYbj z1!=3-gW5s4#~j8OX3#|G#e)MUguD-d$ATD;!Z5iJ0K4(!s?r{__=2_g72L z?`g>X^*N-@l^ncjW8n9PqAzR}vsQF-1=>w_+i&?Sy88qG&0dbXVAB?;Pby!`eiwUBN@f;NyKrXVlUf?VnplxxC=W^W_Zg+WAns( zFor@FIpAV*0laHJ%ILoX*MD55X=+$Zn3=->a9yE$BwCpc6jSY57l9Y~B;!p=jC522 z7h9{U8HL#aL&CA)`KAkQj5mm=SosFH8@H_a{Q`~Uy| literal 0 HcmV?d00001 diff --git a/signatures/2.2.3-cagebreak.1.sig b/signatures/2.2.3-cagebreak.1.sig new file mode 100644 index 0000000000000000000000000000000000000000..14ac7ab7fd60b8337eaa18e060f7a24402925528 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%dO=%>W7s5J?I6 zOsG4!XL#rj{T+Al-oPBN+x!MHM~QdkHzBr|Cl+us_ro^WM3!tDhfsBw7Pq%1Z{RD62N4N=i9+{y)3(Ru$V?xv1!7mfQc zC$)a&YY~(X8+6uKax?zdKvEm$?XN0+!~nA+>4rgX2FGfWUVr~jg!oq%fFplfE=b^F z*E|X$ABEacp-D>5QmMs>^C6Kt%bZKs7tqA@eZhm@7mF-$$2nRbtUkK-UAVyflBeE9)=j4Yx^^blg0G{qp7&RP?Tv#W249hQ1 z;a&i5R!X|YVS?xn#d0KHbp+uZ^eJiDp=DK7Q8q&K9V9}>7lfH+!()^ zhVi<3>Oy_K@#g6CBoJ+moJ(*_iX~jCgMSc+nVn=Xw^uft*T^QSAPhrD>@L20qNDU4 ztoB5mA&Wu>syLrBc^DsmQiQ@QL)6zpT7!BG>>{O|HFtXgh)1Ps5ZqLl)Cx&OS1)v+ z86sR8$66K)Dqhg=5(4#f`GiL&3yh2z0{z#Pk)7X@=tDjJ_J`^&YaK-^$7k{&2ct;Q Er@2=MA^-pY literal 0 HcmV?d00001 diff --git a/signatures/2.2.3-cagebreak.sig b/signatures/2.2.3-cagebreak.sig new file mode 100644 index 0000000000000000000000000000000000000000..b06130553f46759a6b0c15d2ec5e4a7f3fe3714d GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%dO=%>W7s5J?I6 zOsG4!XRMG9{S^4?G%^Y3m5el0Q_7oaILK}lji>EKqg2qNLmPHp`AzALIN3h@;a~B) zymaY@9KZ9Z?6L?yxsZ1pU=68cL;~wowNV!k(}NRXx`~nO6O%vds-sG3-$iS`TqsdT zy69<@`z1%3|EV0;2c&?;WEN~;S=m2 z?~wRpF((7yAP7A+^P8Iwf*BC^zzRW1uK-TzJJQ?z8i%||)(5V~qx+VB?pRqYq0@!B zIo-vd&QOv|KoOWnF*@AlRmS2Vrdh0b@5a>H^Utb8$FV@;+I0D^9Evlne?qQS(sCt|#67`gVa4;YZrz^IadZjiZg9AM5Fl9NuDd;L(g z&FIcmFW`pIpf2uSMXG4XO*XTp=PDjn_=?Cj??Ulzglg^5MEoC{ov(CO@X&I^k=_&SbK2pEm= z$xVU0w5U2fRup=?k;RFm<^v-=7j1p_kBSLFi6GH%D|&C5CQzLQyERg2;zbHi5TCEB z2E`HAgZKmA1oxlZA>XrJzsaQz?}HqL42v|+;2>1ttB1PS6An1bsU4@-s1J&RP&mrK z(WsT%{ZdE1su#g$PZgU}DU`kptkABdLg0u`2(vP_yQ+ULFY#KWBCx7sCo=u?!lR3= z1#?mWI=axdoptn(;m%cZG0E15^Hw+mp9NR=q=V3&F5!2q_hG;5G^ZY%ZD#|8{?Fvr z+ryfm1qlP46HZAeyVV_h!L{CO{ZFg7-w3c{079Ut3SJ6GY1fxb`{;S9HB#*RnzDcr zGU-k3EmW4k#|}>t(>%&H%~--iT-T?Aghiw!Y$=;2r9u#e%JI_ zf>*aS(~y`kMIFhqZepjqnQjEIm7aEGdd^pSAGKhdK3_M E_N;CdYybcN literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%dO=&HxGt5J?I6 zOsG4!XG8W6|9R#;J{FE-UT8#I!Fi4#zi*ov9Xy@$5_IOwHC)DCP)s(==UVe6N7@ z7-A^-dEBpXnVsr`4n6aH48XT2AyHl2pVYRfFaF(bzfgb5CP>9$GN1&xC*(lsKc$ES zs%PuSW{ZB7f7oK6icaf23!q$wo7AdmkJ8aL2E@?F2594cy;Bn5~L z9(UAzOi$oHQJh|t!#oTPbMGoOZ^%H@=|cd#EU(M^3U*H3e9_{g{BV#!>4$FV+{ci0FVk4pZ@5#p=MAnB%={2LAyG)?MEy$jYUmyuCHfqeovKF_esgy{%6Dq zu&rvF7KjJyT-2;|Nkg$$rxABsjv{d9b_R~p6NL-VnF~x)%X_eQrXGRA{)Hy zCNN~()r+T2gBPip7Sfc2JtyA8Z|~@M6!;`Q>gl?;Dh9xd^I~UT<58VO#{ww`uJ2p1e-C!xr_dy z!TdS*h()PclryOEj;7V%Hv!N=O)@ZMFnS}iq?>j~Y{Ls3gjPhjXX$AaH$Fy?3eq%> zhmt>=2`ja(4kMFI!rg6nXHu6rnGLjBMUC23S3cFs2h(4)18;bGgPRT#QPkr%C?%h* zmfi!WR#{#pEGvCF`U(PDgIFH{>dl6IR@W6pN;T)ohQ3VC-`{QomcHY)oVU1ZK+Kvy EdRn&%eE2q+@7Wxi}6Hzo4QkhM=B3~=^{TsW09d;k=38L|LYbj z1!=3-gW5s4#~j8OX3#|G#e)MUguD-d$ATD;!Z5iJ0K4(!s?r{__=2_g72L z?`g>X^*N-@l^ncjW8n9PqAzR}vsQF-1=>w_+i&?Sy88qG&0dbXVAB?;Pby!`eiwUBN@f;NyKrXVlUf?VnplxxC=W^W_Zg+WAns( zFor@FIpAV*0laHJ%ILoX*MD55X=+$Zn3=->a9yE$BwCpc6jSY57l9Y~B;!p=jC522 z7h9{U8HL#aL&CA)`KAkQj5mm=SosFH8@H_a{Q`~Uy| diff --git a/signatures/cagebreak.1.sig b/signatures/cagebreak.1.sig index 14ac7ab7fd60b8337eaa18e060f7a24402925528..8ed93af821b8d4f18114dfe28a85eb40dc9d9651 100644 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*fj3?c-(R61$^wxVt5(TqTjC^AS0%fy{!~hBj5JeIN zvr>$FV`bD2{yS8osLz6ml84%T-f}!GvPVdfu|-TyrQeyFp(z+PiP6t8h#G!k@UNsI z>o5@MLpYGCN<_`qGHFe5=O|Hklc;hup6}kum#9)G1y=i2i%AoB{8g|vMxnc)1vmK- z^CxGI8n8|`xuy|uXKOm_f9+#7nAZqq65L^ZJ!)i<@w#)vCtdqq)vM&}2mdiP*Oxs0 zvVwvXBKXkWdN>Xp_4_RlqqiFsp-S0@%m~uaVV>a?+ny`R^i%(lPqKq40yA)pGmh1Q zLmboYtiy1*rykfKYLZCl1McA}nm4?1SW-T}WO+m=eTCZxM_U|x#8&vi8;n{l~9SK_#Y&WCr<~f(^czt;VRa!&+j~d6&D=ilcyY2rZIKkHc?O z2XK9!5hQ5rQnk@5AXe8H5{?2>{e5rRuBu_XUh)g$iRx7ipdG|vd4}sxymQ>Z`P|&v z%Iq!5F6mrXzh5b%|6PI|t6~`96ICAM5J8%IKSNMdsEqm^r(~Gl)$FdjUv@ER-PZM| z3!Ga}Ul3sLZ%{9aH@E!*QF;eAQcyFim?vxb6YC9-`Uc)S{qn@%WwJ|U z=eALOpD4cziVP2@eSHkgm-Ok(>qUsH8p22gT_eT(4ENH>>sl&HCxEJ#242_z4h%E< Ex^_eog8%>k literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%dO=%>W7s5J?I6 zOsG4!XL#rj{T+Al-oPBN+x!MHM~QdkHzBr|Cl+us_ro^WM3!tDhfsBw7Pq%1Z{RD62N4N=i9+{y)3(Ru$V?xv1!7mfQc zC$)a&YY~(X8+6uKax?zdKvEm$?XN0+!~nA+>4rgX2FGfWUVr~jg!oq%fFplfE=b^F z*E|X$ABEacp-D>5QmMs>^C6Kt%bZKs7tqA@eZhm@7mF-$$2nRbtUkK-UAVyflBeE9)=j4Yx^^blg0G{qp7&RP?Tv#W249hQ1 z;a&i5R!X|YVS?xn#d0KHbp+uZ^eJiDp=DK7Q8q&K9V9}>7lfH+!()^ zhVi<3>Oy_K@#g6CBoJ+moJ(*_iX~jCgMSc+nVn=Xw^uft*T^QSAPhrD>@L20qNDU4 ztoB5mA&Wu>syLrBc^DsmQiQ@QL)6zpT7!BG>>{O|HFtXgh)1Ps5ZqLl)Cx&OS1)v+ z86sR8$66K)Dqhg=5(4#f`GiL&3yh2z0{z#Pk)7X@=tDjJ_J`^&YaK-^$7k{&2ct;Q Er@2=MA^-pY diff --git a/signatures/cagebreak.sig b/signatures/cagebreak.sig index b06130553f46759a6b0c15d2ec5e4a7f3fe3714d..e106209e41a6bc13a33cc9aa55e3b69e7b2586f4 100644 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*fj3?c-(R61$^wxVt5(TqTjC^AS0%fy{!~hBj5JeIN zvr>$FV`0b-|6sTKs%81)qQ(2WTT;zI;D3i|(&bmgFIMKXHUUH#P8VWTQwxv31z{)GG*1|?@P=OqGu(-c||L}F3ukC8;C=2;C0-2qv zNyyrDjgI2;(Sjt${|gcD%cXlm69&36I+EXi|5cFyo(-51B$llX+QTcB>=yAin9pT! zWo#@SSY@vb6AYPts>DbiLtLY=fxFX%MI-4s;Wo9VgW^OuIDQY;Zd6Z2;!^Tx#X20~kzP7eKjm};|Ek*U% EY6-U&D*ylh literal 566 zcmV-60?GY}0y6{v0SEvc79j*qg2yatK3J!`Pxw_y3HVH?JGf^B0%dO=%>W7s5J?I6 zOsG4!XRMG9{S^4?G%^Y3m5el0Q_7oaILK}lji>EKqg2qNLmPHp`AzALIN3h@;a~B) zymaY@9KZ9Z?6L?yxsZ1pU=68cL;~wowNV!k(}NRXx`~nO6O%vds-sG3-$iS`TqsdT zy69<@`z1%3|EV0;2c&?;WEN~;S=m2 z?~wRpF((7yAP7A+^P8Iwf*BC^zzRW1uK-TzJJQ?z8i%||)(5V~qx+VB?pRqYq0@!B zIo-vd&QOv|KoOWnF*@AlRmS2Vrdh0b@5a>H^Utb8 CONFIGPATH ) quit diff --git a/example_scripts/cb_script_header.sh b/test/testing-configurations/cb_script_header.sh similarity index 89% rename from example_scripts/cb_script_header.sh rename to test/testing-configurations/cb_script_header.sh index 770f075..d844a0a 100644 --- a/example_scripts/cb_script_header.sh +++ b/test/testing-configurations/cb_script_header.sh @@ -1,7 +1,5 @@ -#!/bin/bash -# Copyright 2023, project-repo and the cagebreak contributors +# Copyright 2024, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT - named_pipe_send="$(mktemp -u)" named_pipe_recv="$(mktemp -u)" mkfifo "${named_pipe_send}" diff --git a/test/testing-configurations/config b/test/testing-configurations/config index 9925aec..268fe77 100644 --- a/test/testing-configurations/config +++ b/test/testing-configurations/config @@ -1,4 +1,4 @@ -# Copyright 2023, project-repo and the cagebreak contributors +# Copyright 2023 - 2024, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT exec (echo $CAGEBREAK_SOCKET > CONFIGPATH) quit diff --git a/test/testing-configurations/env-var-config b/test/testing-configurations/env-var-config index a769e73..8476149 100644 --- a/test/testing-configurations/env-var-config +++ b/test/testing-configurations/env-var-config @@ -1,4 +1,4 @@ -# Copyright 2023, project-repo and the cagebreak contributors +# Copyright 2023 - 2024, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT exec (echo "SUCCESS" > CONFIGPATH ) quit diff --git a/test/testing-configurations/my-scan-build b/test/testing-configurations/my-scan-build index 526f1dd..db3f3d0 100755 --- a/test/testing-configurations/my-scan-build +++ b/test/testing-configurations/my-scan-build @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2023, project-repo and the cagebreak contributors +# Copyright 2023 - 2024, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT scan-build --status-bugs "$@" diff --git a/test/versions b/test/versions index b408c71..66b6d11 100644 --- a/test/versions +++ b/test/versions @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2023, project-repo and the cagebreak contributors +# Copyright 2023 - 2024, project-repo and the cagebreak contributors # SPDX-License-Identifier: MIT readonly newversion="${1}" diff --git a/util.c b/util.c index f8c7a82..1f84bdc 100644 --- a/util.c +++ b/util.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #include diff --git a/util.h b/util.h index b509a00..b9a95ef 100644 --- a/util.h +++ b/util.h @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #ifndef CG_UTIL_H diff --git a/view.c b/view.c index 69ee5fe..1d2d9c3 100644 --- a/view.c +++ b/view.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200809L @@ -80,11 +80,10 @@ void view_maximize(struct cg_view *view, struct cg_tile *tile) { view->ox = tile->tile.x; view->oy = tile->tile.y; - struct wlr_box box; - wlr_output_layout_get_box(view->server->output_layout, - view->workspace->output->wlr_output, &box); - wlr_scene_node_set_position(&view->scene_tree->node, view->ox + box.x, - view->oy + box.y); + wlr_scene_node_set_position( + &view->scene_tree->node, + view->ox + output_get_layout_box(view->workspace->output).x, + view->oy + output_get_layout_box(view->workspace->output).y); view->impl->maximize(view, tile->tile.width, tile->tile.height); view->tile = tile; wlr_scene_node_raise_to_top(&view->scene_tree->node); @@ -96,7 +95,7 @@ view_unmap(struct cg_view *view) { uint32_t id = view->id; uint32_t tile_id = 0; uint32_t ws = view->workspace->num; - char *output_name = view->workspace->output->wlr_output->name; + char *output_name = view->workspace->output->name; int output_id = output_get_num(view->workspace->output); pid_t pid = view->impl->get_pid(view); /* If the view is not mapped, do nothing */ @@ -170,11 +169,10 @@ view_map(struct cg_view *view, struct wlr_surface *surface, their own (x,y) coordinates in handle_wayland_surface_map. */ if(view->type == CG_XWAYLAND_VIEW && !xwayland_view_should_manage(view)) { wl_list_insert(&ws->unmanaged_views, &view->link); - struct wlr_box box; - wlr_output_layout_get_box(view->server->output_layout, - view->workspace->output->wlr_output, &box); - wlr_scene_node_set_position(&view->scene_tree->node, view->ox + box.x, - view->oy + box.y); + wlr_scene_node_set_position( + &view->scene_tree->node, + view->ox + output_get_layout_box(view->workspace->output).x, + view->oy + output_get_layout_box(view->workspace->output).y); } else #endif { @@ -192,8 +190,8 @@ view_map(struct cg_view *view, struct wlr_surface *surface, "{\"event_name\":\"view_map\",\"view_id\":%d,\"tile_id\":%d," "\"workspace\":%d,\"output\":\"%s\",\"output_id\":%d,\"view_pid\":%d}", view->id, tile_id, view->workspace->num + 1, - view->workspace->output->wlr_output->name, - output_get_num(view->workspace->output), view->impl->get_pid(view)); + view->workspace->output->name, output_get_num(view->workspace->output), + view->impl->get_pid(view)); } void diff --git a/view.h b/view.h index b9ec0a1..b2ff05d 100644 --- a/view.h +++ b/view.h @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #ifndef CG_VIEW_H diff --git a/workspace.c b/workspace.c index 3f84c6f..7d93183 100644 --- a/workspace.c +++ b/workspace.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200809L @@ -29,13 +29,8 @@ workspace_tile_update_view(struct cg_tile *tile, struct cg_view *view) { } } -#if CG_HAS_FANALYZE -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" -#endif int full_screen_workspace_tiles(struct wlr_output_layout *layout, - struct wlr_output *output, struct cg_workspace *workspace, uint32_t *tiles_curr_id) { workspace->focused_tile = calloc(1, sizeof(struct cg_tile)); @@ -47,18 +42,15 @@ full_screen_workspace_tiles(struct wlr_output_layout *layout, workspace->focused_tile->prev = workspace->focused_tile; workspace->focused_tile->tile.x = 0; workspace->focused_tile->tile.y = 0; - struct wlr_box output_box; - wlr_output_layout_get_box(layout, output, &output_box); - workspace->focused_tile->tile.width = output_box.width; - workspace->focused_tile->tile.height = output_box.height; + workspace->focused_tile->tile.width = + output_get_layout_box(workspace->output).width; + workspace->focused_tile->tile.height = + output_get_layout_box(workspace->output).height; workspace_tile_update_view(workspace->focused_tile, NULL); workspace->focused_tile->id = *tiles_curr_id; ++(*tiles_curr_id); return 0; } -#if CG_HAS_FANALYZE -#pragma GCC diagnostic pop -#endif struct cg_workspace * full_screen_workspace(struct cg_output *output) { @@ -72,16 +64,15 @@ full_screen_workspace(struct cg_output *output) { free(workspace); return NULL; } + workspace->output = output; workspace->server = output->server; workspace->num = -1; workspace->scene = wlr_scene_tree_create(&scene_output->scene->tree); - if(full_screen_workspace_tiles(output->server->output_layout, - output->wlr_output, workspace, + if(full_screen_workspace_tiles(output->server->output_layout, workspace, &output->server->tiles_curr_id) != 0) { free(workspace); return NULL; } - workspace->output = output; return workspace; } @@ -102,10 +93,10 @@ void workspace_free_tiles(struct cg_workspace *workspace) { workspace->focused_tile->prev->next = NULL; while(workspace->focused_tile != NULL) { - if(workspace->output->server->running && - workspace->output->server->seat->cursor_tile == - workspace->focused_tile) { - workspace->output->server->seat->cursor_tile = NULL; + if(workspace->server->seat != NULL && + (!workspace->output->server->running || + workspace->focused_tile == workspace->server->seat->cursor_tile)) { + workspace->server->seat->cursor_tile = NULL; } struct cg_tile *next = workspace->focused_tile->next; free(workspace->focused_tile); diff --git a/workspace.h b/workspace.h index b669cec..83b41a1 100644 --- a/workspace.h +++ b/workspace.h @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #ifndef CG_WORKSPACE_H @@ -33,7 +33,6 @@ struct cg_workspace * full_screen_workspace(struct cg_output *output); int full_screen_workspace_tiles(struct wlr_output_layout *layout, - struct wlr_output *output, struct cg_workspace *workspace, uint32_t *tiles_curr_id); void diff --git a/xdg_shell.c b/xdg_shell.c index 79f322f..fa15ad0 100644 --- a/xdg_shell.c +++ b/xdg_shell.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200809L @@ -53,10 +53,6 @@ xdg_decoration_handle_destroy(struct wl_listener *listener, void *data) { free(xdg_decoration); } -#if CG_HAS_FANALYZE -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak" -#endif static void xdg_decoration_handle_request_mode(struct wl_listener *listener, void *_data) { struct cg_xdg_decoration *xdg_decoration = @@ -67,21 +63,18 @@ xdg_decoration_handle_request_mode(struct wl_listener *listener, void *_data) { wlr_xdg_toplevel_decoration_v1_set_mode(xdg_decoration->wlr_decoration, mode); } -#if CG_HAS_FANALYZE -#pragma GCC diagnostic pop -#endif static void popup_unconstrain(struct cg_view *view, struct wlr_xdg_popup *popup) { struct wlr_box *popup_box = &popup->current.geometry; struct wlr_output_layout *output_layout = view->server->output_layout; - struct wlr_box view_output_box; - wlr_output_layout_get_box( - output_layout, view->workspace->output->wlr_output, &view_output_box); struct wlr_output *wlr_output = wlr_output_layout_output_at( - output_layout, view_output_box.x + view->ox + popup_box->x, - view_output_box.y + view->oy + popup_box->y); + output_layout, + output_get_layout_box(view->workspace->output).x + view->ox + + popup_box->x, + output_get_layout_box(view->workspace->output).y + view->oy + + popup_box->y); struct wlr_box output_box; wlr_output_layout_get_box(output_layout, wlr_output, &output_box); @@ -171,8 +164,9 @@ handle_xdg_shell_surface_request_fullscreen(struct wl_listener *listener, * they display in fullscreen mode, so we set it here. */ struct wlr_box layout_box; - wlr_output_layout_get_box(xdg_shell_view->view.server->output_layout, NULL, - &layout_box); + wlr_output_layout_get_box( + xdg_shell_view->view.server->output_layout, + xdg_shell_view->view.workspace->output->wlr_output, &layout_box); wlr_xdg_toplevel_set_size(xdg_shell_view->xdg_surface->toplevel, layout_box.width, layout_box.height); diff --git a/xdg_shell.h b/xdg_shell.h index fd80b99..5f9456c 100644 --- a/xdg_shell.h +++ b/xdg_shell.h @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #ifndef CG_XDG_SHELL_H diff --git a/xwayland.c b/xwayland.c index 21cc2ba..5755148 100644 --- a/xwayland.c +++ b/xwayland.c @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #include "config.h" @@ -96,13 +96,11 @@ maximize(struct cg_view *view, int width, int height) { } } - struct wlr_box output_box; - wlr_output_layout_get_box(view->server->output_layout, - view->server->curr_output->wlr_output, - &output_box); - wlr_xwayland_surface_configure(xwayland_view->xwayland_surface, - view->ox + output_box.x, - view->oy + output_box.y, width, height); + wlr_xwayland_surface_configure( + xwayland_view->xwayland_surface, + view->ox + output_get_layout_box(view->server->curr_output).x, + view->oy + output_get_layout_box(view->server->curr_output).y, width, + height); wlr_xwayland_surface_set_maximized(xwayland_view->xwayland_surface, true); } @@ -138,12 +136,10 @@ handle_xwayland_surface_map(struct wl_listener *listener, void *_data) { wl_container_of(listener, xwayland_view, map); struct cg_view *view = &xwayland_view->view; if(!xwayland_view_should_manage(view)) { - struct wlr_output_layout *output_layout = view->server->output_layout; - struct wlr_box output_box; - wlr_output_layout_get_box( - output_layout, view->server->curr_output->wlr_output, &output_box); - view->ox = xwayland_view->xwayland_surface->x - output_box.x; - view->oy = xwayland_view->xwayland_surface->y - output_box.y; + view->ox = xwayland_view->xwayland_surface->x - + view->server->curr_output->layout_box.x; + view->oy = xwayland_view->xwayland_surface->y - + view->server->curr_output->layout_box.y; } view_map(view, xwayland_view->xwayland_surface->surface, diff --git a/xwayland.h b/xwayland.h index 79c265a..6661f0e 100644 --- a/xwayland.h +++ b/xwayland.h @@ -1,4 +1,4 @@ -// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// Copyright 2020 - 2024, project-repo and the cagebreak contributors // SPDX-License-Identifier: MIT #ifndef CG_XWAYLAND_H From ace4ff04c61806d9c321392cbdc443435a6274ee Mon Sep 17 00:00:00 2001 From: project-repo Date: Sat, 27 Jan 2024 16:50:27 +0000 Subject: [PATCH 8/8] Release 2.3.1 * Unbreak build on FreeBSD (#74, 73 in Bugs.md) * Thanks to Jan Beich for pointing this out. * Add Issue 74 to Bugs.md (#71, was fixed in 2.3.0) --- Bugs.md | 27 ++++++++++++++---- Hashes.md | 20 +++++++++++++ README.md | 2 +- keybinding.c | 1 + man/cagebreak-config.5.md | 2 +- man/cagebreak-socket.7.md | 2 +- man/cagebreak.1.md | 2 +- meson.build | 4 +-- release-non-auto-checks/Bugs.md | 4 +-- release-non-auto-checks/FAQ.md | 4 +-- release-non-auto-checks/SECURITY.md | 4 +-- release-non-auto-checks/WLR_XDG_VERSION | 4 +-- .../acknowledge-contributors | 4 +-- release-non-auto-checks/archwiki | 4 +-- release-non-auto-checks/changelog-major-minor | 4 +-- release-non-auto-checks/internal-wiki | 4 +-- release-non-auto-checks/release-note | 4 +-- .../reproducibility-checked | 4 +-- .../security-to-man-page-info-transfer | 4 +-- release-non-auto-checks/version-restrictions | 4 +-- signatures/2.3.0-cagebreak-config.5.sig | Bin 0 -> 566 bytes signatures/2.3.0-cagebreak-socket.7.sig | Bin 0 -> 566 bytes signatures/2.3.0-cagebreak.1.sig | Bin 0 -> 566 bytes signatures/2.3.0-cagebreak.sig | Bin 0 -> 566 bytes signatures/cagebreak-config.5.sig | Bin 566 -> 566 bytes signatures/cagebreak-socket.7.sig | Bin 566 -> 566 bytes signatures/cagebreak.1.sig | Bin 566 -> 566 bytes signatures/cagebreak.sig | Bin 566 -> 566 bytes 28 files changed, 73 insertions(+), 35 deletions(-) create mode 100644 signatures/2.3.0-cagebreak-config.5.sig create mode 100644 signatures/2.3.0-cagebreak-socket.7.sig create mode 100644 signatures/2.3.0-cagebreak.1.sig create mode 100644 signatures/2.3.0-cagebreak.sig diff --git a/Bugs.md b/Bugs.md index 4ecef6c..970edf4 100644 --- a/Bugs.md +++ b/Bugs.md @@ -1254,7 +1254,7 @@ established behaviour. ## Issue 68 - * github issue numner: #38 + * github issue number: #38 * Fixed: 2.3.0 After extensive discussion of how to deal with turning off outputs, the @@ -1265,7 +1265,7 @@ Thanks to sodface for the great cooperation. ## Issue 69 - * github issue numner: #68 + * github issue number: #68 * Fixed: 2.3.0 The config man page (5) was badly formatted up to version 2.3.0. @@ -1275,7 +1275,7 @@ shown in the web browser view of our repo. ## Issue 70 - * github issue numner: #62 + * github issue number: #62 * Fixed: 2.3.0 The README contained a few non-intuitive phrases up to version 2.3.0. @@ -1288,7 +1288,7 @@ To alleviate this, the following changes were made: ## Issue 71 - * github issue numner: #60 + * github issue number: #60 * Fixed: 2.3.0 Cagebreak up to 2.3.0 did not have configuration for the message location. @@ -1298,9 +1298,26 @@ accessibility. ## Issue 72 - * github issue numner: N/A + * github issue number: N/A * Fixed: 2.3.0 A Cagebreak version before 2.3.0 broke the gamma toolkit used to tune the monitor colors. +## Issue 73 + + * github issue number: #73 + * Fixed: 2.3.1 + +After 2.3.0 cagebreak did not build on FreeBSD. Since the fix was trivial, +this is fixed in 2.3.1. Thank to Jan Beich for pointing this out. + +## Issue 74 + + * github issue number: #71 + * Fixed. 2.3.0 + +Before 2.3.0 there was an issue with rendering fullscreen applications, particularly +under setups with multiple outputs applications spanned both outputs. Output ordering +also did not work as advertised. + diff --git a/Hashes.md b/Hashes.md index 2930148..7f0018a 100644 --- a/Hashes.md +++ b/Hashes.md @@ -1,5 +1,25 @@ # Hashes +2.3.1 cagebreak + + * sha 256: 51d76608726a6251690d6dd1371cdfaa6eae5188a08798cda9c9280b3fcbe3fa + * sha 512: 648c61958f5920b3377f53706f7a820750a2b7dd1d486db4a93d803fe38be4aa728058e82d404fde4e7f1627b9809050a5760c4193562a6c23e39d0851f1ddf0 + +2.3.1 cagebreak.1 + + * sha 256: c58390d641514b2eb623a803dc665116d60079b8aac39219b939cc36ffb72038 + * sha 512: 82c0248764026666e6fbe3e29bf48062db07d6a86c787258474312a0eae23a73898bcc2fd6c407fbac0a25d6414f9ca9a56e5d17d7c8adfe9e7ce903e6ed5978 + +2.3.1 cagebreak-config.5 + + * sha 256: 5cf2f8c883ce89563bbae1fa4f0e00bda42c4ba01f680fc75fc71ab3f6e1f2a8 + * sha 512: 10d72ca588f5e2123dc59ede89dafd0e6fb9cd6cbc83922ada751c37f9000c86f68e5e6bf9f68298380ec0f9cbce1f22d0a0f712d0004b168a0b039a41f32358 + +2.3.1 cagebreak-socket.7 + + * sha 256: 0363113a32533a6fb4a1e7030cff880f001db5e0c29bb8bd74f8f11067dce3d1 + * sha 512: f957ebad717456901a028344211609d009d9b8c2a68ef88a0d60fca8dc91cc1fe1aba58a9e84d16782190b59b9fcd1d45ecc154c020018609c8fcdf940aa18e4 + 2.3.0 cagebreak * sha 256: 549e82f6bb1af87c9272fb92d39c6f235b0f780885b066c32db5a5c7588da378 diff --git a/README.md b/README.md index 79397ea..c4ce338 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Cagebreak: A Tiling Wayland Compositor -[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.3.0)](https://repology.org/project/cagebreak/versions) +[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.3.1)](https://repology.org/project/cagebreak/versions) [![Contact](img/mail.svg)](SECURITY.md) [![Manuals](img/manuals.svg)](manuals.md) [![FAQ](img/faq.svg)](FAQ.md) [![CONTRIBUTING](img/contributing.svg)](CONTRIBUTING.md) [![ArchWiki](img/archwiki.svg)](https://wiki.archlinux.org/title/Cagebreak) [![AUR](img/aur.svg)](https://aur.archlinux.org/packages?O=0&K=cagebreak) diff --git a/keybinding.c b/keybinding.c index 2432e59..9878a58 100644 --- a/keybinding.c +++ b/keybinding.c @@ -3,6 +3,7 @@ #define _POSIX_C_SOURCE 200809L +#include #include #include #include diff --git a/man/cagebreak-config.5.md b/man/cagebreak-config.5.md index ee68d72..7c18c9a 100644 --- a/man/cagebreak-config.5.md +++ b/man/cagebreak-config.5.md @@ -1,4 +1,4 @@ -cagebreak-config(5) "Version 2.3.0" "Cagebreak Manual" +cagebreak-config(5) "Version 2.3.1" "Cagebreak Manual" # NAME diff --git a/man/cagebreak-socket.7.md b/man/cagebreak-socket.7.md index ed47f05..a5f3d8a 100644 --- a/man/cagebreak-socket.7.md +++ b/man/cagebreak-socket.7.md @@ -1,4 +1,4 @@ -cagebreak-socket(7) "Version 2.3.0" "Cagebreak Manual" +cagebreak-socket(7) "Version 2.3.1" "Cagebreak Manual" # NAME diff --git a/man/cagebreak.1.md b/man/cagebreak.1.md index 4dfd854..d91c589 100644 --- a/man/cagebreak.1.md +++ b/man/cagebreak.1.md @@ -1,4 +1,4 @@ -cagebreak(1) "Version 2.3.0" "Cagebreak Manual" +cagebreak(1) "Version 2.3.1" "Cagebreak Manual" # NAME diff --git a/meson.build b/meson.build index b0b458d..6b57a32 100644 --- a/meson.build +++ b/meson.build @@ -3,7 +3,7 @@ project( 'cagebreak', 'c', -version : '2.3.0', +version : '2.3.1', license : 'MIT', default_options : ['c_std=c11', 'warning_level=3'] ) @@ -260,7 +260,7 @@ install_data('LICENSE', install_dir : '/usr/share/licenses/' + meson.project_nam if get_option('man-pages') scdoc = find_program('scdoc') - secssinceepoch = 1706213605 + secssinceepoch = 1706350970 shcommand = 'export SOURCE_DATE_EPOCH=' + secssinceepoch.to_string() + ' ; @0@ < @INPUT@'.format(scdoc.path()) sh = find_program('sh') mandir1 = join_paths(get_option('mandir'), 'man1') diff --git a/release-non-auto-checks/Bugs.md b/release-non-auto-checks/Bugs.md index b196533..8e6104c 100644 --- a/release-non-auto-checks/Bugs.md +++ b/release-non-auto-checks/Bugs.md @@ -1,2 +1,2 @@ -2.3.0 -2024-01-26 +2.3.1 +2024-01-27 diff --git a/release-non-auto-checks/FAQ.md b/release-non-auto-checks/FAQ.md index b196533..8e6104c 100644 --- a/release-non-auto-checks/FAQ.md +++ b/release-non-auto-checks/FAQ.md @@ -1,2 +1,2 @@ -2.3.0 -2024-01-26 +2.3.1 +2024-01-27 diff --git a/release-non-auto-checks/SECURITY.md b/release-non-auto-checks/SECURITY.md index b196533..8e6104c 100644 --- a/release-non-auto-checks/SECURITY.md +++ b/release-non-auto-checks/SECURITY.md @@ -1,2 +1,2 @@ -2.3.0 -2024-01-26 +2.3.1 +2024-01-27 diff --git a/release-non-auto-checks/WLR_XDG_VERSION b/release-non-auto-checks/WLR_XDG_VERSION index b196533..8e6104c 100644 --- a/release-non-auto-checks/WLR_XDG_VERSION +++ b/release-non-auto-checks/WLR_XDG_VERSION @@ -1,2 +1,2 @@ -2.3.0 -2024-01-26 +2.3.1 +2024-01-27 diff --git a/release-non-auto-checks/acknowledge-contributors b/release-non-auto-checks/acknowledge-contributors index b196533..8e6104c 100644 --- a/release-non-auto-checks/acknowledge-contributors +++ b/release-non-auto-checks/acknowledge-contributors @@ -1,2 +1,2 @@ -2.3.0 -2024-01-26 +2.3.1 +2024-01-27 diff --git a/release-non-auto-checks/archwiki b/release-non-auto-checks/archwiki index b196533..8e6104c 100644 --- a/release-non-auto-checks/archwiki +++ b/release-non-auto-checks/archwiki @@ -1,2 +1,2 @@ -2.3.0 -2024-01-26 +2.3.1 +2024-01-27 diff --git a/release-non-auto-checks/changelog-major-minor b/release-non-auto-checks/changelog-major-minor index b196533..8e6104c 100644 --- a/release-non-auto-checks/changelog-major-minor +++ b/release-non-auto-checks/changelog-major-minor @@ -1,2 +1,2 @@ -2.3.0 -2024-01-26 +2.3.1 +2024-01-27 diff --git a/release-non-auto-checks/internal-wiki b/release-non-auto-checks/internal-wiki index b196533..8e6104c 100644 --- a/release-non-auto-checks/internal-wiki +++ b/release-non-auto-checks/internal-wiki @@ -1,2 +1,2 @@ -2.3.0 -2024-01-26 +2.3.1 +2024-01-27 diff --git a/release-non-auto-checks/release-note b/release-non-auto-checks/release-note index b196533..8e6104c 100644 --- a/release-non-auto-checks/release-note +++ b/release-non-auto-checks/release-note @@ -1,2 +1,2 @@ -2.3.0 -2024-01-26 +2.3.1 +2024-01-27 diff --git a/release-non-auto-checks/reproducibility-checked b/release-non-auto-checks/reproducibility-checked index b196533..8e6104c 100644 --- a/release-non-auto-checks/reproducibility-checked +++ b/release-non-auto-checks/reproducibility-checked @@ -1,2 +1,2 @@ -2.3.0 -2024-01-26 +2.3.1 +2024-01-27 diff --git a/release-non-auto-checks/security-to-man-page-info-transfer b/release-non-auto-checks/security-to-man-page-info-transfer index b196533..8e6104c 100644 --- a/release-non-auto-checks/security-to-man-page-info-transfer +++ b/release-non-auto-checks/security-to-man-page-info-transfer @@ -1,2 +1,2 @@ -2.3.0 -2024-01-26 +2.3.1 +2024-01-27 diff --git a/release-non-auto-checks/version-restrictions b/release-non-auto-checks/version-restrictions index b196533..8e6104c 100644 --- a/release-non-auto-checks/version-restrictions +++ b/release-non-auto-checks/version-restrictions @@ -1,2 +1,2 @@ -2.3.0 -2024-01-26 +2.3.1 +2024-01-27 diff --git a/signatures/2.3.0-cagebreak-config.5.sig b/signatures/2.3.0-cagebreak-config.5.sig new file mode 100644 index 0000000000000000000000000000000000000000..fdbf9e3353a8735dd5852b1594354e1bb7c3601d GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*fj3?c-(R61$^wxVt5(TqTjC^AS0%fy{!~hBj5JeIN zvr>$FV@;+I0D^9Evlne?qQS(sCt|#67`gVa4;YZrz^IadZjiZg9AM5Fl9NuDd;L(g z&FIcmFW`pIpf2uSMXG4XO*XTp=PDjn_=?Cj??Ulzglg^5MEoC{ov(CO@X&I^k=_&SbK2pEm= z$xVU0w5U2fRup=?k;RFm<^v-=7j1p_kBSLFi6GH%D|&C5CQzLQyERg2;zbHi5TCEB z2E`HAgZKmA1oxlZA>XrJzsaQz?}HqL42v|+;2>1ttB1PS6An1bsU4@-s1J&RP&mrK z(WsT%{ZdE1su#g$PZgU}DU`kptkABdLg0u`2(vP_yQ+ULFY#KWBCx7sCo=u?!lR3= z1#?mWI=axdoptn(;m%cZG0E15^Hw+mp9NR=q=V3&F5!2q_hG;5G^ZY%ZD#|8{?Fvr z+ryfm1qlP46HZAeyVV_h!L{CO{ZFg7-w3c{079Ut3SJ6GY1fxb`{;S9HB#*RnzDcr zGU-k3EmW4k#|}>t(>%&H%~--iT-T?Aghiw!Y$=;2r9u#e%JI_ zf>*aS(~y`kMIFhqZepjqnQjEIm7aEGdd^pSAGKhdK3_M E_N;CdYybcN literal 0 HcmV?d00001 diff --git a/signatures/2.3.0-cagebreak-socket.7.sig b/signatures/2.3.0-cagebreak-socket.7.sig new file mode 100644 index 0000000000000000000000000000000000000000..274e8e511d81717770e4b85ebe15fc540eaf15e4 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*fj3?c-(R61$^wxVt5(TqTjC^AS0%fy{!~hBj5JeIN zvr>$FV+{ci0FVk4pZ@5#p=MAnB%={2LAyG)?MEy$jYUmyuCHfqeovKF_esgy{%6Dq zu&rvF7KjJyT-2;|Nkg$$rxABsjv{d9b_R~p6NL-VnF~x)%X_eQrXGRA{)Hy zCNN~()r+T2gBPip7Sfc2JtyA8Z|~@M6!;`Q>gl?;Dh9xd^I~UT<58VO#{ww`uJ2p1e-C!xr_dy z!TdS*h()PclryOEj;7V%Hv!N=O)@ZMFnS}iq?>j~Y{Ls3gjPhjXX$AaH$Fy?3eq%> zhmt>=2`ja(4kMFI!rg6nXHu6rnGLjBMUC23S3cFs2h(4)18;bGgPRT#QPkr%C?%h* zmfi!WR#{#pEGvCF`U(PDgIFH{>dl6IR@W6pN;T)ohQ3VC-`{QomcHY)oVU1ZK+Kvy EdRn&%eE$FV`bD2{yS8osLz6ml84%T-f}!GvPVdfu|-TyrQeyFp(z+PiP6t8h#G!k@UNsI z>o5@MLpYGCN<_`qGHFe5=O|Hklc;hup6}kum#9)G1y=i2i%AoB{8g|vMxnc)1vmK- z^CxGI8n8|`xuy|uXKOm_f9+#7nAZqq65L^ZJ!)i<@w#)vCtdqq)vM&}2mdiP*Oxs0 zvVwvXBKXkWdN>Xp_4_RlqqiFsp-S0@%m~uaVV>a?+ny`R^i%(lPqKq40yA)pGmh1Q zLmboYtiy1*rykfKYLZCl1McA}nm4?1SW-T}WO+m=eTCZxM_U|x#8&vi8;n{l~9SK_#Y&WCr<~f(^czt;VRa!&+j~d6&D=ilcyY2rZIKkHc?O z2XK9!5hQ5rQnk@5AXe8H5{?2>{e5rRuBu_XUh)g$iRx7ipdG|vd4}sxymQ>Z`P|&v z%Iq!5F6mrXzh5b%|6PI|t6~`96ICAM5J8%IKSNMdsEqm^r(~Gl)$FdjUv@ER-PZM| z3!Ga}Ul3sLZ%{9aH@E!*QF;eAQcyFim?vxb6YC9-`Uc)S{qn@%WwJ|U z=eALOpD4cziVP2@eSHkgm-Ok(>qUsH8p22gT_eT(4ENH>>sl&HCxEJ#242_z4h%E< Ex^_eog8%>k literal 0 HcmV?d00001 diff --git a/signatures/2.3.0-cagebreak.sig b/signatures/2.3.0-cagebreak.sig new file mode 100644 index 0000000000000000000000000000000000000000..e106209e41a6bc13a33cc9aa55e3b69e7b2586f4 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j*fj3?c-(R61$^wxVt5(TqTjC^AS0%fy{!~hBj5JeIN zvr>$FV`0b-|6sTKs%81)qQ(2WTT;zI;D3i|(&bmgFIMKXHUUH#P8VWTQwxv31z{)GG*1|?@P=OqGu(-c||L}F3ukC8;C=2;C0-2qv zNyyrDjgI2;(Sjt${|gcD%cXlm69&36I+EXi|5cFyo(-51B$llX+QTcB>=yAin9pT! zWo#@SSY@vb6AYPts>DbiLtLY=fxFX%MI-4s;Wo9VgW^OuIDQY;Zd6Z2;!^Tx#X20~kzP7eKjm};|Ek*U% EY6-U&D*ylh literal 0 HcmV?d00001 diff --git a/signatures/cagebreak-config.5.sig b/signatures/cagebreak-config.5.sig index fdbf9e3353a8735dd5852b1594354e1bb7c3601d..62cebfaba585b711bc49dc7839295f7ffd85c68c 100644 GIT binary patch delta 542 zcmV+(0^$9(1hxc_BY(8psQ?NI5JeINvr>$FW8Cl$|45rH8WFc5lrS%z74%wY9GI|z z!VFw8XeZdd`n!c2nU}Rv^&>GFvX#rXfjvv$5L-XAnuQM*Qfsy^H+D$6QzdMlcU$C^ z^sE$o8rkqt(JEhKNk zUfa$2gL%9N{gx!x0+lGSA|LYpFR}hVXB`6MZ@R0cM6&}~QQC?vuog0)IJPeyBxgW* zSrH|vV7k@<#(&@xNTMp87L1~YGoi)lNkRYcK@0n;!5+CqzUk)J&)>I!)_I@6KkQUv zRhOQ2$u)7cwK$d;8mCp%Ka0)yD*2mN6dtpZA09C}{nQ}1qiGmzrTdjnG9B$BM%<%0 z`AVaf_DF!cMfS6zFg_pRNHPCV&B+j2SYK4F(~nH!Eq|x1DxI%_vD@GsS+X}_UjgdZ z(GB&RGyD4MmyU>umCFKIbu5wpG;xPo2I|~O)dY#K`B%w*!;}}ZnT#ITHnhhzXnov} zZS<*j_hBu-vp+f?4rq^|En~(C&jOHnX0s=lQAo~XOt0X(vR=f4J!w*~;`A9c$Q*{% gFw|E12N$GwrGC{V>oS0=_oj{7J(bi1+ZL418$(zKi~s-t delta 542 zcmV+(0^$9(1hxc_BY(4t!~hBj5JeINvr>$FV@;+I0D^9Evlne?qQS(sCt|#67`gVa z4;YZrz^IadZjiZg9AM5Fl9NuDd;L(g&FIcmFW`pIpf2uSMXG4XO*XMe(zuqqwy6zuHhHD4CN z_l1c?xtt4JiqProdCm)qI`}${QV1B0@yShrytJq~JXREXyphF;q~-%7Jr`|#_m7GR zL5U#Ia4ULmnkG=42D>#(E7QUE%-(6*g*^pN4sRdO-O)`;^~I0K&r zSNNoZ(4H>gcdYkezw0!o9-M7w1BL$2h($ diff --git a/signatures/cagebreak-socket.7.sig b/signatures/cagebreak-socket.7.sig index 274e8e511d81717770e4b85ebe15fc540eaf15e4..aef73c01926681303c84a6e4ec26f7a8fdbae5cf 100644 GIT binary patch delta 542 zcmV+(0^$9(1hxc_BY(8psQ?NI5JeINvr>$FV_&Ne|8g17?vtmp>3vx=zNZM!kMq2S z^V-sec=@NKc*~G3Vtq>kgBHDzsT0d2rV5#w{0NKQScyx+3Fk|R-4%UA6lKTogJ*LW{{MJiaAl0$KQ!YhYR-}d102pz;c1_)J+L^dtdK|CSZ$FV+{ci0FVk4pZ@5#p=MAnB%={2LAyG) z?MEy$jYUmyuCHfqeovKF_esgy{%6Dqu&rvF7KjJyT-2;|Nkg$$rxABsjv{d9b_R~p6NL-VnF~x)%X_eQrXGRA{)HyCNN~()r+T2gBPip7Jt%|ggqzT#BcBDc;l7- zCi{ujy8TYSn>a$M9#zxz?6^6yrvM-YldOcuYS#wm@fXnpcv)Dh>)PD!$sig;4FBUD z1NA7n{MT||H=0we2h~Z|=63spux>tr_86lppXr(hZ&RrHs^Ejy*Up+RAr$Fe(bxM3;f(a^reu9 z2xK+wcQGF+kofvVL*_KRB9A#V)7NF>f12W_RlXMb@8^PnR86k$Td{u+dVoDHSO;c{ zEqH$O0!0oOKP>St38T6oD5Wd9u2i{;{-VMBIroS~sef6NGpO>8rq$p#0nkBBGB9Q^ zdLy%>n|4TS!wVgRRz$dG>1h-$FV{T{<|6Ks-TbRaT8r zP-<=GyDZMhh(G0u$8VZ(2k36vHjKq-;c1H_3tOsROcZpS4u78198`3pv}0Z2>Ha)f z-}m#-r6x{1Tp~%k@*JRtI~+_HBw_`I>Wvszoje7i6XDmU@?^38*B0A63!d-hyA~UQ zZvm3<#daHk`?g1~GoQWZ5pqvT;;McP_qV>Oc8&<62* zd*>mole0Yp%YXSU*lZ8>P@YRTFAMcC_!v-@2Lh($ delta 542 zcmV+(0^$9(1hxc_BY(4t!~hBj5JeINvr>$FV`bD2{yS8osLz6ml84%T-f}!GvPVdf zu|-TyrQeyFp(z+PiP6t8h#G!k@UNsI>o5@MLpYGCN<_`qGHFe5=O|Hklc;hup6}ku zm#9)G1y=i2i%AoB{8g|vMxnc)1vmK-^CxGI8n8|`xuy|uXMbxt?0@ZJHkj84W)j?C zeLZSqlJUB8!zW$)Ue&AQ><9lbHrJOt{<4CC6e9T0-g-C=9rgPy5Tmyn6`@Mmhs+4l z(P5t972BRG%JftJkx#ONDFQQajWdqbfzWJDw;REa#&J6 zzhrqtD1C+72Y*Lf9DKx9_`(~ES}o+545Qe>&=u%%HMLjbCtVw?I>bRGrix?+`I>?a zzL~AYsIkLZV$*q-yV8oIfO7~fl1z`oZ&e3yeV!2{XzWt8(JLTU*BBCx0#p5cZ`!V^ zVY^=P3*(9ERSlpW#9?`c>rcFM+`#$V+}g_QEy^zGTz^-;Un!&iU4k8}Vi@8RRUYIJ zL7IC%Lr_$xjQSp@WSHO8?5?|Cb}?z)*7c_goLf*|5Mb|bP%nx%xBUZAdIvXBP&2ET zCu{i=>mr<(wo!ebD8CDe3=gM$eGJW)^y$p&MTo2# g!bk;OBNxT|4ENH>>sl&HCxEJ#242_z4h%E$FV{;4-|5@q1Qne+3wGrkR`oF!b&U&^; z#9`%VL z(gM&4CJh~yB9gudHiY%GB+n?U%g0kTt)MjeG-91;E>3l;kAJ}RzG5|Y>f%#u9PhT8 zRNtoFK0-LgF-Wq;fvMosmVQ0jQd`2Bpo3T*g;zz1G~o6XZlC~v)|uk&9?dNWFJobumJ4!P!j8 zFX8CJj=)@FXn%vXXQ8iV$UIYk7oogtg7f`s_@Yrv0ey)*`rYy!4;KG;=3vSv(n^tI(EryNaox{WK%D*|Yd|tv=rkcwa*~HSHt4DJgzsIj|96>?&DG#Ezje zmxbsoiri6rShhc5xbZ2Y(w4A4QDlt*Z%1%TE0aV`Ryf zYlKf}5=YbwkPJ1};3TUE3s6B_=@6tLp9}|8I>~rkVMClL_1+jWhUjN=CX*H=?l(PR znCcpQE}l$M~GUxC!rsJ8&pI$!MB)FG=cHK gk*_W+%on}+ks80OtcWR@@05CHeO1#_hCj$e_^lEU{{R30 delta 542 zcmV+(0^$9(1hxc_BY(4t!~hBj5JeINvr>$FV`0b-|6sTKs%81)qQ(2WTT;zI;D3i| z(&bmgFIMKXHUUH#P8VWTQwxv31z