aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuanma Barranquero2013-08-14 15:41:02 +0200
committerJuanma Barranquero2013-08-14 15:41:02 +0200
commit14d1e4634c80f0ba07181efc3e5b251d3a92e182 (patch)
tree32039c481bb26d539cc9c89cc19f24199be6e3cb
parent62f33baed9e37213dc5164b27a968c42bb60b4a7 (diff)
downloademacs-14d1e4634c80f0ba07181efc3e5b251d3a92e182.tar.gz
emacs-14d1e4634c80f0ba07181efc3e5b251d3a92e182.zip
lisp/frameset.el: Allow orphaned minibufferless frames.
(frameset-filter-minibuffer): Deal with the case that the minibuffer parameter was already set in FILTERED. Doc fix. (frameset--record-minibuffer-relationships): Allow saving a minibufferless frame without its corresponding minibuffer frame. (frameset--reuse-frame): Accept a match from an orphaned minibufferless frame, if the frame id matches. (frameset--minibufferless-last-p): Sort non-orphaned minibufferless frames before orphaned ones. (frameset-restore): Warn about orphaned windows, instead of error out.
-rw-r--r--lisp/ChangeLog9
-rw-r--r--lisp/frameset.el81
2 files changed, 58 insertions, 32 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index b83a752f2eb..4b9ea280f98 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -2,6 +2,15 @@
2 2
3 * frameset.el (frameset--prop-setter): New function. 3 * frameset.el (frameset--prop-setter): New function.
4 (frameset-prop): Add gv-setter declaration. 4 (frameset-prop): Add gv-setter declaration.
5 (frameset-filter-minibuffer): Deal with the case that the minibuffer
6 parameter was already set in FILTERED. Doc fix.
7 (frameset--record-minibuffer-relationships): Allow saving a
8 minibufferless frame without its corresponding minibuffer frame.
9 (frameset--reuse-frame): Accept a match from an orphaned minibufferless
10 frame, if the frame id matches.
11 (frameset--minibufferless-last-p): Sort non-orphaned minibufferless
12 frames before orphaned ones.
13 (frameset-restore): Warn about orphaned windows, instead of error out.
5 14
62013-08-14 Martin Rudalics <rudalics@gmx.at> 152013-08-14 Martin Rudalics <rudalics@gmx.at>
7 16
diff --git a/lisp/frameset.el b/lisp/frameset.el
index 74432db892c..7cdab7e3fcc 100644
--- a/lisp/frameset.el
+++ b/lisp/frameset.el
@@ -570,15 +570,22 @@ see `frameset-filter-alist'."
570 (not (stringp (cdr current))) 570 (not (stringp (cdr current)))
571 (not (string-match-p "^unspecified-[fb]g$" (cdr current))))) 571 (not (string-match-p "^unspecified-[fb]g$" (cdr current)))))
572 572
573(defun frameset-filter-minibuffer (current _filtered _parameters saving) 573(defun frameset-filter-minibuffer (current filtered _parameters saving)
574 "When saving, convert (minibuffer . #<window>) to (minibuffer . t). 574 "Force the minibuffer parameter to have a sensible value.
575
576When saving, convert (minibuffer . #<window>) to (minibuffer . t).
577When restoring, if there are two copies, keep the one pointing to
578a live window.
575 579
576For the meaning of CURRENT, FILTERED, PARAMETERS and SAVING, 580For the meaning of CURRENT, FILTERED, PARAMETERS and SAVING,
577see `frameset-filter-alist'." 581see `frameset-filter-alist'."
578 (or (not saving) 582 (let ((value (cdr current)) mini)
579 (if (windowp (cdr current)) 583 (cond (saving
580 '(minibuffer . t) 584 (if (windowp value) '(minibuffer . t) t))
581 t))) 585 ((setq mini (assq 'minibuffer filtered))
586 (when (windowp value) (setcdr mini value))
587 nil)
588 (t t))))
582 589
583(defun frameset-filter-shelve-param (current _filtered parameters saving 590(defun frameset-filter-shelve-param (current _filtered parameters saving
584 &optional prefix) 591 &optional prefix)
@@ -721,16 +728,18 @@ FRAME-LIST is a list of frames. Internal use only."
721 (dolist (frame frame-list) 728 (dolist (frame frame-list)
722 (unless (frame-parameter frame 'frameset--mini) 729 (unless (frame-parameter frame 'frameset--mini)
723 (frameset--set-id frame) 730 (frameset--set-id frame)
724 (let* ((mb-frame (window-frame (minibuffer-window frame))) 731 (let ((mb-frame (window-frame (minibuffer-window frame))))
725 (id (and mb-frame (frameset-frame-id mb-frame)))) 732 ;; For minibufferless frames, frameset--mini is a cons
726 (if (null id) 733 ;; (nil . FRAME-ID), where FRAME-ID is the frameset--id of
727 (error "Minibuffer frame %S for %S is not being saved" mb-frame frame) 734 ;; the frame containing its minibuffer window.
728 ;; For minibufferless frames, frameset--mini is a cons 735 ;; FRAME-ID can be set to nil, if FRAME-LIST doesn't contain
729 ;; (nil . FRAME-ID), where FRAME-ID is the frameset--id 736 ;; the minibuffer frame of a minibufferless frame; we allow
730 ;; of the frame containing its minibuffer window. 737 ;; it without trying to second-guess the user.
731 (set-frame-parameter frame 738 (set-frame-parameter frame
732 'frameset--mini 739 'frameset--mini
733 (cons nil id))))))) 740 (cons nil
741 (and mb-frame
742 (frameset-frame-id mb-frame))))))))
734 743
735;;;###autoload 744;;;###autoload
736(cl-defun frameset-save (frame-list 745(cl-defun frameset-save (frame-list
@@ -909,10 +918,12 @@ is the parameter alist of the frame being restored. Internal use only."
909 (setq frame (frameset--find-frame-if 918 (setq frame (frameset--find-frame-if
910 (lambda (f id mini-id) 919 (lambda (f id mini-id)
911 (and (frameset-frame-id-equal-p f id) 920 (and (frameset-frame-id-equal-p f id)
912 (frameset-frame-id-equal-p (window-frame 921 (or (null mini-id) ; minibuffer frame not saved
913 (minibuffer-window f)) 922 (frameset-frame-id-equal-p
914 mini-id))) 923 (window-frame (minibuffer-window f))
915 display (cdr (assq 'frameset--id parameters)) (cdr mini)))) 924 mini-id))))
925 display
926 (cdr (assq 'frameset--id parameters)) (cdr mini))))
916 (t 927 (t
917 ;; Default to just finding a frame in the same display. 928 ;; Default to just finding a frame in the same display.
918 (setq frame (frameset--find-frame-if nil display)))) 929 (setq frame (frameset--find-frame-if nil display))))
@@ -1007,7 +1018,7 @@ Internal use only."
1007 (cond ((eq id-def1 t) t) 1018 (cond ((eq id-def1 t) t)
1008 ((eq id-def2 t) nil) 1019 ((eq id-def2 t) nil)
1009 ((not (eq hasmini1 hasmini2)) (eq hasmini1 t)) 1020 ((not (eq hasmini1 hasmini2)) (eq hasmini1 t))
1010 ((eq hasmini1 nil) (string< id-def1 id-def2)) 1021 ((eq hasmini1 nil) (or id-def1 id-def2))
1011 (t t)))) 1022 (t t))))
1012 1023
1013(defun frameset-keep-original-display-p (force-display) 1024(defun frameset-keep-original-display-p (force-display)
@@ -1098,7 +1109,7 @@ All keyword parameters default to nil."
1098 (condition-case-unless-debug err 1109 (condition-case-unless-debug err
1099 (let* ((d-mini (cdr (assq 'frameset--mini frame-cfg))) 1110 (let* ((d-mini (cdr (assq 'frameset--mini frame-cfg)))
1100 (mb-id (cdr d-mini)) 1111 (mb-id (cdr d-mini))
1101 (default (and (booleanp mb-id) mb-id)) 1112 (default (and (car d-mini) mb-id))
1102 (force-display (if (functionp force-display) 1113 (force-display (if (functionp force-display)
1103 (funcall force-display frame-cfg window-cfg) 1114 (funcall force-display frame-cfg window-cfg)
1104 force-display)) 1115 force-display))
@@ -1142,16 +1153,22 @@ All keyword parameters default to nil."
1142 (setq frame-cfg (append '((tool-bar-lines . 0) (menu-bar-lines . 0)) 1153 (setq frame-cfg (append '((tool-bar-lines . 0) (menu-bar-lines . 0))
1143 frame-cfg)))) 1154 frame-cfg))))
1144 (t ;; Frame depends on other frame's minibuffer window. 1155 (t ;; Frame depends on other frame's minibuffer window.
1145 (let* ((mb-frame (or (frameset-frame-with-id mb-id) 1156 (when mb-id
1146 (error "Minibuffer frame %S not found" mb-id))) 1157 (let ((mb-frame (frameset-frame-with-id mb-id))
1147 (mb-param (assq 'minibuffer frame-cfg)) 1158 (mb-window nil))
1148 (mb-window (minibuffer-window mb-frame))) 1159 (if (not mb-frame)
1149 (unless (and (window-live-p mb-window) 1160 (delay-warning 'frameset
1150 (window-minibuffer-p mb-window)) 1161 (format "Minibuffer frame %S not found" mb-id)
1151 (error "Not a minibuffer window %s" mb-window)) 1162 :warning)
1152 (if mb-param 1163 (setq mb-window (minibuffer-window mb-frame))
1153 (setcdr mb-param mb-window) 1164 (unless (and (window-live-p mb-window)
1154 (push (cons 'minibuffer mb-window) frame-cfg))))) 1165 (window-minibuffer-p mb-window))
1166 (delay-warning 'frameset
1167 (format "Not a minibuffer window %s" mb-window)
1168 :warning)
1169 (setq mb-window nil)))
1170 (when mb-window
1171 (push (cons 'minibuffer mb-window) frame-cfg))))))
1155 ;; OK, we're ready at last to create (or reuse) a frame and 1172 ;; OK, we're ready at last to create (or reuse) a frame and
1156 ;; restore the window config. 1173 ;; restore the window config.
1157 (setq frame (frameset--restore-frame frame-cfg window-cfg 1174 (setq frame (frameset--restore-frame frame-cfg window-cfg