diff --git a/Bugs.md b/Bugs.md index c1792c4..d8a33a1 100644 --- a/Bugs.md +++ b/Bugs.md @@ -1120,3 +1120,53 @@ Cagebreak was not compatible with clang 15 and POSIX which was causing issues with building under FreeBSD. Thanks to Jan Beich for pointing this out and providing a PR. + +## Issue 55 + + * github issue number: N/A + * Fixed: 2.1.0 + +Prior to release 2.1.0, cagebreak sometimes crased due to a null pointer +derefrence when the cursor was moved. + +## Issue 56 + + * github issue numner: N/A + * Fixed: 2.1.0 + +Prior to release 2.1.0, the following workflow caused cagebreak to +crash: + + * Split an empty workspace. + * Open 2 windows on the left tile. + * exchangeright + * focus left + * cycle views + +The reason for this is that the ipc send event did not handle +focussing the background correctly when cycling. + +## Issue 57 + + * github issue number: #39 + * Fixed: 2.1.0 + +maxhbr pointed out that there was a spelling mistake in the +SPDX-License-Identifier. + +## Issue 58 + + * github issue number: #40 + * Fixed: 2.1.0 + +Prior to version 2.1.0, the logic behind configuration file loading was +broken. This had the effect, that the default configuration file was not +loaded when the user-specific config file was not present, instead +leading to a termination of cagebreak. + +## Issue 59 + + * github issue number: N/A + * Fixed: 2.1.0 + +Prior to release 2.1.0 `meson install` did not work perfectly. diff --git a/Changelog.md b/Changelog.md index e469a6c..c33e179 100644 --- a/Changelog.md +++ b/Changelog.md @@ -106,3 +106,16 @@ Changelog: * Disable outputs when unable to set any mode (crashed previously) * Add Code of Conduct * Print version number on startup + +## Release 2.1.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 diff --git a/Hashes.md b/Hashes.md index 1fe4b4a..4e28e1e 100644 --- a/Hashes.md +++ b/Hashes.md @@ -1,5 +1,25 @@ # Hashes +2.1.0 cagebreak + + * sha 256: 0c90ba529ffc916306a1ca04d4c56a800c62a98d184d3cfcc2ce67dcdffad324 + * sha 512: 097007da750c8acd09ee63159aeff5a5584cbab45525bd8fe81a379da5cc0e9f2bf776b809122d1b599f4716ef7feb0ccc0cf98be47a71d4819e2a8cd7a2f495 + +2.1.0 cagebreak.1 + + * sha 256: 6509c9126a9a140c517111f9352bf787a31dd8451fa9976135fc1dfbe40ed23d + * sha 512: 96a8c3d5b9677a95255c09b3674559aea7ff130370baa1cce40212501cb288c047048cf9bfbf78bc2cfab35e346fd49ef6b9d5d67f8ab5d07f8991f66e8de3aa + +2.1.0 cagebreak-config.5 + + * sha 256: dbccee812d59209ddad73b376bfbb823611e2a8a92078b55e847ab678122bd54 + * sha 512: a8d0b31007208d7ca38f691ded77d9f13318f47046d9237efd6738d0e10dd8402a35fc48230e72493b17aeeb174cb246440301626a1cd5a48c7d03d0800d0128 + +2.1.0 cagebreak-socket.7 + + * sha 256: e7b85f15665da4a4422ad223b4b2748ff4315d315a8b108df279ff3b13b8c4c9 + * sha 512: 01dc53b4867ebc18f0091c3b1a239a89959403686c05e5e22aebf8155a46b82492b9aed27198a78e2777a9ff44b03f6e10ca82283062a29e1fa0114b97bb36a3 + 2.0.1 cagebreak * sha 256: 3d7cdf511976248614617b1738246a3c5fa94543838e798c0c3a9aec325027b9 diff --git a/LICENSE b/LICENSE index 538d78c..e0aba93 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2020-2022 The Cagebreak authors +Copyright (c) 2020-2023 The Cagebreak authors Copyright (c) 2018-2020 Jente Hidskes Copyright (c) 2019 The Sway authors diff --git a/README.md b/README.md index 4c284b0..f933980 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.0.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.0)](https://repology.org/project/cagebreak/versions) ## Quick Introduction @@ -148,7 +148,7 @@ Cagebreak was originally built to suit the needs of its creators. This section o 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 of explanations for why certain particularities. +as a source of inspiration and explanations 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 @@ -287,6 +287,49 @@ and after #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. + +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 @@ -305,7 +348,7 @@ CC=clang meson setup build -Dfuzz=true -Db_sanitize=address,undefined -Db_lundef ninja -C build/ mkdir build/fuzz_corpus cp examples/config build/fuzz_corpus/ -WLR_BACKENDS=headless ./build/fuzz/fuzz-parse -jobs=12 -max_len=50000 -close_fd_mask=3 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. @@ -376,6 +419,8 @@ keys. * 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. @@ -415,8 +460,6 @@ The release procedure outlines the process for a release to occur. * [ ] Adjust version number * [ ] meson.build * [ ] git tag - * [ ] man pages - * [ ] README.md repology badges minversion * [ ] Relevant Documentation completed * [ ] New features * [ ] man pages @@ -430,16 +473,15 @@ The release procedure outlines the process for a release to occur. * [ ] Check features 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 * [ ] Include issue discussion from github, where applicable * [ ] Testing * [ ] Manual testing * [ ] Libfuzzer testing - * [ ] Build version without xwayland support - * [ ] meson.build reproducible build versions are current archlinux libraries and gcc + * [ ] Arch Build System is up to date * [ ] wlr_xdg_shell version check - * [ ] `ninja -C build clang-format` makes no changes - * [ ] `ninja -C build scan-build` shows no issues * [ ] Cagebreak is reproducible on multiple machines * [ ] Documented reproducible build artefacts * [ ] Hashes of the artefacts in Hashes.md @@ -449,6 +491,7 @@ The release procedure outlines the process for a release to occur. * [ ] `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` * [ ] `git add` relevant files * [ ] `git commit` * [ ] `git push origin development` @@ -568,5 +611,24 @@ see [SECURITY.md](SECURITY.md). ## License -MIT, please see [LICENSE](https://github.com/project-repo/cagebreak/blob/master/LICENSE). +Copyright (c) 2020-2023 The Cagebreak authors +Copyright (c) 2018-2020 Jente Hidskes +Copyright (c) 2019 The Sway authors +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/SECURITY.md b/SECURITY.md index bd7c388..2f33197 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -42,6 +42,7 @@ in `keys/` and sign your message with your own key. * B15B92642760E11FE002DE168708D42451A94AB5 * F8DD9F8DD12B85A28F5827C4678E34D2E753AA3C * 3ACEA46CCECD59E4C8222F791CBEB493681E8693 +* 0A268C188D7949FEB39FD1462F2AD980247E4918 Note that our keys are signed by cagebreak signing keys. @@ -62,7 +63,8 @@ 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. +has (no) attack surface. Please reference the man pages for details but especially +the -e and --bs options. #### Spoofing diff --git a/cagebreak.c b/cagebreak.c index 28e363f..4437331 100644 --- a/cagebreak.c +++ b/cagebreak.c @@ -1,11 +1,12 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #define _DEFAULT_SOURCE #include "config.h" #include +#include #include #include #include @@ -128,17 +129,26 @@ usage(FILE *file, const char *const cage) { " -e\t\t Enable socket\n" " -h\t\t Display this help message\n" " -s\t\t Show information about the current setup and exit\n" - " -v\t\t Show the version number and exit\n", + " -v\t\t Show the version number and exit\n" + " --bs\t\t \"bad security\": Enable features with potential " + "security implications (see man page)\n", cage); } static bool parse_args(struct cg_server *server, int argc, char *argv[], char **config_path) { - int c; + int c, option_index; server->enable_socket = false; - while((c = getopt(argc, argv, "c:hvse")) != -1) { + static struct option long_options[] = {{"bs", no_argument, 0, 0}, + {0, 0, 0, 0}}; +#ifndef __clang_analyzer__ + while((c = getopt_long(argc, argv, "c:hvse", long_options, + &option_index)) != -1) { switch(c) { + case 0: + server->bs = true; + break; case 'h': usage(stdout, argv[0]); return false; @@ -167,6 +177,7 @@ parse_args(struct cg_server *server, int argc, char *argv[], usage(stderr, argv[0]); return false; } +#endif return true; } @@ -197,7 +208,7 @@ set_configuration(struct cg_server *server, if(line == NULL) { wlr_log(WLR_ERROR, "Could not allocate buffer for reading " "configuration file."); - return 1; + return 2; } } if(strlen(line) == 0) { @@ -275,6 +286,7 @@ main(int argc, char *argv[]) { wl_list_init(&server.output_priorities); int ret = 0; + server.bs = 0; char *config_path = NULL; if(!parse_args(&server, argc, argv, &config_path)) { @@ -611,7 +623,7 @@ main(int argc, char *argv[]) { wlr_log_errno(WLR_ERROR, "Unable to set WAYLAND_DISPLAY.", "Clients may not be able to connect"); } else { - fprintf(stderr, + fprintf(stdout, "Cagebreak " CG_VERSION " is running on Wayland display %s\n", socket); } @@ -623,7 +635,7 @@ main(int argc, char *argv[]) { if(show_info) { char *msg = server_show_info(&server); if(msg != NULL) { - fprintf(stderr, "%s", msg); + fprintf(stdout, "%s", msg); free(msg); } else { wlr_log(WLR_ERROR, "Failed to get info on cagebreak setup\n"); @@ -632,27 +644,25 @@ main(int argc, char *argv[]) { } { // config_file should only be visible as long as it is valid + int conf_ret = 1; char *config_file = get_config_file(config_path); if(config_file == NULL) { wlr_log(WLR_ERROR, "Unable to get path to config file"); ret = 1; goto end; - } - int conf_ret = set_configuration(&server, config_file); - - // Configurtion file not found - if(conf_ret != 0) { - if(config_file == NULL) { - char *default_conf = "/etc/xdg/cagebreak/config"; - wlr_log(WLR_INFO, "Loading default configuration file: \"%s\"", - default_conf); - conf_ret = set_configuration(&server, default_conf); - } else { - conf_ret = 1; - } + } else { + conf_ret = set_configuration(&server, config_file); + free(config_file); + } + + // Configuration file not found + if(conf_ret == 1) { + char *default_conf = "/etc/xdg/cagebreak/config"; + wlr_log(WLR_INFO, "Loading default configuration file: \"%s\"", + default_conf); + conf_ret = set_configuration(&server, default_conf); } - free(config_file); if(conf_ret != 0 || !server.running) { ret = 1; goto end; diff --git a/config.h.in b/config.h.in index a79a80c..35dd0a6 100644 --- a/config.h.in +++ b/config.h.in @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #ifndef CG_CONFIG_H #define CG_CONFIG_H diff --git a/example_scripts/cb_script_header.sh b/example_scripts/cb_script_header.sh index 9533beb..770f075 100644 --- a/example_scripts/cb_script_header.sh +++ b/example_scripts/cb_script_header.sh @@ -1,6 +1,6 @@ #!/bin/bash # Copyright 2023, project-repo and the cagebreak contributors -# SPDX -License-Identifier: MIT +# SPDX-License-Identifier: MIT named_pipe_send="$(mktemp -u)" named_pipe_recv="$(mktemp -u)" diff --git a/example_scripts/focus_follows_cursor.sh b/example_scripts/focus_follows_cursor.sh index 79e2889..e47bf88 100644 --- a/example_scripts/focus_follows_cursor.sh +++ b/example_scripts/focus_follows_cursor.sh @@ -1,6 +1,6 @@ #!/bin/bash # Copyright 2023, project-repo and the cagebreak contributors -# SPDX -License-Identifier: MIT +# 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 diff --git a/example_scripts/show_workspace_views.sh b/example_scripts/show_workspace_views.sh index 3be9cbb..be6f0f9 100644 --- a/example_scripts/show_workspace_views.sh +++ b/example_scripts/show_workspace_views.sh @@ -1,6 +1,6 @@ #!/bin/bash # Copyright 2020 - 2023, project-repo and the cagebreak contributors -# SPDX -License-Identifier: MIT +# SPDX-License-Identifier: MIT # This script displays the process names of the views on the current workspace. @@ -19,6 +19,7 @@ do curr_workspace="$(echo "${event}"|jq -r ".outputs.${curr_output}.curr_workspace")" # Print the process names of the view on the current workspace. jq retrieves # their PID and ps is then used to retrieve the process names. + # shellcheck disable=2046 (echo -n "message ";ps -o comm=Command -p $(echo "${event}"|jq -r ".outputs.${curr_output}.workspaces[$((curr_workspace-1))].views[].pid")|tail +2|sed ':a; N; $!ba; s/\n/||/g') >&3 break fi diff --git a/examples/config b/examples/config index d79a792..6708e42 100644 --- a/examples/config +++ b/examples/config @@ -1,5 +1,5 @@ # Copyright 2020 - 2023, project-repo and the cagebreak contributors -# SPDX -License-Identifier: MIT +# SPDX-License-Identifier: MIT ###################### # General settings an key bindings ###################### diff --git a/fuzz/execl_override.c b/fuzz/execl_override.c index 9fc9e6e..275d4f0 100644 --- a/fuzz/execl_override.c +++ b/fuzz/execl_override.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT // This file is used by the fuzzer in order to prevent executing shell commands. #define _GNU_SOURCE @@ -10,7 +10,7 @@ #include int -fork() { +fork(void) { return 1; } diff --git a/fuzz/fuzz-lib.c b/fuzz/fuzz-lib.c index c159538..d331880 100644 --- a/fuzz/fuzz-lib.c +++ b/fuzz/fuzz-lib.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200812L @@ -88,7 +88,7 @@ drop_permissions(void) { } void -cleanup() { +cleanup(void) { server.running = false; #if CG_HAS_XWAYLAND if(xwayland != NULL) { @@ -251,7 +251,7 @@ LLVMFuzzerInitialize(int *argc, char ***argv) { wlr_renderer_init_wl_display(server.renderer, server.wl_display); - server.bg_color = (float[4]){0, 0, 0, 1}; + server.bg_color = calloc(4, sizeof(float *)); server.output_layout = wlr_output_layout_create(); if(!server.output_layout) { wlr_log(WLR_ERROR, "Unable to create output layout"); diff --git a/fuzz/fuzz-lib.h b/fuzz/fuzz-lib.h index 950f455..46aefd2 100644 --- a/fuzz/fuzz-lib.h +++ b/fuzz/fuzz-lib.h @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #ifndef CG_FUZZ_LIB_H #define CG_FUZZ_LIB_H @@ -21,7 +21,7 @@ extern struct wlr_xcursor_manager *xcursor_manager; #endif void -cleanup(); +cleanup(void); int LLVMFuzzerInitialize(int *argc, char ***argv); diff --git a/fuzz/fuzz-parse.c b/fuzz/fuzz-parse.c index 0fc060c..d0bd5ab 100644 --- a/fuzz/fuzz-parse.c +++ b/fuzz/fuzz-parse.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200812L @@ -29,8 +29,7 @@ int set_configuration(struct cg_server *server, char *content) { char *line; - for(unsigned int line_num = 1; - (line = strtok_r(NULL, "\n", &content)) != NULL; ++line_num) { + while((line = strtok_r(NULL, "\n", &content)) != NULL) { line[strcspn(line, "\n")] = '\0'; if(*line != '\0' && *line != '#') { char *errstr = NULL; diff --git a/fuzz/meson.build b/fuzz/meson.build deleted file mode 100644 index 01fdd3e..0000000 --- a/fuzz/meson.build +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2020 - 2023, project-repo and the cagebreak contributors -# SPDX -License-Identifier: MIT - -fuzz_sources = [ - 'fuzz-parse.c', - 'fuzz-lib.c', - ] - -fuzz_headers = [ - '../parse.h', - 'fuzz-lib.h', - ] - -inc = include_directories(['..','../build/']) - -fuzz_dependencies = cagebreak_dependencies -if fuzzing_engine.found() - fuzz_dependencies += fuzzing_engine -else - link_args = [ '-fsanitize=fuzzer', ] -endif - -override_lib = shared_library('execl_override', - [ 'execl_override.c' ], - dependencies: [ cairo,pango,pangocairo ], - install: false - ) - -executable( - 'fuzz-parse', - fuzz_sources + fuzz_headers + cagebreak_headers + cagebreak_sources, - dependencies: fuzz_dependencies, - install: false, - include_directories: inc, - link_args: link_args + fuzz_link_args, - c_args: fuzz_compile_args, - link_with: override_lib, - ) diff --git a/idle_inhibit_v1.c b/idle_inhibit_v1.c index 9bc3f7a..b4f91f9 100644 --- a/idle_inhibit_v1.c +++ b/idle_inhibit_v1.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #include #include diff --git a/idle_inhibit_v1.h b/idle_inhibit_v1.h index f0dce64..74ae956 100644 --- a/idle_inhibit_v1.h +++ b/idle_inhibit_v1.h @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #ifndef CG_IDLE_INHIBIT_H #define CG_IDLE_INHIBIT_H diff --git a/input.h b/input.h index f7877c5..f45e735 100644 --- a/input.h +++ b/input.h @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #ifndef _CG_INPUT_H #define _CG_INPUT_H diff --git a/input_manager.c b/input_manager.c index 83cb966..cfde2c9 100644 --- a/input_manager.c +++ b/input_manager.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200812L diff --git a/input_manager.h b/input_manager.h index 86dcf2e..b3eb006 100644 --- a/input_manager.h +++ b/input_manager.h @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #ifndef CG_INPUT_MANAGER_H #define CG_INPUT_MANAGER_H diff --git a/ipc_server.c b/ipc_server.c index c28979d..ced183a 100644 --- a/ipc_server.c +++ b/ipc_server.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #define _DEFAULT_SOURCE diff --git a/ipc_server.h b/ipc_server.h index 2c66b83..41d7b88 100644 --- a/ipc_server.h +++ b/ipc_server.h @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #ifndef CG_IPC_SERVER_H #define CG_IPC_SERVER_H diff --git a/keybinding.c b/keybinding.c index c2f29bb..44ccffb 100644 --- a/keybinding.c +++ b/keybinding.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200809L @@ -699,19 +699,20 @@ keybinding_cycle_views(struct cg_server *server, bool reverse, bool ipc) { seat_set_focus(server->seat, next_view); if(ipc) { + int curr_id = -1; + int curr_pid = -1; + if(current_view != NULL && + current_view->link.next != curr_workspace->views.next) { + curr_id = current_view->id; + curr_pid = current_view->impl->get_pid(current_view); + } ipc_send_event( curr_workspace->output->server, "{\"event_name\":\"cycle_views\",\"old_view_id\":%d,\"old_view_" "pid\":%d," "\"new_view_id\":%d,\"new_view_pid\":%d,\"tile_id\":%d," "\"workspace\":%d,\"output\":\"%s\",\"output_id\":%d}", - current_view->link.next == curr_workspace->views.next - ? -1 - : (int)current_view->id, - current_view->link.next == curr_workspace->views.next - ? -1 - : (int)current_view->impl->get_pid(current_view), - next_view == NULL ? -1 : (int)next_view->id, + 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, @@ -867,10 +868,15 @@ print_view(struct cg_view *view) { struct dyn_str outp_str; outp_str.len = 0; outp_str.cur_pos = 0; - uint32_t nmemb = 4; + uint32_t nmemb = 5; outp_str.str_arr = calloc(nmemb, sizeof(char *)); print_str(&outp_str, "\"id\": %d,\n", view->id); print_str(&outp_str, "\"pid\": %d,\n", view->impl->get_pid(view)); + if(view->server->bs == true) { + char *title_str = view->impl->get_title(view); + print_str(&outp_str, "\"title\": \"%s\",\n", + title_str == NULL ? "" : title_str); + } print_str(&outp_str, "\"coords\": {\"x\":%d,\"y\":%d},\n", view->ox, view->oy); #if CG_HAS_XWAYLAND @@ -1180,8 +1186,16 @@ keybinding_dump(struct cg_server *server) { print_str(&str, "\"nws\":%d,\n", server->nws); print_str(&str, "\"bg_color\":[%f,%f,%f],\n", server->bg_color[0], server->bg_color[1], server->bg_color[2]); - print_str(&str, "\"views_curr_id\":%d,\n", server->views_curr_id); - print_str(&str, "\"tiles_curr_id\":%d,\n", server->tiles_curr_id); + struct cg_view *focused_view = seat_get_focus(server->seat); + int curr_view_id = -1, curr_tile_id = -1; + if(focused_view != NULL) { + curr_view_id = focused_view->id; + if(focused_view->tile != NULL) { + curr_tile_id = focused_view->tile->id; + } + } + 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, "\"default_mode\":\"%s\",\n", @@ -1784,9 +1798,6 @@ run_action(enum keybinding_action action, struct cg_server *server, server->curr_output->workspaces[server->curr_output->curr_workspace] ->focused_tile->view); break; - case KEYBINDING_FOCUS_TILE: - keybinding_focus_tile(server, data.u); - break; default: { wlr_log(WLR_ERROR, "run_action was called with a value not present in \"enum " diff --git a/keybinding.h b/keybinding.h index c11de23..6d6cf87 100644 --- a/keybinding.h +++ b/keybinding.h @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #ifndef KEYBINDING_H @@ -74,7 +74,6 @@ struct cg_server; KEYBINDING(KEYBINDING_FOCUS_RIGHT, focusright) \ KEYBINDING(KEYBINDING_FOCUS_TOP, focusup) \ KEYBINDING(KEYBINDING_FOCUS_BOTTOM, focusdown) \ - KEYBINDING(KEYBINDING_FOCUS_TILE, focus_tile) \ \ KEYBINDING(KEYBINDING_DEFINEKEY, \ definekey) /* data.kb is the keybinding definition */ \ diff --git a/keys/cagebreak@project-repo.co.pub b/keys/cagebreak@project-repo.co.pub index c266665..648618b 100644 --- a/keys/cagebreak@project-repo.co.pub +++ b/keys/cagebreak@project-repo.co.pub @@ -1,76 +1,87 @@ -----BEGIN PGP PUBLIC KEY BLOCK----- -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 -PbvoKi4FeWdszeakeWuqdmKEi/+ltIk= -=uqsg +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 +=bl5A -----END PGP PUBLIC KEY BLOCK----- diff --git a/keys/cagebreak@project-repo.co.pub-legacy-3 b/keys/cagebreak@project-repo.co.pub-legacy-3 new file mode 100644 index 0000000..c266665 --- /dev/null +++ b/keys/cagebreak@project-repo.co.pub-legacy-3 @@ -0,0 +1,76 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +PbvoKi4FeWdszeakeWuqdmKEi/+ltIk= +=uqsg +-----END PGP PUBLIC KEY BLOCK----- diff --git a/keys/cagebreak_signing_key_11@project-repo.co.pub b/keys/cagebreak_signing_key_11@project-repo.co.pub new file mode 100644 index 0000000..e9e5720 --- /dev/null +++ b/keys/cagebreak_signing_key_11@project-repo.co.pub @@ -0,0 +1,64 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=aQvd +-----END PGP PUBLIC KEY BLOCK----- diff --git a/keys/cagebreak_signing_key_12@project-repo.co.pub b/keys/cagebreak_signing_key_12@project-repo.co.pub new file mode 100644 index 0000000..e8a379f --- /dev/null +++ b/keys/cagebreak_signing_key_12@project-repo.co.pub @@ -0,0 +1,64 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBGQh0kgBEACgIuQwdUwT/Xmve66M9euA2EzcYIXum+XXlbozt6z+bX0ARa5r +21iCcvCHmxi1L282bxdv6xybe1b1ulXRnWF5guODs6ePki541FRO+UaOmM3lKEVz +yoBAvfCxFVM89I4t9KJhoYpPZLGTt1hHI50aXpAiUhKLX3YL6UnI9hgiHK45fQMO +4Ad4vy/REfk76kTjK8tGf+85TkNmcjcTK6DWewIDkXUpCHc90FQEu922uVqHT9tr +xd54J6ir2dzXNs0Z4lznGqxLiGdZNxU/1GZVQDNLuqEhm+fqvZTeuq7H7CqBjq7i +/x+96clZPvTSjqg2Arzq7Qc6IQZoJpSDuNIH2is7d7kESoPK3QhNz8xkRl+YOBDA +JlY3gzSwAYssollj1S8W9tbL1K01lEUPzmA48rST4x1gVfOsKVaZ3DZWR7LfEiym +JSrsD/XgEv2B79HyvGGu3FSVZqqMZHU1gLOXnJzH8g9mjD6iGDGe0DgouP2E9Jxg +dqgscwgNSYdeRcrS/EWlWWlqmWhA91wcmggBVbMw8H65TXLJ3it+PMEPv9biiE24 +xS/TL/d28iCgHBv1yvNNigRYOAUahyqHCMZz2WanaqN1mhaIg0EnaHXW3Ku8o3zg +QS0DKhwAA+9X711oD6AiECApofeiQCh3rcu7TeOQwVIsRaMCmYUTFPggkwARAQAB +tENDYWdlYnJlYWsgU2lnbmluZyBLZXkgMTIgPGNhZ2VicmVha19zaWduaW5nX2tl +eV8xMkBwcm9qZWN0LXJlcG8uY28+iQJUBBMBCAA+FiEEWusaLrDRP2fjBqxZ3AzI +G+AG/YUFAmQh0kgCGwMFCQHhM4AFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQ +3AzIG+AG/YUkvw/8DWVf0moqByk7Jb/31ndJiTAhWAns8MjA1+OJ4EwlUV7d5TfG +q4YEuB9HHXzig8iH03yN4N7i/hNWBku+2OZWqUaocpGMARfyyr+QsKgTsK6OIZrI +jUMFxk/J0/yS223n+i0n3E5B0dSnEcJ3irHUNBQq91R+Atsxk5RmzIHI6JD7jeFM +hFskbJsogS1UUY0NCgCrOFjZlhgOLkQlUfF5KBra9/1CUeuU1iuZS5xTE1JQe8aP +lgtfXABW9vkjoeRVFuGBRV9y9jMEWH0kw3/1Q+gmKsH5jX77bG0HjL3VKtEJEChh +e1HkGHYeWizWo8LFXMDf08hOqJI2UOprfKwKc2Wi7MbI/SDDpQ3QJAZN7tAmo3aS +KeeGLZxvtd1sbeU4I+WnI7LCghEa3yVwfGNjjL0gIWbn02LdMugicDSl38Xc+rXR +jJX5fZxBR6NsnoiRAj4MKrD6923hTv3d1Oa8Fijb9FPXP7cpj6s/HVrMMnzPURkN +T6zEcRNrKN/SllsNN+QWpQ0Kq+4I2tYlz3Wk9REmc6y8w55OkwQ1sQ8JHqmOBAwN +8xWq7CunpolCsPN488TczGiuTZ239eazMV7YpAVn5ntVKuASpWjjUNu/8AnHpAaF +00L1JGVS66psKlyhbGSTOh8o5S5Evs//CJdRG16pu/LaDsL+SM/DE6sqr5+JAjME +EAEIAB0WIQS+Le03Ioe8TrIhPhOgx0OEimOJVQUCZCHenQAKCRCgx0OEimOJVRTC +D/9ATvtCUYEys79KQkiPh7uRlayvF2nC4J7cRsLWSbawr6EoTp627wFVOYkt9ZzP +LHQDULuknSKg8FnjcHa1KFDma/+cC7x8vcBF/O/CQHZ2q5zAKX9aw7oGIhP/u/x5 +ZX+DpekYpg0MAGZFnQy5Ced2Lk8jJ6A5ObfI0ETmz4X1/oDdSFcizF3+bQN1BEue +7pIMR88x0BN7q/28f6RLPYkIRKZ9JBxT2sgrhBzBNWOmW6zSnvGBw6BWzV1KFeuN +Px+w+D1MIhWrz6M48onF+4PWyxZq6JGsIEb7PquihuSNfInCJ2myfQIN8FsM6JZv +EPdNbrbA2WcP1rIVAD5z59gn5CCtRTUSFgHG5sp4sNoCTN0H2qyzYw2MHakOSvxx +lKtD0eynfoPZXyD9rUi8alv/pLcNaBNVmnvard27152qZ3xP4YNbXVpGVpNn1On/ +sEvRoPg5Vt4FRHO9pvClBueXiEsU7Z9zNHyWXwaotA0RXJE7q19pBnT7uxlPypws +H7tAGsPm6IzV2VeJol8U5yMU6K7imsIryhx5ZtNqYadLEjiNjbMK4NYeoMB0xb8V +/3hFck0f+k5aJZ8g/kZUcQ7uRZEwdc5TrBCmwHn0QFEGg7ZUtlLxEJLfEtYVn0N+ +zjjD3bwH/q3ZdoeqsJjw0fJEJF/mbV0CEelNojJbEFbOJLkCDQRkIdJIARAArnud +0MHEFLPm1zWCm5DQB415qi10P6ac2qs8e7NbMTOG4h4O7gztQN+kAJ+SXsm7G26l +ne80VaU0NoOXqxJRRwy1WrjcQsGe06Ilt4kNyLJ6s2OXUCZJKUuQCq3GVlTqpOzf +s6GZttS/qUjXp97ZCxByFvBBcZqXZYvEqZWqfR2iKUgn7xTG7UrAe6qqdSx9TIpF +6d4fbmgOSrafkmrQMN6p8/KC4q1+9KLbw0Qp+QDDRowG1bbYwiQWDjfJCvdStjL7 +T/bppbM3csZ8XEd1YC5aNpdqEGAAvgK9inaVz1PMZFBtJ5OmkL5nApIGdHOKJdeK +2/0qw/uL9oYBrtzQzLx8cj76zfPYAidy8ptFzKUTDzcZF7fUWqntb6UZVCRyzv25 +HWK6OJzAMLgf1cKwaDTA2iPAsVp9kPtv7DcxPQyc6K+TjfaY78gASwB4lWFFzXl6 +ATpftvyzEo25YAn0bDU3b6VI9YtmEEF+ikIAVoLC1xSqbDb7eNX4CKMmk1DhWtxM +BrJmJlljFwr9xvCGdxK2jGTRILeMHJrDBuWNGewiqoE1zpA22RhleMTdPKCLz6Eh +zk5w2bF43wsT9IjcpRBUE2PJqCrwLAhS0elMUzlJ22X6a/L4et7S8Kf7wPBpC69F +QKhPD6//BTSkfdpffYehOfZtBRkE5qu9jvzp63sAEQEAAYkCPAQYAQgAJhYhBFrr +Gi6w0T9n4wasWdwMyBvgBv2FBQJkIdJIAhsMBQkB4TOAAAoJENwMyBvgBv2F+YsP +/jtHYJtxefGeDRfDDfc5aX4EiDA1ED6hWP9v231Go505BJJF8dT/KuE46gqY5HqN +xw5sv7RjidpUnarClHn3uczJRGPdYcPoFGJXn9Jw0RrJyr03BKerbVNvHTrsd7pK +Vy2KZyLeASCCCGG6uvUMCQ+FpU9yRNMcuW+oLwkLwpCyRf7HHQ3XjttRNTVBEhCh +S04G6V1RQX140t4bf4FSkwX/EKxUBVE5rKZpe5O5L2EcBfzX9LJkxvW3i/vb61zo +fAir6H8fY+iZ5o3LInBbV7b6JAC3RVDnrh9zrwpLRH2f3SLdctJrI+IL1IJ9HdsD +wmLK9j8TWO0H9YgyOZ+YsQjxbmk2zgC2Spcw1uUkRWAgMLhf8tpp6feTFD1Y7H0f +jpH5sfPD1z3TgBEEZ/njWYga98OsvRUM1P/tdEbt2eZrq6vmxbUTUWwNNOYX/WI4 +UQ94m97zmewS8tAl5ukESyNeeTzWRxQlhMNy7kVf0Pj6SWjeAZGf4tss9t7pGpcI +ErSdvDz3ocxUNvwLQn0ilAKzjd3Fox/6l5p2XedTYP4zaHdW6STr4/cmBiFs72sV +YqfWqWg4LeGhTBbnWdEdSZ9JuWOJBTUnV27pXVnD7DRJb1tmupPTthWxKVpz1lP2 +4zO0pQvEk/nLhLJ670bplwX/m6ORBBt128I6Sbc797XZ +=ZVRm +-----END PGP PUBLIC KEY BLOCK----- diff --git a/libinput.c b/libinput.c index dcb9d1f..e980060 100644 --- a/libinput.c +++ b/libinput.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #include "input.h" #include "input_manager.h" diff --git a/man/cagebreak-config.5.md b/man/cagebreak-config.5.md index 9fa63e3..1c65b78 100644 --- a/man/cagebreak-config.5.md +++ b/man/cagebreak-config.5.md @@ -1,4 +1,4 @@ -cagebreak-config(5) "Version 2.0.1" "Cagebreak Manual" +cagebreak-config(5) "Version 2.1.0" "Cagebreak Manual" # NAME @@ -420,6 +420,7 @@ GPG Fingerprints: - B15B92642760E11FE002DE168708D42451A94AB5 - F8DD9F8DD12B85A28F5827C4678E34D2E753AA3C - 3ACEA46CCECD59E4C8222F791CBEB493681E8693 +- 0A268C188D7949FEB39FD1462F2AD980247E4918 # LICENSE diff --git a/man/cagebreak-socket.7.md b/man/cagebreak-socket.7.md index 66dd156..b8e8d9c 100644 --- a/man/cagebreak-socket.7.md +++ b/man/cagebreak-socket.7.md @@ -1,4 +1,4 @@ -cagebreak-socket(7) "Version 2.0.1" "Cagebreak Manual" +cagebreak-socket(7) "Version 2.1.0" "Cagebreak Manual" # NAME @@ -582,6 +582,7 @@ GPG Fingerprints: - B15B92642760E11FE002DE168708D42451A94AB5 - F8DD9F8DD12B85A28F5827C4678E34D2E753AA3C - 3ACEA46CCECD59E4C8222F791CBEB493681E8693 +- 0A268C188D7949FEB39FD1462F2AD980247E4918 # LICENSE diff --git a/man/cagebreak.1.md b/man/cagebreak.1.md index e05ae29..b3fd209 100644 --- a/man/cagebreak.1.md +++ b/man/cagebreak.1.md @@ -1,4 +1,4 @@ -cagebreak(1) "Version 2.0.1" "Cagebreak Manual" +cagebreak(1) "Version 2.1.0" "Cagebreak Manual" # NAME @@ -47,6 +47,12 @@ are displayed in a message box at the top right of the screen. *-v* Show version number and exit +*--bs* + "bad security". Enable features with potential security implications. + Currently, this option has the following effects (possible implications + in parentheses): + - Print view titles in `dump` output (an attacker may be able to read sensitive information contained in the view title). + # ENVIRONMENT *CAGEBREAK_SOCKET* @@ -84,6 +90,7 @@ GPG Fingerprints: - B15B92642760E11FE002DE168708D42451A94AB5 - F8DD9F8DD12B85A28F5827C4678E34D2E753AA3C - 3ACEA46CCECD59E4C8222F791CBEB493681E8693 +- 0A268C188D7949FEB39FD1462F2AD980247E4918 # LICENSE diff --git a/meson.build b/meson.build index 29dbcd1..f9708e7 100644 --- a/meson.build +++ b/meson.build @@ -1,9 +1,9 @@ # Copyright 2020 - 2023, project-repo and the cagebreak contributors -# SPDX -License-Identifier: MIT +# SPDX-License-Identifier: MIT project( 'cagebreak', 'c', -version : '2.0.1', +version : '2.1.0', license : 'MIT', default_options : ['c_std=c11', 'warning_level=3'] ) @@ -204,15 +204,15 @@ reproducible_build_versions = { 'wayland_server': '1.19.0', 'wayland_client': '1.21.0', 'wayland_cursor': '1.21.0', - 'wlroots': '0.16.1', + 'wlroots': '0.16.2', 'xkbcommon': '1.5.0', - 'fontconfig': '2.14.1', - 'libinput': '1.22.0', + 'fontconfig': '2.14.2', + 'libinput': '1.23.0', 'libevdev': '1.13.0', - 'libudev': '252', - 'pango': '1.50.12', - 'cairo': '1.17.6', - 'pangocairo': '1.50.12', + 'libudev': '253', + 'pango': '1.50.14', + 'cairo': '1.17.8', + 'pangocairo': '1.50.14', 'math': '-1' } @@ -238,7 +238,7 @@ foreach name, dep : cagebreak_dependencies_dict endforeach reproducible_build_compiler = 'gcc' -reproducible_build_compiler_version = '12.2.0' +reproducible_build_compiler_version = '12.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 + ').') @@ -256,10 +256,11 @@ executable( ) install_data('examples/config', install_dir : '/etc/xdg/cagebreak') +install_data('LICENSE', install_dir : '/usr/share/licenses/' + meson.project_name() + '/') if get_option('man-pages') scdoc = find_program('scdoc') - secssinceepoch = 1673282376 + secssinceepoch = 1680540192 shcommand = 'export SOURCE_DATE_EPOCH=' + secssinceepoch.to_string() + ' ; @0@ < @INPUT@'.format(scdoc.path()) sh = find_program('sh') mandir1 = join_paths(get_option('mandir'), 'man1') @@ -294,8 +295,44 @@ if get_option('man-pages') ) endif +fuzz_sources = [ + 'fuzz/fuzz-parse.c', + 'fuzz/fuzz-lib.c', + ] + +fuzz_headers = [ + 'parse.h', + 'fuzz/fuzz-lib.h', + ] + +fuzz_override_lib = [ 'fuzz/execl_override.c' ] + if get_option('fuzz') - subdir('fuzz') + inc = include_directories(['.','build/']) + + fuzz_dependencies = cagebreak_dependencies + if fuzzing_engine.found() + fuzz_dependencies += fuzzing_engine + else + link_args = [ '-fsanitize=fuzzer', ] + endif + +override_lib = shared_library('execl_override', + [ fuzz_override_lib ], + dependencies: [ cairo,pango,pangocairo ], + install: false + ) + + executable( + 'fuzz-parse', + fuzz_sources + fuzz_headers + cagebreak_headers + cagebreak_sources, + dependencies: fuzz_dependencies, + install: false, + include_directories: inc, + link_args: link_args + fuzz_link_args, + c_args: fuzz_compile_args, + link_with: override_lib, + ) endif summary = [ @@ -306,3 +343,15 @@ summary = [ '' ] message('\n'.join(summary)) + +# Test Suite + +test('Build without warnings', find_program('test/build-w-o-warnings'), 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('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') diff --git a/meson_options.txt b/meson_options.txt index 6d4a787..b7fc956 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,5 +1,5 @@ # Copyright 2020 - 2023, project-repo and the cagebreak contributors -# SPDX -License-Identifier: MIT +# 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') diff --git a/message.c b/message.c index f0c2c64..74b1d0a 100644 --- a/message.c +++ b/message.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #include #include diff --git a/message.h b/message.h index 25bf692..806307c 100644 --- a/message.h +++ b/message.h @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #ifndef MESSAGE_H diff --git a/output.c b/output.c index a75f532..b8fc627 100644 --- a/output.c +++ b/output.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200809L diff --git a/output.h b/output.h index 0a255df..90cd615 100644 --- a/output.h +++ b/output.h @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #ifndef CG_OUTPUT_H #define CG_OUTPUT_H diff --git a/pango.c b/pango.c index c513f97..3af6f7f 100644 --- a/pango.c +++ b/pango.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #include #include diff --git a/pango.h b/pango.h index 30f2865..53a78cc 100644 --- a/pango.h +++ b/pango.h @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #ifndef _SWAY_PANGO_H #define _SWAY_PANGO_H diff --git a/parse.c b/parse.c index d250439..68767c6 100644 --- a/parse.c +++ b/parse.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200812L @@ -786,23 +786,6 @@ parse_command(struct cg_server *server, struct keybinding *keybinding, keybinding->action = KEYBINDING_SHOW_INFO; } else if(strcmp(action, "close") == 0) { keybinding->action = KEYBINDING_CLOSE_VIEW; - } else if(strcmp(action, "focus_tile") == 0) { - keybinding->action = KEYBINDING_FOCUS_TILE; - char *nws_str = strtok_r(NULL, " ", &saveptr); - if(nws_str == NULL) { - *errstr = log_error( - "Expected argument for \"focus_tile\" action, got none."); - return -1; - } - - long tile_id = strtol(nws_str, NULL, 10); - if(tile_id < 1) { - *errstr = log_error( - "Tile id for focus_tile must be a positive integer. Got %l\n", - tile_id); - return -1; - } - keybinding->data.u = tile_id; } else if(strcmp(action, "focus") == 0) { keybinding->action = KEYBINDING_CYCLE_TILES; keybinding->data.b = false; diff --git a/parse.h b/parse.h index 4e38ea9..2949315 100644 --- a/parse.h +++ b/parse.h @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #ifndef PARSE_H diff --git a/seat.c b/seat.c index a3e09a0..cd085be 100644 --- a/seat.c +++ b/seat.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200812L @@ -214,8 +214,11 @@ handle_command_key_bindings(struct cg_server *server, xkb_keysym_t sym, wlr_scene_buffer_from_node(node)); if(scene_surface != NULL) { surface = scene_surface->surface; + if(surface != NULL) { + wlr_seat_pointer_notify_enter(wlr_seat, surface, sx, + sy); + } } - wlr_seat_pointer_notify_enter(wlr_seat, surface, sx, sy); } } } @@ -701,8 +704,10 @@ process_cursor_motion(struct cg_seat *seat, uint32_t time) { wlr_scene_surface_from_buffer(wlr_scene_buffer_from_node(node)); if(scene_surface != NULL) { surface = scene_surface->surface; + if(surface != NULL) { + wlr_seat_pointer_notify_enter(wlr_seat, surface, sx, sy); + } } - wlr_seat_pointer_notify_enter(wlr_seat, surface, sx, sy); bool focus_changed = wlr_seat->pointer_state.focused_surface != surface; if(!focus_changed && time > 0) { diff --git a/seat.h b/seat.h index e44d808..74f4092 100644 --- a/seat.h +++ b/seat.h @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #ifndef CG_SEAT_H #define CG_SEAT_H diff --git a/server.c b/server.c index 292d0b0..c50f528 100644 --- a/server.c +++ b/server.c @@ -1,11 +1,5 @@ -/* - * Cagebreak: A Wayland tiling compositor. - * - * Copyright (C) 2020-2022 The Cagebreak Authors - * Copyright (C) 2018-2019 Jente Hidskes - * - * See the LICENSE file accompanying this file. - */ +// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200809L diff --git a/server.h b/server.h index 39d26f4..9f6eca6 100644 --- a/server.h +++ b/server.h @@ -1,3 +1,6 @@ +// Copyright 2020 - 2023, project-repo and the cagebreak contributors +// SPDX-License-Identifier: MIT + #ifndef CG_SERVER_H #define CG_SERVER_H @@ -54,6 +57,7 @@ struct cg_server { struct cg_ipc_handle ipc; bool enable_socket; + bool bs; bool running; char **modes; uint16_t nws; diff --git a/signatures/2.0.1-cagebreak-config.5.sig b/signatures/2.0.1-cagebreak-config.5.sig new file mode 100644 index 0000000..c2c27ba Binary files /dev/null and b/signatures/2.0.1-cagebreak-config.5.sig differ diff --git a/signatures/2.0.1-cagebreak-socket.7.sig b/signatures/2.0.1-cagebreak-socket.7.sig new file mode 100644 index 0000000..d7dfe41 Binary files /dev/null and b/signatures/2.0.1-cagebreak-socket.7.sig differ diff --git a/signatures/2.0.1-cagebreak.1.sig b/signatures/2.0.1-cagebreak.1.sig new file mode 100644 index 0000000..02074e9 Binary files /dev/null and b/signatures/2.0.1-cagebreak.1.sig differ diff --git a/signatures/2.0.1-cagebreak.sig b/signatures/2.0.1-cagebreak.sig new file mode 100644 index 0000000..f557280 Binary files /dev/null and b/signatures/2.0.1-cagebreak.sig differ diff --git a/signatures/cagebreak-config.5.sig b/signatures/cagebreak-config.5.sig index c2c27ba..25072cb 100644 Binary files a/signatures/cagebreak-config.5.sig and b/signatures/cagebreak-config.5.sig differ diff --git a/signatures/cagebreak-socket.7.sig b/signatures/cagebreak-socket.7.sig index d7dfe41..67c2e16 100644 Binary files a/signatures/cagebreak-socket.7.sig and b/signatures/cagebreak-socket.7.sig differ diff --git a/signatures/cagebreak.1.sig b/signatures/cagebreak.1.sig index 02074e9..b0c8dc1 100644 Binary files a/signatures/cagebreak.1.sig and b/signatures/cagebreak.1.sig differ diff --git a/signatures/cagebreak.sig b/signatures/cagebreak.sig index f557280..f2f774a 100644 Binary files a/signatures/cagebreak.sig and b/signatures/cagebreak.sig differ diff --git a/test/arguments b/test/arguments new file mode 100644 index 0000000..3112ca4 --- /dev/null +++ b/test/arguments @@ -0,0 +1,63 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +testdir="${MESONCURRENTCONFIGDIR}/_build-arguments/" +mkdir "${testdir}" +mkdir "${testdir}/arguments/" + +readonly helptext="Usage: ./cagebreak [OPTIONS] + + -c Load configuration file from + -e Enable socket + -h Display this help message + -s Show information about the current setup and exit + -v Show the version number and exit + --bs \"bad security\": Enable features with potential security implications (see man page)" + +readonly basicheadless="Cagebreak ${1} is running on Wayland display wayland-.* +Outputs: + \\* HEADLESS-1 +Inputs:" + +RESULT=0 + +# check -c option +## Check without config file +[[ $(2>&1 ./cagebreak -c | head -1 ) = "./cagebreak: option requires an argument -- 'c'" ]] || RESULT=1 +[[ $(2>&1 ./cagebreak -c | tail -n +2 ) = "$helptext" ]] || RESULT=1 +## Check with config file +cp "${MESONCURRENTCONFIGDIR}/test/testing-configurations/-c-config" "${testdir}/arguments/" +sed -i "s|CONFIGPATH|${testdir}\/arguments\/result|g" "${testdir}/arguments/-c-config" +WLR_BACKENDS=headless ./cagebreak -c "${testdir}/arguments/-c-config" +sync +[[ $(cat "${testdir}/arguments/result") = "SUCCESS" ]] || RESULT=1 + +# check -e option +## Check without socket +cp "${MESONCURRENTCONFIGDIR}/test/testing-configurations/config" "${testdir}/arguments" +readonly oldsocket=$CAGEBREAK_SOCKET +sed -i "s|CONFIGPATH|${testdir}\/arguments\/socket|g" "${testdir}/arguments/config" +(WLR_BACKENDS=headless ./cagebreak -c "${testdir}/arguments/config") +sync +[[ $(cat "${testdir}/arguments/socket") = "${oldsocket}" ]] || RESULT=1 +## Check with socket +cp "${MESONCURRENTCONFIGDIR}/test/testing-configurations/config" "${testdir}/arguments" +sed -i "s|CONFIGPATH|$testdir\/arguments\/socket|g" "${testdir}/arguments/config" +(WLR_BACKENDS=headless ./cagebreak -e -c "${testdir}/arguments/config") +sync +[[ ! $(cat "${testdir}/arguments/socket") = "${oldsocket}" ]] || RESULT=1 + +# check -h option +[[ $(./cagebreak -h) = "$helptext" ]] || RESULT=1 + +# check -s option +[[ $(WLR_BACKENDS=headless ./cagebreak -s) =~ ${basicheadless} ]] || RESULT=1 + + +# check -v option +[[ $(./cagebreak -v) = "Cagebreak version $1" ]] || RESULT=1 + +rm -rf "${testdir}" + +exit "${RESULT}" diff --git a/test/build-w-o-warnings b/test/build-w-o-warnings new file mode 100644 index 0000000..3866aff --- /dev/null +++ b/test/build-w-o-warnings @@ -0,0 +1,15 @@ +#! /bin/sh +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +RESULT=0 + +# shellcheck disable=SC2164 +cd "${MESONCURRENTCONFIGDIR}" +echo "Build standard release build" +rm -rf _build-w-o-warnings +meson setup _build-w-o-warnings -Dxwayland=true -Dman-pages=true --buildtype=release --fatal-meson-warnings || RESULT=1 +ninja -C _build-w-o-warnings || RESULT=1 +rm -rf _build-w-o-warnings + +exit "${RESULT}" diff --git a/test/build-w-o-xwayland b/test/build-w-o-xwayland new file mode 100644 index 0000000..6164f6e --- /dev/null +++ b/test/build-w-o-xwayland @@ -0,0 +1,15 @@ +#! /bin/sh +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +RESULT=0 + +# shellcheck disable=2164 +cd "${MESONCURRENTCONFIGDIR}" +echo "Build without xwayland" +rm -rf _build-w-o-xwayland +meson setup _build-w-o-xwayland -Dxwayland=false -Dman-pages=false --buildtype=release --fatal-meson-warnings || RESULT=1 +ninja -C _build-w-o-xwayland || RESULT=1 +rm -rf _build-w-o-xwayland + +exit "${RESULT}" diff --git a/test/clang-format b/test/clang-format new file mode 100644 index 0000000..cf7e553 --- /dev/null +++ b/test/clang-format @@ -0,0 +1,26 @@ +#! /bin/sh +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +readonly declared_deps="${*}" +readonly deps="${declared_deps}" + +RESULT=0 + +set -x + +echo "${MESONCURRENTCONFIGDIR}" + +for file in ${deps} +do + echo "${file}" + if (clang-format -Werror --dry-run "${MESONCURRENTCONFIGDIR}/${file}") + then + echo " [x] clang-format" + else + RESULT=1 + echo " [ ] clang-format" + fi +done + +exit "${RESULT}" diff --git a/test/copyright-license b/test/copyright-license new file mode 100644 index 0000000..4fe517f --- /dev/null +++ b/test/copyright-license @@ -0,0 +1,48 @@ +#! /bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +readonly declared_deps="${*}" +readonly hardcoded_deps="meson_options.txt meson.build" +# shellcheck disable=2155,2164,2046 +readonly test_deps=$(cd "${MESONCURRENTCONFIGDIR}" ; find . -type f | grep test/) +# shellcheck disable=2155,2164,2046 +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=2046,2155 +readonly curryear=$(date +%Y) + +RESULT=0 + +for file in ${deps} +do + echo "${file}" + if (grep -q "Copyright.*${curryear}, project-repo and the cagebreak contributors" "$MESONCURRENTCONFIGDIR/${file}") + then + echo " [x] Copyright Notice" + else + RESULT=1 + echo " [ ] Copyright Notice" + fi + if (grep -q "SPDX-License-Identifier: MIT" "$MESONCURRENTCONFIGDIR/${file}") + then + echo " [x] SPDX-License-Identifier" + else + RESULT=1 + echo " [ ] SPDX-License-Identifier" + fi +done + +[[ "${MESONLICENSE}" = "MIT" ]] || RESULT=1 + +# shellcheck disable=2164 +cd "${MESONCURRENTCONFIGDIR}" + +# shellcheck disable=2046,2002 +[[ $(cat LICENSE) = $( cat README.md | tail -$(wc -l LICENSE)) ]] || RESULT=1 + +[[ "Copyright (c) 2020-${curryear} The Cagebreak authors" = $( head -1 LICENSE) ]] || RESULT=1 + +exit "${RESULT}" diff --git a/test/environment-variables b/test/environment-variables new file mode 100644 index 0000000..f1c9fac --- /dev/null +++ b/test/environment-variables @@ -0,0 +1,39 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +testdir="${MESONCURRENTCONFIGDIR}/_build-envvars" +mkdir "${testdir}" +mkdir "${testdir}/envvars/" +mkdir "${testdir}/cagebreak" + +RESULT=0 + +# CAGEBREAK_SOCKET (duplicate of arguments test) +## Check without socket +cp "${MESONCURRENTCONFIGDIR}/test/testing-configurations/config" "${testdir}/envvars" +readonly oldsocket="${CAGEBREAK_SOCKET}" +sed -i "s|CONFIGPATH|$testdir\/envvars\/socket|g" "${testdir}/envvars/config" +(WLR_BACKENDS=headless ./cagebreak -c "${testdir}/envvars/config") +sync +[[ $(cat "${testdir}/envvars/socket") = "${oldsocket}" ]] || RESULT=1 +## Check with socket +cp "${MESONCURRENTCONFIGDIR}/test/testing-configurations/config" "${testdir}/envvars" +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 + +# XDG_CONFIG_HOME +cp "${MESONCURRENTCONFIGDIR}/test/testing-configurations/env-var-config" "${testdir}/cagebreak/config" +sed -i "s|CONFIGPATH|${testdir}\/cagebreak\/result|g" "${testdir}/cagebreak/config" +XDG_CONFIG_HOME="${testdir}/" WLR_BACKENDS=headless ./cagebreak +sync +[[ $(cat "${testdir}/cagebreak/result") = "SUCCESS" ]] || RESULT=1 + +# The XKB_DEFAULT_* family of variables is not found in the source code +# of Cagebreak but necessary to configure software for use with Cagebreak. + +rm -rf "${testdir}" + +exit "${RESULT}" diff --git a/test/illegal-strings b/test/illegal-strings new file mode 100644 index 0000000..5ae9dc0 --- /dev/null +++ b/test/illegal-strings @@ -0,0 +1,29 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +RESULT=0 + +# shellcheck disable=2164 +cd "${MESONCURRENTCONFIGDIR}" + +# Check that no TODO statements remain in the release directory +if ! grep -Rq "TODO" . +then + echo "[x] TODO" +else + RESULT=1 + echo "[ ] TODO" +fi + +# Check that Cagebreak does not falsely claim to be POSIX compliant +if ! grep -Rq "_POSIX_C_SOURCE" . +then + echo "[x] _POSIX_C_SOURCE" +else + RESULT=1 + echo "[ ] _POSIX_C_SOURCE" +fi + + +exit "${RESULT}" diff --git a/test/scan-build b/test/scan-build new file mode 100644 index 0000000..562fb42 --- /dev/null +++ b/test/scan-build @@ -0,0 +1,14 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +RESULT=0 + +# shellcheck disable=2164 +cd "${MESONCURRENTCONFIGDIR}" +rm -rf _build-scan-build +meson setup _build-scan-build -Dxwayland=true -Dman-pages=true --buildtype=release || RESULT=1 +SCANBUILD="$(pwd)/test/testing-configurations/my-scan-build" ninja -C _build-scan-build scan-build || RESULT=1 +rm -rf _build-scan-build + +exit "${RESULT}" diff --git a/test/shellcheck b/test/shellcheck new file mode 100644 index 0000000..0727178 --- /dev/null +++ b/test/shellcheck @@ -0,0 +1,16 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +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 ./* + +exit "${RESULT}" diff --git a/test/testing-configurations/-c-config b/test/testing-configurations/-c-config new file mode 100644 index 0000000..a769e73 --- /dev/null +++ b/test/testing-configurations/-c-config @@ -0,0 +1,4 @@ +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT +exec (echo "SUCCESS" > CONFIGPATH ) +quit diff --git a/test/testing-configurations/config b/test/testing-configurations/config new file mode 100644 index 0000000..9925aec --- /dev/null +++ b/test/testing-configurations/config @@ -0,0 +1,4 @@ +# Copyright 2023, 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 new file mode 100644 index 0000000..a769e73 --- /dev/null +++ b/test/testing-configurations/env-var-config @@ -0,0 +1,4 @@ +# Copyright 2023, 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 new file mode 100755 index 0000000..526f1dd --- /dev/null +++ b/test/testing-configurations/my-scan-build @@ -0,0 +1,5 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +scan-build --status-bugs "$@" diff --git a/test/versions b/test/versions new file mode 100644 index 0000000..b408c71 --- /dev/null +++ b/test/versions @@ -0,0 +1,42 @@ +#!/bin/bash +# Copyright 2023, project-repo and the cagebreak contributors +# SPDX-License-Identifier: MIT + +readonly newversion="${1}" +# shellcheck disable=2155 +readonly oldversion=$(git describe --match=master --abbrev=0) + +RESULT=0 + +# meson.build version +if [[ $(vercmp "${newversion}" "${oldversion}") -gt 0 ]] +then + echo "[x] meson.build version respects semantic versioning" +else + RESULT=1 + echo "[ ] meson.build version is NOT semantic version" +fi + +# shellcheck disable=2164 +cd "${MESONCURRENTCONFIGDIR}" + +for file in man/* +do + if [[ $(head -1 "${file}" | cut -d ' ' -f 3 | rev | cut -c2- | rev ) = "${newversion}" ]] + then + echo "[x] ${file} version is meson.build version" + else + RESULT=1 + echo "[ ] ${file} version is NOT meson.build version" + fi +done + +if head -3 README.md | tail -1 | grep -q "minversion=${newversion}" +then + echo "[x] README.md repology minversion" +else + RESULT=1 + echo "[ ] README.md repology minversion" +fi + +exit "${RESULT}" diff --git a/util.c b/util.c index 455f306..f8c7a82 100644 --- a/util.c +++ b/util.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #include diff --git a/util.h b/util.h index ef3f532..b509a00 100644 --- a/util.h +++ b/util.h @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #ifndef CG_UTIL_H #define CG_UTIL_H diff --git a/view.c b/view.c index 74c31b8..99e2e7c 100644 --- a/view.c +++ b/view.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200809L diff --git a/view.h b/view.h index 99e3e65..a3b61ed 100644 --- a/view.h +++ b/view.h @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #ifndef CG_VIEW_H #define CG_VIEW_H @@ -39,6 +39,7 @@ struct cg_view { struct cg_view_impl { pid_t (*get_pid)(const struct cg_view *view); + char *(*get_title)(const struct cg_view *view); bool (*is_primary)(const struct cg_view *view); void (*activate)(struct cg_view *view, bool activate); void (*close)(struct cg_view *view); diff --git a/workspace.c b/workspace.c index 1caff0d..3f84c6f 100644 --- a/workspace.c +++ b/workspace.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200809L diff --git a/workspace.h b/workspace.h index e0f2473..b669cec 100644 --- a/workspace.h +++ b/workspace.h @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #ifndef CG_WORKSPACE_H #define CG_WORKSPACE_H diff --git a/xdg_shell.c b/xdg_shell.c index fc251c7..afa3352 100644 --- a/xdg_shell.c +++ b/xdg_shell.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #define _POSIX_C_SOURCE 200809L @@ -110,6 +110,13 @@ get_pid(const struct cg_view *view) { return pid; } +static char * +get_title(const struct cg_view *view) { + const struct cg_xdg_shell_view *xdg_shell_view = + xdg_shell_view_from_const_view(view); + return xdg_shell_view->xdg_surface->toplevel->title; +} + static bool is_primary(const struct cg_view *view) { const struct cg_xdg_shell_view *xdg_shell_view = @@ -208,6 +215,7 @@ handle_xdg_shell_surface_destroy(struct wl_listener *listener, void *_data) { } static const struct cg_view_impl xdg_shell_view_impl = {.get_pid = get_pid, + .get_title = get_title, .is_primary = is_primary, .activate = activate, diff --git a/xdg_shell.h b/xdg_shell.h index e066208..fd80b99 100644 --- a/xdg_shell.h +++ b/xdg_shell.h @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #ifndef CG_XDG_SHELL_H #define CG_XDG_SHELL_H diff --git a/xwayland.c b/xwayland.c index f601a0f..ece9e5a 100644 --- a/xwayland.c +++ b/xwayland.c @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #include "config.h" @@ -46,6 +46,13 @@ get_pid(const struct cg_view *view) { return surf->pid; } +static char * +get_title(const struct cg_view *view) { + const struct cg_xwayland_view *xwayland_view = + xwayland_view_from_const_view(view); + return xwayland_view->xwayland_surface->title; +} + static bool is_primary(const struct cg_view *view) { const struct cg_xwayland_view *xwayland_view = @@ -157,6 +164,7 @@ handle_xwayland_surface_destroy(struct wl_listener *listener, void *_data) { } static const struct cg_view_impl xwayland_view_impl = { + .get_title = get_title, .get_pid = get_pid, .is_primary = is_primary, .activate = activate, diff --git a/xwayland.h b/xwayland.h index cde30c5..71a0b7a 100644 --- a/xwayland.h +++ b/xwayland.h @@ -1,5 +1,5 @@ // Copyright 2020 - 2023, project-repo and the cagebreak contributors -// SPDX -License-Identifier: MIT +// SPDX-License-Identifier: MIT #ifndef CG_XWAYLAND_H #define CG_XWAYLAND_H