summaryrefslogtreecommitdiffhomepage
path: root/opentrack/shortcuts.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'opentrack/shortcuts.cpp')
-rw-r--r--opentrack/shortcuts.cpp117
1 files changed, 66 insertions, 51 deletions
diff --git a/opentrack/shortcuts.cpp b/opentrack/shortcuts.cpp
index d1cfa503..e81b6bb0 100644
--- a/opentrack/shortcuts.cpp
+++ b/opentrack/shortcuts.cpp
@@ -1,42 +1,19 @@
#include "shortcuts.h"
+#include <QMutexLocker>
-KeyboardShortcutDialog::KeyboardShortcutDialog()
-{
- ui.setupUi( this );
-
- connect(ui.buttonBox, SIGNAL(accepted()), this, SLOT(doOK()));
- connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(doCancel()));
-
- for ( int i = 0; i < global_key_sequences.size(); i++) {
- ui.cbxCenterKey->addItem(global_key_sequences.at(i));
- ui.cbxToggleKey->addItem(global_key_sequences.at(i));
- }
- tie_setting(s.center.key_index, ui.cbxCenterKey);
- tie_setting(s.center.alt, ui.chkCenterAlt);
- tie_setting(s.center.shift, ui.chkCenterShift);
- tie_setting(s.center.ctrl, ui.chkCenterCtrl);
-
- tie_setting(s.toggle.key_index, ui.cbxToggleKey);
- tie_setting(s.toggle.alt, ui.chkToggleAlt);
- tie_setting(s.toggle.shift, ui.chkToggleShift);
- tie_setting(s.toggle.ctrl, ui.chkToggleCtrl);
-}
+#if defined(_WIN32)
+#include <windows.h>
-void KeyboardShortcutDialog::doOK() {
- s.b->save();
- this->close();
- emit reload();
-}
+void KeybindingWorker::set_keys(Key kCenter_, Key kToggle_, Key kZero_)
+{
+ QMutexLocker l(&mtx);
-void KeyboardShortcutDialog::doCancel() {
- s.b->reload();
- close();
+ kCenter = kCenter_;
+ kToggle = kToggle_;
+ kZero = kZero_;
}
-#if defined(_WIN32)
-#include <windows.h>
-
KeybindingWorker::~KeybindingWorker() {
should_quit = true;
wait();
@@ -48,8 +25,8 @@ KeybindingWorker::~KeybindingWorker() {
din->Release();
}
-KeybindingWorker::KeybindingWorker(Key keyCenter, Key keyToggle, WId handle) :
- din(0), dinkeyboard(0), kCenter(keyCenter), kToggle(keyToggle), should_quit(true)
+KeybindingWorker::KeybindingWorker(Key keyCenter, Key keyToggle, Key keyZero, WId handle, Shortcuts& sc) :
+ sc(sc), din(0), dinkeyboard(0), kCenter(keyCenter), kToggle(keyToggle), kZero(keyZero), should_quit(true)
{
if (DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&din, NULL) != DI_OK) {
qDebug() << "setup DirectInput8 Creation failed!" << GetLastError();
@@ -94,7 +71,8 @@ static bool isKeyPressed( const Key *key, const BYTE *keystate ) {
bool ctrl;
bool alt;
- if (keystate[key->keycode] & 0x80) {
+ if (key->keycode != 0 && keystate[key->keycode] & 0x80)
+ {
shift = ( (keystate[DIK_LSHIFT] & 0x80) || (keystate[DIK_RSHIFT] & 0x80) );
ctrl = ( (keystate[DIK_LCONTROL] & 0x80) || (keystate[DIK_RCONTROL] & 0x80) );
alt = ( (keystate[DIK_LALT] & 0x80) || (keystate[DIK_RALT] & 0x80) );
@@ -108,12 +86,9 @@ static bool isKeyPressed( const Key *key, const BYTE *keystate ) {
return false;
}
-#define PROCESS_KEY(k, s) \
- if (isKeyPressed(&k, keystate) && (!k.ever_pressed ? (k.timer.start(), k.ever_pressed = true) : k.timer.restart() > 100)) \
- emit s;
-
void KeybindingWorker::run() {
BYTE keystate[256];
+
while (!should_quit)
{
if (dinkeyboard->GetDeviceState(256, (LPVOID)keystate) != DI_OK) {
@@ -122,10 +97,19 @@ void KeybindingWorker::run() {
continue;
}
- PROCESS_KEY(kCenter, center());
- PROCESS_KEY(kToggle, toggle());
+ QMutexLocker l(&mtx);
- Sleep(25);
+ if (isKeyPressed(&kCenter, keystate) && kCenter.should_process())
+ emit sc.center();
+
+ if (isKeyPressed(&kToggle, keystate) && kToggle.should_process())
+ emit sc.toggle();
+
+ if (isKeyPressed(&kZero, keystate) && kZero.should_process())
+ emit sc.zero();
+
+ // keypresses get dropped with high values
+ Sleep(15);
}
}
#endif
@@ -156,16 +140,47 @@ void Shortcuts::bind_keyboard_shortcut(K &key, key_opts& k)
}
}
#else
+ key = K();
int idx = k.key_index;
- if (idx > 0)
+ key.keycode = 0;
+ key.shift = key.alt = key.ctrl = 0;
+ if (idx > 0 && idx < global_windows_key_sequences.size())
+ key.keycode = global_windows_key_sequences[idx];
+ key.shift = k.shift;
+ key.alt = k.alt;
+ key.ctrl = k.ctrl;
+#endif
+}
+
+void Shortcuts::reload() {
+#ifndef _WIN32
+ if (keyCenter)
{
- key.keycode = 0;
- key.shift = key.alt = key.ctrl = 0;
- if (idx < global_windows_key_sequences.size())
- key.keycode = global_windows_key_sequences[idx];
- key.shift = k.shift;
- key.alt = k.alt;
- key.ctrl = k.ctrl;
+ keyCenter->setShortcut(QKeySequence::UnknownKey);
+ keyCenter->setEnabled(false);
+ }
+ if (keyToggle)
+ {
+ keyToggle->setShortcut(QKeySequence::UnknownKey);
+ keyToggle->setEnabled(false);
+ }
+ if (keyZero)
+ {
+ keyZero->setShortcut(QKeySequence::UnknownKey);
+ keyZero->setEnabled(false);
}
#endif
-} \ No newline at end of file
+ bind_keyboard_shortcut(keyCenter, s.center);
+ bind_keyboard_shortcut(keyToggle, s.toggle);
+ bind_keyboard_shortcut(keyZero, s.zero);
+#ifdef _WIN32
+ bool is_new = keybindingWorker == nullptr;
+ if (is_new)
+ {
+ keybindingWorker = std::make_shared<KeybindingWorker>(keyCenter, keyToggle, keyZero, handle, *this);
+ keybindingWorker->start();
+ }
+ else
+ keybindingWorker->set_keys(keyCenter, keyToggle, keyZero);
+#endif
+}