aboutsummaryrefslogtreecommitdiffstats
path: root/src/window.c
diff options
context:
space:
mode:
authorEli Zaretskii2013-04-14 20:27:45 +0300
committerEli Zaretskii2013-04-14 20:27:45 +0300
commiteb7a410c147507ffdf0e84d163a014acb82b19a2 (patch)
tree2274bf05e320123c234afbe38dc97932b943c0ea /src/window.c
parent64544985029d58bada3486a3eba7f11ce690c526 (diff)
parentddd6b68524ba1f957e2f8ddd76eb23e641429b58 (diff)
downloademacs-eb7a410c147507ffdf0e84d163a014acb82b19a2.tar.gz
emacs-eb7a410c147507ffdf0e84d163a014acb82b19a2.zip
Merge from trunk, resolve conflicts.
Diffstat (limited to 'src/window.c')
-rw-r--r--src/window.c37
1 files changed, 25 insertions, 12 deletions
diff --git a/src/window.c b/src/window.c
index feb5f7b5cc7..7cf35a480f7 100644
--- a/src/window.c
+++ b/src/window.c
@@ -485,17 +485,14 @@ select_window (Lisp_Object window, Lisp_Object norecord, int inhibit_point_swap)
485 w = XWINDOW (window); 485 w = XWINDOW (window);
486 w->frozen_window_start_p = 0; 486 w->frozen_window_start_p = 0;
487 487
488 if (NILP (norecord))
489 {
490 w->use_time = ++window_select_count;
491 record_buffer (w->contents);
492 }
493
494 /* Make the selected window's buffer current. */ 488 /* Make the selected window's buffer current. */
495 Fset_buffer (w->contents); 489 Fset_buffer (w->contents);
496 490
497 if (EQ (window, selected_window) && !inhibit_point_swap) 491 if (EQ (window, selected_window) && !inhibit_point_swap)
498 return window; 492 /* `switch-to-buffer' uses (select-window (selected-window)) as a "clever"
493 way to call record_buffer from Elisp, so it's important that we call
494 record_buffer before returning here. */
495 goto record_and_return;
499 496
500 sf = SELECTED_FRAME (); 497 sf = SELECTED_FRAME ();
501 if (XFRAME (WINDOW_FRAME (w)) != sf) 498 if (XFRAME (WINDOW_FRAME (w)) != sf)
@@ -514,9 +511,19 @@ select_window (Lisp_Object window, Lisp_Object norecord, int inhibit_point_swap)
514 fset_selected_window (sf, window); 511 fset_selected_window (sf, window);
515 512
516 select_window_1 (window, inhibit_point_swap); 513 select_window_1 (window, inhibit_point_swap);
517
518 bset_last_selected_window (XBUFFER (w->contents), window); 514 bset_last_selected_window (XBUFFER (w->contents), window);
519 windows_or_buffers_changed++; 515 windows_or_buffers_changed++;
516
517 record_and_return:
518 /* record_buffer can run QUIT, so make sure it is run only after we have
519 re-established the invariant between selected_window and selected_frame,
520 otherwise the temporary broken invariant might "escape" (bug#14161). */
521 if (NILP (norecord))
522 {
523 w->use_time = ++window_select_count;
524 record_buffer (w->contents);
525 }
526
520 return window; 527 return window;
521} 528}
522 529
@@ -1490,7 +1497,12 @@ if it isn't already recorded. */)
1490 b = XBUFFER (buf); 1497 b = XBUFFER (buf);
1491 1498
1492 if (! NILP (update) 1499 if (! NILP (update)
1493 && (windows_or_buffers_changed || !w->window_end_valid) 1500 && (windows_or_buffers_changed
1501 || !w->window_end_valid
1502 || b->clip_changed
1503 || b->prevent_redisplay_optimizations_p
1504 || w->last_modified < BUF_MODIFF (b)
1505 || w->last_overlay_modified < BUF_OVERLAY_MODIFF (b))
1494 && !noninteractive) 1506 && !noninteractive)
1495 { 1507 {
1496 struct text_pos startp; 1508 struct text_pos startp;
@@ -1699,8 +1711,9 @@ Return nil if window display is not up-to-date. In that case, use
1699 1711
1700 /* Fail if current matrix is not up-to-date. */ 1712 /* Fail if current matrix is not up-to-date. */
1701 if (!w->window_end_valid 1713 if (!w->window_end_valid
1702 || current_buffer->clip_changed 1714 || windows_or_buffers_changed
1703 || current_buffer->prevent_redisplay_optimizations_p 1715 || b->clip_changed
1716 || b->prevent_redisplay_optimizations_p
1704 || w->last_modified < BUF_MODIFF (b) 1717 || w->last_modified < BUF_MODIFF (b)
1705 || w->last_overlay_modified < BUF_OVERLAY_MODIFF (b)) 1718 || w->last_overlay_modified < BUF_OVERLAY_MODIFF (b))
1706 return Qnil; 1719 return Qnil;
@@ -2929,7 +2942,7 @@ window-start value is reasonable when this function is called. */)
2929 2942
2930 replace_window (root, window, 1); 2943 replace_window (root, window, 1);
2931 2944
2932 /* This must become SWINDOW anyway ....... */ 2945 /* This must become SWINDOW anyway ....... */
2933 if (BUFFERP (w->contents) && !resize_failed) 2946 if (BUFFERP (w->contents) && !resize_failed)
2934 { 2947 {
2935 /* Try to minimize scrolling, by setting the window start to the 2948 /* Try to minimize scrolling, by setting the window start to the