92 lines
4.0 KiB
Diff
92 lines
4.0 KiB
Diff
|
|
From cf28fd1fdcea7c76e8ff5afb8a6a317b0cdabac5 Mon Sep 17 00:00:00 2001
|
|||
|
|
From: liuxinhao <liuxinhao@kylinsec.com.cn>
|
|||
|
|
Date: Fri, 1 Mar 2024 14:50:33 +0800
|
|||
|
|
Subject: [PATCH] fix(keybidning): avoid shift to participate in translator
|
|||
|
|
keycodes
|
|||
|
|
MIME-Version: 1.0
|
|||
|
|
Content-Type: text/plain; charset=UTF-8
|
|||
|
|
Content-Transfer-Encoding: 8bit
|
|||
|
|
|
|||
|
|
- 不让shift参与按键翻译,避免多重意义,影响匹配
|
|||
|
|
|
|||
|
|
Closes #25039,#30978
|
|||
|
|
---
|
|||
|
|
plugins/keybinding/shortcut-helper.cpp | 28 +++++++++++++++++---------
|
|||
|
|
1 file changed, 19 insertions(+), 9 deletions(-)
|
|||
|
|
|
|||
|
|
diff --git a/plugins/keybinding/shortcut-helper.cpp b/plugins/keybinding/shortcut-helper.cpp
|
|||
|
|
index a9dd62c..0e943cc 100644
|
|||
|
|
--- a/plugins/keybinding/shortcut-helper.cpp
|
|||
|
|
+++ b/plugins/keybinding/shortcut-helper.cpp
|
|||
|
|
@@ -1,14 +1,14 @@
|
|||
|
|
/**
|
|||
|
|
- * Copyright (c) 2020 ~ 2021 KylinSec Co., Ltd.
|
|||
|
|
+ * Copyright (c) 2020 ~ 2021 KylinSec Co., Ltd.
|
|||
|
|
* kiran-cc-daemon is licensed under Mulan PSL v2.
|
|||
|
|
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|||
|
|
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|||
|
|
* You may obtain a copy of Mulan PSL v2 at:
|
|||
|
|
- * http://license.coscl.org.cn/MulanPSL2
|
|||
|
|
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|||
|
|
- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|||
|
|
- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|||
|
|
- * See the Mulan PSL v2 for more details.
|
|||
|
|
- *
|
|||
|
|
+ * http://license.coscl.org.cn/MulanPSL2
|
|||
|
|
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|||
|
|
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|||
|
|
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|||
|
|
+ * See the Mulan PSL v2 for more details.
|
|||
|
|
+ *
|
|||
|
|
* Author: tangjie02 <tangjie02@kylinos.com.cn>
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
@@ -120,10 +120,15 @@ KeyState ShortCutHelper::get_keystate(XEvent *event)
|
|||
|
|
|
|||
|
|
auto group = XkbGroupForCoreState(event->xkey.state);
|
|||
|
|
|
|||
|
|
+ /** NOTE:
|
|||
|
|
+ * 不让shift修复符参与转换,避免使用shift+其他按键经过转换导致匹配问题。
|
|||
|
|
+ * 例如shift+5,若shift参与转换,keysym则会由'5'转换为'percent'
|
|||
|
|
+ */
|
|||
|
|
+ GdkModifierType no_shift_state = (GdkModifierType)(event->xkey.state & ~GDK_SHIFT_MASK);
|
|||
|
|
/* Check if we find a keysym that matches our current state */
|
|||
|
|
if (gdk_keymap_translate_keyboard_state(gdk_keymap_get_for_display(gdk_display_get_default()),
|
|||
|
|
event->xkey.keycode,
|
|||
|
|
- GdkModifierType(event->xkey.state),
|
|||
|
|
+ no_shift_state,
|
|||
|
|
group,
|
|||
|
|
&keyval,
|
|||
|
|
NULL,
|
|||
|
|
@@ -134,8 +139,11 @@ KeyState ShortCutHelper::get_keystate(XEvent *event)
|
|||
|
|
|
|||
|
|
gdk_keyval_convert_case(keyval, &lower, &upper);
|
|||
|
|
key_state.key_symbol = lower;
|
|||
|
|
+ /* 确保consumed不存在shift掩码,避免shift无法进入key_state.mods */
|
|||
|
|
consumed = (GdkModifierType)(consumed & (~GDK_SHIFT_MASK));
|
|||
|
|
KLOG_DEBUG_KEYBINDING("The keystate is %0x and consumed is %0x.", event->xkey.state, consumed);
|
|||
|
|
+
|
|||
|
|
+ /* 原始修饰符去掉已消耗的修饰符,存入mods,作为后续参与快捷键匹配的修饰符 */
|
|||
|
|
key_state.mods = event->xkey.state & ~consumed & GDK_MODIFIER_MASK;
|
|||
|
|
return key_state;
|
|||
|
|
}
|
|||
|
|
@@ -147,6 +155,7 @@ std::vector<uint32_t> ShortCutHelper::get_keycode(uint32_t key_symbol, KeyCodeFi
|
|||
|
|
std::vector<uint32_t> result;
|
|||
|
|
GdkKeymapKey *keys;
|
|||
|
|
int32_t n_keys;
|
|||
|
|
+
|
|||
|
|
if (gdk_keymap_get_entries_for_keyval(Gdk::Display::get_default()->get_keymap(),
|
|||
|
|
key_symbol,
|
|||
|
|
&keys,
|
|||
|
|
@@ -161,6 +170,7 @@ std::vector<uint32_t> ShortCutHelper::get_keycode(uint32_t key_symbol, KeyCodeFi
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
+
|
|||
|
|
auto iter = std::unique(result.begin(), result.end());
|
|||
|
|
result.erase(iter, result.end());
|
|||
|
|
return result;
|
|||
|
|
--
|
|||
|
|
2.33.0
|
|||
|
|
|