/* TODO(koekeishiya): This entire system is just stupid. Reimplement in a proper way. */ bool ApplyWindowRules(ax_window *Window) { bool Skip = false; for(int Index = 0; Index < KWMSettings.WindowRules.size(); ++Index) { window_rule *Rule = &KWMSettings.WindowRules[Index]; if(MatchWindowRule(Rule, Window)) { if(Rule->Properties.Float == 1) AXLibAddFlags(Window, AXWindow_Floating); if(!Rule->Properties.Role.empty()) Window->Type.CustomRole = CFStringCreateWithCString(NULL, Rule->Properties.Role.c_str(), kCFStringEncodingMacRoman); if(Rule->Properties.Scratchpad != -1) { AddWindowToScratchpad(Window); if(Rule->Properties.Scratchpad == 0) { HideScratchpadWindow(GetScratchpadSlotOfWindow(Window)); Skip = true; } } if(Rule->Properties.Display != -1 && Rule->Properties.Space == -1) { if(!AXLibIsWindowStandard(Window) && !AXLibIsWindowCustom(Window)) continue; ax_display *Display = AXLibArrangementDisplay(Rule->Properties.Display); if(Display && Display != AXLibWindowDisplay(Window)) { MoveWindowToDisplay(Window, Display->ArrangementID, false); Skip = true; } } if(Rule->Properties.Space != -1) { if(!AXLibIsWindowStandard(Window) && !AXLibIsWindowCustom(Window)) continue; int Display = Rule->Properties.Display == -1 ? 0 : Rule->Properties.Display; ax_display *SourceDisplay = AXLibWindowDisplay(Window); ax_display *DestinationDisplay = AXLibArrangementDisplay(Display); int TotalSpaces = AXLibDisplaySpacesCount(DestinationDisplay); if(Rule->Properties.Space <= TotalSpaces && Rule->Properties.Space >= 1) { int SourceCGSSpaceID = SourceDisplay->Space->ID; int DestinationCGSSpaceID = AXLibCGSSpaceIDFromDesktopID(DestinationDisplay, Rule->Properties.Space); if(!AXLibSpaceHasWindow(Window, DestinationCGSSpaceID)) { AXLibSpaceAddWindow(DestinationCGSSpaceID, Window->ID); AXLibSpaceRemoveWindow(SourceCGSSpaceID, Window->ID); Skip = true; } } } } } return Skip; }
internal void KwmWindowCommand(std::vector<std::string> &Tokens) { if(Tokens[1] == "-f") { if(Tokens[2] == "north") ShiftWindowFocusDirected(0); else if(Tokens[2] == "east") ShiftWindowFocusDirected(90); else if(Tokens[2] == "south") ShiftWindowFocusDirected(180); else if(Tokens[2] == "west") ShiftWindowFocusDirected(270); else if(Tokens[2] == "prev") ShiftWindowFocus(-1); else if(Tokens[2] == "next") ShiftWindowFocus(1); else if(Tokens[2] == "curr") FocusWindowBelowCursor(); else FocusWindowByID(ConvertStringToUint(Tokens[2])); } else if(Tokens[1] == "-fm") { if(Tokens[2] == "prev") ShiftSubTreeWindowFocus(-1); else if(Tokens[2] == "next") ShiftSubTreeWindowFocus(1); } else if(Tokens[1] == "-s") { if(Tokens[2] == "north") SwapFocusedWindowDirected(0); else if(Tokens[2] == "east") SwapFocusedWindowDirected(90); else if(Tokens[2] == "south") SwapFocusedWindowDirected(180); else if(Tokens[2] == "west") SwapFocusedWindowDirected(270); else if(Tokens[2] == "prev") SwapFocusedWindowWithNearest(-1); else if(Tokens[2] == "next") SwapFocusedWindowWithNearest(1); else if(Tokens[2] == "mark") SwapFocusedWindowWithMarked(); } else if(Tokens[1] == "-z") { if(Tokens[2] == "fullscreen") ToggleFocusedWindowFullscreen(); else if(Tokens[2] == "parent") ToggleFocusedWindowParentContainer(); } else if(Tokens[1] == "-t") { if(Tokens[2] == "focused") ToggleFocusedWindowFloating(); } else if(Tokens[1] == "-r") { if(Tokens[2] == "focused") ResizeWindowToContainerSize(); } else if(Tokens[1] == "-c") { if(Tokens[2] == "split-mode") { if(Tokens[3] == "toggle") { ToggleFocusedNodeSplitMode(); } } else if(Tokens[2] == "type") { if(Tokens[3] == "monocle") ChangeTypeOfFocusedNode(NodeTypeLink); else if(Tokens[3] == "bsp") ChangeTypeOfFocusedNode(NodeTypeTree); else if(Tokens[3] == "toggle") ToggleTypeOfFocusedNode(); } else if(Tokens[2] == "reduce" || Tokens[2] == "expand") { double Ratio = ConvertStringToDouble(Tokens[3]); Ratio = Tokens[2] == "reduce" ? -Ratio : Ratio; if(Tokens.size() == 5) { if(Tokens[4] == "north") ModifyContainerSplitRatio(Ratio, 0); else if(Tokens[4] == "east") ModifyContainerSplitRatio(Ratio, 90); else if(Tokens[4] == "south") ModifyContainerSplitRatio(Ratio, 180); else if(Tokens[4] == "west") ModifyContainerSplitRatio(Ratio, 270); } else { ModifyContainerSplitRatio(Ratio); } } } else if(Tokens[1] == "-m") { if(Tokens[2] == "space") { if(Tokens[3] == "previous") GoToPreviousSpace(true); else MoveFocusedWindowToSpace(Tokens[3]); } else if(Tokens[2] == "display") { ax_window *Window = FocusedApplication ? FocusedApplication->Focus : NULL; if(!Window) return; if(Tokens[3] == "prev") MoveWindowToDisplay(Window, -1, true); else if(Tokens[3] == "next") MoveWindowToDisplay(Window, 1, true); else MoveWindowToDisplay(Window, ConvertStringToInt(Tokens[3]), false); } else if(Tokens[2] == "north") { ax_window *Window = FocusedApplication ? FocusedApplication->Focus : NULL; if(Window) DetachAndReinsertWindow(Window->ID, 0); } else if(Tokens[2] == "east") { ax_window *Window = FocusedApplication ? FocusedApplication->Focus : NULL; if(Window) DetachAndReinsertWindow(Window->ID, 90); } else if(Tokens[2] == "south") { ax_window *Window = FocusedApplication ? FocusedApplication->Focus : NULL; if(Window) DetachAndReinsertWindow(Window->ID, 180); } else if(Tokens[2] == "west") { ax_window *Window = FocusedApplication ? FocusedApplication->Focus : NULL; if(Window) DetachAndReinsertWindow(Window->ID, 270); } else if(Tokens[2] == "mark") { if(MarkedWindow) DetachAndReinsertWindow(MarkedWindow->ID, 0); } else { int XOff = ConvertStringToInt(Tokens[2]); int YOff = ConvertStringToInt(Tokens[3]); MoveFloatingWindow(XOff, YOff); } } else if(Tokens[1] == "-mk") { if(Tokens[2] == "focused") { MarkFocusedWindowContainer(); return; } ax_window *ClosestWindow = NULL; std::string Output = "-1"; int Degrees = 0; if(Tokens[2] == "north") Degrees = 0; else if(Tokens[2] == "east") Degrees = 90; else if(Tokens[2] == "south") Degrees = 180; else if(Tokens[2] == "west") Degrees = 270; bool Wrap = Tokens[3] == "wrap" ? true : false; if((FindClosestWindow(Degrees, &ClosestWindow, Wrap)) && (ClosestWindow)) MarkWindowContainer(ClosestWindow); } }