diff options
author | Michael Thayer <michael.thayer@oracle.com> | 2014-04-24 10:32:17 +0200 |
---|---|---|
committer | Alan Coopersmith <alan.coopersmith@oracle.com> | 2014-05-20 21:11:22 -0700 |
commit | e83991474e9964917ea6ece5ad21d1bf56481dfa (patch) | |
tree | 4fe6cf994af9a4ef804dc6a95fd2e6d2a11dbb08 | |
parent | 7a1fb986cc5ace474b6f040179bd130d4ba6f78f (diff) | |
download | xorg-driver-xf86-input-mouse-e83991474e9964917ea6ece5ad21d1bf56481dfa.tar.gz |
Make absolute input reporting in Solaris aware of resolution changes
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@oracle.com>
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
-rw-r--r-- | src/sun_mouse.c | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/src/sun_mouse.c b/src/sun_mouse.c index 16434e6..b092374 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> @@ -405,14 +406,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)); @@ -457,6 +455,24 @@ static void vuidMouseAdjustFrame(ADJUST_FRAME_ARGS_DECL) } } } + +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 */ @@ -492,8 +508,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; } |