void KwmActivateBindingMode(std::string Mode) { mode *BindingMode = GetBindingMode(Mode); if(!DoesBindingModeExist(Mode)) BindingMode = GetBindingMode("default"); KWMHotkeys.ActiveMode = BindingMode; UpdateBorder("focused"); if(BindingMode->Prefix) BindingMode->Time = std::chrono::steady_clock::now(); }
internal void KwmModeCommand(std::vector<std::string> &Tokens) { if(Tokens[1] == "activate") KwmActivateBindingMode(Tokens[2]); else { std::string Mode = Tokens[1]; mode *BindingMode = GetBindingMode(Mode); if(Tokens[2] == "color") { BindingMode->Color = ConvertHexRGBAToColor(ConvertHexStringToInt(Tokens[3])); CreateColorFormat(&BindingMode->Color); } else if(Tokens[2] == "prefix") { if(Tokens[3] == "on") BindingMode->Prefix = true; else if(Tokens[3] == "off") BindingMode->Prefix = false; } else if(Tokens[2] == "timeout") { BindingMode->Timeout = ConvertStringToDouble(Tokens[3]); } else if(Tokens[2] == "restore") { BindingMode->Restore = Tokens[3]; } } }
internal void KwmInit() { if(!CheckPrivileges()) Fatal("Could not access OSX Accessibility!"); if (pthread_mutex_init(&KWMThread.Lock, NULL) != 0) Fatal("Could not create mutex!"); if(KwmStartDaemon()) pthread_create(&KWMThread.Daemon, NULL, &KwmDaemonHandleConnectionBG, NULL); else Fatal("Kwm: Could not start daemon.."); signal(SIGSEGV, SignalHandler); signal(SIGABRT, SignalHandler); signal(SIGTRAP, SignalHandler); signal(SIGTERM, SignalHandler); signal(SIGKILL, SignalHandler); signal(SIGINT, SignalHandler); KWMScreen.SplitRatio = 0.5; KWMScreen.SplitMode = SPLIT_OPTIMAL; KWMScreen.PrevSpace = -1; KWMScreen.DefaultOffset = CreateDefaultScreenOffset(); KWMScreen.MaxCount = 5; KWMScreen.ActiveCount = 0; KWMToggles.EnableTilingMode = true; KWMToggles.UseBuiltinHotkeys = true; KWMToggles.UseMouseFollowsFocus = true; KWMTiling.OptimalRatio = 1.618; KWMTiling.LockToContainer = true; KWMTiling.MonitorWindows = true; KWMMode.Space = SpaceModeBSP; KWMMode.Focus = FocusModeAutoraise; KWMMode.Cycle = CycleModeScreen; FocusedBorder.Radius = -1; MarkedBorder.Radius = -1; KWMPath.ConfigFile = "kwmrc"; KWMPath.ConfigFolder = ".kwm"; KWMPath.BSPLayouts = "layouts"; KWMHotkeys.ActiveMode = GetBindingMode("default"); GetKwmFilePath(); KwmExecuteConfig(); GetActiveDisplays(); KwmExecuteInitScript(); pthread_create(&KWMThread.WindowMonitor, NULL, &KwmWindowMonitor, NULL); pthread_create(&KWMThread.Hotkey, NULL, &KwmMainHotkeyTrigger, NULL); FocusWindowOfOSX(); }
void KwmClearSettings() { std::map<int, CFTypeRef>::iterator It; for(It = KWMTiling.AllowedWindowRoles.begin(); It != KWMTiling.AllowedWindowRoles.end(); ++It) CFRelease(It->second); KWMTiling.AllowedWindowRoles.clear(); KWMHotkeys.Modes.clear(); KWMTiling.WindowRules.clear(); KWMTiling.SpaceSettings.clear(); KWMTiling.DisplaySettings.clear(); KWMTiling.EnforcedWindows.clear(); KWMHotkeys.ActiveMode = GetBindingMode("default"); }
void KwmRemoveHotkey(std::string KeySym, bool KeycodeInHex) { hotkey NewHotkey = {}; if(KwmParseHotkey(KeySym, "", &NewHotkey, false, KeycodeInHex)) { mode *BindingMode = GetBindingMode(NewHotkey.Mode); for(std::size_t HotkeyIndex = 0; HotkeyIndex < BindingMode->Hotkeys.size(); ++HotkeyIndex) { hotkey *CurrentHotkey = &BindingMode->Hotkeys[HotkeyIndex]; if(HotkeysAreEqual(CurrentHotkey, &NewHotkey)) { BindingMode->Hotkeys.erase(BindingMode->Hotkeys.begin() + HotkeyIndex); break; } } } }
bool HotkeyExists(modifiers Mod, CGKeyCode Keycode, hotkey *Hotkey, std::string Mode) { hotkey TempHotkey = {}; TempHotkey.Mod = Mod; TempHotkey.Key = Keycode; mode *BindingMode = GetBindingMode(Mode); for(std::size_t HotkeyIndex = 0; HotkeyIndex < BindingMode->Hotkeys.size(); ++HotkeyIndex) { hotkey *CheckHotkey = &BindingMode->Hotkeys[HotkeyIndex]; if(HotkeysAreEqual(CheckHotkey, &TempHotkey)) { if(Hotkey) *Hotkey = *CheckHotkey; return true; } } return false; }
internal void KwmConfigCommand(std::vector<std::string> &Tokens) { if(Tokens[1] == "reload") { KwmReloadConfig(); } else if(Tokens[1] == "optimal-ratio") { KWMSettings.OptimalRatio = ConvertStringToDouble(Tokens[2]); } else if(Tokens[1] == "border") { if(Tokens[2] == "focused") { if(Tokens[3] == "on") { FocusedBorder.Enabled = true; UpdateBorder("focused"); } else if(Tokens[3] == "off") { FocusedBorder.Enabled = false; UpdateBorder("focused"); } else if(Tokens[3] == "size") { FocusedBorder.Width = ConvertStringToInt(Tokens[4]); } else if(Tokens[3] == "color") { FocusedBorder.Color = ConvertHexRGBAToColor(ConvertHexStringToInt(Tokens[4])); CreateColorFormat(&FocusedBorder.Color); mode *BindingMode = GetBindingMode("default"); BindingMode->Color = FocusedBorder.Color; } else if(Tokens[3] == "radius") { FocusedBorder.Radius = ConvertStringToDouble(Tokens[4]); } } else if(Tokens[2] == "marked") { if(Tokens[3] == "on") { MarkedBorder.Enabled = true; } else if(Tokens[3] == "off") { MarkedBorder.Enabled = false; UpdateBorder("marked"); } else if(Tokens[3] == "size") { MarkedBorder.Width = ConvertStringToInt(Tokens[4]); } else if(Tokens[3] == "color") { MarkedBorder.Color = ConvertHexRGBAToColor(ConvertHexStringToInt(Tokens[4])); CreateColorFormat(&MarkedBorder.Color); } else if(Tokens[3] == "radius") { MarkedBorder.Radius = ConvertStringToDouble(Tokens[4]); } } } else if(Tokens[1] == "float-non-resizable") { if(Tokens[2] == "off") KWMSettings.FloatNonResizable = false; else if(Tokens[2] == "on") KWMSettings.FloatNonResizable = true; } else if(Tokens[1] == "lock-to-container") { if(Tokens[2] == "off") KWMSettings.LockToContainer = false; else if(Tokens[2] == "on") KWMSettings.LockToContainer = true; } else if(Tokens[1] == "spawn") { if(Tokens[2] == "left") KWMSettings.SpawnAsLeftChild = true; else if(Tokens[2] == "right") KWMSettings.SpawnAsLeftChild = false; } else if(Tokens[1] == "tiling") { if(Tokens[2] == "bsp") KWMSettings.Space = SpaceModeBSP; else if(Tokens[2] == "monocle") KWMSettings.Space = SpaceModeMonocle; else if(Tokens[2] == "float") KWMSettings.Space = SpaceModeFloating; } else if(Tokens[1] == "space") { int ScreenID = ConvertStringToInt(Tokens[2]); int DesktopID = ConvertStringToInt(Tokens[3]); space_settings *SpaceSettings = GetSpaceSettingsForDesktopID(ScreenID, DesktopID); if(!SpaceSettings) { space_identifier Lookup = { ScreenID, DesktopID }; space_settings NULLSpaceSettings = { KWMSettings.DefaultOffset, SpaceModeDefault, "", ""}; space_settings *ScreenSettings = GetSpaceSettingsForDisplay(ScreenID); if(ScreenSettings) NULLSpaceSettings = *ScreenSettings; KWMSettings.SpaceSettings[Lookup] = NULLSpaceSettings; SpaceSettings = &KWMSettings.SpaceSettings[Lookup]; } if(Tokens[4] == "mode") { if(Tokens[5] == "bsp") SpaceSettings->Mode = SpaceModeBSP; else if(Tokens[5] == "monocle") SpaceSettings->Mode = SpaceModeMonocle; else if(Tokens[5] == "float") SpaceSettings->Mode = SpaceModeFloating; } else if(Tokens[4] == "padding") { SpaceSettings->Offset.PaddingTop = ConvertStringToDouble(Tokens[5]); SpaceSettings->Offset.PaddingBottom = ConvertStringToDouble(Tokens[6]); SpaceSettings->Offset.PaddingLeft = ConvertStringToDouble(Tokens[7]); SpaceSettings->Offset.PaddingRight = ConvertStringToDouble(Tokens[8]); } else if(Tokens[4] == "gap") { SpaceSettings->Offset.VerticalGap = ConvertStringToDouble(Tokens[5]); SpaceSettings->Offset.HorizontalGap = ConvertStringToDouble(Tokens[6]); } else if(Tokens[4] == "name") { SpaceSettings->Name = Tokens[5]; } else if(Tokens[4] == "tree") { SpaceSettings->Layout = Tokens[5]; } } else if(Tokens[1] == "display") { int ScreenID = ConvertStringToInt(Tokens[2]); space_settings *DisplaySettings = GetSpaceSettingsForDisplay(ScreenID); if(!DisplaySettings) { space_settings NULLSpaceSettings = { KWMSettings.DefaultOffset, SpaceModeDefault, "", "" }; KWMSettings.DisplaySettings[ScreenID] = NULLSpaceSettings; DisplaySettings = &KWMSettings.DisplaySettings[ScreenID]; } if(Tokens[3] == "mode") { if(Tokens[4] == "bsp") DisplaySettings->Mode = SpaceModeBSP; else if(Tokens[4] == "monocle") DisplaySettings->Mode = SpaceModeMonocle; else if(Tokens[4] == "float") DisplaySettings->Mode = SpaceModeFloating; } else if(Tokens[3] == "padding") { DisplaySettings->Offset.PaddingTop = ConvertStringToDouble(Tokens[4]); DisplaySettings->Offset.PaddingBottom = ConvertStringToDouble(Tokens[5]); DisplaySettings->Offset.PaddingLeft = ConvertStringToDouble(Tokens[6]); DisplaySettings->Offset.PaddingRight = ConvertStringToDouble(Tokens[7]); } else if(Tokens[3] == "gap") { DisplaySettings->Offset.VerticalGap = ConvertStringToDouble(Tokens[4]); DisplaySettings->Offset.HorizontalGap = ConvertStringToDouble(Tokens[5]); } } else if(Tokens[1] == "focus-follows-mouse") { if(Tokens[2] == "toggle") { if(KWMSettings.Focus == FocusModeDisabled) KWMSettings.Focus = FocusModeAutoraise; else if(KWMSettings.Focus == FocusModeAutoraise) KWMSettings.Focus = FocusModeDisabled; } else if(Tokens[2] == "on") KWMSettings.Focus = FocusModeAutoraise; else if(Tokens[2] == "off") KWMSettings.Focus = FocusModeDisabled; } else if(Tokens[1] == "mouse-follows-focus") { if(Tokens[2] == "off") KWMSettings.UseMouseFollowsFocus = false; else if(Tokens[2] == "on") KWMSettings.UseMouseFollowsFocus = true; } else if(Tokens[1] == "standby-on-float") { if(Tokens[2] == "off") KWMSettings.StandbyOnFloat = false; else if(Tokens[2] == "on") KWMSettings.StandbyOnFloat = true; } else if(Tokens[1] == "cycle-focus") { if(Tokens[2] == "on") KWMSettings.Cycle = CycleModeScreen; else if(Tokens[2] == "off") KWMSettings.Cycle = CycleModeDisabled;; } else if(Tokens[1] == "hotkeys") { if(Tokens[2] == "off") KWMSettings.UseBuiltinHotkeys = false; else if(Tokens[2] == "on") KWMSettings.UseBuiltinHotkeys = true; } else if(Tokens[1] == "padding") { container_offset Offset = { ConvertStringToDouble(Tokens[2]), ConvertStringToDouble(Tokens[3]), ConvertStringToDouble(Tokens[4]), ConvertStringToDouble(Tokens[5]), 0, 0 }; SetDefaultPaddingOfDisplay(Offset); } else if(Tokens[1] == "gap") { container_offset Offset = { 0, 0, 0, 0, ConvertStringToDouble(Tokens[2]), ConvertStringToDouble(Tokens[3]) }; SetDefaultGapOfDisplay(Offset); } else if(Tokens[1] == "split-ratio") { ChangeSplitRatio(ConvertStringToDouble(Tokens[2])); } }