aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuanma Barranquero2014-02-17 17:01:43 +0100
committerJuanma Barranquero2014-02-17 17:01:43 +0100
commitc64633402e631a92245083c94d970d23547ce2f7 (patch)
tree91f02552de5dcc03bec9a891baced13901bd66d9
parent94912b884586d2b0258a33b793959c13ee34656c (diff)
downloademacs-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/ChangeLog6
-rw-r--r--lisp/frameset.el51
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 @@
12014-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
12014-02-17 Stefan Monnier <monnier@iro.umontreal.ca> 72014-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.
1209Called from `jump-to-register'. Internal use only." 1213Called 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)