GNU bug report logs - #15183
24.3.50; emacs_backtrace.txt

Previous Next

Package: emacs;

Reported by: Drew Adams <drew.adams <at> oracle.com>

Date: Sun, 25 Aug 2013 01:03:02 UTC

Severity: normal

Tags: moreinfo

Found in version 24.3.50

Done: Glenn Morris <rgm <at> gnu.org>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: martin rudalics <rudalics <at> gmx.at>
To: Drew Adams <drew.adams <at> oracle.com>
Cc: Juanma Barranquero <lekktu <at> gmail.com>, 15183 <at> debbugs.gnu.org
Subject: bug#15183: 24.3.50; emacs_backtrace.txt
Date: Sun, 25 Aug 2013 19:31:20 +0200
[Message part 1 (text/plain, inline)]
> In case it helps, let me repeat what I wrote at the outset for this bug:
> this crash came from a session started with `emacs -Q', *not* from my
> setup (so no standalone minibuffer etc.).

IIUC at least one frame didn't have a minibuffer since otherwise this
error could not have occured.  FWIW the attached patch should fix it but
I don't have any idea how to test it.

martin
[frame.c.diff (text/plain, inline)]
=== modified file 'src/frame.c'
--- src/frame.c	2013-08-15 16:28:42 +0000
+++ src/frame.c	2013-08-25 17:22:14 +0000
@@ -1110,6 +1110,44 @@
   return 0;
 }
 
+/* Set minibuf_window preferably to the selected frame's minibuffer
+   window.  If the selected frame doesn't have one, get some other
+   frame's minibuffer window.  not-this is a frame that must be
+   skipped.  select non-zero means select the new window.  */
+Lisp_Object
+set_minibuf_window (Lisp_Object not_this, int select)
+{
+  Lisp_Object frames, this, window;
+
+  if (FRAME_HAS_MINIBUF_P (XFRAME (selected_frame)))
+    window = FRAME_MINIBUF_WINDOW (XFRAME (selected_frame));
+  else
+    FOR_EACH_FRAME (frames, this)
+      {
+	if (!EQ (this, not_this) && 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;
+
+      /* If the previous 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
@@ -1245,18 +1283,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);
-    }
+    set_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 +1710,9 @@
   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.  */
+  /* Don't allow minibuf_window to remain on an invisible 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;
-    }
+    set_minibuf_window (frame, 0);
 
   /* I think this should be done with a hook.  */
 #ifdef HAVE_WINDOW_SYSTEM
@@ -1716,14 +1736,7 @@
 
   /* 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;
-    }
+    set_minibuf_window (frame, 0);
 
   /* I think this should be done with a hook.  */
 #ifdef HAVE_WINDOW_SYSTEM



This bug report was last modified 11 years and 323 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.