mirror of
https://github.com/xiaoyifang/goldendict-ng.git
synced 2024-11-27 15: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 */
|
||||
|
||||
#include "keyboardstate.hh"
|
||||
#include <QObject> // To get Qt Q_OS defines
|
||||
|
||||
#ifdef Q_OS_WIN32
|
||||
#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
|
||||
#include <QApplication>
|
||||
|
||||
bool KeyboardState::checkModifiersPressed( int mask )
|
||||
{
|
||||
#if defined( Q_OS_WIN32 )
|
||||
auto modifiers = QApplication::queryKeyboardModifiers();
|
||||
|
||||
return !( ( mask & Alt && !( GetAsyncKeyState( VK_MENU ) & 0x8000 ) )
|
||||
|| ( mask & Ctrl && !( GetAsyncKeyState( VK_CONTROL ) & 0x8000 ) )
|
||||
|| ( mask & Shift && !( GetAsyncKeyState( VK_SHIFT ) & 0x8000 ) )
|
||||
|| ( 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
|
||||
return !( ( mask & Alt && !( modifiers.testFlag( Qt::AltModifier ) ) )
|
||||
|| ( mask & Ctrl && !( modifiers.testFlag( Qt::ControlModifier ) ) )
|
||||
|| ( mask & Shift && !( modifiers.testFlag( Qt::ShiftModifier ) ) ) );
|
||||
}
|
||||
|
|
|
@ -15,13 +15,7 @@ public:
|
|||
Alt = 1,
|
||||
Ctrl = 2,
|
||||
Shift = 4,
|
||||
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
|
||||
Win = 8, // Ironically, Linux only, since it's no use under Windows
|
||||
};
|
||||
|
||||
/// 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.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.setShortcutContext( Qt::WidgetWithChildrenShortcut );
|
||||
|
||||
|
@ -206,12 +194,6 @@ Preferences::Preferences( QWidget * parent, Config::Class & cfg_ ):
|
|||
ui.ctrlKey->setChecked( p.scanPopupModifiers & KeyboardState::Ctrl );
|
||||
ui.shiftKey->setChecked( p.scanPopupModifiers & KeyboardState::Shift );
|
||||
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.scanToMainWindow->setChecked( p.scanToMainWindow );
|
||||
|
@ -250,12 +232,6 @@ Preferences::Preferences( QWidget * parent, Config::Class & cfg_ ):
|
|||
#ifdef Q_OS_WIN32
|
||||
ui.winKey->hide();
|
||||
#else
|
||||
ui.leftAlt->hide();
|
||||
ui.rightAlt->hide();
|
||||
ui.leftCtrl->hide();
|
||||
ui.rightCtrl->hide();
|
||||
ui.leftShift->hide();
|
||||
ui.rightShift->hide();
|
||||
#ifdef Q_OS_MAC
|
||||
ui.altKey->setText( "Opt" );
|
||||
ui.winKey->setText( "Ctrl" );
|
||||
|
@ -446,12 +422,6 @@ Config::Preferences Preferences::getPreferences()
|
|||
p.scanPopupModifiers += ui.ctrlKey->isChecked() ? KeyboardState::Ctrl : 0;
|
||||
p.scanPopupModifiers += ui.shiftKey->isChecked() ? KeyboardState::Shift : 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.scanToMainWindow = ui.scanToMainWindow->isChecked();
|
||||
|
@ -556,48 +526,6 @@ void Preferences::showScanFlagToggled( bool b )
|
|||
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 )
|
||||
{
|
||||
ui.mainWindowHotkey->setEnabled( checked );
|
||||
|
|
|
@ -41,14 +41,6 @@ private slots:
|
|||
void enableScanPopupModifiersToggled( bool );
|
||||
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_enableClipboardHotkey_toggled( bool checked );
|
||||
|
||||
|
|
|
@ -621,26 +621,6 @@ in the pressed state when the word selection changes.</string>
|
|||
</item>
|
||||
<item>
|
||||
<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">
|
||||
<widget class="QCheckBox" name="altKey">
|
||||
<property name="toolTip">
|
||||
|
@ -661,16 +641,6 @@ in the pressed state when the word selection changes.</string>
|
|||
</property>
|
||||
</widget>
|
||||
</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">
|
||||
<widget class="QCheckBox" name="shiftKey">
|
||||
<property name="toolTip">
|
||||
|
@ -681,36 +651,6 @@ in the pressed state when the word selection changes.</string>
|
|||
</property>
|
||||
</widget>
|
||||
</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">
|
||||
<widget class="QCheckBox" name="winKey">
|
||||
<property name="toolTip">
|
||||
|
@ -2035,15 +1975,9 @@ from Stardict, Babylon and GLS dictionaries</string>
|
|||
<tabstop>startToTray</tabstop>
|
||||
<tabstop>closeToTray</tabstop>
|
||||
<tabstop>cbAutostart</tabstop>
|
||||
<tabstop>leftCtrl</tabstop>
|
||||
<tabstop>rightShift</tabstop>
|
||||
<tabstop>altKey</tabstop>
|
||||
<tabstop>ctrlKey</tabstop>
|
||||
<tabstop>leftAlt</tabstop>
|
||||
<tabstop>shiftKey</tabstop>
|
||||
<tabstop>rightAlt</tabstop>
|
||||
<tabstop>rightCtrl</tabstop>
|
||||
<tabstop>leftShift</tabstop>
|
||||
<tabstop>winKey</tabstop>
|
||||
<tabstop>useProxyServer</tabstop>
|
||||
<tabstop>proxyType</tabstop>
|
||||
|
|
Loading…
Reference in a new issue