dix: fix up device enter/leave for XI_Enter/XI_Leave.

This commit is contained in:
Peter Hutterer
2009-02-23 16:14:51 +10:00
parent 0befeb36c1
commit 181e41511d
3 changed files with 53 additions and 46 deletions

View File

@@ -29,6 +29,7 @@
#endif
#include <X11/X.h>
#include <X11/extensions/XI2.h>
#include "windowstr.h"
#include "scrnintstr.h"
#include "exglobals.h"
@@ -228,7 +229,7 @@ DeviceEnterNotifies(DeviceIntPtr dev,
if (ancestor == parent)
return;
DeviceEnterNotifies(dev, ancestor, parent, mode, detail);
DeviceEnterLeaveEvent(dev, DeviceEnterNotify, mode, detail, parent,
DeviceEnterLeaveEvent(dev, XI_Enter, mode, detail, parent,
child->drawable.id);
}
@@ -334,7 +335,7 @@ DeviceLeaveNotifies(DeviceIntPtr dev,
return;
for (win = child->parent; win != ancestor; win = win->parent)
{
DeviceEnterLeaveEvent(dev, DeviceLeaveNotify, mode, detail, win,
DeviceEnterLeaveEvent(dev, XI_Leave, mode, detail, win,
child->drawable.id);
child = win;
}
@@ -568,24 +569,24 @@ DeviceEnterLeaveEvents(DeviceIntPtr dev,
{
if (IsParent(from, to))
{
DeviceEnterLeaveEvent(dev, DeviceLeaveNotify, mode, NotifyInferior, from, None);
DeviceEnterLeaveEvent(dev, XI_Leave, mode, NotifyInferior, from, None);
DeviceEnterNotifies(dev, from, to, mode, NotifyVirtual);
DeviceEnterLeaveEvent(dev, DeviceEnterNotify, mode, NotifyAncestor, to, None);
DeviceEnterLeaveEvent(dev, XI_Enter, mode, NotifyAncestor, to, None);
}
else if (IsParent(to, from))
{
DeviceEnterLeaveEvent(dev, DeviceLeaveNotify, mode, NotifyAncestor, from, None);
DeviceEnterLeaveEvent(dev, XI_Leave, mode, NotifyAncestor, from, None);
DeviceLeaveNotifies(dev, from, to, mode, NotifyVirtual);
DeviceEnterLeaveEvent(dev, DeviceEnterNotify, mode, NotifyInferior, to, None);
DeviceEnterLeaveEvent(dev, XI_Enter, mode, NotifyInferior, to, None);
}
else
{ /* neither from nor to is descendent of the other */
WindowPtr common = CommonAncestor(to, from);
/* common == NullWindow ==> different screens */
DeviceEnterLeaveEvent(dev, DeviceLeaveNotify, mode, NotifyNonlinear, from, None);
DeviceEnterLeaveEvent(dev, XI_Leave, mode, NotifyNonlinear, from, None);
DeviceLeaveNotifies(dev, from, common, mode, NotifyNonlinearVirtual);
DeviceEnterNotifies(dev, common, to, mode, NotifyNonlinearVirtual);
DeviceEnterLeaveEvent(dev, DeviceEnterNotify, mode, NotifyNonlinear, to, None);
DeviceEnterLeaveEvent(dev, XI_Enter, mode, NotifyNonlinear, to, None);
}
}