From f885ae67f13ab26dcc47d3fa9cc31ee2fea58c50 Mon Sep 17 00:00:00 2001
From: dec05eba <dec05eba@protonmail.com>
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 <mglpp/graphics/Text.hpp>
 #include <mglpp/system/Clock.hpp>
 
+#include <array>
+
 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<void()>;
+        struct KeyBinding {
+            mgl::Event::KeyEvent key_event;
+            KeyBindingCallback callback;
+        };
+
         std::unique_ptr<mgl::Window> 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<KeyBinding, 1> 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<Config> 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-70-g09d2