diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/xdisp.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/src/xdisp.c b/src/xdisp.c index 4201bdc4a75..65a61a0120c 100644 --- a/src/xdisp.c +++ b/src/xdisp.c | |||
| @@ -11850,7 +11850,7 @@ format_mode_line_unwind_data (struct frame *target_frame, | |||
| 11850 | Vmode_line_unwind_vector = Qnil; | 11850 | Vmode_line_unwind_vector = Qnil; |
| 11851 | 11851 | ||
| 11852 | if (NILP (vector)) | 11852 | if (NILP (vector)) |
| 11853 | vector = make_nil_vector (10); | 11853 | vector = make_nil_vector (12); |
| 11854 | 11854 | ||
| 11855 | ASET (vector, 0, make_fixnum (mode_line_target)); | 11855 | ASET (vector, 0, make_fixnum (mode_line_target)); |
| 11856 | ASET (vector, 1, make_fixnum (MODE_LINE_NOPROP_LEN (0))); | 11856 | ASET (vector, 1, make_fixnum (MODE_LINE_NOPROP_LEN (0))); |
| @@ -11867,12 +11867,24 @@ format_mode_line_unwind_data (struct frame *target_frame, | |||
| 11867 | ASET (vector, 7, owin); | 11867 | ASET (vector, 7, owin); |
| 11868 | if (target_frame) | 11868 | if (target_frame) |
| 11869 | { | 11869 | { |
| 11870 | Lisp_Object buffer = XWINDOW (target_frame->selected_window)->contents; | ||
| 11871 | struct buffer *b = XBUFFER (buffer); | ||
| 11872 | struct buffer *cb = current_buffer; | ||
| 11873 | |||
| 11870 | /* Similarly to `with-selected-window', if the operation selects | 11874 | /* Similarly to `with-selected-window', if the operation selects |
| 11871 | a window on another frame, we must restore that frame's | 11875 | a window on another frame, we must restore that frame's |
| 11872 | selected window, and (for a tty) the top-frame. */ | 11876 | selected window, and (for a tty) the top-frame. */ |
| 11873 | ASET (vector, 8, target_frame->selected_window); | 11877 | ASET (vector, 8, target_frame->selected_window); |
| 11874 | if (FRAME_TERMCAP_P (target_frame)) | 11878 | if (FRAME_TERMCAP_P (target_frame)) |
| 11875 | ASET (vector, 9, FRAME_TTY (target_frame)->top_frame); | 11879 | ASET (vector, 9, FRAME_TTY (target_frame)->top_frame); |
| 11880 | |||
| 11881 | /* If we select a window on another frame, make sure that that | ||
| 11882 | selection does not leave its buffer's point modified when | ||
| 11883 | unwinding (Bug#32777). */ | ||
| 11884 | ASET (vector, 10, buffer); | ||
| 11885 | current_buffer = b; | ||
| 11886 | ASET (vector, 11, build_marker (current_buffer, PT, PT_BYTE)); | ||
| 11887 | current_buffer = cb; | ||
| 11876 | } | 11888 | } |
| 11877 | 11889 | ||
| 11878 | return vector; | 11890 | return vector; |
| @@ -11912,6 +11924,24 @@ unwind_format_mode_line (Lisp_Object vector) | |||
| 11912 | } | 11924 | } |
| 11913 | 11925 | ||
| 11914 | Fselect_window (old_window, Qt); | 11926 | Fselect_window (old_window, Qt); |
| 11927 | |||
| 11928 | /* Restore point of target_frame_window's buffer (Bug#32777). | ||
| 11929 | But do this only after old_window has been reselected to | ||
| 11930 | avoid that the window point of target_frame_window moves. */ | ||
| 11931 | if (!NILP (target_frame_window)) | ||
| 11932 | { | ||
| 11933 | Lisp_Object buffer = AREF (vector, 10); | ||
| 11934 | |||
| 11935 | if (BUFFER_LIVE_P (XBUFFER (buffer))) | ||
| 11936 | { | ||
| 11937 | struct buffer *cb = current_buffer; | ||
| 11938 | |||
| 11939 | current_buffer = XBUFFER (buffer); | ||
| 11940 | set_point_from_marker (AREF (vector, 11)); | ||
| 11941 | ASET (vector, 11, Qnil); | ||
| 11942 | current_buffer = cb; | ||
| 11943 | } | ||
| 11944 | } | ||
| 11915 | } | 11945 | } |
| 11916 | 11946 | ||
| 11917 | if (!NILP (AREF (vector, 6))) | 11947 | if (!NILP (AREF (vector, 6))) |