static void mirror_line_dance (struct window *, int, int, int *, char *);
static bool update_window_tree (struct window *, bool);
static bool update_window (struct window *, bool);
-static bool update_frame_1 (struct frame *, bool, bool);
+static bool update_frame_1 (struct frame *, bool, bool, bool);
static bool scrolling (struct frame *);
static void set_window_cursor_after_update (struct window *);
static void adjust_frame_glyphs_for_window_redisplay (struct frame *);
/* Update the display */
update_begin (f);
- paused_p = update_frame_1 (f, force_p, inhibit_hairy_id_p);
+ paused_p = update_frame_1 (f, force_p, inhibit_hairy_id_p, 1);
update_end (f);
if (FRAME_TERMCAP_P (f) || FRAME_MSDOS_P (f))
glyphs. This is like the second part of update_frame, but it
doesn't call build_frame_matrix, because we already have the
desired matrix prepared, and don't want it to be overwritten by the
- text of the normal display. */
+ text of the normal display.
+
+ ROW and COL, if non-negative, are the row and column of the TTY
+ frame where to position the cursor after the frame update is
+ complete. Negative values mean ask update_frame_1 to position the
+ cursor "normally", i.e. at point in the selected window. */
void
-update_frame_with_menu (struct frame *f)
+update_frame_with_menu (struct frame *f, int row, int col)
{
struct window *root_window = XWINDOW (f->root_window);
- bool paused_p;
+ bool paused_p, cursor_at_point_p;
eassert (FRAME_TERMCAP_P (f));
/* Update the display. */
update_begin (f);
+ cursor_at_point_p = !(row >= 0 && col >= 0);
/* Force update_frame_1 not to stop due to pending input, and not
try scrolling. */
- paused_p = update_frame_1 (f, 1, 1);
+ paused_p = update_frame_1 (f, 1, 1, cursor_at_point_p);
+ /* ROW and COL tell us where in the menu to position the cursor, so
+ that screen readers know the active region on the screen. */
+ if (!cursor_at_point_p)
+ cursor_to (f, row, col);
update_end (f);
if (FRAME_TTY (f)->termscript)
check_window_matrix_pointers (root_window);
#endif
add_frame_display_history (f, paused_p);
-#else
- IF_LINT ((void) paused_p);
#endif
/* Reset flags indicating that a window should be updated. */
set_window_update_flags (root_window, false);
+ display_completed = !paused_p;
}
\f
/* Update the desired frame matrix of frame F.
FORCE_P means that the update should not be stopped by pending input.
- INHIBIT_HAIRY_ID_P means that scrolling should not be tried.
+ INHIBIT_ID_P means that scrolling by insert/delete should not be tried.
+ SET_CURSOR_P false means do not set cursor at point in selected window.
Value is true if update was stopped due to pending input. */
static bool
-update_frame_1 (struct frame *f, bool force_p, bool inhibit_id_p)
+update_frame_1 (struct frame *f, bool force_p, bool inhibit_id_p,
+ bool set_cursor_p)
{
/* Frame matrices to work on. */
struct glyph_matrix *current_matrix = f->current_matrix;
pause_p = 0 < i && i < FRAME_LINES (f) - 1;
/* Now just clean up termcap drivers and set cursor, etc. */
- if (!pause_p)
+ if (!pause_p && set_cursor_p)
{
if ((cursor_in_echo_area
/* If we are showing a message instead of the mini-buffer,
int new_text_width, new_text_height, new_root_width;
int old_root_width = WINDOW_PIXEL_WIDTH (XWINDOW (FRAME_ROOT_WINDOW (f)));
int new_cols, new_lines;
- ptrdiff_t count = SPECPDL_INDEX ();
+ dynwind_begin ();
/* If we can't deal with the change now, queue it for later. */
if (delay || (redisplaying_p && !safe))
f->new_height = new_height;
f->new_pixelwise = pixelwise;
delayed_size_change = 1;
+ dynwind_end ();
return;
}
FRAME_TEXT_TO_PIXEL_HEIGHT (f, new_text_height))
&& (FRAME_PIXEL_WIDTH (f) ==
FRAME_TEXT_TO_PIXEL_WIDTH (f, new_text_width)))
- return;
+ {
+ dynwind_end ();
+ return;
+ }
block_input ();
/* MSDOS frames cannot PRETEND, as they change frame size by
manipulating video hardware. */
if ((FRAME_TERMCAP_P (f) && !pretend) || FRAME_MSDOS_P (f))
- FrameRows (FRAME_TTY (f)) = new_height;
+ FrameRows (FRAME_TTY (f)) = new_lines;
}
if (new_text_width != FRAME_TEXT_WIDTH (f)
run_window_configuration_change_hook (f);
- unbind_to (count, Qnil);
+ dynwind_end ();
}
\f
/***********************************************************************
|| !NILP (Vexecuting_kbd_macro))
return Qnil;
- count = SPECPDL_INDEX ();
+ dynwind_begin ();
if (!NILP (force) && !redisplay_dont_pause)
specbind (Qredisplay_dont_pause, Qt);
redisplay_preserve_echo_area (2);
- unbind_to (count, Qnil);
+ dynwind_end ();
return Qt;
}
void
syms_of_display (void)
{
- defsubr (&Sredraw_frame);
- defsubr (&Sredraw_display);
- defsubr (&Sframe_or_buffer_changed_p);
- defsubr (&Sopen_termscript);
- defsubr (&Sding);
- defsubr (&Sredisplay);
- defsubr (&Ssleep_for);
- defsubr (&Ssend_string_to_terminal);
- defsubr (&Sinternal_show_cursor);
- defsubr (&Sinternal_show_cursor_p);
-
-#ifdef GLYPH_DEBUG
- defsubr (&Sdump_redisplay_history);
-#endif
+#include "dispnew.x"
frame_and_buffer_state = Fmake_vector (make_number (20), Qlambda);
staticpro (&frame_and_buffer_state);