X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=client.c;h=3505e76619eb698cd33d439d6310d98725e56113;hb=3ce8c9f33844a995e79329978db9d2cd3981e032;hp=2b194d7f39b5a836e8b4af849842ed6eaf8b6d39;hpb=2ddc78720aceda76e22fd3584740fc86a2e7c677;p=dwm.git diff --git a/client.c b/client.c index 2b194d7..3505e76 100644 --- a/client.c +++ b/client.c @@ -10,13 +10,6 @@ /* static */ static void -closestpt(float *rx, float *ry, float x, float y, float grad) { - float u = (x * grad + y) / (grad * grad + 1); - *rx = u * grad; - *ry = u; -} - -static void detachstack(Client *c) { Client **tc; for(tc=&stack; *tc && *tc != c; tc=&(*tc)->snext); @@ -75,20 +68,29 @@ xerrordummy(Display *dsply, XErrorEvent *ee) { /* extern */ void +ban(Client *c) { + if(!c || c->isbanned) + return; + c->isbanned = True; + XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); +} + +void configure(Client *c) { - XEvent synev; + XConfigureEvent ce; - synev.type = ConfigureNotify; - synev.xconfigure.display = dpy; - synev.xconfigure.event = c->win; - synev.xconfigure.window = c->win; - synev.xconfigure.x = c->x; - synev.xconfigure.y = c->y; - synev.xconfigure.width = c->w; - synev.xconfigure.height = c->h; - synev.xconfigure.border_width = c->border; - synev.xconfigure.above = None; - XSendEvent(dpy, c->win, True, NoEventMask, &synev); + ce.type = ConfigureNotify; + ce.display = dpy; + ce.event = c->win; + ce.window = c->win; + ce.x = c->x; + ce.y = c->y; + ce.width = c->w; + ce.height = c->h; + ce.border_width = c->border; + ce.above = None; + ce.override_redirect = False; + XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce); } void @@ -127,11 +129,26 @@ getclient(Window w) { return NULL; } +Bool +isprotodel(Client *c) { + int i, n; + Atom *protocols; + Bool ret = False; + + if(XGetWMProtocols(dpy, c->win, &protocols, &n)) { + for(i = 0; !ret && i < n; i++) + if(protocols[i] == wmatom[WMDelete]) + ret = True; + XFree(protocols); + } + return ret; +} + void killclient(Arg *arg) { if(!sel) return; - if(sel->proto & PROTODELWIN) + if(isprotodel(sel)) sendevent(sel->win, wmatom[WMProtocols], wmatom[WMDelete]); else XKillClient(dpy, sel->win); @@ -139,7 +156,7 @@ killclient(Arg *arg) { void manage(Window w, XWindowAttributes *wa) { - Client *c; + Client *c, *t; Window trans; c = emallocz(sizeof(Client)); @@ -166,22 +183,22 @@ manage(Window w, XWindowAttributes *wa) { c->y = way; } updatesizehints(c); - c->proto = getproto(c->win); XSelectInput(dpy, c->win, StructureNotifyMask | PropertyChangeMask | EnterWindowMask); XGetTransientForHint(dpy, c->win, &trans); grabbuttons(c, False); XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]); updatetitle(c); - settags(c, getclient(trans)); + t = getclient(trans); + settags(c, t); if(!c->isfloat) - c->isfloat = trans || c->isfixed; + c->isfloat = (t != 0) || c->isfixed; if(clients) clients->prev = c; c->next = clients; c->snext = stack; stack = clients = c; - XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); + ban(c); XMapWindow(dpy, c->win); setclientstate(c, NormalState); if(isvisible(c)) @@ -191,7 +208,7 @@ manage(Window w, XWindowAttributes *wa) { void resize(Client *c, Bool sizehints) { - float dx, dy, min, max, actual; + float actual, dx, dy, max, min; XWindowChanges wc; if(c->w <= 0 || c->h <= 0) @@ -214,12 +231,14 @@ resize(Client *c, Bool sizehints) { actual = dx / dy; if(max > 0 && min > 0 && actual > 0) { if(actual < min) { - closestpt(&dx, &dy, dx, dy, min); + dy = (dx * min + dy) / (min * min + 1); + dx = dy * min; c->w = (int)dx + c->basew; c->h = (int)dy + c->baseh; } else if(actual > max) { - closestpt(&dx, &dy, dx, dy, max); + dy = (dx * min + dy) / (max * max + 1); + dx = dy * min; c->w = (int)dx + c->basew; c->h = (int)dy + c->baseh; } @@ -293,8 +312,8 @@ updatesizehints(Client *c) { } else c->minax = c->minay = c->maxax = c->maxay = 0; - c->isfixed = (c->maxw && c->minw && c->maxh && c->minh && - c->maxw == c->minw && c->maxh == c->minh); + c->isfixed = (c->maxw && c->minw && c->maxh && c->minh + && c->maxw == c->minw && c->maxh == c->minh); } void @@ -314,7 +333,7 @@ updatetitle(Client *c) { strncpy(c->name, (char *)name.value, sizeof c->name); else { if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success - && n > 0 && *list) + && n > 0 && *list) { strncpy(c->name, *list, sizeof c->name); XFreeStringList(list);