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