Xext: if a root window is given in XTestFakeInput, move to that
For absolute events, if the client specifies a screen number offset the coordinates by that. And add a new flag so we know when _not_ to add the screen offset in GPE. Without this offset and the flag, GPE would simply add the offset of the current screen if POINTER_SCREEN is set. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
9fd6cb8953
commit
8571c648a7
10
Xext/xtest.c
10
Xext/xtest.c
|
@ -305,7 +305,7 @@ ProcXTestFakeInput(ClientPtr client)
|
||||||
numValuators = 2;
|
numValuators = 2;
|
||||||
firstValuator = 0;
|
firstValuator = 0;
|
||||||
if (ev->u.u.detail == xFalse)
|
if (ev->u.u.detail == xFalse)
|
||||||
flags = POINTER_ABSOLUTE | POINTER_SCREEN;
|
flags = POINTER_ABSOLUTE | POINTER_DESKTOP;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
client->errorValue = ev->u.u.type;
|
client->errorValue = ev->u.u.type;
|
||||||
|
@ -376,6 +376,14 @@ ProcXTestFakeInput(ClientPtr client)
|
||||||
client->errorValue = ev->u.keyButtonPointer.root;
|
client->errorValue = ev->u.keyButtonPointer.root;
|
||||||
return BadValue;
|
return BadValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add the root window's offset to the valuators */
|
||||||
|
if ((flags & POINTER_ABSOLUTE) && firstValuator <= 1 && numValuators > 0) {
|
||||||
|
if (firstValuator == 0)
|
||||||
|
valuators[0] += root->drawable.pScreen->x;
|
||||||
|
if (firstValuator < 2 && firstValuator + numValuators > 1)
|
||||||
|
valuators[1 - firstValuator] += root->drawable.pScreen->y;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (ev->u.u.detail != xTrue && ev->u.u.detail != xFalse) {
|
if (ev->u.u.detail != xTrue && ev->u.u.detail != xFalse) {
|
||||||
client->errorValue = ev->u.u.detail;
|
client->errorValue = ev->u.u.detail;
|
||||||
|
|
|
@ -820,24 +820,30 @@ accelPointer(DeviceIntPtr dev, ValuatorMask *valuators, CARD32 ms)
|
||||||
* device's coordinate range.
|
* device's coordinate range.
|
||||||
*
|
*
|
||||||
* @param dev The device to scale for.
|
* @param dev The device to scale for.
|
||||||
* @param[in, out] mask The mask in desktop coordinates, modified in place
|
* @param[in, out] mask The mask in desktop/screen coordinates, modified in place
|
||||||
* to contain device coordinate range.
|
* to contain device coordinate range.
|
||||||
|
* @param flags If POINTER_SCREEN is set, mask is in per-screen coordinates.
|
||||||
|
* Otherwise, mask is in desktop coords.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
scale_from_screen(DeviceIntPtr dev, ValuatorMask *mask)
|
scale_from_screen(DeviceIntPtr dev, ValuatorMask *mask, int flags)
|
||||||
{
|
{
|
||||||
double scaled;
|
double scaled;
|
||||||
ScreenPtr scr = miPointerGetScreen(dev);
|
ScreenPtr scr = miPointerGetScreen(dev);
|
||||||
|
|
||||||
if (valuator_mask_isset(mask, 0)) {
|
if (valuator_mask_isset(mask, 0)) {
|
||||||
scaled = valuator_mask_get_double(mask, 0) + scr->x;
|
scaled = valuator_mask_get_double(mask, 0);
|
||||||
|
if (flags & POINTER_SCREEN)
|
||||||
|
scaled += scr->x;
|
||||||
scaled = rescaleValuatorAxis(scaled,
|
scaled = rescaleValuatorAxis(scaled,
|
||||||
NULL, dev->valuator->axes + 0,
|
NULL, dev->valuator->axes + 0,
|
||||||
screenInfo.x, screenInfo.width);
|
screenInfo.x, screenInfo.width);
|
||||||
valuator_mask_set_double(mask, 0, scaled);
|
valuator_mask_set_double(mask, 0, scaled);
|
||||||
}
|
}
|
||||||
if (valuator_mask_isset(mask, 1)) {
|
if (valuator_mask_isset(mask, 1)) {
|
||||||
scaled = valuator_mask_get_double(mask, 1) + scr->y;
|
scaled = valuator_mask_get_double(mask, 1);
|
||||||
|
if (flags & POINTER_SCREEN)
|
||||||
|
scaled += scr->y;
|
||||||
scaled = rescaleValuatorAxis(scaled,
|
scaled = rescaleValuatorAxis(scaled,
|
||||||
NULL, dev->valuator->axes + 1,
|
NULL, dev->valuator->axes + 1,
|
||||||
screenInfo.y, screenInfo.height);
|
screenInfo.y, screenInfo.height);
|
||||||
|
@ -1363,10 +1369,10 @@ fill_pointer_events(InternalEvent *events, DeviceIntPtr pDev, int type,
|
||||||
/* valuators are in driver-native format (rel or abs) */
|
/* valuators are in driver-native format (rel or abs) */
|
||||||
|
|
||||||
if (flags & POINTER_ABSOLUTE) {
|
if (flags & POINTER_ABSOLUTE) {
|
||||||
if (flags & POINTER_SCREEN) { /* valuators are in screen coords */
|
if (flags & (POINTER_SCREEN | POINTER_DESKTOP)) { /* valuators are in screen/desktop coords */
|
||||||
sx = valuator_mask_get(&mask, 0);
|
sx = valuator_mask_get(&mask, 0);
|
||||||
sy = valuator_mask_get(&mask, 1);
|
sy = valuator_mask_get(&mask, 1);
|
||||||
scale_from_screen(pDev, &mask);
|
scale_from_screen(pDev, &mask, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
transformAbsolute(pDev, &mask);
|
transformAbsolute(pDev, &mask);
|
||||||
|
|
|
@ -69,6 +69,7 @@ SOFTWARE.
|
||||||
#define POINTER_SCREEN (1 << 4) /* Data in screen coordinates */
|
#define POINTER_SCREEN (1 << 4) /* Data in screen coordinates */
|
||||||
#define POINTER_NORAW (1 << 5) /* Don't generate RawEvents */
|
#define POINTER_NORAW (1 << 5) /* Don't generate RawEvents */
|
||||||
#define POINTER_EMULATED (1 << 6) /* Event was emulated from another event */
|
#define POINTER_EMULATED (1 << 6) /* Event was emulated from another event */
|
||||||
|
#define POINTER_DESKTOP (1 << 7) /* Data in desktop coordinates */
|
||||||
|
|
||||||
/* GetTouchEvent flags */
|
/* GetTouchEvent flags */
|
||||||
#define TOUCH_ACCEPT (1 << 0)
|
#define TOUCH_ACCEPT (1 << 0)
|
||||||
|
|
Loading…
Reference in New Issue