opt: Optimize the mod key state of the virtual keyboard

This commit is contained in:
DreamMaoMao 2025-08-16 10:41:58 +08:00
parent b7514e7bbb
commit bf4b96104e
2 changed files with 31 additions and 16 deletions

View file

@ -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)) {

View file

@ -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;