From b897a1b64e4627733c29f40698e9faf438f28099 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Mon, 6 Dec 2021 15:04:47 +0100 Subject: [PATCH] Better mod parsing --- src/KeybindManager.cpp | 27 +++++++++------------------ src/KeybindManager.hpp | 2 +- src/config/ConfigManager.cpp | 17 ++++------------- src/defines.hpp | 4 +++- src/events/events.cpp | 2 +- src/utilities/Keybind.cpp | 2 +- src/utilities/Keybind.hpp | 14 ++------------ 7 files changed, 21 insertions(+), 47 deletions(-) diff --git a/src/KeybindManager.cpp b/src/KeybindManager.cpp index da27d47..6d3a163 100644 --- a/src/KeybindManager.cpp +++ b/src/KeybindManager.cpp @@ -50,25 +50,16 @@ uint32_t KeybindManager::getKeyCodeFromName(std::string name) { return 0; } -unsigned int KeybindManager::modToMask(MODS mod) { - switch(mod) { - case MOD_NONE: - return 0; - case MOD_SUPER: - return XCB_MOD_MASK_4; - case MOD_SHIFT: - return XCB_MOD_MASK_SHIFT; - case MOD_SHIFTSUPER: - return XCB_MOD_MASK_4 | XCB_MOD_MASK_SHIFT; - case MOD_SHIFTCTRL: - return XCB_MOD_MASK_SHIFT | XCB_MOD_MASK_CONTROL; - case MOD_CTRL: - return XCB_MOD_MASK_CONTROL; - case MOD_CTRLSUPER: - return XCB_MOD_MASK_CONTROL | XCB_MOD_MASK_4; - } +unsigned int KeybindManager::modToMask(std::string mod) { - return 0; + unsigned int sum = 0; + + if (CONTAINS(mod, "SUPER") || CONTAINS(mod, "MOD4")) sum |= XCB_MOD_MASK_4; + if (CONTAINS(mod, "SHIFT")) sum |= XCB_MOD_MASK_SHIFT; + if (CONTAINS(mod, "CTRL")) sum |= XCB_MOD_MASK_CONTROL; + if (CONTAINS(mod, "ALT") || CONTAINS(mod, "MOD1")) sum |= XCB_MOD_MASK_1; + + return sum; } xcb_keysym_t KeybindManager::getKeysymFromKeycode(xcb_keycode_t keycode) { diff --git a/src/KeybindManager.hpp b/src/KeybindManager.hpp index b1c38ae..eb0948a 100644 --- a/src/KeybindManager.hpp +++ b/src/KeybindManager.hpp @@ -9,7 +9,7 @@ namespace KeybindManager { inline std::vector keybinds; - unsigned int modToMask(MODS); + unsigned int modToMask(std::string); Keybind* findKeybindByKey(int mod, xcb_keysym_t keysym); xcb_keysym_t getKeysymFromKeycode(xcb_keycode_t keycode); diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 7ba6563..ff76e6b 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -97,15 +97,6 @@ void handleBind(const std::string& command, const std::string& value) { const auto COMMAND = valueCopy; - MODS mod = MOD_NONE; - - if (MOD == "SUPER") mod = MOD_SUPER; - else if (MOD == "SHIFT") mod = MOD_SHIFT; - else if (MOD == "SUPERSHIFT" || MOD == "SHIFTSUPER") mod = MOD_SHIFTSUPER; - else if (MOD == "SUPERCTRL" || MOD == "CTRLSUPER") mod = MOD_CTRLSUPER; - else if (MOD == "CTRL") mod = MOD_CTRL; - else if (MOD == "CTRLSHIFT" || MOD == "SHIFTCTRL") mod = MOD_SHIFTCTRL; - Dispatcher dispatcher = nullptr; if (HANDLER == "exec") dispatcher = KeybindManager::call; if (HANDLER == "killactive") dispatcher = KeybindManager::killactive; @@ -117,7 +108,7 @@ void handleBind(const std::string& command, const std::string& value) { if (HANDLER == "togglefloating") dispatcher = KeybindManager::toggleActiveWindowFloating; if (dispatcher) - KeybindManager::keybinds.push_back(Keybind(mod, KEY, COMMAND, dispatcher)); + KeybindManager::keybinds.push_back(Keybind(KeybindManager::modToMask(MOD), KEY, COMMAND, dispatcher)); } void handleRawExec(const std::string& command, const std::string& args) { @@ -359,7 +350,7 @@ void ConfigManager::applyKeybindsToX() { for (auto& keybind : KeybindManager::keybinds) { xcb_grab_key(g_pWindowManager->DisplayConnection, 1, g_pWindowManager->Screen->root, - KeybindManager::modToMask(keybind.getMod()), KeybindManager::getKeycodeFromKeysym(keybind.getKeysym()), + keybind.getMod(), KeybindManager::getKeycodeFromKeysym(keybind.getKeysym()), XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC); } @@ -369,12 +360,12 @@ void ConfigManager::applyKeybindsToX() { xcb_grab_button(g_pWindowManager->DisplayConnection, 0, g_pWindowManager->Screen->root, XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, g_pWindowManager->Screen->root, XCB_NONE, - 1, KeybindManager::modToMask(MOD_SUPER)); + 1, KeybindManager::modToMask("SUPER")); xcb_grab_button(g_pWindowManager->DisplayConnection, 0, g_pWindowManager->Screen->root, XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, g_pWindowManager->Screen->root, XCB_NONE, - 3, KeybindManager::modToMask(MOD_SUPER)); + 3, KeybindManager::modToMask("SUPER")); xcb_flush(g_pWindowManager->DisplayConnection); } diff --git a/src/defines.hpp b/src/defines.hpp index 1606794..821ab30 100644 --- a/src/defines.hpp +++ b/src/defines.hpp @@ -77,4 +77,6 @@ #define ALPHA(c) ((double)(((c) >> 24) & 0xff) / 255.0) #define RED(c) ((double)(((c) >> 16) & 0xff) / 255.0) #define GREEN(c) ((double)(((c) >> 8) & 0xff) / 255.0) -#define BLUE(c) ((double)(((c)) & 0xff) / 255.0) \ No newline at end of file +#define BLUE(c) ((double)(((c)) & 0xff) / 255.0) + +#define CONTAINS(s, f) s.find(f) != std::string::npos \ No newline at end of file diff --git a/src/events/events.cpp b/src/events/events.cpp index cf9b380..60d5615 100644 --- a/src/events/events.cpp +++ b/src/events/events.cpp @@ -394,7 +394,7 @@ void Events::eventKeyPress(xcb_generic_event_t* event) { const auto KEYSYM = KeybindManager::getKeysymFromKeycode(E->detail); for (auto& keybind : KeybindManager::keybinds) { - if (keybind.getKeysym() != 0 && keybind.getKeysym() == KEYSYM && KeybindManager::modToMask(keybind.getMod()) == E->state) { + if (keybind.getKeysym() != 0 && keybind.getKeysym() == KEYSYM && keybind.getMod() == E->state) { keybind.getDispatcher()(keybind.getCommand()); return; // TODO: fix duplicating keybinds diff --git a/src/utilities/Keybind.cpp b/src/utilities/Keybind.cpp index a49cbfc..79d44cc 100644 --- a/src/utilities/Keybind.cpp +++ b/src/utilities/Keybind.cpp @@ -1,6 +1,6 @@ #include "Keybind.hpp" -Keybind::Keybind(MODS mod, xcb_keysym_t keysym, std::string comm, Dispatcher disp) { +Keybind::Keybind(unsigned int mod, xcb_keysym_t keysym, std::string comm, Dispatcher disp) { this->m_iMod = mod; this->m_Keysym = keysym; this->m_szCommand = comm; diff --git a/src/utilities/Keybind.hpp b/src/utilities/Keybind.hpp index 7c05e8d..24735ff 100644 --- a/src/utilities/Keybind.hpp +++ b/src/utilities/Keybind.hpp @@ -3,22 +3,12 @@ typedef void (*Dispatcher)(std::string); -enum MODS { - MOD_NONE = 0, - MOD_SUPER, - MOD_SHIFT, - MOD_SHIFTSUPER, - MOD_SHIFTCTRL, - MOD_CTRL, - MOD_CTRLSUPER -}; - class Keybind { public: - Keybind(MODS, xcb_keysym_t, std::string, Dispatcher); + Keybind(unsigned int, xcb_keysym_t, std::string, Dispatcher); ~Keybind(); - EXPOSED_MEMBER(Mod, MODS, i); + EXPOSED_MEMBER(Mod, unsigned int, i); EXPOSED_MEMBER(Keysym, xcb_keysym_t,); EXPOSED_MEMBER(Command, std::string, sz); EXPOSED_MEMBER(Dispatcher, Dispatcher, p);