void ModifyContainerSplitRatio(double Offset) { if(!FocusedApplication) return; ax_window *Window = FocusedApplication->Focus; if(!Window) return; ax_display *Display = AXLibWindowDisplay(Window); space_info *SpaceInfo = &WindowTree[Display->Space->Identifier]; tree_node *Root = SpaceInfo->RootNode; if(!Root || IsLeafNode(Root) || Root->WindowID != 0) return; tree_node *Node = GetTreeNodeFromWindowIDOrLinkNode(Root, Window->ID); if(Node && Node->Parent) { if(Node->Parent->SplitRatio + Offset > 0.0 && Node->Parent->SplitRatio + Offset < 1.0) { Node->Parent->SplitRatio += Offset; ResizeNodeContainer(Display, Node->Parent); ApplyTreeNodeContainer(Node->Parent); } } }
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); } }
void ApplyTreeNodeContainer(tree_node *Node) { if(Node) { if(Node->WindowID != -1) ResizeWindowToContainerSize(Node); if(Node->List) ApplyLinkNodeContainer(Node->List); if(Node->LeftChild) ApplyTreeNodeContainer(Node->LeftChild); if(Node->RightChild) ApplyTreeNodeContainer(Node->RightChild); } }
void SetContainerSplitRatio(double SplitRatio, tree_node *Node, tree_node *Ancestor, ax_display *Display, bool ResizeWindows) { if(SplitRatio > 0.0 && SplitRatio < 1.0) { Ancestor->SplitRatio = SplitRatio; ResizeNodeContainer(Display, Ancestor); if(ResizeWindows) ApplyTreeNodeContainer(Ancestor); } }
void SwapNodeWindowIDs(tree_node *A, tree_node *B) { if(A && B) { DEBUG("SwapNodeWindowIDs() " << A->WindowID << " with " << B->WindowID); int TempWindowID = A->WindowID; A->WindowID = B->WindowID; B->WindowID = TempWindowID; node_type TempNodeType = A->Type; A->Type = B->Type; B->Type = TempNodeType; link_node *TempLinkList = A->List; A->List = B->List; B->List = TempLinkList; ResizeLinkNodeContainers(A); ResizeLinkNodeContainers(B); ApplyTreeNodeContainer(A); ApplyTreeNodeContainer(B); } }
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); }
void UpdateSpaceOfScreen(space_info *Space, screen_info *Screen) { if(Space->RootNode) { if(Space->Settings.Mode == SpaceModeBSP) { SetRootNodeContainer(Screen, Space->RootNode); CreateNodeContainers(Screen, Space->RootNode, true); } else if(Space->Settings.Mode == SpaceModeMonocle) { link_node *Link = Space->RootNode->List; while(Link) { SetLinkNodeContainer(Screen, Link); Link = Link->Next; } } ApplyTreeNodeContainer(Space->RootNode); Space->NeedsUpdate = false; } }
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]); } } }