diff options
Diffstat (limited to 'xorg-server')
-rw-r--r-- | xorg-server/Xext/hashtable.c | 1 | ||||
-rw-r--r-- | xorg-server/Xi/stubs.c | 1 | ||||
-rw-r--r-- | xorg-server/hw/vfb/InitOutput.c | 7 | ||||
-rw-r--r-- | xorg-server/hw/xfree86/common/xf86Xinput.c | 94 |
4 files changed, 87 insertions, 16 deletions
diff --git a/xorg-server/Xext/hashtable.c b/xorg-server/Xext/hashtable.c index 5cfaeb863..e362ad12f 100644 --- a/xorg-server/Xext/hashtable.c +++ b/xorg-server/Xext/hashtable.c @@ -1,6 +1,7 @@ #ifdef HAVE_DIX_CONFIG_H #include <dix-config.h> #endif + #include <stdlib.h> #include "misc.h" #include "hashtable.h" diff --git a/xorg-server/Xi/stubs.c b/xorg-server/Xi/stubs.c index 8baa5a09b..39bee7c27 100644 --- a/xorg-server/Xi/stubs.c +++ b/xorg-server/Xi/stubs.c @@ -141,4 +141,5 @@ NewInputDeviceRequest(InputOption *options, InputAttributes * attrs, void DeleteInputDeviceRequest(DeviceIntPtr dev) { + RemoveDevice(dev, TRUE); } diff --git a/xorg-server/hw/vfb/InitOutput.c b/xorg-server/hw/vfb/InitOutput.c index e2cd96cdc..16edf4307 100644 --- a/xorg-server/hw/vfb/InitOutput.c +++ b/xorg-server/hw/vfb/InitOutput.c @@ -774,6 +774,13 @@ vfbCloseScreen(int index, ScreenPtr pScreen) for (i = 0; i < screenInfo.numScreens; i++) SetInstalledColormap(screenInfo.screens[i], NULL); + /* + * fb overwrites miCloseScreen, so do this here + */ + if (pScreen->devPrivate) + (*pScreen->DestroyPixmap) (pScreen->devPrivate); + pScreen->devPrivate = NULL; + return pScreen->CloseScreen(index, pScreen); } diff --git a/xorg-server/hw/xfree86/common/xf86Xinput.c b/xorg-server/hw/xfree86/common/xf86Xinput.c index 77b800000..bee407bf9 100644 --- a/xorg-server/hw/xfree86/common/xf86Xinput.c +++ b/xorg-server/hw/xfree86/common/xf86Xinput.c @@ -1059,26 +1059,24 @@ xf86PostMotionEventP(DeviceIntPtr device, xf86PostMotionEventM(device, is_absolute, &mask); } -void -xf86PostMotionEventM(DeviceIntPtr device, - int is_absolute, const ValuatorMask *mask) +static int +xf86CheckMotionEvent4DGA(DeviceIntPtr device, int is_absolute, + const ValuatorMask *mask) { - int flags = 0; - - if (valuator_mask_num_valuators(mask) > 0) { - if (is_absolute) - flags = POINTER_ABSOLUTE; - else - flags = POINTER_RELATIVE | POINTER_ACCELERATE; - } + int stolen = 0; #if XFreeXDGA + ScreenPtr scr = NULL; + int idx, i; + /* The evdev driver may not always send all axes across. */ - if (valuator_mask_isset(mask, 0) || valuator_mask_isset(mask, 1)) - if (miPointerGetScreen(device)) { - int index = miPointerGetScreen(device)->myNum; + if (valuator_mask_isset(mask, 0) || valuator_mask_isset(mask, 1)) { + scr = miPointerGetScreen(device); + if (scr) { int dx = 0, dy = 0; + idx = scr->myNum; + if (valuator_mask_isset(mask, 0)) { dx = valuator_mask_get(mask, 0); if (is_absolute) @@ -1091,11 +1089,75 @@ xf86PostMotionEventM(DeviceIntPtr device, dy -= device->last.valuators[1]; } - if (DGAStealMotionEvent(device, index, dx, dy)) - return; + if (DGAStealMotionEvent(device, idx, dx, dy)) + stolen = 1; + } + } + + for (i = 2; i < valuator_mask_size(mask); i++) { + AxisInfoPtr ax; + double incr; + int val, button; + + if (i >= device->valuator->numAxes) + break; + + if (!valuator_mask_isset(mask, i)) + continue; + + ax = &device->valuator->axes[i]; + + if (ax->scroll.type == SCROLL_TYPE_NONE) + continue; + + if (!scr) { + scr = miPointerGetScreen(device); + if (!scr) + break; + idx = scr->myNum; + } + + incr = ax->scroll.increment; + val = valuator_mask_get(mask, i); + + if (ax->scroll.type == SCROLL_TYPE_VERTICAL) { + if (incr * val < 0) + button = 4; /* up */ + else + button = 5; /* down */ + } else { /* SCROLL_TYPE_HORIZONTAL */ + if (incr * val < 0) + button = 6; /* left */ + else + button = 7; /* right */ } + + if (DGAStealButtonEvent(device, idx, button, 1) && + DGAStealButtonEvent(device, idx, button, 0)) + stolen = 1; + } + #endif + return stolen; +} + +void +xf86PostMotionEventM(DeviceIntPtr device, + int is_absolute, const ValuatorMask *mask) +{ + int flags = 0; + + if (xf86CheckMotionEvent4DGA(device, is_absolute, mask)) + return; + + if (valuator_mask_num_valuators(mask) > 0) { + if (is_absolute) + flags = POINTER_ABSOLUTE; + else + flags = POINTER_RELATIVE | POINTER_ACCELERATE; + } + QueuePointerEvents(device, MotionNotify, 0, flags, mask); } |