dix: when a window disappears, remove it from the touch sprite trace

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
This commit is contained in:
Daniel Stone 2011-12-14 16:53:04 +10:00 committed by Peter Hutterer
parent c18a173cf5
commit 8e58ce73c8
3 changed files with 41 additions and 2 deletions

View File

@ -1866,6 +1866,36 @@ InputClientGone(WindowPtr pWin, XID id)
FatalError("client not on device event list");
}
/**
* Search for window in each touch trace for each device. Remove the window
* and all its subwindows from the trace when found. The initial window
* order is preserved.
*/
void WindowGone(WindowPtr win)
{
DeviceIntPtr dev;
for (dev = inputInfo.devices; dev; dev = dev->next) {
TouchClassPtr t = dev->touch;
int i;
if (!t)
continue;
for (i = 0; i < t->num_touches; i++) {
SpritePtr sprite = &t->touches[i].sprite;
int j;
for (j = 0; j < sprite->spriteTraceGood; j++) {
if (sprite->spriteTrace[j] == win) {
sprite->spriteTraceGood = j;
break;
}
}
}
}
}
int
SendEvent(ClientPtr client, DeviceIntPtr d, Window dest, Bool propagate,
xEvent * ev, Mask mask, int count)

View File

@ -131,6 +131,7 @@ Equipment Corporation.
#include "privates.h"
#include "xace.h"
#include "exevents.h"
#include <X11/Xatom.h> /* must come after server includes */
@ -2971,8 +2972,10 @@ UnmapWindow(WindowPtr pWin, Bool fromConfigure)
if (!fromConfigure && pScreen->PostValidateTree)
(*pScreen->PostValidateTree)(pLayerWin->parent, pWin, VTUnmap);
}
if (wasRealized && !fromConfigure)
if (wasRealized && !fromConfigure) {
WindowsRestructured ();
WindowGone(pWin);
}
return Success;
}
@ -3055,8 +3058,10 @@ UnmapSubwindows(WindowPtr pWin)
if (anyMarked && pScreen->PostValidateTree)
(*pScreen->PostValidateTree)(pLayerWin->parent, pHead, VTUnmap);
}
if (wasRealized)
if (wasRealized) {
WindowsRestructured ();
WindowGone(pWin);
}
}

View File

@ -245,6 +245,10 @@ InputClientGone(
WindowPtr /* pWin */,
XID /* id */);
extern void
WindowGone(
WindowPtr /* win */);
extern int
SendEvent (
ClientPtr /* client */,