mirror of
https://github.com/xiaoyifang/goldendict-ng.git
synced 2024-11-30 13:24:05 +00:00
opt: rewrite keymodifier (#1614)
* opt: rewrite keyboardstate.cc --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
parent
c4caec7d68
commit
15cb327bbd
|
@ -2,57 +2,14 @@
|
||||||
* Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */
|
* Part of GoldenDict. Licensed under GPLv3 or later, see the LICENSE file */
|
||||||
|
|
||||||
#include "keyboardstate.hh"
|
#include "keyboardstate.hh"
|
||||||
#include <QObject> // To get Qt Q_OS defines
|
|
||||||
|
|
||||||
#ifdef Q_OS_WIN32
|
#include <QApplication>
|
||||||
#include <windows.h>
|
|
||||||
#elif defined( HAVE_X11 )
|
|
||||||
#if ( QT_VERSION >= QT_VERSION_CHECK( 6, 0, 0 ) )
|
|
||||||
#include <QGuiApplication>
|
|
||||||
#else
|
|
||||||
#include <QX11Info>
|
|
||||||
#endif
|
|
||||||
#include <X11/X.h>
|
|
||||||
#include <X11/XKBlib.h>
|
|
||||||
#elif defined Q_OS_MAC
|
|
||||||
#define __SECURITYHI__
|
|
||||||
#include <Carbon/Carbon.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool KeyboardState::checkModifiersPressed( int mask )
|
bool KeyboardState::checkModifiersPressed( int mask )
|
||||||
{
|
{
|
||||||
#if defined( Q_OS_WIN32 )
|
auto modifiers = QApplication::queryKeyboardModifiers();
|
||||||
|
|
||||||
return !( ( mask & Alt && !( GetAsyncKeyState( VK_MENU ) & 0x8000 ) )
|
return !( ( mask & Alt && !( modifiers.testFlag( Qt::AltModifier ) ) )
|
||||||
|| ( mask & Ctrl && !( GetAsyncKeyState( VK_CONTROL ) & 0x8000 ) )
|
|| ( mask & Ctrl && !( modifiers.testFlag( Qt::ControlModifier ) ) )
|
||||||
|| ( mask & Shift && !( GetAsyncKeyState( VK_SHIFT ) & 0x8000 ) )
|
|| ( mask & Shift && !( modifiers.testFlag( Qt::ShiftModifier ) ) ) );
|
||||||
|| ( mask & LeftAlt && !( GetAsyncKeyState( VK_LMENU ) & 0x8000 ) )
|
|
||||||
|| ( mask & RightAlt && !( GetAsyncKeyState( VK_RMENU ) & 0x8000 ) )
|
|
||||||
|| ( mask & LeftCtrl && !( GetAsyncKeyState( VK_LCONTROL ) & 0x8000 ) )
|
|
||||||
|| ( mask & RightCtrl && !( GetAsyncKeyState( VK_RCONTROL ) & 0x8000 ) )
|
|
||||||
|| ( mask & LeftShift && !( GetAsyncKeyState( VK_LSHIFT ) & 0x8000 ) )
|
|
||||||
|| ( mask & RightShift && !( GetAsyncKeyState( VK_RSHIFT ) & 0x8000 ) ) );
|
|
||||||
|
|
||||||
#elif defined Q_OS_MAC
|
|
||||||
UInt32 keys = GetCurrentKeyModifiers();
|
|
||||||
return !( ( mask & Alt && !( keys & ( 1 << optionKeyBit ) ) ) || ( mask & Ctrl && !( keys & ( 1 << cmdKeyBit ) ) )
|
|
||||||
|| ( mask & Shift && !( keys & ( 1 << shiftKeyBit ) ) )
|
|
||||||
|| ( mask & Win && !( keys & ( 1 << controlKeyBit ) ) ) );
|
|
||||||
#else
|
|
||||||
|
|
||||||
#if QT_VERSION < 0x060000
|
|
||||||
Display * displayID = QX11Info::display();
|
|
||||||
#else
|
|
||||||
QNativeInterface::QX11Application * x11AppInfo = qApp->nativeInterface< QNativeInterface::QX11Application >();
|
|
||||||
Display * displayID = x11AppInfo->display();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
XkbStateRec state;
|
|
||||||
|
|
||||||
XkbGetState( displayID, XkbUseCoreKbd, &state );
|
|
||||||
|
|
||||||
return !( ( mask & Alt && !( state.base_mods & Mod1Mask ) ) || ( mask & Ctrl && !( state.base_mods & ControlMask ) )
|
|
||||||
|| ( mask & Shift && !( state.base_mods & ShiftMask ) )
|
|
||||||
|| ( mask & Win && !( state.base_mods & Mod4Mask ) ) );
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,12 +16,6 @@ public:
|
||||||
Ctrl = 2,
|
Ctrl = 2,
|
||||||
Shift = 4,
|
Shift = 4,
|
||||||
Win = 8, // Ironically, Linux only, since it's no use under Windows
|
Win = 8, // Ironically, Linux only, since it's no use under Windows
|
||||||
LeftAlt = 16, // Those Left-Right are Windows-only, at least for now
|
|
||||||
RightAlt = 32,
|
|
||||||
LeftCtrl = 64,
|
|
||||||
RightCtrl = 128,
|
|
||||||
LeftShift = 256,
|
|
||||||
RightShift = 512
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Returns true if all Modifiers present within the given mask are pressed
|
/// Returns true if all Modifiers present within the given mask are pressed
|
||||||
|
|
|
@ -27,18 +27,6 @@ Preferences::Preferences( QWidget * parent, Config::Class & cfg_ ):
|
||||||
|
|
||||||
connect( ui.showScanFlag, &QAbstractButton::toggled, this, &Preferences::showScanFlagToggled );
|
connect( ui.showScanFlag, &QAbstractButton::toggled, this, &Preferences::showScanFlagToggled );
|
||||||
|
|
||||||
connect( ui.altKey, &QAbstractButton::clicked, this, &Preferences::wholeAltClicked );
|
|
||||||
connect( ui.ctrlKey, &QAbstractButton::clicked, this, &Preferences::wholeCtrlClicked );
|
|
||||||
connect( ui.shiftKey, &QAbstractButton::clicked, this, &Preferences::wholeShiftClicked );
|
|
||||||
|
|
||||||
connect( ui.leftAlt, &QAbstractButton::clicked, this, &Preferences::sideAltClicked );
|
|
||||||
connect( ui.rightAlt, &QAbstractButton::clicked, this, &Preferences::sideAltClicked );
|
|
||||||
connect( ui.leftCtrl, &QAbstractButton::clicked, this, &Preferences::sideCtrlClicked );
|
|
||||||
connect( ui.rightCtrl, &QAbstractButton::clicked, this, &Preferences::sideCtrlClicked );
|
|
||||||
connect( ui.leftShift, &QAbstractButton::clicked, this, &Preferences::sideShiftClicked );
|
|
||||||
connect( ui.rightShift, &QAbstractButton::clicked, this, &Preferences::sideShiftClicked );
|
|
||||||
|
|
||||||
|
|
||||||
helpAction.setShortcut( QKeySequence( "F1" ) );
|
helpAction.setShortcut( QKeySequence( "F1" ) );
|
||||||
helpAction.setShortcutContext( Qt::WidgetWithChildrenShortcut );
|
helpAction.setShortcutContext( Qt::WidgetWithChildrenShortcut );
|
||||||
|
|
||||||
|
@ -206,12 +194,6 @@ Preferences::Preferences( QWidget * parent, Config::Class & cfg_ ):
|
||||||
ui.ctrlKey->setChecked( p.scanPopupModifiers & KeyboardState::Ctrl );
|
ui.ctrlKey->setChecked( p.scanPopupModifiers & KeyboardState::Ctrl );
|
||||||
ui.shiftKey->setChecked( p.scanPopupModifiers & KeyboardState::Shift );
|
ui.shiftKey->setChecked( p.scanPopupModifiers & KeyboardState::Shift );
|
||||||
ui.winKey->setChecked( p.scanPopupModifiers & KeyboardState::Win );
|
ui.winKey->setChecked( p.scanPopupModifiers & KeyboardState::Win );
|
||||||
ui.leftAlt->setChecked( p.scanPopupModifiers & KeyboardState::LeftAlt );
|
|
||||||
ui.rightAlt->setChecked( p.scanPopupModifiers & KeyboardState::RightAlt );
|
|
||||||
ui.leftCtrl->setChecked( p.scanPopupModifiers & KeyboardState::LeftCtrl );
|
|
||||||
ui.rightCtrl->setChecked( p.scanPopupModifiers & KeyboardState::RightCtrl );
|
|
||||||
ui.leftShift->setChecked( p.scanPopupModifiers & KeyboardState::LeftShift );
|
|
||||||
ui.rightShift->setChecked( p.scanPopupModifiers & KeyboardState::RightShift );
|
|
||||||
|
|
||||||
ui.ignoreOwnClipboardChanges->setChecked( p.ignoreOwnClipboardChanges );
|
ui.ignoreOwnClipboardChanges->setChecked( p.ignoreOwnClipboardChanges );
|
||||||
ui.scanToMainWindow->setChecked( p.scanToMainWindow );
|
ui.scanToMainWindow->setChecked( p.scanToMainWindow );
|
||||||
|
@ -250,12 +232,6 @@ Preferences::Preferences( QWidget * parent, Config::Class & cfg_ ):
|
||||||
#ifdef Q_OS_WIN32
|
#ifdef Q_OS_WIN32
|
||||||
ui.winKey->hide();
|
ui.winKey->hide();
|
||||||
#else
|
#else
|
||||||
ui.leftAlt->hide();
|
|
||||||
ui.rightAlt->hide();
|
|
||||||
ui.leftCtrl->hide();
|
|
||||||
ui.rightCtrl->hide();
|
|
||||||
ui.leftShift->hide();
|
|
||||||
ui.rightShift->hide();
|
|
||||||
#ifdef Q_OS_MAC
|
#ifdef Q_OS_MAC
|
||||||
ui.altKey->setText( "Opt" );
|
ui.altKey->setText( "Opt" );
|
||||||
ui.winKey->setText( "Ctrl" );
|
ui.winKey->setText( "Ctrl" );
|
||||||
|
@ -446,12 +422,6 @@ Config::Preferences Preferences::getPreferences()
|
||||||
p.scanPopupModifiers += ui.ctrlKey->isChecked() ? KeyboardState::Ctrl : 0;
|
p.scanPopupModifiers += ui.ctrlKey->isChecked() ? KeyboardState::Ctrl : 0;
|
||||||
p.scanPopupModifiers += ui.shiftKey->isChecked() ? KeyboardState::Shift : 0;
|
p.scanPopupModifiers += ui.shiftKey->isChecked() ? KeyboardState::Shift : 0;
|
||||||
p.scanPopupModifiers += ui.winKey->isChecked() ? KeyboardState::Win : 0;
|
p.scanPopupModifiers += ui.winKey->isChecked() ? KeyboardState::Win : 0;
|
||||||
p.scanPopupModifiers += ui.leftAlt->isChecked() ? KeyboardState::LeftAlt : 0;
|
|
||||||
p.scanPopupModifiers += ui.rightAlt->isChecked() ? KeyboardState::RightAlt : 0;
|
|
||||||
p.scanPopupModifiers += ui.leftCtrl->isChecked() ? KeyboardState::LeftCtrl : 0;
|
|
||||||
p.scanPopupModifiers += ui.rightCtrl->isChecked() ? KeyboardState::RightCtrl : 0;
|
|
||||||
p.scanPopupModifiers += ui.leftShift->isChecked() ? KeyboardState::LeftShift : 0;
|
|
||||||
p.scanPopupModifiers += ui.rightShift->isChecked() ? KeyboardState::RightShift : 0;
|
|
||||||
|
|
||||||
p.ignoreOwnClipboardChanges = ui.ignoreOwnClipboardChanges->isChecked();
|
p.ignoreOwnClipboardChanges = ui.ignoreOwnClipboardChanges->isChecked();
|
||||||
p.scanToMainWindow = ui.scanToMainWindow->isChecked();
|
p.scanToMainWindow = ui.scanToMainWindow->isChecked();
|
||||||
|
@ -556,48 +526,6 @@ void Preferences::showScanFlagToggled( bool b )
|
||||||
ui.enableScanPopupModifiers->setChecked( false );
|
ui.enableScanPopupModifiers->setChecked( false );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Preferences::wholeAltClicked( bool b )
|
|
||||||
{
|
|
||||||
if ( b ) {
|
|
||||||
ui.leftAlt->setChecked( false );
|
|
||||||
ui.rightAlt->setChecked( false );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Preferences::wholeCtrlClicked( bool b )
|
|
||||||
{
|
|
||||||
if ( b ) {
|
|
||||||
ui.leftCtrl->setChecked( false );
|
|
||||||
ui.rightCtrl->setChecked( false );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Preferences::wholeShiftClicked( bool b )
|
|
||||||
{
|
|
||||||
if ( b ) {
|
|
||||||
ui.leftShift->setChecked( false );
|
|
||||||
ui.rightShift->setChecked( false );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Preferences::sideAltClicked( bool )
|
|
||||||
{
|
|
||||||
if ( ui.leftAlt->isChecked() || ui.rightAlt->isChecked() )
|
|
||||||
ui.altKey->setChecked( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
void Preferences::sideCtrlClicked( bool )
|
|
||||||
{
|
|
||||||
if ( ui.leftCtrl->isChecked() || ui.rightCtrl->isChecked() )
|
|
||||||
ui.ctrlKey->setChecked( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
void Preferences::sideShiftClicked( bool )
|
|
||||||
{
|
|
||||||
if ( ui.leftShift->isChecked() || ui.rightShift->isChecked() )
|
|
||||||
ui.shiftKey->setChecked( false );
|
|
||||||
}
|
|
||||||
void Preferences::on_enableMainWindowHotkey_toggled( bool checked )
|
void Preferences::on_enableMainWindowHotkey_toggled( bool checked )
|
||||||
{
|
{
|
||||||
ui.mainWindowHotkey->setEnabled( checked );
|
ui.mainWindowHotkey->setEnabled( checked );
|
||||||
|
|
|
@ -41,14 +41,6 @@ private slots:
|
||||||
void enableScanPopupModifiersToggled( bool );
|
void enableScanPopupModifiersToggled( bool );
|
||||||
void showScanFlagToggled( bool b );
|
void showScanFlagToggled( bool b );
|
||||||
|
|
||||||
void wholeAltClicked( bool );
|
|
||||||
void wholeCtrlClicked( bool );
|
|
||||||
void wholeShiftClicked( bool );
|
|
||||||
|
|
||||||
void sideAltClicked( bool );
|
|
||||||
void sideCtrlClicked( bool );
|
|
||||||
void sideShiftClicked( bool );
|
|
||||||
|
|
||||||
void on_enableMainWindowHotkey_toggled( bool checked );
|
void on_enableMainWindowHotkey_toggled( bool checked );
|
||||||
void on_enableClipboardHotkey_toggled( bool checked );
|
void on_enableClipboardHotkey_toggled( bool checked );
|
||||||
|
|
||||||
|
|
|
@ -621,26 +621,6 @@ in the pressed state when the word selection changes.</string>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QCheckBox" name="leftCtrl">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Left Ctrl only</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Left Ctrl</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="2">
|
|
||||||
<widget class="QCheckBox" name="rightShift">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Right Shift only</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Right Shift</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QCheckBox" name="altKey">
|
<widget class="QCheckBox" name="altKey">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
|
@ -661,16 +641,6 @@ in the pressed state when the word selection changes.</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QCheckBox" name="leftAlt">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Left Alt only</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Left Alt</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="2">
|
<item row="0" column="2">
|
||||||
<widget class="QCheckBox" name="shiftKey">
|
<widget class="QCheckBox" name="shiftKey">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
|
@ -681,36 +651,6 @@ in the pressed state when the word selection changes.</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0">
|
|
||||||
<widget class="QCheckBox" name="rightAlt">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Right Alt only</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Right Alt</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="2" column="1">
|
|
||||||
<widget class="QCheckBox" name="rightCtrl">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Right Ctrl only</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Right Ctrl</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="2">
|
|
||||||
<widget class="QCheckBox" name="leftShift">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Left Shift only</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Left Shift</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="0" column="3">
|
<item row="0" column="3">
|
||||||
<widget class="QCheckBox" name="winKey">
|
<widget class="QCheckBox" name="winKey">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
|
@ -2035,15 +1975,9 @@ from Stardict, Babylon and GLS dictionaries</string>
|
||||||
<tabstop>startToTray</tabstop>
|
<tabstop>startToTray</tabstop>
|
||||||
<tabstop>closeToTray</tabstop>
|
<tabstop>closeToTray</tabstop>
|
||||||
<tabstop>cbAutostart</tabstop>
|
<tabstop>cbAutostart</tabstop>
|
||||||
<tabstop>leftCtrl</tabstop>
|
|
||||||
<tabstop>rightShift</tabstop>
|
|
||||||
<tabstop>altKey</tabstop>
|
<tabstop>altKey</tabstop>
|
||||||
<tabstop>ctrlKey</tabstop>
|
<tabstop>ctrlKey</tabstop>
|
||||||
<tabstop>leftAlt</tabstop>
|
|
||||||
<tabstop>shiftKey</tabstop>
|
<tabstop>shiftKey</tabstop>
|
||||||
<tabstop>rightAlt</tabstop>
|
|
||||||
<tabstop>rightCtrl</tabstop>
|
|
||||||
<tabstop>leftShift</tabstop>
|
|
||||||
<tabstop>winKey</tabstop>
|
<tabstop>winKey</tabstop>
|
||||||
<tabstop>useProxyServer</tabstop>
|
<tabstop>useProxyServer</tabstop>
|
||||||
<tabstop>proxyType</tabstop>
|
<tabstop>proxyType</tabstop>
|
||||||
|
|
Loading…
Reference in a new issue