diff options
Diffstat (limited to 'opentrack')
-rw-r--r-- | opentrack/shortcuts.cpp | 10 | ||||
-rw-r--r-- | opentrack/shortcuts.h | 11 | ||||
-rw-r--r-- | opentrack/work.hpp | 3 |
3 files changed, 9 insertions, 15 deletions
diff --git a/opentrack/shortcuts.cpp b/opentrack/shortcuts.cpp index 059febdb..b961294f 100644 --- a/opentrack/shortcuts.cpp +++ b/opentrack/shortcuts.cpp @@ -61,7 +61,7 @@ void Shortcuts::bind_keyboard_shortcut(K &key, key_opts& k) #endif #ifdef _WIN32 -void Shortcuts::receiver(Key &k) +void Shortcuts::receiver(const Key& k) { std::vector<K*> ks { &keyCenter, &keyToggle, &keyZero }; for (K* k_ : ks) @@ -92,12 +92,4 @@ void Shortcuts::reload() { 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>([&](Key& k) { receiver(k); }, handle); - keybindingWorker->start(); - } -#endif } diff --git a/opentrack/shortcuts.h b/opentrack/shortcuts.h index 1643485e..930952e8 100644 --- a/opentrack/shortcuts.h +++ b/opentrack/shortcuts.h @@ -40,10 +40,8 @@ public: K keyCenter; K keyToggle; K keyZero; - - WId handle; #ifdef _WIN32 - mem<KeybindingWorker> keybindingWorker; + KeybindingWorker::Token key_token; #endif struct key_opts { @@ -68,13 +66,16 @@ public: {} } s; - Shortcuts(WId handle) : handle(handle) { reload(); } + Shortcuts() : key_token(KeybindingWorker::add_receiver([&](const Key& k) { receiver(k); })) + { + reload(); + } void reload(); private: void bind_keyboard_shortcut(K &key, key_opts& k); #ifdef _WIN32 - void receiver(Key& k); + void receiver(const Key& k); #endif signals: void center(); diff --git a/opentrack/work.hpp b/opentrack/work.hpp index 5d1f6b54..e338e9f4 100644 --- a/opentrack/work.hpp +++ b/opentrack/work.hpp @@ -28,7 +28,7 @@ struct Work Work(main_settings& s, Mappings& m, SelectedLibraries& libs, QObject* recv, WId handle) : s(s), libs(libs), tracker(std::make_shared<Tracker>(s, m, libs)), - sc(std::make_shared<Shortcuts>(handle)), + sc(std::make_shared<Shortcuts>()), handle(handle) { #ifndef _WIN32 @@ -50,6 +50,7 @@ struct Work ~Work() { + sc = nullptr; // order matters, otherwise use-after-free -sh tracker = nullptr; libs = SelectedLibraries(); |