input focus: calculate areas of intersection
							parent
							
								
									70b3418e3e
								
							
						
					
					
						commit
						dd29c5d480
					
				
							
								
								
									
										34
									
								
								dmenu.c
								
								
								
								
							
							
						
						
									
										34
									
								
								dmenu.c
								
								
								
								
							|  | @ -13,9 +13,10 @@ | |||
| #endif | ||||
| #include "draw.h" | ||||
| 
 | ||||
| #define INRECT(x,y,rx,ry,rw,rh) ((x) >= (rx) && (x) < (rx)+(rw) && (y) >= (ry) && (y) < (ry)+(rh)) | ||||
| #define MIN(a,b)                ((a) < (b) ? (a) : (b)) | ||||
| #define MAX(a,b)                ((a) > (b) ? (a) : (b)) | ||||
| #define INTERSECT(x,y,w,h,r)  (MAX(0, MIN((x)+(w),(r).x_org+(r).width)  - MAX((x),(r).x_org)) \ | ||||
|                              * MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org))) | ||||
| #define MIN(a,b)              ((a) < (b) ? (a) : (b)) | ||||
| #define MAX(a,b)              ((a) > (b) ? (a) : (b)) | ||||
| 
 | ||||
| typedef struct Item Item; | ||||
| struct Item { | ||||
|  | @ -513,19 +514,28 @@ setup(void) { | |||
| 	mh = (lines + 1) * bh; | ||||
| #ifdef XINERAMA | ||||
| 	if((info = XineramaQueryScreens(dc->dpy, &n))) { | ||||
| 		int i, di; | ||||
| 		int a, j, di, i = 0, area = 0; | ||||
| 		unsigned int du; | ||||
| 		Window w, dw; | ||||
| 		Window w, pw, dw, *dws; | ||||
| 		XWindowAttributes wa; | ||||
| 
 | ||||
| 		XGetInputFocus(dc->dpy, &w, &di); | ||||
| 		if(w != root && w != PointerRoot && w != None && XGetWindowAttributes(dc->dpy, w, &wa)) | ||||
| 			XTranslateCoordinates(dc->dpy, w, root, wa.x, wa.y, &x, &y, &dw); | ||||
| 		else | ||||
| 			XQueryPointer(dc->dpy, root, &dw, &dw, &x, &y, &di, &di, &du); | ||||
| 		for(i = 0; i < n-1; i++) | ||||
| 			if(INRECT(x, y, info[i].x_org, info[i].y_org, info[i].width, info[i].height)) | ||||
| 				break; | ||||
| 		if(w != root && w != PointerRoot && w != None) { | ||||
| 			do { | ||||
| 				if(XQueryTree(dc->dpy, (pw = w), &dw, &w, &dws, &du) && dws) | ||||
| 					XFree(dws); | ||||
| 			} while(w != root && w != pw); | ||||
| 			if(XGetWindowAttributes(dc->dpy, pw, &wa)) | ||||
| 				for(j = 0; j < n; j++) | ||||
| 					if((a = INTERSECT(wa.x, wa.y, wa.width, wa.height, info[j])) > area) { | ||||
| 						area = a; | ||||
| 						i = j; | ||||
| 					} | ||||
| 		} | ||||
| 		if(!area && XQueryPointer(dc->dpy, root, &dw, &dw, &x, &y, &di, &di, &du)) | ||||
| 			for(i = 0; i < n; i++) | ||||
| 				if(INTERSECT(x, y, 1, 1, info[i])) | ||||
| 					break; | ||||
| 		x = info[i].x_org; | ||||
| 		y = info[i].y_org + (topbar ? 0 : info[i].height - mh); | ||||
| 		mw = info[i].width; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue