X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=dwm.c;h=52a3540753de50b159f3e6064ae3188c506dbe66;hb=4b3b597da3523078b5f30b3571c896bf2056fcb5;hp=ba24d9a6b78ec79a58fa66d460b630bfc8cfd050;hpb=258c3380305683de8031871cf95c1cc04ed7ad9e;p=dwm.git diff --git a/dwm.c b/dwm.c index ba24d9a..52a3540 100644 --- a/dwm.c +++ b/dwm.c @@ -24,6 +24,7 @@ * To understand everything else, start reading main(). */ #include +#include #include #include #include @@ -59,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 { WMProtocols, WMDelete, WMState, WMLast }; /* default atoms */ enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ @@ -190,6 +191,7 @@ static void unmanage(Client *c); static void unmapnotify(XEvent *e); static void updatebar(void); static void updategeom(void); +static void updatenumlockmask(void); static void updatesizehints(Client *c); static void updatetitle(Client *c); static void updatewmhints(Client *c); @@ -734,34 +736,27 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size) { void grabbuttons(Client *c, Bool focused) { - unsigned int i, j; - unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; - - XUngrabButton(dpy, AnyButton, AnyModifier, c->win); - if(focused) { - for(i = 0; i < LENGTH(buttons); i++) - 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); + updatenumlockmask(); + { + unsigned int i, j; + unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; + XUngrabButton(dpy, AnyButton, AnyModifier, c->win); + if(focused) { + for(i = 0; i < LENGTH(buttons); i++) + 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); + } } void grabkeys(void) { - unsigned int i, j; - XModifierKeymap *modmap; - - /* update modifier map */ - modmap = XGetModifierMapping(dpy); - for(i = 0; i < 8; i++) - for(j = 0; j < modmap->max_keypermod; j++) - if(modmap->modifiermap[i * modmap->max_keypermod + j] == XKeysymToKeycode(dpy, XK_Num_Lock)) - numlockmask = (1 << i); - XFreeModifiermap(modmap); - + updatenumlockmask(); { /* grab keys */ + unsigned int i, j; unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; KeyCode code; @@ -1049,22 +1044,31 @@ resize(Client *c, int x, int y, int w, int h, Bool sizehints) { XWindowChanges wc; if(sizehints) { + /* see last two sentences in ICCCM 4.1.2.3 */ + Bool baseismin = c->basew == c->minw && c->baseh == c->minh; + /* set minimum possible */ w = MAX(1, w); h = MAX(1, h); - /* temporarily remove base dimensions */ - w -= c->basew; - h -= c->baseh; + if(!baseismin) { /* temporarily remove base dimensions */ + w -= c->basew; + h -= c->baseh; + } /* adjust for aspect limits */ if(c->mina > 0 && c->maxa > 0) { - if(c->maxa < (float) w/h) + if(c->maxa < (float)(w / h)) w = h * c->maxa; - else if(c->mina > (float) h/w) + else if(c->mina < (float)(h / w)) h = w * c->mina; } + if(baseismin) { /* increment calculation requires this */ + w -= c->basew; + h -= c->baseh; + } + /* adjust for increment value */ if(c->incw) w -= w % c->incw; @@ -1322,7 +1326,6 @@ setup(void) { /* init atoms */ wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); - wmatom[WMName] = XInternAtom(dpy, "WM_NAME", False); wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); @@ -1565,6 +1568,20 @@ updategeom(void) { by = showbar ? (topbar ? wy - bh : wy + wh) : -bh; } +void +updatenumlockmask(void) { + unsigned int i, j; + XModifierKeymap *modmap; + + numlockmask = 0; + modmap = XGetModifierMapping(dpy); + for(i = 0; i < 8; i++) + for(j = 0; j < modmap->max_keypermod; j++) + if(modmap->modifiermap[i * modmap->max_keypermod + j] == XKeysymToKeycode(dpy, XK_Num_Lock)) + numlockmask = (1 << i); + XFreeModifiermap(modmap); +} + void updatesizehints(Client *c) { long msize; @@ -1616,7 +1633,7 @@ updatesizehints(Client *c) { void updatetitle(Client *c) { if(!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name)) - gettextprop(c->win, wmatom[WMName], c->name, sizeof c->name); + gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name); } void @@ -1701,7 +1718,7 @@ main(int argc, char *argv[]) { else if(argc != 1) die("usage: dwm [-v]\n"); - if(!XSupportsLocale()) + if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) fprintf(stderr, "warning: no locale support\n"); if(!(dpy = XOpenDisplay(0)))