mirror of
https://github.com/emacs-exwm/exwm.git
synced 2024-11-27 14:57:59 +01:00
Fix bugs on managing/unmanaging X windows
* exwm-manage.el (exwm-manage--scan): Unmap X windows before managing them. (exwm-manage--on-UnmapNotify): Do not ignore synthetic UnmapNotify events (according to ICCCM). Do not use the `from-configure' slot which was mistakenly introduced due to the bug in `exwm-manage--scan'. * exwm-workspace.el (exwm-workspace--confirm-kill-emacs): Do more cleanups.
This commit is contained in:
parent
fb9bfd2911
commit
35d04c3468
2 changed files with 27 additions and 10 deletions
|
@ -171,8 +171,6 @@ corresponding buffer.")
|
||||||
(make-instance 'xcb:ConfigureWindow
|
(make-instance 'xcb:ConfigureWindow
|
||||||
:window id :value-mask xcb:ConfigWindow:BorderWidth
|
:window id :value-mask xcb:ConfigWindow:BorderWidth
|
||||||
:border-width 0))
|
:border-width 0))
|
||||||
;; (xcb:+request exwm--connection ;map the window
|
|
||||||
;; (make-instance 'xcb:MapWindow :window id))
|
|
||||||
(dolist (button ;grab buttons to set focus / move / resize
|
(dolist (button ;grab buttons to set focus / move / resize
|
||||||
(list xcb:ButtonIndex:1 xcb:ButtonIndex:2 xcb:ButtonIndex:3))
|
(list xcb:ButtonIndex:1 xcb:ButtonIndex:2 xcb:ButtonIndex:3))
|
||||||
(xcb:+request-checked+request-check exwm--connection
|
(xcb:+request-checked+request-check exwm--connection
|
||||||
|
@ -272,6 +270,9 @@ corresponding buffer.")
|
||||||
(xcb:+request-unchecked+reply exwm--connection
|
(xcb:+request-unchecked+reply exwm--connection
|
||||||
(make-instance 'xcb:GetWindowAttributes :window i))
|
(make-instance 'xcb:GetWindowAttributes :window i))
|
||||||
(when (and (= 0 override-redirect) (= xcb:MapState:Viewable map-state))
|
(when (and (= 0 override-redirect) (= xcb:MapState:Viewable map-state))
|
||||||
|
(xcb:+request exwm--connection
|
||||||
|
(make-instance 'xcb:UnmapWindow :window i))
|
||||||
|
(xcb:flush exwm--connection)
|
||||||
(exwm-manage--manage-window i))))))
|
(exwm-manage--manage-window i))))))
|
||||||
|
|
||||||
(defvar exwm-manage--ping-lock nil
|
(defvar exwm-manage--ping-lock nil
|
||||||
|
@ -417,15 +418,13 @@ Would you like to kill it? "
|
||||||
(exwm--log "MapRequest from #x%x" window)
|
(exwm--log "MapRequest from #x%x" window)
|
||||||
(exwm-manage--manage-window window))))))
|
(exwm-manage--manage-window window))))))
|
||||||
|
|
||||||
(defun exwm-manage--on-UnmapNotify (data synthetic)
|
(defun exwm-manage--on-UnmapNotify (data _synthetic)
|
||||||
"Handle UnmapNotify event."
|
"Handle UnmapNotify event."
|
||||||
(unless synthetic
|
(let ((obj (make-instance 'xcb:UnmapNotify)))
|
||||||
(let ((obj (make-instance 'xcb:UnmapNotify)))
|
(xcb:unmarshal obj data)
|
||||||
(xcb:unmarshal obj data)
|
(with-slots (window) obj
|
||||||
(with-slots (window from-configure) obj
|
(exwm--log "UnmapNotify from #x%x" window)
|
||||||
(unless from-configure ;the parent is being resized
|
(exwm-manage--unmanage-window window t))))
|
||||||
(exwm--log "UnmapNotify from #x%x" window)
|
|
||||||
(exwm-manage--unmanage-window window t))))))
|
|
||||||
|
|
||||||
(defun exwm-manage--on-DestroyNotify (data synthetic)
|
(defun exwm-manage--on-DestroyNotify (data synthetic)
|
||||||
"Handle DestroyNotify event."
|
"Handle DestroyNotify event."
|
||||||
|
|
|
@ -462,11 +462,29 @@ This functions is modified from `display-buffer-reuse-window' and
|
||||||
(0 (y-or-n-p prompt))
|
(0 (y-or-n-p prompt))
|
||||||
(x (yes-or-no-p (format "[EXWM] %d window%s currently alive. %s"
|
(x (yes-or-no-p (format "[EXWM] %d window%s currently alive. %s"
|
||||||
x (if (= x 1) "" "s") prompt))))
|
x (if (= x 1) "" "s") prompt))))
|
||||||
|
;; Remove SubstructureRedirect event.
|
||||||
|
(xcb:+request exwm--connection
|
||||||
|
(make-instance 'xcb:ChangeWindowAttributes
|
||||||
|
:window exwm--root :value-mask xcb:CW:EventMask
|
||||||
|
:event-mask 0))
|
||||||
|
;; Remove the _NET_SUPPORTING_WM_CHECK X window.
|
||||||
|
(with-slots (value)
|
||||||
|
(xcb:+request-unchecked+reply exwm--connection
|
||||||
|
(make-instance 'xcb:ewmh:get-_NET_SUPPORTING_WM_CHECK
|
||||||
|
:window exwm--root))
|
||||||
|
(xcb:+request exwm--connection
|
||||||
|
(make-instance 'xcb:DeleteProperty
|
||||||
|
:window exwm--root
|
||||||
|
:property xcb:Atom:_NET_SUPPORTING_WM_CHECK))
|
||||||
|
(xcb:+request exwm--connection
|
||||||
|
(make-instance 'xcb:DestroyWindow :window value)))
|
||||||
|
;; Unmanage all X windows.
|
||||||
(dolist (i exwm--id-buffer-alist)
|
(dolist (i exwm--id-buffer-alist)
|
||||||
(exwm-manage--unmanage-window (car i) t)
|
(exwm-manage--unmanage-window (car i) t)
|
||||||
(xcb:+request exwm--connection
|
(xcb:+request exwm--connection
|
||||||
(make-instance 'xcb:MapWindow :window (car i))))
|
(make-instance 'xcb:MapWindow :window (car i))))
|
||||||
(xcb:flush exwm--connection)
|
(xcb:flush exwm--connection)
|
||||||
|
(xcb:disconnect exwm--connection)
|
||||||
t))
|
t))
|
||||||
|
|
||||||
(defun exwm-workspace--init ()
|
(defun exwm-workspace--init ()
|
||||||
|
|
Loading…
Reference in a new issue