add function to insert new client into tree structure

This commit is contained in:
Akos Horvath 2023-05-28 17:19:34 +02:00
parent 254b6d2ffb
commit 38f03105bd
2 changed files with 53 additions and 0 deletions

50
wm.c
View File

@ -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
View File

@ -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);