diff options
author | Peter Hutterer <peter.hutterer@redhat.com> | 2008-11-14 15:18:56 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@redhat.com> | 2008-11-25 09:21:45 +1000 |
commit | 868fd503b7aeab31dba72046b59061008d8b7501 (patch) | |
tree | b0aef0e4decceb911285fc0141ccd1a3f1b39e65 /dix | |
parent | 554592cd70543f87cd8bee5ff47cc8281511e041 (diff) |
dix: move Enter-Leave related functions into new enterleave.c
Preparation for the new core enter/leave model.
Signed-off-by: Peter Hutterer <peter.hutterer@redhat.com>
Diffstat (limited to 'dix')
-rw-r--r-- | dix/Makefile.am | 2 | ||||
-rw-r--r-- | dix/enterleave.c | 138 | ||||
-rw-r--r-- | dix/enterleave.h | 53 | ||||
-rw-r--r-- | dix/events.c | 116 |
4 files changed, 196 insertions, 113 deletions
diff --git a/dix/Makefile.am b/dix/Makefile.am index a4b48c82e..4c2395d82 100644 --- a/dix/Makefile.am +++ b/dix/Makefile.am @@ -14,6 +14,8 @@ libdix_la_SOURCES = \ dispatch.h \ dixfonts.c \ dixutils.c \ + enterleave.c \ + enterleave.h \ events.c \ extension.c \ ffs.c \ diff --git a/dix/enterleave.c b/dix/enterleave.c new file mode 100644 index 000000000..941aa528a --- /dev/null +++ b/dix/enterleave.c @@ -0,0 +1,138 @@ +/* + * Copyright © 2008 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: Peter Hutterer + * + */ + +#ifdef HAVE_DIX_CONFIG_H +#include <dix-config.h> +#endif + +#include <X11/X.h> +#include "windowstr.h" +#include "enterleave.h" + +/** + * @return The window that is the first ancestor of both a and b. + */ +WindowPtr +CommonAncestor( + WindowPtr a, + WindowPtr b) +{ + for (b = b->parent; b; b = b->parent) + if (IsParent(b, a)) return b; + return NullWindow; +} + + +/** + * Send enter notifies to all parent windows up to ancestor. + * This function recurses. + */ +static void +EnterNotifies(DeviceIntPtr pDev, + WindowPtr ancestor, + WindowPtr child, + int mode, + int detail) +{ + WindowPtr parent = child->parent; + + if (ancestor == parent) + return; + EnterNotifies(pDev, ancestor, parent, mode, detail); + EnterLeaveEvent(pDev, EnterNotify, mode, detail, parent, + child->drawable.id); +} + + +/** + * Send leave notifies to all parent windows up to ancestor. + * This function recurses. + */ +static void +LeaveNotifies(DeviceIntPtr pDev, + WindowPtr child, + WindowPtr ancestor, + int mode, + int detail) +{ + WindowPtr pWin; + + if (ancestor == child) + return; + for (pWin = child->parent; pWin != ancestor; pWin = pWin->parent) + { + EnterLeaveEvent(pDev, LeaveNotify, mode, detail, pWin, + child->drawable.id); + child = pWin; + } +} + +/** + * Figure out if enter/leave events are necessary and send them to the + * appropriate windows. + * + * @param fromWin Window the sprite moved out of. + * @param toWin Window the sprite moved into. + */ +void +DoEnterLeaveEvents(DeviceIntPtr pDev, + WindowPtr fromWin, + WindowPtr toWin, + int mode) +{ + if (!IsPointerDevice(pDev)) + return; + + if (fromWin == toWin) + return; + if (IsParent(fromWin, toWin)) + { + EnterLeaveEvent(pDev, LeaveNotify, mode, NotifyInferior, fromWin, + None); + EnterNotifies(pDev, fromWin, toWin, mode, + NotifyVirtual); + EnterLeaveEvent(pDev, EnterNotify, mode, NotifyAncestor, toWin, None); + } + else if (IsParent(toWin, fromWin)) + { + EnterLeaveEvent(pDev, LeaveNotify, mode, NotifyAncestor, fromWin, + None); + LeaveNotifies(pDev, fromWin, toWin, mode, NotifyVirtual); + EnterLeaveEvent(pDev, EnterNotify, mode, NotifyInferior, toWin, None); + } + else + { /* neither fromWin nor toWin is descendent of the other */ + WindowPtr common = CommonAncestor(toWin, fromWin); + /* common == NullWindow ==> different screens */ + EnterLeaveEvent(pDev, LeaveNotify, mode, NotifyNonlinear, fromWin, + None); + LeaveNotifies(pDev, fromWin, common, mode, NotifyNonlinearVirtual); + EnterNotifies(pDev, common, toWin, mode, NotifyNonlinearVirtual); + EnterLeaveEvent(pDev, EnterNotify, mode, NotifyNonlinear, toWin, + None); + } +} + diff --git a/dix/enterleave.h b/dix/enterleave.h new file mode 100644 index 000000000..c1bfc3ada --- /dev/null +++ b/dix/enterleave.h @@ -0,0 +1,53 @@ +/* + * Copyright © 2008 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: Peter Hutterer + * + */ + +#ifdef HAVE_DIX_CONFIG_H +#include <dix-config.h> +#endif + +#ifndef ENTERLEAVE_H +#define ENTERLEAVE_H + +extern void DoEnterLeaveEvents( + DeviceIntPtr pDev, + WindowPtr fromWin, + WindowPtr toWin, + int mode +); + +extern void EnterLeaveEvent( + DeviceIntPtr mouse, + int type, + int mode, + int detail, + WindowPtr pWin, + Window child); + +extern WindowPtr CommonAncestor( + WindowPtr a, + WindowPtr b); + +#endif /* _ENTERLEAVE_H_ */ diff --git a/dix/events.c b/dix/events.c index 27601b7e3..77ca3d2c5 100644 --- a/dix/events.c +++ b/dix/events.c @@ -164,6 +164,8 @@ typedef const char *string; #include "geext.h" #include "geint.h" +#include "enterleave.h" + /** * Extension events type numbering starts at EXTENSION_EVENT_BASE. */ @@ -326,13 +328,6 @@ IsKeyboardDevice(DeviceIntPtr dev) return (dev->key && dev->kbdfeed) && !IsPointerDevice(dev); } -static void DoEnterLeaveEvents( - DeviceIntPtr pDev, - WindowPtr fromWin, - WindowPtr toWin, - int mode -); - static WindowPtr XYToWindow( DeviceIntPtr pDev, int x, @@ -4185,23 +4180,10 @@ EventSuppressForWindow(WindowPtr pWin, ClientPtr client, } /** - * @return The window that is the first ancestor of both a and b. - */ -static WindowPtr -CommonAncestor( - WindowPtr a, - WindowPtr b) -{ - for (b = b->parent; b; b = b->parent) - if (IsParent(b, a)) return b; - return NullWindow; -} - -/** * Assembles an EnterNotify or LeaveNotify and sends it event to the client. * Uses the paired keyboard to get some additional information. */ -static void +void EnterLeaveEvent( DeviceIntPtr mouse, int type, @@ -4364,98 +4346,6 @@ EnterLeaveEvent( } } -/** - * Send enter notifies to all parent windows up to ancestor. - * This function recurses. - */ -static void -EnterNotifies(DeviceIntPtr pDev, - WindowPtr ancestor, - WindowPtr child, - int mode, - int detail) -{ - WindowPtr parent = child->parent; - - if (ancestor == parent) - return; - EnterNotifies(pDev, ancestor, parent, mode, detail); - EnterLeaveEvent(pDev, EnterNotify, mode, detail, parent, - child->drawable.id); -} - - -/** - * Send leave notifies to all parent windows up to ancestor. - * This function recurses. - */ -static void -LeaveNotifies(DeviceIntPtr pDev, - WindowPtr child, - WindowPtr ancestor, - int mode, - int detail) -{ - WindowPtr pWin; - - if (ancestor == child) - return; - for (pWin = child->parent; pWin != ancestor; pWin = pWin->parent) - { - EnterLeaveEvent(pDev, LeaveNotify, mode, detail, pWin, - child->drawable.id); - child = pWin; - } -} - - - -/** - * Figure out if enter/leave events are necessary and send them to the - * appropriate windows. - * - * @param fromWin Window the sprite moved out of. - * @param toWin Window the sprite moved into. - */ -static void -DoEnterLeaveEvents(DeviceIntPtr pDev, - WindowPtr fromWin, - WindowPtr toWin, - int mode) -{ - if (!IsPointerDevice(pDev)) - return; - - if (fromWin == toWin) - return; - if (IsParent(fromWin, toWin)) - { - EnterLeaveEvent(pDev, LeaveNotify, mode, NotifyInferior, fromWin, - None); - EnterNotifies(pDev, fromWin, toWin, mode, - NotifyVirtual); - EnterLeaveEvent(pDev, EnterNotify, mode, NotifyAncestor, toWin, None); - } - else if (IsParent(toWin, fromWin)) - { - EnterLeaveEvent(pDev, LeaveNotify, mode, NotifyAncestor, fromWin, - None); - LeaveNotifies(pDev, fromWin, toWin, mode, NotifyVirtual); - EnterLeaveEvent(pDev, EnterNotify, mode, NotifyInferior, toWin, None); - } - else - { /* neither fromWin nor toWin is descendent of the other */ - WindowPtr common = CommonAncestor(toWin, fromWin); - /* common == NullWindow ==> different screens */ - EnterLeaveEvent(pDev, LeaveNotify, mode, NotifyNonlinear, fromWin, - None); - LeaveNotifies(pDev, fromWin, common, mode, NotifyNonlinearVirtual); - EnterNotifies(pDev, common, toWin, mode, NotifyNonlinearVirtual); - EnterLeaveEvent(pDev, EnterNotify, mode, NotifyNonlinear, toWin, - None); - } -} - static void FocusEvent(DeviceIntPtr dev, int type, int mode, int detail, WindowPtr pWin) { |