y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
x = dc.x + (h / 2);
/* shorten text if necessary */
- for(len = MIN(olen, sizeof buf); len && textnw(buf, len) > dc.w - h; len--);
+ for(len = MIN(olen, sizeof buf); len && textnw(text, len) > dc.w - h; len--);
if(!len)
return;
memcpy(buf, text, len);
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);
+ }
}
}
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--)
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 */
None, cursor[CurResize], CurrentTime) != GrabSuccess)
return;
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1);
- for(;;) {
- XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask , &ev);
+ do {
+ XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev);
switch(ev.type) {
- case ButtonRelease:
- XWarpPointer(dpy, None, c->win, 0, 0, 0, 0,
- c->w + c->bw - 1, c->h + c->bw - 1);
- XUngrabPointer(dpy, CurrentTime);
- while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
- return;
case ConfigureRequest:
case Expose:
case MapRequest:
break;
}
}
+ while(ev.type != ButtonRelease);
+ XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1);
+ XUngrabPointer(dpy, CurrentTime);
+ while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
}
void
XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa);
XSelectInput(dpy, root, wa.event_mask);
-
- /* grab keys */
grabkeys();
}
void
toggletag(const Arg *arg) {
- unsigned int mask = sel->tags ^ (arg->ui & TAGMASK);
+ unsigned int mask;
+ if (!sel)
+ return;
+
+ mask = sel->tags ^ (arg->ui & TAGMASK);
if(sel && mask) {
sel->tags = mask;
arrange();