JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
reverted some resize() changes, reverted setlocale removal
[dwm.git] / dwm.c
diff --git a/dwm.c b/dwm.c
index ec87228..4ea16e0 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -24,6 +24,7 @@
  * To understand everything else, start reading main().
  */
 #include <errno.h>
+#include <locale.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -751,25 +752,27 @@ grabbuttons(Client *c, Bool focused) {
 void
 grabkeys(void) {
        unsigned int i, j;
-       unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
-       KeyCode code;
        XModifierKeymap *modmap;
 
-       /* init modifier map */
+       /* update modifier map */
        modmap = XGetModifierMapping(dpy);
        for(i = 0; i < 8; i++)
-               for(j = 0; j < modmap->max_keypermod; j++) {
+               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);
 
-       XUngrabKey(dpy, AnyKey, AnyModifier, root);
-       for(i = 0; i < LENGTH(keys); i++) {
-               code = XKeysymToKeycode(dpy, keys[i].keysym);
-               for(j = 0; j < LENGTH(modifiers); j++)
-                       XGrabKey(dpy, code, keys[i].mod | modifiers[j], root, True,
-                                GrabModeAsync, GrabModeAsync);
+       { /* grab keys */
+               unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
+               KeyCode code;
+
+               XUngrabKey(dpy, AnyKey, AnyModifier, root);
+               for(i = 0; i < LENGTH(keys); i++) {
+                       code = XKeysymToKeycode(dpy, keys[i].keysym);
+                       for(j = 0; j < LENGTH(modifiers); j++)
+                               XGrabKey(dpy, code, keys[i].mod | modifiers[j], root, True,
+                                        GrabModeAsync, GrabModeAsync);
+               }
        }
 }
 
@@ -779,8 +782,6 @@ initfont(const char *fontstr) {
        int i, n;
 
        missing = NULL;
-       if(dc.font.set)
-               XFreeFontSet(dpy, dc.font.set);
        dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
        if(missing) {
                while(n--)
@@ -1049,22 +1050,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;
@@ -1373,8 +1383,6 @@ setup(void) {
        XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa);
        XSelectInput(dpy, root, wa.event_mask);
 
-
-       /* grab keys */
        grabkeys();
 }
 
@@ -1703,7 +1711,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)))