[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] trunk r114005: New function check_minibuf_window to fix bu
From: |
Martin Rudalics |
Subject: |
[Emacs-diffs] trunk r114005: New function check_minibuf_window to fix bug#15183. |
Date: |
Mon, 26 Aug 2013 12:39:21 +0000 |
User-agent: |
Bazaar (2.6b2) |
------------------------------------------------------------
revno: 114005
revision-id: address@hidden
parent: address@hidden
committer: martin rudalics <address@hidden>
branch nick: trunk
timestamp: Mon 2013-08-26 14:39:08 +0200
message:
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).
modified:
src/ChangeLog changelog-20091113204419-o5vbwnq5f7feedwu-1438
src/frame.c frame.c-20091113204419-o5vbwnq5f7feedwu-243
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog 2013-08-26 09:33:37 +0000
+++ b/src/ChangeLog 2013-08-26 12:39:08 +0000
@@ -1,3 +1,9 @@
+2013-08-26 Martin Rudalics <address@hidden>
+
+ * frame.c (check_minibuf_window): New function.
+ (delete_frame, Fmake_frame_invisible, Ficonify_frame): Call
+ check_minibuf_window (Bug#15183).
+
2013-08-26 Dmitry Antipov <address@hidden>
* window.h (struct window): Replace last_cursor with last_cursor_vpos
=== modified file 'src/frame.c'
--- a/src/frame.c 2013-08-15 16:28:42 +0000
+++ b/src/frame.c 2013-08-26 12:39:08 +0000
@@ -1110,6 +1110,51 @@
return 0;
}
+/* Make sure that minibuf_window doesn't refer to FRAME's minibuffer
+ window. Preferably use the selected frame's minibuffer window
+ instead. If the selected frame doesn't have one, get some other
+ frame's minibuffer window. SELECT non-zero means select the new
+ minibuffer window. */
+static void
+check_minibuf_window (Lisp_Object frame, int select)
+{
+ struct frame *f = decode_live_frame (frame);
+
+ if (WINDOWP (minibuf_window) && EQ (f->minibuffer_window, minibuf_window))
+ {
+ Lisp_Object frames, this, window;
+
+ if (!EQ (frame, selected_frame)
+ && FRAME_HAS_MINIBUF_P (XFRAME (selected_frame)))
+ window = FRAME_MINIBUF_WINDOW (XFRAME (selected_frame));
+ else
+ FOR_EACH_FRAME (frames, this)
+ {
+ if (!EQ (this, frame) && FRAME_HAS_MINIBUF_P (XFRAME (this)))
+ {
+ window = FRAME_MINIBUF_WINDOW (XFRAME (this));
+ break;
+ }
+ }
+
+ if (!WINDOWP (window))
+ emacs_abort ();
+ else
+ {
+ /* Use set_window_buffer instead of Fset_window_buffer (see
+ discussion of bug#11984, bug#12025, bug#12026). */
+ set_window_buffer (window, XWINDOW (minibuf_window)->contents, 0, 0);
+ minibuf_window = window;
+
+ /* SELECT non-zero usually means that FRAME's minibuffer
+ window was selected; select the new one. */
+ if (select)
+ Fselect_window (minibuf_window, Qnil);
+ }
+ }
+}
+
+
/* Delete FRAME. When FORCE equals Qnoelisp, delete FRAME
unconditionally. x_connection_closed and delete_terminal use
this. Any other value of FORCE implements the semantics
@@ -1244,19 +1289,7 @@
}
/* Don't allow minibuf_window to remain on a deleted frame. */
- if (EQ (f->minibuffer_window, minibuf_window))
- {
- /* Use set_window_buffer instead of Fset_window_buffer (see
- discussion of bug#11984, bug#12025, bug#12026). */
- set_window_buffer (sf->minibuffer_window,
- XWINDOW (minibuf_window)->contents, 0, 0);
- minibuf_window = sf->minibuffer_window;
-
- /* If the dying minibuffer window was selected,
- select the new one. */
- if (minibuffer_selected)
- Fselect_window (minibuf_window, Qnil);
- }
+ check_minibuf_window (frame, minibuffer_selected);
/* Don't let echo_area_window to remain on a deleted frame. */
if (EQ (f->minibuffer_window, echo_area_window))
@@ -1683,16 +1716,8 @@
if (NILP (force) && !other_visible_frames (f))
error ("Attempt to make invisible the sole visible or iconified frame");
- /* Don't allow minibuf_window to remain on a deleted frame. */
- if (EQ (f->minibuffer_window, minibuf_window))
- {
- struct frame *sf = XFRAME (selected_frame);
- /* Use set_window_buffer instead of Fset_window_buffer (see
- discussion of bug#11984, bug#12025, bug#12026). */
- set_window_buffer (sf->minibuffer_window,
- XWINDOW (minibuf_window)->contents, 0, 0);
- minibuf_window = sf->minibuffer_window;
- }
+ /* Don't allow minibuf_window to remain on an invisible frame. */
+ check_minibuf_window (frame, EQ (minibuf_window, selected_window));
/* I think this should be done with a hook. */
#ifdef HAVE_WINDOW_SYSTEM
@@ -1715,15 +1740,7 @@
struct frame *f = decode_live_frame (frame);
/* Don't allow minibuf_window to remain on an iconified frame. */
- if (EQ (f->minibuffer_window, minibuf_window))
- {
- struct frame *sf = XFRAME (selected_frame);
- /* Use set_window_buffer instead of Fset_window_buffer (see
- discussion of bug#11984, bug#12025, bug#12026). */
- set_window_buffer (sf->minibuffer_window,
- XWINDOW (minibuf_window)->contents, 0, 0);
- minibuf_window = sf->minibuffer_window;
- }
+ check_minibuf_window (frame, EQ (minibuf_window, selected_window));
/* I think this should be done with a hook. */
#ifdef HAVE_WINDOW_SYSTEM
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] trunk r114005: New function check_minibuf_window to fix bug#15183.,
Martin Rudalics <=