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)) |
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) { |