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
	 Mikau
						Mikau