dwm.c
changeset 1346 2765f1a08494
parent 1344 ba02dda36aee
child 1347 87771e5f517f
equal deleted inserted replaced
1344:ba02dda36aee 1346:2765f1a08494
    51 #define LENGTH(x)               (sizeof x / sizeof x[0])
    51 #define LENGTH(x)               (sizeof x / sizeof x[0])
    52 #define MAX(a, b)               ((a) > (b) ? (a) : (b))
    52 #define MAX(a, b)               ((a) > (b) ? (a) : (b))
    53 #define MIN(a, b)               ((a) < (b) ? (a) : (b))
    53 #define MIN(a, b)               ((a) < (b) ? (a) : (b))
    54 #define MAXTAGLEN               16
    54 #define MAXTAGLEN               16
    55 #define MOUSEMASK               (BUTTONMASK|PointerMotionMask)
    55 #define MOUSEMASK               (BUTTONMASK|PointerMotionMask)
       
    56 #define NOBORDER(x)             ((x) - 2 * c->bw)
    56 #define TAGMASK                 ((int)((1LL << LENGTH(tags)) - 1))
    57 #define TAGMASK                 ((int)((1LL << LENGTH(tags)) - 1))
    57 #define TEXTW(x)                (textnw(x, strlen(x)) + dc.font.height)
    58 #define TEXTW(x)                (textnw(x, strlen(x)) + dc.font.height)
    58 
    59 
    59 /* enums */
    60 /* enums */
    60 enum { CurNormal, CurResize, CurMove, CurLast };        /* cursor */
    61 enum { CurNormal, CurResize, CurMove, CurLast };        /* cursor */
   225 	[UnmapNotify] = unmapnotify
   226 	[UnmapNotify] = unmapnotify
   226 };
   227 };
   227 static Atom wmatom[WMLast], netatom[NetLast];
   228 static Atom wmatom[WMLast], netatom[NetLast];
   228 static Bool otherwm;
   229 static Bool otherwm;
   229 static Bool running = True;
   230 static Bool running = True;
   230 static unsigned int tagset[] = {1, 1}; /* after start, first tag is selected */
       
   231 static Client *clients = NULL;
   231 static Client *clients = NULL;
   232 static Client *sel = NULL;
   232 static Client *sel = NULL;
   233 static Client *stack = NULL;
   233 static Client *stack = NULL;
   234 static Cursor cursor[CurLast];
   234 static Cursor cursor[CurLast];
   235 static Display *dpy;
   235 static Display *dpy;
   878 		c->y = sy;
   878 		c->y = sy;
   879 		c->bw = 0;
   879 		c->bw = 0;
   880 	}
   880 	}
   881 	else {
   881 	else {
   882 		if(c->x + c->w + 2 * c->bw > sx + sw)
   882 		if(c->x + c->w + 2 * c->bw > sx + sw)
   883 			c->x = sx + sw - c->w - 2 * c->bw;
   883 			c->x = sx + sw - NOBORDER(c->w);
   884 		if(c->y + c->h + 2 * c->bw > sy + sh)
   884 		if(c->y + c->h + 2 * c->bw > sy + sh)
   885 			c->y = sy + sh - c->h - 2 * c->bw;
   885 			c->y = sy + sh - NOBORDER(c->h);
   886 		c->x = MAX(c->x, sx);
   886 		c->x = MAX(c->x, sx);
   887 		/* only fix client y-offset, if the client center might cover the bar */
   887 		/* only fix client y-offset, if the client center might cover the bar */
   888 		c->y = MAX(c->y, ((by == 0) && (c->x + (c->w / 2) >= wx) && (c->x + (c->w / 2) < wx + ww)) ? bh : sy);
   888 		c->y = MAX(c->y, ((by == 0) && (c->x + (c->w / 2) >= wx) && (c->x + (c->w / 2) < wx + ww)) ? bh : sy);
   889 		c->bw = borderpx;
   889 		c->bw = borderpx;
   890 	}
   890 	}
   940 void
   940 void
   941 monocle(void) {
   941 monocle(void) {
   942 	Client *c;
   942 	Client *c;
   943 
   943 
   944 	for(c = nexttiled(clients); c; c = nexttiled(c->next))
   944 	for(c = nexttiled(clients); c; c = nexttiled(c->next))
   945 		resize(c, wx, wy, ww - 2 * c->bw, wh - 2 * c->bw, resizehints);
   945 		resize(c, wx, wy, NOBORDER(ww), NOBORDER(wh), resizehints);
   946 }
   946 }
   947 
   947 
   948 void
   948 void
   949 movemouse(const Arg *arg) {
   949 movemouse(const Arg *arg) {
   950 	int x, y, ocx, ocy, di, nx, ny;
   950 	int x, y, ocx, ocy, di, nx, ny;
   977 			if(snap && nx >= wx && nx <= wx + ww
   977 			if(snap && nx >= wx && nx <= wx + ww
   978 			        && ny >= wy && ny <= wy + wh) {
   978 			        && ny >= wy && ny <= wy + wh) {
   979 				if(abs(wx - nx) < snap)
   979 				if(abs(wx - nx) < snap)
   980 					nx = wx;
   980 					nx = wx;
   981 				else if(abs((wx + ww) - (nx + c->w + 2 * c->bw)) < snap)
   981 				else if(abs((wx + ww) - (nx + c->w + 2 * c->bw)) < snap)
   982 					nx = wx + ww - c->w - 2 * c->bw;
   982 					nx = wx + ww - NOBORDER(c->w);
   983 				if(abs(wy - ny) < snap)
   983 				if(abs(wy - ny) < snap)
   984 					ny = wy;
   984 					ny = wy;
   985 				else if(abs((wy + wh) - (ny + c->h + 2 * c->bw)) < snap)
   985 				else if(abs((wy + wh) - (ny + c->h + 2 * c->bw)) < snap)
   986 					ny = wy + wh - c->h - 2 * c->bw;
   986 					ny = wy + wh - NOBORDER(c->h);
   987 				if(!c->isfloating && lt[sellt]->arrange && (abs(nx - c->x) > snap || abs(ny - c->y) > snap))
   987 				if(!c->isfloating && lt[sellt]->arrange && (abs(nx - c->x) > snap || abs(ny - c->y) > snap))
   988 					togglefloating(NULL);
   988 					togglefloating(NULL);
   989 			}
   989 			}
   990 			if(!lt[sellt]->arrange || c->isfloating)
   990 			if(!lt[sellt]->arrange || c->isfloating)
   991 				resize(c, nx, ny, c->w, c->h, False);
   991 				resize(c, nx, ny, c->w, c->h, False);
  1089 			h = MIN(h, c->maxh);
  1089 			h = MIN(h, c->maxh);
  1090 	}
  1090 	}
  1091 	if(w <= 0 || h <= 0)
  1091 	if(w <= 0 || h <= 0)
  1092 		return;
  1092 		return;
  1093 	if(x > sx + sw)
  1093 	if(x > sx + sw)
  1094 		x = sw - w - 2 * c->bw;
  1094 		x = sw - NOBORDER(w);
  1095 	if(y > sy + sh)
  1095 	if(y > sy + sh)
  1096 		y = sh - h - 2 * c->bw;
  1096 		y = sh - NOBORDER(h);
  1097 	if(x + w + 2 * c->bw < sx)
  1097 	if(x + w + 2 * c->bw < sx)
  1098 		x = sx;
  1098 		x = sx;
  1099 	if(y + h + 2 * c->bw < sy)
  1099 	if(y + h + 2 * c->bw < sy)
  1100 		y = sy;
  1100 		y = sy;
  1101 	if(h < bh)
  1101 	if(h < bh)
  1139 		case MapRequest:
  1139 		case MapRequest:
  1140 			handler[ev.type](&ev);
  1140 			handler[ev.type](&ev);
  1141 			break;
  1141 			break;
  1142 		case MotionNotify:
  1142 		case MotionNotify:
  1143 			XSync(dpy, False);
  1143 			XSync(dpy, False);
  1144 			nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1);
  1144 			nw = MAX(ev.xmotion.x - NOBORDER(ocx) + 1, 1);
  1145 			nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1);
  1145 			nh = MAX(ev.xmotion.y - NOBORDER(ocy) + 1, 1);
  1146 
  1146 
  1147 			if(snap && nw >= wx && nw <= wx + ww
  1147 			if(snap && nw >= wx && nw <= wx + ww
  1148 			        && nh >= wy && nh <= wy + wh) {
  1148 			        && nh >= wy && nh <= wy + wh) {
  1149 				if(!c->isfloating && lt[sellt]->arrange
  1149 				if(!c->isfloating && lt[sellt]->arrange
  1150 				   && (abs(nw - c->w) > snap || abs(nh - c->h) > snap))
  1150 				   && (abs(nw - c->w) > snap || abs(nh - c->h) > snap))
  1428 		return;
  1428 		return;
  1429 
  1429 
  1430 	/* master */
  1430 	/* master */
  1431 	c = nexttiled(clients);
  1431 	c = nexttiled(clients);
  1432 	mw = mfact * ww;
  1432 	mw = mfact * ww;
  1433 	resize(c, wx, wy, (n == 1 ? ww : mw) - 2 * c->bw, wh - 2 * c->bw, resizehints);
  1433 	resize(c, wx, wy, NOBORDER(n == 1 ? ww : mw), NOBORDER(wh), resizehints);
  1434 
  1434 
  1435 	if(--n == 0)
  1435 	if(--n == 0)
  1436 		return;
  1436 		return;
  1437 
  1437 
  1438 	/* tile stack */
  1438 	/* tile stack */
  1442 	h = wh / n;
  1442 	h = wh / n;
  1443 	if(h < bh)
  1443 	if(h < bh)
  1444 		h = wh;
  1444 		h = wh;
  1445 
  1445 
  1446 	for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
  1446 	for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
  1447 		resize(c, x, y, w - 2 * c->bw, /* remainder */ ((i + 1 == n)
  1447 		resize(c, x, y, NOBORDER(w), /* remainder */ ((i + 1 == n)
  1448 		       ? (wy + wh) - y : h) - 2 * c->bw, resizehints);
  1448 		       ? NOBORDER(wy + wh) - y : h), resizehints);
  1449 		if(h != wh)
  1449 		if(h != wh)
  1450 			y = c->y + c->h + 2 * c->bw;
  1450 			y = c->y + c->h + 2 * c->bw;
  1451 	}
  1451 	}
  1452 }
  1452 }
  1453 
  1453