[PATCH 2/3] winex11.drv: Set the desktop as foreground when the WM starts a grab

Rémi Bernon rbernon at codeweavers.com
Mon Jun 10 06:51:58 CDT 2019


I'll update this one, to properly handle NotifyWhileGrabbed modes as
well.

On Mon, 2019-06-10 at 13:43 +0200, Rémi Bernon wrote:
> Several of the most used WMs are sending FocusOut events with
> NotifyGrab
> mode whenever they take a keyboard grab, which is the case for
> example
> when window is being moved from a title bar click, when screen is
> locked
> or when activity view is brought up. When releasing the grab they
> then
> send FocusIn events with NotifyUngrabbed mode.
> 
> However, XGetInputFocus call still returns that the current window
> still
> has the input focus, so Wine was not changing the foregound window.
> 
> This was causing various number of focus and mouse grab issues when
> locking screen, moving windows with their title bar, or using the
> super
> key to bring up application overview.
> 
> Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
> ---
>  dlls/winex11.drv/event.c | 14 +++++++-------
>  1 file changed, 7 insertions(+), 7 deletions(-)
> 
> diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c
> index 61dd56dcb4c..42b74b0a973 100644
> --- a/dlls/winex11.drv/event.c
> +++ b/dlls/winex11.drv/event.c
> @@ -794,9 +794,9 @@ static BOOL X11DRV_FocusIn( HWND hwnd, XEvent
> *xev )
>  /*******************************************************************
> ***
>   *              focus_out
>   */
> -static void focus_out( Display *display , HWND hwnd )
> +static void focus_out( Display *display , HWND hwnd, BOOL grabbed )
>   {
> -    HWND hwnd_tmp;
> +    HWND focus_hwnd;
>      Window focus_win;
>      int revert;
>      XIC xic;
> @@ -820,11 +820,11 @@ static void focus_out( Display *display , HWND
> hwnd )
>      XGetInputFocus( display, &focus_win, &revert );
>      if (focus_win)
>      {
> -        if (XFindContext( display, focus_win, winContext, (char
> **)&hwnd_tmp ) != 0)
> +        if (XFindContext( display, focus_win, winContext, (char
> **)&focus_hwnd ) != 0)
>              focus_win = 0;
>      }
>  
> -    if (!focus_win)
> +    if (!focus_win || (grabbed && focus_hwnd == hwnd))
>      {
>          /* Abey : 6-Oct-99. Check again if the focus out window is
> the
>             Foreground window, because in most cases the messages
> sent
> @@ -855,7 +855,7 @@ static BOOL X11DRV_FocusOut( HWND hwnd, XEvent
> *xev )
>          return TRUE;
>      }
>      if (!hwnd) return FALSE;
> -    focus_out( event->display, hwnd );
> +    focus_out( event->display, hwnd, event->mode == NotifyGrab );
>      return TRUE;
>  }
>  
> @@ -1665,12 +1665,12 @@ static void handle_xembed_protocol( HWND
> hwnd, XClientMessageEvent *event )
>  
>      case XEMBED_WINDOW_DEACTIVATE:
>          TRACE( "win %p/%lx XEMBED_WINDOW_DEACTIVATE message\n",
> hwnd, event->window );
> -        focus_out( event->display, GetAncestor( hwnd, GA_ROOT ) );
> +        focus_out( event->display, GetAncestor( hwnd, GA_ROOT ),
> FALSE );
>          break;
>  
>      case XEMBED_FOCUS_OUT:
>          TRACE( "win %p/%lx XEMBED_FOCUS_OUT message\n", hwnd, event-
> >window );
> -        focus_out( event->display, GetAncestor( hwnd, GA_ROOT ) );
> +        focus_out( event->display, GetAncestor( hwnd, GA_ROOT ),
> FALSE );
>          break;
>  
>      case XEMBED_MODALITY_ON:
-- 
Rémi Bernon <rbernon at codeweavers.com>




More information about the wine-devel mailing list