85 lines
1.6 KiB
C
85 lines
1.6 KiB
C
void
|
|
insertclient(Client *item, Client *insertItem, int after)
|
|
{
|
|
Client *c;
|
|
if (item == NULL || insertItem == NULL || item == insertItem)
|
|
return;
|
|
detach(insertItem);
|
|
if (!after && selmon->clients == item) {
|
|
attach(insertItem);
|
|
return;
|
|
}
|
|
if (after) {
|
|
c = item;
|
|
} else {
|
|
for (c = selmon->clients; c; c = c->next) {
|
|
if (c->next == item)
|
|
break;
|
|
}
|
|
}
|
|
insertItem->next = c->next;
|
|
c->next = insertItem;
|
|
}
|
|
|
|
void
|
|
inplacerotate(const Arg *arg)
|
|
{
|
|
if (!selmon->sel || (selmon->sel->isfloating && !arg->f))
|
|
return;
|
|
|
|
unsigned int selidx = 0, i = 0;
|
|
Client *c = NULL, *stail = NULL, *mhead = NULL, *mtail = NULL, *shead = NULL;
|
|
|
|
// Determine positionings for insertclient
|
|
for (c = selmon->clients; c; c = c->next) {
|
|
if (ISVISIBLE(c) && !(c->isfloating)) {
|
|
if (selmon->sel == c)
|
|
selidx = i;
|
|
if (i == selmon->nmaster - 1)
|
|
mtail = c;
|
|
if (i == selmon->nmaster)
|
|
shead = c;
|
|
if (mhead == NULL)
|
|
mhead = c;
|
|
stail = c;
|
|
i++;
|
|
}
|
|
}
|
|
|
|
switch(arg->i) {
|
|
case 1:
|
|
if (selidx >= selmon->nmaster)
|
|
insertclient(shead, stail, 0);
|
|
else
|
|
insertclient(mhead, mtail, 0);
|
|
break;
|
|
case -1:
|
|
if (selidx >= selmon->nmaster)
|
|
insertclient(stail, shead, 1);
|
|
else
|
|
insertclient(mtail, mhead, 1);
|
|
break;
|
|
case 2:
|
|
insertclient(selmon->clients, stail, 0);
|
|
break;
|
|
case -2:
|
|
insertclient(stail, selmon->clients, 1);
|
|
break;
|
|
}
|
|
|
|
// Restore focus position
|
|
i = 0;
|
|
for (c = selmon->clients; c; c = c->next) {
|
|
if (!ISVISIBLE(c) || (c->isfloating))
|
|
continue;
|
|
if (i == selidx) {
|
|
focus(c);
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
arrange(selmon);
|
|
focus(c);
|
|
}
|
|
|