summaryrefslogtreecommitdiff
path: root/seqmatcher.h
diff options
context:
space:
mode:
Diffstat (limited to 'seqmatcher.h')
-rw-r--r--seqmatcher.h44
1 files changed, 44 insertions, 0 deletions
diff --git a/seqmatcher.h b/seqmatcher.h
new file mode 100644
index 0000000..7ce6bf4
--- /dev/null
+++ b/seqmatcher.h
@@ -0,0 +1,44 @@
+#pragma once
+
+#include <functional>
+#include <vector>
+#include <variant>
+#include <unordered_map>
+#include <memory>
+#include "xutil.h"
+
+
+class SeqMatcher {
+public:
+ using Callback = std::function<void()>;
+
+ struct SymSequence {
+ std::vector<x::Keysym> syms;
+ Callback callback;
+ };
+
+ SeqMatcher(Display *dpy);
+
+ // Initialise with an initial list of sequences.
+ SeqMatcher(Display *dpy, std::vector<SymSequence> seqs);
+
+ // Register a key sequence
+ void addSequence(const std::vector<x::Keysym> &syms, Callback callback);
+
+ // Returns bel()-running callback if unrecognised sequence is given
+ std::optional<Callback> observe(const XKeyEvent &ev);
+
+ // Cancel any running sequence and restart from the beginning
+ void reset();
+
+private:
+ struct Node;
+ using NodeMap = std::unordered_map<x::Keycode, std::unique_ptr<Node>>;
+ struct Node {
+ std::variant<NodeMap, Callback> v;
+ };
+
+ Display *const dpy;
+ Node rootNode;
+ Node *curNode = &rootNode;
+};