/* static functions */
static void
-grabbuttons(Client *c, Bool focus)
-{
+detachstack(Client *c) {
+ Client **tc;
+ for(tc=&stack; *tc && *tc != c; tc=&(*tc)->snext);
+ *tc = c->snext;
+}
+
+static void
+grabbuttons(Client *c, Bool focused) {
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
- if(focus) {
+ if(focused) {
XGrabButton(dpy, Button1, MODKEY, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button1, MODKEY | LockMask, c->win, False, BUTTONMASK,
else
XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
-
}
static void
-resizetitle(Client *c)
-{
+resizetitle(Client *c) {
c->tw = textw(c->name);
if(c->tw > c->w)
c->tw = c->w + 2;
XMoveResizeWindow(dpy, c->twin, c->tx, c->ty, c->tw, c->th);
else
XMoveResizeWindow(dpy, c->twin, c->tx + 2 * sw, c->ty, c->tw, c->th);
-
}
static int
-xerrordummy(Display *dsply, XErrorEvent *ee)
-{
+xerrordummy(Display *dsply, XErrorEvent *ee) {
return 0;
}
/* extern functions */
void
-ban(Client *c)
-{
+ban(Client *c) {
XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
XMoveWindow(dpy, c->twin, c->tx + 2 * sw, c->ty);
}
void
-focus(Client *c)
-{
+focus(Client *c) {
Client *old;
- if(!issel)
+ if(!issel || (c && !isvisible(c)))
return;
if(!sel)
sel = c;
else if(sel != c) {
- if(maximized)
- togglemax(NULL);
old = sel;
sel = c;
if(old) {
}
}
if(c) {
+ detachstack(c);
+ c->snext = stack;
+ stack = c;
grabbuttons(c, True);
drawtitle(c);
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
}
Client *
-getclient(Window w)
-{
+getclient(Window w) {
Client *c;
for(c = clients; c; c = c->next)
}
Client *
-getctitle(Window w)
-{
+getctitle(Window w) {
Client *c;
for(c = clients; c; c = c->next)
}
void
-gravitate(Client *c, Bool invert)
-{
+gravitate(Client *c, Bool invert) {
int dx = 0, dy = 0;
switch(c->grav) {
}
void
-killclient(Arg *arg)
-{
+killclient(Arg *arg) {
if(!sel)
return;
if(sel->proto & PROTODELWIN)
}
void
-manage(Window w, XWindowAttributes *wa)
-{
- unsigned int i;
- Client *c, *tc;
+manage(Window w, XWindowAttributes *wa) {
+ Client *c;
Window trans;
XSetWindowAttributes twa;
c->th = bh;
c->border = 0;
- setsize(c);
+ updatesize(c);
if(c->x + c->w + 2 > sw)
c->x = sw - c->w - 2;
CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
grabbuttons(c, False);
- if((tc = getclient(trans))) /* inherit tags */
- for(i = 0; i < ntags; i++)
- c->tags[i] = tc->tags[i];
- else
- settags(c);
+ settags(c, getclient(trans));
if(!c->isfloat)
c->isfloat = trans
|| (c->maxw && c->minw &&
if(clients)
clients->prev = c;
c->next = clients;
- clients = c;
+ c->snext = stack;
+ stack = clients = c;
- settitle(c);
- arrange(NULL);
+ updatetitle(c);
+ ban(c);
XMapWindow(dpy, c->win);
XMapWindow(dpy, c->twin);
if(isvisible(c))
focus(c);
+ arrange(NULL);
}
void
-resize(Client *c, Bool sizehints, Corner sticky)
-{
+resize(Client *c, Bool sizehints, Corner sticky) {
int bottom = c->y + c->h;
int right = c->x + c->w;
XWindowChanges wc;
if(sticky == BotLeft || sticky == BotRight)
c->y = bottom - c->h;
+ /* offscreen appearance fixes */
+ if(c->x + c->w < 0)
+ c->x = 0;
+ if(c->y + c->h < bh)
+ c->y = bh;
+ if(c->x > sw)
+ c->x = sw - c->w;
+ if(c->y > sh)
+ c->y = sh - c->h;
+
resizetitle(c);
wc.x = c->x;
wc.y = c->y;
wc.border_width = 0;
else
wc.border_width = 1;
- XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
+ XConfigureWindow(dpy, c->win, CWX | CWY | CWWidth | CWHeight | CWBorderWidth, &wc);
XSync(dpy, False);
}
void
-setsize(Client *c)
-{
+updatesize(Client *c) {
long msize;
XSizeHints size;
}
void
-settitle(Client *c)
-{
+updatetitle(Client *c) {
char **list = NULL;
int n;
XTextProperty name;
}
void
-togglemax(Arg *arg)
-{
- int ox, oy, ow, oh;
- Client *c;
- XEvent ev;
-
- if(!sel)
- return;
+unmanage(Client *c) {
+ Client *nc;
- if((maximized = !maximized)) {
- ox = sel->x;
- oy = sel->y;
- ow = sel->w;
- oh = sel->h;
- sel->x = sx;
- sel->y = sy + bh;
- sel->w = sw - 2;
- sel->h = sh - 2 - bh;
-
- restack();
- for(c = getnext(clients); c; c = getnext(c->next))
- if(c != sel)
- ban(c);
- resize(sel, arrange == dofloat, TopLeft);
-
- sel->x = ox;
- sel->y = oy;
- sel->w = ow;
- sel->h = oh;
- }
- else
- arrange(NULL);
- while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
-}
-
-void
-unmanage(Client *c)
-{
- Client *tc, *fc;
- Window trans;
+ /* The server grab construct avoids race conditions. */
XGrabServer(dpy);
XSetErrorHandler(xerrordummy);
detach(c);
+ detachstack(c);
if(sel == c) {
- XGetTransientForHint(dpy, c->win, &trans);
- if(trans && (tc = getclient(trans)) && isvisible(tc))
- fc = tc;
- else
- fc = getnext(clients);
- focus(fc);
+ for(nc = stack; nc && !isvisible(nc); nc = nc->snext);
+ focus(nc);
}
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);