feat(backend): 支持鼠标抓取功能
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user