[PATCH xserver 1/9] xfree86: Set xf86CrtcConfigRec cursor pointer to NULL in HideCursor

Peter Hutterer peter.hutterer at who-t.net
Mon May 16 05:17:29 UTC 2016


On Wed, May 11, 2016 at 01:54:50PM -0700, Keith Packard wrote:
> This makes the cursor pointer held by xf86Cursors.c get reset to NULL
> whenever the cursor isn't displayed, and means that the reference
> count held in xf86Cursor.c is sufficient to cover the reference in
> xf86Cursors.c.
> 
> As HideCursor may be called in the cursor loading path after
> UseHWCursor or UseHWCursorARGB when HARDWARE_CURSOR_UPDATE_UNHIDDEN
> isn't set in the Flags field, the setting of the cursor pointer had to
> be moved to the LoadCursor paths.
> 
> LoadCursorARGBCheck gets the cursor pointer, but LoadCursorImageCheck
> does not. For LoadCursorImageCheck, I added a new function,
> xf86CurrentCursor, which returns the current cursor. With this new
> function, we can eliminate the cursor pointer from the
> xf86CrtcConfigRec, once drivers are converted over to use it.
> 
> Signed-off-by: Keith Packard <keithp at keithp.com>

Acked-by: Peter Hutterer <peter.hutterer at who-t.net>

Cheers,
   Peter

> ---
>  hw/xfree86/modes/xf86Cursors.c | 17 +++++------------
>  hw/xfree86/ramdac/xf86Cursor.c |  9 +++++++++
>  hw/xfree86/ramdac/xf86Cursor.h |  1 +
>  3 files changed, 15 insertions(+), 12 deletions(-)
> 
> diff --git a/hw/xfree86/modes/xf86Cursors.c b/hw/xfree86/modes/xf86Cursors.c
> index 5df1ab7..b737268 100644
> --- a/hw/xfree86/modes/xf86Cursors.c
> +++ b/hw/xfree86/modes/xf86Cursors.c
> @@ -287,7 +287,7 @@ xf86_set_cursor_colors(ScrnInfoPtr scrn, int bg, int fg)
>  {
>      ScreenPtr screen = scrn->pScreen;
>      xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
> -    CursorPtr cursor = xf86_config->cursor;
> +    CursorPtr cursor = xf86CurrentCursor(screen);
>      int c;
>      CARD8 *bits = cursor ?
>          dixLookupScreenPrivate(&cursor->devPrivates, CursorScreenKey, screen)
> @@ -456,6 +456,7 @@ xf86_crtc_load_cursor_image(xf86CrtcPtr crtc, CARD8 *src)
>      CARD8 *cursor_image;
>      const Rotation rotation = xf86_crtc_cursor_rotation(crtc);
>  
> +    xf86_config->cursor = xf86CurrentCursor(xf86ScrnToScreen(scrn));
>      crtc->cursor_argb = FALSE;
>  
>      if (rotation == RR_Rotate_0)
> @@ -517,11 +518,6 @@ xf86_use_hw_cursor(ScreenPtr screen, CursorPtr cursor)
>      xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
>      int c;
>  
> -    cursor = RefCursor(cursor);
> -    if (xf86_config->cursor)
> -        FreeCursor(xf86_config->cursor, None);
> -    xf86_config->cursor = cursor;
> -
>      if (cursor->bits->width > cursor_info->MaxWidth ||
>          cursor->bits->height > cursor_info->MaxHeight)
>          return FALSE;
> @@ -593,6 +589,7 @@ xf86_load_cursor_argb(ScrnInfoPtr scrn, CursorPtr cursor)
>      xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
>      int c;
>  
> +    xf86_config->cursor = cursor;
>      for (c = 0; c < xf86_config->num_crtc; c++) {
>          xf86CrtcPtr crtc = xf86_config->crtc[c];
>  
> @@ -638,7 +635,6 @@ xf86_cursors_init(ScreenPtr screen, int max_width, int max_height, int flags)
>          cursor_info->LoadCursorARGBCheck = xf86_load_cursor_argb;
>      }
>  
> -    xf86_config->cursor = NULL;
>      xf86_hide_cursors(scrn);
>  
>      return xf86InitCursor(screen, cursor_info);
> @@ -681,7 +677,7 @@ xf86_reload_cursors(ScreenPtr screen)
>      if (!cursor_info)
>          return;
>  
> -    cursor = xf86_config->cursor;
> +    cursor = xf86CurrentCursor(screen);
>      GetSpritePosition(inputInfo.pointer, &x, &y);
>      if (!(cursor_info->Flags & HARDWARE_CURSOR_UPDATE_UNHIDDEN))
>          (*cursor_info->HideCursor) (scrn);
> @@ -716,8 +712,5 @@ xf86_cursors_fini(ScreenPtr screen)
>      }
>      free(xf86_config->cursor_image);
>      xf86_config->cursor_image = NULL;
> -    if (xf86_config->cursor) {
> -        FreeCursor(xf86_config->cursor, None);
> -        xf86_config->cursor = NULL;
> -    }
> +    xf86_config->cursor = NULL;
>  }
> diff --git a/hw/xfree86/ramdac/xf86Cursor.c b/hw/xfree86/ramdac/xf86Cursor.c
> index c061b80..dda4349 100644
> --- a/hw/xfree86/ramdac/xf86Cursor.c
> +++ b/hw/xfree86/ramdac/xf86Cursor.c
> @@ -462,6 +462,15 @@ xf86ForceHWCursor(ScreenPtr pScreen, Bool on)
>      }
>  }
>  
> +CursorPtr
> +xf86CurrentCursor(ScreenPtr pScreen)
> +{
> +    xf86CursorScreenPtr ScreenPriv =
> +        (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
> +                                               xf86CursorScreenKey);
> +    return ScreenPriv->CurrentCursor;
> +}
> +
>  xf86CursorInfoPtr
>  xf86CreateCursorInfoRec(void)
>  {
> diff --git a/hw/xfree86/ramdac/xf86Cursor.h b/hw/xfree86/ramdac/xf86Cursor.h
> index 6e88240..320ec0c 100644
> --- a/hw/xfree86/ramdac/xf86Cursor.h
> +++ b/hw/xfree86/ramdac/xf86Cursor.h
> @@ -61,6 +61,7 @@ extern _X_EXPORT xf86CursorInfoPtr xf86CreateCursorInfoRec(void);
>  extern _X_EXPORT void xf86DestroyCursorInfoRec(xf86CursorInfoPtr);
>  extern _X_EXPORT void xf86CursorResetCursor(ScreenPtr pScreen);
>  extern _X_EXPORT void xf86ForceHWCursor(ScreenPtr pScreen, Bool on);
> +extern _X_EXPORT CursorPtr xf86CurrentCursor(ScreenPtr pScreen);
>  
>  #define HARDWARE_CURSOR_INVERT_MASK 			0x00000001
>  #define HARDWARE_CURSOR_AND_SOURCE_WITH_MASK		0x00000002
> -- 
> 2.8.0.rc3
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: https://lists.x.org/mailman/listinfo/xorg-devel
> 


More information about the xorg-devel mailing list