aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Rudalics2013-08-26 14:39:08 +0200
committerMartin Rudalics2013-08-26 14:39:08 +0200
commitbfff644518c1214eb5e037c7ff426af1e08628b5 (patch)
treec4ee59ac0f004f9df33699bb987caa0fd93b9c7c /src
parentedca97cde7e566fdc638d1d21552bc38a1531ee1 (diff)
downloademacs-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/ChangeLog6
-rw-r--r--src/frame.c81
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 @@
12013-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
12013-08-26 Dmitry Antipov <dmantipov@yandex.ru> 72013-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. */
1118static void
1119check_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