kiran-control-panel/0001-fix-keybinding-don-t-convert-normal-key-if-use-shift.patch
2024-04-09 17:03:52 +08:00

388 lines
14 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From 879b452cc80dccb6581fea70a671a86994fb3a45 Mon Sep 17 00:00:00 2001
From: yuan_xing <yuanxing@kylinsec.com.cn>
Date: Thu, 29 Feb 2024 17:28:42 +0800
Subject: [PATCH 1/1] fix(keybinding):don't convert normal key if use shift
modifier in keybinding
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 如果在快捷键中使用了shift修饰键则不转换其普通按键,直接使用普通按键的Qt::Key
Relates #30978
---
README.md | 4 +-
plugins/keybinding/CMakeLists.txt | 7 ++-
plugins/keybinding/utils/custom-line-edit.cpp | 25 +++++++----
plugins/keybinding/utils/keycode-helper.cpp | 42 ++++++++++++++++++
plugins/keybinding/utils/keycode-helper.h | 23 ++++++++++
.../keybinding/utils/keycode-translator.cpp | 44 +++++++++++--------
plugins/keybinding/utils/keycode-translator.h | 6 +--
7 files changed, 119 insertions(+), 32 deletions(-)
create mode 100644 plugins/keybinding/utils/keycode-helper.cpp
create mode 100644 plugins/keybinding/utils/keycode-helper.h
diff --git a/README.md b/README.md
index 83d25b9..ad47094 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@
1. 安装编译依赖
```bash
- $ sudo yum install gcc-c++ qt5-qtbase qt5-qtbase-devel qt5-qtbase-gui qt5-qtx11extras qt5-qtx11extras-devel qt5-qtsvg glibc glibc-devel libX11 libX11-devel kiranwidgets-qt5 kiran-widgets-qt5-devel
+ $ sudo yum install gcc-c++ qt5-qtbase qt5-qtbase-devel qt5-qtbase-gui qt5-qtx11extras qt5-qtx11extras-devel qt5-qtsvg glibc glibc-devel libX11 libX11-devel kiranwidgets-qt5 kiran-widgets-qt5-devel qt5-qtbase-static qt5-qtbase-private-devel
```
2. **源码根目录下创建**build**目录`mkdir build`
@@ -302,4 +302,4 @@ $ kiran-control-panel
```bash
$ kiran-cpanel-launcher --cpanel-plugin 插件安装的desktop文件名
-```
\ No newline at end of file
+```
diff --git a/plugins/keybinding/CMakeLists.txt b/plugins/keybinding/CMakeLists.txt
index bc94de2..d9dc8d1 100644
--- a/plugins/keybinding/CMakeLists.txt
+++ b/plugins/keybinding/CMakeLists.txt
@@ -1,5 +1,7 @@
set(TARGET_NAME kiran-cpanel-keybinding)
+find_package(Qt5 COMPONENTS XkbCommonSupport)
+
kiran_qt5_add_dbus_interface_ex(KEYBINDING_PROXY
data/com.kylinsec.Kiran.SessionDaemon.Keybinding.xml
keybinding_backEnd_proxy
@@ -16,6 +18,7 @@ target_include_directories(${TARGET_NAME} PRIVATE
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/utils
+ ${Qt5XkbCommonSupport_PRIVATE_INCLUDE_DIRS}
${KLOG_INCLUDE_DIRS}
${KIRAN_WIDGETS_INCLUDE_DIRS}
${KIRAN_CC_DAEMON_INCLUDE_DIRS})
@@ -27,8 +30,10 @@ target_link_libraries(${TARGET_NAME}
Qt5::Svg
Qt5::Core
Qt5::Concurrent
+ X11
+ Qt5::XkbCommonSupport
${KIRANWIDGETS_LIBRARIES}
${KLOG_LIBRARIES})
install(TARGETS ${TARGET_NAME}
- DESTINATION ${PLUGIN_LIBS_DIR}/)
\ No newline at end of file
+ DESTINATION ${PLUGIN_LIBS_DIR}/)
diff --git a/plugins/keybinding/utils/custom-line-edit.cpp b/plugins/keybinding/utils/custom-line-edit.cpp
index 36250da..6defb3b 100644
--- a/plugins/keybinding/utils/custom-line-edit.cpp
+++ b/plugins/keybinding/utils/custom-line-edit.cpp
@@ -17,6 +17,8 @@
#include <QInputMethodEvent>
#include <QPainter>
#include <QStyleOption>
+#include "keycode-translator.h"
+#include "logging-category.h"
CustomLineEdit::CustomLineEdit(QWidget *parent) : QLineEdit(parent)
{
@@ -33,18 +35,27 @@ void CustomLineEdit::initUI()
setFocusPolicy(Qt::ClickFocus);
setReadOnly(true);
setObjectName("CustomLineEdit");
-// setStyleSheet("#CustomLineEdit{border:1px solid #393939;border-radius:6px;padding-left:10px;padding-right:10px;}"
-// "#CustomLineEdit:focus{border:1px solid #2eb3ff;}");
+ // setStyleSheet("#CustomLineEdit{border:1px solid #393939;border-radius:6px;padding-left:10px;padding-right:10px;}"
+ // "#CustomLineEdit:focus{border:1px solid #2eb3ff;}");
}
void CustomLineEdit::keyReleaseEvent(QKeyEvent *event)
{
QList<int> keycodes;
+ int qtkey = 0;
if (event->key() == Qt::Key_Backspace && event->modifiers() == Qt::NoModifier)
{
return;
}
+
+ //处理shift修饰的快捷键组合按键不经过shift转化将原始按键keycode转化为对应的Qt::Key
+ if (event->key() != 0 && (event->modifiers() & Qt::ShiftModifier))
+ {
+ qtkey = KeycodeTranslator::keycode2QtKey(event->nativeScanCode());
+ KLOG_INFO(qLcKeybinding) << "convert KeyCode:" << event->nativeScanCode() << "to Qt::Key:" << qtkey;
+ }
+
// no modifier
if (event->key() != 0 && event->modifiers() == Qt::NoModifier)
{
@@ -56,14 +67,12 @@ void CustomLineEdit::keyReleaseEvent(QKeyEvent *event)
else if (event->key() != 0 && event->modifiers() == Qt::ShiftModifier)
{
keycodes.append(Qt::Key_Shift);
- keycodes.append(event->key());
- //KLOG_INFO() << "shift :" << event->key() << event->modifiers();
+ keycodes.append(qtkey ? qtkey : event->key());
}
else if (event->key() != 0 && event->modifiers() == Qt::ControlModifier)
{
keycodes.append(Qt::Key_Control);
keycodes.append(event->key());
- //KLOG_INFO() << "ctrl :" << event->key() << event->text();
}
else if (event->key() != 0 && event->modifiers() == Qt::AltModifier)
{
@@ -76,7 +85,7 @@ void CustomLineEdit::keyReleaseEvent(QKeyEvent *event)
{
keycodes.append(Qt::Key_Control);
keycodes.append(Qt::Key_Shift);
- keycodes.append(event->key());
+ keycodes.append(qtkey ? qtkey : event->key());
}
else if (event->key() != 0 && event->modifiers() == (Qt::ControlModifier | Qt::AltModifier))
{
@@ -88,7 +97,7 @@ void CustomLineEdit::keyReleaseEvent(QKeyEvent *event)
{
keycodes.append(Qt::Key_Shift);
keycodes.append(Qt::Key_Alt);
- keycodes.append(event->key());
+ keycodes.append(qtkey ? qtkey : event->key());
}
//three modifier
else if (event->key() != 0 && event->modifiers() == (Qt::AltModifier | Qt::ShiftModifier | Qt::ControlModifier))
@@ -96,7 +105,7 @@ void CustomLineEdit::keyReleaseEvent(QKeyEvent *event)
keycodes.append(Qt::Key_Shift);
keycodes.append(Qt::Key_Control);
keycodes.append(Qt::Key_Alt);
- keycodes.append(event->key());
+ keycodes.append(qtkey ? qtkey : event->key());
}
if (keycodes.size() > 0)
{
diff --git a/plugins/keybinding/utils/keycode-helper.cpp b/plugins/keybinding/utils/keycode-helper.cpp
new file mode 100644
index 0000000..67cb698
--- /dev/null
+++ b/plugins/keybinding/utils/keycode-helper.cpp
@@ -0,0 +1,42 @@
+/**
+ * Copyright (c) 2020 ~ 2021 KylinSec Co., Ltd.
+ * kiran-control-panel is licensed under 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.
+ *
+ * Author: yuanxing <yuanxing@kylinsec.com.cn>
+ */
+
+#include "keycode-helper.h"
+
+#include <X11/Xlib.h>
+
+namespace KeycodeHelper
+{
+unsigned long keycode2Keysym(unsigned long keycode)
+{
+ KeySym keysym = NoSymbol;
+ Display *display = QX11Info::display();
+ if (display == nullptr)
+ {
+ KLOG_WARNING(qLcKeybinding) << "can't open display!";
+ return keysym;
+ }
+
+ keysym = XKeycodeToKeysym(display, keycode, 0);
+ if (keysym != NoSymbol)
+ {
+ KLOG_INFO(qLcKeybinding) << "convert KeyCode:" << keycode << "to KeySym:" << keysym;
+ }
+ else
+ {
+ KLOG_INFO(qLcKeybinding) << "no corresponding" << keycode << "KeySym found.";
+ }
+ return keysym;
+}
+} // namespace KeycodeHelper
diff --git a/plugins/keybinding/utils/keycode-helper.h b/plugins/keybinding/utils/keycode-helper.h
new file mode 100644
index 0000000..849abe0
--- /dev/null
+++ b/plugins/keybinding/utils/keycode-helper.h
@@ -0,0 +1,23 @@
+/**
+ * Copyright (c) 2020 ~ 2021 KylinSec Co., Ltd.
+ * kiran-control-panel is licensed under 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.
+ *
+ * Author: yuanxing <yuanxing@kylinsec.com.cn>
+ */
+
+#pragma once
+
+#include <QX11Info>
+#include "logging-category.h"
+
+namespace KeycodeHelper
+{
+unsigned long keycode2Keysym(unsigned long keycode);
+} // namespace KeycodeHelper
diff --git a/plugins/keybinding/utils/keycode-translator.cpp b/plugins/keybinding/utils/keycode-translator.cpp
index a8dea85..5b7f40c 100644
--- a/plugins/keybinding/utils/keycode-translator.cpp
+++ b/plugins/keybinding/utils/keycode-translator.cpp
@@ -15,9 +15,11 @@
#include "keycode-translator.h"
#include "logging-category.h"
+#include <QtXkbCommonSupport/private/qxkbcommon_p.h>
#include <qt5-log-i.h>
-#include <QMetaEnum>
#include <QApplication>
+#include <QMetaEnum>
+#include "keycode-helper.h"
static QMetaEnum keyMetaEnum = QMetaEnum::fromType<KeycodeTranslator::Key>();
@@ -89,23 +91,22 @@ static const QMap<QString, QString> MediaKeyMap = {
KeycodeTranslator::KeycodeTranslator(QObject *parent)
: QObject(parent)
{
-
}
QString KeycodeTranslator::keycode2ReadableString(const QList<int> &keycodes)
{
QStringList keyStrings;
- for( int key : keycodes )
+ for (int key : keycodes)
{
- if( (key >= Qt::Key_0) && (key <= Qt::Key_9) )
+ if ((key >= Qt::Key_0) && (key <= Qt::Key_9))
{
- keyStrings.append(QString::number(key-Qt::Key_0));
+ keyStrings.append(QString::number(key - Qt::Key_0));
continue;
}
- const char* keyValue = keyMetaEnum.valueToKey(key);
- if( keyValue == nullptr )
+ const char *keyValue = keyMetaEnum.valueToKey(key);
+ if (keyValue == nullptr)
{
KLOG_WARNING(qLcKeybinding) << "can't convert key:" << key;
continue;
@@ -113,12 +114,12 @@ QString KeycodeTranslator::keycode2ReadableString(const QList<int> &keycodes)
QString keyStr(keyValue);
//特殊按键经QMetaEnum翻译之后再经过SpecialKeyMap翻译
- if( SpecialKeyMap.contains(keyStr.toLower()) )
+ if (SpecialKeyMap.contains(keyStr.toLower()))
{
keyStrings.append(SpecialKeyMap.value(keyStr.toLower()));
}
//特殊按键 "_" 转换成 " "
- else if( (key >= Audio_Lower_Volume) && (key <= Audio_Mic_Mute) )
+ else if ((key >= Audio_Lower_Volume) && (key <= Audio_Mic_Mute))
{
keyStrings.append(keyStr.split("_").join(" "));
}
@@ -131,33 +132,40 @@ QString KeycodeTranslator::keycode2ReadableString(const QList<int> &keycodes)
return keyStrings.join('+');
}
+int KeycodeTranslator::keycode2QtKey(unsigned long keycode)
+{
+ auto keysym = KeycodeHelper::keycode2Keysym(keycode);
+ auto qtkey = QXkbCommon::keysymToQtKey(keysym, Qt::KeyboardModifier::NoModifier);
+ return qtkey;
+}
+
QString KeycodeTranslator::backendKeyString2Readable(const QString &keyString)
{
QString readableString;
- if( keyString.isEmpty() )
+ if (keyString.isEmpty())
{
readableString = tr("None");
}
- else if( keyString.contains("disable",Qt::CaseInsensitive) )
+ else if (keyString.contains("disable", Qt::CaseInsensitive))
{
readableString = tr("disabled");
}
else
{
QString temp = keyString;
- temp = temp.replace("<","");
- temp = temp.replace(">","-");
+ temp = temp.replace("<", "");
+ temp = temp.replace(">", "-");
#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0))
QStringList keyList = temp.split("-", QString::SkipEmptyParts);
#else
- QStringList keyList = temp.split("-",Qt::SkipEmptyParts);
+ QStringList keyList = temp.split("-", Qt::SkipEmptyParts);
#endif
- for(int i=0;i<keyList.size();i++)
+ for (int i = 0; i < keyList.size(); i++)
{
- if( SpecialKeyMap.contains(keyList.at(i).toLower()) )
+ if (SpecialKeyMap.contains(keyList.at(i).toLower()))
{
- keyList.replace(i,SpecialKeyMap.value(keyList.at(i).toLower()));
+ keyList.replace(i, SpecialKeyMap.value(keyList.at(i).toLower()));
}
else if (MediaKeyMap.contains(keyList.at(i)))
{
@@ -174,7 +182,7 @@ QString KeycodeTranslator::backendKeyString2Readable(const QString &keyString)
QString KeycodeTranslator::readableKeyString2Backend(const QString &keyString)
{
QStringList keystrings = keyString.split('+');
- for( int i=0;i<keystrings.count();i++ )
+ for (int i = 0; i < keystrings.count(); i++)
{
QString key = keystrings.at(i);
diff --git a/plugins/keybinding/utils/keycode-translator.h b/plugins/keybinding/utils/keycode-translator.h
index 2697b43..40e91f1 100644
--- a/plugins/keybinding/utils/keycode-translator.h
+++ b/plugins/keybinding/utils/keycode-translator.h
@@ -17,7 +17,7 @@
#include <QObject>
-class KeycodeTranslator : public QObject
+class KeycodeTranslator : public QObject
{
Q_OBJECT
public:
@@ -174,9 +174,9 @@ private:
public:
static QString keycode2ReadableString(const QList<int>& keycodes);
+ static int keycode2QtKey(unsigned long keycode);
static QString backendKeyString2Readable(const QString& keyString);
static QString readableKeyString2Backend(const QString& keyString);
};
-
-#endif //KIRAN_CONTROL_PANEL_KEYCODE_TRANSLATOR_H
+#endif //KIRAN_CONTROL_PANEL_KEYCODE_TRANSLATOR_H
--
2.27.0