]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid infloop in next-frame during frame creation.
authorChong Yidong <cyd@gnu.org>
Thu, 23 Feb 2012 07:28:21 +0000 (15:28 +0800)
committerChong Yidong <cyd@gnu.org>
Thu, 23 Feb 2012 07:28:21 +0000 (15:28 +0800)
See thread at http://lists.gnu.org/archive/html/emacs-devel/2012-02/msg00573.html

* src/window.c (inhibit_window_configuration_change_hook): New var.
(run_window_configuration_change_hook): Obey it.

* src/xfns.c (Fx_create_frame): Avoid window-configuration-change-hook
call when setting menu-bar-lines and tool-bar-lines parameters.
(unwind_create_frame_1): New helper function.

src/ChangeLog
src/window.c
src/window.h
src/xfns.c

index 5a376c4ad5befe45909e61d743889f139e40e782..3d660159a1afb26781787365ea2fb8bdb4fc6b85 100644 (file)
@@ -1,3 +1,12 @@
+2012-02-23  Chong Yidong  <cyd@gnu.org>
+
+       * xfns.c (Fx_create_frame): Avoid window-configuration-change-hook
+       call when setting menu-bar-lines and tool-bar-lines parameters.
+       (unwind_create_frame_1): New helper function.
+
+       * window.c (inhibit_window_configuration_change_hook): New var.
+       (run_window_configuration_change_hook): Obey it.
+
 2012-02-22  Chong Yidong  <cyd@gnu.org>
 
        * xterm.c (x_draw_image_relief): Add missing type check for
index 95e7d8a5685e3f1c860b63b0e3cc83cc193863cb..397d84a8b05d2f085d57f5153736e2e0ce7a8387 100644 (file)
@@ -122,6 +122,9 @@ static int window_initialized;
 /* Hook to run when window config changes.  */
 static Lisp_Object Qwindow_configuration_change_hook;
 
+/* If non-nil, run_window_configuration_change_hook does nothing.  */
+Lisp_Object inhibit_window_configuration_change_hook;
+
 /* Used by the function window_scroll_pixel_based */
 static int window_scroll_pixel_based_preserve_x;
 static int window_scroll_pixel_based_preserve_y;
@@ -2894,7 +2897,7 @@ run_window_configuration_change_hook (struct frame *f)
     = Fdefault_value (Qwindow_configuration_change_hook);
   XSETFRAME (frame, f);
 
-  if (NILP (Vrun_hooks))
+  if (NILP (Vrun_hooks) || !NILP (inhibit_window_configuration_change_hook))
     return;
 
   /* Use the right buffer.  Matters when running the local hooks.  */
index ea127ca95a80ed51f2713cdde1129f5037b4b731..f4a5f52b9a58c0bd592a62ea97579108ef6335a9 100644 (file)
@@ -810,6 +810,10 @@ extern Lisp_Object Vmouse_window;
 
 extern Lisp_Object Vmouse_event;
 
+/* If non-nil, run_window_configuration_change_hook does nothing.  */
+
+extern Lisp_Object inhibit_window_configuration_change_hook;
+
 EXFUN (Fnext_window, 3);
 EXFUN (Fselect_window, 2);
 EXFUN (Fset_window_buffer, 3);
index f00335b5d03d4f37237ded0aa392d1504337c4d0..6fcd129e4a4ccefb912a3e08518d0d9986ba1431 100644 (file)
@@ -2949,6 +2949,12 @@ unwind_create_frame (Lisp_Object frame)
   return Qnil;
 }
 
+static Lisp_Object
+unwind_create_frame_1 (Lisp_Object val)
+{
+  inhibit_window_configuration_change_hook = val;
+  return Qnil;
+}
 
 static void
 x_default_font_parameter (struct frame *f, Lisp_Object parms)
@@ -3321,17 +3327,31 @@ This function is an internal primitive--use `make-frame' instead.  */)
      happen.  */
   init_frame_faces (f);
 
-  /* The X resources controlling the menu-bar and tool-bar are
-     processed specially at startup, and reflected in the mode
-     variables; ignore them here.  */
-  x_default_parameter (f, parms, Qmenu_bar_lines,
-                      NILP (Vmenu_bar_mode)
-                      ? make_number (0) : make_number (1),
-                      NULL, NULL, RES_TYPE_NUMBER);
-  x_default_parameter (f, parms, Qtool_bar_lines,
-                      NILP (Vtool_bar_mode)
-                      ? make_number (0) : make_number (1),
-                      NULL, NULL, RES_TYPE_NUMBER);
+  /* Set the menu-bar-lines and tool-bar-lines parameters.  We don't
+     look up the X resources controlling the menu-bar and tool-bar
+     here; they are processed specially at startup, and reflected in
+     the values of the mode variables.
+
+     Avoid calling window-configuration-change-hook; otherwise we
+     could get an infloop in next_frame since the frame is not yet in
+     Vframe_list.  */
+  {
+    int count2 = SPECPDL_INDEX ();
+    record_unwind_protect (unwind_create_frame_1,
+                          inhibit_window_configuration_change_hook);
+    inhibit_window_configuration_change_hook = Qt;
+
+    x_default_parameter (f, parms, Qmenu_bar_lines,
+                        NILP (Vmenu_bar_mode)
+                        ? make_number (0) : make_number (1),
+                        NULL, NULL, RES_TYPE_NUMBER);
+    x_default_parameter (f, parms, Qtool_bar_lines,
+                        NILP (Vtool_bar_mode)
+                        ? make_number (0) : make_number (1),
+                        NULL, NULL, RES_TYPE_NUMBER);
+
+    unbind_to (count2, Qnil);
+  }
 
   x_default_parameter (f, parms, Qbuffer_predicate, Qnil,
                       "bufferPredicate", "BufferPredicate",