X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=client.c;h=d5bc30eba90bf642b0318c2817608bbe14716087;hb=05c10c5776738fdfe73c1e66e14c869e2e5e338d;hp=b6caa93dc616bfba62f918ccda464ec19dc3f81d;hpb=281f0981a6edd51417f9bb427cc870370748e43f;p=dwm.git diff --git a/client.c b/client.c index b6caa93..d5bc30e 100644 --- a/client.c +++ b/client.c @@ -11,16 +11,14 @@ /* static functions */ static void -detachstack(Client *c) -{ +detachstack(Client *c) { Client **tc; for(tc=&stack; *tc && *tc != c; tc=&(*tc)->snext); *tc = c->snext; } static void -grabbuttons(Client *c, Bool focused) -{ +grabbuttons(Client *c, Bool focused) { XUngrabButton(dpy, AnyButton, AnyModifier, c->win); if(focused) { @@ -54,12 +52,10 @@ grabbuttons(Client *c, Bool focused) else XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - } static void -resizetitle(Client *c) -{ +resizetitle(Client *c) { c->tw = textw(c->name); if(c->tw > c->w) c->tw = c->w + 2; @@ -69,36 +65,30 @@ resizetitle(Client *c) XMoveResizeWindow(dpy, c->twin, c->tx, c->ty, c->tw, c->th); else XMoveResizeWindow(dpy, c->twin, c->tx + 2 * sw, c->ty, c->tw, c->th); - } static int -xerrordummy(Display *dsply, XErrorEvent *ee) -{ +xerrordummy(Display *dsply, XErrorEvent *ee) { return 0; } /* extern functions */ void -ban(Client *c) -{ +ban(Client *c) { XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); XMoveWindow(dpy, c->twin, c->tx + 2 * sw, c->ty); } void -focus(Client *c) -{ +focus(Client *c) { Client *old; - if(!issel) + if(!issel || (c && !isvisible(c))) return; if(!sel) sel = c; else if(sel != c) { - if(maximized) - togglemax(NULL); old = sel; sel = c; if(old) { @@ -119,8 +109,7 @@ focus(Client *c) } Client * -getclient(Window w) -{ +getclient(Window w) { Client *c; for(c = clients; c; c = c->next) @@ -130,8 +119,7 @@ getclient(Window w) } Client * -getctitle(Window w) -{ +getctitle(Window w) { Client *c; for(c = clients; c; c = c->next) @@ -141,8 +129,7 @@ getctitle(Window w) } void -gravitate(Client *c, Bool invert) -{ +gravitate(Client *c, Bool invert) { int dx = 0, dy = 0; switch(c->grav) { @@ -196,8 +183,7 @@ gravitate(Client *c, Bool invert) } void -killclient(Arg *arg) -{ +killclient(Arg *arg) { if(!sel) return; if(sel->proto & PROTODELWIN) @@ -207,8 +193,7 @@ killclient(Arg *arg) } void -manage(Window w, XWindowAttributes *wa) -{ +manage(Window w, XWindowAttributes *wa) { Client *c; Window trans; XSetWindowAttributes twa; @@ -223,7 +208,7 @@ manage(Window w, XWindowAttributes *wa) c->th = bh; c->border = 0; - setsize(c); + updatesize(c); if(c->x + c->w + 2 > sw) c->x = sw - c->w - 2; @@ -260,7 +245,7 @@ manage(Window w, XWindowAttributes *wa) c->snext = stack; stack = clients = c; - settitle(c); + updatetitle(c); ban(c); XMapWindow(dpy, c->win); XMapWindow(dpy, c->twin); @@ -270,8 +255,7 @@ manage(Window w, XWindowAttributes *wa) } void -resize(Client *c, Bool sizehints, Corner sticky) -{ +resize(Client *c, Bool sizehints, Corner sticky) { int bottom = c->y + c->h; int right = c->x + c->w; XWindowChanges wc; @@ -295,6 +279,16 @@ resize(Client *c, Bool sizehints, Corner sticky) if(sticky == BotLeft || sticky == BotRight) c->y = bottom - c->h; + /* offscreen appearance fixes */ + if(c->x + c->w < 0) + c->x = 0; + if(c->y + c->h < bh) + c->y = bh; + if(c->x > sw) + c->x = sw - c->w; + if(c->y > sh) + c->y = sh - c->h; + resizetitle(c); wc.x = c->x; wc.y = c->y; @@ -309,8 +303,7 @@ resize(Client *c, Bool sizehints, Corner sticky) } void -setsize(Client *c) -{ +updatesize(Client *c) { long msize; XSizeHints size; @@ -348,8 +341,7 @@ setsize(Client *c) } void -settitle(Client *c) -{ +updatetitle(Client *c) { char **list = NULL; int n; XTextProperty name; @@ -376,46 +368,10 @@ settitle(Client *c) } void -togglemax(Arg *arg) -{ - int ox, oy, ow, oh; - Client *c; - XEvent ev; - - if(!sel) - return; - - if((maximized = !maximized)) { - ox = sel->x; - oy = sel->y; - ow = sel->w; - oh = sel->h; - sel->x = sx; - sel->y = sy + bh; - sel->w = sw - 2; - sel->h = sh - 2 - bh; - - restack(); - for(c = getnext(clients); c; c = getnext(c->next)) - if(c != sel) - ban(c); - resize(sel, arrange == dofloat, TopLeft); - - sel->x = ox; - sel->y = oy; - sel->w = ow; - sel->h = oh; - } - else - arrange(NULL); - while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); -} - -void -unmanage(Client *c) -{ +unmanage(Client *c) { Client *nc; + /* The server grab construct avoids race conditions. */ XGrabServer(dpy); XSetErrorHandler(xerrordummy);