[Bf-blender-cvs] [7065022] master: Fix T48901: Blender ignores xinput cursor matrix

Campbell Barton noreply at git.blender.org
Mon Aug 1 05:49:40 CEST 2016


Commit: 7065022f7aa23ba13d2999e1e40162a8f480af0e
Author: Campbell Barton
Date:   Mon Aug 1 13:40:59 2016 +1000
Branches: master
https://developer.blender.org/rB7065022f7aa23ba13d2999e1e40162a8f480af0e

Fix T48901: Blender ignores xinput cursor matrix

===================================================================

M	intern/ghost/intern/GHOST_SystemX11.cpp
M	intern/ghost/intern/GHOST_WindowX11.cpp

===================================================================

diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp
index 6f34954..727bc9a 100644
--- a/intern/ghost/intern/GHOST_SystemX11.cpp
+++ b/intern/ghost/intern/GHOST_SystemX11.cpp
@@ -61,6 +61,11 @@
 #include <X11/XF86keysym.h>
 #endif
 
+/* for XIWarpPointer */
+#ifdef WITH_X11_XINPUT
+#  include <X11/extensions/XInput2.h>
+#endif
+
 /* For timing */
 #include <sys/time.h>
 #include <unistd.h>
@@ -1469,7 +1474,22 @@ setCursorPosition(
 	int relx = x - cx;
 	int rely = y - cy;
 
-	XWarpPointer(m_display, None, None, 0, 0, 0, 0, relx, rely);
+#ifdef WITH_X11_XINPUT
+	if ((m_xinput_version.present) &&
+	    (m_xinput_version.major_version >= 2))
+	{
+		/* Needed to account for XInput "Coordinate Transformation Matrix", see T48901 */
+		int device_id;
+		if (XIGetClientPointer(m_display, None, &device_id) != False) {
+			XIWarpPointer(m_display, device_id, None, None, 0, 0, 0, 0, relx, rely);
+		}
+	}
+	else
+#endif
+	{
+		XWarpPointer(m_display, None, None, 0, 0, 0, 0, relx, rely);
+	}
+
 	XSync(m_display, 0); /* Sync to process all requests */
 	
 	return GHOST_kSuccess;
diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp
index fd002ce..ec2b65e 100644
--- a/intern/ghost/intern/GHOST_WindowX11.cpp
+++ b/intern/ghost/intern/GHOST_WindowX11.cpp
@@ -51,6 +51,11 @@
 #  include "GHOST_ContextGLX.h"
 #endif
 
+/* for XIWarpPointer */
+#ifdef WITH_X11_XINPUT
+#  include <X11/extensions/XInput2.h>
+#endif
+
 #if defined(__sun__) || defined(__sun) || defined(__sparc) || defined(__sparc__) || defined(_AIX)
 #  include <strings.h>
 #endif
@@ -1520,7 +1525,21 @@ setWindowCursorGrab(
 			/* use to generate a mouse move event, otherwise the last event
 			 * blender gets can be outside the screen causing menus not to show
 			 * properly unless the user moves the mouse */
-			XWarpPointer(m_display, None, None, 0, 0, 0, 0, 0, 0);
+
+#ifdef WITH_X11_XINPUT
+			if ((m_system->m_xinput_version.present) &&
+			    (m_system->m_xinput_version.major_version >= 2))
+			{
+				int device_id;
+				if (XIGetClientPointer(m_display, None, &device_id) != False) {
+					XIWarpPointer(m_display, device_id, None, None, 0, 0, 0, 0, 0, 0);
+				}
+			}
+			else
+#endif
+			{
+				XWarpPointer(m_display, None, None, 0, 0, 0, 0, 0, 0);
+			}
 		}
 
 		/* Almost works without but important otherwise the mouse GHOST location can be incorrect on exit */




More information about the Bf-blender-cvs mailing list