Mercurial > emacs
changeset 36963:7b7bf883e6f1
(try_window_id): Disable rows below the window end.
(try_window_reusing_current_matrix): Use cursor_row_p.
(try_window_reusing_current_matrix) <scrolling up>: Fix disabling
of rows.
(init_from_display_pos): If POS specifies a position in a display
vector, maybe get the iterator set up for that ellipsis.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Fri, 23 Mar 2001 16:21:25 +0000 |
parents | 9c7eb7e6bf3e |
children | 6c98ab950acc |
files | src/xdisp.c |
diffstat | 1 files changed, 121 insertions(+), 87 deletions(-) [+] |
line wrap: on
line diff
--- a/src/xdisp.c Fri Mar 23 12:38:16 2001 +0000 +++ b/src/xdisp.c Fri Mar 23 16:21:25 2001 +0000 @@ -1749,6 +1749,32 @@ struct window *w; struct display_pos *pos; { + int charpos = CHARPOS (pos->pos), bytepos = BYTEPOS (pos->pos); + Lisp_Object prop, window; + + /* If POS specifies a position in a display vector, this might + be for an ellipsis displayed for invisible text. We won't + get the iterator set up for delivering that ellipsis unless + we make sure that it gets aware of the invisible text. */ + if (pos->dpvec_index >= 0 + && pos->overlay_string_index < 0 + && CHARPOS (pos->string_pos) < 0 + && charpos > BEGV + && (XSETWINDOW (window, w), + prop = Fget_char_property (make_number (charpos), + Qinvisible, window), + NILP (prop))) + { + prop = Fget_char_property (make_number (charpos - 1), Qinvisible, + window); + if (TEXT_PROP_MEANS_INVISIBLE (prop) + && TEXT_PROP_MEANS_INVISIBLE_WITH_ELLIPSIS (prop)) + { + --charpos; + bytepos = 0; + } + } + /* Keep in mind: the call to reseat in init_iterator skips invisible text, so we might end up at a position different from POS. This is only a problem when POS is a row start after a newline and an @@ -1758,8 +1784,8 @@ newline before the row start, such a POS will not be in a string, but the call to init_iterator below will move us to the after-string. */ - init_iterator (it, w, CHARPOS (pos->pos), BYTEPOS (pos->pos), - NULL, DEFAULT_FACE_ID); + init_iterator (it, w, charpos, bytepos, NULL, DEFAULT_FACE_ID); + xassert (IT_CHARPOS (*it) == CHARPOS (pos->pos)); /* If position is within an overlay string, set up IT to the right overlay string. */ @@ -1812,15 +1838,27 @@ xassert (STRINGP (it->string)); } - /* Restore position in display vector translations or control - character translations. */ + /* Restore position in display vector translations, control + character translations or ellipses. */ if (pos->dpvec_index >= 0) { - /* This fills IT->dpvec. */ - get_next_display_element (it); + if (it->dpvec == NULL) + get_next_display_element (it); xassert (it->dpvec && it->current.dpvec_index == 0); it->current.dpvec_index = pos->dpvec_index; } + else if (it->current.dpvec_index >= 0) + { + /* I don't think this can happen, just being paranoid... */ + it->dpvec = NULL; + it->current.dpvec_index = -1; + if (it->s) + it->method = next_element_from_c_string; + else if (STRINGP (it->string)) + it->method = next_element_from_string; + else + it->method = next_element_from_buffer; + } CHECK_IT (it); } @@ -1936,7 +1974,7 @@ properties. */ object = it->string; limit = Qnil; - XSETFASTINT (position, IT_STRING_CHARPOS (*it)); + position = make_number (IT_STRING_CHARPOS (*it)); } else { @@ -1963,8 +2001,8 @@ /* Set up variables for computing the stop position from text property changes. */ XSETBUFFER (object, current_buffer); - XSETFASTINT (limit, IT_CHARPOS (*it) + TEXT_PROP_DISTANCE_LIMIT); - XSETFASTINT (position, IT_CHARPOS (*it)); + limit = make_number (IT_CHARPOS (*it) + TEXT_PROP_DISTANCE_LIMIT); + position = make_number (IT_CHARPOS (*it)); } @@ -2409,7 +2447,7 @@ /* Get the value of the invisible text property at the current position. Value will be nil if there is no such property. */ - XSETFASTINT (charpos, IT_STRING_CHARPOS (*it)); + charpos = make_number (IT_STRING_CHARPOS (*it)); prop = Fget_text_property (charpos, Qinvisible, it->string); if (!NILP (prop) @@ -2463,7 +2501,7 @@ Lisp_Object pos, prop; /* First of all, is there invisible text at this position? */ - XSETFASTINT (pos, IT_CHARPOS (*it)); + pos = make_number (IT_CHARPOS (*it)); prop = Fget_char_property (pos, Qinvisible, it->window); /* If we are on invisible text, skip over it. */ @@ -2502,7 +2540,7 @@ the char before the given position, i.e. if we get visible_p = 1, this means that the char at newpos is visible. */ - XSETFASTINT (pos, newpos); + pos = make_number (newpos); prop = Fget_char_property (pos, Qinvisible, it->window); visible_p = !TEXT_PROP_MEANS_INVISIBLE (prop); } @@ -8687,15 +8725,15 @@ mark_window_display_accurate (FRAME_ROOT_WINDOW (sf), 1); else { - XSETFASTINT (w->last_point, BUF_PT (b)); + w->last_point = make_number (BUF_PT (b)); w->last_cursor = w->cursor; w->last_cursor_off_p = w->cursor_off_p; b->clip_changed = 0; b->prevent_redisplay_optimizations_p = 0; w->update_mode_line = Qnil; - XSETFASTINT (w->last_modified, BUF_MODIFF (b)); - XSETFASTINT (w->last_overlay_modified, BUF_OVERLAY_MODIFF (b)); + w->last_modified = make_number (BUF_MODIFF (b)); + w->last_overlay_modified = make_number (BUF_OVERLAY_MODIFF (b)); w->last_had_star = (BUF_MODIFF (XBUFFER (w->buffer)) > BUF_SAVE_MODIFF (XBUFFER (w->buffer)) ? Qt : Qnil); @@ -8839,10 +8877,10 @@ { struct buffer *b = XBUFFER (w->buffer); - XSETFASTINT (w->last_modified, - accurate_p ? BUF_MODIFF (b) : 0); - XSETFASTINT (w->last_overlay_modified, - accurate_p ? BUF_OVERLAY_MODIFF (b) : 0); + w->last_modified + = make_number (accurate_p ? BUF_MODIFF (b) : 0); + w->last_overlay_modified + = make_number (accurate_p ? BUF_OVERLAY_MODIFF (b) : 0); w->last_had_star = (BUF_MODIFF (b) > BUF_SAVE_MODIFF (b) ? Qt : Qnil); @@ -9840,8 +9878,8 @@ startp = run_window_scroll_functions (window, startp); } - XSETFASTINT (w->last_modified, 0); - XSETFASTINT (w->last_overlay_modified, 0); + w->last_modified = make_number (0); + w->last_overlay_modified = make_number (0); if (CHARPOS (startp) < BEGV) SET_TEXT_POS (startp, BEGV, BEGV_BYTE); else if (CHARPOS (startp) > ZV) @@ -10010,8 +10048,8 @@ try_to_scroll: - XSETFASTINT (w->last_modified, 0); - XSETFASTINT (w->last_overlay_modified, 0); + w->last_modified = make_number (0); + w->last_overlay_modified = make_number (0); /* Redisplay the mode line. Select the buffer properly for that. */ if (!update_mode_line) @@ -10330,18 +10368,17 @@ xassert (MATRIX_ROW_DISPLAYS_TEXT_P (last_text_row)); w->window_end_bytepos = Z_BYTE - MATRIX_ROW_END_BYTEPOS (last_text_row); - XSETFASTINT (w->window_end_pos, - Z - MATRIX_ROW_END_CHARPOS (last_text_row)); - XSETFASTINT (w->window_end_vpos, - MATRIX_ROW_VPOS (last_text_row, w->desired_matrix)); + w->window_end_pos + = make_number (Z - MATRIX_ROW_END_CHARPOS (last_text_row)); + w->window_end_vpos + = make_number (MATRIX_ROW_VPOS (last_text_row, w->desired_matrix)); xassert (MATRIX_ROW (w->desired_matrix, XFASTINT (w->window_end_vpos)) ->displays_text_p); } else { w->window_end_bytepos = 0; - XSETFASTINT (w->window_end_pos, 0); - XSETFASTINT (w->window_end_vpos, 0); + w->window_end_pos = w->window_end_vpos = make_number (0); } /* But that is not valid info until redisplay finishes. */ @@ -10446,8 +10483,7 @@ row = MATRIX_FIRST_TEXT_ROW (w->current_matrix); while (MATRIX_ROW_DISPLAYS_TEXT_P (row)) { - if (PT >= MATRIX_ROW_START_CHARPOS (row) - && PT < MATRIX_ROW_END_CHARPOS (row)) + if (cursor_row_p (w, row)) { set_cursor_from_row (w, row, w->current_matrix, 0, 0, dy, nrows_scrolled); @@ -10540,27 +10576,26 @@ { w->window_end_bytepos = Z_BYTE - MATRIX_ROW_END_BYTEPOS (last_reused_text_row); - XSETFASTINT (w->window_end_pos, - Z - MATRIX_ROW_END_CHARPOS (last_reused_text_row)); - XSETFASTINT (w->window_end_vpos, - MATRIX_ROW_VPOS (last_reused_text_row, - w->current_matrix)); + w->window_end_pos + = make_number (Z - MATRIX_ROW_END_CHARPOS (last_reused_text_row)); + w->window_end_vpos + = make_number (MATRIX_ROW_VPOS (last_reused_text_row, + w->current_matrix)); } else if (last_text_row) { w->window_end_bytepos = Z_BYTE - MATRIX_ROW_END_BYTEPOS (last_text_row); - XSETFASTINT (w->window_end_pos, - Z - MATRIX_ROW_END_CHARPOS (last_text_row)); - XSETFASTINT (w->window_end_vpos, - MATRIX_ROW_VPOS (last_text_row, w->desired_matrix)); + w->window_end_pos + = make_number (Z - MATRIX_ROW_END_CHARPOS (last_text_row)); + w->window_end_vpos + = make_number (MATRIX_ROW_VPOS (last_text_row, w->desired_matrix)); } else { /* This window must be completely empty. */ w->window_end_bytepos = 0; - XSETFASTINT (w->window_end_pos, 0); - XSETFASTINT (w->window_end_vpos, 0); + w->window_end_pos = w->window_end_vpos = make_number (0); } w->window_end_valid = Qnil; @@ -10580,8 +10615,6 @@ int dy; int yb = window_text_bottom_y (w); - IF_DEBUG (debug_method_add (w, "twu2")); - /* Find the row starting at new_start, if there is one. Don't reuse a partially visible line at the end. */ first_reusable_row = start_row; @@ -10602,15 +10635,13 @@ first_reusable_row to the end of the window. Set first_row_to_display to the first row that cannot be reused. Set pt_row to the row containing point, if there is any. */ - first_row_to_display = first_reusable_row; pt_row = NULL; - while (MATRIX_ROW_BOTTOM_Y (first_row_to_display) < yb) - { - if (PT >= MATRIX_ROW_START_CHARPOS (first_row_to_display) - && PT < MATRIX_ROW_END_CHARPOS (first_row_to_display)) + for (first_row_to_display = first_reusable_row; + MATRIX_ROW_BOTTOM_Y (first_row_to_display) < yb; + ++first_row_to_display) + { + if (cursor_row_p (w, first_row_to_display)) pt_row = first_row_to_display; - - ++first_row_to_display; } /* Start displaying at the start of first_row_to_display. */ @@ -10683,13 +10714,6 @@ row->visible_height = row->height; } - /* Disable rows not reused. */ - while (row < bottom_row) - { - row->enabled_p = 0; - ++row; - } - /* Scroll the current matrix. */ xassert (nrows_scrolled > 0); rotate_matrix (w->current_matrix, @@ -10697,6 +10721,10 @@ MATRIX_ROW_VPOS (bottom_row, w->current_matrix), -nrows_scrolled); + /* Disable rows not reused. */ + for (row -= nrows_scrolled; row < bottom_row; ++row) + row->enabled_p = 0; + /* Adjust window end. A null value of last_text_row means that the window end is in reused rows which in turn means that only its vpos can have changed. */ @@ -10704,15 +10732,15 @@ { w->window_end_bytepos = Z_BYTE - MATRIX_ROW_END_BYTEPOS (last_text_row); - XSETFASTINT (w->window_end_pos, - Z - MATRIX_ROW_END_CHARPOS (last_text_row)); - XSETFASTINT (w->window_end_vpos, - MATRIX_ROW_VPOS (last_text_row, w->desired_matrix)); + w->window_end_pos + = make_number (Z - MATRIX_ROW_END_CHARPOS (last_text_row)); + w->window_end_vpos + = make_number (MATRIX_ROW_VPOS (last_text_row, w->desired_matrix)); } else { - XSETFASTINT (w->window_end_vpos, - XFASTINT (w->window_end_vpos) - nrows_scrolled); + w->window_end_vpos + = make_number (XFASTINT (w->window_end_vpos) - nrows_scrolled); } w->window_end_valid = Qnil; @@ -11511,31 +11539,31 @@ first_unchanged_at_end_row); xassert (row && MATRIX_ROW_DISPLAYS_TEXT_P (row)); - XSETFASTINT (w->window_end_pos, Z - MATRIX_ROW_END_CHARPOS (row)); + w->window_end_pos = make_number (Z - MATRIX_ROW_END_CHARPOS (row)); w->window_end_bytepos = Z_BYTE - MATRIX_ROW_END_BYTEPOS (row); - XSETFASTINT (w->window_end_vpos, - MATRIX_ROW_VPOS (row, w->current_matrix)); + w->window_end_vpos + = make_number (MATRIX_ROW_VPOS (row, w->current_matrix)); } else if (last_text_row_at_end) { - XSETFASTINT (w->window_end_pos, - Z - MATRIX_ROW_END_CHARPOS (last_text_row_at_end)); + w->window_end_pos + = make_number (Z - MATRIX_ROW_END_CHARPOS (last_text_row_at_end)); w->window_end_bytepos = Z_BYTE - MATRIX_ROW_END_BYTEPOS (last_text_row_at_end); - XSETFASTINT (w->window_end_vpos, - MATRIX_ROW_VPOS (last_text_row_at_end, desired_matrix)); + w->window_end_vpos + = make_number (MATRIX_ROW_VPOS (last_text_row_at_end, desired_matrix)); } else if (last_text_row) { /* We have displayed either to the end of the window or at the end of the window, i.e. the last row with text is to be found in the desired matrix. */ - XSETFASTINT (w->window_end_pos, - Z - MATRIX_ROW_END_CHARPOS (last_text_row)); + w->window_end_pos + = make_number (Z - MATRIX_ROW_END_CHARPOS (last_text_row)); w->window_end_bytepos = Z_BYTE - MATRIX_ROW_END_BYTEPOS (last_text_row); - XSETFASTINT (w->window_end_vpos, - MATRIX_ROW_VPOS (last_text_row, desired_matrix)); + w->window_end_vpos + = make_number (MATRIX_ROW_VPOS (last_text_row, desired_matrix)); } else if (first_unchanged_at_end_row == NULL && last_text_row == NULL @@ -11557,6 +11585,12 @@ } else abort (); + + /* Disable rows below what's displayed in the window. This makes + debugging easier. */ + enable_glyph_matrix_rows (current_matrix, + XFASTINT (w->window_end_vpos) + 1, + bottom_vpos, 0); IF_DEBUG (debug_end_pos = XFASTINT (w->window_end_pos); debug_end_vpos = XFASTINT (w->window_end_vpos)); @@ -11892,7 +11926,7 @@ p += it.len; /* Get its face. */ - XSETFASTINT (ilisp, p - arrow_string); + ilisp = make_number (p - arrow_string); face = Fget_text_property (ilisp, Qface, Voverlay_arrow_string); it.face_id = compute_char_face (f, it.c, face); @@ -13486,7 +13520,7 @@ case 'c': { int col = current_column (); - XSETFASTINT (w->column_number_displayed, col); + w->column_number_displayed = make_number (col); pint2str (decode_mode_spec_buf, field_width, col); return decode_mode_spec_buf; } @@ -13556,8 +13590,8 @@ go back past it. */ if (startpos == BUF_BEGV (b)) { - XSETFASTINT (w->base_line_number, topline); - XSETFASTINT (w->base_line_pos, BUF_BEGV (b)); + w->base_line_number = make_number (topline); + w->base_line_pos = make_number (BUF_BEGV (b)); } else if (nlines < height + 25 || nlines > height * 3 + 50 || linepos == BUF_BEGV (b)) @@ -13587,8 +13621,8 @@ goto no_value; } - XSETFASTINT (w->base_line_number, topline - nlines); - XSETFASTINT (w->base_line_pos, BYTE_TO_CHAR (position)); + w->base_line_number = make_number (topline - nlines); + w->base_line_pos = make_number (BYTE_TO_CHAR (position)); } /* Now count lines from the start pos to point. */ @@ -14374,7 +14408,7 @@ "Maximum number of lines to keep in the message log buffer.\n\ If nil, disable message logging. If t, log messages but don't truncate\n\ the buffer when it becomes large."); - XSETFASTINT (Vmessage_log_max, 50); + Vmessage_log_max = make_number (50); DEFVAR_LISP ("window-size-change-functions", &Vwindow_size_change_functions, "Functions called before redisplay, if window sizes have changed.\n\ @@ -14498,15 +14532,15 @@ struct frame *f = XFRAME (WINDOW_FRAME (XWINDOW (root_window))); int i; - XSETFASTINT (XWINDOW (root_window)->top, FRAME_TOP_MARGIN (f)); + XWINDOW (root_window)->top = make_number (FRAME_TOP_MARGIN (f)); set_window_height (root_window, FRAME_HEIGHT (f) - 1 - FRAME_TOP_MARGIN (f), 0); - XSETFASTINT (mini_w->top, FRAME_HEIGHT (f) - 1); + mini_w->top = make_number (FRAME_HEIGHT (f) - 1); set_window_height (minibuf_window, 1, 0); - XSETFASTINT (XWINDOW (root_window)->width, FRAME_WIDTH (f)); - XSETFASTINT (mini_w->width, FRAME_WIDTH (f)); + XWINDOW (root_window)->width = make_number (FRAME_WIDTH (f)); + mini_w->width = make_number (FRAME_WIDTH (f)); scratch_glyph_row.glyphs[TEXT_AREA] = scratch_glyphs; scratch_glyph_row.glyphs[TEXT_AREA + 1] @@ -14514,7 +14548,7 @@ /* The default ellipsis glyphs `...'. */ for (i = 0; i < 3; ++i) - XSETFASTINT (default_invis_vector[i], '.'); + default_invis_vector[i] = make_number ('.'); } #ifdef HAVE_WINDOW_SYSTEM