From 9b6c14b7aee95888c2901c4ad32fff111e62c601 Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Sun, 22 Jun 2014 13:13:53 +0200 Subject: [PATCH] Unified X11 cursor creation. --- src/x11_init.c | 65 +++++++++++++++++++++++++--------------------- src/x11_platform.h | 2 ++ src/x11_window.c | 24 +---------------- 3 files changed, 39 insertions(+), 52 deletions(-) diff --git a/src/x11_init.c b/src/x11_init.c index b891f63a..53e8b350 100644 --- a/src/x11_init.c +++ b/src/x11_init.c @@ -576,40 +576,16 @@ static GLboolean initExtensions(void) return GL_TRUE; } -// Create a blank cursor (for locked mouse mode) +// Create a blank cursor for hidden and disabled cursor modes // static Cursor createNULLCursor(void) { - Pixmap cursormask; - XGCValues xgc; - GC gc; - XColor col; - Cursor cursor; + unsigned char pixels[16 * 16 * 4]; + GLFWimage image = { 16, 16, pixels }; - _glfwGrabXErrorHandler(); + memset(pixels, 0, sizeof(pixels)); - cursormask = XCreatePixmap(_glfw.x11.display, _glfw.x11.root, 1, 1, 1); - xgc.function = GXclear; - gc = XCreateGC(_glfw.x11.display, cursormask, GCFunction, &xgc); - XFillRectangle(_glfw.x11.display, cursormask, gc, 0, 0, 1, 1); - col.pixel = 0; - col.red = 0; - col.flags = 4; - cursor = XCreatePixmapCursor(_glfw.x11.display, - cursormask, cursormask, - &col, &col, 0, 0); - XFreePixmap(_glfw.x11.display, cursormask); - XFreeGC(_glfw.x11.display, gc); - - _glfwReleaseXErrorHandler(); - - if (cursor == None) - { - _glfwInputXError(GLFW_PLATFORM_ERROR, - "X11: Failed to create null cursor"); - } - - return cursor; + return _glfwCreateCursor(&image, 0, 0); } // Terminate X11 display @@ -664,6 +640,37 @@ void _glfwInputXError(int error, const char* message) _glfwInputError(error, "%s: %s", message, buffer); } +// Create a cursor object +// +Cursor _glfwCreateCursor(const GLFWimage* image, int xhot, int yhot) +{ + int i; + Cursor cursor; + + XcursorImage* native = XcursorImageCreate(image->width, image->height); + if (native == NULL) + return None; + + native->xhot = xhot; + native->yhot = yhot; + + unsigned char* source = (unsigned char*) image->pixels; + XcursorPixel* target = native->pixels; + + for (i = 0; i < image->width * image->height; i++, target++, source += 4) + { + *target = (source[3] << 24) | + (source[0] << 16) | + (source[1] << 8) | + source[2]; + } + + cursor = XcursorImageLoadCursor(_glfw.x11.display, native); + XcursorImageDestroy(native); + + return cursor; +} + ////////////////////////////////////////////////////////////////////////// ////// GLFW platform API ////// diff --git a/src/x11_platform.h b/src/x11_platform.h index 103e7679..7109d900 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -256,6 +256,8 @@ void _glfwHandleSelectionClear(XEvent* event); void _glfwHandleSelectionRequest(XEvent* event); void _glfwPushSelectionToManager(_GLFWwindow* window); +Cursor _glfwCreateCursor(const GLFWimage* image, int xhot, int yhot); + // Window support _GLFWwindow* _glfwFindWindowByHandle(Window handle); unsigned long _glfwGetWindowProperty(Window window, diff --git a/src/x11_window.c b/src/x11_window.c index 6cb38e8b..0c41303f 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -1454,29 +1454,7 @@ int _glfwPlatformCreateCursor(_GLFWcursor* cursor, const GLFWimage* image, int xhot, int yhot) { - int i; - - XcursorImage* native = XcursorImageCreate(image->width, image->height); - if (native == NULL) - return GL_FALSE; - - native->xhot = xhot; - native->yhot = yhot; - - unsigned char* source = (unsigned char*) image->pixels; - XcursorPixel* target = native->pixels; - - for (i = 0; i < image->width * image->height; i++, target++, source += 4) - { - *target = (source[3] << 24) | - (source[0] << 16) | - (source[1] << 8) | - source[2]; - } - - cursor->x11.handle = XcursorImageLoadCursor(_glfw.x11.display, native); - XcursorImageDestroy(native); - + cursor->x11.handle = _glfwCreateCursor(image, xhot, yhot); if (cursor->x11.handle == None) return GL_FALSE;