From b969582835bb7d6085a802322c77150fe559960e Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Thu, 5 Sep 2013 20:25:20 +0400 Subject: [PATCH] Cache current header and mode line height for each window. * window.h (struct window): New fields mode_line_height and header_line_height. * window.c (make_window): Initialize them. * dispextern.h (CURRENT_MODE_LINE_HEIGHT) (CURRENT_HEADER_LINE_HEIGHT): Use them. Adjust comment. (current_mode_line_height, current_header_line_height): Remove declaration. * xdisp.c (current_mode_line_height, current_header_line_height): Remove. (pos_visible_p, init_xdisp): Adjust user. (redisplay_window): Invalidate mode_line_height and header_line_height if current and desired matrices do not agree. --- src/ChangeLog | 16 ++++++++++++++++ src/dispextern.h | 47 +++++++++++++++++++++++------------------------ src/window.c | 1 + src/window.h | 6 ++++++ src/xdisp.c | 16 ++++------------ 5 files changed, 50 insertions(+), 36 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index d4a7abefd57..898fbd8ab88 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,19 @@ +2013-09-05 Dmitry Antipov + + Cache current header and mode line height for each window. + * window.h (struct window): New fields mode_line_height + and header_line_height. + * window.c (make_window): Initialize them. + * dispextern.h (CURRENT_MODE_LINE_HEIGHT) + (CURRENT_HEADER_LINE_HEIGHT): Use them. Adjust comment. + (current_mode_line_height, current_header_line_height): + Remove declaration. + * xdisp.c (current_mode_line_height, current_header_line_height): + Remove. + (pos_visible_p, init_xdisp): Adjust user. + (redisplay_window): Invalidate mode_line_height and + header_line_height if current and desired matrices do not agree. + 2013-09-05 Dmitry Antipov * fontset.c, window.c, xdisp.c (toplevel): Use TERM_HEADER. diff --git a/src/dispextern.h b/src/dispextern.h index 947e50fa4dd..ebb07c1d37f 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -1428,31 +1428,31 @@ struct glyph_string #define CURRENT_MODE_LINE_FACE_ID(W) \ (CURRENT_MODE_LINE_FACE_ID_3((W), XWINDOW (selected_window), (W))) -/* Return the current height of the mode line of window W. If not - known from current_mode_line_height, look at W's current glyph - matrix, or return a default based on the height of the font of the - face `mode-line'. */ - -#define CURRENT_MODE_LINE_HEIGHT(W) \ - (current_mode_line_height >= 0 \ - ? current_mode_line_height \ - : (MATRIX_MODE_LINE_HEIGHT ((W)->current_matrix) \ - ? MATRIX_MODE_LINE_HEIGHT ((W)->current_matrix) \ - : estimate_mode_line_height (XFRAME ((W)->frame), \ - CURRENT_MODE_LINE_FACE_ID (W)))) - -/* Return the current height of the header line of window W. If not - known from current_header_line_height, look at W's current glyph - matrix, or return an estimation based on the height of the font of - the face `header-line'. */ +/* Return the current height of the mode line of window W. If not known + from W->mode_line_height, look at W's current glyph matrix, or return + a default based on the height of the font of the face `mode-line'. */ + +#define CURRENT_MODE_LINE_HEIGHT(W) \ + (W->mode_line_height >= 0 \ + ? W->mode_line_height \ + : (W->mode_line_height \ + = (MATRIX_MODE_LINE_HEIGHT (W->current_matrix) \ + ? MATRIX_MODE_LINE_HEIGHT (W->current_matrix) \ + : estimate_mode_line_height \ + (XFRAME (W->frame), CURRENT_MODE_LINE_FACE_ID (W))))) + +/* Return the current height of the header line of window W. If not known + from W->header_line_height, look at W's current glyph matrix, or return + an estimation based on the height of the font of the face `header-line'. */ #define CURRENT_HEADER_LINE_HEIGHT(W) \ - (current_header_line_height >= 0 \ - ? current_header_line_height \ - : (MATRIX_HEADER_LINE_HEIGHT ((W)->current_matrix) \ - ? MATRIX_HEADER_LINE_HEIGHT ((W)->current_matrix) \ - : estimate_mode_line_height (XFRAME ((W)->frame), \ - HEADER_LINE_FACE_ID))) + (W->header_line_height >= 0 \ + ? W->header_line_height \ + : (W->header_line_height \ + = (MATRIX_HEADER_LINE_HEIGHT (W->current_matrix) \ + ? MATRIX_HEADER_LINE_HEIGHT (W->current_matrix) \ + : estimate_mode_line_height \ + (XFRAME (W->frame), HEADER_LINE_FACE_ID)))) /* Return the height of the desired mode line of window W. */ @@ -3201,7 +3201,6 @@ int frame_mode_line_height (struct frame *); extern Lisp_Object Qtool_bar; extern bool redisplaying_p; extern int help_echo_showing_p; -extern int current_mode_line_height, current_header_line_height; extern Lisp_Object help_echo_string, help_echo_window; extern Lisp_Object help_echo_object, previous_help_echo_string; extern ptrdiff_t help_echo_pos; diff --git a/src/window.c b/src/window.c index d8a6976e090..253e6233fc1 100644 --- a/src/window.c +++ b/src/window.c @@ -3419,6 +3419,7 @@ make_window (void) non-Lisp data, so do it only for slots which should not be zero. */ w->nrows_scale_factor = w->ncols_scale_factor = 1; w->left_fringe_width = w->right_fringe_width = -1; + w->mode_line_height = w->header_line_height = -1; w->phys_cursor_type = -1; w->phys_cursor_width = -1; w->scroll_bar_width = -1; diff --git a/src/window.h b/src/window.h index efe03737052..f5ae81149b3 100644 --- a/src/window.h +++ b/src/window.h @@ -264,6 +264,12 @@ struct window A value of -1 means use frame values. */ int scroll_bar_width; + /* Effective height of the mode line, or -1 if not known. */ + int mode_line_height; + + /* Effective height of the header line, or -1 if not known. */ + int header_line_height; + /* Z - the buffer position of the last glyph in the current matrix of W. Only valid if window_end_valid is nonzero. */ ptrdiff_t window_end_pos; diff --git a/src/xdisp.c b/src/xdisp.c index c096fcd340f..74491a40d74 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -573,12 +573,6 @@ static int last_height; int help_echo_showing_p; -/* If >= 0, computed, exact values of mode-line and header-line height - to use in the macros CURRENT_MODE_LINE_HEIGHT and - CURRENT_HEADER_LINE_HEIGHT. */ - -int current_mode_line_height, current_header_line_height; - /* The maximum distance to look ahead for text properties. Values that are too small let us call compute_char_face and similar functions too often which is expensive. Values that are too large @@ -1349,12 +1343,12 @@ pos_visible_p (struct window *w, ptrdiff_t charpos, int *x, int *y, /* Compute exact mode line heights. */ if (WINDOW_WANTS_MODELINE_P (w)) - current_mode_line_height + w->mode_line_height = display_mode_line (w, CURRENT_MODE_LINE_FACE_ID (w), BVAR (current_buffer, mode_line_format)); if (WINDOW_WANTS_HEADER_LINE_P (w)) - current_header_line_height + w->header_line_height = display_mode_line (w, HEADER_LINE_FACE_ID, BVAR (current_buffer, header_line_format)); @@ -1647,8 +1641,6 @@ pos_visible_p (struct window *w, ptrdiff_t charpos, int *x, int *y, if (old_buffer) set_buffer_internal_1 (old_buffer); - current_header_line_height = current_mode_line_height = -1; - if (visible_p && w->hscroll > 0) *x -= window_hscroll_limited (w, WINDOW_XFRAME (w)) @@ -16107,6 +16099,7 @@ redisplay_window (Lisp_Object window, int just_this_one_p) && CURRENT_MODE_LINE_HEIGHT (w) != DESIRED_MODE_LINE_HEIGHT (w)) { fonts_changed_p = 1; + w->mode_line_height = -1; MATRIX_MODE_LINE_ROW (w->current_matrix)->height = DESIRED_MODE_LINE_HEIGHT (w); } @@ -16117,6 +16110,7 @@ redisplay_window (Lisp_Object window, int just_this_one_p) && CURRENT_HEADER_LINE_HEIGHT (w) != DESIRED_HEADER_LINE_HEIGHT (w)) { fonts_changed_p = 1; + w->header_line_height = -1; MATRIX_HEADER_LINE_ROW (w->current_matrix)->height = DESIRED_HEADER_LINE_HEIGHT (w); } @@ -29686,8 +29680,6 @@ Its value should be an ASCII acronym string, `hex-code', `empty-box', or void init_xdisp (void) { - current_header_line_height = current_mode_line_height = -1; - CHARPOS (this_line_start_pos) = 0; if (!noninteractive) -- 2.39.2