|
|
|
@ -11,6 +11,8 @@ |
|
|
|
|
#include "util.h" |
|
|
|
|
#include "wm.h" |
|
|
|
|
|
|
|
|
|
void (*arrange)(void *aux); |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
max(void *aux) |
|
|
|
|
{ |
|
|
|
@ -25,12 +27,24 @@ max(void *aux) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
arrange(void *aux) |
|
|
|
|
floating(void *aux) |
|
|
|
|
{ |
|
|
|
|
Client *c; |
|
|
|
|
|
|
|
|
|
arrange = floating; |
|
|
|
|
for(c = stack; c; c = c->snext) |
|
|
|
|
resize(c); |
|
|
|
|
discard_events(EnterWindowMask); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
grid(void *aux) |
|
|
|
|
{ |
|
|
|
|
Client *c; |
|
|
|
|
int n, cols, rows, gw, gh, i, j; |
|
|
|
|
float rt, fd; |
|
|
|
|
|
|
|
|
|
arrange = grid; |
|
|
|
|
if(!clients) |
|
|
|
|
return; |
|
|
|
|
for(n = 0, c = clients; c; c = c->next, n++); |
|
|
|
@ -95,7 +109,13 @@ kill(void *aux) |
|
|
|
|
static void |
|
|
|
|
resize_title(Client *c) |
|
|
|
|
{ |
|
|
|
|
c->tw = textw(&brush.font, c->name) + bh; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
c->tw = 0; |
|
|
|
|
for(i = 0; i < TLast; i++) |
|
|
|
|
if(c->tags[i]) |
|
|
|
|
c->tw += textw(&brush.font, c->tags[i]) + bh; |
|
|
|
|
c->tw += textw(&brush.font, c->name) + bh; |
|
|
|
|
if(c->tw > c->w) |
|
|
|
|
c->tw = c->w + 2; |
|
|
|
|
c->tx = c->x + c->w - c->tw + 2; |
|
|
|
@ -190,8 +210,8 @@ focus(Client *c) |
|
|
|
|
|
|
|
|
|
old = stack; |
|
|
|
|
for(l = &stack; *l && *l != c; l = &(*l)->snext); |
|
|
|
|
eassert(*l == c); |
|
|
|
|
*l = c->snext; |
|
|
|
|
if(*l) |
|
|
|
|
*l = c->snext; |
|
|
|
|
c->snext = stack; |
|
|
|
|
stack = c; |
|
|
|
|
if(old && old != c) { |
|
|
|
@ -230,17 +250,16 @@ manage(Window w, XWindowAttributes *wa) |
|
|
|
|
twa.background_pixmap = ParentRelative; |
|
|
|
|
twa.event_mask = ExposureMask; |
|
|
|
|
|
|
|
|
|
c->tags[tsel] = tags[tsel]; |
|
|
|
|
c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th, |
|
|
|
|
0, DefaultDepth(dpy, screen), CopyFromParent, |
|
|
|
|
DefaultVisual(dpy, screen), |
|
|
|
|
CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); |
|
|
|
|
update_name(c); |
|
|
|
|
|
|
|
|
|
update_name(c); |
|
|
|
|
for(l=&clients; *l; l=&(*l)->next); |
|
|
|
|
c->next = *l; /* *l == nil */ |
|
|
|
|
*l = c; |
|
|
|
|
c->snext = stack; |
|
|
|
|
stack = c; |
|
|
|
|
XMapRaised(dpy, c->win); |
|
|
|
|
XMapRaised(dpy, c->title); |
|
|
|
|
XGrabButton(dpy, Button1, Mod1Mask, c->win, False, ButtonPressMask, |
|
|
|
@ -249,7 +268,7 @@ manage(Window w, XWindowAttributes *wa) |
|
|
|
|
GrabModeAsync, GrabModeSync, None, None); |
|
|
|
|
XGrabButton(dpy, Button3, Mod1Mask, c->win, False, ButtonPressMask, |
|
|
|
|
GrabModeAsync, GrabModeSync, None, None); |
|
|
|
|
resize(c); |
|
|
|
|
arrange(NULL); |
|
|
|
|
focus(c); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -308,11 +327,24 @@ gravitate(Client *c, Bool invert) |
|
|
|
|
c->y += dy; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
resize(Client *c) |
|
|
|
|
{ |
|
|
|
|
XConfigureEvent e; |
|
|
|
|
|
|
|
|
|
if(c->incw) |
|
|
|
|
c->w -= (c->w - c->basew) % c->incw; |
|
|
|
|
if(c->inch) |
|
|
|
|
c->h -= (c->h - c->baseh) % c->inch; |
|
|
|
|
if(c->minw && c->w < c->minw) |
|
|
|
|
c->w = c->minw; |
|
|
|
|
if(c->minh && c->h < c->minh) |
|
|
|
|
c->h = c->minh; |
|
|
|
|
if(c->maxw && c->w > c->maxw) |
|
|
|
|
c->w = c->maxw; |
|
|
|
|
if(c->maxh && c->h > c->maxh) |
|
|
|
|
c->h = c->maxh; |
|
|
|
|
resize_title(c); |
|
|
|
|
XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); |
|
|
|
|
e.type = ConfigureNotify; |
|
|
|
@ -357,6 +389,7 @@ unmanage(Client *c) |
|
|
|
|
XFlush(dpy); |
|
|
|
|
XSetErrorHandler(error_handler); |
|
|
|
|
XUngrabServer(dpy); |
|
|
|
|
arrange(NULL); |
|
|
|
|
if(stack) |
|
|
|
|
focus(stack); |
|
|
|
|
} |
|
|
|
@ -384,15 +417,25 @@ getclient(Window w) |
|
|
|
|
void |
|
|
|
|
draw_client(Client *c) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
if(c == stack) { |
|
|
|
|
draw_bar(); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
brush.x = brush.y = 0; |
|
|
|
|
brush.w = c->tw; |
|
|
|
|
brush.h = c->th; |
|
|
|
|
|
|
|
|
|
brush.w = 0; |
|
|
|
|
for(i = 0; i < TLast; i++) { |
|
|
|
|
if(c->tags[i]) { |
|
|
|
|
brush.x += brush.w; |
|
|
|
|
brush.w = textw(&brush.font, c->tags[i]) + bh; |
|
|
|
|
draw(dpy, &brush, True, c->tags[i]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
brush.x += brush.w; |
|
|
|
|
brush.w = textw(&brush.font, c->name) + bh; |
|
|
|
|
draw(dpy, &brush, True, c->name); |
|
|
|
|
XCopyArea(dpy, brush.drawable, c->title, brush.gc, |
|
|
|
|
0, 0, c->tw, c->th, 0, 0); |
|
|
|
|