aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoakim Verona2013-08-14 15:42:07 +0200
committerJoakim Verona2013-08-14 15:42:07 +0200
commit89ba610e09b1be18ad96f502d7b06938c016e76c (patch)
treec2f81b53ee9ed27b62f630cd6c737b8b275f0a94
parentd84cbc292773e6f3178b276c34f52b22220a2163 (diff)
parent14d1e4634c80f0ba07181efc3e5b251d3a92e182 (diff)
downloademacs-89ba610e09b1be18ad96f502d7b06938c016e76c.tar.gz
emacs-89ba610e09b1be18ad96f502d7b06938c016e76c.zip
merge from trunk
-rw-r--r--lisp/ChangeLog14
-rw-r--r--lisp/frameset.el97
2 files changed, 71 insertions, 40 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index ac7a87deb5f..4b9ea280f98 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,17 @@
12013-08-14 Juanma Barranquero <lekktu@gmail.com>
2
3 * frameset.el (frameset--prop-setter): New function.
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.
14
12013-08-14 Martin Rudalics <rudalics@gmx.at> 152013-08-14 Martin Rudalics <rudalics@gmx.at>
2 16
3 * window.el (window-make-atom): Don't overwrite parameter 17 * window.el (window-make-atom): Don't overwrite parameter
diff --git a/lisp/frameset.el b/lisp/frameset.el
index e334b4cb1fd..7cdab7e3fcc 100644
--- a/lisp/frameset.el
+++ b/lisp/frameset.el
@@ -156,7 +156,13 @@ FRAMESET is copied with `copy-tree'."
156 (let ((states (frameset-states object))) 156 (let ((states (frameset-states object)))
157 (and (listp states) 157 (and (listp states)
158 (cl-every #'consp (frameset-states object)))) 158 (cl-every #'consp (frameset-states object))))
159 (frameset-version object))) ; And VERSION is non-nil. 159 (frameset-version object))) ; And VERSION is non-nil.
160
161(defun frameset--prop-setter (frameset property value)
162 "Setter function for `frameset-prop'. Internal use only."
163 (setf (frameset-properties frameset)
164 (plist-put (frameset-properties frameset) property value))
165 value)
160 166
161;; A setf'able accessor to the frameset's properties 167;; A setf'able accessor to the frameset's properties
162(defun frameset-prop (frameset property) 168(defun frameset-prop (frameset property)
@@ -165,15 +171,9 @@ FRAMESET is copied with `copy-tree'."
165Properties can be set with 171Properties can be set with
166 172
167 (setf (frameset-prop FRAMESET PROPERTY) NEW-VALUE)" 173 (setf (frameset-prop FRAMESET PROPERTY) NEW-VALUE)"
174 (declare (gv-setter frameset--prop-setter))
168 (plist-get (frameset-properties frameset) property)) 175 (plist-get (frameset-properties frameset) property))
169 176
170(gv-define-setter frameset-prop (val fs prop)
171 (macroexp-let2 nil v val
172 `(progn
173 (setf (frameset-properties ,fs)
174 (plist-put (frameset-properties ,fs) ,prop ,v))
175 ,v)))
176
177 177
178;; Filtering 178;; Filtering
179 179
@@ -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