diff options
| author | Juanma Barranquero | 2013-08-14 15:41:02 +0200 |
|---|---|---|
| committer | Juanma Barranquero | 2013-08-14 15:41:02 +0200 |
| commit | 14d1e4634c80f0ba07181efc3e5b251d3a92e182 (patch) | |
| tree | 32039c481bb26d539cc9c89cc19f24199be6e3cb | |
| parent | 62f33baed9e37213dc5164b27a968c42bb60b4a7 (diff) | |
| download | emacs-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/ChangeLog | 9 | ||||
| -rw-r--r-- | lisp/frameset.el | 81 |
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 | ||
| 6 | 2013-08-14 Martin Rudalics <rudalics@gmx.at> | 15 | 2013-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 | |||
| 576 | When saving, convert (minibuffer . #<window>) to (minibuffer . t). | ||
| 577 | When restoring, if there are two copies, keep the one pointing to | ||
| 578 | a live window. | ||
| 575 | 579 | ||
| 576 | For the meaning of CURRENT, FILTERED, PARAMETERS and SAVING, | 580 | For the meaning of CURRENT, FILTERED, PARAMETERS and SAVING, |
| 577 | see `frameset-filter-alist'." | 581 | see `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 |