From bf4b96104e256bc85a34abc0a06ac376a6f8f2fd Mon Sep 17 00:00:00 2001 From: DreamMaoMao <2523610504@qq.com> Date: Sat, 16 Aug 2025 10:41:58 +0800 Subject: [PATCH] opt: Optimize the mod key state of the virtual keyboard --- src/ext-protocol/text-input.h | 7 ++---- src/mango.c | 40 +++++++++++++++++++++++++---------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/ext-protocol/text-input.h b/src/ext-protocol/text-input.h index 0577d02..c82ffac 100644 --- a/src/ext-protocol/text-input.h +++ b/src/ext-protocol/text-input.h @@ -111,8 +111,7 @@ get_keyboard_grab(KeyboardGroup *keyboard) { return NULL; } - // 如果键盘不是物理键盘组的键盘,则返回NULL - // kb_group是一个物理键盘组,它的键盘是物理键盘 + // kb_group是一个物理键盘组,它不应该被过滤掉 if (keyboard != kb_group) return NULL; @@ -349,9 +348,7 @@ static void handle_input_method_grab_keyboard(struct wl_listener *listener, wl_container_of(listener, relay, input_method_grab_keyboard); struct wlr_input_method_keyboard_grab_v2 *keyboard_grab = data; - // 活动键盘应该是从物理键盘组中获取的, - // wlr_seat_get_keyboard可能获取到的是虚拟键盘,所以会造成设置错误 - struct wlr_keyboard *active_keyboard = &kb_group->wlr_group->keyboard; + struct wlr_keyboard *active_keyboard = wlr_seat_get_keyboard(seat); if (!is_keyboard_emulated_by_input_method(active_keyboard, relay->input_method)) { diff --git a/src/mango.c b/src/mango.c index fd782f3..0d4778f 100644 --- a/src/mango.c +++ b/src/mango.c @@ -1536,19 +1536,23 @@ axisnotify(struct wl_listener *listener, void *data) { /* This event is forwarded by the cursor when a pointer emits an axis event, * for example when you move the scroll wheel. */ struct wlr_pointer_axis_event *event = data; - struct wlr_keyboard *keyboard; - unsigned int mods; + struct wlr_keyboard *keyboard, *hard_keyboard; + unsigned int mods, hard_mods; AxisBinding *a; int ji; unsigned int adir; // IDLE_NOTIFY_ACTIVITY; handlecursoractivity(); wlr_idle_notifier_v1_notify_activity(idle_notifier, seat); - keyboard = &kb_group->wlr_group->keyboard; - // 获取当前按键的mask,比如alt+super或者alt+ctrl + hard_keyboard = &kb_group->wlr_group->keyboard; + hard_mods = hard_keyboard ? wlr_keyboard_get_modifiers(hard_keyboard) : 0; + + keyboard = wlr_seat_get_keyboard(seat); mods = keyboard ? wlr_keyboard_get_modifiers(keyboard) : 0; + mods = mods | hard_mods; + if (event->orientation == WL_POINTER_AXIS_VERTICAL_SCROLL) adir = event->delta > 0 ? AxisDown : AxisUp; else @@ -1585,8 +1589,8 @@ axisnotify(struct wl_listener *listener, void *data) { } int ongesture(struct wlr_pointer_swipe_end_event *event) { - struct wlr_keyboard *keyboard; - unsigned int mods; + struct wlr_keyboard *keyboard, *hard_keyboard; + unsigned int mods, hard_mods; const GestureBinding *g; unsigned int motion; unsigned int adx = (int)round(fabs(swipe_dx)); @@ -1609,9 +1613,14 @@ int ongesture(struct wlr_pointer_swipe_end_event *event) { motion = swipe_dy < 0 ? SWIPE_UP : SWIPE_DOWN; } - keyboard = &kb_group->wlr_group->keyboard; + hard_keyboard = &kb_group->wlr_group->keyboard; + hard_mods = hard_keyboard ? wlr_keyboard_get_modifiers(hard_keyboard) : 0; + + keyboard = wlr_seat_get_keyboard(seat); mods = keyboard ? wlr_keyboard_get_modifiers(keyboard) : 0; + mods = mods | hard_mods; + for (ji = 0; ji < config.gesture_bindings_count; ji++) { if (config.gesture_bindings_count < 1) break; @@ -1731,8 +1740,8 @@ void place_drag_tile_client(Client *c) { void // 鼠标按键事件 buttonpress(struct wl_listener *listener, void *data) { struct wlr_pointer_button_event *event = data; - struct wlr_keyboard *keyboard; - unsigned int mods; + struct wlr_keyboard *hard_keyboard, *keyboard; + unsigned int hard_mods, mods; Client *c; LayerSurface *l; struct wlr_surface *surface; @@ -1772,8 +1781,17 @@ buttonpress(struct wl_listener *listener, void *data) { } } - keyboard = &kb_group->wlr_group->keyboard; - mods = keyboard ? wlr_keyboard_get_modifiers(keyboard) : 0; + // 当鼠标焦点在layer上的时候,不检测虚拟键盘的mod状态, + // 避免layer虚拟键盘锁死mod按键状态 + hard_keyboard = &kb_group->wlr_group->keyboard; + hard_mods = + hard_keyboard ? wlr_keyboard_get_modifiers(hard_keyboard) : 0; + + keyboard = wlr_seat_get_keyboard(seat); + mods = keyboard && !l ? wlr_keyboard_get_modifiers(keyboard) : 0; + + mods = mods | hard_mods; + for (ji = 0; ji < config.mouse_bindings_count; ji++) { if (config.mouse_bindings_count < 1) break;