From ebcad3604c3c484fe0edaf8f671a3616de45e49c Mon Sep 17 00:00:00 2001 From: Ilia Bozhinov Date: Wed, 17 Feb 2021 08:15:14 +0100 Subject: [PATCH] implement additional states in ext-workspace --- include/wlr/types/wlr_ext_workspace_v1.h | 8 +++ types/wlr_ext_workspace_v1.c | 68 +++++++++++++++++++----- 2 files changed, 62 insertions(+), 14 deletions(-) diff --git a/include/wlr/types/wlr_ext_workspace_v1.h b/include/wlr/types/wlr_ext_workspace_v1.h index 8a01b7e91..b412cae6a 100644 --- a/include/wlr/types/wlr_ext_workspace_v1.h +++ b/include/wlr/types/wlr_ext_workspace_v1.h @@ -57,6 +57,8 @@ struct wlr_ext_workspace_group_handle_v1_output { enum wlr_ext_workspace_handle_v1_state { WLR_EXT_WORKSPACE_HANDLE_V1_STATE_ACTIVE = 1 << 0, + WLR_EXT_WORKSPACE_HANDLE_V1_STATE_URGENT = 1 << 1, + WLR_EXT_WORKSPACE_HANDLE_V1_STATE_HIDDEN = 1 << 2, }; struct wlr_ext_workspace_handle_v1 { @@ -119,4 +121,10 @@ void wlr_ext_workspace_handle_v1_set_coordinates( void wlr_ext_workspace_handle_v1_set_active( struct wlr_ext_workspace_handle_v1 *workspace, bool active); +void wlr_ext_workspace_handle_v1_set_urgent( + struct wlr_ext_workspace_handle_v1 *workspace, bool urgent); + +void wlr_ext_workspace_handle_v1_set_hidden( + struct wlr_ext_workspace_handle_v1 *workspace, bool hidden); + #endif diff --git a/types/wlr_ext_workspace_v1.c b/types/wlr_ext_workspace_v1.c index 90ecbb34d..a5febefec 100644 --- a/types/wlr_ext_workspace_v1.c +++ b/types/wlr_ext_workspace_v1.c @@ -70,14 +70,28 @@ static void workspace_handle_resource_destroy(struct wl_resource *resource) { wl_list_remove(wl_resource_get_link(resource)); } +static bool push_entry_in_array(struct wl_array *array, uint32_t entry) { + uint32_t *index = wl_array_add(array, sizeof(uint32_t)); + if (index == NULL) { + return false; + } + *index = entry; + return true; +} + static bool fill_array_from_workspace_state(struct wl_array *array, uint32_t state) { - if (state & WLR_EXT_WORKSPACE_HANDLE_V1_STATE_ACTIVE) { - uint32_t *index = wl_array_add(array, sizeof(uint32_t)); - if (index == NULL) { - return false; - } - *index = ZEXT_WORKSPACE_HANDLE_V1_STATE_ACTIVE; + if ((state & WLR_EXT_WORKSPACE_HANDLE_V1_STATE_ACTIVE) && + !push_entry_in_array(array, ZEXT_WORKSPACE_HANDLE_V1_STATE_ACTIVE)) { + return false; + } + if ((state & WLR_EXT_WORKSPACE_HANDLE_V1_STATE_URGENT) && + !push_entry_in_array(array, ZEXT_WORKSPACE_HANDLE_V1_STATE_URGENT)) { + return false; + } + if ((state & WLR_EXT_WORKSPACE_HANDLE_V1_STATE_HIDDEN) && + !push_entry_in_array(array, ZEXT_WORKSPACE_HANDLE_V1_STATE_HIDDEN)) { + return false; } return true; @@ -136,14 +150,7 @@ void wlr_ext_workspace_handle_v1_set_coordinates( workspace_manager_update_idle_source(workspace->group->manager); } -void wlr_ext_workspace_handle_v1_set_active( - struct wlr_ext_workspace_handle_v1 *workspace, bool activate) { - if (activate) { - workspace->server_state |= WLR_EXT_WORKSPACE_HANDLE_V1_STATE_ACTIVE; - } else { - workspace->server_state &= ~WLR_EXT_WORKSPACE_HANDLE_V1_STATE_ACTIVE; - } - +static void workspace_send_state(struct wlr_ext_workspace_handle_v1 *workspace) { struct wl_array state; wl_array_init(&state); @@ -166,6 +173,39 @@ void wlr_ext_workspace_handle_v1_set_active( workspace_manager_update_idle_source(workspace->group->manager); } +void wlr_ext_workspace_handle_v1_set_active( + struct wlr_ext_workspace_handle_v1 *workspace, bool activate) { + if (activate) { + workspace->server_state |= WLR_EXT_WORKSPACE_HANDLE_V1_STATE_ACTIVE; + } else { + workspace->server_state &= ~WLR_EXT_WORKSPACE_HANDLE_V1_STATE_ACTIVE; + } + + workspace_send_state(workspace); +} + +void wlr_ext_workspace_handle_v1_set_urgent( + struct wlr_ext_workspace_handle_v1 *workspace, bool urgent) { + if (urgent) { + workspace->server_state |= WLR_EXT_WORKSPACE_HANDLE_V1_STATE_URGENT; + } else { + workspace->server_state &= ~WLR_EXT_WORKSPACE_HANDLE_V1_STATE_URGENT; + } + + workspace_send_state(workspace); +} + +void wlr_ext_workspace_handle_v1_set_hidden( + struct wlr_ext_workspace_handle_v1 *workspace, bool hidden) { + if (hidden) { + workspace->server_state |= WLR_EXT_WORKSPACE_HANDLE_V1_STATE_HIDDEN; + } else { + workspace->server_state &= ~WLR_EXT_WORKSPACE_HANDLE_V1_STATE_HIDDEN; + } + + workspace_send_state(workspace); +} + static struct wl_resource *create_workspace_resource_for_group_resource( struct wlr_ext_workspace_handle_v1 *workspace, struct wl_resource *group_resource) {