X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=dwm.c;h=e13571581b718c694461268bf020b82206bbff84;hb=9bb0f20515023aa5471c628d01a6e65e93040dc1;hp=3c5e6df70985360045be610a2b7323deb8f02b7a;hpb=c2a916bf3021d9e16419eccbd553d967404ad6e4;p=dwm.git diff --git a/dwm.c b/dwm.c index 3c5e6df..e135715 100644 --- a/dwm.c +++ b/dwm.c @@ -60,7 +60,7 @@ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ enum { ColBorder, ColFG, ColBG, ColLast }; /* color */ enum { NetSupported, NetWMName, NetLast }; /* EWMH atoms */ enum { WMProtocols, WMDelete, WMName, WMState, WMLast };/* default atoms */ -enum { ClkLtSymbol = 64, ClkStatusText, ClkWinTitle, +enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ /* typedefs */ @@ -304,17 +304,18 @@ attachstack(Client *c) { void buttonpress(XEvent *e) { uint i, x, click; + Arg arg = {0}; Client *c; XButtonPressedEvent *ev = &e->xbutton; click = ClkRootWin; if(ev->window == barwin) { i = x = 0; - do - x += TEXTW(tags[i]); - while(ev->x >= x && ++i < LENGTH(tags)); - if(i < LENGTH(tags)) - click = i; + do x += TEXTW(tags[i]); while(ev->x >= x && ++i < LENGTH(tags)); + if(i < LENGTH(tags)) { + click = ClkTagBar; + arg.ui = 1 << i; + } else if(ev->x < x + blw) click = ClkLtSymbol; else if(ev->x > wx + ww - TEXTW(stext)) @@ -330,7 +331,7 @@ buttonpress(XEvent *e) { for(i = 0; i < LENGTH(buttons); i++) if(click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) - buttons[i].func(&buttons[i].arg); + buttons[i].func(click == ClkTagBar ? &arg : &buttons[i].arg); } void @@ -722,19 +723,18 @@ gettextprop(Window w, Atom atom, char *text, uint size) { void grabbuttons(Client *c, Bool focused) { - int i, j; - uint buttons[] = { Button1, Button2, Button3 }; - uint modifiers[] = { MODKEY, MODKEY|LockMask, MODKEY|numlockmask, MODKEY|numlockmask|LockMask }; + uint i, j; + uint modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - if(focused) + if(focused) { for(i = 0; i < LENGTH(buttons); i++) - for(j = 0; j < LENGTH(modifiers); j++) - XGrabButton(dpy, buttons[i], modifiers[j], c->win, False, - BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); - else + if(buttons[i].click == ClkClientWin) + for(j = 0; j < LENGTH(modifiers); j++) + XGrabButton(dpy, buttons[i].button, buttons[i].mask | modifiers[j], c->win, False, BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + } else XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, - BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); } void @@ -928,7 +928,7 @@ manage(Window w, XWindowAttributes *wa) { XRaiseWindow(dpy, c->win); attach(c); attachstack(c); - XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); /* some windows require this */ + XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ XMapWindow(dpy, c->win); setclientstate(c, NormalState); arrange(); @@ -961,7 +961,7 @@ monocle(void) { Client *c; for(c = nexttiled(clients); c; c = nexttiled(c->next)) - resize(c, wx, wy, ww, wh, resizehints); + resize(c, wx, wy, ww - 2 * c->bw, wh - 2 * c->bw, resizehints); } void @@ -1295,8 +1295,9 @@ setclientstate(Client *c, long state) { void setlayout(const Arg *arg) { - sellt ^= 1; - if(arg && arg->v && arg->v != lt[sellt]) + if(!arg || !arg->v || arg->v != lt[sellt]) + sellt ^= 1; + if(arg && arg->v) lt[sellt] = (Layout *)arg->v; if(sel) arrange(); @@ -1702,7 +1703,9 @@ main(int argc, char *argv[]) { else if(argc != 1) eprint("usage: dwm [-v]\n"); - setlocale(LC_CTYPE, ""); + if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) + fprintf(stderr, "warning: no locale support\n"); + if(!(dpy = XOpenDisplay(0))) eprint("dwm: cannot open display\n");