]> git.eshelyaron.com Git - emacs.git/commitdiff
Make desktop.el save the frame configurations with window configurations.
authorJuri Linkov <juri@jurta.org>
Fri, 23 Apr 2010 18:00:02 +0000 (21:00 +0300)
committerJuri Linkov <juri@jurta.org>
Fri, 23 Apr 2010 18:00:02 +0000 (21:00 +0300)
etc/TODO
lisp/desktop.el

index f21d105b2cd89b19c2152292c17a2d23d2484742..85d81c16843abfed6a184205dec886490f7de39e 100644 (file)
--- 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.
 
index 0e6153cfe47a4c68d73554554667bf6ba5ac8372..e6864ac1efdb7f77c008b4721730f1efec238ed1 100644 (file)
 ;; ---------------------------------------------------------------------------
 ;; 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