diff options
| author | Vito Caputo <vcaputo@gnugeneration.com> | 2016-08-14 19:09:31 -0700 | 
|---|---|---|
| committer | Vito Caputo <vcaputo@gnugeneration.com> | 2016-08-14 19:09:31 -0700 | 
| commit | 667dbddff7a2656695fda5ea65529b918713359d (patch) | |
| tree | 7f9876e6c3a6506cb306f9c91b31e994be4f7cf8 | |
| parent | e854f91f8bbf5a360c2a8713c52f6de19dfd9568 (diff) | |
Set input focus in vwm_win_focus() when is_mapped()
It's inappropriate to assume the window being focused is in the visible
context.  This caused the input focus to spuriously vanish if a window on
another desktop went away causing the next one, also invisible, to get focused.
I'm surprised how long I went without ever noticing this bug!  My workflow
basically never has windows vanishing that aren't in the focused context.
| -rw-r--r-- | vwm.c | 17 | 
1 files changed, 9 insertions, 8 deletions
| @@ -1702,13 +1702,15 @@ static void vwm_win_autoconf(vwm_window_t *vwin, vwm_screen_rel_t rel, vwm_win_a  /* focus a window */ -/* this updates window border color as needed and the X input focus */ +/* this updates window border color as needed and the X input focus if mapped */  static void vwm_win_focus(vwm_window_t *vwin)  {  	VWM_TRACE("focusing: %#x", (unsigned int)vwin->xwindow->id); -	/* change the focus to the new window */ -	XSetInputFocus(display, vwin->xwindow->id, RevertToPointerRoot, CurrentTime); +	if(vwm_xwin_is_mapped(vwin->xwindow)) { +		/* if vwin is mapped give it the input focus */ +		XSetInputFocus(display, vwin->xwindow->id, RevertToPointerRoot, CurrentTime); +	}  	/* update the border color accordingly */  	if(vwin->shelved) { @@ -1717,17 +1719,16 @@ static void vwm_win_focus(vwm_window_t *vwin)  		/* fullscreen windows in the shelf when focused, since we don't intend to overlap there */  		vwm_win_autoconf(vwin, VWM_SCREEN_REL_POINTER, VWM_WIN_AUTOCONF_FULL);	/* XXX TODO: for now the shelf follows the pointer, it's simple. */  	} else { -		if(vwin->desktop == focused_desktop && focused_desktop->focused_window) { -			/* if we've changed focus within the same desktop, set the currently focused window border to the -			 * unfocused color.  Otherwise, we want to leave the focused color on the old window on the old desktop */ -			XSetWindowBorder(display, focused_desktop->focused_window->xwindow->id, unfocused_window_border_color.pixel); +		if(vwin->desktop->focused_window) { +			/* set the border of the previously focused window on the same desktop to the unfocused color */ +			XSetWindowBorder(display, vwin->desktop->focused_window->xwindow->id, unfocused_window_border_color.pixel);  		}  		/* set the border of the newly focused window to the focused color */  		XSetWindowBorder(display, vwin->xwindow->id, focused_window_border_color.pixel);  		/* persist this on a per-desktop basis so it can be restored on desktop switches */ -		focused_desktop->focused_window = vwin; +		vwin->desktop->focused_window = vwin;  	}  } | 
