feat(backend): 支持鼠标抓取功能

This commit is contained in:
2026-06-20 01:04:00 +08:00
parent 7a47f4d44d
commit b8cd40df9f
12 changed files with 178 additions and 54 deletions

View File

@@ -27,12 +27,6 @@ typedef struct key_press_event_t {
uint32_t keycode;
} key_press_event_t;
typedef enum button_t {
ZDWM_BUTTON_LEFT,
ZDWM_BUTTON_RIGHT,
ZDWM_BUTTON_MIDDLE,
} button_t;
typedef struct pointer_button_event_t {
modifier_mask_t modifiers;
button_t button;

View File

@@ -20,6 +20,8 @@ static void free_memory_hold_by_effects(effect_t *effects, size_t count) {
case ZDWM_EFFECT_BIND_KEY:
p_delete(&effect->as.bind_key.keys);
break;
case ZDWM_EFFECT_GRAB_BUTTON:
p_delete(&effect->as.grab_button.buttons);
default:
}
}

View File

@@ -20,6 +20,7 @@ typedef enum effect_type_t {
ZDWM_EFFECT_CHANGE_WINDOW_LIST,
ZDWM_EFFECT_RESTACK_WINDOWS,
ZDWM_EFFECT_BIND_KEY,
ZDWM_EFFECT_GRAB_BUTTON,
} effect_type_t;
typedef struct effect_move_window_t {
@@ -48,6 +49,12 @@ typedef struct effect_bind_key_t {
size_t count;
} effect_bind_key_t;
typedef struct effect_grab_button_t {
window_id_t window;
const grab_button_t *buttons;
size_t count;
} effect_grab_button_t;
typedef struct effect_bool_window_t {
window_id_t window;
bool value;
@@ -69,6 +76,7 @@ typedef struct effect_t {
effect_window_list_t change_window_list;
effect_window_list_t restack_windows;
effect_bind_key_t bind_key;
effect_grab_button_t grab_button;
} as;
} effect_t;

View File

@@ -762,6 +762,24 @@ static void push_window_list_effect(const state_t *state, plan_t *plan) {
plan_push_effect(plan, &effect);
}
static void plan_push_grab_button_effect(plan_t *plan, window_id_t window) {
/* TODO: 后续会改成配置 */
static const grab_button_t buttons[] = {
[0] = {.modifiers = ZDWM_MOD_4, .button = ZDWM_BUTTON_LEFT},
[1] = {.modifiers = ZDWM_MOD_4, .button = ZDWM_BUTTON_RIGHT},
};
constexpr const size_t count = countof(buttons);
auto btns = p_new(grab_button_t, count);
memcpy(btns, buttons, sizeof(buttons));
effect_t grab_button_effect = {
.type = ZDWM_EFFECT_GRAB_BUTTON,
.as.grab_button = {.window = window, .buttons = btns, .count = count},
};
plan_push_effect(plan, &grab_button_effect);
}
static void manage_window(
const policy_context_t *ctx,
const manage_window_command_t *command,
@@ -774,6 +792,7 @@ static void manage_window(
state_window_set_workspace(state, window_id, workspace_id);
state_window_set_floating(state, window_id, command->floating);
set_foucs_window(ctx, workspace_id, window_id, plan);
plan_push_grab_button_effect(plan, window_id);
push_window_list_effect(state, plan);
listeners_notify_window_added(ctx->listeners, state, window_id);

View File

@@ -55,6 +55,18 @@ typedef struct key_bind_t {
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;
} grab_button_t;
typedef enum window_state_request_type_t {
ZDWM_WINDOW_STATE_REQUEST_FULLSCREEN,
ZDWM_WINDOW_STATE_REQUEST_MAXIMIZED,