From c2dedf4d17f8a5b1a8037fd2b4e29122ef78945a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Sandmann=20Pedersen?= Date: Thu, 12 Jan 2006 22:14:56 +0000 Subject: [PATCH] =?UTF-8?q?Thu=20Jan=2012=2017:09:18=202006=20S=C3=B8ren?= =?UTF-8?q?=20Sandmann=20=20Add=20new=20functions=20t?= =?UTF-8?q?o=20enable=20and=20disable=20events=20on=20Map=20and=20Unmap.?= =?UTF-8?q?=20Use=20them=20here=20to=20make=20sure=20Composite=20redirect?= =?UTF-8?q?=20doesn't=20cause=20Map/UnmapNotify=20=20=20=20=20events=20tha?= =?UTF-8?q?t=20would=20confuse=20window=20managers.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ChangeLog | 9 +++++++++ composite/compalloc.c | 12 ++++++++++++ dix/window.c | 27 +++++++++++++++++++++++++-- include/window.h | 7 +++++++ 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3d8e1cd4c..8e753f66f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +Thu Jan 12 17:09:18 2006 Søren Sandmann + + * 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 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 */