X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=client.c;h=cac848ee5a793be716a1e5ce538ab6137f83ccec;hb=e8389a4cc0f1c35bcb7e7646102bd6d6a830207e;hp=24d38c38f3b7d5aba4dce869972b92420a282bfc;hpb=ee31e38dc75832a66cb0fc01bcf2f419ac96a20b;p=dwm.git diff --git a/client.c b/client.c index 24d38c3..cac848e 100644 --- a/client.c +++ b/client.c @@ -11,23 +11,56 @@ /* static functions */ static void -resizetitle(Client *c) +grabbuttons(Client *c, Bool focus) { - int i; + XUngrabButton(dpy, AnyButton, AnyModifier, c->win); + + if(focus) { + XGrabButton(dpy, Button1, MODKEY, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(dpy, Button1, MODKEY | LockMask, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(dpy, Button1, MODKEY | numlockmask, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(dpy, Button1, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + + XGrabButton(dpy, Button2, MODKEY, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(dpy, Button2, MODKEY | LockMask, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(dpy, Button2, MODKEY | numlockmask, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(dpy, Button2, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + + XGrabButton(dpy, Button3, MODKEY, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(dpy, Button3, MODKEY | LockMask, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(dpy, Button3, MODKEY | numlockmask, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(dpy, Button3, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + } + else + XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); - c->tw = 0; - for(i = 0; i < ntags; i++) - if(c->tags[i]) - c->tw += textw(tags[i]); - c->tw += textw(c->name); +} + +static void +resizetitle(Client *c) +{ + c->tw = textw(c->name); if(c->tw > c->w) c->tw = c->w + 2; c->tx = c->x + c->w - c->tw + 2; c->ty = c->y; if(isvisible(c)) - XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th); + XMoveResizeWindow(dpy, c->twin, c->tx, c->ty, c->tw, c->th); else - XMoveResizeWindow(dpy, c->title, c->tx + 2 * sw, c->ty, c->tw, c->th); + XMoveResizeWindow(dpy, c->twin, c->tx + 2 * sw, c->ty, c->tw, c->th); } @@ -43,57 +76,35 @@ void ban(Client *c) { XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); - XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty); + XMoveWindow(dpy, c->twin, c->tx + 2 * sw, c->ty); } void focus(Client *c) { - Client *old = sel; + Client *old; - if (!issel) + if(!issel) return; - if(sel && sel->ismax) - togglemax(NULL); - sel = c; - if(old && old != c) - drawtitle(old); - drawtitle(c); - XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); -} - -void -focusnext(Arg *arg) -{ - Client *c; - if(!sel) - return; - - if(!(c = getnext(sel->next))) - c = getnext(clients); - if(c) { - focus(c); - restack(); - } -} - -void -focusprev(Arg *arg) -{ - Client *c; - - if(!sel) - return; - - if(!(c = getprev(sel->prev))) { - for(c = clients; c && c->next; c = c->next); - c = getprev(c); + sel = c; + else if(sel != c) { + if(maximized) + togglemax(NULL); + old = sel; + sel = c; + if(old) { + grabbuttons(old, False); + drawtitle(old); + } } if(c) { - focus(c); - restack(); + grabbuttons(c, True); + drawtitle(c); + XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); } + else + XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); } Client * @@ -113,7 +124,7 @@ getctitle(Window w) Client *c; for(c = clients; c; c = c->next) - if(c->title == w) + if(c->twin == w) return c; return NULL; } @@ -187,6 +198,7 @@ killclient(Arg *arg) void manage(Window w, XWindowAttributes *wa) { + unsigned int i; Client *c; Window trans; XSetWindowAttributes twa; @@ -203,8 +215,14 @@ manage(Window w, XWindowAttributes *wa) c->border = 0; setsize(c); + if(c->x + c->w + 2 > sw) + c->x = sw - c->w - 2; + if(c->x < 0) + c->x = 0; + if(c->y + c->h + 2 > sh) + c->y = sh - c->h - 2; if(c->h != sh && c->y < bh) - c->y = c->ty = bh; + c->y = bh; c->proto = getproto(c->win); XSelectInput(dpy, c->win, @@ -214,57 +232,32 @@ manage(Window w, XWindowAttributes *wa) twa.background_pixmap = ParentRelative; twa.event_mask = ExposureMask | EnterWindowMask; - c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th, + c->twin = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th, 0, DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); + grabbuttons(c, False); + settags(c, getclient(trans)); + if(!c->isfloat) + c->isfloat = trans + || (c->maxw && c->minw && + c->maxw == c->minw && c->maxh == c->minh); + if(c->isfloat) + c->weight = ntags; + if(clients) clients->prev = c; c->next = clients; clients = c; - XGrabButton(dpy, Button1, MODKEY, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button1, MODKEY | LockMask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button1, MODKEY | numlockmask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button1, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - - XGrabButton(dpy, Button2, MODKEY, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button2, MODKEY | LockMask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button2, MODKEY | numlockmask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button2, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - - XGrabButton(dpy, Button3, MODKEY, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button3, MODKEY | LockMask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button3, MODKEY | numlockmask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - XGrabButton(dpy, Button3, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK, - GrabModeAsync, GrabModeSync, None, None); - - settags(c); - if(!c->isfloat) - c->isfloat = trans - || (c->maxw && c->minw && - c->maxw == c->minw && c->maxh == c->minh); settitle(c); - - if(isvisible(c)) - sel = c; - arrange(NULL); + ban(c); XMapWindow(dpy, c->win); - XMapWindow(dpy, c->title); + XMapWindow(dpy, c->twin); if(isvisible(c)) focus(c); + arrange(NULL); } void @@ -272,7 +265,6 @@ resize(Client *c, Bool sizehints, Corner sticky) { int bottom = c->y + c->h; int right = c->x + c->w; - /*XConfigureEvent e;*/ XWindowChanges wc; if(sizehints) { @@ -289,10 +281,6 @@ resize(Client *c, Bool sizehints, Corner sticky) if(c->maxh && c->h > c->maxh) c->h = c->maxh; } - if(c->x > right) /* might happen on restart */ - c->x = right - c->w; - if(c->y > bottom) - c->y = bottom - c->h; if(sticky == TopRight || sticky == BotRight) c->x = right - c->w; if(sticky == BotLeft || sticky == BotRight) @@ -382,12 +370,13 @@ void togglemax(Arg *arg) { int ox, oy, ow, oh; + Client *c; XEvent ev; if(!sel) return; - if((sel->ismax = !sel->ismax)) { + if((maximized = !maximized)) { ox = sel->x; oy = sel->y; ow = sel->w; @@ -398,6 +387,9 @@ togglemax(Arg *arg) 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; @@ -406,61 +398,36 @@ togglemax(Arg *arg) sel->h = oh; } else - resize(sel, False, TopLeft); + arrange(NULL); while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); } void unmanage(Client *c) { + Client *tc, *fc; + Window trans; XGrabServer(dpy); XSetErrorHandler(xerrordummy); + detach(c); + if(sel == c) { + XGetTransientForHint(dpy, c->win, &trans); + if(trans && (tc = getclient(trans)) && isvisible(tc)) + fc = tc; + else + fc = getnext(clients); + focus(fc); + } + XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - XDestroyWindow(dpy, c->title); - - if(c->prev) - c->prev->next = c->next; - if(c->next) - c->next->prev = c->prev; - if(c == clients) - clients = c->next; - if(sel == c) - sel = getnext(clients); + XDestroyWindow(dpy, c->twin); + free(c->tags); free(c); XSync(dpy, False); XSetErrorHandler(xerror); XUngrabServer(dpy); - if(sel) - focus(sel); - arrange(NULL); -} - -void -zoom(Arg *arg) -{ - Client *c; - - if(!sel || (arrange != dotile) || sel->isfloat || sel->ismax) - return; - - if(sel == getnext(clients)) { - if((c = getnext(sel->next))) - sel = c; - else - return; - } - - /* pop */ - sel->prev->next = sel->next; - if(sel->next) - sel->next->prev = sel->prev; - sel->prev = NULL; - clients->prev = sel; - sel->next = clients; - clients = sel; - focus(sel); arrange(NULL); }