]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix infinite frame selection loop (Bug#15025).
authorDmitry Antipov <dmantipov@yandex.ru>
Thu, 15 Aug 2013 15:37:03 +0000 (19:37 +0400)
committerDmitry Antipov <dmantipov@yandex.ru>
Thu, 15 Aug 2013 15:37:03 +0000 (19:37 +0400)
* frame.c (delete_frame): Prefer fast ad-hoc loop to next_frame.

src/ChangeLog
src/frame.c

index 77c37864b00cb8165a1d780b17098e393d1ae6b2..888db1f8cf4c020de1a06cf67eb6e3114b69dcdf 100644 (file)
@@ -1,3 +1,8 @@
+2013-08-15  Dmitry Antipov  <dmantipov@yandex.ru>
+
+       Fix infinite frame selection loop (Bug#15025).
+       * frame.c (delete_frame): Prefer fast ad-hoc loop to next_frame.
+
 2013-08-15  Eli Zaretskii  <eliz@gnu.org>
 
        * xdisp.c (compute_window_start_on_continuation_line): When
index bb44f3cc987d435ffaec89fb3c0d22194728792e..957f08b06c532914475aa36ae13b81021696b1ff 100644 (file)
@@ -1199,8 +1199,15 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
     {
       Lisp_Object tail, frame1;
 
-      /* Look for another visible frame on the same terminal.  */
-      frame1 = next_frame (frame, Qvisible);
+      /* Look for another visible frame on the same terminal.
+        Do not call next_frame here because it may loop forever.
+        See http://debbugs.gnu.org/cgi/bugreport.cgi?bug=15025.  */
+      FOR_EACH_FRAME (tail, frame1)
+       if (!EQ (frame, frame1)
+           && (FRAME_TERMINAL (XFRAME (frame))
+               == FRAME_TERMINAL (XFRAME (frame1)))
+           && FRAME_VISIBLE_P (XFRAME (frame1)))
+         break;
 
       /* If there is none, find *some* other frame.  */
       if (NILP (frame1) || EQ (frame1, frame))