/* 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 focus)
-{
+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)
-{
- c->tw = textw(c->name);
- if(c->tw > c->w)
- c->tw = c->w + 2;
- c->tx = c->x + c->w - c->tw + 2;
- c->ty = c->y;
- if(isvisible(c))
- 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)
-{
+configure(Client *c) {
+ XEvent synev;
+
+ synev.type = ConfigureNotify;
+ synev.xconfigure.display = dpy;
+ synev.xconfigure.event = c->win;
+ synev.xconfigure.window = c->win;
+ synev.xconfigure.x = c->x;
+ synev.xconfigure.y = c->y;
+ synev.xconfigure.width = c->w;
+ synev.xconfigure.height = c->h;
+ synev.xconfigure.border_width = c->border;
+ synev.xconfigure.above = None;
+ XSendEvent(dpy, c->win, True, NoEventMask, &synev);
+}
+
+void
+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->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);
+ updatetitle(c);
settags(c, getclient(trans));
if(!c->isfloat)
c->isfloat = trans
|| (c->maxw && c->minw &&
c->maxw == c->minw && c->maxh == c->minh);
+ resizetitle(c);
if(clients)
clients->prev = c;
c->snext = stack;
stack = clients = c;
- settitle(c);
ban(c);
XMapWindow(dpy, c->win);
XMapWindow(dpy, c->twin);
}
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);
+ configure(c);
XSync(dpy, False);
}
void
-setsize(Client *c)
-{
+resizetitle(Client *c) {
+ c->tw = textw(c->name);
+ if(c->tw > c->w)
+ c->tw = c->w + 2;
+ c->tx = c->x + c->w - c->tw + 2;
+ c->ty = c->y;
+ if(isvisible(c))
+ 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);
+}
+
+void
+updatesize(Client *c) {
long msize;
XSizeHints size;
}
void
-settitle(Client *c)
-{
+updatetitle(Client *c) {
char **list = NULL;
int n;
XTextProperty name;
}
}
XFree(name.value);
- resizetitle(c);
-}
-
-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);