diff options
| author | Juanma Barranquero | 2013-07-01 05:29:46 +0200 |
|---|---|---|
| committer | Juanma Barranquero | 2013-07-01 05:29:46 +0200 |
| commit | 2addf9226a04194010742975a2203e53aa8d7c79 (patch) | |
| tree | a57a71e313950b80048dee2899372e4f4f359e8f | |
| parent | 7a3518fa7b08df1b0c824ea39529ecaf26bbc0a6 (diff) | |
| download | emacs-2addf9226a04194010742975a2203e53aa8d7c79.tar.gz emacs-2addf9226a04194010742975a2203e53aa8d7c79.zip | |
lisp/desktop.el: More fixes to frame restoration.
(desktop-restore-frames): Rename from desktop-save-windows.
(desktop-restore-in-current-display): New customization option.
(desktop--excluded-frame-parameters): Add `font'.
(desktop--save-frames): Rename from desktop--save-windows.
(desktop--restore-in-this-display-p): New function.
(desktop--make-full-frame): Remove unwanted width/height from
full(width|height) frames.
(desktop--restore-frames): Rename from desktop--restore-windows.
Obey desktop-restore-current-display. Do not delete old frames or
select a new frame unless we were able to restore at least one frame.
| -rw-r--r-- | etc/NEWS | 2 | ||||
| -rw-r--r-- | lisp/ChangeLog | 13 | ||||
| -rw-r--r-- | lisp/desktop.el | 60 |
3 files changed, 53 insertions, 22 deletions
| @@ -252,7 +252,7 @@ on the given date. | |||
| 252 | *** `desktop-auto-save-timeout' defines the number of seconds between | 252 | *** `desktop-auto-save-timeout' defines the number of seconds between |
| 253 | auto-saves of the desktop. | 253 | auto-saves of the desktop. |
| 254 | 254 | ||
| 255 | *** `desktop-save-windows' enables saving and restoring the window/frame | 255 | *** `desktop-restore-frames enables saving and restoring the window/frame |
| 256 | configuration. | 256 | configuration. |
| 257 | 257 | ||
| 258 | ** Dired | 258 | ** Dired |
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 2a8649006dc..b27eb32246f 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,3 +1,16 @@ | |||
| 1 | 2013-07-01 Juanma Barranquero <lekktu@gmail.com> | ||
| 2 | |||
| 3 | * desktop.el (desktop-restore-frames): Rename from desktop-save-windows. | ||
| 4 | (desktop-restore-in-current-display): New customization option. | ||
| 5 | (desktop--excluded-frame-parameters): Add `font'. | ||
| 6 | (desktop--save-frames): Rename from desktop--save-windows. | ||
| 7 | (desktop--restore-in-this-display-p): New function. | ||
| 8 | (desktop--make-full-frame): Remove unwanted width/height from | ||
| 9 | full(width|height) frames. | ||
| 10 | (desktop--restore-frames): Rename from desktop--restore-windows. | ||
| 11 | Obey desktop-restore-current-display. Do not delete old frames or | ||
| 12 | select a new frame unless we were able to restore at least one frame. | ||
| 13 | |||
| 1 | 2013-06-30 Michal Nazarewicz <mina86@mina86.com> | 14 | 2013-06-30 Michal Nazarewicz <mina86@mina86.com> |
| 2 | 15 | ||
| 3 | * files.el (find-file-noselect): Simplify conditional expression. | 16 | * files.el (find-file-noselect): Simplify conditional expression. |
diff --git a/lisp/desktop.el b/lisp/desktop.el index 7d4ea20c210..2f4c2a8589c 100644 --- a/lisp/desktop.el +++ b/lisp/desktop.el | |||
| @@ -371,12 +371,19 @@ 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 | 374 | (defcustom desktop-restore-frames nil |
| 375 | "When non-nil, save window/frame configuration to desktop file." | 375 | "When non-nil, save window/frame configuration to desktop file." |
| 376 | :type 'boolean | 376 | :type 'boolean |
| 377 | :group 'desktop | 377 | :group 'desktop |
| 378 | :version "24.4") | 378 | :version "24.4") |
| 379 | 379 | ||
| 380 | (defcustom desktop-restore-in-current-display nil | ||
| 381 | "When non-nil, frames are restored in the current display. | ||
| 382 | Otherwise they are restored, if possible, in their original displays." | ||
| 383 | :type 'boolean | ||
| 384 | :group 'desktop | ||
| 385 | :version "24.4") | ||
| 386 | |||
| 380 | (defcustom desktop-file-name-format 'absolute | 387 | (defcustom desktop-file-name-format 'absolute |
| 381 | "Format in which desktop file names should be saved. | 388 | "Format in which desktop file names should be saved. |
| 382 | Possible values are: | 389 | Possible values are: |
| @@ -872,6 +879,7 @@ DIRNAME must be the directory in which the desktop file will be saved." | |||
| 872 | buffer-predicate | 879 | buffer-predicate |
| 873 | buried-buffer-list | 880 | buried-buffer-list |
| 874 | explicit-name | 881 | explicit-name |
| 882 | font | ||
| 875 | font-backend | 883 | font-backend |
| 876 | minibuffer | 884 | minibuffer |
| 877 | name | 885 | name |
| @@ -891,12 +899,12 @@ Internal use only." | |||
| 891 | (push param params))) | 899 | (push param params))) |
| 892 | params)) | 900 | params)) |
| 893 | 901 | ||
| 894 | (defun desktop--save-windows () | 902 | (defun desktop--save-frames () |
| 895 | "Save window/frame state, as a global variable. | 903 | "Save window/frame state, as a global variable. |
| 896 | Intended to be called from `desktop-save'. | 904 | Intended to be called from `desktop-save'. |
| 897 | Internal use only." | 905 | Internal use only." |
| 898 | (setq desktop--saved-states | 906 | (setq desktop--saved-states |
| 899 | (and desktop-save-windows | 907 | (and desktop-restore-frames |
| 900 | (mapcar (lambda (frame) | 908 | (mapcar (lambda (frame) |
| 901 | (cons (desktop--filter-frame-parms frame) | 909 | (cons (desktop--filter-frame-parms frame) |
| 902 | (window-state-get (frame-root-window frame) t))) | 910 | (window-state-get (frame-root-window frame) t))) |
| @@ -944,7 +952,7 @@ and don't save the buffer if they are the same." | |||
| 944 | (insert "\n;; Global section:\n") | 952 | (insert "\n;; Global section:\n") |
| 945 | ;; Called here because we save the window/frame state as a global | 953 | ;; Called here because we save the window/frame state as a global |
| 946 | ;; variable for compatibility with previous Emacsen. | 954 | ;; variable for compatibility with previous Emacsen. |
| 947 | (desktop--save-windows) | 955 | (desktop--save-frames) |
| 948 | (mapc (function desktop-outvar) desktop-globals-to-save) | 956 | (mapc (function desktop-outvar) desktop-globals-to-save) |
| 949 | (when (memq 'kill-ring desktop-globals-to-save) | 957 | (when (memq 'kill-ring desktop-globals-to-save) |
| 950 | (insert | 958 | (insert |
| @@ -1003,6 +1011,10 @@ This function also sets `desktop-dirname' to nil." | |||
| 1003 | (defvar desktop-lazy-timer nil) | 1011 | (defvar desktop-lazy-timer nil) |
| 1004 | 1012 | ||
| 1005 | ;; ---------------------------------------------------------------------------- | 1013 | ;; ---------------------------------------------------------------------------- |
| 1014 | (defun desktop--restore-in-this-display-p () | ||
| 1015 | (or desktop-restore-in-current-display | ||
| 1016 | (and (eq system-type 'windows-nt) (not (display-graphic-p))))) | ||
| 1017 | |||
| 1006 | (defun desktop--find-frame-in-display (frames display) | 1018 | (defun desktop--find-frame-in-display (frames display) |
| 1007 | (let (result) | 1019 | (let (result) |
| 1008 | (while (and frames (not result)) | 1020 | (while (and frames (not result)) |
| @@ -1017,47 +1029,53 @@ This function also sets `desktop-dirname' to nil." | |||
| 1017 | (params '((visibility))) | 1029 | (params '((visibility))) |
| 1018 | frame) | 1030 | frame) |
| 1019 | (when width | 1031 | (when width |
| 1020 | (setq params (append `((user-size . t) (width . ,width)) params))) | 1032 | (setq params (append `((user-size . t) (width . ,width)) params) |
| 1033 | config (assq-delete-all 'height config))) | ||
| 1021 | (when height | 1034 | (when height |
| 1022 | (setq params (append `((user-size . t) (height . ,height)) params))) | 1035 | (setq params (append `((user-size . t) (height . ,height)) params) |
| 1036 | config (assq-delete-all 'width config))) | ||
| 1023 | (setq frame (make-frame-on-display display params)) | 1037 | (setq frame (make-frame-on-display display params)) |
| 1024 | (modify-frame-parameters frame config) | 1038 | (modify-frame-parameters frame config) |
| 1025 | frame)) | 1039 | frame)) |
| 1026 | 1040 | ||
| 1027 | (defun desktop--restore-windows () | 1041 | (defun desktop--restore-frames () |
| 1028 | "Restore window/frame configuration. | 1042 | "Restore window/frame configuration. |
| 1029 | Internal use only." | 1043 | Internal use only." |
| 1030 | (when (and desktop-save-windows desktop--saved-states) | 1044 | (when (and desktop-restore-frames desktop--saved-states) |
| 1031 | (let ((frames (frame-list)) | 1045 | (let ((frames (frame-list)) |
| 1046 | (current (frame-parameter nil 'display)) | ||
| 1032 | (selected nil)) | 1047 | (selected nil)) |
| 1033 | (dolist (state desktop--saved-states) | 1048 | (dolist (state desktop--saved-states) |
| 1034 | (condition-case err | 1049 | (condition-case err |
| 1035 | (let* ((fconfig (car state)) | 1050 | (let* ((config (car state)) |
| 1036 | (display (cdr (assq 'display fconfig))) | 1051 | (display (if (desktop--restore-in-this-display-p) |
| 1037 | (full (cdr (assq 'fullscreen fconfig))) | 1052 | (setcdr (assq 'display config) current) |
| 1053 | (cdr (assq 'display config)))) | ||
| 1054 | (full (cdr (assq 'fullscreen config))) | ||
| 1038 | (frame (and (not full) | 1055 | (frame (and (not full) |
| 1039 | (desktop--find-frame-in-display frames display)))) | 1056 | (desktop--find-frame-in-display frames display)))) |
| 1040 | (cond (full | 1057 | (cond (full |
| 1041 | ;; treat fullscreen/maximized frames specially | 1058 | ;; treat fullscreen/maximized frames specially |
| 1042 | (setq frame (desktop--make-full-frame full display fconfig))) | 1059 | (setq frame (desktop--make-full-frame full display config))) |
| 1043 | (frame | 1060 | (frame |
| 1044 | ;; found a frame in the right display -- reuse | 1061 | ;; found a frame in the right display -- reuse |
| 1045 | (setq frames (delq frame frames)) | 1062 | (setq frames (delq frame frames)) |
| 1046 | (modify-frame-parameters frame fconfig)) | 1063 | (modify-frame-parameters frame config)) |
| 1047 | (t | 1064 | (t |
| 1048 | ;; no frames in the display -- make a new one | 1065 | ;; no frames in the display -- make a new one |
| 1049 | (setq frame (make-frame-on-display display fconfig)))) | 1066 | (setq frame (make-frame-on-display display config)))) |
| 1050 | ;; restore windows | 1067 | ;; restore windows |
| 1051 | (window-state-put (cdr state) (frame-root-window frame) 'safe) | 1068 | (window-state-put (cdr state) (frame-root-window frame) 'safe) |
| 1052 | (unless selected (setq selected frame))) | 1069 | (unless selected (setq selected frame))) |
| 1053 | (error | 1070 | (error |
| 1054 | (message "Error restoring frame: %S" (error-message-string err))))) | 1071 | (message "Error restoring frame: %S" (error-message-string err))))) |
| 1055 | ;; make sure the original selected frame is visible and selected | 1072 | (when selected |
| 1056 | (unless (or (frame-parameter selected 'visibility) (daemonp)) | 1073 | ;; make sure the original selected frame is visible and selected |
| 1057 | (modify-frame-parameters selected '((visibility . t)))) | 1074 | (unless (or (frame-parameter selected 'visibility) (daemonp)) |
| 1058 | (select-frame-set-input-focus selected) | 1075 | (modify-frame-parameters selected '((visibility . t)))) |
| 1059 | ;; delete any remaining frames | 1076 | (select-frame-set-input-focus selected) |
| 1060 | (mapc #'delete-frame frames)))) | 1077 | ;; delete any remaining frames |
| 1078 | (mapc #'delete-frame frames))))) | ||
| 1061 | 1079 | ||
| 1062 | ;;;###autoload | 1080 | ;;;###autoload |
| 1063 | (defun desktop-read (&optional dirname) | 1081 | (defun desktop-read (&optional dirname) |
| @@ -1127,7 +1145,7 @@ Using it may cause conflicts. Use it anyway? " owner))))) | |||
| 1127 | (switch-to-buffer (car (buffer-list))) | 1145 | (switch-to-buffer (car (buffer-list))) |
| 1128 | (run-hooks 'desktop-delay-hook) | 1146 | (run-hooks 'desktop-delay-hook) |
| 1129 | (setq desktop-delay-hook nil) | 1147 | (setq desktop-delay-hook nil) |
| 1130 | (desktop--restore-windows) | 1148 | (desktop--restore-frames) |
| 1131 | (run-hooks 'desktop-after-read-hook) | 1149 | (run-hooks 'desktop-after-read-hook) |
| 1132 | (message "Desktop: %d buffer%s restored%s%s." | 1150 | (message "Desktop: %d buffer%s restored%s%s." |
| 1133 | desktop-buffer-ok-count | 1151 | desktop-buffer-ok-count |