dwm.c
changeset 1360 dc076b2d28d7
parent 1358 e4bcaca8e6ef
child 1361 41678fc29f2a
equal deleted inserted replaced
1359:ef1026c88059 1360:dc076b2d28d7
    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 WIDTH(x)                ((x)->w + 2*(x)->bw)
       
    57 #define HEIGHT(x)               ((x)->h + 2*(x)->bw)
    57 #define TAGMASK                 ((int)((1LL << LENGTH(tags)) - 1))
    58 #define TAGMASK                 ((int)((1LL << LENGTH(tags)) - 1))
    58 #define TEXTW(x)                (textnw(x, strlen(x)) + dc.font.height)
    59 #define TEXTW(x)                (textnw(x, strlen(x)) + dc.font.height)
    59 
    60 
    60 /* enums */
    61 /* enums */
    61 enum { CurNormal, CurResize, CurMove, CurLast };        /* cursor */
    62 enum { CurNormal, CurResize, CurMove, CurLast };        /* cursor */
   866 		c->x = sx;
   867 		c->x = sx;
   867 		c->y = sy;
   868 		c->y = sy;
   868 		c->bw = 0;
   869 		c->bw = 0;
   869 	}
   870 	}
   870 	else {
   871 	else {
   871 		if(c->x + c->w + 2 * c->bw > sx + sw)
   872 		if(c->x + WIDTH(c) > sx + sw)
   872 			c->x = sx + sw - NOBORDER(c->w);
   873 			c->x = sx + sw - WIDTH(c);
   873 		if(c->y + c->h + 2 * c->bw > sy + sh)
   874 		if(c->y + HEIGHT(c) > sy + sh)
   874 			c->y = sy + sh - NOBORDER(c->h);
   875 			c->y = sy + sh - HEIGHT(c);
   875 		c->x = MAX(c->x, sx);
   876 		c->x = MAX(c->x, sx);
   876 		/* only fix client y-offset, if the client center might cover the bar */
   877 		/* only fix client y-offset, if the client center might cover the bar */
   877 		c->y = MAX(c->y, ((by == 0) && (c->x + (c->w / 2) >= wx) && (c->x + (c->w / 2) < wx + ww)) ? bh : sy);
   878 		c->y = MAX(c->y, ((by == 0) && (c->x + (c->w / 2) >= wx) && (c->x + (c->w / 2) < wx + ww)) ? bh : sy);
   878 		c->bw = borderpx;
   879 		c->bw = borderpx;
   879 	}
   880 	}
   929 void
   930 void
   930 monocle(void) {
   931 monocle(void) {
   931 	Client *c;
   932 	Client *c;
   932 
   933 
   933 	for(c = nexttiled(clients); c; c = nexttiled(c->next))
   934 	for(c = nexttiled(clients); c; c = nexttiled(c->next))
   934 		resize(c, wx, wy, NOBORDER(ww), NOBORDER(wh), resizehints);
   935 		resize(c, wx, wy, ww - 2*c->bw, wh - 2*c->bw, resizehints);
   935 }
   936 }
   936 
   937 
   937 void
   938 void
   938 movemouse(const Arg *arg) {
   939 movemouse(const Arg *arg) {
   939 	int x, y, ocx, ocy, di, nx, ny;
   940 	int x, y, ocx, ocy, di, nx, ny;
   965 			ny = ocy + (ev.xmotion.y - y);
   966 			ny = ocy + (ev.xmotion.y - y);
   966 			if(snap && nx >= wx && nx <= wx + ww
   967 			if(snap && nx >= wx && nx <= wx + ww
   967 			        && ny >= wy && ny <= wy + wh) {
   968 			        && ny >= wy && ny <= wy + wh) {
   968 				if(abs(wx - nx) < snap)
   969 				if(abs(wx - nx) < snap)
   969 					nx = wx;
   970 					nx = wx;
   970 				else if(abs((wx + ww) - (nx + c->w + 2 * c->bw)) < snap)
   971 				else if(abs((wx + ww) - (nx + WIDTH(c))) < snap)
   971 					nx = wx + ww - NOBORDER(c->w);
   972 					nx = wx + ww - WIDTH(c);
   972 				if(abs(wy - ny) < snap)
   973 				if(abs(wy - ny) < snap)
   973 					ny = wy;
   974 					ny = wy;
   974 				else if(abs((wy + wh) - (ny + c->h + 2 * c->bw)) < snap)
   975 				else if(abs((wy + wh) - (ny + HEIGHT(c))) < snap)
   975 					ny = wy + wh - NOBORDER(c->h);
   976 					ny = wy + wh - HEIGHT(c);
   976 				if(!c->isfloating && lt[sellt]->arrange && (abs(nx - c->x) > snap || abs(ny - c->y) > snap))
   977 				if(!c->isfloating && lt[sellt]->arrange && (abs(nx - c->x) > snap || abs(ny - c->y) > snap))
   977 					togglefloating(NULL);
   978 					togglefloating(NULL);
   978 			}
   979 			}
   979 			if(!lt[sellt]->arrange || c->isfloating)
   980 			if(!lt[sellt]->arrange || c->isfloating)
   980 				resize(c, nx, ny, c->w, c->h, False);
   981 				resize(c, nx, ny, c->w, c->h, False);
  1078 			h = MIN(h, c->maxh);
  1079 			h = MIN(h, c->maxh);
  1079 	}
  1080 	}
  1080 	if(w <= 0 || h <= 0)
  1081 	if(w <= 0 || h <= 0)
  1081 		return;
  1082 		return;
  1082 	if(x > sx + sw)
  1083 	if(x > sx + sw)
  1083 		x = sw - NOBORDER(w);
  1084 		x = sw - WIDTH(c);
  1084 	if(y > sy + sh)
  1085 	if(y > sy + sh)
  1085 		y = sh - NOBORDER(h);
  1086 		y = sh - HEIGHT(c);
  1086 	if(x + w + 2 * c->bw < sx)
  1087 	if(x + w + 2 * c->bw < sx)
  1087 		x = sx;
  1088 		x = sx;
  1088 	if(y + h + 2 * c->bw < sy)
  1089 	if(y + h + 2 * c->bw < sy)
  1089 		y = sy;
  1090 		y = sy;
  1090 	if(h < bh)
  1091 	if(h < bh)
  1128 		case MapRequest:
  1129 		case MapRequest:
  1129 			handler[ev.type](&ev);
  1130 			handler[ev.type](&ev);
  1130 			break;
  1131 			break;
  1131 		case MotionNotify:
  1132 		case MotionNotify:
  1132 			XSync(dpy, False);
  1133 			XSync(dpy, False);
  1133 			nw = MAX(ev.xmotion.x - NOBORDER(ocx) + 1, 1);
  1134 			nw = MAX(ev.xmotion.x - ocx - 2*c->bw + 1, 1);
  1134 			nh = MAX(ev.xmotion.y - NOBORDER(ocy) + 1, 1);
  1135 			nh = MAX(ev.xmotion.y - ocy - 2*c->bw + 1, 1);
  1135 
  1136 
  1136 			if(snap && nw >= wx && nw <= wx + ww
  1137 			if(snap && nw >= wx && nw <= wx + ww
  1137 			        && nh >= wy && nh <= wy + wh) {
  1138 			        && nh >= wy && nh <= wy + wh) {
  1138 				if(!c->isfloating && lt[sellt]->arrange
  1139 				if(!c->isfloating && lt[sellt]->arrange
  1139 				   && (abs(nw - c->w) > snap || abs(nh - c->h) > snap))
  1140 				   && (abs(nw - c->w) > snap || abs(nh - c->h) > snap))
  1432 		return;
  1433 		return;
  1433 
  1434 
  1434 	/* master */
  1435 	/* master */
  1435 	c = nexttiled(clients);
  1436 	c = nexttiled(clients);
  1436 	mw = mfact * ww;
  1437 	mw = mfact * ww;
  1437 	resize(c, wx, wy, NOBORDER(n == 1 ? ww : mw), NOBORDER(wh), resizehints);
  1438 	resize(c, wx, wy, (n == 1 ? ww : mw) - 2*c->bw, wh - 2*c->bw, resizehints);
  1438 
  1439 
  1439 	if(--n == 0)
  1440 	if(--n == 0)
  1440 		return;
  1441 		return;
  1441 
  1442 
  1442 	/* tile stack */
  1443 	/* tile stack */
  1446 	h = wh / n;
  1447 	h = wh / n;
  1447 	if(h < bh)
  1448 	if(h < bh)
  1448 		h = wh;
  1449 		h = wh;
  1449 
  1450 
  1450 	for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
  1451 	for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
  1451 		resize(c, x, y, NOBORDER(w), /* remainder */ ((i + 1 == n)
  1452 		resize(c, x, y, w - 2*c->bw, /* remainder */ ((i + 1 == n)
  1452 		       ? NOBORDER(wy + wh) - y : h), resizehints);
  1453 		       ? wy + wh - y : h) - 2*c->bw, resizehints);
  1453 		if(h != wh)
  1454 		if(h != wh)
  1454 			y = c->y + c->h + 2 * c->bw;
  1455 			y = c->y + HEIGHT(c);
  1455 	}
  1456 	}
  1456 }
  1457 }
  1457 
  1458 
  1458 void
  1459 void
  1459 togglebar(const Arg *arg) {
  1460 togglebar(const Arg *arg) {