add function to insert new client into tree structure
This commit is contained in:
parent
254b6d2ffb
commit
38f03105bd
50
wm.c
50
wm.c
@ -135,6 +135,56 @@ bool wm_window_is_dock(Wm *wm, Window w)
|
||||
return false;
|
||||
}
|
||||
|
||||
NodeType wm_split_to_nodetype(SplitMode mode)
|
||||
{
|
||||
switch (mode) {
|
||||
case SPLIT_VERTICAL:
|
||||
return NODE_VERTICAL;
|
||||
case SPLIT_HORIZ:
|
||||
return NODE_HORIZONTAL;
|
||||
case SPLIT_TAB:
|
||||
return NODE_TAB;
|
||||
}
|
||||
}
|
||||
|
||||
void wm_ws_tree_insert_client(Wm *wm, Workspace *ws, Client *client)
|
||||
{
|
||||
int dock_y = 0;
|
||||
|
||||
if (wm->dock != -1) {
|
||||
XWindowAttributes x;
|
||||
XGetWindowAttributes(wm->display, wm->dock, &x);
|
||||
|
||||
dock_y = x.height;
|
||||
}
|
||||
|
||||
if (wm_treenode_is_empty(&ws->tree)) {
|
||||
ws->tree.type = NODE_CLIENT;
|
||||
ws->tree.client = client;
|
||||
ws->tree.pos = (Rect) {
|
||||
.x = 0, .y = dock_y + 1,
|
||||
.w = ws->monitor->info.width,
|
||||
.h = ws->monitor->info.height - dock_y + 1
|
||||
};
|
||||
return;
|
||||
}
|
||||
|
||||
TreeNode *focused_node = wm_treenode_ptr_find_focused_client_node(&ws->tree);
|
||||
Client *old_client = ws->tree.client;
|
||||
focused_node->type = wm_split_to_nodetype(ws->split);
|
||||
|
||||
TreeNode child1, child2;
|
||||
wm_treenode_init(&child1, NODE_CLIENT, focused_node);
|
||||
wm_treenode_init(&child2, NODE_CLIENT, focused_node);
|
||||
|
||||
wm_treenode_split_space(focused_node, &child1.pos, &child2.pos);
|
||||
child1.client = old_client;
|
||||
child2.client = client;
|
||||
|
||||
wm_nodearray_push(&focused_node->children, child1);
|
||||
wm_nodearray_push(&focused_node->children, child2);
|
||||
}
|
||||
|
||||
void wm_switch_ws(Wm *wm, int ws)
|
||||
{
|
||||
if (ws > wm->smon->wscount || ws < 0)
|
||||
|
3
wm.h
3
wm.h
@ -146,6 +146,9 @@ void wm_set_layout(Wm *wm, void(*f)(Wm *wm, Monitor*));
|
||||
void wm_layout(Wm *wm, Monitor *m);
|
||||
bool wm_window_is_dock(Wm* wm, Window w);
|
||||
|
||||
NodeType wm_split_to_nodetype(SplitMode mode);
|
||||
void wm_ws_tree_insert_client(Wm *wm, Workspace *ws, Client *client);
|
||||
|
||||
void wm_spawn(Wm* wm, char **str);
|
||||
|
||||
void wm_switch_ws(Wm* wm, int ws);
|
||||
|
Loading…
x
Reference in New Issue
Block a user