diff options
| author | Juanma Barranquero | 2014-02-17 17:01:43 +0100 |
|---|---|---|
| committer | Juanma Barranquero | 2014-02-17 17:01:43 +0100 |
| commit | c64633402e631a92245083c94d970d23547ce2f7 (patch) | |
| tree | 91f02552de5dcc03bec9a891baced13901bd66d9 | |
| parent | 94912b884586d2b0258a33b793959c13ee34656c (diff) | |
| download | emacs-c64633402e631a92245083c94d970d23547ce2f7.tar.gz emacs-c64633402e631a92245083c94d970d23547ce2f7.zip | |
lisp/frameset.el: Fix bug#16748.
* lisp/frameset.el (frameset-cfg-id): New function.
(frameset--reuse-frame, frameset-restore): Use it.
(frameset--jump-to-register): Try harder to reuse frames.
| -rw-r--r-- | lisp/ChangeLog | 6 | ||||
| -rw-r--r-- | lisp/frameset.el | 51 |
2 files changed, 40 insertions, 17 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index c6c4264bcba..27a0ffd30a5 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | 2014-02-17 Juanma Barranquero <lekktu@gmail.com> | ||
| 2 | |||
| 3 | * frameset.el (frameset-cfg-id): New function. | ||
| 4 | (frameset--reuse-frame, frameset-restore): Use it. | ||
| 5 | (frameset--jump-to-register): Try harder to reuse frames (bug#16748). | ||
| 6 | |||
| 1 | 2014-02-17 Stefan Monnier <monnier@iro.umontreal.ca> | 7 | 2014-02-17 Stefan Monnier <monnier@iro.umontreal.ca> |
| 2 | 8 | ||
| 3 | * ido.el (ido-file-internal): Remove unused var `d'. | 9 | * ido.el (ido-file-internal): Remove unused var `d'. |
diff --git a/lisp/frameset.el b/lisp/frameset.el index 7fd027e9a53..977cc8433d4 100644 --- a/lisp/frameset.el +++ b/lisp/frameset.el | |||
| @@ -682,6 +682,11 @@ Internal use only." | |||
| 682 | (mapconcat (lambda (n) (format "%04X" n)) | 682 | (mapconcat (lambda (n) (format "%04X" n)) |
| 683 | (cl-loop repeat 4 collect (random 65536)) | 683 | (cl-loop repeat 4 collect (random 65536)) |
| 684 | "-")))) | 684 | "-")))) |
| 685 | |||
| 686 | (defun frameset-cfg-id (frame-cfg) | ||
| 687 | "Return the frame id for frame configuration FRAME-CFG." | ||
| 688 | (cdr (assq 'frameset--id frame-cfg))) | ||
| 689 | |||
| 685 | ;;;###autoload | 690 | ;;;###autoload |
| 686 | (defun frameset-frame-id (frame) | 691 | (defun frameset-frame-id (frame) |
| 687 | "Return the frame id of FRAME, if it has one; else, return nil. | 692 | "Return the frame id of FRAME, if it has one; else, return nil. |
| @@ -900,7 +905,7 @@ is the parameter alist of the frame being restored. Internal use only." | |||
| 900 | (setq frame (frameset--find-frame-if | 905 | (setq frame (frameset--find-frame-if |
| 901 | (lambda (f id) | 906 | (lambda (f id) |
| 902 | (frameset-frame-id-equal-p f id)) | 907 | (frameset-frame-id-equal-p f id)) |
| 903 | display (cdr (assq 'frameset--id parameters)))) | 908 | display (frameset-cfg-id parameters))) |
| 904 | ;; If it has not been loaded, and it is not a minibuffer-only frame, | 909 | ;; If it has not been loaded, and it is not a minibuffer-only frame, |
| 905 | ;; let's look for an existing non-minibuffer-only frame to reuse. | 910 | ;; let's look for an existing non-minibuffer-only frame to reuse. |
| 906 | (unless (or frame (eq (cdr (assq 'minibuffer parameters)) 'only)) | 911 | (unless (or frame (eq (cdr (assq 'minibuffer parameters)) 'only)) |
| @@ -921,8 +926,7 @@ is the parameter alist of the frame being restored. Internal use only." | |||
| 921 | (frameset-frame-id-equal-p | 926 | (frameset-frame-id-equal-p |
| 922 | (window-frame (minibuffer-window f)) | 927 | (window-frame (minibuffer-window f)) |
| 923 | mini-id)))) | 928 | mini-id)))) |
| 924 | display | 929 | display (frameset-cfg-id parameters) (cdr mini)))) |
| 925 | (cdr (assq 'frameset--id parameters)) (cdr mini)))) | ||
| 926 | (t | 930 | (t |
| 927 | ;; Default to just finding a frame in the same display. | 931 | ;; Default to just finding a frame in the same display. |
| 928 | (setq frame (frameset--find-frame-if nil display)))) | 932 | (setq frame (frameset--find-frame-if nil display)))) |
| @@ -1136,7 +1140,7 @@ All keyword parameters default to nil." | |||
| 1136 | ;; frameset--id from the non-reusable frame, which is not useful anymore. | 1140 | ;; frameset--id from the non-reusable frame, which is not useful anymore. |
| 1137 | (when (and other-frames | 1141 | (when (and other-frames |
| 1138 | (or (eq reuse-frames :keep) (consp reuse-frames))) | 1142 | (or (eq reuse-frames :keep) (consp reuse-frames))) |
| 1139 | (let ((dup (frameset-frame-with-id (cdr (assq 'frameset--id frame-cfg)) | 1143 | (let ((dup (frameset-frame-with-id (frameset-cfg-id frame-cfg) |
| 1140 | other-frames))) | 1144 | other-frames))) |
| 1141 | (when dup | 1145 | (when dup |
| 1142 | (set-frame-parameter dup 'frameset--id nil)))) | 1146 | (set-frame-parameter dup 'frameset--id nil)))) |
| @@ -1207,20 +1211,33 @@ All keyword parameters default to nil." | |||
| 1207 | (defun frameset--jump-to-register (data) | 1211 | (defun frameset--jump-to-register (data) |
| 1208 | "Restore frameset from DATA stored in register. | 1212 | "Restore frameset from DATA stored in register. |
| 1209 | Called from `jump-to-register'. Internal use only." | 1213 | Called from `jump-to-register'. Internal use only." |
| 1210 | (let* ((delete (and current-prefix-arg t)) | 1214 | (let ((fs (aref data 0)) |
| 1211 | (iconify-list (if delete nil (frame-list)))) | 1215 | reuse-frames iconify-list) |
| 1212 | (frameset-restore (aref data 0) | 1216 | (if current-prefix-arg |
| 1217 | ;; Reuse all frames and delete any left unused | ||
| 1218 | (setq reuse-frames t) | ||
| 1219 | ;; Reuse matching frames and leave others to be iconified | ||
| 1220 | (setq iconify-list (frame-list)) | ||
| 1221 | (dolist (state (frameset-states fs)) | ||
| 1222 | (let ((frame (frameset-frame-with-id (frameset-cfg-id (car state)) | ||
| 1223 | iconify-list))) | ||
| 1224 | (when frame | ||
| 1225 | (push frame reuse-frames) | ||
| 1226 | (setq iconify-list (delq frame iconify-list)))))) | ||
| 1227 | (frameset-restore fs | ||
| 1213 | :filters frameset-session-filter-alist | 1228 | :filters frameset-session-filter-alist |
| 1214 | :reuse-frames (if delete t :keep)) | 1229 | :reuse-frames reuse-frames) |
| 1215 | (mapc #'iconify-frame iconify-list) | 1230 | (mapc #'iconify-frame iconify-list)) |
| 1216 | (let ((frame (frameset-frame-with-id (aref data 1))) | 1231 | |
| 1217 | buffer window) | 1232 | ;; Restore selected frame, buffer and point. |
| 1218 | (when frame | 1233 | (let ((frame (frameset-frame-with-id (aref data 1))) |
| 1219 | (select-frame-set-input-focus frame) | 1234 | buffer window) |
| 1220 | (when (and (buffer-live-p (setq buffer (marker-buffer (aref data 2)))) | 1235 | (when frame |
| 1221 | (window-live-p (setq window (get-buffer-window buffer frame)))) | 1236 | (select-frame-set-input-focus frame) |
| 1222 | (set-frame-selected-window frame window) | 1237 | (when (and (buffer-live-p (setq buffer (marker-buffer (aref data 2)))) |
| 1223 | (with-current-buffer buffer (goto-char (aref data 2)))))))) | 1238 | (window-live-p (setq window (get-buffer-window buffer frame)))) |
| 1239 | (set-frame-selected-window frame window) | ||
| 1240 | (with-current-buffer buffer (goto-char (aref data 2))))))) | ||
| 1224 | 1241 | ||
| 1225 | ;;;###autoload | 1242 | ;;;###autoload |
| 1226 | (defun frameset-to-register (register) | 1243 | (defun frameset-to-register (register) |