xkb: use GPE for XKB fake motion events.
Section 4.6.1 of the XKB spec says that "the initial event always moves the cursor the distance specified in the action [...]", so skip the POINTER_ACCELERATE flag for GPE, it would cause double-acceleration. Potential regression - GPE expects the coordinates to be either relative or both. XKB in theory allows for x to be relative and y to be absolute (or vice versa). Let's pretend that scenario has no users. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Simon Thum <simon.thum@gmx.de> Reviewed-by: Daniel Stone <daniel@fooishbar.org>
This commit is contained in:
parent
6c42c8c356
commit
f4106c0231
|
@ -769,6 +769,7 @@ extern _X_EXPORT void XkbDDXUpdateDeviceIndicators(
|
|||
);
|
||||
|
||||
extern _X_EXPORT void XkbDDXFakePointerMotion(
|
||||
DeviceIntPtr /* dev */,
|
||||
unsigned int /* flags */,
|
||||
int /* x */,
|
||||
int /* y */
|
||||
|
|
102
xkb/ddxFakeMtn.c
102
xkb/ddxFakeMtn.c
|
@ -28,91 +28,37 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|||
#include <dix-config.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <X11/X.h>
|
||||
#include <X11/Xproto.h>
|
||||
#include <X11/keysym.h>
|
||||
#include "inputstr.h"
|
||||
#include "scrnintstr.h"
|
||||
#include "windowstr.h"
|
||||
#include <xkbsrv.h>
|
||||
#include <X11/extensions/XI.h>
|
||||
|
||||
#ifdef PANORAMIX
|
||||
#include "panoramiX.h"
|
||||
#include "panoramiXsrv.h"
|
||||
#endif
|
||||
|
||||
#include "mipointer.h"
|
||||
#include "mipointrst.h"
|
||||
#include "mi.h"
|
||||
|
||||
void
|
||||
XkbDDXFakePointerMotion(unsigned flags,int x,int y)
|
||||
XkbDDXFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y)
|
||||
{
|
||||
int oldX,oldY;
|
||||
ScreenPtr pScreen, oldScreen;
|
||||
EventListPtr events;
|
||||
int nevents, i;
|
||||
DeviceIntPtr ptr;
|
||||
int gpe_flags = 0;
|
||||
|
||||
GetSpritePosition(inputInfo.pointer, &oldX, &oldY);
|
||||
pScreen = oldScreen = GetSpriteWindow(inputInfo.pointer)->drawable.pScreen;
|
||||
|
||||
#ifdef PANORAMIX
|
||||
if (!noPanoramiXExtension) {
|
||||
BoxRec box;
|
||||
int i;
|
||||
|
||||
if(!POINT_IN_REGION(pScreen, &XineramaScreenRegions[pScreen->myNum],
|
||||
oldX, oldY, &box)) {
|
||||
FOR_NSCREENS(i) {
|
||||
if(i == pScreen->myNum)
|
||||
continue;
|
||||
if(POINT_IN_REGION(pScreen, &XineramaScreenRegions[i],
|
||||
oldX, oldY, &box)) {
|
||||
pScreen = screenInfo.screens[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
oldScreen = pScreen;
|
||||
|
||||
if (flags&XkbSA_MoveAbsoluteX)
|
||||
oldX= x;
|
||||
else oldX+= x;
|
||||
if (flags&XkbSA_MoveAbsoluteY)
|
||||
oldY= y;
|
||||
else oldY+= y;
|
||||
|
||||
if(!POINT_IN_REGION(pScreen, &XineramaScreenRegions[pScreen->myNum],
|
||||
oldX, oldY, &box)) {
|
||||
FOR_NSCREENS(i) {
|
||||
if(i == pScreen->myNum)
|
||||
continue;
|
||||
if(POINT_IN_REGION(pScreen, &XineramaScreenRegions[i],
|
||||
oldX, oldY, &box)) {
|
||||
pScreen = screenInfo.screens[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
oldX -= panoramiXdataPtr[pScreen->myNum].x;
|
||||
oldY -= panoramiXdataPtr[pScreen->myNum].y;
|
||||
}
|
||||
if (!dev->u.master)
|
||||
ptr = dev;
|
||||
else
|
||||
#endif
|
||||
{
|
||||
if (flags&XkbSA_MoveAbsoluteX)
|
||||
oldX= x;
|
||||
else oldX+= x;
|
||||
if (flags&XkbSA_MoveAbsoluteY)
|
||||
oldY= y;
|
||||
else oldY+= y;
|
||||
ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER));
|
||||
|
||||
#define GetScreenPrivate(s) ((miPointerScreenPtr)dixLookupPrivate(&(s)->devPrivates, miPointerScreenKey))
|
||||
(*(GetScreenPrivate(oldScreen))->screenFuncs->CursorOffScreen)
|
||||
(&pScreen, &oldX, &oldY);
|
||||
}
|
||||
if (flags & XkbSA_MoveAbsoluteX || flags & XkbSA_MoveAbsoluteY)
|
||||
gpe_flags = POINTER_ABSOLUTE;
|
||||
else
|
||||
gpe_flags = POINTER_RELATIVE;
|
||||
|
||||
if (pScreen != oldScreen)
|
||||
NewCurrentScreen(inputInfo.pointer, pScreen, oldX, oldY);
|
||||
if (pScreen->SetCursorPosition)
|
||||
(*pScreen->SetCursorPosition)(inputInfo.pointer, pScreen, oldX, oldY, TRUE);
|
||||
events = InitEventList(GetMaximumEventsNum());
|
||||
OsBlockSignals();
|
||||
nevents = GetPointerEvents(events, ptr,
|
||||
MotionNotify, 0,
|
||||
gpe_flags, 0, 2, (int[]){x, y});
|
||||
OsReleaseSignals();
|
||||
|
||||
for (i = 0; i < nevents; i++)
|
||||
mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL);
|
||||
|
||||
FreeEventList(events, GetMaximumEventsNum());
|
||||
}
|
||||
|
|
|
@ -479,7 +479,7 @@ int dx,dy;
|
|||
dx= xkbi->mouseKeysDX;
|
||||
dy= xkbi->mouseKeysDY;
|
||||
}
|
||||
XkbDDXFakePointerMotion(xkbi->mouseKeysFlags,dx,dy);
|
||||
XkbDDXFakePointerMotion(xkbi->device, xkbi->mouseKeysFlags,dx,dy);
|
||||
return xkbi->desc->ctrls->mk_interval;
|
||||
}
|
||||
|
||||
|
@ -507,7 +507,7 @@ Bool accel;
|
|||
accel= ((pAction->ptr.flags&XkbSA_NoAcceleration)==0);
|
||||
x= XkbPtrActionX(&pAction->ptr);
|
||||
y= XkbPtrActionY(&pAction->ptr);
|
||||
XkbDDXFakePointerMotion(pAction->ptr.flags,x,y);
|
||||
XkbDDXFakePointerMotion(xkbi->device, pAction->ptr.flags,x,y);
|
||||
AccessXCancelRepeatKey(xkbi,keycode);
|
||||
xkbi->mouseKeysAccel= accel&&
|
||||
(xkbi->desc->ctrls->enabled_ctrls&XkbMouseKeysAccelMask);
|
||||
|
|
Loading…
Reference in New Issue
Block a user