aboutsummaryrefslogtreecommitdiff
path: root/include/GlobalHotkeys/GlobalHotkeysJoystick.hpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2025-05-03 12:03:43 +0200
committerdec05eba <dec05eba@protonmail.com>2025-05-03 12:03:43 +0200
commitd08ea692771caa8e385412c2f992089672773e30 (patch)
tree994c05673d90b130e25d8bc25c6c365f607134db /include/GlobalHotkeys/GlobalHotkeysJoystick.hpp
parent180a3b73dbab2f586c53f9e5f044ab88aca95014 (diff)
Keep keyboard led when turning on global hotkeys, move files
Diffstat (limited to 'include/GlobalHotkeys/GlobalHotkeysJoystick.hpp')
-rw-r--r--include/GlobalHotkeys/GlobalHotkeysJoystick.hpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/include/GlobalHotkeys/GlobalHotkeysJoystick.hpp b/include/GlobalHotkeys/GlobalHotkeysJoystick.hpp
new file mode 100644
index 0000000..4b266cb
--- /dev/null
+++ b/include/GlobalHotkeys/GlobalHotkeysJoystick.hpp
@@ -0,0 +1,70 @@
+#pragma once
+
+#include "GlobalHotkeys.hpp"
+#include "../Hotplug.hpp"
+#include <unordered_map>
+#include <thread>
+#include <poll.h>
+#include <linux/joystick.h>
+
+namespace gsr {
+ static constexpr int max_js_poll_fd = 16;
+
+ class GlobalHotkeysJoystick : public GlobalHotkeys {
+ class GlobalHotkeysJoystickHotplugDelegate;
+ public:
+ GlobalHotkeysJoystick() = default;
+ GlobalHotkeysJoystick(const GlobalHotkeysJoystick&) = delete;
+ GlobalHotkeysJoystick& operator=(const GlobalHotkeysJoystick&) = delete;
+ ~GlobalHotkeysJoystick() override;
+
+ bool start();
+ // Currently valid ids:
+ // save_replay
+ // save_1_min_replay
+ // save_10_min_replay
+ // take_screenshot
+ // toggle_record
+ // toggle_replay
+ // toggle_show
+ bool bind_action(const std::string &id, GlobalHotkeyCallback callback) override;
+ void poll_events() override;
+ private:
+ void read_events();
+ void process_js_event(int fd, js_event &event);
+ bool add_device(const char *dev_input_filepath, bool print_error = true);
+ bool remove_device(const char *dev_input_filepath);
+ bool remove_poll_fd(int index);
+ // Returns -1 if not found
+ int get_poll_fd_index_by_dev_input_id(int dev_input_id) const;
+ private:
+ struct ExtraData {
+ int dev_input_id = 0;
+ };
+
+ std::unordered_map<std::string, GlobalHotkeyCallback> bound_actions_by_id;
+ std::thread read_thread;
+
+ pollfd poll_fd[max_js_poll_fd];
+ ExtraData extra_data[max_js_poll_fd];
+ int num_poll_fd = 0;
+ int event_fd = -1;
+ int event_index = -1;
+
+ bool playstation_button_pressed = false;
+ bool up_pressed = false;
+ bool down_pressed = false;
+ bool left_pressed = false;
+ bool right_pressed = false;
+
+ bool save_replay = false;
+ bool save_1_min_replay = false;
+ bool save_10_min_replay = false;
+ bool take_screenshot = false;
+ bool toggle_record = false;
+ bool toggle_replay = false;
+ bool toggle_show = false;
+ int hotplug_poll_index = -1;
+ Hotplug hotplug;
+ };
+} \ No newline at end of file