[PATCH xf86-input-mouse] Make absolute input reporting in Solaris aware of resolution changes

Michael Thayer michael.thayer at oracle.com
Thu Apr 10 11:21:17 PDT 2014


Currently on Solaris absolute input reporting only takes resolution changes
into account when the video driver is using the pre-RandR 1.2 APIs, and
there it uses the physical resolution, not the virtual.  This patch fixes
those two things.

Signed-off-by: Michael Thayer <michael.thayer at oracle.com>
---
 src/sun_mouse.c |   42 +++++++++++++++++++++++++++++++++---------
 1 file changed, 33 insertions(+), 9 deletions(-)

diff --git a/src/sun_mouse.c b/src/sun_mouse.c
index ad38ba4..9ffd590 100644
--- a/src/sun_mouse.c
+++ b/src/sun_mouse.c
@@ -57,6 +57,7 @@
 #include "mouse.h"
 #include "xisb.h"
 #include "mipointer.h"
+#include "xf86Crtc.h"
 #include <sys/stropts.h>
 #include <sys/vuid_event.h>
 #include <sys/msio.h>
@@ -401,14 +402,11 @@ static void vuidMouseSendScreenSize(ScreenPtr pScreen, VuidMsePtr pVuidMse)
     ScrnInfoPtr pScr = XF86SCRNINFO(pScreen);
     int result;
 
-    if (!pScr->currentMode)
-	return;
-
-    if ((pVuidMse->absres.width != pScr->currentMode->HDisplay) || 
-	(pVuidMse->absres.height != pScr->currentMode->VDisplay))
+    if ((pVuidMse->absres.width != pScr->virtualX) || 
+	(pVuidMse->absres.height != pScr->virtualY))
     {
-	pVuidMse->absres.width = pScr->currentMode->HDisplay;
-	pVuidMse->absres.height = pScr->currentMode->VDisplay;
+	pVuidMse->absres.width = pScr->virtualX;
+	pVuidMse->absres.height = pScr->virtualY;
 
 	do {
 	    result = ioctl(pInfo->fd, MSIOSRESOLUTION, &(pVuidMse->absres));
@@ -452,6 +450,24 @@ static void vuidMouseAdjustFrame(int index, int x, int y, int flags)
 	  }
       }
 }
+
+static void vuidMouseCrtcNotify(ScreenPtr pScreen)
+{
+      xf86_crtc_notify_proc_ptr wrappedCrtcNotify
+	  = (xf86_crtc_notify_proc_ptr) vuidMouseGetScreenPrivate(pScreen);
+      VuidMsePtr	m;
+      ScreenPtr 	ptrCurScreen;
+
+      if(wrappedCrtcNotify)
+	 wrappedCrtcNotify(pScreen);
+
+      for (m = vuidMouseList; m != NULL ; m = m->next) {
+	  ptrCurScreen = miPointerGetScreen(m->pInfo->dev);
+	  if (ptrCurScreen == pScreen) {
+	      vuidMouseSendScreenSize(pScreen, m);
+	  }
+      }
+}
 #endif /* HAVE_ABSOLUTE_MOUSE_SCALING */
 
 
@@ -487,8 +503,16 @@ vuidMouseProc(DeviceIntPtr pPointer, int what)
 		for (i = 0; i < screenInfo.numScreens; i++) {
 		    ScreenPtr pScreen = screenInfo.screens[i];
 		    ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
-		    vuidMouseSetScreenPrivate(pScreen, pScrn->AdjustFrame);
-		    pScrn->AdjustFrame = vuidMouseAdjustFrame;
+		    if (xf86CrtcConfigPrivateIndex != -1) {
+			xf86_crtc_notify_proc_ptr pCrtcNotify
+			    = xf86_wrap_crtc_notify(pScreen,
+						    vuidMouseCrtcNotify);
+			vuidMouseSetScreenPrivate(pScreen, pCrtcNotify);
+		    } else {
+			vuidMouseSetScreenPrivate(pScreen,
+						  pScrn->AdjustFrame);
+			pScrn->AdjustFrame = vuidMouseAdjustFrame;
+		    }
 		}
 	    vuidMouseGeneration = serverGeneration;
 	}
-- 
ORACLE Deutschland B.V. & Co. KG   Michael Thayer
Werkstrasse 24                     VirtualBox engineering
71384 Weinstadt, Germany           mailto:michael.thayer at oracle.com

Hauptverwaltung: Riesstr. 25, D-80992 München
Registergericht: Amtsgericht München, HRA 95603

Geschäftsführer: Jürgen Kunz 
Komplementärin: ORACLE Deutschland Verwaltung B.V.
Hertogswetering 163/167, 3543 AS Utrecht, Niederlande
Handelsregister der Handelskammer Midden-Niederlande, Nr. 30143697
Geschäftsführer: Alexander van der Ven, Astrid Kepper, Val Maher



More information about the xorg-devel mailing list