X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=client.c;h=c18d88b582a40584085370f3354357076c3b6036;hb=7e597ae204ce94398f8c722e335f20d5a4a30c8a;hp=773b8f82148d993878b177bb371b02e5d0aff269;hpb=fde45ebed844c227a17c21d161f60aa55c8b3c41;p=dwm.git diff --git a/client.c b/client.c index 773b8f8..c18d88b 100644 --- a/client.c +++ b/client.c @@ -11,24 +11,42 @@ /* static functions */ static void +grabbutton(Client *c, unsigned int button, unsigned int modifier) +{ + XGrabButton(dpy, button, modifier, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(dpy, button, modifier | LockMask, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(dpy, button, modifier | numlockmask, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + XGrabButton(dpy, button, modifier | numlockmask | LockMask, c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); +} + +static void resizetitle(Client *c) { int i; - c->tw = 0; - for(i = 0; i < ntags; i++) - if(c->tags[i]) - c->tw += textw(tags[i]); - c->tw += textw(c->name); + 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(c->tags[tsel]) - XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th); + if(isvisible(c)) + 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); + +} +static void +ungrabbutton(Client *c, unsigned int button, unsigned int modifier) +{ + XUngrabButton(dpy, button, modifier, c->win); + XUngrabButton(dpy, button, modifier | LockMask, c->win); + XUngrabButton(dpy, button, modifier | numlockmask, c->win); + XUngrabButton(dpy, button, modifier | numlockmask | LockMask, c->win); } static int @@ -43,64 +61,28 @@ 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) { - if (!issel) - return; Client *old = sel; - XEvent ev; - - sel = c; - if(old && old != c) - drawtitle(old); - drawtitle(c); - XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); - XSync(dpy, False); - while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); -} -void -focusnext(Arg *arg) -{ - Client *c; - - if(!sel) + if(!issel) return; - - if(sel->ismax) - togglemax(NULL); - - if(!(c = getnext(sel->next))) - c = getnext(clients); - if(c) { - higher(c); - focus(c); - } -} - -void -focusprev(Arg *arg) -{ - Client *c; - if(!sel) - return; - - if(sel->ismax) - togglemax(NULL); - - if(!(c = getprev(sel->prev))) { - for(c = clients; c && c->next; c = c->next); - c = getprev(c); - } - if(c) { - higher(c); - focus(c); + sel = c; + else if(sel != c) { + if(sel->ismax) + togglemax(NULL); + sel = c; + grabbutton(old, AnyButton, 0); + drawtitle(old); } + ungrabbutton(c, AnyButton, 0); + drawtitle(c); + XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); } Client * @@ -120,7 +102,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; } @@ -181,13 +163,6 @@ gravitate(Client *c, Bool invert) } void -higher(Client *c) -{ - XRaiseWindow(dpy, c->win); - XRaiseWindow(dpy, c->title); -} - -void killclient(Arg *arg) { if(!sel) @@ -201,7 +176,8 @@ killclient(Arg *arg) void manage(Window w, XWindowAttributes *wa) { - Client *c; + unsigned int i; + Client *c, *tc; Window trans; XSetWindowAttributes twa; @@ -217,8 +193,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, @@ -228,7 +210,7 @@ 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); @@ -238,45 +220,26 @@ manage(Window w, XWindowAttributes *wa) 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); + grabbutton(c, Button1, MODKEY); + grabbutton(c, Button2, MODKEY); + grabbutton(c, Button3, MODKEY); - settags(c); + if((tc = getclient(trans))) /* inherit tags */ + for(i = 0; i < ntags; i++) + c->tags[i] = tc->tags[i]; + else + 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); - - /* mapping the window now prevents flicker */ - XMapRaised(dpy, c->win); - XMapRaised(dpy, c->title); - if(c->tags[tsel]) + XMapWindow(dpy, c->win); + XMapWindow(dpy, c->twin); + if(isvisible(c)) focus(c); } @@ -285,7 +248,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) { @@ -302,10 +264,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) @@ -367,7 +325,7 @@ void settitle(Client *c) { char **list = NULL; - int n; + int i, n; XTextProperty name; name.nitems = 0; @@ -410,8 +368,8 @@ togglemax(Arg *arg) sel->w = sw - 2; sel->h = sh - 2 - bh; - higher(sel); - resize(sel, False, TopLeft); + restack(); + resize(sel, arrange == dofloat, TopLeft); sel->x = ox; sel->y = oy; @@ -430,7 +388,7 @@ unmanage(Client *c) XSetErrorHandler(xerrordummy); XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - XDestroyWindow(dpy, c->title); + XDestroyWindow(dpy, c->twin); if(c->prev) c->prev->next = c->next; @@ -438,49 +396,15 @@ unmanage(Client *c) c->next->prev = c->prev; if(c == clients) clients = c->next; - if(sel == c) { - sel = getnext(c->next); - if(!sel) - sel = getprev(c->prev); - if(!sel) - sel = clients; - } + if(sel == c) + sel = getnext(clients); free(c->tags); free(c); XSync(dpy, False); XSetErrorHandler(xerror); XUngrabServer(dpy); - arrange(NULL); if(sel) focus(sel); -} - -void -zoom(Arg *arg) -{ - Client *c; - - if(!sel || (arrange != dotile) || sel->isfloat) - return; - - if(sel == getnext(clients)) { - if((c = getnext(sel->next))) - sel = c; - else - return; - } - - /* pop */ - if(sel->prev) - sel->prev->next = sel->next; - if(sel->next) - sel->next->prev = sel->prev; - sel->prev = NULL; - if(clients) - clients->prev = sel; - sel->next = clients; - clients = sel; arrange(NULL); - focus(sel); }