void
zoom(Arg *arg)
{
- Client **l, *old;
+ Client **l, *c;
- if(!(old = sel))
+ if(!sel)
return;
+ if(sel == next(clients) && sel->next) {
+ if((c = next(sel->next)))
+ sel = c;
+ }
+
for(l = &clients; *l && *l != sel; l = &(*l)->next);
*l = sel->next;
- old->next = clients; /* pop */
- clients = old;
- sel = old;
+ sel->next = clients; /* pop */
+ clients = sel;
arrange(NULL);
focus(sel);
}
if(!sel)
return;
sel->x = sx;
- sel->y = sy;
+ sel->y = sy + bh;
sel->w = sw - 2 * sel->border;
- sel->h = sh - 2 * sel->border;
+ sel->h = sh - 2 * sel->border - bh;
craise(sel);
resize(sel, False);
- discard_events(EnterWindowMask);
}
void
for(c = clients; c; c = next(c->next))
draw_client(c);
+ draw_bar();
}
void
focus(sel);
}
}
- discard_events(EnterWindowMask);
}
void
if(c->tags[tsel] && !c->floating)
n++;
- h = (n > 1) ? sh / (n - 1) : sh;
+ if(n > 1)
+ h = (sh - bh) / (n - 1);
+ else
+ h = sh - bh;
for(i = 0, c = clients; c; c = c->next) {
if(c->tags[tsel]) {
}
if(n == 1) {
c->x = sx;
- c->y = sy;
+ c->y = sy + bh;
c->w = sw - 2 * c->border;
- c->h = sh - 2 * c->border;
+ c->h = sh - 2 * c->border - bh;
}
else if(i == 0) {
c->x = sx;
- c->y = sy;
+ c->y = sy + bh;
c->w = mw - 2 * c->border;
- c->h = sh - 2 * c->border;
+ c->h = sh - 2 * c->border - bh;
}
else {
c->x = sx + mw;
- c->y = sy + (i - 1) * h;
+ c->y = sy + (i - 1) * h + bh;
c->w = w - 2 * c->border;
c->h = h - 2 * c->border;
}
else
ban_client(c);
}
- if(sel && !sel->tags[tsel]) {
+ if(!sel || (sel && !sel->tags[tsel])) {
if((sel = next(clients))) {
craise(sel);
focus(sel);
}
}
- discard_events(EnterWindowMask);
}
void
focus(Client *c)
{
Client *old = sel;
+ XEvent ev;
+ XFlush(dpy);
sel = c;
if(old && old != c)
draw_client(old);
draw_client(c);
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
XFlush(dpy);
- discard_events(EnterWindowMask);
+ while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
}
static void
c->win = w;
c->tx = c->x = wa->x;
c->ty = c->y = wa->y;
+ if(c->y < bh)
+ c->ty = c->y += bh;
c->tw = c->w = wa->width;
c->h = wa->height;
- c->th = th;
+ c->th = bh;
c->border = 1;
c->proto = win_proto(c->win);
update_size(c);
c->next = *l; /* *l == nil */
*l = c;
- XMapRaised(dpy, c->win);
- XMapRaised(dpy, c->title);
XGrabButton(dpy, Button1, Mod1Mask, c->win, False, ButtonPressMask,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button2, Mod1Mask, c->win, False, ButtonPressMask,
|| ((c->maxw == c->minw) && (c->maxh == c->minh));
arrange(NULL);
- if(c->tags[tsel])
+ /* mapping the window now prevents flicker */
+ if(c->tags[tsel]) {
+ XMapRaised(dpy, c->win);
+ XMapRaised(dpy, c->title);
focus(c);
- else
+ }
+ else {
ban_client(c);
+ XMapRaised(dpy, c->win);
+ XMapRaised(dpy, c->title);
+ }
}
void
if(c->inch)
c->h -= (c->h - c->baseh) % c->inch;
}
+ if(c->x > sw) /* might happen on restart */
+ c->x = sw - c->w;
+ if(c->y > sh)
+ c->ty = c->y = sh - c->h;
if(c->minw && c->w < c->minw)
c->w = c->minw;
if(c->minh && c->h < c->minh)
{
int i;
if(c == sel) {
+ draw_bar();
XUnmapWindow(dpy, c->title);
XSetWindowBorder(dpy, c->win, dc.fg);
return;
XMapWindow(dpy, c->title);
dc.x = dc.y = 0;
- dc.h = c->th;
dc.w = 0;
for(i = 0; i < TLast; i++) {
if(c->tags[i]) {
dc.x += dc.w;
dc.w = textw(c->tags[i]) + dc.font.height;
- draw(True, c->tags[i]);
+ drawtext(c->tags[i], False, True);
}
}
dc.x += dc.w;
dc.w = textw(c->name) + dc.font.height;
- draw(True, c->name);
+ drawtext(c->name, False, True);
XCopyArea(dpy, dc.drawable, c->title, dc.gc,
0, 0, c->tw, c->th, 0, 0);
XFlush(dpy);