From: Martin Rudalics Date: Mon, 27 Aug 2012 08:31:19 +0000 (+0200) Subject: Address two problems in Fset_window_configuration (Bug#8789) and (Bug#12208). X-Git-Tag: emacs-24.2.90~501 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=c4b6914d3621942393a3a69d5cee3e39e13c6227;p=emacs.git Address two problems in Fset_window_configuration (Bug#8789) and (Bug#12208). * window.c (Fset_window_configuration): Record any window's old buffer if it's replaced (see Bug#8789). If the new current buffer doesn't appear in the selected window, go to its old point (Bug#12208). --- diff --git a/src/ChangeLog b/src/ChangeLog index ec7267913d6..ee0aeed86f1 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2012-08-27 Martin Rudalics + + * window.c (Fset_window_configuration): Record any window's old + buffer if it's replaced (see Bug#8789). If the new current + buffer doesn't appear in the selected window, go to its old + point (Bug#12208). + 2012-08-27 Dmitry Antipov Special MEM_TYPE_SPARE to denote reserved memory. diff --git a/src/window.c b/src/window.c index 4792e3bbea8..b3c5d276f97 100644 --- a/src/window.c +++ b/src/window.c @@ -1969,6 +1969,9 @@ unshow_buffer (register struct window *w) is actually stored in that buffer, and the window's pointm isn't used. So don't clobber point in that buffer. */ if (! EQ (buf, XWINDOW (selected_window)->buffer) + /* Don't clobber point in current buffer either (this could be + useful in connection with bug#12208). + && XBUFFER (buf) != current_buffer */ /* This line helps to fix Horsley's testbug.el bug. */ && !(WINDOWP (BVAR (b, last_selected_window)) && w != XWINDOW (BVAR (b, last_selected_window)) @@ -3135,7 +3138,7 @@ run_window_configuration_change_hook (struct frame *f) DEFUN ("run-window-configuration-change-hook", Frun_window_configuration_change_hook, Srun_window_configuration_change_hook, 1, 1, 0, doc: /* Run `window-configuration-change-hook' for FRAME. */) - (Lisp_Object frame) + (Lisp_Object frame) { CHECK_LIVE_FRAME (frame); run_window_configuration_change_hook (XFRAME (frame)); @@ -5613,6 +5616,24 @@ the return value is nil. Otherwise the value is t. */) int previous_frame_menu_bar_lines = FRAME_MENU_BAR_LINES (f); int previous_frame_tool_bar_lines = FRAME_TOOL_BAR_LINES (f); + /* Don't do this within the main loop below: This may call Lisp + code and is thus potentially unsafe while input is blocked. */ + for (k = 0; k < saved_windows->header.size; k++) + { + p = SAVED_WINDOW_N (saved_windows, k); + window = p->window; + w = XWINDOW (window); + + if (!NILP (p->buffer) + && ((!EQ (w->buffer, p->buffer) + && !NILP (BVAR (XBUFFER (p->buffer), name))) + || NILP (w->buffer) + || NILP (BVAR (XBUFFER (w->buffer), name)))) + /* Record old buffer of window when its buffer is going to + change. */ + call1 (Qrecord_window_buffer, window); + } + /* The mouse highlighting code could get screwed up if it runs during this. */ BLOCK_INPUT; @@ -5900,7 +5921,13 @@ the return value is nil. Otherwise the value is t. */) } if (!NILP (new_current_buffer)) - Fset_buffer (new_current_buffer); + { + Fset_buffer (new_current_buffer); + /* If the new current buffer doesn't appear in the selected + window, go to its old point (see bug#12208). */ + if (!EQ (XWINDOW (data->current_window)->buffer, new_current_buffer)) + Fgoto_char (make_number (old_point)); + } Vminibuf_scroll_window = data->minibuf_scroll_window; minibuf_selected_window = data->minibuf_selected_window;