From bd0443bb8799b908cefd0b11c86db6115180850d Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Fri, 6 Sep 2013 11:00:29 +0400 Subject: [PATCH] Attempt to make redisplay more selective when changing fonts. * frame.h (struct frame): New bitfield fonts_changed. * dispextern.h (fonts_changed_p, adjust_glyphs): Remove declaration. (adjust_frame_glyphs): Add prototype. * dispnew.c (fonts_changed_p): Remove. (adjust_glyphs): Remove becase we do not adjust matrices on all frames at once any more. (adjust_frame_glyphs): Block and unblock input here. (adjust_glyph_matrix): Use fonts_changed. (change_frame_size_1): Use adjust_frame_glyphs. * font.c (font_open_entity): Use fonts_changed. * frame.c (set_menu_bar_lines, Fmake_terminal_frame): * w32fns.c (x_set_menu_bar_lines, x_set_tool_bar_lines, Fx_show_tip): * window.c (Fdelete_other_windows_internal, Fwindow_resize_apply) (Fsplit_window_internal, Fdelete_window_internal, grow_mini_window) (shrink_mini_window, Fresize_mini_window_internal) (window_scroll_pixel_based, Fset_window_configuration) (apply_window_adjustment, Fset_window_vscroll): * xfns.c (x_set_menu_bar_lines, x_set_tool_bar_lines, Fx_show_tip): Use adjust_frame_glyphs. * xdisp.c (redisplay_tool_bar, redisplay_window, try_window) (try_window_reusing_current_matrix, try_window_id, display_line) (IT_EXPAND_MATRIX_WIDTH): Use fonts_changed. (redisplay_internal): Consider fonts_changed and adjust frame matrices for each frame only if the frame is visible. If font has been changed on some frame during full redisplay, retry only visible frames where the font has been actually changed. --- src/ChangeLog | 30 ++++++++++++++++ src/dispextern.h | 8 +---- src/dispnew.c | 45 +++++------------------- src/font.c | 6 ++-- src/frame.c | 4 +-- src/frame.h | 4 +++ src/w32fns.c | 8 ++--- src/window.c | 22 ++++++------ src/xdisp.c | 90 +++++++++++++++++++++++------------------------- src/xfns.c | 8 ++--- 10 files changed, 111 insertions(+), 114 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 898fbd8ab88..00cde7461c4 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,33 @@ +2013-09-06 Dmitry Antipov + + Attempt to make redisplay more selective when changing fonts. + * frame.h (struct frame): New bitfield fonts_changed. + * dispextern.h (fonts_changed_p, adjust_glyphs): Remove declaration. + (adjust_frame_glyphs): Add prototype. + * dispnew.c (fonts_changed_p): Remove. + (adjust_glyphs): Remove becase we do not + adjust matrices on all frames at once any more. + (adjust_frame_glyphs): Block and unblock input here. + (adjust_glyph_matrix): Use fonts_changed. + (change_frame_size_1): Use adjust_frame_glyphs. + * font.c (font_open_entity): Use fonts_changed. + * frame.c (set_menu_bar_lines, Fmake_terminal_frame): + * w32fns.c (x_set_menu_bar_lines, x_set_tool_bar_lines, Fx_show_tip): + * window.c (Fdelete_other_windows_internal, Fwindow_resize_apply) + (Fsplit_window_internal, Fdelete_window_internal, grow_mini_window) + (shrink_mini_window, Fresize_mini_window_internal) + (window_scroll_pixel_based, Fset_window_configuration) + (apply_window_adjustment, Fset_window_vscroll): + * xfns.c (x_set_menu_bar_lines, x_set_tool_bar_lines, Fx_show_tip): + Use adjust_frame_glyphs. + * xdisp.c (redisplay_tool_bar, redisplay_window, try_window) + (try_window_reusing_current_matrix, try_window_id, display_line) + (IT_EXPAND_MATRIX_WIDTH): Use fonts_changed. + (redisplay_internal): Consider fonts_changed and adjust frame + matrices for each frame only if the frame is visible. If font + has been changed on some frame during full redisplay, retry + only visible frames where the font has been actually changed. + 2013-09-05 Dmitry Antipov Cache current header and mode line height for each window. diff --git a/src/dispextern.h b/src/dispextern.h index ebb07c1d37f..864229e1d04 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -1195,12 +1195,6 @@ struct glyph_row *matrix_row (struct glyph_matrix *, int); ((ROW)->phys_height - (ROW)->phys_ascent \ > (ROW)->height - (ROW)->ascent) -/* True means that fonts have been loaded since the last glyph - matrix adjustments. The function redisplay_internal adjusts glyph - matrices when this flag is true. */ - -extern bool fonts_changed_p; - /* A glyph for a space. */ extern struct glyph space_glyph; @@ -3454,7 +3448,7 @@ extern void cancel_line (int, struct frame *); extern void init_desired_glyphs (struct frame *); extern bool update_frame (struct frame *, bool, bool); extern void bitch_at_user (void); -void adjust_glyphs (struct frame *); +extern void adjust_frame_glyphs (struct frame *); void free_glyphs (struct frame *); void free_window_matrices (struct window *); void check_glyph_memory (void); diff --git a/src/dispnew.c b/src/dispnew.c index 1d7cad13e6d..00abf65248c 100644 --- a/src/dispnew.c +++ b/src/dispnew.c @@ -77,7 +77,6 @@ struct dim static void update_frame_line (struct frame *, int); static int required_matrix_height (struct window *); static int required_matrix_width (struct window *); -static void adjust_frame_glyphs (struct frame *); static void change_frame_size_1 (struct frame *, int, int, bool, bool, bool); static void increment_row_positions (struct glyph_row *, ptrdiff_t, ptrdiff_t); static void fill_up_frame_row_with_spaces (struct glyph_row *, int); @@ -152,16 +151,6 @@ static int glyph_pool_count; static struct frame *frame_matrix_frame; -/* True means that fonts have been loaded since the last glyph - matrix adjustments. Redisplay must stop, and glyph matrices must - be adjusted when this flag becomes true during display. The - reason fonts can be loaded so late is that fonts of fontsets are - loaded on demand. Another reason is that a line contains many - characters displayed by zero width or very narrow glyphs of - variable-width fonts. */ - -bool fonts_changed_p; - /* Convert vpos and hpos from frame to window and vice versa. This may only be used for terminal frames. */ @@ -433,7 +422,7 @@ adjust_glyph_matrix (struct window *w, struct glyph_matrix *matrix, int x, int y || right != matrix->right_margin_glyphs); if (!marginal_areas_changed_p - && !fonts_changed_p + && !XFRAME (w->frame)->fonts_changed && !header_line_changed_p && matrix->window_left_col == WINDOW_LEFT_EDGE_COL (w) && matrix->window_top_line == WINDOW_TOP_EDGE_LINE (w) @@ -1799,37 +1788,17 @@ allocate_matrices_for_window_redisplay (struct window *w) } } - -/* Re-allocate/ re-compute glyph matrices on frame F. If F is null, - do it for all frames; otherwise do it just for the given frame. - This function must be called when a new frame is created, its size - changes, or its window configuration changes. */ +/* Allocate/reallocate glyph matrices of a single frame F. + This function must be called when a new frame is created, + its size changes, or its window configuration changes. */ void -adjust_glyphs (struct frame *f) +adjust_frame_glyphs (struct frame *f) { /* Block input so that expose events and other events that access glyph matrices are not processed while we are changing them. */ block_input (); - if (f) - adjust_frame_glyphs (f); - else - { - Lisp_Object tail, lisp_frame; - - FOR_EACH_FRAME (tail, lisp_frame) - adjust_frame_glyphs (XFRAME (lisp_frame)); - } - - unblock_input (); -} - -/* Allocate/reallocate glyph matrices of a single frame F. */ - -static void -adjust_frame_glyphs (struct frame *f) -{ if (FRAME_WINDOW_P (f)) adjust_frame_glyphs_for_window_redisplay (f); else @@ -1839,6 +1808,8 @@ adjust_frame_glyphs (struct frame *f) adjust_decode_mode_spec_buffer (f); f->glyphs_initialized_p = 1; + + unblock_input (); } /* Return true if any window in the tree has nonzero window margins. See @@ -5546,7 +5517,7 @@ change_frame_size_1 (struct frame *f, int newheight, int newwidth, w->cursor.vpos = w->cursor.y = 0; } - adjust_glyphs (f); + adjust_frame_glyphs (f); calculate_costs (f); SET_FRAME_GARBAGED (f); f->resized_p = 1; diff --git a/src/font.c b/src/font.c index 49398e1b876..2606a25dff8 100644 --- a/src/font.c +++ b/src/font.c @@ -2866,14 +2866,14 @@ font_open_entity (struct frame *f, Lisp_Object entity, int pixel_size) { FRAME_SMALLEST_CHAR_WIDTH (f) = min_width; FRAME_SMALLEST_FONT_HEIGHT (f) = height; - fonts_changed_p = 1; + f->fonts_changed = 1; } else { if (FRAME_SMALLEST_CHAR_WIDTH (f) > min_width) - FRAME_SMALLEST_CHAR_WIDTH (f) = min_width, fonts_changed_p = 1; + FRAME_SMALLEST_CHAR_WIDTH (f) = min_width, f->fonts_changed = 1; if (FRAME_SMALLEST_FONT_HEIGHT (f) > height) - FRAME_SMALLEST_FONT_HEIGHT (f) = height, fonts_changed_p = 1; + FRAME_SMALLEST_FONT_HEIGHT (f) = height, f->fonts_changed = 1; } #endif diff --git a/src/frame.c b/src/frame.c index b4638ed53c8..0f1560df157 100644 --- a/src/frame.c +++ b/src/frame.c @@ -224,7 +224,7 @@ set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) FRAME_WINDOW_SIZES_CHANGED (f) = 1; FRAME_MENU_BAR_LINES (f) = nlines; set_menu_bar_lines_1 (f->root_window, nlines - olines); - adjust_glyphs (f); + adjust_frame_glyphs (f); } } @@ -712,7 +712,7 @@ affects all frames on the same terminal device. */) change_frame_size (f, height, width, 0, 0, 0); } - adjust_glyphs (f); + adjust_frame_glyphs (f); calculate_costs (f); XSETFRAME (frame, f); diff --git a/src/frame.h b/src/frame.h index 17b6089120a..3c7499ea814 100644 --- a/src/frame.h +++ b/src/frame.h @@ -210,6 +210,10 @@ struct frame unsigned external_tool_bar : 1; #endif + /* Nonzero means that fonts have been loaded since the last glyph + matrix adjustments. */ + unsigned fonts_changed : 1; + /* Margin at the top of the frame. Used to display the tool-bar. */ int tool_bar_lines; diff --git a/src/w32fns.c b/src/w32fns.c index b8c445a3a36..58c63d959ef 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -1637,7 +1637,7 @@ x_set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) x_set_window_size (f, 0, FRAME_COLS (f), FRAME_LINES (f)); do_pending_window_change (0); } - adjust_glyphs (f); + adjust_frame_glyphs (f); } @@ -1679,7 +1679,7 @@ x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) FRAME_TOOL_BAR_LINES (f) = nlines; resize_frame_windows (f, FRAME_LINES (f), 0); - adjust_glyphs (f); + adjust_frame_glyphs (f); /* We also have to make sure that the internal border at the top of the frame, below the menu bar or tool bar, is redrawn when the @@ -6059,7 +6059,7 @@ Text larger than the specified size is clipped. */) } FRAME_TOTAL_COLS (f) = WINDOW_TOTAL_COLS (w); - adjust_glyphs (f); + adjust_frame_glyphs (f); w->pseudo_window_p = 1; /* Display the tooltip text in a temporary buffer. */ @@ -6128,7 +6128,7 @@ Text larger than the specified size is clipped. */) width /= WINDOW_FRAME_COLUMN_WIDTH (w); w->total_cols = width; FRAME_TOTAL_COLS (f) = width; - adjust_glyphs (f); + adjust_frame_glyphs (f); w->pseudo_window_p = 1; clear_glyph_matrix (w->desired_matrix); clear_glyph_matrix (w->current_matrix); diff --git a/src/window.c b/src/window.c index 253e6233fc1..6a52ed7e166 100644 --- a/src/window.c +++ b/src/window.c @@ -2945,7 +2945,7 @@ window-start value is reasonable when this function is called. */) } } - adjust_glyphs (f); + adjust_frame_glyphs (f); unblock_input (); run_window_configuration_change_hook (f); @@ -3645,7 +3645,7 @@ be applied on the Elisp level. */) windows_or_buffers_changed++; FRAME_WINDOW_SIZES_CHANGED (f) = 1; - adjust_glyphs (f); + adjust_frame_glyphs (f); unblock_input (); run_window_configuration_change_hook (f); @@ -3915,7 +3915,7 @@ set correctly. See the code of `split-window' for how this is done. */) block_input (); window_resize_apply (p, horflag); - adjust_glyphs (f); + adjust_frame_glyphs (f); /* Set buffer of NEW to buffer of reference window. Don't run any hooks. */ set_window_buffer (new, r->contents, 0, 1); @@ -4044,7 +4044,7 @@ Signal an error when WINDOW is the only window on its frame. */) recombine_windows (sibling); } - adjust_glyphs (f); + adjust_frame_glyphs (f); if (!WINDOW_LIVE_P (FRAME_SELECTED_WINDOW (f))) /* We deleted the frame's selected window. */ @@ -4131,7 +4131,7 @@ grow_mini_window (struct window *w, int delta) w->total_lines -= XINT (value); /* Enforce full redisplay. FIXME: make it more selective. */ windows_or_buffers_changed++; - adjust_glyphs (f); + adjust_frame_glyphs (f); unblock_input (); } } @@ -4165,7 +4165,7 @@ shrink_mini_window (struct window *w) w->total_lines = 1; /* Enforce full redisplay. FIXME: make it more selective. */ windows_or_buffers_changed++; - adjust_glyphs (f); + adjust_frame_glyphs (f); unblock_input (); } /* If the above failed for whatever strange reason we must make a @@ -4206,7 +4206,7 @@ DEFUN ("resize-mini-window-internal", Fresize_mini_window_internal, Sresize_mini windows_or_buffers_changed++; FRAME_WINDOW_SIZES_CHANGED (f) = 1; - adjust_glyphs (f); + adjust_frame_glyphs (f); unblock_input (); run_window_configuration_change_hook (f); @@ -4477,7 +4477,7 @@ window_scroll_pixel_based (Lisp_Object window, int n, bool whole, int noerror) visible. */ w->vscroll = (it.last_visible_y - it.current_y + it.max_ascent + it.max_descent); - adjust_glyphs (it.f); + adjust_frame_glyphs (it.f); } else { @@ -5754,7 +5754,7 @@ the return value is nil. Otherwise the value is t. */) ++n; } - adjust_glyphs (f); + adjust_frame_glyphs (f); unblock_input (); /* Scan dead buffer windows. */ @@ -6083,7 +6083,7 @@ apply_window_adjustment (struct window *w) clear_glyph_matrix (w->current_matrix); w->window_end_valid = 0; windows_or_buffers_changed++; - adjust_glyphs (XFRAME (WINDOW_FRAME (w))); + adjust_frame_glyphs (XFRAME (WINDOW_FRAME (w))); } @@ -6349,7 +6349,7 @@ If PIXELS-P is non-nil, the return value is VSCROLL. */) /* Adjust glyph matrix of the frame if the virtual display area becomes larger than before. */ if (w->vscroll < 0 && w->vscroll < old_dy) - adjust_glyphs (f); + adjust_frame_glyphs (f); /* Prevent redisplay shortcuts. */ XBUFFER (w->contents)->prevent_redisplay_optimizations_p = 1; diff --git a/src/xdisp.c b/src/xdisp.c index 74491a40d74..36f7f1e503e 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -11985,7 +11985,7 @@ redisplay_tool_bar (struct frame *f) if (WINDOW_TOTAL_LINES (w) != old_height) { clear_glyph_matrix (w->desired_matrix); - fonts_changed_p = 1; + f->fonts_changed = 1; return 1; } } @@ -12086,7 +12086,7 @@ redisplay_tool_bar (struct frame *f) { clear_glyph_matrix (w->desired_matrix); f->n_tool_bar_rows = nrows; - fonts_changed_p = 1; + f->fonts_changed = 1; return 1; } } @@ -12972,15 +12972,6 @@ redisplay_internal (void) last_glyphless_glyph_frame = NULL; last_glyphless_glyph_face_id = (1 << FACE_ID_BITS); - /* If new fonts have been loaded that make a glyph matrix adjustment - necessary, do it. */ - if (fonts_changed_p) - { - adjust_glyphs (NULL); - ++windows_or_buffers_changed; - fonts_changed_p = 0; - } - /* If face_change_count is non-zero, init_iterator will free all realized faces, which includes the faces referenced from current matrices. So, we can't reuse current matrices in this case. */ @@ -13011,7 +13002,15 @@ redisplay_internal (void) struct frame *f = XFRAME (frame); if (FRAME_VISIBLE_P (f)) - ++number_of_visible_frames; + { + ++number_of_visible_frames; + /* Adjust matrices for visible frames only. */ + if (f->fonts_changed) + { + adjust_frame_glyphs (f); + f->fonts_changed = 0; + } + } clear_desired_matrices (f); } @@ -13095,9 +13094,7 @@ redisplay_internal (void) if (!display_last_displayed_message_p) message_cleared_p = 0; - if (fonts_changed_p) - goto retry; - else if (window_height_changed_p) + if (window_height_changed_p) { consider_all_windows_p = 1; ++update_mode_lines; @@ -13372,6 +13369,8 @@ redisplay_internal (void) && !EQ (FRAME_TTY (f)->top_frame, frame)) continue; + retry_frame: + if (FRAME_WINDOW_P (f) || FRAME_TERMCAP_P (f) || f == sf) { /* Mark all the scroll bars to be removed; we'll redeem @@ -13391,20 +13390,22 @@ redisplay_internal (void) if (FRAME_TERMINAL (f)->judge_scroll_bars_hook) FRAME_TERMINAL (f)->judge_scroll_bars_hook (f); - /* If fonts changed, display again. */ - /* ??? rms: I suspect it is a mistake to jump all the way - back to retry here. It should just retry this frame. */ - if (fonts_changed_p) - goto retry; - if (FRAME_VISIBLE_P (f) && !FRAME_OBSCURED_P (f)) { + /* If fonts changed on visible frame, display again. */ + if (f->fonts_changed) + { + adjust_frame_glyphs (f); + f->fonts_changed = 0; + goto retry_frame; + } + /* See if we have to hscroll. */ if (!f->already_hscrolled_p) { f->already_hscrolled_p = 1; if (hscroll_windows (f->root_window)) - goto retry; + goto retry_frame; } /* Prevent various kinds of signals during display @@ -13462,7 +13463,7 @@ redisplay_internal (void) update: /* If fonts changed, display again. */ - if (fonts_changed_p) + if (sf->fonts_changed) goto retry; /* Prevent various kinds of signals during display update. @@ -15322,9 +15323,8 @@ set_vertical_scroll_bar (struct window *w) /* Redisplay leaf window WINDOW. JUST_THIS_ONE_P non-zero means only selected_window is redisplayed. - We can return without actually redisplaying the window if - fonts_changed_p. In that case, redisplay_internal will - retry. */ + We can return without actually redisplaying the window if fonts has been + changed on window's frame. In that case, redisplay_internal will retry. */ static void redisplay_window (Lisp_Object window, int just_this_one_p) @@ -15709,7 +15709,7 @@ redisplay_window (Lisp_Object window, int just_this_one_p) debug_method_add (w, "try_window_id %d", tem); #endif - if (fonts_changed_p) + if (f->fonts_changed) goto need_larger_matrices; if (tem > 0) goto done; @@ -15779,12 +15779,12 @@ redisplay_window (Lisp_Object window, int just_this_one_p) IF_DEBUG (debug_method_add (w, "1")); if (try_window (window, startp, TRY_WINDOW_CHECK_MARGINS) < 0) /* -1 means we need to scroll. - 0 means we need new matrices, but fonts_changed_p + 0 means we need new matrices, but fonts_changed is set in that case, so we will detect it below. */ goto try_to_scroll; } - if (fonts_changed_p) + if (f->fonts_changed) goto need_larger_matrices; if (w->cursor.vpos >= 0) @@ -15985,7 +15985,7 @@ redisplay_window (Lisp_Object window, int just_this_one_p) /* If new fonts have been loaded (due to fontsets), give up. We have to start a new redisplay since we need to re-adjust glyph matrices. */ - if (fonts_changed_p) + if (f->fonts_changed) goto need_larger_matrices; /* If cursor did not appear assume that the middle of the window is @@ -16098,7 +16098,7 @@ redisplay_window (Lisp_Object window, int just_this_one_p) if (WINDOW_WANTS_MODELINE_P (w) && CURRENT_MODE_LINE_HEIGHT (w) != DESIRED_MODE_LINE_HEIGHT (w)) { - fonts_changed_p = 1; + f->fonts_changed = 1; w->mode_line_height = -1; MATRIX_MODE_LINE_ROW (w->current_matrix)->height = DESIRED_MODE_LINE_HEIGHT (w); @@ -16109,13 +16109,13 @@ redisplay_window (Lisp_Object window, int just_this_one_p) if (WINDOW_WANTS_HEADER_LINE_P (w) && CURRENT_HEADER_LINE_HEIGHT (w) != DESIRED_HEADER_LINE_HEIGHT (w)) { - fonts_changed_p = 1; + f->fonts_changed = 1; w->header_line_height = -1; MATRIX_HEADER_LINE_ROW (w->current_matrix)->height = DESIRED_HEADER_LINE_HEIGHT (w); } - if (fonts_changed_p) + if (f->fonts_changed) goto need_larger_matrices; } @@ -16180,8 +16180,8 @@ redisplay_window (Lisp_Object window, int just_this_one_p) } #endif /* HAVE_WINDOW_SYSTEM */ - /* We go to this label, with fonts_changed_p set, - if it is necessary to try again using larger glyph matrices. + /* We go to this label, with fonts_changed set, if it is + necessary to try again using larger glyph matrices. We have to redeem the scroll bar even in this case, because the loop in redisplay_internal expects that. */ need_larger_matrices: @@ -16253,7 +16253,7 @@ try_window (Lisp_Object window, struct text_pos pos, int flags) { if (display_line (&it)) last_text_row = it.glyph_row - 1; - if (fonts_changed_p && !(flags & TRY_WINDOW_IGNORE_FONTS_CHANGE)) + if (f->fonts_changed && !(flags & TRY_WINDOW_IGNORE_FONTS_CHANGE)) return 0; } @@ -16399,8 +16399,7 @@ try_window_reusing_current_matrix (struct window *w) w->cursor.vpos = -1; last_text_row = last_reused_text_row = NULL; - while (it.current_y < it.last_visible_y - && !fonts_changed_p) + while (it.current_y < it.last_visible_y && !f->fonts_changed) { /* If we have reached into the characters in the START row, that means the line boundaries have changed. So we @@ -16611,7 +16610,7 @@ try_window_reusing_current_matrix (struct window *w) if (pt_row == NULL) w->cursor.vpos = -1; last_text_row = NULL; - while (it.current_y < it.last_visible_y && !fonts_changed_p) + while (it.current_y < it.last_visible_y && !f->fonts_changed) if (display_line (&it)) last_text_row = it.glyph_row - 1; @@ -17454,7 +17453,7 @@ try_window_id (struct window *w) last_text_row = NULL; overlay_arrow_seen = 0; while (it.current_y < it.last_visible_y - && !fonts_changed_p + && !f->fonts_changed && (first_unchanged_at_end_row == NULL || IT_CHARPOS (it) < stop_pos)) { @@ -17462,7 +17461,7 @@ try_window_id (struct window *w) last_text_row = it.glyph_row - 1; } - if (fonts_changed_p) + if (f->fonts_changed) return -1; @@ -17709,8 +17708,7 @@ try_window_id (struct window *w) /* Display the rest of the lines at the window end. */ it.glyph_row = MATRIX_ROW (desired_matrix, it.vpos); - while (it.current_y < it.last_visible_y - && !fonts_changed_p) + while (it.current_y < it.last_visible_y && !f->fonts_changed) { /* Is it always sure that the display agrees with lines in the current matrix? I don't think so, so we mark rows @@ -19246,7 +19244,7 @@ display_line (struct it *it) >= it->w->desired_matrix->nrows) { it->w->nrows_scale_factor++; - fonts_changed_p = 1; + it->f->fonts_changed = 1; return 0; } @@ -23974,12 +23972,12 @@ draw_glyphs (struct window *w, int x, struct glyph_row *row, #define IT_EXPAND_MATRIX_WIDTH(it, area) \ { \ - if (!fonts_changed_p \ + if (!it->f->fonts_changed \ && (it->glyph_row->glyphs[area] \ < it->glyph_row->glyphs[area + 1])) \ { \ it->w->ncols_scale_factor++; \ - fonts_changed_p = 1; \ + it->f->fonts_changed = 1; \ } \ } diff --git a/src/xfns.c b/src/xfns.c index b08fc76524c..4e8442dd3a3 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -1201,7 +1201,7 @@ x_set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) clear_glyph_matrix (XWINDOW (f->menu_bar_window)->current_matrix); } #endif /* not USE_X_TOOLKIT && not USE_GTK */ - adjust_glyphs (f); + adjust_frame_glyphs (f); run_window_configuration_change_hook (f); } @@ -1264,7 +1264,7 @@ x_set_tool_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval) FRAME_TOOL_BAR_LINES (f) = nlines; resize_frame_windows (f, FRAME_LINES (f), 0); - adjust_glyphs (f); + adjust_frame_glyphs (f); /* We also have to make sure that the internal border at the top of the frame, below the menu bar or tool bar, is redrawn when the @@ -5486,7 +5486,7 @@ Text larger than the specified size is clipped. */) } FRAME_TOTAL_COLS (f) = w->total_cols; - adjust_glyphs (f); + adjust_frame_glyphs (f); w->pseudo_window_p = 1; /* Display the tooltip text in a temporary buffer. */ @@ -5554,7 +5554,7 @@ Text larger than the specified size is clipped. */) width /= WINDOW_FRAME_COLUMN_WIDTH (w); w->total_cols = width; FRAME_TOTAL_COLS (f) = width; - adjust_glyphs (f); + adjust_frame_glyphs (f); clear_glyph_matrix (w->desired_matrix); clear_glyph_matrix (w->current_matrix); try_window (FRAME_ROOT_WINDOW (f), pos, 0); -- 2.39.2