Tiling: Fixed break out method
Summary: This fixes the case when par is NULL, this means we should insert a parent node between the 2 nodes and root. (T1790) Example: Each Number is a Window, 12 Focus on 2 Press Win+Up should end up in this: 2 1 This patch also makes the bahavior for 2 windows more consistent 12 Focus on 2 Pressing Win+Right, 21 It Will just swap the nodes, This is the same behavior then in higher levels. Reviewers: tasn Subscribers: cedric Differential Revision: https://phab.enlightenment.org/D1643
This commit is contained in:
parent
077474adcb
commit
8f85fe79df
|
@ -536,7 +536,7 @@ tiling_window_tree_edges_get(Window_Tree *node)
|
|||
/* Node move */
|
||||
/**
|
||||
* - break would mean that the node will be breaked out in the parent node and
|
||||
* put into the grand parent node.
|
||||
* put into the grand parent node. If there is no grand parent node a fake node will be placed there.
|
||||
*
|
||||
* - join would mean that the node will be put together with the next/previous
|
||||
* child into a new split.
|
||||
|
@ -549,7 +549,32 @@ _tiling_window_tree_node_break_out(Window_Tree *root, Window_Tree *node, Window_
|
|||
{
|
||||
Window_Tree *res, *ac; /* ac is the child of the root, that is a parent of a node */
|
||||
|
||||
if(!par) return;
|
||||
if (!par)
|
||||
{
|
||||
/* we have no parent, so we add a new node between this, later we do the normal break, */
|
||||
Window_Tree *rnode, *newnode, *newnode2;
|
||||
Eina_Inlist *il;
|
||||
|
||||
newnode2 = calloc(1, sizeof(Window_Tree));
|
||||
newnode2->parent = root;
|
||||
newnode2->weight = 1.0;
|
||||
|
||||
newnode = calloc(1, sizeof(Window_Tree));
|
||||
newnode->weight = 1.0;
|
||||
newnode->parent = newnode2;
|
||||
|
||||
EINA_INLIST_FOREACH_SAFE(root->children, il, rnode)
|
||||
{
|
||||
rnode->parent = newnode;
|
||||
root->children = eina_inlist_remove(root->children, EINA_INLIST_GET(rnode));
|
||||
newnode->children = eina_inlist_append(newnode->children, EINA_INLIST_GET(rnode));
|
||||
}
|
||||
|
||||
root->children = eina_inlist_append(root->children, EINA_INLIST_GET(newnode2));
|
||||
newnode2->children = eina_inlist_append(newnode2->children, EINA_INLIST_GET(newnode));
|
||||
par = newnode2;
|
||||
|
||||
}
|
||||
|
||||
/* search a path from the node to the par */
|
||||
ac = node;
|
||||
|
@ -581,7 +606,7 @@ _tiling_window_tree_node_break_out(Window_Tree *root, Window_Tree *node, Window_
|
|||
void
|
||||
_tiling_window_tree_node_join(Window_Tree *root, Window_Tree *node, Eina_Bool dir)
|
||||
{
|
||||
Window_Tree *pn, *pl, *wts, *par;
|
||||
Window_Tree *pn, *pl, *par;
|
||||
|
||||
if (dir)
|
||||
pn = _inlist_next(node);
|
||||
|
@ -599,8 +624,10 @@ _tiling_window_tree_node_join(Window_Tree *root, Window_Tree *node, Eina_Bool di
|
|||
}
|
||||
|
||||
par = node->parent;
|
||||
if ((eina_inlist_count(par->children) == 2) && /* swap if there are just 2 */
|
||||
par->parent && (eina_inlist_count(par->parent->children) > 1)) /* do not swap if we are in the first level */
|
||||
if ((eina_inlist_count(par->children) == 2) &&
|
||||
((_inlist_next(node) && _inlist_next(node)->client) ||
|
||||
(_inlist_prev(node) && _inlist_prev(node)->client)))
|
||||
/* swap if there are just 2 simple windows*/
|
||||
{
|
||||
par->children = eina_inlist_demote(par->children, eina_inlist_first(par->children));
|
||||
return;
|
||||
|
@ -624,13 +651,7 @@ _tiling_window_tree_node_join(Window_Tree *root, Window_Tree *node, Eina_Bool di
|
|||
{
|
||||
//unref changed the position of pn in the tree, result of unref
|
||||
//will be the new parent
|
||||
//we need to search the e_client ptr to get the corret relative pos
|
||||
wts = pn->parent;
|
||||
while(wts->client != pn->client)
|
||||
{
|
||||
wts = _inlist_next(wts);
|
||||
}
|
||||
_tiling_window_tree_parent_add(pl, node, wts, EINA_TRUE);
|
||||
_tiling_window_tree_parent_add(pl, node, NULL, EINA_TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue