/* variables */
static char stext[256];
static int screen;
-static int sx, sy, sw, sh; /* display geometry x, y, width, height */
+static int sx, sy, sw, sh; /* X display screen geometry x, y, width, height */
static int by, bh, blw; /* bar geometry y, height and layout symbol width */
static int wx, wy, ww, wh; /* window area geometry x, y, width, height, bar excluded */
static unsigned int seltags = 0, sellt = 0;
void
drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
+ char buf[256];
int i, x, y, h, len, olen;
XRectangle r = { dc.x, dc.y, dc.w, dc.h };
- char buf[256];
XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]);
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
if(!text)
return;
olen = strlen(text);
- len = MIN(olen, sizeof buf);
- memcpy(buf, text, len);
h = dc.font.ascent + dc.font.descent;
y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent;
x = dc.x + (h / 2);
/* shorten text if necessary */
- for(; len && (i = 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);
if(len < olen)
for(i = len; i && i > len - 3; buf[--i] = '.');
XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]);
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
manage(Window w, XWindowAttributes *wa) {
Client *c, *t = NULL;
- Window trans = 0;
+ Window trans = None;
XWindowChanges wc;
if(!(c = calloc(1, sizeof(Client))))
else
applyrules(c);
if(!c->isfloating)
- c->isfloating = trans || c->isfixed;
+ c->isfloating = trans != None || c->isfixed;
if(c->isfloating)
XRaiseWindow(dpy, c->win);
attach(c);
if(!(c = sel))
return;
restack();
- ocx = nx = c->x;
- ocy = ny = c->y;
+ ocx = c->x;
+ ocy = c->y;
if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
None, cursor[CurMove], CurrentTime) != GrabSuccess)
return;
XQueryPointer(dpy, root, &dummy, &dummy, &x, &y, &di, &di, &dui);
- for(;;) {
+ do {
XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev);
switch (ev.type) {
- case ButtonRelease:
- XUngrabPointer(dpy, CurrentTime);
- return;
case ConfigureRequest:
case Expose:
case MapRequest:
break;
}
}
+ while(ev.type != ButtonRelease);
+ XUngrabPointer(dpy, CurrentTime);
}
Client *
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
void
scan(void) {
unsigned int i, num;
- Window *wins, d1, d2;
+ Window d1, d2, *wins = NULL;
XWindowAttributes wa;
- wins = NULL;
if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) {
for(i = 0; i < num; i++) {
if(!XGetWindowAttributes(dpy, wins[i], &wa)
&& (wa.map_state == IsViewable || getstate(wins[i]) == IconicState))
manage(wins[i], &wa);
}
+ if(wins)
+ XFree(wins);
}
- if(wins)
- XFree(wins);
}
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();
void
view(const Arg *arg) {
- if(arg && (arg->ui & TAGMASK) == tagset[seltags])
+ if((arg->ui & TAGMASK) == tagset[seltags])
return;
seltags ^= 1; /* toggle sel tagset */
- if(arg && (arg->ui & TAGMASK))
+ if(arg->ui & TAGMASK)
tagset[seltags] = arg->ui & TAGMASK;
clearurgent();
arrange();