diff options
author | Søren Sandmann Pedersen <sandmann@daimi.au.dk> | 2006-01-12 22:14:56 +0000 |
---|---|---|
committer | Søren Sandmann Pedersen <sandmann@daimi.au.dk> | 2006-01-12 22:14:56 +0000 |
commit | c2dedf4d17f8a5b1a8037fd2b4e29122ef78945a (patch) | |
tree | 03adc3a1a20822e6a133432998c6bc8a484f6ba1 | |
parent | 847d83ec3c90c5b298eaf19ba55251b4a30f4155 (diff) |
Thu Jan 12 17:09:18 2006 Søren Sandmann <sandmann@redhat.com>
Add new functions to enable and disable events on Map and Unmap.
Use them here to make sure Composite redirect doesn't cause Map/UnmapNotify
events that would confuse window managers.
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | composite/compalloc.c | 12 | ||||
-rw-r--r-- | dix/window.c | 27 | ||||
-rw-r--r-- | include/window.h | 7 |
4 files changed, 53 insertions, 2 deletions
@@ -1,3 +1,12 @@ +Thu Jan 12 17:09:18 2006 Søren Sandmann <sandmann@redhat.com> + + * include/window.[ch]: Add new functions to enable and disable + events on Map and Unmap. + + * composite/compalloc.c: Use them here to make sure Composite + redirect doesn't cause Map/UnmapNotify events that would confuse + window managers. + 2006-01-11 Ian Romanick <idr@us.ibm.com> reviewed by: airlied, krh diff --git a/composite/compalloc.c b/composite/compalloc.c index aabacbe7b..1deef685c 100644 --- a/composite/compalloc.c +++ b/composite/compalloc.c @@ -101,7 +101,11 @@ compRedirectWindow (ClientPtr pClient, WindowPtr pWin, int update) return BadAlloc; } if (wasMapped) + { + DisableMapUnmapEvents (pWin); UnmapWindow (pWin, FALSE); + EnableMapUnmapEvents (pWin); + } REGION_NULL (pScreen, &cw->borderClip); cw->update = CompositeRedirectAutomatic; @@ -135,7 +139,9 @@ compRedirectWindow (ClientPtr pClient, WindowPtr pWin, int update) { Bool overrideRedirect = pWin->overrideRedirect; pWin->overrideRedirect = TRUE; + DisableMapUnmapEvents (pWin); MapWindow (pWin, pClient); + EnableMapUnmapEvents (pWin); pWin->overrideRedirect = overrideRedirect; } @@ -169,7 +175,11 @@ compFreeClientWindow (WindowPtr pWin, XID id) if (!cw->clients) { if (wasMapped) + { + DisableMapUnmapEvents (pWin); UnmapWindow (pWin, FALSE); + EnableMapUnmapEvents (pWin); + } if (pWin->redirectDraw) compFreePixmap (pWin); @@ -193,7 +203,9 @@ compFreeClientWindow (WindowPtr pWin, XID id) { Bool overrideRedirect = pWin->overrideRedirect; pWin->overrideRedirect = TRUE; + DisableMapUnmapEvents (pWin); MapWindow (pWin, clients[CLIENT_ID(id)]); + EnableMapUnmapEvents (pWin); pWin->overrideRedirect = overrideRedirect; } } diff --git a/dix/window.c b/dix/window.c index bd320fabe..84985e66f 100644 --- a/dix/window.c +++ b/dix/window.c @@ -2728,7 +2728,7 @@ MapWindow(register WindowPtr pWin, ClientPtr client) } pWin->mapped = TRUE; - if (SubStrSend(pWin, pParent)) + if (SubStrSend(pWin, pParent) && MapUnmapEventsEnabled(pWin)) { event.u.u.type = MapNotify; event.u.mapNotify.window = pWin->drawable.id; @@ -2983,7 +2983,7 @@ UnmapWindow(register WindowPtr pWin, Bool fromConfigure) if ((!pWin->mapped) || (!(pParent = pWin->parent))) return(Success); - if (SubStrSend(pWin, pParent)) + if (SubStrSend(pWin, pParent) && MapUnmapEventsEnabled(pWin)) { event.u.u.type = UnmapNotify; event.u.unmapNotify.window = pWin->drawable.id; @@ -3285,6 +3285,29 @@ SendVisibilityNotify(WindowPtr pWin) DeliverEvents(pWin, &event, 1, NullWindow); } +static WindowPtr windowDisableMapUnmapEvents; + +void +DisableMapUnmapEvents(WindowPtr pWin) +{ + assert (windowDisableMapUnmapEvents == NULL); + + windowDisableMapUnmapEvents = pWin; +} + +void +EnableMapUnmapEvents(WindowPtr pWin) +{ + assert (windowDisableMapUnmapEvents != NULL); + + windowDisableMapUnmapEvents = NULL; +} + +Bool +MapUnmapEventsEnabled(WindowPtr pWin) +{ + return pWin != windowDisableMapUnmapEvents; +} #define RANDOM_WIDTH 32 diff --git a/include/window.h b/include/window.h index 7c3fce092..32559272d 100644 --- a/include/window.h +++ b/include/window.h @@ -262,4 +262,11 @@ extern RegionPtr CreateBoundingShape( extern RegionPtr CreateClipShape( WindowPtr /* pWin */ ); +extern void DisableMapUnmapEvents( + WindowPtr /* pWin */ ); +extern void EnableMapUnmapEvents( + WindowPtr /* pWin */ ); +extern Bool MapUnmapEventsEnabled( + WindowPtr /* pWin */ ); + #endif /* WINDOW_H */ |