diff options
| author | Juanma Barranquero | 2013-06-27 11:08:14 +0200 |
|---|---|---|
| committer | Juanma Barranquero | 2013-06-27 11:08:14 +0200 |
| commit | 39c0e36f24cb09de612d07ed7e0bbe7e67a7a4ff (patch) | |
| tree | 275d4f41bf741731992ad89da0f1e8c89f363404 | |
| parent | 7f13406b7ab86bc497f9e81abc1eb832507ac46e (diff) | |
| download | emacs-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/ChangeLog | 4 | ||||
| -rw-r--r-- | etc/NEWS | 3 | ||||
| -rw-r--r-- | lisp/ChangeLog | 11 | ||||
| -rw-r--r-- | lisp/desktop.el | 80 |
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 @@ | |||
| 1 | 2013-06-27 Juanma Barranquero <lekktu@gmail.com> | ||
| 2 | |||
| 3 | * NEWS: Document new Desktop option `desktop-save-windows'. | ||
| 4 | |||
| 1 | 2013-06-27 Stephen Berman <stephen.berman@gmx.net> | 5 | 2013-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 |
| @@ -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 |
| 238 | auto-saves of the desktop. | 238 | auto-saves of the desktop. |
| 239 | 239 | ||
| 240 | *** `desktop-save-windows' enables saving and restoring the window/frame | ||
| 241 | configuration. | ||
| 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 @@ | |||
| 1 | 2013-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 | |||
| 1 | 2013-06-27 Lars Magne Ingebrigtsen <larsi@gnus.org> | 12 | 2013-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. |
| 376 | Possible values are: | 382 | Possible 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. |
| 557 | Used to avoid writing contents unchanged between auto-saves.") | 563 | Used 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. | ||
| 886 | Parameters in `desktop--excluded-frame-parameters' are excluded. | ||
| 887 | Internal 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. | ||
| 896 | Intended to be called from `desktop-save'. | ||
| 897 | Internal 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. | ||
| 1015 | Internal 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 |