# HG changeset patch # User Chong Yidong # Date 1295664293 18000 # Node ID e99b4c7a3af42f66570fbca7bf494a73b1f3d323 # Parent 36dcbf24a6f13699ef4f2cbe4e60d18b86ddf4fb Rework 2011-01-15 changes to window.c. * src/window.c (select_window): New function. (Fselect_window): Call it. (inhibit_point_swap): Variable deleted. (Fset_window_configuration): Call select_window directly. diff -r 36dcbf24a6f1 -r e99b4c7a3af4 src/ChangeLog --- a/src/ChangeLog Fri Jan 21 15:56:24 2011 -0500 +++ b/src/ChangeLog Fri Jan 21 21:44:53 2011 -0500 @@ -1,3 +1,10 @@ +2011-01-22 Martin Rudalics + + * window.c (select_window): New function. + (Fselect_window): Call it. + (inhibit_point_swap): Variable deleted. + (Fset_window_configuration): Call select_window directly. + 2011-01-16 Stefan Monnier * image.c (syms_of_image): Don't access XSYMBOL's internals directly. diff -r 36dcbf24a6f1 -r e99b4c7a3af4 src/window.c --- a/src/window.c Fri Jan 21 15:56:24 2011 -0500 +++ b/src/window.c Fri Jan 21 21:44:53 2011 -0500 @@ -85,6 +85,7 @@ int (* fn) (struct window *, void *), void *)); static Lisp_Object window_list_1 P_ ((Lisp_Object, Lisp_Object, Lisp_Object)); +static Lisp_Object select_window _P ((Lisp_Object, Lisp_Object, int)); /* This is the window in which the terminal's cursor should be left when nothing is being done with it. This must @@ -158,11 +159,6 @@ static int window_initialized; -/* Set in `set-window-configuration' to prevent "swapping out point" - in the old selected window. */ - -static int inhibit_point_swap; - /* Hook to run when window config changes. */ static Lisp_Object Qwindow_configuration_change_hook; @@ -3585,21 +3581,16 @@ return Qnil; } -/* Note that selected_window can be nil when this is called from - Fset_window_configuration. */ - -DEFUN ("select-window", Fselect_window, Sselect_window, 1, 2, 0, - doc: /* Select WINDOW. Most editing will apply to WINDOW's buffer. -If WINDOW is not already selected, make WINDOW's buffer current -and make WINDOW the frame's selected window. Return WINDOW. -Optional second arg NORECORD non-nil means do not put this buffer -at the front of the list of recently selected ones and do not -make this window the most recently selected one. - -Note that the main editor command loop selects the buffer of the -selected window before each command. */) - (window, norecord) - register Lisp_Object window, norecord; +/* If select_window is called with inhibit_point_swap non-zero it will + not store point of the old selected window's buffer back into that + window's pointm slot. This is needed by Fset_window_configuration to + avoid that the display routine is called with selected_window set to + Qnil causing a subsequent crash. */ + +static Lisp_Object +select_window (window, norecord, inhibit_point_swap) + Lisp_Object window, norecord; + int inhibit_point_swap; { register struct window *w; register struct window *ow; @@ -3638,9 +3629,7 @@ /* Store the current buffer's actual point into the old selected window. It belongs to that window, and when the window is not selected, must be in the window. */ - if (inhibit_point_swap) - inhibit_point_swap = 0; - else + if (!inhibit_point_swap) { ow = XWINDOW (selected_window); if (! NILP (ow->buffer)) @@ -3676,6 +3665,26 @@ return window; } + +/* Note that selected_window can be nil when this is called from + Fset_window_configuration. */ + +DEFUN ("select-window", Fselect_window, Sselect_window, 1, 2, 0, + doc: /* Select WINDOW. Most editing will apply to WINDOW's buffer. +If WINDOW is not already selected, make WINDOW's buffer current +and make WINDOW the frame's selected window. Return WINDOW. +Optional second arg NORECORD non-nil means do not put this buffer +at the front of the list of recently selected ones and do not +make this window the most recently selected one. + +Note that the main editor command loop selects the buffer of the +selected window before each command. */) + (window, norecord) + register Lisp_Object window, norecord; +{ + select_window (window, norecord, 0); +} + static Lisp_Object select_window_norecord (window) Lisp_Object window; @@ -6255,8 +6264,7 @@ out point" in the old selected window using the buffer that has been restored into it. We already swapped out that point from that window's old buffer. */ - inhibit_point_swap = 1; - Fselect_window (data->current_window, Qnil); + select_window (data->current_window, Qnil, 1); XBUFFER (XWINDOW (selected_window)->buffer)->last_selected_window = selected_window; @@ -7214,8 +7222,6 @@ window_scroll_preserve_hpos = -1; window_scroll_preserve_vpos = -1; - inhibit_point_swap = 0; - DEFVAR_LISP ("temp-buffer-show-function", &Vtemp_buffer_show_function, doc: /* Non-nil means call as function to display a help buffer. The function is called with one argument, the buffer to be displayed.