feat: bar 点击回调添加按键和修饰键参数
on_click 新增 modifiers/button,使 bar item 可按按键与修饰键区分动作; 因参数增多,回调与 bar_click 改用结构参数封装。同时将 button_t 与 modifier 类型提升至公开头 include/zdwm/types.h 以供使用
This commit is contained in:
@@ -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);
|
void (*cell_set_indicator)(zdwm_bar_item_t *item, size_t index, bool show);
|
||||||
} zdwm_bar_cell_api_t;
|
} 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 {
|
typedef struct zdwm_bar_item_type_t {
|
||||||
void *(*create_state)(zdwm_output_id_t output_id, void *config);
|
void *(*create_state)(zdwm_output_id_t output_id, void *config);
|
||||||
void (*update)(
|
void (*update)(
|
||||||
@@ -66,12 +75,7 @@ typedef struct zdwm_bar_item_type_t {
|
|||||||
const zdwm_bar_cell_api_t *cells,
|
const zdwm_bar_cell_api_t *cells,
|
||||||
void *state
|
void *state
|
||||||
);
|
);
|
||||||
zdwm_action_t (*on_click)(
|
zdwm_action_t (*on_click)(zdwm_bar_click_params_t *params);
|
||||||
zdwm_bar_item_t *item,
|
|
||||||
size_t cell_index,
|
|
||||||
int32_t x,
|
|
||||||
void *state
|
|
||||||
);
|
|
||||||
void (*destroy_state)(void *state);
|
void (*destroy_state)(void *state);
|
||||||
zdwm_bar_item_t *instance;
|
zdwm_bar_item_t *instance;
|
||||||
uint32_t update_interval_ms;
|
uint32_t update_interval_ms;
|
||||||
|
|||||||
@@ -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_WORKSPACE_ID_INVALID ((zdwm_workspace_id_t)UINT32_MAX)
|
||||||
#define ZDWM_BINDING_MODE_ID_INVALID ((zdwm_binding_mode_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 {
|
typedef struct zdwm_rect_t {
|
||||||
int32_t x;
|
int32_t x;
|
||||||
int32_t y;
|
int32_t y;
|
||||||
|
|||||||
@@ -404,8 +404,12 @@ bool bar_draw(bar_t *bar) {
|
|||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool
|
static inline bool bar_item_click(
|
||||||
bar_item_click(zdwm_bar_item_t *item, int32_t x, zdwm_action_t *action) {
|
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->region.start <= x && item->region.end >= x)) return false;
|
||||||
|
|
||||||
if (!item->api.on_click) return true;
|
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) {
|
for (size_t i = 0; i < item->count; ++i) {
|
||||||
auto cell = &item->cells[i];
|
auto cell = &item->cells[i];
|
||||||
if (cell->region.start <= x && cell->region.end >= x) {
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -422,29 +434,24 @@ bar_item_click(zdwm_bar_item_t *item, int32_t x, zdwm_action_t *action) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
bar_side_click(bar_side_t *side, int32_t x, zdwm_action_t *action) {
|
bar_side_click(bar_side_t *side, bar_click_info_t info, zdwm_action_t *action) {
|
||||||
if (side->region.start > x || side->region.end < x) return false;
|
if (side->region.start > info.x || side->region.end < info.x) return false;
|
||||||
|
|
||||||
for (size_t i = 0; i < side->count; ++i) {
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bar_click(
|
bool bar_click(bar_t *bar, bar_click_info_t info, zdwm_action_t *action) {
|
||||||
bar_t *bar,
|
|
||||||
zdwm_window_id_t window,
|
|
||||||
int32_t x,
|
|
||||||
zdwm_action_t *action
|
|
||||||
) {
|
|
||||||
for (size_t i = 0; i < bar->count; ++i) {
|
for (size_t i = 0; i < bar->count; ++i) {
|
||||||
auto bar_output = &bar->bars[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_side_click(&bar_output->left, info, action)) return true;
|
||||||
if (bar_item_click(&bar_output->center, x, action)) return true;
|
if (bar_item_click(&bar_output->center, info, action)) return true;
|
||||||
if (bar_side_click(&bar_output->right, x, action)) return true;
|
if (bar_side_click(&bar_output->right, info, action)) return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -43,9 +43,11 @@ void bar_init(bar_t *bar, listeners_t *listeners);
|
|||||||
void bar_cleanup(bar_t *bar);
|
void bar_cleanup(bar_t *bar);
|
||||||
void bar_update(bar_t *bar);
|
void bar_update(bar_t *bar);
|
||||||
bool bar_draw(bar_t *bar);
|
bool bar_draw(bar_t *bar);
|
||||||
bool bar_click(
|
|
||||||
bar_t *bar,
|
typedef struct bar_click_info_t {
|
||||||
zdwm_window_id_t window,
|
zdwm_window_id_t window;
|
||||||
int32_t x,
|
int32_t x;
|
||||||
zdwm_action_t *action
|
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);
|
||||||
|
|||||||
@@ -55,12 +55,7 @@ static void bar_binding_update(
|
|||||||
data->dirty = false;
|
data->dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static zdwm_action_t bar_binding_on_click(
|
static zdwm_action_t bar_binding_on_click(zdwm_bar_click_params_t *params) {
|
||||||
zdwm_bar_item_t *item,
|
|
||||||
size_t cell_index,
|
|
||||||
int32_t x,
|
|
||||||
void *state
|
|
||||||
) {
|
|
||||||
return (zdwm_action_t){
|
return (zdwm_action_t){
|
||||||
.type = ZDWM_ACTION_BINDING_MODE_CYCLE,
|
.type = ZDWM_ACTION_BINDING_MODE_CYCLE,
|
||||||
.as.binding_mode_cycle = {.delta = 1},
|
.as.binding_mode_cycle = {.delta = 1},
|
||||||
|
|||||||
@@ -143,13 +143,10 @@ static void bar_workspaces_update(
|
|||||||
data->dirty = false;
|
data->dirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static zdwm_action_t bar_workspace_on_click(
|
static zdwm_action_t bar_workspace_on_click(zdwm_bar_click_params_t *params) {
|
||||||
zdwm_bar_item_t *item,
|
auto cell_index = params->cell_index;
|
||||||
size_t cell_index,
|
auto data = (bar_workspace_state_t *)params->state;
|
||||||
int32_t x,
|
|
||||||
void *state
|
|
||||||
) {
|
|
||||||
auto data = (bar_workspace_state_t *)state;
|
|
||||||
if (cell_index == data->count) {
|
if (cell_index == data->count) {
|
||||||
return (zdwm_action_t){
|
return (zdwm_action_t){
|
||||||
.type = ZDWM_ACTION_LAYOUT_CYCLE,
|
.type = ZDWM_ACTION_LAYOUT_CYCLE,
|
||||||
|
|||||||
@@ -17,9 +17,12 @@ typedef zdwm_output_info_t output_info_t;
|
|||||||
|
|
||||||
typedef zdwm_rule_match_t rule_match_t;
|
typedef zdwm_rule_match_t rule_match_t;
|
||||||
typedef zdwm_rule_action_t rule_action_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 */
|
/* clang-format on */
|
||||||
|
|
||||||
typedef uint32_t modifier_mask_t;
|
|
||||||
typedef uint32_t keysym_t;
|
typedef uint32_t keysym_t;
|
||||||
|
|
||||||
#define ZDWM_OUTPUT_ID_INVALID ((output_id_t)UINT32_MAX)
|
#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,
|
ZDWM_CROSS_OUTPUT_MOVE_TO_TARGET_WORKSPACE,
|
||||||
} cross_output_policy_t;
|
} 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 {
|
typedef struct key_bind_t {
|
||||||
modifier_mask_t modifiers;
|
modifier_mask_t modifiers;
|
||||||
keysym_t keysym;
|
keysym_t keysym;
|
||||||
} key_bind_t;
|
} 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 {
|
typedef struct grab_button_t {
|
||||||
modifier_mask_t modifiers;
|
modifier_mask_t modifiers;
|
||||||
button_t button;
|
button_t button;
|
||||||
|
|||||||
@@ -467,8 +467,14 @@ static bool runtime_handle_bar_click(
|
|||||||
|
|
||||||
auto data = &event->as.pointer_button_press;
|
auto data = &event->as.pointer_button_press;
|
||||||
|
|
||||||
zdwm_action_t action = {.type = ZDWM_ACTION_NONE};
|
zdwm_action_t action = {.type = ZDWM_ACTION_NONE};
|
||||||
if (bar_click(bar, data->window, data->local.x, &action)) {
|
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);
|
policy_resolve_action(ctx, &action, command_buffer);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user