| 41 |
41 |
|
#include <X11/Xutil.h> |
| 42 |
42 |
|
|
| 43 |
43 |
|
/* macros */ |
| 44 |
|
- |
#define MAX(a, b) ((a)>(b)?(a):(b)) |
| 45 |
|
- |
#define MIN(a, b) ((a)<(b)?(a):(b)) |
| 46 |
|
- |
#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) |
| 47 |
|
- |
#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask)) |
| 48 |
|
- |
#define LENGTH(x) (sizeof x / sizeof x[0]) |
| 49 |
|
- |
#define MAXTAGLEN 16 |
| 50 |
|
- |
#define MOUSEMASK (BUTTONMASK|PointerMotionMask) |
| 51 |
|
- |
#define DEFGEOM(GEONAME,BX,BY,BW,WX,WY,WW,WH,MX,MY,MW,MH,TX,TY,TW,TH,MOX,MOY,MOW,MOH) \ |
| 52 |
|
- |
void GEONAME(void) { \ |
| 53 |
|
- |
bx = (BX); by = (BY); bw = (BW); \ |
| 54 |
|
- |
wx = (WX); wy = (WY); ww = (WW); wh = (WH); \ |
| 55 |
|
- |
mx = (MX); my = (MY); mw = (MW); mh = (MH); \ |
| 56 |
|
- |
tx = (TX); ty = (TY); tw = (TW); th = (TH); \ |
| 57 |
|
- |
mox = (MOX); moy = (MOY); mow = (MOW); moh = (MOH); \ |
| 58 |
|
- |
} |
|
44 |
+ |
#define MAX(a, b) ((a) > (b) ? (a) : (b)) |
|
45 |
+ |
#define MIN(a, b) ((a) < (b) ? (a) : (b)) |
|
46 |
+ |
#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) |
|
47 |
+ |
#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask)) |
|
48 |
+ |
#define LENGTH(x) (sizeof x / sizeof x[0]) |
|
49 |
+ |
#define MAXTAGLEN 16 |
|
50 |
+ |
#define MOUSEMASK (BUTTONMASK|PointerMotionMask) |
| 59 |
51 |
|
|
| 60 |
52 |
|
/* enums */ |
| 61 |
53 |
|
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ |
|
| 95 |
87 |
|
XFontStruct *xfont; |
| 96 |
88 |
|
} font; |
| 97 |
89 |
|
} DC; /* draw context */ |
| 98 |
|
- |
|
| 99 |
|
- |
typedef struct { |
| 100 |
|
- |
const char *symbol; |
| 101 |
|
- |
void (*apply)(void); |
| 102 |
|
- |
} Geom; |
| 103 |
90 |
|
|
| 104 |
91 |
|
typedef struct { |
| 105 |
92 |
|
unsigned long mod; |
|
| 178 |
165 |
|
void run(void); |
| 179 |
166 |
|
void scan(void); |
| 180 |
167 |
|
void setclientstate(Client *c, long state); |
| 181 |
|
- |
void setgeom(const char *arg); |
| 182 |
168 |
|
void setlayout(const char *arg); |
| 183 |
169 |
|
void setmfact(const char *arg); |
| 184 |
170 |
|
void setup(void); |
|
| 198 |
184 |
|
void unban(Client *c); |
| 199 |
185 |
|
void unmanage(Client *c); |
| 200 |
186 |
|
void unmapnotify(XEvent *e); |
| 201 |
|
- |
void updatebarpos(void); |
|
187 |
+ |
void updatebar(void); |
|
188 |
+ |
void updategeom(void); |
| 202 |
189 |
|
void updatesizehints(Client *c); |
| 203 |
190 |
|
void updatetitle(Client *c); |
| 204 |
191 |
|
void updatewmhints(Client *c); |
|
| 213 |
200 |
|
char stext[256]; |
| 214 |
201 |
|
int screen, sx, sy, sw, sh; |
| 215 |
202 |
|
int (*xerrorxlib)(Display *, XErrorEvent *); |
| 216 |
|
- |
int bx, by, bw, bh, blw, bgw, mx, my, mw, mh, mox, moy, mow, moh, tx, ty, tw, th, wx, wy, ww, wh; |
|
203 |
+ |
int bx, by, bw, bh, blw, mx, my, mw, mh, tx, ty, tw, th, wx, wy, ww, wh; |
| 217 |
204 |
|
int seltags = 0; |
| 218 |
205 |
|
double mfact; |
| 219 |
206 |
|
unsigned int numlockmask = 0; |
|
| 241 |
228 |
|
Cursor cursor[CurLast]; |
| 242 |
229 |
|
Display *dpy; |
| 243 |
230 |
|
DC dc = {0}; |
| 244 |
|
- |
Geom geoms[]; |
| 245 |
|
- |
Geom *geom = geoms; |
| 246 |
231 |
|
Layout layouts[]; |
| 247 |
232 |
|
Layout *lt = layouts; |
| 248 |
233 |
|
Window root, barwin; |
|
| 330 |
315 |
|
XButtonPressedEvent *ev = &e->xbutton; |
| 331 |
316 |
|
|
| 332 |
317 |
|
if(ev->window == barwin) { |
| 333 |
|
- |
if((ev->x < bgw) && ev->button == Button1) { |
| 334 |
|
- |
setgeom(NULL); |
| 335 |
|
- |
return; |
| 336 |
|
- |
} |
| 337 |
|
- |
x = bgw; |
|
318 |
+ |
x = 0; |
| 338 |
319 |
|
for(i = 0; i < LENGTH(tags); i++) { |
| 339 |
320 |
|
x += textw(tags[i]); |
| 340 |
|
- |
if(ev->x >= bgw && ev->x < x) { |
|
321 |
+ |
if(ev->x < x) { |
| 341 |
322 |
|
if(ev->button == Button1) { |
| 342 |
323 |
|
if(ev->state & MODKEY) |
| 343 |
324 |
|
tag(tags[i]); |
|
| 440 |
421 |
|
if(ev->window == root && (ev->width != sw || ev->height != sh)) { |
| 441 |
422 |
|
sw = ev->width; |
| 442 |
423 |
|
sh = ev->height; |
| 443 |
|
- |
setgeom(geom->symbol); |
|
424 |
+ |
updategeom(); |
|
425 |
+ |
updatebar(); |
|
426 |
+ |
arrange(); |
| 444 |
427 |
|
} |
| 445 |
428 |
|
} |
| 446 |
429 |
|
|
|
| 531 |
514 |
|
Client *c; |
| 532 |
515 |
|
|
| 533 |
516 |
|
dc.x = 0; |
| 534 |
|
- |
if(bgw > 0) { |
| 535 |
|
- |
dc.w = bgw; |
| 536 |
|
- |
drawtext(geom->symbol, dc.norm, False); |
| 537 |
|
- |
dc.x += bgw; |
| 538 |
|
- |
} |
| 539 |
517 |
|
for(c = stack; c && !isvisible(c, NULL); c = c->snext); |
| 540 |
518 |
|
for(i = 0; i < LENGTH(tags); i++) { |
| 541 |
519 |
|
dc.w = textw(tags[i]); |
|
| 1064 |
1042 |
|
|
| 1065 |
1043 |
|
for(c = clients; c; c = c->next) |
| 1066 |
1044 |
|
if((lt->isfloating || !c->isfloating) && isvisible(c, NULL)) |
| 1067 |
|
- |
resize(c, mox, moy, mow - 2 * c->bw, moh - 2 * c->bw, RESIZEHINTS); |
|
1045 |
+ |
resize(c, wx, wy, ww - 2 * c->bw, wh - 2 * c->bw, RESIZEHINTS); |
| 1068 |
1046 |
|
} |
| 1069 |
1047 |
|
|
| 1070 |
1048 |
|
void |
|
| 1399 |
1377 |
|
} |
| 1400 |
1378 |
|
|
| 1401 |
1379 |
|
void |
| 1402 |
|
- |
setgeom(const char *arg) { |
| 1403 |
|
- |
unsigned int i; |
| 1404 |
|
- |
|
| 1405 |
|
- |
if(!arg) { |
| 1406 |
|
- |
if(++geom == &geoms[LENGTH(geoms)]) |
| 1407 |
|
- |
geom = &geoms[0]; |
| 1408 |
|
- |
} |
| 1409 |
|
- |
else { |
| 1410 |
|
- |
for(i = 0; i < LENGTH(geoms); i++) |
| 1411 |
|
- |
if(!strcmp(geoms[i].symbol, arg)) |
| 1412 |
|
- |
break; |
| 1413 |
|
- |
if(i == LENGTH(geoms)) |
| 1414 |
|
- |
return; |
| 1415 |
|
- |
geom = &geoms[i]; |
| 1416 |
|
- |
} |
| 1417 |
|
- |
geom->apply(); |
| 1418 |
|
- |
updatebarpos(); |
| 1419 |
|
- |
arrange(); |
| 1420 |
|
- |
} |
| 1421 |
|
- |
|
| 1422 |
|
- |
void |
| 1423 |
1380 |
|
setlayout(const char *arg) { |
| 1424 |
1381 |
|
unsigned int i; |
| 1425 |
1382 |
|
|
|
| 1457 |
1414 |
|
return; |
| 1458 |
1415 |
|
mfact = d; |
| 1459 |
1416 |
|
} |
| 1460 |
|
- |
setgeom(geom->symbol); |
|
1417 |
+ |
updategeom(); |
|
1418 |
+ |
arrange(); |
| 1461 |
1419 |
|
} |
| 1462 |
1420 |
|
|
| 1463 |
1421 |
|
void |
|
| 1469 |
1427 |
|
screen = DefaultScreen(dpy); |
| 1470 |
1428 |
|
root = RootWindow(dpy, screen); |
| 1471 |
1429 |
|
initfont(FONT); |
| 1472 |
|
- |
|
| 1473 |
|
- |
/* apply default geometry */ |
| 1474 |
1430 |
|
sx = 0; |
| 1475 |
1431 |
|
sy = 0; |
| 1476 |
1432 |
|
sw = DisplayWidth(dpy, screen); |
| 1477 |
1433 |
|
sh = DisplayHeight(dpy, screen); |
| 1478 |
1434 |
|
bh = dc.font.height + 2; |
| 1479 |
|
- |
mfact = MFACT; |
| 1480 |
|
- |
geom->apply(); |
|
1435 |
+ |
|
|
1436 |
+ |
/* update geometry */ |
|
1437 |
+ |
updategeom(); |
| 1481 |
1438 |
|
|
| 1482 |
1439 |
|
/* init atoms */ |
| 1483 |
1440 |
|
wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); |
|
| 1517 |
1474 |
|
w = textw(layouts[i].symbol); |
| 1518 |
1475 |
|
blw = MAX(blw, w); |
| 1519 |
1476 |
|
} |
| 1520 |
|
- |
for(bgw = i = 0; LENGTH(geoms) > 1 && i < LENGTH(geoms); i++) { |
| 1521 |
|
- |
w = textw(geoms[i].symbol); |
| 1522 |
|
- |
bgw = MAX(bgw, w); |
| 1523 |
|
- |
} |
| 1524 |
1477 |
|
|
| 1525 |
1478 |
|
wa.override_redirect = 1; |
| 1526 |
1479 |
|
wa.background_pixmap = ParentRelative; |
|
| 1633 |
1586 |
|
Client *c = nexttiled(clients); |
| 1634 |
1587 |
|
|
| 1635 |
1588 |
|
if(n == 1) |
| 1636 |
|
- |
tileresize(c, mox, moy, mow - 2 * c->bw, moh - 2 * c->bw); |
|
1589 |
+ |
tileresize(c, wx, wy, ww - 2 * c->bw, wh - 2 * c->bw); |
| 1637 |
1590 |
|
else |
| 1638 |
1591 |
|
tileresize(c, mx, my, mw - 2 * c->bw, mh - 2 * c->bw); |
| 1639 |
1592 |
|
return c; |
|
| 1751 |
1704 |
|
} |
| 1752 |
1705 |
|
|
| 1753 |
1706 |
|
void |
| 1754 |
|
- |
updatebarpos(void) { |
|
1707 |
+ |
updatebar(void) { |
| 1755 |
1708 |
|
|
| 1756 |
1709 |
|
if(dc.drawable != 0) |
| 1757 |
1710 |
|
XFreePixmap(dpy, dc.drawable); |
| 1758 |
1711 |
|
dc.drawable = XCreatePixmap(dpy, root, bw, bh, DefaultDepth(dpy, screen)); |
| 1759 |
1712 |
|
XMoveResizeWindow(dpy, barwin, bx, by, bw, bh); |
|
1713 |
+ |
} |
|
1714 |
+ |
|
|
1715 |
+ |
void |
|
1716 |
+ |
updategeom(void) { |
|
1717 |
+ |
|
|
1718 |
+ |
/* bar geometry */ |
|
1719 |
+ |
bx = 0; |
|
1720 |
+ |
by = 0; |
|
1721 |
+ |
bw = sw; |
|
1722 |
+ |
|
|
1723 |
+ |
/* window area geometry */ |
|
1724 |
+ |
wx = sx; |
|
1725 |
+ |
wy = sy; |
|
1726 |
+ |
ww = sw; |
|
1727 |
+ |
sh = sh - bh; |
|
1728 |
+ |
|
|
1729 |
+ |
/* master area geometry */ |
|
1730 |
+ |
mfact = MFACT; |
|
1731 |
+ |
mx = wx; |
|
1732 |
+ |
my = wy; |
|
1733 |
+ |
mw = mfact * ww; |
|
1734 |
+ |
mh = wh; |
|
1735 |
+ |
|
|
1736 |
+ |
/* tile area geometry */ |
|
1737 |
+ |
tx = mx + mw; |
|
1738 |
+ |
ty = wy; |
|
1739 |
+ |
tw = ww - mw; |
|
1740 |
+ |
th = wh; |
| 1760 |
1741 |
|
} |
| 1761 |
1742 |
|
|
| 1762 |
1743 |
|
void |
|
| 1912 |
1893 |
|
XCloseDisplay(dpy); |
| 1913 |
1894 |
|
return 0; |
| 1914 |
1895 |
|
} |
| 1915 |
|
- |
|