aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuanma Barranquero2013-06-27 11:08:14 +0200
committerJuanma Barranquero2013-06-27 11:08:14 +0200
commit39c0e36f24cb09de612d07ed7e0bbe7e67a7a4ff (patch)
tree275d4f41bf741731992ad89da0f1e8c89f363404
parent7f13406b7ab86bc497f9e81abc1eb832507ac46e (diff)
downloademacs-39c0e36f24cb09de612d07ed7e0bbe7e67a7a4ff.tar.gz
emacs-39c0e36f24cb09de612d07ed7e0bbe7e67a7a4ff.zip
New experimental feature to save&restore window and frame setup.
* etc/NEWS: Document new Desktop option `desktop-save-windows'. * lisp/desktop.el (desktop-save-windows): New defcustom. (desktop--saved-states): New var. (desktop--excluded-frame-parameters): New defconst. (desktop--filter-frame-parms, desktop--find-frame-in-display) (desktop--restore-windows, desktop--save-windows): New functions. (desktop-save): Call `desktop--save-windows'. (desktop-read): Call `desktop--restore-windows'.
-rw-r--r--etc/ChangeLog4
-rw-r--r--etc/NEWS3
-rw-r--r--lisp/ChangeLog11
-rw-r--r--lisp/desktop.el80
4 files changed, 98 insertions, 0 deletions
diff --git a/etc/ChangeLog b/etc/ChangeLog
index c8748396f60..93ba05bc377 100644
--- a/etc/ChangeLog
+++ b/etc/ChangeLog
@@ -1,3 +1,7 @@
12013-06-27 Juanma Barranquero <lekktu@gmail.com>
2
3 * NEWS: Document new Desktop option `desktop-save-windows'.
4
12013-06-27 Stephen Berman <stephen.berman@gmx.net> 52013-06-27 Stephen Berman <stephen.berman@gmx.net>
2 6
3 * NEWS: Mention new version of todo-mode.el and obsoleting and 7 * NEWS: Mention new version of todo-mode.el and obsoleting and
diff --git a/etc/NEWS b/etc/NEWS
index 85cf3b80acd..f5ab7c60ce5 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -237,6 +237,9 @@ on the given date.
237*** `desktop-auto-save-timeout' defines the number of seconds between 237*** `desktop-auto-save-timeout' defines the number of seconds between
238auto-saves of the desktop. 238auto-saves of the desktop.
239 239
240*** `desktop-save-windows' enables saving and restoring the window/frame
241configuration.
242
240** Dired 243** Dired
241 244
242*** New minor mode `dired-hide-details-mode' hides details. 245*** New minor mode `dired-hide-details-mode' hides details.
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 4c0952f88f5..2c36162b017 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,14 @@
12013-06-27 Juanma Barranquero <lekktu@gmail.com>
2
3 New experimental feature to save&restore window and frame setup.
4 * desktop.el (desktop-save-windows): New defcustom.
5 (desktop--saved-states): New var.
6 (desktop--excluded-frame-parameters): New defconst.
7 (desktop--filter-frame-parms, desktop--find-frame-in-display)
8 (desktop--restore-windows, desktop--save-windows): New functions.
9 (desktop-save): Call `desktop--save-windows'.
10 (desktop-read): Call `desktop--restore-windows'.
11
12013-06-27 Lars Magne Ingebrigtsen <larsi@gnus.org> 122013-06-27 Lars Magne Ingebrigtsen <larsi@gnus.org>
2 13
3 * net/shr.el (add-face-text-property): Removed compat definition. 14 * net/shr.el (add-face-text-property): Removed compat definition.
diff --git a/lisp/desktop.el b/lisp/desktop.el
index 8e66a9b81a3..68c2b26b5d7 100644
--- a/lisp/desktop.el
+++ b/lisp/desktop.el
@@ -371,6 +371,12 @@ modes are restored automatically; they should not be listed here."
371 :type '(repeat symbol) 371 :type '(repeat symbol)
372 :group 'desktop) 372 :group 'desktop)
373 373
374(defcustom desktop-save-windows nil
375 "When non-nil, save window/frame configuration to desktop file."
376 :type 'boolean
377 :group 'desktop
378 :version "24.4")
379
374(defcustom desktop-file-name-format 'absolute 380(defcustom desktop-file-name-format 'absolute
375 "Format in which desktop file names should be saved. 381 "Format in which desktop file names should be saved.
376Possible values are: 382Possible values are:
@@ -556,6 +562,9 @@ DIRNAME omitted or nil means use `desktop-dirname'."
556 "Checksum of the last auto-saved contents of the desktop file. 562 "Checksum of the last auto-saved contents of the desktop file.
557Used to avoid writing contents unchanged between auto-saves.") 563Used to avoid writing contents unchanged between auto-saves.")
558 564
565(defvar desktop--saved-states nil
566 "Internal use only.")
567
559;; ---------------------------------------------------------------------------- 568;; ----------------------------------------------------------------------------
560;; Desktop file conflict detection 569;; Desktop file conflict detection
561(defvar desktop-file-modtime nil 570(defvar desktop-file-modtime nil
@@ -858,6 +867,42 @@ DIRNAME must be the directory in which the desktop file will be saved."
858 867
859 868
860;; ---------------------------------------------------------------------------- 869;; ----------------------------------------------------------------------------
870(defconst desktop--excluded-frame-parameters
871 '(buffer-list
872 buffer-predicate
873 buried-buffer-list
874 explicit-name
875 font-backend
876 minibuffer
877 name
878 outer-window-id
879 parent-id
880 window-id
881 window-system)
882 "Frame parameters not saved or restored.")
883
884(defun desktop--filter-frame-parms (frame)
885 "Return frame parameters of FRAME.
886Parameters in `desktop--excluded-frame-parameters' are excluded.
887Internal use only."
888 (let (params)
889 (dolist (param (frame-parameters frame))
890 (unless (memq (car param) desktop--excluded-frame-parameters)
891 (push param params)))
892 params))
893
894(defun desktop--save-windows ()
895 "Save window/frame state, as a global variable.
896Intended to be called from `desktop-save'.
897Internal use only."
898 (setq desktop--saved-states
899 (and desktop-save-windows
900 (mapcar (lambda (frame)
901 (cons (desktop--filter-frame-parms frame)
902 (window-state-get (frame-root-window frame) t)))
903 (frame-list))))
904 (desktop-outvar 'desktop--saved-states))
905
861;;;###autoload 906;;;###autoload
862(defun desktop-save (dirname &optional release auto-save) 907(defun desktop-save (dirname &optional release auto-save)
863 "Save the desktop in a desktop file. 908 "Save the desktop in a desktop file.
@@ -896,6 +941,9 @@ and don't save the buffer if they are the same."
896 (save-excursion (run-hooks 'desktop-save-hook)) 941 (save-excursion (run-hooks 'desktop-save-hook))
897 (goto-char (point-max)) 942 (goto-char (point-max))
898 (insert "\n;; Global section:\n") 943 (insert "\n;; Global section:\n")
944 ;; Called here because we save the window/frame state as a global
945 ;; variable for compatibility with previous Emacsen.
946 (desktop--save-windows)
899 (mapc (function desktop-outvar) desktop-globals-to-save) 947 (mapc (function desktop-outvar) desktop-globals-to-save)
900 (when (memq 'kill-ring desktop-globals-to-save) 948 (when (memq 'kill-ring desktop-globals-to-save)
901 (insert 949 (insert
@@ -954,6 +1002,37 @@ This function also sets `desktop-dirname' to nil."
954(defvar desktop-lazy-timer nil) 1002(defvar desktop-lazy-timer nil)
955 1003
956;; ---------------------------------------------------------------------------- 1004;; ----------------------------------------------------------------------------
1005(defun desktop--find-frame-in-display (frames display)
1006 (let (result)
1007 (while (and frames (not result))
1008 (if (equal display (frame-parameter (car frames) 'display))
1009 (setq result (car frames))
1010 (setq frames (cdr frames))))
1011 result))
1012
1013(defun desktop--restore-windows ()
1014 "Restore window/frame configuration.
1015Internal use only."
1016 (when (and desktop-save-windows desktop--saved-states)
1017 (condition-case nil
1018 (let ((frames (frame-list)))
1019 (dolist (state desktop--saved-states)
1020 (let* ((fconfig (car state))
1021 (display (cdr (assq 'display fconfig)))
1022 (frame (desktop--find-frame-in-display frames display)))
1023 (if (not frame)
1024 ;; no frames in the display -- make a new one
1025 (setq frame (make-frame-on-display display fconfig))
1026 ;; found one -- reuse and remove from list
1027 (setq frames (delq frame frames))
1028 (modify-frame-parameters frame fconfig))
1029 ;; restore windows
1030 (window-state-put (cdr state) (frame-root-window frame) 'safe)))
1031 ;; delete any remaining frames
1032 (mapc #'delete-frame frames))
1033 (error
1034 (message "Error loading window configuration from desktop file")))))
1035
957;;;###autoload 1036;;;###autoload
958(defun desktop-read (&optional dirname) 1037(defun desktop-read (&optional dirname)
959 "Read and process the desktop file in directory DIRNAME. 1038 "Read and process the desktop file in directory DIRNAME.
@@ -1022,6 +1101,7 @@ Using it may cause conflicts. Use it anyway? " owner)))))
1022 (switch-to-buffer (car (buffer-list))) 1101 (switch-to-buffer (car (buffer-list)))
1023 (run-hooks 'desktop-delay-hook) 1102 (run-hooks 'desktop-delay-hook)
1024 (setq desktop-delay-hook nil) 1103 (setq desktop-delay-hook nil)
1104 (desktop--restore-windows)
1025 (run-hooks 'desktop-after-read-hook) 1105 (run-hooks 'desktop-after-read-hook)
1026 (message "Desktop: %d buffer%s restored%s%s." 1106 (message "Desktop: %d buffer%s restored%s%s."
1027 desktop-buffer-ok-count 1107 desktop-buffer-ok-count