dwm.c
changeset 1462 7997ebe5484f
parent 1460 606761ddf6d6
child 1463 ba3114b785a1
equal deleted inserted replaced
1461:33f714d7d789 1462:7997ebe5484f
    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;
   418 		selmon = m;
   418 		selmon = m;
   419 		focus(NULL);
   419 		focus(NULL);
   420 	}
   420 	}
   421 	if(ev->window == selmon->barwin) {
   421 	if(ev->window == selmon->barwin) {
   422 		i = x = 0;
   422 		i = x = 0;
   423 		do
   423 		do {
   424 			x += TEXTW(tags[i]);
   424 			x += TEXTW(tags[i]);
   425 		while(ev->x >= x && ++i < LENGTH(tags));
   425 		} while(ev->x >= x && ++i < LENGTH(tags));
   426 		if(i < LENGTH(tags)) {
   426 		if(i < LENGTH(tags)) {
   427 			click = ClkTagBar;
   427 			click = ClkTagBar;
   428 			arg.ui = 1 << i;
   428 			arg.ui = 1 << i;
   429 		}
   429 		}
   430 		else if(ev->x < x + blw)
   430 		else if(ev->x < x + blw)
   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;