void KwmAddHotkey(std::string KeySym, std::string Command) { hotkey Hotkey = {}; if(KwmParseHotkey(KeySym, Command, &Hotkey) && !HotkeyExists(Hotkey.Mod, Hotkey.Key, NULL)) KWMHotkeys.List.push_back(Hotkey); }
void KwmAddHotkey(std::string KeySym, std::string Command, bool Passthrough, bool KeycodeInHex) { hotkey Hotkey = {}; if(KwmParseHotkey(KeySym, Command, &Hotkey, Passthrough, KeycodeInHex) && !HotkeyExists(Hotkey.Mod, Hotkey.Key, NULL, Hotkey.Mode)) KWMHotkeys.Modes[Hotkey.Mode].Hotkeys.push_back(Hotkey); }
bool KwmExecuteHotkey(modifiers Mod, CGKeyCode Keycode) { hotkey Hotkey = {}; if(HotkeyExists(Mod, Keycode, &Hotkey)) { if(KWMHotkeys.Prefix.Enabled) { CheckPrefixTimeout(); if((Hotkey.Prefixed || KWMHotkeys.Prefix.Global) && !KWMHotkeys.Prefix.Active) return false; if((Hotkey.Prefixed || KWMHotkeys.Prefix.Global) && KWMHotkeys.Prefix.Active) KWMHotkeys.Prefix.Time = std::chrono::steady_clock::now(); } if(IsHotkeyStateReqFulfilled(&Hotkey)) { if(Hotkey.Command.empty()) return true; if(Hotkey.IsSystemCommand) system(Hotkey.Command.c_str()); else KwmInterpretCommand(Hotkey.Command, 0); return true; } } return false; }
CGEventRef CGEventCallback(CGEventTapProxy Proxy, CGEventType Type, CGEventRef Event, void *Refcon) { switch(Type) { case kCGEventTapDisabledByTimeout: case kCGEventTapDisabledByUserInput: { if(!KWMMach.DisableEventTapInternal) { DEBUG("Restarting Event Tap"); CGEventTapEnable(KWMMach.EventTap, true); } } break; case kCGEventKeyDown: { if(KWMToggles.UseBuiltinHotkeys) { hotkey Eventkey = {}, Hotkey = {}; CreateHotkeyFromCGEvent(Event, &Eventkey); if(HotkeyExists(Eventkey.Mod, Eventkey.Key, &Hotkey, KWMHotkeys.ActiveMode->Name)) { KWMHotkeys.Queue.push(Hotkey); if(!Hotkey.Passthrough) return NULL; } } if(KWMMode.Focus == FocusModeAutofocus && !IsActiveSpaceFloating()) { CGEventSetIntegerValueField(Event, kCGKeyboardEventAutorepeat, 0); CGEventPostToPSN(&KWMFocus.PSN, Event); return NULL; } } break; case kCGEventKeyUp: { if(KWMMode.Focus == FocusModeAutofocus && !IsActiveSpaceFloating()) { CGEventSetIntegerValueField(Event, kCGKeyboardEventAutorepeat, 0); CGEventPostToPSN(&KWMFocus.PSN, Event); return NULL; } } break; case kCGEventMouseMoved: { pthread_mutex_lock(&KWMThread.Lock); if(!IsSpaceTransitionInProgress()) { UpdateActiveScreen(); if(KWMMode.Focus != FocusModeDisabled && KWMMode.Focus != FocusModeStandby && !IsActiveSpaceFloating()) FocusWindowBelowCursor(); } pthread_mutex_unlock(&KWMThread.Lock); } break; default: {} break; } return Event; }