internal void KwmDisplayCommand(std::vector<std::string> &Tokens) { if(Tokens[1] == "-f") { if(Tokens[2] == "prev") { ax_display *Display = AXLibMainDisplay(); if(Display) FocusDisplay(AXLibPreviousDisplay(Display)); } else if(Tokens[2] == "next") { ax_display *Display = AXLibMainDisplay(); if(Display) FocusDisplay(AXLibNextDisplay(Display)); } else { int DisplayID = ConvertStringToInt(Tokens[2]); ax_display *Display = AXLibArrangementDisplay(DisplayID); if(Display) FocusDisplay(Display); } } else if(Tokens[1] == "-c") { if(Tokens[2] == "optimal") KWMSettings.SplitMode = SPLIT_OPTIMAL; else if(Tokens[2] == "vertical") KWMSettings.SplitMode = SPLIT_VERTICAL; else if(Tokens[2] == "horizontal") KWMSettings.SplitMode = SPLIT_HORIZONTAL; } }
internal void KwmTreeCommand(std::vector<std::string> &Tokens) { if(Tokens[1] == "-pseudo") { if(Tokens[2] == "create") CreatePseudoNode(); else if(Tokens[2] == "destroy") RemovePseudoNode(); } else if(Tokens[1] == "rotate") { if(Tokens[2] == "90" || Tokens[2] == "270" || Tokens[2] == "180") { RotateBSPTree(ConvertStringToInt(Tokens[2])); } } else if(Tokens[1] == "save") { ax_display *Display = AXLibMainDisplay(); space_info *SpaceInfo = &WindowTree[Display->Space->Identifier]; SaveBSPTreeToFile(Display, SpaceInfo, Tokens[2]); } else if(Tokens[1] == "restore") { LoadWindowNodeTree(AXLibMainDisplay(), Tokens[2]); } }
void RemovePseudoNode() { ax_display *Display = AXLibMainDisplay(); space_info *SpaceInfo = &WindowTree[Display->Space->Identifier]; if(!FocusedApplication) return; ax_window *Window = FocusedApplication->Focus; if(!Window) return; tree_node *Node = GetTreeNodeFromWindowID(SpaceInfo->RootNode, Window->ID); if(Node && Node->Parent) { tree_node *Parent = Node->Parent; tree_node *PseudoNode = IsLeftChild(Node) ? Parent->RightChild : Parent->LeftChild; if(!PseudoNode || !IsLeafNode(PseudoNode) || PseudoNode->WindowID != 0) return; Parent->WindowID = Node->WindowID; Parent->LeftChild = NULL; Parent->RightChild = NULL; free(Node); free(PseudoNode); ApplyTreeNodeContainer(Parent); } }
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; }
void CreatePseudoNode() { ax_display *Display = AXLibMainDisplay(); space_info *SpaceInfo = &WindowTree[Display->Space->Identifier]; if(!FocusedApplication) return; ax_window *Window = FocusedApplication->Focus; if(!Window) return; tree_node *Node = GetTreeNodeFromWindowID(SpaceInfo->RootNode, Window->ID); if(Node) { split_type SplitMode = KWMSettings.SplitMode == SPLIT_OPTIMAL ? GetOptimalSplitMode(Node) : KWMSettings.SplitMode; CreateLeafNodePair(Display, Node, Node->WindowID, 0, SplitMode); ApplyTreeNodeContainer(Node); } }
void ToggleFocusedNodeSplitMode() { ax_display *Display = AXLibMainDisplay(); space_info *SpaceInfo = &WindowTree[Display->Space->Identifier]; if(!FocusedApplication) return; ax_window *Window = FocusedApplication->Focus; if(!Window) return; tree_node *Node = GetTreeNodeFromWindowID(SpaceInfo->RootNode, Window->ID); if(!Node) return; tree_node *Parent = Node->Parent; if(!Parent || IsLeafNode(Parent)) return; Parent->SplitMode = Parent->SplitMode == SPLIT_VERTICAL ? SPLIT_HORIZONTAL : SPLIT_VERTICAL; CreateNodeContainers(Display, Parent, false); ApplyTreeNodeContainer(Parent); }
internal void KwmSpaceCommand(std::vector<std::string> &Tokens) { if(Tokens[1] == "-fExperimental") { if(Tokens[2] == "previous") GoToPreviousSpace(false); else ActivateSpaceWithoutTransition(Tokens[2]); } else if(Tokens[1] == "-t") { if(Tokens[2] == "bsp") ResetWindowNodeTree(AXLibMainDisplay(), SpaceModeBSP); else if(Tokens[2] == "monocle") ResetWindowNodeTree(AXLibMainDisplay(), SpaceModeMonocle); else if(Tokens[2] == "float") ResetWindowNodeTree(AXLibMainDisplay(), SpaceModeFloating); } else if(Tokens[1] == "-r") { if(Tokens[2] == "focused") { ax_display *Display = AXLibMainDisplay(); if(Display) { space_info *SpaceInfo = &WindowTree[Display->Space->Identifier]; ApplyTreeNodeContainer(SpaceInfo->RootNode); } } } else if(Tokens[1] == "-p") { if(Tokens[3] == "left" || Tokens[3] == "right" || Tokens[3] == "top" || Tokens[3] == "bottom" || Tokens[3] == "all") { int Value = 0; if(Tokens[2] == "increase") Value = 10; else if(Tokens[2] == "decrease") Value = -10; ChangePaddingOfDisplay(Tokens[3], Value); } } else if(Tokens[1] == "-g") { if(Tokens[3] == "vertical" || Tokens[3] == "horizontal" || Tokens[3] == "all") { int Value = 0; if(Tokens[2] == "increase") Value = 10; else if(Tokens[2] == "decrease") Value = -10; ChangeGapOfDisplay(Tokens[3], Value); } } else if(Tokens[1] == "-n") { ax_display *Display = AXLibMainDisplay(); if(Display) { SetNameOfActiveSpace(Display, Tokens[2]); } } }