summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <sandmann@daimi.au.dk>2006-01-12 22:14:56 +0000
committerSøren Sandmann Pedersen <sandmann@daimi.au.dk>2006-01-12 22:14:56 +0000
commitc2dedf4d17f8a5b1a8037fd2b4e29122ef78945a (patch)
tree03adc3a1a20822e6a133432998c6bc8a484f6ba1
parent847d83ec3c90c5b298eaf19ba55251b4a30f4155 (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--ChangeLog9
-rw-r--r--composite/compalloc.c12
-rw-r--r--dix/window.c27
-rw-r--r--include/window.h7
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 <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 */