瀏覽代碼

x11events: ignore UnmapNotify events from XReparentWindow
UnmapNotify event does not mean that window has been iconified. It
just reports that window changed state from mapped to unmapped.

XReparentWindow can unmap and remap window if it was mapped. This
causes unnecessary events - HIDDEN, MINIMIZED, RESTORED and SHOW.

These events are problematic with Metacity 3.36+ which started to
remove window decorations from fullscreen windows.

- SDL makes decorated window fullscreen
- Metacity removes decorations
- SDL gets UnmapNotify and exits from fullscreen
- Metacity re-adds decorations

As SDL will also get MapNotify event it will try to restore
window state causing above steps to repeat.

https://bugzilla.libsdl.org/show_bug.cgi?id=5314

Alberts Muktup?vels 4 年之前
父節點
當前提交
73010da4dc
共有 1 個文件被更改,包括 31 次插入1 次删除
  1. 31 1
      src/video/x11/SDL_x11events.c

+ 31 - 1
src/video/x11/SDL_x11events.c

@@ -642,6 +642,29 @@ X11_HandleClipboardEvent(_THIS, const XEvent *xevent)
     }
 }
 
+static Bool
+isMapNotify(Display *display, XEvent *ev, XPointer arg)
+{
+    XUnmapEvent *unmap;
+
+    unmap = (XUnmapEvent*) arg;
+
+    return ev->type == MapNotify &&
+        ev->xmap.window == unmap->window &&
+        ev->xmap.serial == unmap->serial;
+}
+
+static Bool
+isReparentNotify(Display *display, XEvent *ev, XPointer arg)
+{
+    XUnmapEvent *unmap;
+
+    unmap = (XUnmapEvent*) arg;
+
+    return ev->type == ReparentNotify &&
+        ev->xreparent.window == unmap->window &&
+        ev->xreparent.serial == unmap->serial;
+}
 
 static void
 X11_DispatchEvent(_THIS)
@@ -948,10 +971,17 @@ X11_DispatchEvent(_THIS)
 
         /* Have we been iconified? */
     case UnmapNotify:{
+            XEvent ev;
+
 #ifdef DEBUG_XEVENTS
             printf("window %p: UnmapNotify!\n", data);
 #endif
-            X11_DispatchUnmapNotify(data);
+
+            if (X11_XCheckIfEvent(display, &ev, &isReparentNotify, (XPointer)&xevent.xunmap)) {
+                X11_XCheckIfEvent(display, &ev, &isMapNotify, (XPointer)&xevent.xunmap);
+            } else {
+                X11_DispatchUnmapNotify(data);
+            }
         }
         break;