using double-linked list in order to get correct prev focus handling

This commit is contained in:
arg@10ksloc.org
2006-07-20 16:54:20 +02:00
parent 06dc514bc7
commit 72707c2fae
4 changed files with 45 additions and 21 deletions

View File

@ -77,7 +77,6 @@ focusnext(Arg *arg)
c = getnext(clients, tsel);
if(c) {
higher(c);
c->revert = sel;
focus(c);
}
}
@ -93,7 +92,11 @@ focusprev(Arg *arg)
if(sel->ismax)
togglemax(NULL);
if((c = sel->revert && sel->revert->tags[tsel] ? sel->revert : NULL)) {
if(!(c = getprev(sel->prev))) {
for(c = clients; c && c->next; c = c->next);
c = getprev(c);
}
if(c) {
higher(c);
focus(c);
}
@ -127,6 +130,8 @@ gravitate(Client *c, Bool invert)
int dx = 0, dy = 0;
switch(c->grav) {
default:
break;
case StaticGravity:
case NorthWestGravity:
case NorthGravity:
@ -143,11 +148,11 @@ gravitate(Client *c, Bool invert)
case SouthWestGravity:
dy = -(c->h);
break;
default:
break;
}
switch (c->grav) {
default:
break;
case StaticGravity:
case NorthWestGravity:
case WestGravity:
@ -164,8 +169,6 @@ gravitate(Client *c, Bool invert)
case SouthEastGravity:
dx = -(c->w + c->border);
break;
default:
break;
}
if(invert) {
@ -204,7 +207,6 @@ lower(Client *c)
void
manage(Window w, XWindowAttributes *wa)
{
int diff;
Client *c;
Window trans;
XSetWindowAttributes twa;
@ -224,7 +226,7 @@ manage(Window w, XWindowAttributes *wa)
c->proto = getproto(c->win);
setsize(c);
XSelectInput(dpy, c->win,
StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
XGetTransientForHint(dpy, c->win, &trans);
twa.override_redirect = 1;
twa.background_pixmap = ParentRelative;
@ -237,6 +239,8 @@ manage(Window w, XWindowAttributes *wa)
settags(c);
if(clients)
clients->prev = c;
c->next = clients;
clients = c;
@ -264,6 +268,7 @@ manage(Window w, XWindowAttributes *wa)
else {
XMapRaised(dpy, c->win);
XMapRaised(dpy, c->title);
}
}
@ -273,9 +278,15 @@ pop(Client *c)
Client **l;
for(l = &clients; *l && *l != c; l = &(*l)->next);
if(c->prev)
c->prev->next = c->next;
if(c->next)
c->next->prev = c->prev;
*l = c->next;
c->next = clients; /* pop */
if(clients)
clients->prev = c;
c->next = clients;
clients = c;
arrange(NULL);
}
@ -439,13 +450,18 @@ unmanage(Client *c)
XDestroyWindow(dpy, c->title);
for(l = &clients; *l && *l != c; l = &(*l)->next);
if(c->prev)
c->prev->next = c->next;
if(c->next)
c->next->prev = c->prev;
*l = c->next;
for(l = &clients; *l; l = &(*l)->next)
if((*l)->revert == c)
(*l)->revert = NULL;
if(sel == c)
sel = sel->revert ? sel->revert : clients;
if(sel == c) {
sel = getnext(c->next, tsel);
if(!sel)
sel = getprev(c->prev);
if(!sel)
sel = clients;
}
free(c);
XSync(dpy, False);