summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2010-12-14 15:04:12 -0800
committerKeith Packard <keithp@keithp.com>2010-12-14 15:04:12 -0800
commitf1542f1d716723cba7c323849086585635121893 (patch)
treee34b629abf98d1299fb07d02afa2e54117a3bc6b
parent9716d3124799c6db0d1c782aa72c72f972d5a158 (diff)
parent8a8fdd762ad89c350854943311ec4aadc50245fa (diff)
Merge remote branch 'whot/for-keith'
-rw-r--r--dix/getevents.c60
-rw-r--r--hw/xfree86/common/xf86Option.c2
-rw-r--r--hw/xfree86/common/xf86Xinput.c23
3 files changed, 53 insertions, 32 deletions
diff --git a/dix/getevents.c b/dix/getevents.c
index 25889de46..794df420b 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -767,7 +767,7 @@ moveRelative(DeviceIntPtr dev, int *x, int *y, ValuatorMask *mask)
/* if attached, clip both x and y to the defined limits (usually
* co-ord space limit). If it is attached, we need x/y to go over the
* limits to be able to change screens. */
- if(dev->u.master) {
+ if(dev->u.master && dev->valuator) {
if (valuator_get_mode(dev, 0) == Absolute)
clipAxis(dev, 0, x);
if (valuator_get_mode(dev, 1) == Absolute)
@@ -830,7 +830,7 @@ positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
int old_screenx, old_screeny;
/* scale x&y to screen */
- if (dev->valuator->numAxes > 0) {
+ if (dev->valuator && dev->valuator->numAxes > 0) {
*screenx = rescaleValuatorAxis(*x, x_frac, screenx_frac,
dev->valuator->axes + 0, NULL, scr->width);
} else {
@@ -838,7 +838,7 @@ positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
*screenx_frac = dev->last.remainder[0];
}
- if (dev->valuator->numAxes > 1) {
+ if (dev->valuator && dev->valuator->numAxes > 1) {
*screeny = rescaleValuatorAxis(*y, y_frac, screeny_frac,
dev->valuator->axes + 1, NULL, scr->height);
} else {
@@ -872,18 +872,21 @@ positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
dev->u.master->last.remainder[1] = *screeny_frac;
}
- /* Crossed screen? Scale back to device coordiantes */
- if(*screenx != old_screenx)
+ if (dev->valuator)
{
- scr = miPointerGetScreen(dev);
- *x = rescaleValuatorAxis(*screenx, *screenx_frac, &x_frac, NULL,
- dev->valuator->axes + 0, scr->width);
- }
- if(*screeny != old_screeny)
- {
- scr = miPointerGetScreen(dev);
- *y = rescaleValuatorAxis(*screeny, *screeny_frac, &y_frac, NULL,
- dev->valuator->axes + 1, scr->height);
+ /* Crossed screen? Scale back to device coordiantes */
+ if(*screenx != old_screenx)
+ {
+ scr = miPointerGetScreen(dev);
+ *x = rescaleValuatorAxis(*screenx, *screenx_frac, &x_frac, NULL,
+ dev->valuator->axes + 0, scr->width);
+ }
+ if(*screeny != old_screeny)
+ {
+ scr = miPointerGetScreen(dev);
+ *y = rescaleValuatorAxis(*screeny, *screeny_frac, &y_frac, NULL,
+ dev->valuator->axes + 1, scr->height);
+ }
}
/* dropy x/y (device coordinates) back into valuators for next event */
@@ -904,6 +907,9 @@ positionSprite(DeviceIntPtr dev, int *x, int *y, float x_frac, float y_frac,
static void
updateHistory(DeviceIntPtr dev, ValuatorMask *mask, CARD32 ms)
{
+ if (!dev->valuator)
+ return;
+
updateMotionHistory(dev, ms, mask, dev->last.valuators);
if (dev->u.master)
{
@@ -1104,17 +1110,25 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
if (!pDev->enabled)
return 0;
- ms = GetTimeInMillis(); /* before pointer update to help precision */
-
- if (!scr || !pDev->valuator ||
- (type != MotionNotify && type != ButtonPress && type != ButtonRelease) ||
- (type != MotionNotify && !pDev->button) ||
- ((type == ButtonPress || type == ButtonRelease) && !buttons))
+ if (!scr)
return 0;
- if (type == MotionNotify &&
- (!mask_in || valuator_mask_num_valuators(mask_in) <= 0))
- return 0;
+ switch (type)
+ {
+ case MotionNotify:
+ if (!mask_in || valuator_mask_num_valuators(mask_in) <= 0)
+ return 0;
+ break;
+ case ButtonPress:
+ case ButtonRelease:
+ if (!pDev->button || !buttons)
+ return 0;
+ break;
+ default:
+ return 0;
+ }
+
+ ms = GetTimeInMillis(); /* before pointer update to help precision */
events = UpdateFromMaster(events, pDev, DEVCHANGE_POINTER_EVENT, &num_events);
diff --git a/hw/xfree86/common/xf86Option.c b/hw/xfree86/common/xf86Option.c
index d49aa310f..16c27e5ee 100644
--- a/hw/xfree86/common/xf86Option.c
+++ b/hw/xfree86/common/xf86Option.c
@@ -130,7 +130,7 @@ xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts)
if (defaultOpts) {
XF86OptionPtr tmp =xf86optionListCreate(defaultOpts, -1, 0);
if (pInfo->options)
- pInfo->options = xf86optionListMerge(pInfo->options, tmp);
+ pInfo->options = xf86optionListMerge(tmp, pInfo->options);
else
pInfo->options = tmp;
}
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index c2cf4382c..b9006ab07 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -684,6 +684,7 @@ xf86AddInput(InputDriverPtr drv, InputInfoPtr pInfo)
pInfo->next = NULL;
xf86CollectInputOptions(pInfo, (const char**)drv->default_options);
+ xf86OptionListReport(pInfo->options);
xf86ProcessCommonOptions(pInfo, pInfo->options);
}
@@ -1015,10 +1016,13 @@ xf86PostMotionEventM(DeviceIntPtr device,
int dx = 0, dy = 0;
#endif
- if (is_absolute)
- flags = POINTER_ABSOLUTE;
- else
- flags = POINTER_RELATIVE | POINTER_ACCELERATE;
+ if (valuator_mask_num_valuators(mask) > 0)
+ {
+ if (is_absolute)
+ flags = POINTER_ABSOLUTE;
+ else
+ flags = POINTER_RELATIVE | POINTER_ACCELERATE;
+ }
#if XFreeXDGA
/* The evdev driver may not always send all axes across. */
@@ -1160,10 +1164,13 @@ xf86PostButtonEventM(DeviceIntPtr device,
int index;
#endif
- if (is_absolute)
- flags = POINTER_ABSOLUTE;
- else
- flags = POINTER_RELATIVE | POINTER_ACCELERATE;
+ if (valuator_mask_num_valuators(mask) > 0)
+ {
+ if (is_absolute)
+ flags = POINTER_ABSOLUTE;
+ else
+ flags = POINTER_RELATIVE | POINTER_ACCELERATE;
+ }
#if XFreeXDGA
if (miPointerGetScreen(device)) {