experimental xinerama support, two new actions, Mod1-w/e and Mod1-Shift-w/e
This commit is contained in:
		
							parent
							
								
									f27ccc5c60
								
							
						
					
					
						commit
						2ce37bc69e
					
				
					 3 changed files with 209 additions and 121 deletions
				
			
		
							
								
								
									
										10
									
								
								config.def.h
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								config.def.h
									
										
									
									
									
								
							|  | @ -13,6 +13,7 @@ static unsigned int snap            = 32;       /* snap pixel */ | |||
| 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 */ | ||||
|  | @ -20,7 +21,8 @@ static unsigned int tagset[] = {1, 1}; /* after start, first tag is selected */ | |||
| 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) */ | ||||
|  | @ -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) | ||||
|  |  | |||
							
								
								
									
										10
									
								
								config.mk
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								config.mk
									
										
									
									
									
								
							|  | @ -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} | ||||
|  | @ -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}\"
 | ||||
|  |  | |||
							
								
								
									
										262
									
								
								dwm.c
									
										
									
									
									
								
							
							
						
						
									
										262
									
								
								dwm.c
									
										
									
									
									
								
							|  | @ -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) >= (RY) && (Y) < (RY) + (RH)) | ||||
| #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)) | ||||
|  | @ -115,16 +115,21 @@ 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; | ||||
|  | @ -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[ColLast]); | ||||
| static void drawtext(const char *text, unsigned long col[ColLast], Bool invert); | ||||
| static void enternotify(XEvent *e); | ||||
|  | @ -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); | ||||
|  | @ -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); | ||||
|  | @ -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 bh, blw = 0;      /* bar geometry */ | ||||
| static int (*xerrorxlib)(Display *, XErrorEvent *); | ||||
| static unsigned int numlockmask = 0; | ||||
| static void (*handler[LASTEvent]) (XEvent *) = { | ||||
|  | @ -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" | ||||
| 
 | ||||
|  | @ -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 | ||||
|  | @ -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; | ||||
|  | @ -412,6 +427,7 @@ checkotherwm(void) { | |||
| 
 | ||||
| void | ||||
| cleanup(void) { | ||||
| 	unsigned int i; | ||||
| 	Arg a = {.ui = ~0}; | ||||
| 	Layout foo = { "", NULL }; | ||||
| 
 | ||||
|  | @ -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); | ||||
| } | ||||
|  | @ -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, screen), bh, DefaultDepth(dpy, screen)); | ||||
| 		for(i = 0; i < nmons; i++) | ||||
| 			XMoveResizeWindow(dpy, mon[i].barwin, mon[i].wx, mon[i].by, mon[i].ww, bh); | ||||
| 		arrange(); | ||||
| 	} | ||||
| } | ||||
|  | @ -556,38 +579,50 @@ 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) { | ||||
| 		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 << i, col); | ||||
| 		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; | ||||
| 	if(m == selmon) { | ||||
| 		dc.w = TEXTW(stext); | ||||
| 	dc.x = selmon->ww - dc.w; | ||||
| 		dc.x = m->ww - dc.w; | ||||
| 		if(dc.x < x) { | ||||
| 			dc.x = x; | ||||
| 		dc.w = selmon->ww - x; | ||||
| 			dc.w = m->ww - x; | ||||
| 		} | ||||
| 		drawtext(stext, dc.norm, False); | ||||
| 		if((dc.w = dc.x - x) > bh) { | ||||
|  | @ -599,10 +634,23 @@ drawbar(void) { | |||
| 			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; | ||||
|  | @ -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 | ||||
|  | @ -693,7 +745,9 @@ focus(Client *c) { | |||
| 	else | ||||
| 		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); | ||||
| 	sel = c; | ||||
| 	drawbar(); | ||||
| 	if(c) | ||||
| 		selmon = &mon[c->mon]; | ||||
| 	drawbars(); | ||||
| } | ||||
| 
 | ||||
| void | ||||
|  | @ -704,6 +758,17 @@ focusin(XEvent *e) { /* there are some broken focus acquiring clients */ | |||
| 		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; | ||||
|  | @ -726,7 +791,7 @@ focusstack(const Arg *arg) { | |||
| 	} | ||||
| 	if(c) { | ||||
| 		focus(c); | ||||
| 		restack(); | ||||
| 		restack(selmon); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -946,8 +1011,7 @@ 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 the bar */ | ||||
| 		/* TODO: is c always attached to selmon? */ | ||||
| 		c->y = MAX(c->y, ((by == 0) && (c->x + (c->w / 2) >= selmon->wx) | ||||
| 		c->y = MAX(c->y, ((selmon->by == 0) && (c->x + (c->w / 2) >= selmon->wx) | ||||
| 		           && (c->x + (c->w / 2) < selmon->wx + selmon->ww)) ? bh : sy); | ||||
| 		c->bw = borderpx; | ||||
| 	} | ||||
|  | @ -1001,15 +1065,12 @@ 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 | ||||
| movemouse(const Arg *arg) { | ||||
|  | @ -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, GrabModeAsync, | ||||
|  | @ -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 = c->next); | ||||
| 	return c; | ||||
| } | ||||
| 
 | ||||
|  | @ -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(); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | @ -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, GrabModeAsync, | ||||
|  | @ -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|CWStackMode, &wc); | ||||
| 				wc.sibling = c->win; | ||||
| 			} | ||||
|  | @ -1248,7 +1310,7 @@ setlayout(const Arg *arg) { | |||
| 	if(sel) | ||||
| 		arrange(); | ||||
| 	else | ||||
| 		drawbar(); | ||||
| 		drawbars(); | ||||
| } | ||||
| 
 | ||||
| /* arg > 1.0 will set mfact absolutly */ | ||||
|  | @ -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, mon[i].ww, bh, 0, DefaultDepth(dpy, screen), | ||||
| 
 | ||||
| 	barwin = XCreateWindow(dpy, root, selmon->wx, by, selmon->ww, bh, 0, DefaultDepth(dpy, screen), | ||||
| 		                              CopyFromParent, DefaultVisual(dpy, screen), | ||||
| 		                              CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); | ||||
| 	XDefineCursor(dpy, barwin, cursor[CurNormal]); | ||||
| 	XMapRaised(dpy, barwin); | ||||
| 		XDefineCursor(dpy, mon[i].barwin, cursor[CurNormal]); | ||||
| 		XMapRaised(dpy, mon[i].barwin); | ||||
| 	} | ||||
| 	updatestatus(); | ||||
| 
 | ||||
| 	/* EWMH support per view */ | ||||
|  | @ -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; | ||||
|  | @ -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 * c->bw); | ||||
| 
 | ||||
