aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuanma Barranquero2013-07-01 05:29:46 +0200
committerJuanma Barranquero2013-07-01 05:29:46 +0200
commit2addf9226a04194010742975a2203e53aa8d7c79 (patch)
treea57a71e313950b80048dee2899372e4f4f359e8f
parent7a3518fa7b08df1b0c824ea39529ecaf26bbc0a6 (diff)
downloademacs-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/NEWS2
-rw-r--r--lisp/ChangeLog13
-rw-r--r--lisp/desktop.el60
3 files changed, 53 insertions, 22 deletions
diff --git a/etc/NEWS b/etc/NEWS
index 3a8ef2314a8..f83d82417dd 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -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
253auto-saves of the desktop. 253auto-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
256configuration. 256configuration.
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 @@
12013-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
12013-06-30 Michal Nazarewicz <mina86@mina86.com> 142013-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.
382Otherwise 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.
382Possible values are: 389Possible 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.
896Intended to be called from `desktop-save'. 904Intended to be called from `desktop-save'.
897Internal use only." 905Internal 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.
1029Internal use only." 1043Internal 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