[PATCH] dix: only show the cursor if a window defines one (#58398)

Daniel Martin consume.noise at gmail.com
Thu Feb 14 23:16:10 PST 2013


On Tue, Dec 18, 2012 at 02:26:49PM +1000, Peter Hutterer wrote:
> e02f864fdf "Suppress cursor display until the first XDefineCursor() request"
> disabled cursor display a priori unless -retro is given.
> 
> On a plain server, caling XFixesHideCursor() and XFixesShowCursor() would
> show the default root cursor, despite no client actually defining a cursor.
> 
> Change the logic, disable CursorVisible by default and only enable it from
> the window's CWCursor logic. If no window ever defines a cursor, said cursor
> stays invisible.
> 
> X.Org Bug 58398 <http://bugs.freedesktop.org/show_bug.cgi?id=58398>
> 
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
>  dix/window.c    |  4 ++++
>  include/input.h |  5 +++++
>  xfixes/cursor.c | 10 ++--------
>  3 files changed, 11 insertions(+), 8 deletions(-)
> 
> diff --git a/dix/window.c b/dix/window.c
> index 99b3e0a..5dee6ef 100644
> --- a/dix/window.c
> +++ b/dix/window.c
> @@ -1431,6 +1431,8 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID *vlist, ClientPtr client)
>                      }
>                  }
>  
> +                CursorVisible = TRUE;
> +
>                  if (pWin->realized)
>                      WindowHasNewCursor(pWin);
>  
> @@ -3430,6 +3432,8 @@ ChangeWindowDeviceCursor(WindowPtr pWin, DeviceIntPtr pDev, CursorPtr pCursor)
>      }
>  
>   out:
> +    CursorVisible = TRUE;
> +
>      if (pWin->realized)
>          WindowHasNewCursor(pWin);
>  
> diff --git a/include/input.h b/include/input.h
> index 2387dbf..fb5432a 100644
> --- a/include/input.h
> +++ b/include/input.h
> @@ -635,6 +635,11 @@ extern _X_HIDDEN void valuator_set_mode(DeviceIntPtr dev, int axis, int mode);
>     xfixes/cursor.c uses it to determine if the cursor is enabled */
>  extern Bool EnableCursor;
>  
> +/* Set to FALSE by default - ChangeWindowAttributes sets it to TRUE on
> + * CWCursor, xfixes/cursor.c uses it to determine if the cursor is enabled
> + */
> +extern Bool CursorVisible;
> +
>  extern _X_EXPORT ValuatorMask *valuator_mask_new(int num_valuators);
>  extern _X_EXPORT void valuator_mask_free(ValuatorMask **mask);
>  extern _X_EXPORT void valuator_mask_set_range(ValuatorMask *mask,
> diff --git a/xfixes/cursor.c b/xfixes/cursor.c
> index ffee4d6..f24d410 100644
> --- a/xfixes/cursor.c
> +++ b/xfixes/cursor.c
> @@ -142,8 +142,7 @@ typedef struct _CursorScreen {
>  #define Unwrap(as,s,elt,backup)	(((backup) = (s)->elt), (s)->elt = (as)->elt)
>  
>  /* The cursor doesn't show up until the first XDefineCursor() */
> -static Bool CursorVisible = FALSE;
> -
> +Bool CursorVisible = FALSE;
>  Bool EnableCursor = TRUE;
>  
>  static Bool
> @@ -155,12 +154,7 @@ CursorDisplayCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
>  
>      Unwrap(cs, pScreen, DisplayCursor, backupProc);
>  
> -    /*
> -     * Have to check ConnectionInfo to distinguish client requests from
> -     * initial root window setup.  Not a great way to do it, I admit.
> -     */
> -    if (ConnectionInfo)
> -        CursorVisible = EnableCursor;
> +    CursorVisible = CursorVisible && EnableCursor;
>  
>      if (cs->pCursorHideCounts != NULL || !CursorVisible) {
>          ret = (*pScreen->DisplayCursor) (pDev, pScreen, NullCursor);
> -- 
> 1.8.0.2

Reviewed-by: Daniel Martin <consume.noise at gmail.com>


More information about the xorg-devel mailing list