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(); }
int main(int argc, char **argv) { if(ParseArguments(argc, argv)) return 0; NSApplicationLoad(); if(!AXLibDisplayHasSeparateSpaces()) Fatal("Error: 'Displays have separate spaces' must be enabled!"); AXLibInit(&AXState); AXLibStartEventLoop(); if(!KwmStartDaemon()) Fatal("Error: Could not start daemon!"); OverlayLibInitialize(); DEBUG("OverlayLib initialized!"); ax_display *MainDisplay = AXLibMainDisplay(); ax_display *Display = MainDisplay; do { ax_space *PrevSpace = Display->Space; Display->Space = AXLibGetActiveSpace(Display); Display->PrevSpace = PrevSpace; Display = AXLibNextDisplay(Display); } while(Display != MainDisplay); FocusedDisplay = MainDisplay; FocusedApplication = AXLibGetFocusedApplication(); KwmInit(); KwmParseConfig(KWMPath.Config); KwmExecuteInitScript(); CreateWindowNodeTree(MainDisplay); /* TODO(koekeishiya): Probably want to defer this to run at some point where we know that * the focused application is set. This is usually the case as 'Finder' is always reported * as the active application when nothing is running. The following behaviour requries * refinement, because we will (sometimes ?) get NULL when started by launchd at login */ if(FocusedApplication && FocusedApplication->Focus) UpdateBorder(&FocusedBorder, FocusedApplication->Focus); ConfigureRunLoop(); CFRunLoopRun(); return 0; }