diff --git a/include/zdwm/bar.h b/include/zdwm/bar.h index 44a2432..abf673b 100644 --- a/include/zdwm/bar.h +++ b/include/zdwm/bar.h @@ -59,6 +59,15 @@ typedef struct zdwm_bar_cell_api_t { void (*cell_set_indicator)(zdwm_bar_item_t *item, size_t index, bool show); } zdwm_bar_cell_api_t; +typedef struct zdwm_bar_click_params_t { + zdwm_bar_item_t *item; + size_t cell_index; + int32_t x; + zdwm_modifier_mask_t modifiers; + zdwm_button_t button; + void *state; +} zdwm_bar_click_params_t; + typedef struct zdwm_bar_item_type_t { void *(*create_state)(zdwm_output_id_t output_id, void *config); void (*update)( @@ -66,12 +75,7 @@ typedef struct zdwm_bar_item_type_t { const zdwm_bar_cell_api_t *cells, void *state ); - zdwm_action_t (*on_click)( - zdwm_bar_item_t *item, - size_t cell_index, - int32_t x, - void *state - ); + zdwm_action_t (*on_click)(zdwm_bar_click_params_t *params); void (*destroy_state)(void *state); zdwm_bar_item_t *instance; uint32_t update_interval_ms; diff --git a/include/zdwm/types.h b/include/zdwm/types.h index c208fbe..35dab5d 100644 --- a/include/zdwm/types.h +++ b/include/zdwm/types.h @@ -18,6 +18,25 @@ typedef uint32_t zdwm_binding_mode_id_t; #define ZDWM_WORKSPACE_ID_INVALID ((zdwm_workspace_id_t)UINT32_MAX) #define ZDWM_BINDING_MODE_ID_INVALID ((zdwm_binding_mode_id_t)UINT32_MAX) +typedef enum zdwm_button_t { + ZDWM_BUTTON_NONE, + ZDWM_BUTTON_LEFT, + ZDWM_BUTTON_RIGHT, + ZDWM_BUTTON_MIDDLE, +} zdwm_button_t; + +typedef enum zdwm_modifier_bit_t { + ZDWM_MOD_NONE = 0u, + ZDWM_MOD_SHIFT = 1u << 0, + ZDWM_MOD_CONTROL = 1u << 1, + ZDWM_MOD_1 = 1u << 2, + ZDWM_MOD_2 = 1u << 3, + ZDWM_MOD_3 = 1u << 4, + ZDWM_MOD_4 = 1u << 5, + ZDWM_MOD_5 = 1u << 6, +} zdwm_modifier_bit_t; +typedef uint32_t zdwm_modifier_mask_t; + typedef struct zdwm_rect_t { int32_t x; int32_t y; diff --git a/src/bar/bar.c b/src/bar/bar.c index 896cf48..c9f627b 100644 --- a/src/bar/bar.c +++ b/src/bar/bar.c @@ -404,8 +404,12 @@ bool bar_draw(bar_t *bar) { return changed; } -static inline bool -bar_item_click(zdwm_bar_item_t *item, int32_t x, zdwm_action_t *action) { +static inline bool bar_item_click( + zdwm_bar_item_t *item, + bar_click_info_t info, + zdwm_action_t *action +) { + auto x = info.x; if (!(item->region.start <= x && item->region.end >= x)) return false; if (!item->api.on_click) return true; @@ -413,7 +417,15 @@ bar_item_click(zdwm_bar_item_t *item, int32_t x, zdwm_action_t *action) { for (size_t i = 0; i < item->count; ++i) { auto cell = &item->cells[i]; if (cell->region.start <= x && cell->region.end >= x) { - *action = item->api.on_click(item, i, x, item->state); + zdwm_bar_click_params_t params = { + .item = item, + .cell_index = i, + .x = x, + .modifiers = info.modifiers, + .button = info.button, + .state = item->state, + }; + *action = item->api.on_click(¶ms); return true; } } @@ -422,29 +434,24 @@ bar_item_click(zdwm_bar_item_t *item, int32_t x, zdwm_action_t *action) { } static inline bool -bar_side_click(bar_side_t *side, int32_t x, zdwm_action_t *action) { - if (side->region.start > x || side->region.end < x) return false; +bar_side_click(bar_side_t *side, bar_click_info_t info, zdwm_action_t *action) { + if (side->region.start > info.x || side->region.end < info.x) return false; for (size_t i = 0; i < side->count; ++i) { - if (bar_item_click(&side->items[i], x, action)) return true; + if (bar_item_click(&side->items[i], info, action)) return true; } return true; } -bool bar_click( - bar_t *bar, - zdwm_window_id_t window, - int32_t x, - zdwm_action_t *action -) { +bool bar_click(bar_t *bar, bar_click_info_t info, zdwm_action_t *action) { for (size_t i = 0; i < bar->count; ++i) { auto bar_output = &bar->bars[i]; - if (bar_output->window_id != window) continue; + if (bar_output->window_id != info.window) continue; - if (bar_side_click(&bar_output->left, x, action)) return true; - if (bar_item_click(&bar_output->center, x, action)) return true; - if (bar_side_click(&bar_output->right, x, action)) return true; + if (bar_side_click(&bar_output->left, info, action)) return true; + if (bar_item_click(&bar_output->center, info, action)) return true; + if (bar_side_click(&bar_output->right, info, action)) return true; } return false; diff --git a/src/bar/bar.h b/src/bar/bar.h index 3e60e40..3799101 100644 --- a/src/bar/bar.h +++ b/src/bar/bar.h @@ -43,9 +43,11 @@ void bar_init(bar_t *bar, listeners_t *listeners); void bar_cleanup(bar_t *bar); void bar_update(bar_t *bar); bool bar_draw(bar_t *bar); -bool bar_click( - bar_t *bar, - zdwm_window_id_t window, - int32_t x, - zdwm_action_t *action -); + +typedef struct bar_click_info_t { + zdwm_window_id_t window; + int32_t x; + zdwm_modifier_mask_t modifiers; + zdwm_button_t button; +} bar_click_info_t; +bool bar_click(bar_t *bar, bar_click_info_t info, zdwm_action_t *action); diff --git a/src/bar/binding.c b/src/bar/binding.c index 78e93e6..ee5ca5f 100644 --- a/src/bar/binding.c +++ b/src/bar/binding.c @@ -55,12 +55,7 @@ static void bar_binding_update( data->dirty = false; } -static zdwm_action_t bar_binding_on_click( - zdwm_bar_item_t *item, - size_t cell_index, - int32_t x, - void *state -) { +static zdwm_action_t bar_binding_on_click(zdwm_bar_click_params_t *params) { return (zdwm_action_t){ .type = ZDWM_ACTION_BINDING_MODE_CYCLE, .as.binding_mode_cycle = {.delta = 1}, diff --git a/src/bar/workspaces.c b/src/bar/workspaces.c index 47f310e..c83b52b 100644 --- a/src/bar/workspaces.c +++ b/src/bar/workspaces.c @@ -143,13 +143,10 @@ static void bar_workspaces_update( data->dirty = false; } -static zdwm_action_t bar_workspace_on_click( - zdwm_bar_item_t *item, - size_t cell_index, - int32_t x, - void *state -) { - auto data = (bar_workspace_state_t *)state; +static zdwm_action_t bar_workspace_on_click(zdwm_bar_click_params_t *params) { + auto cell_index = params->cell_index; + auto data = (bar_workspace_state_t *)params->state; + if (cell_index == data->count) { return (zdwm_action_t){ .type = ZDWM_ACTION_LAYOUT_CYCLE, diff --git a/src/core/types.h b/src/core/types.h index 5418261..1714e54 100644 --- a/src/core/types.h +++ b/src/core/types.h @@ -17,9 +17,12 @@ typedef zdwm_output_info_t output_info_t; typedef zdwm_rule_match_t rule_match_t; typedef zdwm_rule_action_t rule_action_t; + +typedef enum zdwm_button_t button_t; +typedef enum zdwm_modifier_bit_t modifier_bit_t; +typedef zdwm_modifier_mask_t modifier_mask_t; /* clang-format on */ -typedef uint32_t modifier_mask_t; typedef uint32_t keysym_t; #define ZDWM_OUTPUT_ID_INVALID ((output_id_t)UINT32_MAX) @@ -39,29 +42,11 @@ typedef enum cross_output_policy_t { ZDWM_CROSS_OUTPUT_MOVE_TO_TARGET_WORKSPACE, } cross_output_policy_t; -typedef enum modifier_bit_t { - ZDWM_MOD_NONE = 0u, - ZDWM_MOD_SHIFT = 1u << 0, - ZDWM_MOD_CONTROL = 1u << 1, - ZDWM_MOD_1 = 1u << 2, - ZDWM_MOD_2 = 1u << 3, - ZDWM_MOD_3 = 1u << 4, - ZDWM_MOD_4 = 1u << 5, - ZDWM_MOD_5 = 1u << 6, -} modifier_bit_t; - typedef struct key_bind_t { modifier_mask_t modifiers; keysym_t keysym; } key_bind_t; -typedef enum button_t { - ZDWM_BUTTON_NONE, - ZDWM_BUTTON_LEFT, - ZDWM_BUTTON_RIGHT, - ZDWM_BUTTON_MIDDLE, -} button_t; - typedef struct grab_button_t { modifier_mask_t modifiers; button_t button; diff --git a/src/runtime/runtime.c b/src/runtime/runtime.c index 181322d..2337e46 100644 --- a/src/runtime/runtime.c +++ b/src/runtime/runtime.c @@ -467,8 +467,14 @@ static bool runtime_handle_bar_click( auto data = &event->as.pointer_button_press; - zdwm_action_t action = {.type = ZDWM_ACTION_NONE}; - if (bar_click(bar, data->window, data->local.x, &action)) { + zdwm_action_t action = {.type = ZDWM_ACTION_NONE}; + bar_click_info_t info = { + .window = data->window, + .x = data->local.x, + .modifiers = data->modifiers, + .button = data->button, + }; + if (bar_click(bar, info, &action)) { policy_resolve_action(ctx, &action, command_buffer); return true; }