From f885ae67f13ab26dcc47d3fa9cc31ee2fea58c50 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 30 Nov 2024 21:52:07 +0100 Subject: Re-add escape button to go back to the previous page/close --- include/Overlay.hpp | 11 +++++++++++ src/Overlay.cpp | 29 +++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/include/Overlay.hpp b/include/Overlay.hpp index 4376893..e6b65e3 100644 --- a/include/Overlay.hpp +++ b/include/Overlay.hpp @@ -14,6 +14,8 @@ #include #include +#include + namespace gsr { class DropdownButton; @@ -56,6 +58,7 @@ namespace gsr { private: void xi_setup(); void handle_xi_events(); + void process_key_bindings(mgl::Event &event); void xi_setup_fake_cursor(); void xi_grab_all_devices(); void xi_warp_pointer(mgl::vec2i position); @@ -93,6 +96,12 @@ namespace gsr { void force_window_on_top(); private: + using KeyBindingCallback = std::function; + struct KeyBinding { + mgl::Event::KeyEvent key_event; + KeyBindingCallback callback; + }; + std::unique_ptr window; mgl::Event event; std::string resources_path; @@ -147,5 +156,7 @@ namespace gsr { int xi_opcode = 0; XEvent *xi_input_xev = nullptr; XEvent *xi_output_xev = nullptr; + + std::array key_bindings; }; } \ No newline at end of file diff --git a/src/Overlay.cpp b/src/Overlay.cpp index f600176..f24c7d0 100644 --- a/src/Overlay.cpp +++ b/src/Overlay.cpp @@ -362,6 +362,15 @@ namespace gsr { // TODO: //xi_setup(); + key_bindings[0].key_event.code = mgl::Keyboard::Escape; + key_bindings[0].key_event.alt = false; + key_bindings[0].key_event.control = false; + key_bindings[0].key_event.shift = false; + key_bindings[0].key_event.system = false; + key_bindings[0].callback = [this]() { + page_stack.pop(); + }; + memset(&window_texture, 0, sizeof(window_texture)); std::optional new_config = read_config(gsr_info); @@ -528,6 +537,24 @@ namespace gsr { } } + static uint32_t key_event_to_bitmask(mgl::Event::KeyEvent key_event) { + return ((uint32_t)key_event.alt << (uint32_t)0) + | ((uint32_t)key_event.control << (uint32_t)1) + | ((uint32_t)key_event.shift << (uint32_t)2) + | ((uint32_t)key_event.system << (uint32_t)3); + } + + void Overlay::process_key_bindings(mgl::Event &event) { + if(event.type != mgl::Event::KeyReleased) + return; + + const uint32_t event_key_bitmask = key_event_to_bitmask(event.key); + for(const KeyBinding &key_binding : key_bindings) { + if(event.key.code == key_binding.key_event.code && event_key_bitmask == key_event_to_bitmask(key_binding.key_event)) + key_binding.callback(); + } + } + void Overlay::handle_events() { if(!visible || !window) return; @@ -548,6 +575,8 @@ namespace gsr { if(!page_stack.on_event(event, *window, mgl::vec2f(0.0f, 0.0f))) return; + + process_key_bindings(event); } bool Overlay::draw() { -- cgit v1.2.3