texperimental xinerama support, two new actions, Mod1-w/e and Mod1-Shift-w/e - … | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 2ce37bc69ee72af7ea88376c73133f8a833204cf | |
parent f27ccc5c60e4518c90f33bb20e68ea7bb23a2947 | |
Author: Anselm R Garbe <[email protected]> | |
Date: Sat, 20 Jun 2009 15:10:04 +0100 | |
experimental xinerama support, two new actions, Mod1-w/e and Mod1-Shift-w/e | |
Diffstat: | |
M config.def.h | 10 +++++++++- | |
M config.mk | 10 ++++++---- | |
M dwm.c | 310 +++++++++++++++++++----------… | |
3 files changed, 209 insertions(+), 121 deletions(-) | |
--- | |
diff --git a/config.def.h b/config.def.h | |
t@@ -13,6 +13,7 @@ static unsigned int snap = 32; /* snap pixe… | |
static Bool showbar = True; /* False means no bar */ | |
static Bool topbar = True; /* False means bottom bar */ | |
+ | |
/* tagging */ | |
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; | |
static unsigned int tagset[] = {1, 1}; /* after start, first tag is selected */ | |
t@@ -20,7 +21,8 @@ static unsigned int tagset[] = {1, 1}; /* after start, first… | |
static Rule rules[] = { | |
/* class instance title tags mask isfloating */ | |
{ "Gimp", NULL, NULL, 0, True }, | |
- { "Firefox", NULL, NULL, 1 << 8, True }, | |
+ { "Firefox", NULL, NULL, 1 << 8, False }, | |
+ | |
}; | |
/* layout(s) */ | |
t@@ -68,6 +70,12 @@ static Key keys[] = { | |
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} }, | |
{ MODKEY, XK_0, view, {.ui = ~0 }… | |
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 }… | |
+#ifdef XINERAMA | |
+ { MODKEY, XK_w, focusmon, {.ui = 0 } … | |
+ { MODKEY, XK_e, focusmon, {.ui = 1 } … | |
+ { MODKEY|ShiftMask, XK_w, tagmon, {.ui = 0 } … | |
+ { MODKEY|ShiftMask, XK_e, tagmon, {.ui = 1 } … | |
+#endif /* XINERAMA */ | |
TAGKEYS( XK_1, 0) | |
TAGKEYS( XK_2, 1) | |
TAGKEYS( XK_3, 2) | |
diff --git a/config.mk b/config.mk | |
t@@ -11,8 +11,8 @@ X11INC = /usr/X11R6/include | |
X11LIB = /usr/X11R6/lib | |
# Xinerama, un-comment if you want it | |
-#XINERAMALIBS = -L${X11LIB} -lXinerama | |
-#XINERAMAFLAGS = -DXINERAMA | |
+XINERAMALIBS = -L${X11LIB} -lXinerama | |
+XINERAMAFLAGS = -DXINERAMA | |
# includes and libs | |
INCS = -I. -I/usr/include -I${X11INC} | |
t@@ -20,8 +20,10 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS} | |
# flags | |
CPPFLAGS = -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} | |
-CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} | |
-LDFLAGS = -s ${LIBS} | |
+CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS} | |
+#CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} | |
+LDFLAGS = -g ${LIBS} | |
+#LDFLAGS = -s ${LIBS} | |
# Solaris | |
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" | |
diff --git a/dwm.c b/dwm.c | |
t@@ -38,13 +38,13 @@ | |
#include <X11/Xutil.h> | |
#ifdef XINERAMA | |
#include <X11/extensions/Xinerama.h> | |
-#endif | |
+#endif /* XINERAMA */ | |
/* macros */ | |
#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) | |
#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask)) | |
#define INRECT(X,Y,RX,RY,RW,RH) ((X) >= (RX) && (X) < (RX) + (RW) && (Y) >= (R… | |
-#define ISVISIBLE(x) (x->tags & tagset[selmon->seltags]) | |
+#define ISVISIBLE(x) (x->tags & tagset[mon[x->mon].seltags]) | |
#define LENGTH(x) (sizeof x / sizeof x[0]) | |
#define MAX(a, b) ((a) > (b) ? (a) : (b)) | |
#define MIN(a, b) ((a) < (b) ? (a) : (b)) | |
t@@ -115,17 +115,22 @@ typedef struct { | |
} Key; | |
typedef struct { | |
- const char *symbol; | |
- void (*arrange)(void); | |
-} Layout; | |
- | |
-typedef struct { | |
- int wx, wy, ww, wh; | |
+ char symbol[4]; | |
+ int by, btx; /* bar geometry */ | |
+ int wx, wy, ww, wh; /* window area */ | |
unsigned int seltags; | |
unsigned int sellt; | |
+ Bool showbar; | |
+ Bool topbar; | |
+ Window barwin; | |
} Monitor; | |
typedef struct { | |
+ const char *symbol; | |
+ void (*arrange)(Monitor *); | |
+} Layout; | |
+ | |
+typedef struct { | |
const char *class; | |
const char *instance; | |
const char *title; | |
t@@ -150,7 +155,8 @@ static void destroynotify(XEvent *e); | |
static void detach(Client *c); | |
static void detachstack(Client *c); | |
static void die(const char *errstr, ...); | |
-static void drawbar(void); | |
+static void drawbar(Monitor *m); | |
+static void drawbars(); | |
static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col… | |
static void drawtext(const char *text, unsigned long col[ColLast], Bool invert… | |
static void enternotify(XEvent *e); | |
t@@ -171,14 +177,14 @@ static void killclient(const Arg *arg); | |
static void manage(Window w, XWindowAttributes *wa); | |
static void mappingnotify(XEvent *e); | |
static void maprequest(XEvent *e); | |
-static void monocle(void); | |
+static void monocle(Monitor *m); | |
static void movemouse(const Arg *arg); | |
-static Client *nexttiled(Client *c); | |
+static Client *nexttiled(Monitor *m, Client *c); | |
static void propertynotify(XEvent *e); | |
static void quit(const Arg *arg); | |
static void resize(Client *c, int x, int y, int w, int h); | |
static void resizemouse(const Arg *arg); | |
-static void restack(void); | |
+static void restack(Monitor *m); | |
static void run(void); | |
static void scan(void); | |
static void setclientstate(Client *c, long state); | |
t@@ -190,14 +196,13 @@ static void sigchld(int signal); | |
static void spawn(const Arg *arg); | |
static void tag(const Arg *arg); | |
static int textnw(const char *text, unsigned int len); | |
-static void tile(void); | |
+static void tile(Monitor *); | |
static void togglebar(const Arg *arg); | |
static void togglefloating(const Arg *arg); | |
static void toggletag(const Arg *arg); | |
static void toggleview(const Arg *arg); | |
static void unmanage(Client *c); | |
static void unmapnotify(XEvent *e); | |
-static void updatebar(void); | |
static void updategeom(void); | |
static void updatenumlockmask(void); | |
static void updatesizehints(Client *c); | |
t@@ -209,12 +214,16 @@ static int xerror(Display *dpy, XErrorEvent *ee); | |
static int xerrordummy(Display *dpy, XErrorEvent *ee); | |
static int xerrorstart(Display *dpy, XErrorEvent *ee); | |
static void zoom(const Arg *arg); | |
+#ifdef XINERAMA | |
+static void focusmon(const Arg *arg); | |
+static void tagmon(const Arg *arg); | |
+#endif /* XINERAMA */ | |
/* variables */ | |
static char stext[256]; | |
static int screen; | |
-static int sx, sy, sw, sh; /* X display screen geometry x, y, width, height */ | |
-static int by, bh, blw; /* bar geometry y, height and layout symbol width */ | |
+static int sx, sy, sw, sh; /* X display screen geometry x, y, width, height … | |
+static int bh, blw = 0; /* bar geometry */ | |
static int (*xerrorxlib)(Display *, XErrorEvent *); | |
static unsigned int numlockmask = 0; | |
static void (*handler[LASTEvent]) (XEvent *) = { | |
t@@ -243,7 +252,7 @@ static DC dc; | |
static Layout *lt[] = { NULL, NULL }; | |
static Monitor *mon = NULL, *selmon = NULL; | |
static unsigned int nmons; | |
-static Window root, barwin; | |
+static Window root; | |
/* configuration, allows nested code to access above variables */ | |
#include "config.h" | |
t@@ -266,7 +275,7 @@ applyrules(Client *c) { | |
&& (!r->class || (ch.res_class && strstr(ch.res_class,… | |
&& (!r->instance || (ch.res_name && strstr(ch.res_name… | |
c->isfloating = r->isfloating; | |
- c->tags |= r->tags; | |
+ c->tags |= r->tags; | |
} | |
} | |
if(ch.res_class) | |
t@@ -344,11 +353,14 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h… | |
void | |
arrange(void) { | |
+ unsigned int i; | |
showhide(stack); | |
focus(NULL); | |
- if(lt[selmon->sellt]->arrange) | |
- lt[selmon->sellt]->arrange(); | |
- restack(); | |
+ for(i = 0; i < nmons; i++) { | |
+ if(lt[mon[i].sellt]->arrange) | |
+ lt[mon[i].sellt]->arrange(&mon[i]); | |
+ restack(&mon[i]); | |
+ } | |
} | |
void | |
t@@ -371,9 +383,12 @@ buttonpress(XEvent *e) { | |
XButtonPressedEvent *ev = &e->xbutton; | |
click = ClkRootWin; | |
- if(ev->window == barwin) { | |
- i = x = 0; | |
- do x += TEXTW(tags[i]); while(ev->x >= x && ++i < LENGTH(tags)… | |
+ if(ev->window == selmon->barwin) { | |
+ i = 0; | |
+ x = selmon->btx; | |
+ do | |
+ x += TEXTW(tags[i]); | |
+ while(ev->x >= x && ++i < LENGTH(tags)); | |
if(i < LENGTH(tags)) { | |
click = ClkTagBar; | |
arg.ui = 1 << i; | |
t@@ -412,6 +427,7 @@ checkotherwm(void) { | |
void | |
cleanup(void) { | |
+ unsigned int i; | |
Arg a = {.ui = ~0}; | |
Layout foo = { "", NULL }; | |
t@@ -429,7 +445,9 @@ cleanup(void) { | |
XFreeCursor(dpy, cursor[CurNormal]); | |
XFreeCursor(dpy, cursor[CurResize]); | |
XFreeCursor(dpy, cursor[CurMove]); | |
- XDestroyWindow(dpy, barwin); | |
+ for(i = 0; i < nmons; i++) | |
+ XDestroyWindow(dpy, mon[i].barwin); | |
+ free(mon); | |
XSync(dpy, False); | |
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); | |
} | |
t@@ -466,13 +484,18 @@ configure(Client *c) { | |
void | |
configurenotify(XEvent *e) { | |
+ unsigned int i; | |
XConfigureEvent *ev = &e->xconfigure; | |
if(ev->window == root && (ev->width != sw || ev->height != sh)) { | |
sw = ev->width; | |
sh = ev->height; | |
updategeom(); | |
- updatebar(); | |
+ if(dc.drawable != 0) | |
+ XFreePixmap(dpy, dc.drawable); | |
+ dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, scree… | |
+ for(i = 0; i < nmons; i++) | |
+ XMoveResizeWindow(dpy, mon[i].barwin, mon[i].wx, mon[i… | |
arrange(); | |
} | |
} | |
t@@ -556,54 +579,79 @@ die(const char *errstr, ...) { | |
} | |
void | |
-drawbar(void) { | |
+drawbar(Monitor *m) { | |
int x; | |
unsigned int i, occ = 0, urg = 0; | |
unsigned long *col; | |
Client *c; | |
for(c = clients; c; c = c->next) { | |
- occ |= c->tags; | |
- if(c->isurgent) | |
- urg |= c->tags; | |
+ if(m == &mon[c->mon]) { | |
+ occ |= c->tags; | |
+ if(c->isurgent) | |
+ urg |= c->tags; | |
+ } | |
} | |
dc.x = 0; | |
+#ifdef XINERAMA | |
+ { | |
+ dc.w = TEXTW(m->symbol); | |
+ drawtext(m->symbol, selmon == m ? dc.sel : dc.norm, False); | |
+ dc.x += dc.w; | |
+ } | |
+#endif /* XINERAMA */ | |
+ m->btx = dc.x; | |
for(i = 0; i < LENGTH(tags); i++) { | |
dc.w = TEXTW(tags[i]); | |
- col = tagset[selmon->seltags] & 1 << i ? dc.sel : dc.norm; | |
+ col = tagset[m->seltags] & 1 << i ? dc.sel : dc.norm; | |
drawtext(tags[i], col, urg & 1 << i); | |
- drawsquare(sel && sel->tags & 1 << i, occ & 1 << i, urg & 1 <<… | |
+ drawsquare(m == selmon && sel && sel->tags & 1 << i, | |
+ occ & 1 << i, urg & 1 << i, col); | |
dc.x += dc.w; | |
} | |
if(blw > 0) { | |
dc.w = blw; | |
- drawtext(lt[selmon->sellt]->symbol, dc.norm, False); | |
+ drawtext(lt[m->sellt]->symbol, dc.norm, False); | |
x = dc.x + dc.w; | |
} | |
else | |
x = dc.x; | |
- dc.w = TEXTW(stext); | |
- dc.x = selmon->ww - dc.w; | |
- if(dc.x < x) { | |
- dc.x = x; | |
- dc.w = selmon->ww - x; | |
- } | |
- drawtext(stext, dc.norm, False); | |
- if((dc.w = dc.x - x) > bh) { | |
- dc.x = x; | |
- if(sel) { | |
- drawtext(sel->name, dc.sel, False); | |
- drawsquare(sel->isfixed, sel->isfloating, False, dc.se… | |
+ if(m == selmon) { | |
+ dc.w = TEXTW(stext); | |
+ dc.x = m->ww - dc.w; | |
+ if(dc.x < x) { | |
+ dc.x = x; | |
+ dc.w = m->ww - x; | |
+ } | |
+ drawtext(stext, dc.norm, False); | |
+ if((dc.w = dc.x - x) > bh) { | |
+ dc.x = x; | |
+ if(sel) { | |
+ drawtext(sel->name, dc.sel, False); | |
+ drawsquare(sel->isfixed, sel->isfloating, Fals… | |
+ } | |
+ else | |
+ drawtext(NULL, dc.norm, False); | |
} | |
- else | |
- drawtext(NULL, dc.norm, False); | |
} | |
- XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, selmon->ww, bh, 0, 0); | |
+ else { | |
+ dc.w = m->ww - x; | |
+ drawtext(NULL, dc.norm, False); | |
+ } | |
+ XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->ww, bh, 0, 0); | |
XSync(dpy, False); | |
} | |
void | |
+drawbars() { | |
+ unsigned int i; | |
+ | |
+ for(i = 0; i < nmons; i++) | |
+ drawbar(&mon[i]); | |
+} | |
+ | |
+void | |
drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) { | |
int x; | |
XGCValues gcv; | |
t@@ -667,10 +715,14 @@ enternotify(XEvent *e) { | |
void | |
expose(XEvent *e) { | |
+ unsigned int i; | |
XExposeEvent *ev = &e->xexpose; | |
- if(ev->count == 0 && (ev->window == barwin)) | |
- drawbar(); | |
+ for(i = 0; i < nmons; i++) | |
+ if(ev->count == 0 && (ev->window == mon[i].barwin)) { | |
+ drawbar(&mon[i]); | |
+ break; | |
+ } | |
} | |
void | |
t@@ -693,7 +745,9 @@ focus(Client *c) { | |
else | |
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); | |
sel = c; | |
- drawbar(); | |
+ if(c) | |
+ selmon = &mon[c->mon]; | |
+ drawbars(); | |
} | |
void | |
t@@ -704,13 +758,24 @@ focusin(XEvent *e) { /* there are some broken focus acqu… | |
XSetInputFocus(dpy, sel->win, RevertToPointerRoot, CurrentTime… | |
} | |
+#ifdef XINERAMA | |
+void | |
+focusmon(const Arg *arg) { | |
+ if(arg->ui >= nmons) | |
+ return; | |
+ selmon = &mon[arg->ui]; | |
+ focus(NULL); | |
+ drawbars(); | |
+} | |
+#endif /* XINERAMA */ | |
+ | |
void | |
focusstack(const Arg *arg) { | |
Client *c = NULL, *i; | |
if(!sel) | |
return; | |
- if (arg->i > 0) { | |
+ if(arg->i > 0) { | |
for(c = sel->next; c && !ISVISIBLE(c); c = c->next); | |
if(!c) | |
for(c = clients; c && !ISVISIBLE(c); c = c->next); | |
t@@ -726,7 +791,7 @@ focusstack(const Arg *arg) { | |
} | |
if(c) { | |
focus(c); | |
- restack(); | |
+ restack(selmon); | |
} | |
} | |
t@@ -946,9 +1011,8 @@ manage(Window w, XWindowAttributes *wa) { | |
c->y = sy + sh - HEIGHT(c); | |
c->x = MAX(c->x, sx); | |
/* only fix client y-offset, if the client center might cover … | |
- /* TODO: is c always attached to selmon? */ | |
- c->y = MAX(c->y, ((by == 0) && (c->x + (c->w / 2) >= selmon->w… | |
- && (c->x + (c->w / 2) < selmon->wx… | |
+ c->y = MAX(c->y, ((selmon->by == 0) && (c->x + (c->w / 2) >= s… | |
+ && (c->x + (c->w / 2) < selmon->wx + selmon->ww)) ?… | |
c->bw = borderpx; | |
} | |
t@@ -1001,14 +1065,11 @@ maprequest(XEvent *e) { | |
} | |
void | |
-monocle(void) { | |
+monocle(Monitor *m) { | |
Client *c; | |
- Monitor *m; | |
- for(c = nexttiled(clients); c; c = nexttiled(c->next)) { | |
- m = &mon[c->mon]; | |
+ for(c = nexttiled(m, clients); c; c = nexttiled(m, c->next)) | |
resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw); | |
- } | |
} | |
void | |
t@@ -1021,7 +1082,7 @@ movemouse(const Arg *arg) { | |
if(!(c = sel)) | |
return; | |
- restack(); | |
+ restack(selmon); | |
ocx = c->x; | |
ocy = c->y; | |
if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAs… | |
t@@ -1063,8 +1124,9 @@ movemouse(const Arg *arg) { | |
} | |
Client * | |
-nexttiled(Client *c) { | |
- for(; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); | |
+nexttiled(Monitor *m, Client *c) { | |
+ // TODO: m handling | |
+ for(; c && (c->isfloating || m != &mon[c->mon] || !ISVISIBLE(c)); c = … | |
return c; | |
} | |
t@@ -1091,13 +1153,13 @@ propertynotify(XEvent *e) { | |
break; | |
case XA_WM_HINTS: | |
updatewmhints(c); | |
- drawbar(); | |
+ drawbars(); | |
break; | |
} | |
if(ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { | |
updatetitle(c); | |
if(c == sel) | |
- drawbar(); | |
+ drawbars(); | |
} | |
} | |
} | |
t@@ -1133,7 +1195,7 @@ resizemouse(const Arg *arg) { | |
if(!(c = sel)) | |
return; | |
- restack(); | |
+ restack(selmon); | |
ocx = c->x; | |
ocy = c->y; | |
if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAs… | |
t@@ -1170,21 +1232,21 @@ resizemouse(const Arg *arg) { | |
} | |
void | |
-restack(void) { | |
+restack(Monitor *m) { | |
Client *c; | |
XEvent ev; | |
XWindowChanges wc; | |
- drawbar(); | |
+ drawbars(); | |
if(!sel) | |
return; | |
- if(sel->isfloating || !lt[selmon->sellt]->arrange) | |
+ if(m == selmon && (sel->isfloating || !lt[m->sellt]->arrange)) | |
XRaiseWindow(dpy, sel->win); | |
- if(lt[selmon->sellt]->arrange) { | |
+ if(lt[m->sellt]->arrange) { | |
wc.stack_mode = Below; | |
- wc.sibling = barwin; | |
+ wc.sibling = m->barwin; | |
for(c = stack; c; c = c->snext) | |
- if(!c->isfloating && ISVISIBLE(c)) { | |
+ if(!c->isfloating && m == &mon[c->mon] && ISVISIBLE(c)… | |
XConfigureWindow(dpy, c->win, CWSibling|CWStac… | |
wc.sibling = c->win; | |
} | |
t@@ -1248,7 +1310,7 @@ setlayout(const Arg *arg) { | |
if(sel) | |
arrange(); | |
else | |
- drawbar(); | |
+ drawbars(); | |
} | |
/* arg > 1.0 will set mfact absolutly */ | |
t@@ -1309,21 +1371,23 @@ setup(void) { | |
if(!dc.font.set) | |
XSetFont(dpy, dc.gc, dc.font.xfont->fid); | |
- /* init bar */ | |
+ /* init bars */ | |
+ wa.override_redirect = True; | |
+ wa.background_pixmap = ParentRelative; | |
+ wa.event_mask = ButtonPressMask|ExposureMask; | |
for(blw = i = 0; LENGTH(layouts) > 1 && i < LENGTH(layouts); i++) { | |
w = TEXTW(layouts[i].symbol); | |
blw = MAX(blw, w); | |
} | |
- wa.override_redirect = True; | |
- wa.background_pixmap = ParentRelative; | |
- wa.event_mask = ButtonPressMask|ExposureMask; | |
+ for(i = 0; i < nmons; i++) { | |
+ mon[i].barwin = XCreateWindow(dpy, root, mon[i].wx, mon[i].by,… | |
- barwin = XCreateWindow(dpy, root, selmon->wx, by, selmon->ww, bh, 0, D… | |
- CopyFromParent, DefaultVisual(dpy, screen), | |
- CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); | |
- XDefineCursor(dpy, barwin, cursor[CurNormal]); | |
- XMapRaised(dpy, barwin); | |
+ CopyFromParent, DefaultVisual(dp… | |
+ CWOverrideRedirect|CWBackPixmap|… | |
+ XDefineCursor(dpy, mon[i].barwin, cursor[CurNormal]); | |
+ XMapRaised(dpy, mon[i].barwin); | |
+ } | |
updatestatus(); | |
/* EWMH support per view */ | |
t@@ -1384,6 +1448,16 @@ tag(const Arg *arg) { | |
} | |
} | |
+#ifdef XINERAMA | |
+void | |
+tagmon(const Arg *arg) { | |
+ if(!sel || arg->ui >= nmons) | |
+ return; | |
+ sel->mon = arg->ui; | |
+ arrange(); | |
+} | |
+#endif /* XINERAMA */ | |
+ | |
int | |
textnw(const char *text, unsigned int len) { | |
XRectangle r; | |
t@@ -1396,19 +1470,17 @@ textnw(const char *text, unsigned int len) { | |
} | |
void | |
-tile(void) { | |
+tile(Monitor *m) { | |
int x, y, h, w, mw; | |
unsigned int i, n; | |
Client *c; | |
- Monitor *m; | |
- for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next), n++); | |
+ for(n = 0, c = nexttiled(m, clients); c; c = nexttiled(m, c->next), n+… | |
if(n == 0) | |
return; | |
/* master */ | |
- c = nexttiled(clients); | |
- m = &mon[c->mon]; | |
+ c = nexttiled(m, clients); | |
mw = mfact * m->ww; | |
resize(c, m->wx, m->wy, (n == 1 ? m->ww : mw) - 2 * c->bw, m->wh - 2 *… | |
t@@ -1423,7 +1495,7 @@ tile(void) { | |
if(h < bh) | |
h = m->wh; | |
- for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) { | |
+ for(i = 0, c = nexttiled(m, c->next); c; c = nexttiled(m, c->next), i+… | |
resize(c, x, y, w - 2 * c->bw, /* remainder */ ((i + 1 == n) | |
? m->wy + m->wh - y - 2 * c->bw : h - 2 * c->bw)); | |
if(h != m->wh) | |
t@@ -1433,9 +1505,9 @@ tile(void) { | |
void | |
togglebar(const Arg *arg) { | |
- showbar = !showbar; | |
+ selmon->showbar = !selmon->showbar; | |
updategeom(); | |
- updatebar(); | |
+ XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon-… | |
arrange(); | |
} | |
t@@ -1453,7 +1525,7 @@ void | |
toggletag(const Arg *arg) { | |
unsigned int mask; | |
- if (!sel) | |
+ if(!sel) | |
return; | |
mask = sel->tags ^ (arg->ui & TAGMASK); | |
t@@ -1505,14 +1577,6 @@ unmapnotify(XEvent *e) { | |
} | |
void | |
-updatebar(void) { | |
- if(dc.drawable != 0) | |
- XFreePixmap(dpy, dc.drawable); | |
- dc.drawable = XCreatePixmap(dpy, root, selmon->ww, bh, DefaultDepth(dp… | |
- XMoveResizeWindow(dpy, barwin, selmon->wx, by, selmon->ww, bh); | |
-} | |
- | |
-void | |
updategeom(void) { | |
#ifdef XINERAMA | |
int di, x, y, n; | |
t@@ -1523,7 +1587,7 @@ updategeom(void) { | |
XineramaScreenInfo *info = NULL; | |
/* window area geometry */ | |
- if(XineramaIsActive(dpy) && (info = XineramaQueryScreens(dpy, &n))) { | |
+ if(XineramaIsActive(dpy) && (info = XineramaQueryScreens(dpy, &n))) { | |
nmons = (unsigned int)n; | |
for(c = clients; c; c = c->next) | |
if(c->mon >= nmons) | |
t@@ -1533,37 +1597,51 @@ updategeom(void) { | |
pquery = XQueryPointer(dpy, root, &dummy, &dummy, &x, &y, &di,… | |
for(i = 0; i < nmons; i++) { | |
/* TODO: consider re-using XineramaScreenInfo */ | |
+ mon[i].symbol[0] = '['; | |
+ mon[i].symbol[1] = '0' + info[i].screen_number; | |
+ mon[i].symbol[2] = ']'; | |
+ mon[i].symbol[3] = 0; | |
+ mon[i].showbar = showbar; | |
+ mon[i].topbar = topbar; | |
mon[i].wx = info[i].x_org; | |
- mon[i].wy = info[i].y_org; | |
+ mon[i].wy = mon[i].showbar && mon[i].topbar ? info[i].… | |
mon[i].ww = info[i].width; | |
- mon[i].wh = info[i].height; | |
+ mon[i].wh = mon[i].showbar ? info[i].height - bh : inf… | |
mon[i].seltags = 0; | |
mon[i].sellt = 0; | |
+ if(mon[i].showbar) | |
+ mon[i].by = mon[i].topbar ? info[i].y_org : mo… | |
+ else | |
+ mon[i].by = -bh; | |
if(pquery && INRECT(x, y, info[i].x_org, info[i].y_org… | |
selmon = &mon[i]; | |
} | |
- /* bar adjustments of selmon */ | |
- selmon->wy = showbar && topbar ? selmon->wy + bh : selmon->wy; | |
- selmon->wh = showbar ? selmon->wh - bh : selmon->wh; | |
XFree(info); | |
} | |
else | |
-#endif | |
+#endif /* XINERAMA */ | |
{ | |
nmons = 1; | |
if(!(mon = (Monitor *)realloc(mon, sizeof(Monitor)))) | |
die("fatal: could not realloc() %u bytes\n", sizeof(Mo… | |
selmon = &mon[0]; | |
+ mon[0].symbol[0] = '['; | |
+ mon[0].symbol[1] = '0'; | |
+ mon[0].symbol[2] = ']'; | |
+ mon[0].symbol[3] = 0; | |
+ mon[0].showbar = showbar; | |
+ mon[0].topbar = topbar; | |
mon[0].wx = sx; | |
- mon[0].wy = showbar && topbar ? sy + bh : sy; | |
+ mon[0].wy = mon[0].showbar && mon[0].topbar ? sy + bh : sy; | |
mon[0].ww = sw; | |
- mon[0].wh = showbar ? sh - bh : sh; | |
+ mon[0].wh = mon[0].showbar ? sh - bh : sh; | |
mon[0].seltags = 0; | |
mon[0].sellt = 0; | |
+ if(mon[0].showbar) | |
+ mon[0].by = mon[0].topbar ? sy : mon[0].wy + mon[0].wh; | |
+ else | |
+ mon[0].by = -bh; | |
} | |
- | |
- /* bar position */ | |
- by = showbar ? (topbar ? selmon->wy - bh : selmon->wy + selmon->wh) : … | |
} | |
void | |
t@@ -1588,7 +1666,7 @@ updatesizehints(Client *c) { | |
if(!XGetWMNormalHints(dpy, c->win, &size, &msize)) | |
/* size is uninitialized, ensure that size.flags aren't used */ | |
- size.flags = PSize; | |
+ size.flags = PSize; | |
if(size.flags & PBaseSize) { | |
c->basew = size.base_width; | |
c->baseh = size.base_height; | |
t@@ -1641,7 +1719,7 @@ void | |
updatestatus() { | |
if(!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) | |
strcpy(stext, "dwm-"VERSION); | |
- drawbar(); | |
+ drawbar(selmon); | |
} | |
void | |
t@@ -1709,8 +1787,8 @@ zoom(const Arg *arg) { | |
if(!lt[selmon->sellt]->arrange || lt[selmon->sellt]->arrange == monocl… | |
return; | |
- if(c == nexttiled(clients)) | |
- if(!c || !(c = nexttiled(c->next))) | |
+ if(c == nexttiled(selmon, clients)) | |
+ if(!c || !(c = nexttiled(selmon, c->next))) | |
return; | |
detach(c); | |
attach(c); |