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 from-configure) obj
 | 
					    (with-slots (window) obj
 | 
				
			||||||
        (unless from-configure          ;the parent is being resized
 | 
					 | 
				
			||||||
      (exwm--log "UnmapNotify from #x%x" window)
 | 
					      (exwm--log "UnmapNotify from #x%x" window)
 | 
				
			||||||
          (exwm-manage--unmanage-window window t))))))
 | 
					      (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…
	
	Add table
		Add a link
		
	
		Reference in a new issue