about summary refs log tree commit diff
diff options
context:
space:
mode:
authorChris Feng <chris.w.feng@gmail.com>2019-08-25T00·00+0000
committerChris Feng <chris.w.feng@gmail.com>2019-08-25T00·00+0000
commit5505cff826b361d5d0090a6314891005595e3279 (patch)
tree18ed9005bb3f1739c878a947312309f164094a78
parent5b9f4b0851d27e8132a930dfbfec0b94099a4c9f (diff)
Fix a lock issue with _NET_CLOSE_WINDOW and WM_DELETE_WINDOW
* exwm.el (exwm--on-ClientMessage): Calling `kill-buffer' directly
from an event context won't work since the DestroyNotify event for a
WM_DELETE_WINDOW request won't be handled until the current event
context terminates.

* exwm-manage.el (exwm-manage--kill-buffer-query-function): Avoid
potential side effects with MapWindow.
-rw-r--r--exwm-manage.el6
-rw-r--r--exwm.el5
2 files changed, 7 insertions, 4 deletions
diff --git a/exwm-manage.el b/exwm-manage.el
index 797fc15cc678..deb475d53a4c 100644
--- a/exwm-manage.el
+++ b/exwm-manage.el
@@ -513,8 +513,10 @@ manager is shutting down."
   (catch 'return
     (when (or (not exwm--id)
               (xcb:+request-checked+request-check exwm--connection
-                  (make-instance 'xcb:MapWindow
-                                 :window exwm--id)))
+                  (make-instance 'xcb:ChangeWindowAttributes
+                                 :window exwm--id
+                                 :value-mask xcb:CW:EventMask
+                                 :event-mask (exwm--get-client-event-mask))))
       ;; The X window is no longer alive so just close the buffer.
       (when exwm--floating-frame
         (let ((window (frame-parameter exwm--floating-frame 'exwm-outer-id))
diff --git a/exwm.el b/exwm.el
index 9ebfabf9e817..8ea4a7636f86 100644
--- a/exwm.el
+++ b/exwm.el
@@ -420,7 +420,8 @@
     (setq type (slot-value obj 'type)
           id (slot-value obj 'window)
           data (slot-value (slot-value obj 'data) 'data32))
-    (exwm--log "atom=%s(%s)" (x-get-atom-name type exwm-workspace--current) type)
+    (exwm--log "atom=%s(%s)" (x-get-atom-name type exwm-workspace--current)
+               type)
     (cond
      ;; _NET_NUMBER_OF_DESKTOPS.
      ((= type xcb:Atom:_NET_NUMBER_OF_DESKTOPS)
@@ -459,7 +460,7 @@
      ((= type xcb:Atom:_NET_CLOSE_WINDOW)
       (let ((buffer (exwm--id->buffer id)))
         (when (buffer-live-p buffer)
-          (kill-buffer buffer))))
+          (exwm--defer 0 #'kill-buffer buffer))))
      ;; _NET_WM_MOVERESIZE
      ((= type xcb:Atom:_NET_WM_MOVERESIZE)
       (let ((direction (elt data 2))