diff options
| author | ItsOhen <TNordfeldt@gmail.com> | 2025-10-11 02:40:18 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-10-11 02:40:18 +0200 |
| commit | d599513d4a72d66ac62ffdedc41d6653fa81b39e (patch) | |
| tree | 9ce093a84421330da38f015d40c94941b43e6a04 /src/managers | |
| parent | 6a01c399a971a57854fb4a99ce246534139beda4 (diff) | |
config: add automatic closing to submaps (#11760)
* Allow submaps to auto reset to parent.
* Really should be a stack instead.
If hyprlang would allow for { } i would be so happy.
* Fixed: Somewhat better way to do it..
Lets you define what submap you want to go to instead.
* squash! Fixed: Somewhat better way to do it..
* God i hate cf..
* Force clang-format on the whole thing..
* Removed {}.
* Added tests
Tests and reset fix.
Diffstat (limited to 'src/managers')
| -rw-r--r-- | src/managers/KeybindManager.cpp | 14 | ||||
| -rw-r--r-- | src/managers/KeybindManager.hpp | 16 |
2 files changed, 20 insertions, 10 deletions
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index 81c88d63..c9008c2f 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -643,7 +643,7 @@ eMultiKeyCase CKeybindManager::mkBindMatches(const SP<SKeybind> keybind) { return mkKeysymSetMatches(keybind->sMkKeys, m_mkKeys); } -std::string CKeybindManager::getCurrentSubmap() { +SSubmap CKeybindManager::getCurrentSubmap() { return m_currentSelectedSubmap; } @@ -795,6 +795,8 @@ SDispatchResult CKeybindManager::handleKeybinds(const uint32_t modmask, const SP found = true; // don't process keybinds on submap change. break; } + if (k->handler != "submap" && !k->submap.reset.empty()) + setSubmap(k->submap.reset); } if (pressed && k->repeat) { @@ -2390,19 +2392,19 @@ SDispatchResult CKeybindManager::toggleSwallow(std::string args) { SDispatchResult CKeybindManager::setSubmap(std::string submap) { if (submap == "reset" || submap.empty()) { - m_currentSelectedSubmap = ""; + m_currentSelectedSubmap.name = ""; Debug::log(LOG, "Reset active submap to the default one."); g_pEventManager->postEvent(SHyprIPCEvent{"submap", ""}); - EMIT_HOOK_EVENT("submap", m_currentSelectedSubmap); + EMIT_HOOK_EVENT("submap", m_currentSelectedSubmap.name); return {}; } for (const auto& k : g_pKeybindManager->m_keybinds) { - if (k->submap == submap) { - m_currentSelectedSubmap = submap; + if (k->submap.name == submap) { + m_currentSelectedSubmap.name = submap; Debug::log(LOG, "Changed keybind submap to {}", submap); g_pEventManager->postEvent(SHyprIPCEvent{"submap", submap}); - EMIT_HOOK_EVENT("submap", m_currentSelectedSubmap); + EMIT_HOOK_EVENT("submap", m_currentSelectedSubmap.name); return {}; } } diff --git a/src/managers/KeybindManager.hpp b/src/managers/KeybindManager.hpp index 2272aa8f..45742e78 100644 --- a/src/managers/KeybindManager.hpp +++ b/src/managers/KeybindManager.hpp @@ -17,6 +17,14 @@ class IKeyboard; enum eMouseBindMode : int8_t; +struct SSubmap { + std::string name = ""; + std::string reset = ""; + bool operator==(const SSubmap& other) const { + return name == other.name; + } +}; + struct SKeybind { std::string key = ""; std::set<xkb_keysym_t> sMkKeys = {}; @@ -27,7 +35,7 @@ struct SKeybind { std::string handler = ""; std::string arg = ""; bool locked = false; - std::string submap = ""; + SSubmap submap = {}; std::string description = ""; bool release = false; bool repeat = false; @@ -63,7 +71,7 @@ struct SPressedKeyWithMods { uint32_t keycode = 0; uint32_t modmaskAtPressTime = 0; bool sent = false; - std::string submapAtPress = ""; + SSubmap submapAtPress = {}; Vector2D mousePosAtPress = {}; }; @@ -98,7 +106,7 @@ class CKeybindManager { uint32_t keycodeToModifier(xkb_keycode_t); void clearKeybinds(); void shadowKeybinds(const xkb_keysym_t& doesntHave = 0, const uint32_t doesntHaveCode = 0); - std::string getCurrentSubmap(); + SSubmap getCurrentSubmap(); std::unordered_map<std::string, std::function<SDispatchResult(std::string)>> m_dispatchers; @@ -117,7 +125,7 @@ class CKeybindManager { private: std::vector<SPressedKeyWithMods> m_pressedKeys; - inline static std::string m_currentSelectedSubmap = ""; + inline static SSubmap m_currentSelectedSubmap = {}; std::vector<WP<SKeybind>> m_activeKeybinds; WP<SKeybind> m_lastLongPressKeybind; |
