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,18 +1110,26 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons, if (!pDev->enabled) return 0; + if (!scr) + 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 */ - if (!scr || !pDev->valuator || - (type != MotionNotify && type != ButtonPress && type != ButtonRelease) || - (type != MotionNotify && !pDev->button) || - ((type == ButtonPress || type == ButtonRelease) && !buttons)) - return 0; - - if (type == MotionNotify && - (!mask_in || valuator_mask_num_valuators(mask_in) <= 0)) - return 0; - events = UpdateFromMaster(events, pDev, DEVCHANGE_POINTER_EVENT, &num_events); raw = (RawDeviceEvent*)events->event; 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)) {