Release 2.2.0

- Add custom events
- Fix Issue 62 (#46 Github)
- Fix Issue 63 (environment variables test)
- Fix Issue 64 (pointer focus bug)
This commit is contained in:
project-repo 2023-05-31 21:38:43 +02:00
commit 12380e3fcc
32 changed files with 138 additions and 31 deletions

36
Bugs.md
View file

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

View file

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

View file

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

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

View file

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

View file

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

View file

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

View file

@ -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 <message>*
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 <message>.
See *cagebreak-socket(7)* for more details.
*definekey <mode> <key> <command>*
Bind <key> to execute <command> if pressed in <mode> -
*definekey* is a more general version of *bind*.

View file

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

View file

@ -1,4 +1,4 @@
cagebreak(1) "Version 2.1.2" "Cagebreak Manual"
cagebreak(1) "Version 2.2.0" "Cagebreak Manual"
# NAME

View file

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

View file

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

View file

@ -1,2 +1,2 @@
2.1.2
2023-04-24
2.2.0
2023-05-31

View file

@ -1,2 +1,2 @@
2.1.2
2023-04-24
2.2.0
2023-05-31

View file

@ -1,2 +1,2 @@
2.1.2
2023-04-24
2.2.0
2023-05-31

View file

@ -1,2 +1,2 @@
2.1.2
2023-04-24
2.2.0
2023-05-31

View file

@ -1,2 +1,2 @@
2.1.2
2023-04-24
2.2.0
2023-05-31

View file

@ -1,2 +1,2 @@
2.1.2
2023-04-24
2.2.0
2023-05-31

View file

@ -1,2 +1,2 @@
2.1.2
2023-04-24
2.2.0
2023-05-31

View file

@ -1,2 +1,2 @@
2.1.2
2023-04-24
2.2.0
2023-05-31

View file

@ -1,2 +1,2 @@
2.1.2
2023-04-24
2.2.0
2023-05-31

1
seat.c
View file

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

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.

View file

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

View file

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