void KwmEmitKeystroke(modifiers Mod, std::string Key) { CGEventFlags Flags = 0; if(Mod.CmdKey) Flags |= kCGEventFlagMaskCommand; if(Mod.CtrlKey) Flags |= kCGEventFlagMaskControl; if(Mod.AltKey) Flags |= kCGEventFlagMaskAlternate; if(Mod.ShiftKey) Flags |= kCGEventFlagMaskShift; CGKeyCode Keycode; bool Result = GetLayoutIndependentKeycode(Key, &Keycode); if(!Result) Result = KeycodeForChar(Key[0], &Keycode); if(Result) { CGEventRef EventKeyDown = CGEventCreateKeyboardEvent(NULL, Keycode, true); CGEventRef EventKeyUp = CGEventCreateKeyboardEvent(NULL, Keycode, false); CGEventSetFlags(EventKeyDown, Flags); CGEventSetFlags(EventKeyUp, Flags); CGEventPost(kCGHIDEventTap, EventKeyDown); CGEventPost(kCGHIDEventTap, EventKeyUp); CFRelease(EventKeyDown); CFRelease(EventKeyUp); } }
bool KwmParseHotkey(std::string KeySym, std::string Command, hotkey *Hotkey) { std::vector<std::string> KeyTokens = SplitString(KeySym, '-'); if(KeyTokens.size() != 2) return false; std::vector<std::string> Modifiers = SplitString(KeyTokens[0], '+'); for(std::size_t ModIndex = 0; ModIndex < Modifiers.size(); ++ModIndex) { if(Modifiers[ModIndex] == "cmd") Hotkey->Mod.CmdKey = true; else if(Modifiers[ModIndex] == "alt") Hotkey->Mod.AltKey = true; else if(Modifiers[ModIndex] == "ctrl") Hotkey->Mod.CtrlKey = true; else if(Modifiers[ModIndex] == "shift") Hotkey->Mod.ShiftKey = true; else if(Modifiers[ModIndex] == "prefix") Hotkey->Prefixed = true; } DetermineHotkeyState(Hotkey, Command); Hotkey->IsSystemCommand = IsPrefixOfString(Command, "sys"); Hotkey->Command = Command; CGKeyCode Keycode; bool Result = GetLayoutIndependentKeycode(KeyTokens[1], &Keycode); if(!Result) Result = KeycodeForChar(KeyTokens[1][0], &Keycode); Hotkey->Key = Keycode; return Result; }
internal bool KwmParseHotkey(std::string KeySym, std::string Command, hotkey *Hotkey, bool Passthrough, bool KeycodeInHex) { std::vector<std::string> KeyTokens = SplitString(KeySym, '-'); if(KeyTokens.size() != 2) return false; Hotkey->Mode = "default"; std::vector<std::string> Modifiers = SplitString(KeyTokens[0], '+'); for(std::size_t ModIndex = 0; ModIndex < Modifiers.size(); ++ModIndex) { if(Modifiers[ModIndex] == "cmd") Hotkey->Mod.CmdKey = true; else if(Modifiers[ModIndex] == "alt") Hotkey->Mod.AltKey = true; else if(Modifiers[ModIndex] == "ctrl") Hotkey->Mod.CtrlKey = true; else if(Modifiers[ModIndex] == "shift") Hotkey->Mod.ShiftKey = true; else Hotkey->Mode = Modifiers[ModIndex]; } DetermineHotkeyState(Hotkey, Command); Hotkey->Passthrough = Passthrough; Hotkey->Command = Command; CGKeyCode Keycode; bool Result = false; if(KeycodeInHex) { Result = true; Keycode = ConvertHexStringToInt(KeyTokens[1]); DEBUG("bindcode: " << Keycode); } else { Result = GetLayoutIndependentKeycode(KeyTokens[1], &Keycode); if(!Result) Result = KeycodeForChar(KeyTokens[1][0], &Keycode); } Hotkey->Key = Keycode; return Result; }