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