Add restart support

* exwm-input.el (exwm-input--exit): Cancel timers.

* exwm-manage.el (exwm-manage--manage-window): Add reparented X windows
to save-set.
* exwm-systemtray.el (exwm-systemtray--embed): Add embeded icons to
save-set.

* exwm-workspace.el (exwm-workspace--confirm-kill-emacs): No need to
unmanage; also hide Emacs frames; always call `exwm--exit'.

* exwm.el (exwm-restart): New command for restarting EXWM.
(exwm--exit-icccm-ewmh): New function for cleaning up ICCCM/EWMH
properties.
(exwm-exit-hook): Update doc string.
(exwm--exit): Call `exwm--exit-icccm-ewmh' and do not reset variables.
This commit is contained in:
Chris Feng 2016-07-30 19:01:33 +08:00
parent b87f4fbd71
commit 1e78045f95
5 changed files with 87 additions and 43 deletions

49
exwm.el
View file

@ -83,6 +83,20 @@
(exwm-layout--refresh)
(call-interactively #'exwm-input-grab-keyboard))))
;;;###autoload
(defun exwm-restart ()
"Restart EXWM."
(interactive)
(when (exwm-workspace--confirm-kill-emacs "[EXWM] Restart? ")
(server-force-delete)
(run-hooks 'kill-emacs-hook)
;; FIXME: more?
(apply #'call-process (car command-line-args) nil nil nil
(cdr command-line-args))
;; Kill this instance at last.
(let ((kill-emacs-hook nil))
(kill-emacs))))
(defun exwm--update-window-type (id &optional force)
"Update _NET_WM_WINDOW_TYPE."
(with-current-buffer (exwm--id->buffer id)
@ -597,6 +611,30 @@
:window i :data "EXWM"))))
(xcb:flush exwm--connection))
(defun exwm--exit-icccm-ewmh ()
"Remove ICCCM/EWMH properties."
(dolist (p (list
xcb:Atom:_NET_WM_NAME
xcb:Atom:_NET_SUPPORTED
xcb:Atom:_NET_CLIENT_LIST
xcb:Atom:_NET_CLIENT_LIST_STACKING
xcb:Atom:_NET_NUMBER_OF_DESKTOPS
xcb:Atom:_NET_DESKTOP_GEOMETRY
xcb:Atom:_NET_DESKTOP_VIEWPORT
xcb:Atom:_NET_CURRENT_DESKTOP
xcb:Atom:_NET_ACTIVE_WINDOW
xcb:Atom:_NET_WORKAREA
xcb:Atom:_NET_SUPPORTING_WM_CHECK
xcb:Atom:_NET_VIRTUAL_ROOTS
;; TODO: Keep this list synchronized with that in
;; `exwm--init-icccm-ewmh'.
))
(xcb:+request exwm--connection
(make-instance 'xcb:DeleteProperty
:window exwm--root
:property p))
(xcb:flush exwm--connection)))
(defvar exwm-init-hook nil
"Normal hook run when EXWM has just finished initialization.")
@ -643,10 +681,7 @@
(exwm-manage--scan)
(run-hooks 'exwm-init-hook)))))
(defvar exwm-exit-hook nil
"Normal hook run just before EXWM is about to exit.
This hook is only run when EXWM is started with emacsclient.")
(defvar exwm-exit-hook nil "Normal hook run just before EXWM exits.")
(defun exwm--exit ()
"Exit EXWM."
@ -657,11 +692,7 @@ This hook is only run when EXWM is started with emacsclient.")
(exwm-manage--exit)
(exwm-floating--exit)
(exwm-layout--exit)
;; Reset several import variables.
(setq exwm--connection nil
exwm--root nil
exwm--id-buffer-alist nil)
(exwm-enable))
(exwm--exit-icccm-ewmh))
(defvar exwm-blocking-subrs '(x-file-dialog x-popup-dialog x-select-font)
"Subrs (primitives) that would normally block EXWM.")