From 72707c2fae68f5eba6ea97cbf356bfb968c8a15d Mon Sep 17 00:00:00 2001 From: "arg@10ksloc.org" Date: Thu, 20 Jul 2006 16:54:20 +0200 Subject: using double-linked list in order to get correct prev focus handling --- client.c | 46 +++++++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 15 deletions(-) (limited to 'client.c') diff --git a/client.c b/client.c index 1bdebd2..34c69aa 100644 --- a/client.c +++ b/client.c @@ -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); -- cgit v1.2.3-13-gbd6f