|  | @ -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) | ||||
|  | @ -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->ww, bh); | ||||
| 	arrange(); | ||||
| } | ||||
| 
 | ||||
|  | @ -1504,14 +1576,6 @@ unmapnotify(XEvent *e) { | |||
| 		unmanage(c); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| updatebar(void) { | ||||
| 	if(dc.drawable != 0) | ||||
| 		XFreePixmap(dpy, dc.drawable); | ||||
| 	dc.drawable = XCreatePixmap(dpy, root, selmon->ww, bh, DefaultDepth(dpy, screen)); | ||||
| 	XMoveResizeWindow(dpy, barwin, selmon->wx, by, selmon->ww, bh); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| updategeom(void) { | ||||
| #ifdef XINERAMA | ||||
|  | @ -1533,37 +1597,51 @@ updategeom(void) { | |||
| 		pquery = XQueryPointer(dpy, root, &dummy, &dummy, &x, &y, &di, &di, &dui); | ||||
| 		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].y_org + bh : info[i].y_org; | ||||
| 			mon[i].ww = info[i].width; | ||||
| 			mon[i].wh = info[i].height; | ||||
| 			mon[i].wh = mon[i].showbar ? info[i].height - bh : info[i].height; | ||||
| 			mon[i].seltags = 0; | ||||
| 			mon[i].sellt = 0; | ||||
| 			if(mon[i].showbar) | ||||
| 				mon[i].by = mon[i].topbar ? info[i].y_org : mon[i].wy + mon[i].wh; | ||||
| 			else | ||||
| 				mon[i].by = -bh; | ||||
| 			if(pquery && INRECT(x, y, info[i].x_org, info[i].y_org, info[i].width, info[i].height)) | ||||
| 				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(Monitor)); | ||||
| 		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) : -bh; | ||||
| } | ||||
| 
 | ||||
| void | ||||
|  | @ -1641,7 +1719,7 @@ void | |||
| updatestatus() { | ||||
| 	if(!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) | ||||
| 		strcpy(stext, "dwm-"VERSION); | ||||
| 	drawbar(); | ||||
| 	drawbar(selmon); | ||||
| } | ||||
| 
 | ||||
| void | ||||
|  | @ -1709,8 +1787,8 @@ zoom(const Arg *arg) { | |||
| 
 | ||||
| 	if(!lt[selmon->sellt]->arrange || lt[selmon->sellt]->arrange == monocle || (sel && sel->isfloating)) | ||||
| 		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); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue