49 #define MAX(A, B) ((A) > (B) ? (A) : (B)) |
49 #define MAX(A, B) ((A) > (B) ? (A) : (B)) |
50 #define MIN(A, B) ((A) < (B) ? (A) : (B)) |
50 #define MIN(A, B) ((A) < (B) ? (A) : (B)) |
51 #define MOUSEMASK (BUTTONMASK|PointerMotionMask) |
51 #define MOUSEMASK (BUTTONMASK|PointerMotionMask) |
52 #define WIDTH(X) ((X)->w + 2 * (X)->bw) |
52 #define WIDTH(X) ((X)->w + 2 * (X)->bw) |
53 #define HEIGHT(X) ((X)->h + 2 * (X)->bw) |
53 #define HEIGHT(X) ((X)->h + 2 * (X)->bw) |
54 #define TAGMASK ((int)((1LL << LENGTH(tags)) - 1)) |
54 #define TAGMASK ((int)((1 << LENGTH(tags)) - 1)) |
55 #define TEXTW(X) (textnw(X, strlen(X)) + dc.font.height) |
55 #define TEXTW(X) (textnw(X, strlen(X)) + dc.font.height) |
56 |
56 |
57 /* enums */ |
57 /* enums */ |
58 enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ |
58 enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ |
59 enum { ColBorder, ColFG, ColBG, ColLast }; /* color */ |
59 enum { ColBorder, ColFG, ColBG, ColLast }; /* color */ |
269 |
269 |
270 /* configuration, allows nested code to access above variables */ |
270 /* configuration, allows nested code to access above variables */ |
271 #include "config.h" |
271 #include "config.h" |
272 |
272 |
273 /* compile-time check if all tags fit into an unsigned int bit array. */ |
273 /* compile-time check if all tags fit into an unsigned int bit array. */ |
274 struct NumTags { char limitexceeded[sizeof(unsigned int) * 8 < LENGTH(tags) ? -1 : 1]; }; |
274 struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; |
275 |
275 |
276 /* function implementations */ |
276 /* function implementations */ |
277 void |
277 void |
278 applyrules(Client *c) { |
278 applyrules(Client *c) { |
279 const char *class, *instance; |
279 const char *class, *instance; |
975 } |
975 } |
976 if(dc.font.set) { |
976 if(dc.font.set) { |
977 XFontSetExtents *font_extents; |
977 XFontSetExtents *font_extents; |
978 XFontStruct **xfonts; |
978 XFontStruct **xfonts; |
979 char **font_names; |
979 char **font_names; |
|
980 |
980 dc.font.ascent = dc.font.descent = 0; |
981 dc.font.ascent = dc.font.descent = 0; |
981 font_extents = XExtentsOfFontSet(dc.font.set); |
982 font_extents = XExtentsOfFontSet(dc.font.set); |
982 n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names); |
983 n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names); |
983 for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) { |
984 for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) { |
984 dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent); |
985 dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent); |
1182 } |
1183 } |
1183 if(!selmon->lt[selmon->sellt]->arrange || c->isfloating) |
1184 if(!selmon->lt[selmon->sellt]->arrange || c->isfloating) |
1184 resize(c, nx, ny, c->w, c->h, True); |
1185 resize(c, nx, ny, c->w, c->h, True); |
1185 break; |
1186 break; |
1186 } |
1187 } |
1187 } |
1188 } while(ev.type != ButtonRelease); |
1188 while(ev.type != ButtonRelease); |
|
1189 XUngrabPointer(dpy, CurrentTime); |
1189 XUngrabPointer(dpy, CurrentTime); |
1190 if((m = ptrtomon(c->x + c->w / 2, c->y + c->h / 2)) != selmon) { |
1190 if((m = ptrtomon(c->x + c->w / 2, c->y + c->h / 2)) != selmon) { |
1191 sendmon(c, m); |
1191 sendmon(c, m); |
1192 selmon = m; |
1192 selmon = m; |
1193 focus(NULL); |
1193 focus(NULL); |
1301 } |
1301 } |
1302 if(!selmon->lt[selmon->sellt]->arrange || c->isfloating) |
1302 if(!selmon->lt[selmon->sellt]->arrange || c->isfloating) |
1303 resize(c, c->x, c->y, nw, nh, True); |
1303 resize(c, c->x, c->y, nw, nh, True); |
1304 break; |
1304 break; |
1305 } |
1305 } |
1306 } |
1306 } while(ev.type != ButtonRelease); |
1307 while(ev.type != ButtonRelease); |
|
1308 XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); |
1307 XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); |
1309 XUngrabPointer(dpy, CurrentTime); |
1308 XUngrabPointer(dpy, CurrentTime); |
1310 while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); |
1309 while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); |
1311 if((m = ptrtomon(c->x + c->w / 2, c->y + c->h / 2)) != selmon) { |
1310 if((m = ptrtomon(c->x + c->w / 2, c->y + c->h / 2)) != selmon) { |
1312 sendmon(c, m); |
1311 sendmon(c, m); |
1345 |
1344 |
1346 /* main event loop */ |
1345 /* main event loop */ |
1347 XSync(dpy, False); |
1346 XSync(dpy, False); |
1348 while(running && !XNextEvent(dpy, &ev)) |
1347 while(running && !XNextEvent(dpy, &ev)) |
1349 if(handler[ev.type]) |
1348 if(handler[ev.type]) |
1350 (handler[ev.type])(&ev); /* call handler */ |
1349 handler[ev.type](&ev); /* call handler */ |
1351 } |
1350 } |
1352 |
1351 |
1353 void |
1352 void |
1354 scan(void) { |
1353 scan(void) { |
1355 unsigned int i, num; |
1354 unsigned int i, num; |