X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=dwm.c;h=ae2952bf64e383d8f6e574d61feb5cca79d0e85b;hb=db5db8806f4bbb26bb1259f7ea42d7a826517bbb;hp=fa8344a0f52906b2366ab190f90bdbc1ff0ef2ed;hpb=2b4157eccd649682c200de837193dd0a24129dc7;p=dwm.git diff --git a/dwm.c b/dwm.c index fa8344a..ae2952b 100644 --- a/dwm.c +++ b/dwm.c @@ -158,7 +158,6 @@ static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size); static void grabbuttons(Client *c, Bool focused); static void grabkeys(void); static void initfont(const char *fontstr); -static void initmodmap(void); static Bool isprotodel(Client *c); static void keypress(XEvent *e); static void killclient(const Arg *arg); @@ -752,15 +751,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; - 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); + /* 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); + + { /* 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); + } } } @@ -770,8 +781,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--) @@ -804,19 +813,6 @@ initfont(const char *fontstr) { dc.font.height = dc.font.ascent + dc.font.descent; } -void -initmodmap(void) { - unsigned int i, j; - XModifierKeymap *modmap; - - 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); -} - Bool isprotodel(Client *c) { int i, n; @@ -929,10 +925,8 @@ mappingnotify(XEvent *e) { XMappingEvent *ev = &e->xmapping; XRefreshKeyboardMapping(ev); - if(ev->request == MappingKeyboard) { - initmodmap(); + if(ev->request == MappingKeyboard) grabkeys(); - } } void @@ -1052,23 +1046,34 @@ quit(const Arg *arg) { void resize(Client *c, int x, int y, int w, int h, Bool sizehints) { + float a; 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) + a = (float) w/h; + if(a > c->maxa) w = h * c->maxa; - else if(c->mina > (float) h/w) - h = w * c->mina; + else if(a < c->mina) + h = w / c->mina; + } + + if(baseismin) { /* increment calculation requires this */ + w -= c->basew; + h -= c->baseh; } /* adjust for increment value */ @@ -1379,7 +1384,6 @@ setup(void) { XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); XSelectInput(dpy, root, wa.event_mask); - initmodmap(); grabkeys(); }