diff --git a/Bugs.md b/Bugs.md index 4075383..4536616 100644 --- a/Bugs.md +++ b/Bugs.md @@ -1187,3 +1187,39 @@ being copied to the `status` element of the resultant structure. The script introduced with 2.1.1 `scripts/install-development-environment` had some missing dependencies. This has been resolved and tested with bare arch containers. + +## Issue 62 + + * github issue number: #46 + * Fixed: 2.2.0 + +When the readable flag of the IPC socket was set with 0 readable bytes +available, cagebreak entered an infinite loop which caused high CPU +usage before the first event was sent over the IPC socket. + +## Issue 63 + + * github issue number: N/A + * Fixed: 2.2.0 + +A file path in the environment-variables unit test was wrongly set, +causing this test to fail. + +## Issue 64 + + * github issue number: N/A + * Fixed: 2.2.0 + +Cagebreak did not update the pointer focus when focussing the +background. This means that the first pointer event after focussing the +background was sent to the previously focussed window. + +Steps to reproduce: + + * Open an application and hover the mouse over a clickable area. + * Switch to an empty desktop using a keybinding without moving the + mouse. + * Click the mouse without moving it. + * Observe that the element in the previously focussed window was + clicked. + diff --git a/Changelog.md b/Changelog.md index c33e179..b9f7461 100644 --- a/Changelog.md +++ b/Changelog.md @@ -119,3 +119,10 @@ Changelog: * Add miniscule test suite * Adjust Cagebreak to wlroots 0.16.2 * New GPG Keys + +## Release 2.2.0 + + * Add custom events + * Fix Issue 62 (#46 Github) + * Fix Issue 63 (environment variables test) + * Fix Issue 64 (pointer focus bug) diff --git a/Hashes.md b/Hashes.md index a6ceae1..22a179e 100644 --- a/Hashes.md +++ b/Hashes.md @@ -1,5 +1,25 @@ # Hashes +2.2.0 cagebreak + + * sha 256: 67660297290a18b7822a818d1d43343e4e6f4dc27427ed9099ff803f218aa9b4 + * sha 512: 9837e3901b2b10453db2663f5a3da6ec2393610c82984cbabe1c64a6d575e32b492cd3326a6fbb91faa912d14c58dfd1160168280b66417ce7f7f2306c5a501c + +2.2.0 cagebreak.1 + + * sha 256: 79caf055cb1c75f3751863718728cca5ea6231891d21b4364c877d5e4888e727 + * sha 512: 843e15e51f01ed25d0630eee8b6e12ebcc68934da49d6fb66e86f6a46d512145d9be22081b0c2b5f0356c2d0e15b9f13170f7ba1d34d5fba69c7e05a069db337 + +2.2.0 cagebreak-config.5 + + * sha 256: 7047333f5600d3b05caf04caf9910da1468efe49c1418ca3fcdc6163bade9e89 + * sha 512: 35203d3959594fe5130a561c440bf85a978384bc874fcce773bb02fa5c637ccc375f1b0ce1ad05603266dcdefed2570815363bc2c8ef81df7ff7be865de2cac5 + +2.2.0 cagebreak-socket.7 + + * sha 256: bf9bd35a17ab78cb93f0f5209daef27908bf02d0e31ae627ae05fabab162c984 + * sha 512: 023fb99c3a2c47543ae2870f19e8fd6fd8069834dc4fbeee93e890333b4ac24b4613d0e8dfd2bdffb2d5dc7f907868410b0c61f2e1346c76498955e15d0f3b89 + 2.1.2 cagebreak * sha 256: 7d07864a837ee577a52b2727bfbfe8834fe599712144f0685f458d508717e451 diff --git a/README.md b/README.md index 004239a..8f09d4f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Cagebreak: A Wayland Tiling Compositor -[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.1.2)](https://repology.org/project/cagebreak/versions) +[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/6532/badge)](https://bestpractices.coreinfrastructure.org/projects/6532) [![Packaging status](https://repology.org/badge/tiny-repos/cagebreak.svg)](https://repology.org/project/cagebreak/versions) [![AUR package](https://repology.org/badge/version-for-repo/aur/cagebreak.svg?minversion=2.2.0)](https://repology.org/project/cagebreak/versions) ## Quick Introduction diff --git a/ipc_server.c b/ipc_server.c index ced183a..05614b3 100644 --- a/ipc_server.c +++ b/ipc_server.c @@ -127,10 +127,6 @@ ipc_client_handle_writable(int client_fd, uint32_t mask, void *data) { return 0; } - if(client->write_buffer_len <= 0) { - return 0; - } - if(fcntl(client->fd, F_GETFD) == -1) { return 0; } diff --git a/keybinding.c b/keybinding.c index 44ccffb..eaf2ae7 100644 --- a/keybinding.c +++ b/keybinding.c @@ -96,6 +96,12 @@ keybinding_free(struct keybinding *keybinding, bool recursive) { if(keybinding->data.c != NULL) { free(keybinding->data.c); } + break; + case KEYBINDING_SEND_CUSTOM_EVENT: + if(keybinding->data.c != NULL) { + free(keybinding->data.c); + } + break; default: break; } @@ -1245,6 +1251,12 @@ keybinding_display_message(struct cg_server *server, char *msg) { message_printf(server->curr_output, "%s", msg); } +void +keybinding_send_custom_event(struct cg_server *server, char *msg) { + ipc_send_event(server, + "{\"event_name\":\"custom_event\",\"message\":\"%s\"}", msg); +} + void keybinding_move_view_to_cycle_output(struct cg_server *server, bool reverse) { if(wl_list_length(&server->outputs) <= 1) { @@ -1706,6 +1718,9 @@ run_action(enum keybinding_action action, struct cg_server *server, case KEYBINDING_DISPLAY_MESSAGE: keybinding_display_message(server, data.c); break; + case KEYBINDING_SEND_CUSTOM_EVENT: + keybinding_send_custom_event(server, data.c); + break; case KEYBINDING_RESIZE_TILE_HORIZONTAL: resize_tile(server, data.i, 0); break; diff --git a/keybinding.h b/keybinding.h index 6d6cf87..a5958f0 100644 --- a/keybinding.h +++ b/keybinding.h @@ -63,6 +63,7 @@ struct cg_server; KEYBINDING(KEYBINDING_SHOW_TIME, time) \ KEYBINDING(KEYBINDING_SHOW_INFO, show_info) \ KEYBINDING(KEYBINDING_DISPLAY_MESSAGE, message) \ + KEYBINDING(KEYBINDING_SEND_CUSTOM_EVENT, custom_event) \ KEYBINDING(KEYBINDING_CURSOR, cursor) \ \ KEYBINDING(KEYBINDING_SWAP_LEFT, exchangeleft) \ diff --git a/man/cagebreak-config.5.md b/man/cagebreak-config.5.md index b9632dd..5bf01c3 100644 --- a/man/cagebreak-config.5.md +++ b/man/cagebreak-config.5.md @@ -1,4 +1,4 @@ -cagebreak-config(5) "Version 2.1.2" "Cagebreak Manual" +cagebreak-config(5) "Version 2.2.0" "Cagebreak Manual" # NAME @@ -81,9 +81,17 @@ configure_message display_time 4 *cursor [enable|disable]* Enable or disable cursor + This simply hides the cursor. Pointing and clicking is still possible. +*custom_event * + Send a custom event to the IPC socket + + This sends an event of type "custom_event" to all programs + listening to the IPC socket along with the string . + See *cagebreak-socket(7)* for more details. + *definekey * Bind to execute if pressed in - *definekey* is a more general version of *bind*. diff --git a/man/cagebreak-socket.7.md b/man/cagebreak-socket.7.md index 4c1a31a..2a5b623 100644 --- a/man/cagebreak-socket.7.md +++ b/man/cagebreak-socket.7.md @@ -1,4 +1,4 @@ -cagebreak-socket(7) "Version 2.1.2" "Cagebreak Manual" +cagebreak-socket(7) "Version 2.2.0" "Cagebreak Manual" # NAME @@ -113,6 +113,17 @@ cg-ipc{"event_name":"configure_output","output":"eDP-1","output_id":1} cg-ipc{"event_name":"cursor_switch_tile","old_output":"eDP-1","old_output_id":1,"old_tile":2,"new_output":"eDP-1","new_output_id":1,"new_tile":3} ``` +*custom_event* + - Trigger: Cagebreak receives the *custom_event* command, either in the config file or via the IPC socket (see *cagebreak-config(5)*). + - JSON + - event_name: "custom_event" + - message: The message passed to the *custom_event* command + +``` +custom_event Hello World! +cg-ipc{"event_name":"custom_event","message":"Hello World!"} +``` + *cycle_outputs* - Trigger: *nextscreen* and *prevscreen* commands - JSON diff --git a/man/cagebreak.1.md b/man/cagebreak.1.md index c8fc85e..051c7e9 100644 --- a/man/cagebreak.1.md +++ b/man/cagebreak.1.md @@ -1,4 +1,4 @@ -cagebreak(1) "Version 2.1.2" "Cagebreak Manual" +cagebreak(1) "Version 2.2.0" "Cagebreak Manual" # NAME diff --git a/meson.build b/meson.build index 777c8d3..5d782bb 100644 --- a/meson.build +++ b/meson.build @@ -3,7 +3,7 @@ project( 'cagebreak', 'c', -version : '2.1.2', +version : '2.2.0', license : 'MIT', default_options : ['c_std=c11', 'warning_level=3'] ) @@ -208,7 +208,7 @@ reproducible_build_versions = { 'xkbcommon': '1.5.0', 'fontconfig': '2.14.2', 'libinput': '1.23.0', - 'libevdev': '1.13.0', + 'libevdev': '1.13.1', 'libudev': '253', 'pango': '1.50.14', 'cairo': '1.17.8', @@ -238,7 +238,7 @@ foreach name, dep : cagebreak_dependencies_dict endforeach reproducible_build_compiler = 'gcc' -reproducible_build_compiler_version = '12.2.1' +reproducible_build_compiler_version = '13.1.1' if cc.get_id() != reproducible_build_compiler warning('The compiler "' + cc.get_id() + '" differs from the one used to generate to binary specified in Hashes.md (' + reproducible_build_compiler + ').') @@ -260,7 +260,7 @@ install_data('LICENSE', install_dir : '/usr/share/licenses/' + meson.project_nam if get_option('man-pages') scdoc = find_program('scdoc') - secssinceepoch = 1682363199 + secssinceepoch = 1685543842 shcommand = 'export SOURCE_DATE_EPOCH=' + secssinceepoch.to_string() + ' ; @0@ < @INPUT@'.format(scdoc.path()) sh = find_program('sh') mandir1 = join_paths(get_option('mandir'), 'man1') diff --git a/parse.c b/parse.c index 68767c6..c163b3a 100644 --- a/parse.c +++ b/parse.c @@ -811,6 +811,15 @@ parse_command(struct cg_server *server, struct keybinding *keybinding, return -1; } keybinding->data.c = strdup(saveptr); + } else if(strcmp(action, "custom_event") == 0) { + keybinding->action = KEYBINDING_SEND_CUSTOM_EVENT; + if(saveptr == NULL) { + *errstr = + log_error("Not enough paramaters to \"custom_event\". Expected " + "string to send."); + return -1; + } + keybinding->data.c = strdup(saveptr); } else if(strcmp(action, "time") == 0) { keybinding->action = KEYBINDING_SHOW_TIME; } else if(strcmp(action, "nextscreen") == 0) { diff --git a/release-non-auto-checks/Bugs.md b/release-non-auto-checks/Bugs.md index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/Bugs.md +++ b/release-non-auto-checks/Bugs.md @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/release-non-auto-checks/FAQ.md b/release-non-auto-checks/FAQ.md index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/FAQ.md +++ b/release-non-auto-checks/FAQ.md @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/release-non-auto-checks/SECURITY.md b/release-non-auto-checks/SECURITY.md index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/SECURITY.md +++ b/release-non-auto-checks/SECURITY.md @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/release-non-auto-checks/WLR_XDG_VERSION b/release-non-auto-checks/WLR_XDG_VERSION index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/WLR_XDG_VERSION +++ b/release-non-auto-checks/WLR_XDG_VERSION @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/release-non-auto-checks/changelog-major-minor b/release-non-auto-checks/changelog-major-minor index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/changelog-major-minor +++ b/release-non-auto-checks/changelog-major-minor @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/release-non-auto-checks/internal-wiki b/release-non-auto-checks/internal-wiki index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/internal-wiki +++ b/release-non-auto-checks/internal-wiki @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/release-non-auto-checks/release-note b/release-non-auto-checks/release-note index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/release-note +++ b/release-non-auto-checks/release-note @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/release-non-auto-checks/reproducibility-checked b/release-non-auto-checks/reproducibility-checked index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/reproducibility-checked +++ b/release-non-auto-checks/reproducibility-checked @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/release-non-auto-checks/security-to-man-page-info-transfer b/release-non-auto-checks/security-to-man-page-info-transfer index 5f93ac2..85c0622 100644 --- a/release-non-auto-checks/security-to-man-page-info-transfer +++ b/release-non-auto-checks/security-to-man-page-info-transfer @@ -1,2 +1,2 @@ -2.1.2 -2023-04-24 +2.2.0 +2023-05-31 diff --git a/seat.c b/seat.c index cd085be..1c88f49 100644 --- a/seat.c +++ b/seat.c @@ -1043,6 +1043,7 @@ seat_set_focus(struct cg_seat *seat, struct cg_view *view) { view_activate(prev_view, false); } wlr_seat_keyboard_clear_focus(wlr_seat); + process_cursor_motion(seat, -1); return; } diff --git a/signatures/2.1.2-cagebreak-config.5.sig b/signatures/2.1.2-cagebreak-config.5.sig new file mode 100644 index 0000000..f96713d Binary files /dev/null and b/signatures/2.1.2-cagebreak-config.5.sig differ diff --git a/signatures/2.1.2-cagebreak-socket.7.sig b/signatures/2.1.2-cagebreak-socket.7.sig new file mode 100644 index 0000000..fec631f Binary files /dev/null and b/signatures/2.1.2-cagebreak-socket.7.sig differ diff --git a/signatures/2.1.2-cagebreak.1.sig b/signatures/2.1.2-cagebreak.1.sig new file mode 100644 index 0000000..7894766 Binary files /dev/null and b/signatures/2.1.2-cagebreak.1.sig differ diff --git a/signatures/2.1.2-cagebreak.sig b/signatures/2.1.2-cagebreak.sig new file mode 100644 index 0000000..d729d10 Binary files /dev/null and b/signatures/2.1.2-cagebreak.sig differ diff --git a/signatures/cagebreak-config.5.sig b/signatures/cagebreak-config.5.sig index f96713d..93f0f2b 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 fec631f..6797b53 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 7894766..feaa1b9 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 d729d10..4e3a176 100644 Binary files a/signatures/cagebreak.sig and b/signatures/cagebreak.sig differ diff --git a/test/environment-variables b/test/environment-variables index f1c9fac..a3753b5 100644 --- a/test/environment-variables +++ b/test/environment-variables @@ -22,7 +22,7 @@ cp "${MESONCURRENTCONFIGDIR}/test/testing-configurations/config" "${testdir}/env sed -i "s|CONFIGPATH|$testdir\/envvars\/socket|g" "${testdir}/envvars/config" (WLR_BACKENDS=headless ./cagebreak -e -c "${testdir}/envvars/config") sync -[[ ! $(cat "${testdir}/socket") = "${oldsocket}" ]] || RESULT=1 +[[ $(cat "${testdir}/envvars/socket") != "${oldsocket}" ]] || RESULT=1 # XDG_CONFIG_HOME cp "${MESONCURRENTCONFIGDIR}/test/testing-configurations/env-var-config" "${testdir}/cagebreak/config" diff --git a/workspace.c b/workspace.c index 3f84c6f..1dff244 100644 --- a/workspace.c +++ b/workspace.c @@ -107,6 +107,9 @@ workspace_free_tiles(struct cg_workspace *workspace) { workspace->focused_tile) { workspace->output->server->seat->cursor_tile = NULL; } + if(workspace->focused_tile == workspace->server->seat->cursor_tile) { + workspace->server->seat->cursor_tile = NULL; + } struct cg_tile *next = workspace->focused_tile->next; free(workspace->focused_tile); workspace->focused_tile = next;