X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=client.c;h=646bcc16ff7578f083460f93acc46c7ea0e9c5f8;hb=a73a88280681acdab047bd11a9ba77d97d6a0b72;hp=1bdebd2e5b06fa2908bf86ad10637366cb8ecb46;hpb=4688ad181da14be36e034918580ec0ce5968ffdb;p=dwm.git diff --git a/client.c b/client.c index 1bdebd2..646bcc1 100644 --- a/client.c +++ b/client.c @@ -73,11 +73,10 @@ focusnext(Arg *arg) if(sel->ismax) togglemax(NULL); - if(!(c = getnext(sel->next, tsel))) - c = getnext(clients, tsel); + if(!(c = getnext(sel->next))) + c = getnext(clients); 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,14 +239,16 @@ manage(Window w, XWindowAttributes *wa) settags(c); + if(clients) + clients->prev = c; c->next = clients; clients = c; - XGrabButton(dpy, Button1, MODKEY, c->win, False, ButtonPressMask, + XGrabButton(dpy, Button1, MODKEY, c->win, False, ButtonMask, GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button2, MODKEY, c->win, False, ButtonPressMask, + XGrabButton(dpy, Button2, MODKEY, c->win, False, ButtonMask, GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button3, MODKEY, c->win, False, ButtonPressMask, + XGrabButton(dpy, Button3, MODKEY, c->win, False, ButtonMask, GrabModeAsync, GrabModeSync, None, None); if(!c->isfloat) @@ -256,55 +260,37 @@ manage(Window w, XWindowAttributes *wa) arrange(NULL); /* mapping the window now prevents flicker */ - if(c->tags[tsel]) { - XMapRaised(dpy, c->win); - XMapRaised(dpy, c->title); + XMapRaised(dpy, c->win); + XMapRaised(dpy, c->title); + if(c->tags[tsel]) focus(c); - } - else { - XMapRaised(dpy, c->win); - XMapRaised(dpy, c->title); - } } void -pop(Client *c) -{ - Client **l; - - for(l = &clients; *l && *l != c; l = &(*l)->next); - *l = c->next; - - c->next = clients; /* pop */ - clients = c; - arrange(NULL); -} - -void -resize(Client *c, Bool inc, Corner sticky) +resize(Client *c, Bool sizehints, Corner sticky) { int bottom = c->y + c->h; int right = c->x + c->w; XConfigureEvent e; - if(inc) { + if(sizehints) { if(c->incw) c->w -= (c->w - c->basew) % c->incw; if(c->inch) c->h -= (c->h - c->baseh) % c->inch; + if(c->minw && c->w < c->minw) + c->w = c->minw; + if(c->minh && c->h < c->minh) + c->h = c->minh; + if(c->maxw && c->w > c->maxw) + c->w = c->maxw; + if(c->maxh && c->h > c->maxh) + c->h = c->maxh; } if(c->x > sw) /* might happen on restart */ c->x = sw - c->w; if(c->y > sh) c->y = sh - c->h; - if(c->minw && c->w < c->minw) - c->w = c->minw; - if(c->minh && c->h < c->minh) - c->h = c->minh; - if(c->maxw && c->w > c->maxw) - c->w = c->maxw; - if(c->maxh && c->h > c->maxh) - c->h = c->maxh; if(sticky == TopRight || sticky == BotRight) c->x = right - c->w; if(sticky == BotLeft || sticky == BotRight) @@ -439,13 +425,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); + if(!sel) + sel = getprev(c->prev); + if(!sel) + sel = clients; + } free(c); XSync(dpy, False); @@ -459,16 +450,29 @@ unmanage(Client *c) void zoom(Arg *arg) { - Client *c; + Client *c, **l; if(!sel) return; - if(sel == getnext(clients, tsel) && sel->next) { - if((c = getnext(sel->next, tsel))) + if(sel == getnext(clients) && sel->next) { + if((c = getnext(sel->next))) sel = c; } - pop(sel); + /* pop */ + for(l = &clients; *l && *l != sel; l = &(*l)->next); + if(sel->prev) + sel->prev->next = sel->next; + if(sel->next) + sel->next->prev = sel->prev; + *l = sel->next; + + sel->prev = NULL; + if(clients) + clients->prev = sel; + sel->next = clients; + clients = sel; + arrange(NULL); focus(sel); }