aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/ChangeLog11
-rw-r--r--lisp/desktop.el80
2 files changed, 55 insertions, 36 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 46003a9e0dc..ebd7996801b 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,5 +1,16 @@
12013-07-21 Juanma Barranquero <lekktu@gmail.com> 12013-07-21 Juanma Barranquero <lekktu@gmail.com>
2 2
3 * desktop.el (desktop-saved-frame-states):
4 Rename from desktop--saved-states; all users changed.
5 (desktop-save-frames): Rename from desktop--save-frames.
6 Do not save state to desktop file.
7 (desktop-save): Save desktop-saved-frame-states to desktop file
8 and reset to nil.
9 (desktop-restoring-frames-p): New function.
10 (desktop-restore-frames): Use it. Rename from desktop--restore-frames.
11 (desktop-read): Use desktop-restoring-frames-p. Do not try to fix
12 buffer-lists when restoring frames. Suggested by Martin Rudalics.
13
3 * desktop.el: Correctly restore iconified frames. 14 * desktop.el: Correctly restore iconified frames.
4 (desktop--filter-iconified-position): New function. 15 (desktop--filter-iconified-position): New function.
5 (desktop-filter-parameters-alist): Add entries for `top' and `left'. 16 (desktop-filter-parameters-alist): Add entries for `top' and `left'.
diff --git a/lisp/desktop.el b/lisp/desktop.el
index e8fe742617e..0f2ed2316fe 100644
--- a/lisp/desktop.el
+++ b/lisp/desktop.el
@@ -578,8 +578,9 @@ DIRNAME omitted or nil means use `desktop-dirname'."
578 "Checksum of the last auto-saved contents of the desktop file. 578 "Checksum of the last auto-saved contents of the desktop file.
579Used to avoid writing contents unchanged between auto-saves.") 579Used to avoid writing contents unchanged between auto-saves.")
580 580
581(defvar desktop--saved-states nil 581(defvar desktop-saved-frame-states nil
582 "Saved window/frame state. Internal use only.") 582 "Saved state of all frames.
583Only valid during frame saving & restoring; intended for internal use.")
583 584
584;; ---------------------------------------------------------------------------- 585;; ----------------------------------------------------------------------------
585;; Desktop file conflict detection 586;; Desktop file conflict detection
@@ -1077,20 +1078,16 @@ Internal use only."
1077 (this (cadr (frame-parameter mb-frame 'desktop-mini)))) 1078 (this (cadr (frame-parameter mb-frame 'desktop-mini))))
1078 (set-frame-parameter frame 'desktop-mini (list nil this nil))))))) 1079 (set-frame-parameter frame 'desktop-mini (list nil this nil)))))))
1079 1080
1080(defun desktop--save-frames () 1081(defun desktop-save-frames ()
1081 "Save window/frame state, as a global variable. 1082 "Save frame state in `desktop-saved-frame-states'."
1082Intended to be called from `desktop-save'. 1083 (setq desktop-saved-frame-states
1083Internal use only."
1084 (setq desktop--saved-states
1085 (and desktop-restore-frames 1084 (and desktop-restore-frames
1086 (progn 1085 (progn
1087 (desktop--save-minibuffer-frames) 1086 (desktop--save-minibuffer-frames)
1088 (mapcar (lambda (frame) 1087 (mapcar (lambda (frame)
1089 (cons (desktop--filter-frame-parms (frame-parameters frame) t) 1088 (cons (desktop--filter-frame-parms (frame-parameters frame) t)
1090 (window-state-get (frame-root-window frame) t))) 1089 (window-state-get (frame-root-window frame) t)))
1091 (frame-list))))) 1090 (frame-list))))))
1092 (unless (memq 'desktop--saved-states desktop-globals-to-save)
1093 (desktop-outvar 'desktop--saved-states)))
1094 1091
1095;;;###autoload 1092;;;###autoload
1096(defun desktop-save (dirname &optional release auto-save) 1093(defun desktop-save (dirname &optional release auto-save)
@@ -1132,8 +1129,11 @@ and don't save the buffer if they are the same."
1132 (insert "\n;; Global section:\n") 1129 (insert "\n;; Global section:\n")
1133 ;; Called here because we save the window/frame state as a global 1130 ;; Called here because we save the window/frame state as a global
1134 ;; variable for compatibility with previous Emacsen. 1131 ;; variable for compatibility with previous Emacsen.
1135 (desktop--save-frames) 1132 (desktop-save-frames)
1133 (unless (memq 'desktop-saved-frame-states desktop-globals-to-save)
1134 (desktop-outvar 'desktop-saved-frame-states))
1136 (mapc (function desktop-outvar) desktop-globals-to-save) 1135 (mapc (function desktop-outvar) desktop-globals-to-save)
1136 (setq desktop-saved-frame-states nil) ; after saving desktop-globals-to-save
1137 (when (memq 'kill-ring desktop-globals-to-save) 1137 (when (memq 'kill-ring desktop-globals-to-save)
1138 (insert 1138 (insert
1139 "(setq kill-ring-yank-pointer (nthcdr " 1139 "(setq kill-ring-yank-pointer (nthcdr "
@@ -1318,10 +1318,15 @@ its window state. Internal use only."
1318 ((null (car dm1)) nil) 1318 ((null (car dm1)) nil)
1319 (t (< (cadr dm1) (cadr dm2)))))) 1319 (t (< (cadr dm1) (cadr dm2))))))
1320 1320
1321(defun desktop--restore-frames () 1321(defun desktop-restoring-frames-p ()
1322 "True if calling `desktop-restore-frames' will actually restore frames."
1323 (and desktop-restore-frames desktop-saved-frame-states))
1324
1325(defun desktop-restore-frames ()
1322 "Restore window/frame configuration. 1326 "Restore window/frame configuration.
1323Internal use only." 1327This function depends on the value of `desktop-saved-frame-states'
1324 (when (and desktop-restore-frames desktop--saved-states) 1328being set (usually, by reading it from the desktop)."
1329 (when (desktop-restoring-frames-p)
1325 (let* ((frame-mb-map nil) ;; Alist of frames with their own minibuffer 1330 (let* ((frame-mb-map nil) ;; Alist of frames with their own minibuffer
1326 (visible nil) 1331 (visible nil)
1327 (delete-saved (eq desktop-restore-in-current-display 'delete)) 1332 (delete-saved (eq desktop-restore-in-current-display 'delete))
@@ -1330,12 +1335,13 @@ Internal use only."
1330 1335
1331 ;; Sorting saved states allows us to easily restore minibuffer-owning frames 1336 ;; Sorting saved states allows us to easily restore minibuffer-owning frames
1332 ;; before minibufferless ones. 1337 ;; before minibufferless ones.
1333 (setq desktop--saved-states (sort desktop--saved-states #'desktop--sort-states)) 1338 (setq desktop-saved-frame-states (sort desktop-saved-frame-states
1339 #'desktop--sort-states))
1334 ;; Potentially all existing frames are reusable. Later we will decide which ones 1340 ;; Potentially all existing frames are reusable. Later we will decide which ones
1335 ;; to reuse, and how to deal with any leftover. 1341 ;; to reuse, and how to deal with any leftover.
1336 (setq desktop--reuse-list (frame-list)) 1342 (setq desktop--reuse-list (frame-list))
1337 1343
1338 (dolist (state desktop--saved-states) 1344 (dolist (state desktop-saved-frame-states)
1339 (condition-case err 1345 (condition-case err
1340 (let* ((frame-cfg (car state)) 1346 (let* ((frame-cfg (car state))
1341 (window-cfg (cdr state)) 1347 (window-cfg (cdr state))
@@ -1465,16 +1471,17 @@ Using it may cause conflicts. Use it anyway? " owner)))))
1465 (file-error (message "Couldn't record use of desktop file") 1471 (file-error (message "Couldn't record use of desktop file")
1466 (sit-for 1)))) 1472 (sit-for 1))))
1467 1473
1468 ;; `desktop-create-buffer' puts buffers at end of the buffer list. 1474 (unless (desktop-restoring-frames-p)
1469 ;; We want buffers existing prior to evaluating the desktop (and 1475 ;; `desktop-create-buffer' puts buffers at end of the buffer list.
1470 ;; not reused) to be placed at the end of the buffer list, so we 1476 ;; We want buffers existing prior to evaluating the desktop (and
1471 ;; move them here. 1477 ;; not reused) to be placed at the end of the buffer list, so we
1472 (mapc 'bury-buffer 1478 ;; move them here.
1473 (nreverse (cdr (memq desktop-first-buffer (nreverse (buffer-list)))))) 1479 (mapc 'bury-buffer
1474 (switch-to-buffer (car (buffer-list))) 1480 (nreverse (cdr (memq desktop-first-buffer (nreverse (buffer-list))))))
1481 (switch-to-buffer (car (buffer-list))))
1475 (run-hooks 'desktop-delay-hook) 1482 (run-hooks 'desktop-delay-hook)
1476 (setq desktop-delay-hook nil) 1483 (setq desktop-delay-hook nil)
1477 (desktop--restore-frames) 1484 (desktop-restore-frames)
1478 (run-hooks 'desktop-after-read-hook) 1485 (run-hooks 'desktop-after-read-hook)
1479 (message "Desktop: %d buffer%s restored%s%s." 1486 (message "Desktop: %d buffer%s restored%s%s."
1480 desktop-buffer-ok-count 1487 desktop-buffer-ok-count
@@ -1486,18 +1493,19 @@ Using it may cause conflicts. Use it anyway? " owner)))))
1486 (format ", %d to restore lazily" 1493 (format ", %d to restore lazily"
1487 (length desktop-buffer-args-list)) 1494 (length desktop-buffer-args-list))
1488 "")) 1495 ""))
1489 ;; Bury the *Messages* buffer to not reshow it when burying 1496 (unless (desktop-restoring-frames-p)
1490 ;; the buffer we switched to above. 1497 ;; Bury the *Messages* buffer to not reshow it when burying
1491 (when (buffer-live-p (get-buffer "*Messages*")) 1498 ;; the buffer we switched to above.
1492 (bury-buffer "*Messages*")) 1499 (when (buffer-live-p (get-buffer "*Messages*"))
1493 ;; Clear all windows' previous and next buffers, these have 1500 (bury-buffer "*Messages*"))
1494 ;; been corrupted by the `switch-to-buffer' calls in 1501 ;; Clear all windows' previous and next buffers, these have
1495 ;; `desktop-restore-file-buffer' (bug#11556). This is a 1502 ;; been corrupted by the `switch-to-buffer' calls in
1496 ;; brute force fix and should be replaced by a more subtle 1503 ;; `desktop-restore-file-buffer' (bug#11556). This is a
1497 ;; strategy eventually. 1504 ;; brute force fix and should be replaced by a more subtle
1498 (walk-window-tree (lambda (window) 1505 ;; strategy eventually.
1499 (set-window-prev-buffers window nil) 1506 (walk-window-tree (lambda (window)
1500 (set-window-next-buffers window nil))) 1507 (set-window-prev-buffers window nil)
1508 (set-window-next-buffers window nil))))
1501 t)) 1509 t))
1502 ;; No desktop file found. 1510 ;; No desktop file found.
1503 (desktop-clear) 1511 (desktop-clear)