Fix process of gettign the active monitor
- Get the window with keyboard focus using XGetInputFocus() instead of _NET_ACTIVE_WINDOW - Handle edge cases of keyboard/mouse focus being on different X screen - Set sane default in case the active monitor can't be determined (fixing issue #762)
This commit is contained in:
		
							parent
							
								
									77bfbc4f7f
								
							
						
					
					
						commit
						ebcd20d8d0
					
				@ -309,10 +309,7 @@ const struct screen_info *get_active_screen(void)
 | 
			
		||||
        if (settings.f_mode == FOLLOW_NONE) {
 | 
			
		||||
                if (settings.monitor >= 0 && settings.monitor < screens_len) {
 | 
			
		||||
                        ret = settings.monitor;
 | 
			
		||||
                } else {
 | 
			
		||||
                        ret = XDefaultScreen(xctx.dpy);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                goto sc_cleanup;
 | 
			
		||||
        } else {
 | 
			
		||||
                int x, y;
 | 
			
		||||
@ -327,19 +324,25 @@ const struct screen_info *get_active_screen(void)
 | 
			
		||||
                if (settings.f_mode == FOLLOW_KEYBOARD) {
 | 
			
		||||
                        Window focused = get_focused_window();
 | 
			
		||||
 | 
			
		||||
                        if (focused == 0) {
 | 
			
		||||
                        if (!focused) {
 | 
			
		||||
                                /*
 | 
			
		||||
                                 * This can happen in the case that the user
 | 
			
		||||
                                 * just has the root window open, eg. in empty
 | 
			
		||||
                                 * tags in dwm or similar window managers. In
 | 
			
		||||
                                 * that case, fall back to FOLLOW_MOUSE, since
 | 
			
		||||
                                 * it probably still has the right screen.
 | 
			
		||||
                                 * If no window is focused, or the focus is set
 | 
			
		||||
                                 * to dynamically change to the root window of
 | 
			
		||||
                                 * the screen the pointer is on, force following
 | 
			
		||||
                                 * the mouse.
 | 
			
		||||
                                 */
 | 
			
		||||
                                force_follow_mouse = true;
 | 
			
		||||
                        } else {
 | 
			
		||||
                                Window child_return;
 | 
			
		||||
                                XTranslateCoordinates(xctx.dpy, focused, root,
 | 
			
		||||
                                                0, 0, &x, &y, &child_return);
 | 
			
		||||
                                /*
 | 
			
		||||
                                 * The window with input focus might be on a
 | 
			
		||||
                                 * different X screen. Use the mouse location
 | 
			
		||||
                                 * in that case.
 | 
			
		||||
                                 */
 | 
			
		||||
                                force_follow_mouse = !XTranslateCoordinates(
 | 
			
		||||
                                                        xctx.dpy, focused,root,
 | 
			
		||||
                                                        0, 0, &x, &y,
 | 
			
		||||
                                                        &child_return);
 | 
			
		||||
                        }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
@ -370,7 +373,7 @@ const struct screen_info *get_active_screen(void)
 | 
			
		||||
                        goto sc_cleanup;
 | 
			
		||||
 | 
			
		||||
                /* something seems to be wrong. Fall back to default */
 | 
			
		||||
                ret = XDefaultScreen(xctx.dpy);
 | 
			
		||||
                ret = 0;
 | 
			
		||||
                goto sc_cleanup;
 | 
			
		||||
        }
 | 
			
		||||
sc_cleanup:
 | 
			
		||||
@ -386,32 +389,13 @@ sc_cleanup:
 | 
			
		||||
 */
 | 
			
		||||
static Window get_focused_window(void)
 | 
			
		||||
{
 | 
			
		||||
        Window focused = 0;
 | 
			
		||||
        Atom type;
 | 
			
		||||
        int format;
 | 
			
		||||
        unsigned long nitems, bytes_after;
 | 
			
		||||
        unsigned char *prop_return = NULL;
 | 
			
		||||
        Window root = RootWindow(xctx.dpy, DefaultScreen(xctx.dpy));
 | 
			
		||||
        Atom netactivewindow =
 | 
			
		||||
            XInternAtom(xctx.dpy, "_NET_ACTIVE_WINDOW", false);
 | 
			
		||||
        Window focused;
 | 
			
		||||
        int ignored;
 | 
			
		||||
 | 
			
		||||
        XGetWindowProperty(xctx.dpy,
 | 
			
		||||
                           root,
 | 
			
		||||
                           netactivewindow,
 | 
			
		||||
                           0L,
 | 
			
		||||
                           sizeof(Window),
 | 
			
		||||
                           false,
 | 
			
		||||
                           XA_WINDOW,
 | 
			
		||||
                           &type,
 | 
			
		||||
                           &format,
 | 
			
		||||
                           &nitems,
 | 
			
		||||
                           &bytes_after,
 | 
			
		||||
                           &prop_return);
 | 
			
		||||
        if (prop_return) {
 | 
			
		||||
                focused = *(Window *)prop_return;
 | 
			
		||||
                XFree(prop_return);
 | 
			
		||||
        }
 | 
			
		||||
        XGetInputFocus(xctx.dpy, &focused, &ignored);
 | 
			
		||||
 | 
			
		||||
        if (focused == None || focused == PointerRoot)
 | 
			
		||||
                focused = 0;
 | 
			
		||||
        return focused;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user