emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] trunk r116458: lisp/frameset.el: Fix bug#16748.


From: Juanma Barranquero
Subject: [Emacs-diffs] trunk r116458: lisp/frameset.el: Fix bug#16748.
Date: Mon, 17 Feb 2014 16:01:53 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 116458
revision-id: address@hidden
parent: address@hidden
fixes bug: http://debbugs.gnu.org/16748
committer: Juanma Barranquero <address@hidden>
branch nick: trunk
timestamp: Mon 2014-02-17 17:01:43 +0100
message:
  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.
modified:
  lisp/ChangeLog                 changelog-20091113204419-o5vbwnq5f7feedwu-1432
  lisp/frameset.el               frameset.el-20130802043218-tfwraxv1c2zlibpw-1
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2014-02-17 15:29:15 +0000
+++ b/lisp/ChangeLog    2014-02-17 16:01:43 +0000
@@ -1,3 +1,9 @@
+2014-02-17  Juanma Barranquero  <address@hidden>
+
+       * frameset.el (frameset-cfg-id): New function.
+       (frameset--reuse-frame, frameset-restore): Use it.
+       (frameset--jump-to-register): Try harder to reuse frames (bug#16748).
+
 2014-02-17  Stefan Monnier  <address@hidden>
 
        * ido.el (ido-file-internal): Remove unused var `d'.

=== modified file 'lisp/frameset.el'
--- a/lisp/frameset.el  2014-02-15 04:16:46 +0000
+++ b/lisp/frameset.el  2014-02-17 16:01:43 +0000
@@ -682,6 +682,11 @@
                         (mapconcat (lambda (n) (format "%04X" n))
                                    (cl-loop repeat 4 collect (random 65536))
                                    "-"))))
+
+(defun frameset-cfg-id (frame-cfg)
+  "Return the frame id for frame configuration FRAME-CFG."
+  (cdr (assq 'frameset--id frame-cfg)))
+
 ;;;###autoload
 (defun frameset-frame-id (frame)
   "Return the frame id of FRAME, if it has one; else, return nil.
@@ -900,7 +905,7 @@
           (setq frame (frameset--find-frame-if
                        (lambda (f id)
                          (frameset-frame-id-equal-p f id))
-                       display (cdr (assq 'frameset--id parameters))))
+                       display (frameset-cfg-id parameters)))
           ;; If it has not been loaded, and it is not a minibuffer-only frame,
           ;; let's look for an existing non-minibuffer-only frame to reuse.
           (unless (or frame (eq (cdr (assq 'minibuffer parameters)) 'only))
@@ -921,8 +926,7 @@
                                   (frameset-frame-id-equal-p
                                    (window-frame (minibuffer-window f))
                                    mini-id))))
-                       display
-                       (cdr (assq 'frameset--id parameters)) (cdr mini))))
+                       display (frameset-cfg-id parameters) (cdr mini))))
          (t
           ;; Default to just finding a frame in the same display.
           (setq frame (frameset--find-frame-if nil display))))
@@ -1136,7 +1140,7 @@
                  ;; frameset--id from the non-reusable frame, which is not 
useful anymore.
                  (when (and other-frames
                             (or (eq reuse-frames :keep) (consp reuse-frames)))
-                   (let ((dup (frameset-frame-with-id (cdr (assq 'frameset--id 
frame-cfg))
+                   (let ((dup (frameset-frame-with-id (frameset-cfg-id 
frame-cfg)
                                                       other-frames)))
                      (when dup
                        (set-frame-parameter dup 'frameset--id nil))))
@@ -1207,20 +1211,33 @@
 (defun frameset--jump-to-register (data)
   "Restore frameset from DATA stored in register.
 Called from `jump-to-register'.  Internal use only."
-  (let* ((delete (and current-prefix-arg t))
-        (iconify-list (if delete nil (frame-list))))
-    (frameset-restore (aref data 0)
+  (let ((fs (aref data 0))
+       reuse-frames iconify-list)
+    (if current-prefix-arg
+       ;; Reuse all frames and delete any left unused
+       (setq reuse-frames t)
+      ;; Reuse matching frames and leave others to be iconified
+      (setq iconify-list (frame-list))
+      (dolist (state (frameset-states fs))
+       (let ((frame (frameset-frame-with-id (frameset-cfg-id (car state))
+                                            iconify-list)))
+         (when frame
+           (push frame reuse-frames)
+           (setq iconify-list (delq frame iconify-list))))))
+    (frameset-restore fs
                      :filters frameset-session-filter-alist
-                     :reuse-frames (if delete t :keep))
-    (mapc #'iconify-frame iconify-list)
-    (let ((frame (frameset-frame-with-id (aref data 1)))
-         buffer window)
-      (when frame
-       (select-frame-set-input-focus frame)
-       (when (and (buffer-live-p (setq buffer (marker-buffer (aref data 2))))
-                  (window-live-p (setq window (get-buffer-window buffer 
frame))))
-         (set-frame-selected-window frame window)
-         (with-current-buffer buffer (goto-char (aref data 2))))))))
+                     :reuse-frames reuse-frames)
+    (mapc #'iconify-frame iconify-list))
+
+  ;; Restore selected frame, buffer and point.
+  (let ((frame (frameset-frame-with-id (aref data 1)))
+       buffer window)
+    (when frame
+      (select-frame-set-input-focus frame)
+      (when (and (buffer-live-p (setq buffer (marker-buffer (aref data 2))))
+                (window-live-p (setq window (get-buffer-window buffer frame))))
+       (set-frame-selected-window frame window)
+       (with-current-buffer buffer (goto-char (aref data 2)))))))
 
 ;;;###autoload
 (defun frameset-to-register (register)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]