From 3a7011ff73cce39ecacb4c5651c1a2dbda8eb10e Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Fri, 29 Apr 2016 09:21:10 +0200 Subject: api, main: implement new keybindings The following keybindings are now implemented: - restart tracking. if not started, starts. - toggle (keep position) while key held - zero (keep zero) while key held The latter two options only work for Windows as libqxt doesn't support them. Closes #291 --- opentrack/keybinding-worker.cpp | 4 +++- opentrack/main-settings.hpp | 8 ++++++-- opentrack/shortcuts.cpp | 19 ++++++++++--------- opentrack/shortcuts.h | 14 ++++++++++---- opentrack/tracker.h | 2 ++ opentrack/work.hpp | 16 +++++++++------- 6 files changed, 40 insertions(+), 23 deletions(-) mode change 100644 => 100755 opentrack/keybinding-worker.cpp mode change 100644 => 100755 opentrack/main-settings.hpp mode change 100644 => 100755 opentrack/shortcuts.cpp mode change 100644 => 100755 opentrack/shortcuts.h mode change 100644 => 100755 opentrack/tracker.h mode change 100644 => 100755 opentrack/work.hpp (limited to 'opentrack') diff --git a/opentrack/keybinding-worker.cpp b/opentrack/keybinding-worker.cpp old mode 100644 new mode 100755 index 39693a7c..2d133c2f --- a/opentrack/keybinding-worker.cpp +++ b/opentrack/keybinding-worker.cpp @@ -126,8 +126,9 @@ void KeybindingWorker::run() { for (int i = 0; i < 256; i++) { Key k; - if (old_keystate[i] != keystate[i] && keystate[i] & 0x80) + if (old_keystate[i] != keystate[i]) { + const bool held = keystate[i] & 0x80; switch (i) { case DIK_LCONTROL: @@ -142,6 +143,7 @@ void KeybindingWorker::run() { k.alt = !!(keystate[DIK_LALT] & 0x80) || !!(keystate[DIK_RALT] & 0x80); k.ctrl = !!(keystate[DIK_LCONTROL] & 0x80) || !!(keystate[DIK_RCONTROL] & 0x80); k.keycode = i; + k.held = held; for (auto& r : receivers) r->operator()(k); diff --git a/opentrack/main-settings.hpp b/opentrack/main-settings.hpp old mode 100644 new mode 100755 index 793c52f7..7c04fd6d --- a/opentrack/main-settings.hpp +++ b/opentrack/main-settings.hpp @@ -51,8 +51,9 @@ struct main_settings : opts { value camera_yaw, camera_pitch, camera_roll; value center_at_startup; value center_method; - key_opts key_start_tracking, key_stop_tracking, key_toggle_tracking; + key_opts key_start_tracking, key_stop_tracking, key_toggle_tracking, key_restart_tracking; key_opts key_center, key_toggle, key_zero; + key_opts key_toggle_press, key_zero_press; main_settings() : opts("opentrack-ui"), tracker_dll(b, "tracker-dll", ""), @@ -75,9 +76,12 @@ struct main_settings : opts { key_start_tracking(b, "start-tracking"), key_stop_tracking(b, "stop-tracking"), key_toggle_tracking(b, "toggle-tracking"), + key_restart_tracking(b, "restart-tracking"), key_center(b, "center"), key_toggle(b, "toggle"), - key_zero(b, "zero") + key_zero(b, "zero"), + key_toggle_press(b, "toggle-press"), + key_zero_press(b, "zero-press") { } }; diff --git a/opentrack/shortcuts.cpp b/opentrack/shortcuts.cpp old mode 100644 new mode 100755 index bab1283a..aa1006c4 --- a/opentrack/shortcuts.cpp +++ b/opentrack/shortcuts.cpp @@ -9,7 +9,7 @@ #include "shortcuts.h" #include "win32-shortcuts.h" -void Shortcuts::bind_keyboard_shortcut(K &key, const key_opts& k) +void Shortcuts::bind_keyboard_shortcut(K &key, const key_opts& k, unused(bool, held)) { #if !defined(_WIN32) using sh = QxtGlobalShortcut; @@ -56,6 +56,7 @@ void Shortcuts::bind_keyboard_shortcut(K &key, const key_opts& k) key.alt = !!(mods & Qt::AltModifier); key.ctrl = !!(mods & Qt::ControlModifier); key.keycode = idx; + key.held = held; } } #endif @@ -72,20 +73,19 @@ void Shortcuts::receiver(const Key& k) continue; if (k.keycode != k_.keycode) continue; - if (!k.held) - continue; - if (!k_.should_process()) - continue; + if (k_.held && !k.held) continue; if (k_.alt && !k.alt) continue; if (k_.ctrl && !k.ctrl) continue; if (k_.shift && !k.shift) continue; + if (!k_.should_process()) + continue; - fun(); + fun(k.held); } } #endif -void Shortcuts::reload(const std::vector > &keys_) +void Shortcuts::reload(const std::vector> &keys_) { const int sz = keys_.size(); keys = std::vector(); @@ -94,10 +94,11 @@ void Shortcuts::reload(const std::vector > &keys_) { const auto& kk = keys_[i]; const key_opts& opts = std::get<0>(kk); + const bool held = std::get<2>(kk); auto& fun = std::get<1>(kk); K k; - bind_keyboard_shortcut(k, opts); - keys.push_back(std::tuple(k, fun)); + bind_keyboard_shortcut(k, opts, held); + keys.push_back(tt(k, fun, held)); #ifndef _WIN32 connect(k.get(), &QxtGlobalShortcut::activated, fun); #endif diff --git a/opentrack/shortcuts.h b/opentrack/shortcuts.h old mode 100644 new mode 100755 index 38037923..40d41957 --- a/opentrack/shortcuts.h +++ b/opentrack/shortcuts.h @@ -26,6 +26,12 @@ # include "keybinding-worker.hpp" #endif +#ifdef __GNUC__ +# define unused(t, i) t __attribute__((unused)) i +#else +# define unused(t, i) t i +#endif + using namespace options; struct OPENTRACK_EXPORT Shortcuts : public QObject { @@ -40,8 +46,8 @@ public: #endif ; - using fun = std::function; - using tt = std::tuple; + using fun = std::function; + using tt = std::tuple; std::vector keys; #ifdef _WIN32 KeybindingWorker::Token key_token; @@ -53,9 +59,9 @@ public: #endif {} - void reload(const std::vector > &keys); + void reload(const std::vector> &keys); private: - void bind_keyboard_shortcut(K &key, const key_opts& k); + void bind_keyboard_shortcut(K &key, const key_opts& k, bool held); #ifdef _WIN32 void receiver(const Key& k); #endif diff --git a/opentrack/tracker.h b/opentrack/tracker.h old mode 100644 new mode 100755 index 36b5cad4..079ce473 --- a/opentrack/tracker.h +++ b/opentrack/tracker.h @@ -81,6 +81,8 @@ public: void get_raw_and_mapped_poses(double* mapped, double* raw) const; void start() { QThread::start(); } void toggle_enabled() { qDebug() << "toggle enabled"; enabledp = !enabledp; } + void set_toggle(bool value) { qDebug() << "enabled" << value; enabledp = value; } + void set_zero(bool value) { qDebug() << "zero" << value; zero_ = value; } void center() { qDebug() << "toggle center"; centerp = !centerp; } void zero() { qDebug() << "toggle zero"; zero_ = !zero_; } }; diff --git a/opentrack/work.hpp b/opentrack/work.hpp old mode 100644 new mode 100755 index 4188b937..3b65ba52 --- a/opentrack/work.hpp +++ b/opentrack/work.hpp @@ -27,9 +27,9 @@ struct Work mem tracker; mem sc; WId handle; - using fn = std::function; - using tt = std::tuple; - std::vector> keys; + using fn = std::function; + using tt = std::tuple; + std::vector keys; Work(main_settings& s, Mappings& m, SelectedLibraries& libs, WId handle) : s(s), libs(libs), @@ -37,13 +37,15 @@ struct Work sc(std::make_shared()), handle(handle), keys { - tt(s.key_center, [&]() -> void { tracker->center(); }), - tt(s.key_toggle, [&]() -> void { tracker->toggle_enabled(); }), - tt(s.key_zero, [&]() -> void { tracker->zero(); }), + tt(s.key_center, [&](bool) -> void { tracker->center(); }, true), + tt(s.key_toggle, [&](bool) -> void { tracker->toggle_enabled(); }, true), + tt(s.key_zero, [&](bool) -> void { tracker->zero(); }, true), + tt(s.key_toggle_press, [&](bool x) -> void { tracker->set_toggle(!x); }, false), + tt(s.key_zero_press, [&](bool x) -> void { tracker->set_zero(x); }, false), } { reload_shortcuts(); - tracker->start(); + tracker->start(); } void reload_shortcuts() -- cgit v1.2.3