diff options
| author | BossCode45 <human.cyborg42@gmail.com> | 2024-10-01 14:54:37 +1300 |
|---|---|---|
| committer | BossCode45 <human.cyborg42@gmail.com> | 2024-10-01 14:54:37 +1300 |
| commit | 915532bf8fbda9ba2a36e04fcd6acc67c6c68fa5 (patch) | |
| tree | 0d7a7569ab5fc30c90d5df91a54d312c764cf328 /keybinds.cpp | |
| parent | f998705c5a0e50021875a811537962083b73ed26 (diff) | |
| download | YATwm-915532bf8fbda9ba2a36e04fcd6acc67c6c68fa5.tar.gz YATwm-915532bf8fbda9ba2a36e04fcd6acc67c6c68fa5.zip | |
Restructure
Diffstat (limited to 'keybinds.cpp')
| -rw-r--r-- | keybinds.cpp | 282 |
1 files changed, 0 insertions, 282 deletions
diff --git a/keybinds.cpp b/keybinds.cpp deleted file mode 100644 index c41452f..0000000 --- a/keybinds.cpp +++ /dev/null @@ -1,282 +0,0 @@ -#include <X11/X.h> -#include <X11/Xlib.h> -#include <cctype> -#include <iostream> -#include <sstream> -#include <utility> -#include <vector> -#include <regex> - -#include "commands.h" -#include "error.h" -#include "keybinds.h" -#include "util.h" - -using std::string; - -bool Keybind::operator<(const Keybind &o) const { - if(key != o.key) - { - return key < o.key; - } - else return modifiers < o.modifiers; -} -bool Keybind::operator==(const Keybind &o) const { - return (key == o.key && modifiers == o.modifiers); -} - -KeybindsModule::KeybindsModule(CommandsModule& commandsModule, Config& cfg, Globals& globals, void (*updateMousePos)()) - :commandsModule(commandsModule), - globals(globals), - cfg(cfg) -{ - commandsModule.addCommand("bind", &KeybindsModule::bind, 2, {STR, STR_REST}, this); - commandsModule.addCommand("quitkey", &KeybindsModule::quitKey, 1, {STR}, this); - commandsModule.addCommand("bindmode", &KeybindsModule::bindMode, 1, {STR}, this); - - bindModes = { - {"normal", &KeybindsModule::normalBindMode}, - {"emacs", &KeybindsModule::emacsBindMode} - }; - bindFunc = &KeybindsModule::normalBindMode; - - this->updateMousePos = updateMousePos; - keyMaps.insert({0, std::map<Keybind, KeyFunction>()}); -} - -void KeybindsModule::changeMap(int newMapID) -{ - if(currentMapID == newMapID) - return; - if(currentMapID != 0) - XUngrabKeyboard(globals.dpy, CurrentTime); - XUngrabButton(globals.dpy, AnyKey, AnyModifier, globals.root); - currentMapID = newMapID; - if(newMapID == 0) - { - for(std::pair<Keybind, KeyFunction> pair : getKeymap(currentMapID)) - { - Keybind bind = pair.first; - XGrabKey(globals.dpy, bind.key, bind.modifiers, globals.root, false, GrabModeAsync, GrabModeAsync); - } - } - else - { - XGrabKeyboard(globals.dpy, globals.root, false, GrabModeAsync, GrabModeAsync, CurrentTime); - } -} - -const void KeybindsModule::handleKeypress(XKeyEvent e) -{ - if(e.same_screen!=1) return; - // cout << "Key Pressed" << endl; - // cout << "\tState: " << e.state << endl; - // cout << "\tCode: " << XKeysymToString(XKeycodeToKeysym(globals.dpy, e.keycode, 0)) << endl; - updateMousePos(); - - const unsigned int masks = ShiftMask | ControlMask | Mod1Mask | Mod4Mask; - Keybind k = {(KeyCode)e.keycode, e.state & masks}; - if(k == exitBind) - { - changeMap(0); - } - else if(getKeymap(currentMapID).count(k) > 0) - { - KeyFunction& c = getKeymap(currentMapID).find(k)->second; - if(getKeymap(c.mapID).size() == 0) - { - commandsModule.runCommand(c.command); - changeMap(0); - } - else - { - XUngrabButton(globals.dpy, AnyKey, AnyModifier, globals.root); - changeMap(c.mapID); - } - } - else if(std::find(std::begin(ignoredKeys), std::end(ignoredKeys), e.keycode) == std::end(ignoredKeys)) - { - changeMap(0); - } -} - -bool isUpper(const std::string& s) { - return std::all_of(s.begin(), s.end(), [](unsigned char c){ return std::isupper(c); }); -} - -const void KeybindsModule::bindMode(const CommandArg* argv) -{ - if(bindModes.count(argv[0].str) < 1) - { - throw Err(CFG_ERR_KEYBIND, "Bind mode: " + string(argv[0].str) + " does not exist"); - } - else - { - bindFunc = bindModes.find(argv[0].str)->second; - } -} - -Keybind KeybindsModule::getKeybind(std::string bindString) -{ - return (this->*bindFunc)(bindString); -} - -const Keybind KeybindsModule::normalBindMode(string bindString) -{ - std::vector<string> keys = split(bindString, '+'); - Keybind bind; - bind.modifiers = 0; - for(string key : keys) - { - if(key == "mod") - { - bind.modifiers |= Mod4Mask >> 3 * cfg.swapSuperAlt; - } - else if(key == "alt") - { - bind.modifiers |= Mod1Mask << 3 * cfg.swapSuperAlt; - } - else if(key == "shift") - { - bind.modifiers |= ShiftMask; - } - else if(key == "control") - { - bind.modifiers |= ControlMask; - } - else - { - if(isUpper(key)) - { - bind.modifiers |= ShiftMask; - } - KeySym s = XStringToKeysym(key.c_str()); - if(s == NoSymbol) - { - throw Err(CFG_ERR_KEYBIND, "Keybind '" + bindString + "' is invalid!"); - } - bind.key = XKeysymToKeycode(globals.dpy, s); - } - } - if(!bind.key) - throw Err(CFG_ERR_KEYBIND, "Keybind '" + bindString + "' is invalid!"); - return bind; -} - -const Keybind KeybindsModule::emacsBindMode(string bindString) -{ - Keybind bind; - bind.modifiers = 0; - - const std::regex keyRegex("^(?:([CMs])-)?(?:([CMs])-)?(?:([CMs])-)?([^\\s]|(SPC|ESC|RET|))$"); - std::smatch keyMatch; - if(std::regex_match(bindString, keyMatch, keyRegex)) - { - for (int i = 1; i < 3; i++) - { - std::ssub_match modifierMatch = keyMatch[i]; - if(modifierMatch.matched) - { - std::string modifier = modifierMatch.str(); - if(modifier == "s") - { - bind.modifiers |= Mod4Mask >> 3 * cfg.swapSuperAlt; - } - else if(modifier == "M") - { - bind.modifiers |= Mod1Mask << 3 * cfg.swapSuperAlt; - } - else if(modifier == "C") - { - bind.modifiers |= ControlMask; - } - } - } - } - KeySym keySym = XStringToKeysym(keyMatch[4].str().c_str()); - - if(isUpper(keyMatch[4].str().c_str()) && keySym != NoSymbol) - { - bind.modifiers |= ShiftMask; - } - if(keySym == NoSymbol) - { - if(keyMatch[4].str() == "RET") - keySym = XK_Return; - else if(keyMatch[4].str() == "ESC") - keySym = XK_Escape; - else if(keyMatch[4].str() == "SPC") - keySym = XK_space; - else if(keyMatch[4].str() == "-") - keySym = XK_minus; - else if(keyMatch[4].str() == "+") - keySym = XK_plus; - else - throw Err(CFG_ERR_KEYBIND, "Keybind '" + bindString + "' is invalid"); - } - bind.key = XKeysymToKeycode(globals.dpy, keySym); - - return bind; -} - -const void KeybindsModule::bind(const CommandArg* argv) -{ - std::vector<Err> errs = commandsModule.checkCommand(argv[1].str); - for(Err e : errs) - { - if(e.code != NOERR) - { - e.message = "Binding fail - " + e.message; - throw e; - } - } - std::vector<string> keys = split(argv[0].str, ' '); - int currentBindingMap = 0; - for(int i = 0; i < keys.size() - 1; i++) - { - Keybind bind = getKeybind(keys[i]); - if(getKeymap(currentBindingMap).count(bind) > 0) - { - currentBindingMap = getKeymap(currentBindingMap).find(bind)->second.mapID; - } - else - { - KeyFunction newMap = {"", nextKeymapID}; - keyMaps.insert({nextKeymapID, std::map<Keybind, KeyFunction>()}); - nextKeymapID++; - getKeymap(currentBindingMap).insert({bind, newMap}); - currentBindingMap = getKeymap(currentBindingMap).find(bind)->second.mapID; - } - } - Keybind bind = getKeybind(keys[keys.size() - 1]); - if(getKeymap(currentBindingMap).count(bind) <= 0) - { - KeyFunction function = {argv[1].str, nextKeymapID}; - keyMaps.insert({nextKeymapID, std::map<Keybind, KeyFunction>()}); - nextKeymapID++; - getKeymap(currentBindingMap).insert({bind, function}); - if(currentBindingMap == currentMapID) - { - KeyCode c = XKeysymToKeycode(globals.dpy, bind.key); - XGrabKey(globals.dpy, c, bind.modifiers, globals.root, false, GrabModeAsync, GrabModeAsync); - } - } - else - { - throw Err(CFG_ERR_KEYBIND, "Bind is a keymap already!"); - } - // cout << "Added bind" << endl; - // cout << "\t" << argv[0].str << endl; -} - -const void KeybindsModule::quitKey(const CommandArg* argv) -{ - exitBind = getKeybind(argv[0].str); -} - -const void KeybindsModule::clearKeybinds() -{ - XUngrabButton(globals.dpy, AnyKey, AnyModifier, globals.root); - keyMaps = std::map<int, std::map<Keybind, KeyFunction>>(); - keyMaps.insert({0, std::map<Keybind, KeyFunction>()}); -} |
