diff options
| -rw-r--r-- | lisp/ChangeLog | 11 | ||||
| -rw-r--r-- | lisp/desktop.el | 80 |
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 @@ | |||
| 1 | 2013-07-21 Juanma Barranquero <lekktu@gmail.com> | 1 | 2013-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. |
| 579 | Used to avoid writing contents unchanged between auto-saves.") | 579 | Used 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. |
| 583 | Only 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'." |
| 1082 | Intended to be called from `desktop-save'. | 1083 | (setq desktop-saved-frame-states |
| 1083 | Internal 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. |
| 1323 | Internal use only." | 1327 | This function depends on the value of `desktop-saved-frame-states' |
| 1324 | (when (and desktop-restore-frames desktop--saved-states) | 1328 | being 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) |