Merge branch 'master' into hotfix

This commit is contained in:
project-repo 2023-04-04 14:05:05 +02:00
commit 64dc9e767b
80 changed files with 975 additions and 246 deletions

50
Bugs.md
View file

@ -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.

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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.

View file

@ -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

View file

@ -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 <fontconfig/fontconfig.h>
#include <getopt.h>
#include <pango.h>
#include <pango/pangocairo.h>
#include <signal.h>
@ -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;

View file

@ -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

View file

@ -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)"

View file

@ -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

View file

@ -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

View file

@ -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
######################

View file

@ -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 <wlr/render/wlr_renderer.h>
int
fork() {
fork(void) {
return 1;
}

View file

@ -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");

View file

@ -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);

View file

@ -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;

View file

@ -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,
)

View file

@ -1,5 +1,5 @@
// Copyright 2020 - 2023, project-repo and the cagebreak contributors
// SPDX -License-Identifier: MIT
// SPDX-License-Identifier: MIT
#include <wayland-server-core.h>
#include <wlr/types/wlr_idle.h>

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -1,5 +1,5 @@
// Copyright 2020 - 2023, project-repo and the cagebreak contributors
// SPDX -License-Identifier: MIT
// SPDX-License-Identifier: MIT
#define _DEFAULT_SOURCE

View file

@ -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

View file

@ -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 "

View file

@ -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 */ \

View file

@ -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-----

View file

@ -0,0 +1,76 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
PbvoKi4FeWdszeakeWuqdmKEi/+ltIk=
=uqsg
-----END PGP PUBLIC KEY BLOCK-----

View file

@ -0,0 +1,64 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=aQvd
-----END PGP PUBLIC KEY BLOCK-----

View file

@ -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-----

View file

@ -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"

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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')

View file

@ -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')

View file

@ -1,5 +1,5 @@
// Copyright 2020 - 2023, project-repo and the cagebreak contributors
// SPDX -License-Identifier: MIT
// SPDX-License-Identifier: MIT
#include <cairo/cairo.h>
#include <drm_fourcc.h>

View file

@ -1,5 +1,5 @@
// Copyright 2020 - 2023, project-repo and the cagebreak contributors
// SPDX -License-Identifier: MIT
// SPDX-License-Identifier: MIT
#ifndef MESSAGE_H

View file

@ -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

View file

@ -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

View file

@ -1,5 +1,5 @@
// Copyright 2020 - 2023, project-repo and the cagebreak contributors
// SPDX -License-Identifier: MIT
// SPDX-License-Identifier: MIT
#include <cairo.h>
#include <cairo/cairo.h>

View file

@ -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

19
parse.c
View file

@ -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;

View file

@ -1,5 +1,5 @@
// Copyright 2020 - 2023, project-repo and the cagebreak contributors
// SPDX -License-Identifier: MIT
// SPDX-License-Identifier: MIT
#ifndef PARSE_H

11
seat.c
View file

@ -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) {

2
seat.h
View file

@ -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

View file

@ -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

View file

@ -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;

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

63
test/arguments Normal file
View file

@ -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 <path> Load configuration file from <path>
-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}"

15
test/build-w-o-warnings Normal file
View file

@ -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}"

15
test/build-w-o-xwayland Normal file
View file

@ -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}"

26
test/clang-format Normal file
View file

@ -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}"

48
test/copyright-license Normal file
View file

@ -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}"

View file

@ -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}"

29
test/illegal-strings Normal file
View file

@ -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}"

14
test/scan-build Normal file
View file

@ -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}"

16
test/shellcheck Normal file
View file

@ -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}"

View file

@ -0,0 +1,4 @@
# Copyright 2023, project-repo and the cagebreak contributors
# SPDX-License-Identifier: MIT
exec (echo "SUCCESS" > CONFIGPATH )
quit

View file

@ -0,0 +1,4 @@
# Copyright 2023, project-repo and the cagebreak contributors
# SPDX-License-Identifier: MIT
exec (echo $CAGEBREAK_SOCKET > CONFIGPATH)
quit

View file

@ -0,0 +1,4 @@
# Copyright 2023, project-repo and the cagebreak contributors
# SPDX-License-Identifier: MIT
exec (echo "SUCCESS" > CONFIGPATH )
quit

View file

@ -0,0 +1,5 @@
#!/bin/bash
# Copyright 2023, project-repo and the cagebreak contributors
# SPDX-License-Identifier: MIT
scan-build --status-bugs "$@"

42
test/versions Normal file
View file

@ -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}"

2
util.c
View file

@ -1,5 +1,5 @@
// Copyright 2020 - 2023, project-repo and the cagebreak contributors
// SPDX -License-Identifier: MIT
// SPDX-License-Identifier: MIT
#include <wlr/util/box.h>

2
util.h
View file

@ -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

2
view.c
View file

@ -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

3
view.h
View file

@ -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);

View file

@ -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

View file

@ -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

View file

@ -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,

View file

@ -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

View file

@ -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,

View file

@ -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