/* static functions */
static void
-detachstack(Client *c)
-{
+detachstack(Client *c) {
Client **tc;
for(tc=&stack; *tc && *tc != c; tc=&(*tc)->snext);
*tc = c->snext;
}
static void
-grabbuttons(Client *c, Bool focused)
-{
+grabbuttons(Client *c, Bool focused) {
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
if(focused) {
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) {
}
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)
-{
+manage(Window w, XWindowAttributes *wa) {
Client *c;
Window trans;
XSetWindowAttributes twa;
c->w = c->tw = wa->width;
c->h = wa->height;
c->th = bh;
+ c->rx = sx;
+ c->ry = bh;
+ c->rw = sw;
+ c->rh = sh - bh;
c->border = 0;
updatesize(c);
}
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;
}
void
-updatesize(Client *c)
-{
+updatesize(Client *c) {
long msize;
XSizeHints size;
}
void
-updatetitle(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;
-
- 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)
-{
+unmanage(Client *c) {
Client *nc;
+ /* The server grab construct avoids race conditions. */
XGrabServer(dpy);
XSetErrorHandler(xerrordummy);