summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2015-12-05 23:30:43 +0100
committerStanislaw Halik <sthalik@misaki.pl>2015-12-05 23:30:43 +0100
commit578749c5b7f245aac08c4e514d2767dba059c4db (patch)
treeb3706f7342372d1efb2bd646b28b74abe371701b
parentf9a6946d26dca681a14a5aacf523414dbc6bdfb3 (diff)
api/keys: fix multiple shortcut receivers
We can't depend on std::vector's address of array subscript to remain constant, duh.
-rw-r--r--opentrack/keybinding-worker.cpp15
-rw-r--r--opentrack/keybinding-worker.hpp20
2 files changed, 16 insertions, 19 deletions
diff --git a/opentrack/keybinding-worker.cpp b/opentrack/keybinding-worker.cpp
index 3c801cf2..9ff825a0 100644
--- a/opentrack/keybinding-worker.cpp
+++ b/opentrack/keybinding-worker.cpp
@@ -119,7 +119,7 @@ void KeybindingWorker::run() {
k.held = held;
for (auto& r : receivers)
- r(k);
+ r->operator()(k);
};
joy_ctx.poll(f);
@@ -147,7 +147,7 @@ void KeybindingWorker::run() {
k.keycode = i;
for (auto& r : receivers)
- r(k);
+ r->operator()(k);
break;
}
}
@@ -160,12 +160,13 @@ void KeybindingWorker::run() {
}
}
-KeybindingWorker::fun* KeybindingWorker::_add_receiver(KeybindingWorker::fun receiver)
+KeybindingWorker::fun* KeybindingWorker::_add_receiver(fun& receiver)
{
QMutexLocker l(&mtx);
- receivers.push_back(receiver);
- qDebug() << "add receiver" << (long) &receivers[receivers.size()-1];
- return &receivers[receivers.size()-1];
+ receivers.push_back(std::unique_ptr<fun>(new fun(receiver)));
+ fun* f = receivers[receivers.size() - 1].get();
+ qDebug() << "add receiver" << (long) f;
+ return f;
}
void KeybindingWorker::remove_receiver(KeybindingWorker::fun* pos)
@@ -175,7 +176,7 @@ void KeybindingWorker::remove_receiver(KeybindingWorker::fun* pos)
for (int i = receivers.size() - 1; i >= 0; i--)
{
- if (&receivers[i] == pos)
+ if (receivers[i].get() == pos)
{
ok = true;
qDebug() << "remove receiver" << (long) pos;
diff --git a/opentrack/keybinding-worker.hpp b/opentrack/keybinding-worker.hpp
index 5b669331..c8d8e009 100644
--- a/opentrack/keybinding-worker.hpp
+++ b/opentrack/keybinding-worker.hpp
@@ -47,8 +47,8 @@ private:
LPDIRECTINPUTDEVICE8 dinkeyboard;
win32_joy_ctx& joy_ctx;
volatile bool should_quit;
- using fun = std::function<void(Key&)>;
- std::vector<fun> receivers;
+ using fun = std::function<void(const Key&)>;
+ std::vector<std::unique_ptr<fun>> receivers;
QMutex mtx;
void run() override;
@@ -57,27 +57,23 @@ private:
KeybindingWorker(const KeybindingWorker&) = delete;
KeybindingWorker& operator=(KeybindingWorker&) = delete;
static KeybindingWorker& make();
- fun* _add_receiver(fun receiver);
+ fun* _add_receiver(fun &receiver);
void remove_receiver(fun* pos);
~KeybindingWorker();
public:
class Token
{
fun* pos;
- //Token(const Token&) = delete;
+ Token(const Token&) = delete;
Token& operator=(Token&) = delete;
public:
- Token(fun receiver)
- {
- pos = make()._add_receiver(receiver);
- }
~Token()
{
make().remove_receiver(pos);
}
+ Token(fun receiver)
+ {
+ pos = make()._add_receiver(receiver);
+ }
};
- static Token add_receiver(fun receiver)
- {
- return Token(receiver);
- }
};