xserver: Branch 'master'

Keith Packard keithp at kemper.freedesktop.org
Thu May 26 16:17:20 UTC 2016


 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(-)

New commits:
commit f5670b4a7eb3b43fa20017f89192394930eae6f4
Author: Keith Packard <keithp at keithp.com>
Date:   Wed Mar 9 11:13:14 2016 -0800

    xfree86: Set xf86CrtcConfigRec cursor pointer to NULL in HideCursor
    
    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>

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


More information about the xorg-commit mailing list