aboutsummaryrefslogtreecommitdiff
path: root/xorg-server/dix
diff options
context:
space:
mode:
authormarha <marha@users.sourceforge.net>2012-10-30 10:18:15 +0100
committermarha <marha@users.sourceforge.net>2012-10-30 10:18:15 +0100
commit33d29586bf3a280e821e0bf62694492dba459dab (patch)
treee029e900674f4f8901cae65c95acd3e15ce3948c /xorg-server/dix
parentaf2d8fb974d476eadcd3cde3baebd038f5750600 (diff)
parent7b3f315a5d8b90dcb0db5512ed91fa700027cb7a (diff)
downloadvcxsrv-33d29586bf3a280e821e0bf62694492dba459dab.tar.gz
vcxsrv-33d29586bf3a280e821e0bf62694492dba459dab.tar.bz2
vcxsrv-33d29586bf3a280e821e0bf62694492dba459dab.zip
Merge remote-tracking branch 'origin/released'
* origin/released: fontconfig xserver mesa git update 30 oct 2012 Conflicts: xorg-server/dix/grabs.c xorg-server/hw/xwin/winclipboard.h xorg-server/hw/xwin/winclipboardthread.c xorg-server/hw/xwin/winclipboardwrappers.c xorg-server/hw/xwin/winmonitors.c xorg-server/hw/xwin/winmsg.c xorg-server/hw/xwin/winmsg.h xorg-server/hw/xwin/winprefslex.l xorg-server/hw/xwin/winprefsyacc.y xorg-server/hw/xwin/winregistry.c
Diffstat (limited to 'xorg-server/dix')
-rw-r--r--xorg-server/dix/devices.c1
-rw-r--r--xorg-server/dix/grabs.c3
-rw-r--r--xorg-server/dix/touch.c28
3 files changed, 31 insertions, 1 deletions
diff --git a/xorg-server/dix/devices.c b/xorg-server/dix/devices.c
index 8f208933b..f30407a4e 100644
--- a/xorg-server/dix/devices.c
+++ b/xorg-server/dix/devices.c
@@ -448,6 +448,7 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
if (*prev != dev)
return FALSE;
+ TouchEndPhysicallyActiveTouches(dev);
ReleaseButtonsAndKeys(dev);
SyncRemoveDeviceIdleTime(dev->idle_counter);
dev->idle_counter = NULL;
diff --git a/xorg-server/dix/grabs.c b/xorg-server/dix/grabs.c
index 83e18e263..fe7967415 100644
--- a/xorg-server/dix/grabs.c
+++ b/xorg-server/dix/grabs.c
@@ -179,7 +179,8 @@ UngrabAllDevices(Bool kill_client)
continue;
PrintDeviceGrabInfo(dev);
client = clients[CLIENT_ID(dev->deviceGrab.grab->resource)];
- dev->deviceGrab.DeactivateGrab(dev);
+ if (!kill_client || !client || client->clientGone)
+ dev->deviceGrab.DeactivateGrab(dev);
if (kill_client)
CloseDownClient(client);
}
diff --git a/xorg-server/dix/touch.c b/xorg-server/dix/touch.c
index 497ad7dac..e64a6262c 100644
--- a/xorg-server/dix/touch.c
+++ b/xorg-server/dix/touch.c
@@ -1029,3 +1029,31 @@ TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode,
return TouchListenerAcceptReject(dev, ti, i, mode);
}
+
+/**
+ * End physically active touches for a device.
+ */
+void
+TouchEndPhysicallyActiveTouches(DeviceIntPtr dev)
+{
+ InternalEvent *eventlist = InitEventList(GetMaximumEventsNum());
+ int i;
+
+ OsBlockSignals();
+ mieqProcessInputEvents();
+ for (i = 0; i < dev->last.num_touches; i++) {
+ DDXTouchPointInfoPtr ddxti = dev->last.touches + i;
+
+ if (ddxti->active) {
+ int j;
+ int nevents = GetTouchEvents(eventlist, dev, ddxti->ddx_id,
+ XI_TouchEnd, 0, NULL);
+
+ for (j = 0; j < nevents; j++)
+ mieqProcessDeviceEvent(dev, eventlist + j, NULL);
+ }
+ }
+ OsReleaseSignals();
+
+ FreeEventList(eventlist, GetMaximumEventsNum());
+}