Example #1
0
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;
    }
}
Example #2
0
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]);
    }
}
Example #3
0
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);
    }
}
Example #4
0
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;
}
Example #5
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);
    }
}
Example #6
0
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);
}
Example #7
0
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]);
        }
    }
}