diff --git a/src/cocoa_window.m b/src/cocoa_window.m index 9c018eb8b..dae934ddf 100644 --- a/src/cocoa_window.m +++ b/src/cocoa_window.m @@ -1552,6 +1552,10 @@ void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity) [window->ns.object setAlphaValue:opacity]; } +void _glfwPlatformSetWindowUseRawInput(_GLFWwindow* window, GLFWbool enabled) +{ +} + void _glfwPlatformPollEvents(void) { if (!initializeAppKit()) diff --git a/src/internal.h b/src/internal.h index 7be2b267c..8cc47a354 100644 --- a/src/internal.h +++ b/src/internal.h @@ -390,6 +390,7 @@ struct _GLFWwindow char keys[GLFW_KEY_LAST + 1]; // Virtual cursor position when cursor is disabled double virtualCursorPosX, virtualCursorPosY; + GLFWbool useRawInput; _GLFWcontext context; @@ -666,6 +667,7 @@ void _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled); void _glfwPlatformSetWindowDecorated(_GLFWwindow* window, GLFWbool enabled); void _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled); void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity); +void _glfwPlatformSetWindowUseRawInput(_GLFWwindow* window, GLFWbool enabled); void _glfwPlatformPollEvents(void); void _glfwPlatformWaitEvents(void); diff --git a/src/null_window.c b/src/null_window.c index 6a54cfe56..7cc7f199d 100644 --- a/src/null_window.c +++ b/src/null_window.c @@ -196,6 +196,10 @@ void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity) { } +void _glfwPlatformSetWindowUseRawInput(_GLFWwindow* window, GLFWbool enabled) +{ +} + void _glfwPlatformShowWindow(_GLFWwindow* window) { } diff --git a/src/win32_window.c b/src/win32_window.c index 796ae150e..9571c0682 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -1843,6 +1843,11 @@ void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity) } } +void _glfwPlatformSetWindowUseRawInput(_GLFWwindow* window, GLFWbool enabled) +{ + // TODO +} + void _glfwPlatformPollEvents(void) { MSG msg; diff --git a/src/window.c b/src/window.c index 4e365cb47..ecd9d7117 100644 --- a/src/window.c +++ b/src/window.c @@ -203,6 +203,7 @@ GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, window->floating = wndconfig.floating; window->focusOnShow = wndconfig.focusOnShow; window->cursorMode = GLFW_CURSOR_NORMAL; + window->useRawInput = GLFW_TRUE; window->minwidth = GLFW_DONT_CARE; window->minheight = GLFW_DONT_CARE; @@ -970,6 +971,23 @@ GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* handle) return window->userPointer; } +GLFWAPI int glfwGetWindowUseRawInput(GLFWwindow* handle) +{ + _GLFWwindow* window = (_GLFWwindow*) handle; + assert(window != NULL); + + return window->useRawInput; +} + +GLFWAPI void glfwSetWindowUseRawInput(GLFWwindow* handle, + int value) +{ + _GLFWwindow* window = (_GLFWwindow*) handle; + assert(window != NULL); + + _glfwPlatformSetWindowUseRawInput(window, value ? GLFW_TRUE : GLFW_FALSE); +} + GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* handle, GLFWwindowposfun cbfun) { @@ -1110,4 +1128,3 @@ GLFWAPI void glfwPostEmptyEvent(void) _glfwPlatformPostEmptyEvent(); } - diff --git a/src/wl_window.c b/src/wl_window.c index 98a646590..b5303bc11 100644 --- a/src/wl_window.c +++ b/src/wl_window.c @@ -1304,6 +1304,10 @@ void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity) { } +void _glfwPlatformSetWindowUseRawInput(_GLFWwindow* window, GLFWbool enabled) +{ +} + void _glfwPlatformPollEvents(void) { handleEvents(0); diff --git a/src/x11_window.c b/src/x11_window.c index 5e9161072..375a4dbf3 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -26,6 +26,7 @@ //======================================================================== #include "internal.h" +#include "x11_platform.h" #include #include @@ -535,7 +536,7 @@ static void updateCursorImage(_GLFWwindow* window) // static void disableCursor(_GLFWwindow* window) { - if (_glfw.x11.xi.available) + if (_glfw.x11.xi.available && window->useRawInput) { XIEventMask em; unsigned char mask[XIMaskLen(XI_RawMotion)] = { 0 }; @@ -566,7 +567,7 @@ static void disableCursor(_GLFWwindow* window) // static void enableCursor(_GLFWwindow* window) { - if (_glfw.x11.xi.available) + if (_glfw.x11.xi.available && window->useRawInput) { XIEventMask em; unsigned char mask[] = { 0 }; @@ -1192,6 +1193,7 @@ static void processEvent(XEvent *event) _GLFWwindow* window = _glfw.x11.disabledCursorWindow; if (window && + window->useRawInput && event->xcookie.extension == _glfw.x11.xi.majorOpcode && XGetEventData(_glfw.x11.display, &event->xcookie) && event->xcookie.evtype == XI_RawMotion) @@ -1492,7 +1494,7 @@ static void processEvent(XEvent *event) { if (_glfw.x11.disabledCursorWindow != window) return; - if (_glfw.x11.xi.available) + if (_glfw.x11.xi.available && window->useRawInput) return; const int dx = x - window->x11.lastCursorPosX; @@ -2652,6 +2654,19 @@ void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity) PropModeReplace, (unsigned char*) &value, 1); } +void _glfwPlatformSetWindowUseRawInput(_GLFWwindow* window, GLFWbool enabled) +{ + if (window->useRawInput != enabled) + { + int update = (_glfw.x11.disabledCursorWindow == window && _glfw.x11.xi.available); + if (update) + enableCursor(window); + window->useRawInput = enabled; + if (update) + disableCursor(window); + } +} + void _glfwPlatformPollEvents(void) { _GLFWwindow* window;