[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