diff options
| author | Martin Rudalics | 2013-08-26 14:39:08 +0200 |
|---|---|---|
| committer | Martin Rudalics | 2013-08-26 14:39:08 +0200 |
| commit | bfff644518c1214eb5e037c7ff426af1e08628b5 (patch) | |
| tree | c4ee59ac0f004f9df33699bb987caa0fd93b9c7c /src | |
| parent | edca97cde7e566fdc638d1d21552bc38a1531ee1 (diff) | |
| download | emacs-bfff644518c1214eb5e037c7ff426af1e08628b5.tar.gz emacs-bfff644518c1214eb5e037c7ff426af1e08628b5.zip | |
New function check_minibuf_window to fix bug#15183.
* frame.c (check_minibuf_window): New function.
(delete_frame, Fmake_frame_invisible, Ficonify_frame): Call
check_minibuf_window (Bug#15183).
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 6 | ||||
| -rw-r--r-- | src/frame.c | 81 |
2 files changed, 55 insertions, 32 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 6408397c13e..a017eaa62f0 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | 2013-08-26 Martin Rudalics <rudalics@gmx.at> | ||
| 2 | |||
| 3 | * frame.c (check_minibuf_window): New function. | ||
| 4 | (delete_frame, Fmake_frame_invisible, Ficonify_frame): Call | ||
| 5 | check_minibuf_window (Bug#15183). | ||
| 6 | |||
| 1 | 2013-08-26 Dmitry Antipov <dmantipov@yandex.ru> | 7 | 2013-08-26 Dmitry Antipov <dmantipov@yandex.ru> |
| 2 | 8 | ||
| 3 | * window.h (struct window): Replace last_cursor with last_cursor_vpos | 9 | * window.h (struct window): Replace last_cursor with last_cursor_vpos |
diff --git a/src/frame.c b/src/frame.c index 5ee001f4d98..4855734c2fc 100644 --- a/src/frame.c +++ b/src/frame.c | |||
| @@ -1110,6 +1110,51 @@ other_visible_frames (struct frame *f) | |||
| 1110 | return 0; | 1110 | return 0; |
| 1111 | } | 1111 | } |
| 1112 | 1112 | ||
| 1113 | /* Make sure that minibuf_window doesn't refer to FRAME's minibuffer | ||
| 1114 | window. Preferably use the selected frame's minibuffer window | ||
| 1115 | instead. If the selected frame doesn't have one, get some other | ||
| 1116 | frame's minibuffer window. SELECT non-zero means select the new | ||
| 1117 | minibuffer window. */ | ||
| 1118 | static void | ||
| 1119 | check_minibuf_window (Lisp_Object frame, int select) | ||
| 1120 | { | ||
| 1121 | struct frame *f = decode_live_frame (frame); | ||
| 1122 | |||
| 1123 | if (WINDOWP (minibuf_window) && EQ (f->minibuffer_window, minibuf_window)) | ||
| 1124 | { | ||
| 1125 | Lisp_Object frames, this, window; | ||
| 1126 | |||
| 1127 | if (!EQ (frame, selected_frame) | ||
| 1128 | && FRAME_HAS_MINIBUF_P (XFRAME (selected_frame))) | ||
| 1129 | window = FRAME_MINIBUF_WINDOW (XFRAME (selected_frame)); | ||
| 1130 | else | ||
| 1131 | FOR_EACH_FRAME (frames, this) | ||
| 1132 | { | ||
| 1133 | if (!EQ (this, frame) && FRAME_HAS_MINIBUF_P (XFRAME (this))) | ||
| 1134 | { | ||
| 1135 | window = FRAME_MINIBUF_WINDOW (XFRAME (this)); | ||
| 1136 | break; | ||
| 1137 | } | ||
| 1138 | } | ||
| 1139 | |||
| 1140 | if (!WINDOWP (window)) | ||
| 1141 | emacs_abort (); | ||
| 1142 | else | ||
| 1143 | { | ||
| 1144 | /* Use set_window_buffer instead of Fset_window_buffer (see | ||
| 1145 | discussion of bug#11984, bug#12025, bug#12026). */ | ||
| 1146 | set_window_buffer (window, XWINDOW (minibuf_window)->contents, 0, 0); | ||
| 1147 | minibuf_window = window; | ||
| 1148 | |||
| 1149 | /* SELECT non-zero usually means that FRAME's minibuffer | ||
| 1150 | window was selected; select the new one. */ | ||
| 1151 | if (select) | ||
| 1152 | Fselect_window (minibuf_window, Qnil); | ||
| 1153 | } | ||
| 1154 | } | ||
| 1155 | } | ||
| 1156 | |||
| 1157 | |||
| 1113 | /* Delete FRAME. When FORCE equals Qnoelisp, delete FRAME | 1158 | /* Delete FRAME. When FORCE equals Qnoelisp, delete FRAME |
| 1114 | unconditionally. x_connection_closed and delete_terminal use | 1159 | unconditionally. x_connection_closed and delete_terminal use |
| 1115 | this. Any other value of FORCE implements the semantics | 1160 | this. Any other value of FORCE implements the semantics |
| @@ -1244,19 +1289,7 @@ delete_frame (Lisp_Object frame, Lisp_Object force) | |||
| 1244 | } | 1289 | } |
| 1245 | 1290 | ||
| 1246 | /* Don't allow minibuf_window to remain on a deleted frame. */ | 1291 | /* Don't allow minibuf_window to remain on a deleted frame. */ |
| 1247 | if (EQ (f->minibuffer_window, minibuf_window)) | 1292 | check_minibuf_window (frame, minibuffer_selected); |
| 1248 | { | ||
| 1249 | /* Use set_window_buffer instead of Fset_window_buffer (see | ||
| 1250 | discussion of bug#11984, bug#12025, bug#12026). */ | ||
| 1251 | set_window_buffer (sf->minibuffer_window, | ||
| 1252 | XWINDOW (minibuf_window)->contents, 0, 0); | ||
| 1253 | minibuf_window = sf->minibuffer_window; | ||
| 1254 | |||
| 1255 | /* If the dying minibuffer window was selected, | ||
| 1256 | select the new one. */ | ||
| 1257 | if (minibuffer_selected) | ||
| 1258 | Fselect_window (minibuf_window, Qnil); | ||
| 1259 | } | ||
| 1260 | 1293 | ||
| 1261 | /* Don't let echo_area_window to remain on a deleted frame. */ | 1294 | /* Don't let echo_area_window to remain on a deleted frame. */ |
| 1262 | if (EQ (f->minibuffer_window, echo_area_window)) | 1295 | if (EQ (f->minibuffer_window, echo_area_window)) |
| @@ -1683,16 +1716,8 @@ displayed in the terminal. */) | |||
| 1683 | if (NILP (force) && !other_visible_frames (f)) | 1716 | if (NILP (force) && !other_visible_frames (f)) |
| 1684 | error ("Attempt to make invisible the sole visible or iconified frame"); | 1717 | error ("Attempt to make invisible the sole visible or iconified frame"); |
| 1685 | 1718 | ||
| 1686 | /* Don't allow minibuf_window to remain on a deleted frame. */ | 1719 | /* Don't allow minibuf_window to remain on an invisible frame. */ |
| 1687 | if (EQ (f->minibuffer_window, minibuf_window)) | 1720 | check_minibuf_window (frame, EQ (minibuf_window, selected_window)); |
| 1688 | { | ||
| 1689 | struct frame *sf = XFRAME (selected_frame); | ||
| 1690 | /* Use set_window_buffer instead of Fset_window_buffer (see | ||
| 1691 | discussion of bug#11984, bug#12025, bug#12026). */ | ||
| 1692 | set_window_buffer (sf->minibuffer_window, | ||
| 1693 | XWINDOW (minibuf_window)->contents, 0, 0); | ||
| 1694 | minibuf_window = sf->minibuffer_window; | ||
| 1695 | } | ||
| 1696 | 1721 | ||
| 1697 | /* I think this should be done with a hook. */ | 1722 | /* I think this should be done with a hook. */ |
| 1698 | #ifdef HAVE_WINDOW_SYSTEM | 1723 | #ifdef HAVE_WINDOW_SYSTEM |
| @@ -1715,15 +1740,7 @@ If omitted, FRAME defaults to the currently selected frame. */) | |||
| 1715 | struct frame *f = decode_live_frame (frame); | 1740 | struct frame *f = decode_live_frame (frame); |
| 1716 | 1741 | ||
| 1717 | /* Don't allow minibuf_window to remain on an iconified frame. */ | 1742 | /* Don't allow minibuf_window to remain on an iconified frame. */ |
| 1718 | if (EQ (f->minibuffer_window, minibuf_window)) | 1743 | check_minibuf_window (frame, EQ (minibuf_window, selected_window)); |
| 1719 | { | ||
| 1720 | struct frame *sf = XFRAME (selected_frame); | ||
| 1721 | /* Use set_window_buffer instead of Fset_window_buffer (see | ||
| 1722 | discussion of bug#11984, bug#12025, bug#12026). */ | ||
| 1723 | set_window_buffer (sf->minibuffer_window, | ||
| 1724 | XWINDOW (minibuf_window)->contents, 0, 0); | ||
| 1725 | minibuf_window = sf->minibuffer_window; | ||
| 1726 | } | ||
| 1727 | 1744 | ||
| 1728 | /* I think this should be done with a hook. */ | 1745 | /* I think this should be done with a hook. */ |
| 1729 | #ifdef HAVE_WINDOW_SYSTEM | 1746 | #ifdef HAVE_WINDOW_SYSTEM |