Commit f01d3321 authored by Chong Yidong's avatar Chong Yidong

Avoid infloop in next-frame during frame creation.

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.
parent 8f4042d2
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
......
......@@ -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. */
......
......@@ -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);
......
......@@ -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",
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment