From 3539c4a0e89622137f72f2d107daa1bb074b7994 Mon Sep 17 00:00:00 2001 From: Juri Linkov Date: Fri, 23 Apr 2010 21:00:02 +0300 Subject: [PATCH] Make desktop.el save the frame configurations with window configurations. --- etc/TODO | 3 --- lisp/desktop.el | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/etc/TODO b/etc/TODO index f21d105b2cd..85d81c16843 100644 --- a/etc/TODO +++ b/etc/TODO @@ -381,9 +381,6 @@ typically due to pilot errors and should thus be in debug-ignored-errors. ** Give start-process the ability to direct standard-error output to a different filter. -** Make desktop.el save the "frame configuration" of Emacs (in some - useful sense). - ** Give desktop.el a feature to switch between different named desktops. diff --git a/lisp/desktop.el b/lisp/desktop.el index 0e6153cfe47..e6864ac1efd 100644 --- a/lisp/desktop.el +++ b/lisp/desktop.el @@ -128,7 +128,6 @@ ;; --------------------------------------------------------------------------- ;; TODO: ;; -;; Save window configuration. ;; Recognize more minor modes. ;; Save mark rings. @@ -366,6 +365,12 @@ Possible values are: :group 'desktop :version "22.1") +(defcustom desktop-save-frame-configuration nil + "Save states of all frames with their window configurations." + :type 'boolean + :group 'desktop + :version "24.1") + (defcustom desktop-restore-eager t "Number of buffers to restore immediately. Remaining buffers are restored lazily (when Emacs is idle). @@ -692,6 +697,12 @@ is nil, ask the user where to save the desktop." (setq locals (cdr locals))) ll))) +(defun desktop-frame-info (frame) + (list + frame + (frame-parameters frame) + (current-window-configuration-to-sexp frame))) + ;; ---------------------------------------------------------------------------- (defun desktop-internal-v2s (value) "Convert VALUE to a pair (QUOTE . TXT); (eval (read TXT)) gives VALUE. @@ -831,6 +842,10 @@ MODE is the major mode. (null dired-skip) ; bug#5755 (with-current-buffer bufname desktop-save-buffer)))))) +(defun desktop-save-frame-p (parameters window-configuration) + "Return t if FRAME should have its state saved in the desktop file." + t) + ;; ---------------------------------------------------------------------------- (defun desktop-file-name (filename dirname) "Convert FILENAME to format specified in `desktop-file-name-format'. @@ -913,6 +928,20 @@ See also `desktop-base-file-name'." (insert "\n " (desktop-value-to-string e))) (insert ")\n\n")))) + (when desktop-save-frame-configuration + (dolist (l (mapcar 'desktop-frame-info (frame-list))) + (let ((frame (pop l))) + (when (apply 'desktop-save-frame-p l) + (insert "(" + (if (eq frame (selected-frame)) + "desktop-set-frame" + "desktop-create-frame") + " " + desktop-file-version) + (dolist (e l) + (insert "\n " (desktop-value-to-string e))) + (insert ")\n\n"))))) + (setq default-directory desktop-dirname) (let ((coding-system-for-write 'emacs-mule)) (write-region (point-min) (point-max) (desktop-full-file-name) nil 'nomessage)) @@ -1211,6 +1240,14 @@ directory DIRNAME." (makunbound this))) (setq desktop-buffer-locals (cdr desktop-buffer-locals))))))) +(defun desktop-create-frame (desktop-file-version parameters window-configuration) + (make-frame parameters) + (set-window-configuration-from-sexp window-configuration)) + +(defun desktop-set-frame (desktop-file-version parameters window-configuration) + (modify-frame-parameters nil parameters) + (set-window-configuration-from-sexp window-configuration)) + ;; ---------------------------------------------------------------------------- ;; Backward compatibility -- update parameters to 205 standards. (defun desktop-buffer (desktop-buffer-file-name desktop-buffer-name -- 2.39.5