diff options
Diffstat (limited to 'src/xdisp.c')
-rw-r--r-- | src/xdisp.c | 979 |
1 files changed, 559 insertions, 420 deletions
diff --git a/src/xdisp.c b/src/xdisp.c index 274ab8ddf51..f6f75f321c4 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -265,7 +265,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ character to be delivered is a composed character, the iteration calls composition_reseat_it and next_element_from_composition. If they succeed to compose the character with one or more of the - following characters, the whole sequence of characters that where + following characters, the whole sequence of characters that were composed is recorded in the `struct composition_it' object that is part of the buffer iterator. The composed sequence could produce one or more font glyphs (called "grapheme clusters") on the screen. @@ -440,10 +440,8 @@ static Lisp_Object default_invis_vector[3]; Lisp_Object echo_area_window; -/* List of pairs (MESSAGE . MULTIBYTE). The function save_message - pushes the current message and the value of - message_enable_multibyte on the stack, the function restore_message - pops the stack and displays MESSAGE again. */ +/* Stack of messages, which are pushed by push_message and popped and + displayed by restore_message. */ static Lisp_Object Vmessage_stack; @@ -469,12 +467,12 @@ static bool message_enable_multibyte; looking for those `redisplay' bits (actually, there might be some such bits set, but then only on objects which aren't displayed anyway). - OTOH if it's non-zero we wil have to loop through all windows and then check - the `redisplay' bit of the corresponding window, frame, and buffer, in order - to decide whether that window needs attention or not. Note that we can't - just look at the frame's redisplay bit to decide that the whole frame can be - skipped, since even if the frame's redisplay bit is unset, some of its - windows's redisplay bits may be set. + OTOH if it's non-zero we will have to loop through all windows and then + check the `redisplay' bit of the corresponding window, frame, and buffer, in + order to decide whether that window needs attention or not. Note that we + can't just look at the frame's redisplay bit to decide that the whole frame + can be skipped, since even if the frame's redisplay bit is unset, some of + its windows's redisplay bits may be set. Mostly for historical reasons, windows_or_buffers_changed can also take other non-zero values. In that case, the precise value doesn't matter (it @@ -485,7 +483,7 @@ static bool message_enable_multibyte; int windows_or_buffers_changed; /* Nonzero if we should redraw the mode lines on the next redisplay. - Similarly to `windows_or_buffers_changed', If it has value REDISPLAY_SOME, + Similarly to `windows_or_buffers_changed', if it has value REDISPLAY_SOME, then only redisplay the mode lines in those buffers/windows/frames where the `redisplay' bit has been set. For any other value, redisplay all mode lines (the number used is then only @@ -844,7 +842,7 @@ static Lisp_Object redisplay_window_1 (Lisp_Object); static bool set_cursor_from_row (struct window *, struct glyph_row *, struct glyph_matrix *, ptrdiff_t, ptrdiff_t, int, int); -static bool cursor_row_fully_visible_p (struct window *, bool, bool); +static bool cursor_row_fully_visible_p (struct window *, bool, bool, bool); static bool update_menu_bar (struct frame *, bool, bool); static bool try_window_reusing_current_matrix (struct window *); static int try_window_id (struct window *); @@ -1216,7 +1214,7 @@ Value is the height in pixels of the line at point. */) move_it_by_lines (&it, 0); it.vpos = it.current_y = 0; last_height = 0; - result = make_number (line_bottom_y (&it)); + result = make_fixnum (line_bottom_y (&it)); if (old_buffer) set_buffer_internal_1 (old_buffer); @@ -1252,8 +1250,8 @@ default_line_pixel_height (struct window *w) val = BVAR (&buffer_defaults, extra_line_spacing); if (!NILP (val)) { - if (RANGED_INTEGERP (0, val, INT_MAX)) - height += XFASTINT (val); + if (RANGED_FIXNUMP (0, val, INT_MAX)) + height += XFIXNAT (val); else if (FLOATP (val)) { int addon = XFLOAT_DATA (val) * height + 0.5; @@ -1509,7 +1507,7 @@ pos_visible_p (struct window *w, ptrdiff_t charpos, int *x, int *y, } else if (IT_CHARPOS (it) != charpos) { - Lisp_Object cpos = make_number (charpos); + Lisp_Object cpos = make_fixnum (charpos); Lisp_Object spec = Fget_char_property (cpos, Qdisplay, Qnil); Lisp_Object string = string_from_display_spec (spec); struct text_pos tpos; @@ -1552,8 +1550,8 @@ pos_visible_p (struct window *w, ptrdiff_t charpos, int *x, int *y, startpos = Fprevious_single_char_property_change (endpos, Qdisplay, Qnil, Qnil); - start = XFASTINT (startpos); - end = XFASTINT (endpos); + start = XFIXNAT (startpos); + end = XFIXNAT (endpos); /* Move to the last buffer position before the display property. */ start_display (&it3, w, top); @@ -2283,9 +2281,9 @@ get_phys_cursor_geometry (struct window *w, struct glyph_row *row, int x, y, wd, h, h0, y0, ascent; /* Compute the width of the rectangle to draw. If on a stretch - glyph, and `x-stretch-block-cursor' is nil, don't draw a - rectangle as wide as the glyph, but use a canonical character - width instead. */ + glyph, and `x-stretch-cursor' is nil, don't draw a rectangle + as wide as the glyph, but use a canonical character width + instead. */ wd = glyph->pixel_width; x = w->phys_cursor.x; @@ -2645,8 +2643,7 @@ safe__call (bool inhibit_quit, ptrdiff_t nargs, Lisp_Object func, va_list ap) so there is no possibility of wanting to redisplay. */ val = internal_condition_case_n (Ffuncall, nargs, args, Qt, safe_eval_handler); - SAFE_FREE (); - val = unbind_to (count, val); + val = SAFE_FREE_UNBIND_TO (count, val); } return val; @@ -2817,7 +2814,7 @@ init_iterator (struct it *it, struct window *w, /* Perhaps remap BASE_FACE_ID to a user-specified alternative. */ if (! NILP (Vface_remapping_alist)) remapped_base_face_id - = lookup_basic_face (XFRAME (w->frame), base_face_id); + = lookup_basic_face (w, XFRAME (w->frame), base_face_id); /* Use one of the mode line rows of W's desired matrix if appropriate. */ @@ -2851,8 +2848,8 @@ init_iterator (struct it *it, struct window *w, if (base_face_id == DEFAULT_FACE_ID && FRAME_WINDOW_P (it->f)) { - if (NATNUMP (BVAR (current_buffer, extra_line_spacing))) - it->extra_line_spacing = XFASTINT (BVAR (current_buffer, extra_line_spacing)); + if (FIXNATP (BVAR (current_buffer, extra_line_spacing))) + it->extra_line_spacing = XFIXNAT (BVAR (current_buffer, extra_line_spacing)); else if (FLOATP (BVAR (current_buffer, extra_line_spacing))) it->extra_line_spacing = (XFLOAT_DATA (BVAR (current_buffer, extra_line_spacing)) * FRAME_LINE_HEIGHT (it->f)); @@ -2877,9 +2874,9 @@ init_iterator (struct it *it, struct window *w, /* -1 means everything between a CR and the following line end is invisible. >0 means lines indented more than this value are invisible. */ - it->selective = (INTEGERP (BVAR (current_buffer, selective_display)) + it->selective = (FIXNUMP (BVAR (current_buffer, selective_display)) ? (clip_to_bounds - (-1, XINT (BVAR (current_buffer, selective_display)), + (-1, XFIXNUM (BVAR (current_buffer, selective_display)), PTRDIFF_MAX)) : (!NILP (BVAR (current_buffer, selective_display)) ? -1 : 0)); @@ -2898,9 +2895,9 @@ init_iterator (struct it *it, struct window *w, && XMARKER (w->redisplay_end_trigger)->buffer != 0) it->redisplay_end_trigger_charpos = marker_position (w->redisplay_end_trigger); - else if (INTEGERP (w->redisplay_end_trigger)) + else if (FIXNUMP (w->redisplay_end_trigger)) it->redisplay_end_trigger_charpos - = clip_to_bounds (PTRDIFF_MIN, XINT (w->redisplay_end_trigger), + = clip_to_bounds (PTRDIFF_MIN, XFIXNUM (w->redisplay_end_trigger), PTRDIFF_MAX); it->tab_width = SANE_TAB_WIDTH (current_buffer); @@ -2912,9 +2909,9 @@ init_iterator (struct it *it, struct window *w, && !it->w->hscroll && (WINDOW_FULL_WIDTH_P (it->w) || NILP (Vtruncate_partial_width_windows) - || (INTEGERP (Vtruncate_partial_width_windows) + || (FIXNUMP (Vtruncate_partial_width_windows) /* PXW: Shall we do something about this? */ - && (XINT (Vtruncate_partial_width_windows) + && (XFIXNUM (Vtruncate_partial_width_windows) <= WINDOW_TOTAL_COLS (it->w)))) && NILP (BVAR (current_buffer, truncate_lines))) it->line_wrap = NILP (BVAR (current_buffer, word_wrap)) @@ -3197,11 +3194,11 @@ in_ellipses_for_invisible_text_p (struct display_pos *pos, struct window *w) && CHARPOS (pos->string_pos) < 0 && charpos > BEGV && (XSETWINDOW (window, w), - prop = Fget_char_property (make_number (charpos), + prop = Fget_char_property (make_fixnum (charpos), Qinvisible, window), TEXT_PROP_MEANS_INVISIBLE (prop) == 0)) { - prop = Fget_char_property (make_number (charpos - 1), Qinvisible, + prop = Fget_char_property (make_fixnum (charpos - 1), Qinvisible, window); ellipses_p = 2 == TEXT_PROP_MEANS_INVISIBLE (prop); } @@ -3586,12 +3583,12 @@ compute_stop_pos (struct it *it) /* Set up variables for computing the stop position from text property changes. */ XSETBUFFER (object, current_buffer); - limit = make_number (IT_CHARPOS (*it) + TEXT_PROP_DISTANCE_LIMIT); + limit = make_fixnum (IT_CHARPOS (*it) + TEXT_PROP_DISTANCE_LIMIT); } /* Get the interval containing IT's position. Value is a null interval if there isn't such an interval. */ - position = make_number (charpos); + position = make_fixnum (charpos); iv = validate_interval_range (object, &position, &position, false); if (iv) { @@ -3608,7 +3605,7 @@ compute_stop_pos (struct it *it) for (next_iv = next_interval (iv); (next_iv && (NILP (limit) - || XFASTINT (limit) > next_iv->position)); + || XFIXNAT (limit) > next_iv->position)); next_iv = next_interval (next_iv)) { for (p = it_props; p->handler; ++p) @@ -3625,10 +3622,10 @@ compute_stop_pos (struct it *it) if (next_iv) { - if (INTEGERP (limit) - && next_iv->position >= XFASTINT (limit)) + if (FIXNUMP (limit) + && next_iv->position >= XFIXNAT (limit)) /* No text property change up to limit. */ - it->stop_charpos = min (XFASTINT (limit), it->stop_charpos); + it->stop_charpos = min (XFIXNAT (limit), it->stop_charpos); else /* Text properties change in next_iv. */ it->stop_charpos = min (it->stop_charpos, next_iv->position); @@ -3743,7 +3740,7 @@ compute_display_string_pos (struct text_pos *position, /* If the character at CHARPOS is where the display string begins, return CHARPOS. */ - pos = make_number (charpos); + pos = make_fixnum (charpos); if (STRINGP (object)) bufpos = string->bufpos; else @@ -3751,7 +3748,7 @@ compute_display_string_pos (struct text_pos *position, tpos = *position; if (!NILP (spec = Fget_char_property (pos, Qdisplay, object)) && (charpos <= begb - || !EQ (Fget_char_property (make_number (charpos - 1), Qdisplay, + || !EQ (Fget_char_property (make_fixnum (charpos - 1), Qdisplay, object), spec)) && (rv = handle_display_spec (NULL, spec, object, Qnil, &tpos, bufpos, @@ -3764,10 +3761,10 @@ compute_display_string_pos (struct text_pos *position, /* Look forward for the first character with a `display' property that will replace the underlying text when displayed. */ - limpos = make_number (lim); + limpos = make_fixnum (lim); do { pos = Fnext_single_char_property_change (pos, Qdisplay, object1, limpos); - CHARPOS (tpos) = XFASTINT (pos); + CHARPOS (tpos) = XFIXNAT (pos); if (CHARPOS (tpos) >= lim) { *disp_prop = 0; @@ -3800,7 +3797,7 @@ compute_display_string_end (ptrdiff_t charpos, struct bidi_string_data *string) /* OBJECT = nil means current buffer. */ Lisp_Object object = (string && STRINGP (string->lstring)) ? string->lstring : Qnil; - Lisp_Object pos = make_number (charpos); + Lisp_Object pos = make_fixnum (charpos); ptrdiff_t eob = (STRINGP (object) || (string && string->s)) ? string->schars : ZV; @@ -3828,7 +3825,7 @@ compute_display_string_end (ptrdiff_t charpos, struct bidi_string_data *string) changes. */ pos = Fnext_single_char_property_change (pos, Qdisplay, object, Qnil); - return XFASTINT (pos); + return XFIXNAT (pos); } @@ -3858,7 +3855,7 @@ handle_fontified_prop (struct it *it) && it->s == NULL && !NILP (Vfontification_functions) && !NILP (Vrun_hooks) - && (pos = make_number (IT_CHARPOS (*it)), + && (pos = make_fixnum (IT_CHARPOS (*it)), prop = Fget_char_property (pos, Qfontified, Qnil), /* Ignore the special cased nil value always present at EOB since no amount of fontifying will be able to change it. */ @@ -4068,7 +4065,7 @@ handle_face_prop (struct it *it) might be a big deal. */ base_face_id = it->string_from_prefix_prop_p ? (!NILP (Vface_remapping_alist) - ? lookup_basic_face (it->f, DEFAULT_FACE_ID) + ? lookup_basic_face (it->w, it->f, DEFAULT_FACE_ID) : DEFAULT_FACE_ID) : underlying_face_id (it); } @@ -4358,7 +4355,7 @@ handle_invisible_prop (struct it *it) /* Get the value of the invisible text property at the current position. Value will be nil if there is no such property. */ - end_charpos = make_number (IT_STRING_CHARPOS (*it)); + end_charpos = make_fixnum (IT_STRING_CHARPOS (*it)); prop = Fget_text_property (end_charpos, Qinvisible, it->string); invis = TEXT_PROP_MEANS_INVISIBLE (prop); @@ -4382,10 +4379,10 @@ handle_invisible_prop (struct it *it) it->string, limit); /* Since LIMIT is always an integer, so should be the value returned by Fnext_single_property_change. */ - eassert (INTEGERP (end_charpos)); - if (INTEGERP (end_charpos)) + eassert (FIXNUMP (end_charpos)); + if (FIXNUMP (end_charpos)) { - endpos = XFASTINT (end_charpos); + endpos = XFIXNAT (end_charpos); prop = Fget_text_property (end_charpos, Qinvisible, it->string); invis = TEXT_PROP_MEANS_INVISIBLE (prop); if (invis == 2) @@ -4461,7 +4458,7 @@ handle_invisible_prop (struct it *it) /* First of all, is there invisible text at this position? */ tem = start_charpos = IT_CHARPOS (*it); - pos = make_number (tem); + pos = make_fixnum (tem); prop = get_char_property_and_overlay (pos, Qinvisible, it->window, &overlay); invis = TEXT_PROP_MEANS_INVISIBLE (prop); @@ -4499,7 +4496,7 @@ handle_invisible_prop (struct it *it) the char before the given position, i.e. if we get invis = 0, this means that the char at newpos is visible. */ - pos = make_number (newpos); + pos = make_fixnum (newpos); prop = Fget_char_property (pos, Qinvisible, it->window); invis = TEXT_PROP_MEANS_INVISIBLE (prop); } @@ -4754,7 +4751,7 @@ handle_display_prop (struct it *it) if (!it->string_from_display_prop_p) it->area = TEXT_AREA; - propval = get_char_property_and_overlay (make_number (position->charpos), + propval = get_char_property_and_overlay (make_fixnum (position->charpos), Qdisplay, object, &overlay); if (NILP (propval)) return HANDLED_NORMALLY; @@ -4870,13 +4867,13 @@ display_prop_end (struct it *it, Lisp_Object object, struct text_pos start_pos) Lisp_Object end; struct text_pos end_pos; - end = Fnext_single_char_property_change (make_number (CHARPOS (start_pos)), + end = Fnext_single_char_property_change (make_fixnum (CHARPOS (start_pos)), Qdisplay, object, Qnil); - CHARPOS (end_pos) = XFASTINT (end); + CHARPOS (end_pos) = XFIXNAT (end); if (STRINGP (object)) compute_string_pos (&end_pos, start_pos, it->string); else - BYTEPOS (end_pos) = CHAR_TO_BYTE (XFASTINT (end)); + BYTEPOS (end_pos) = CHAR_TO_BYTE (XFIXNAT (end)); return end_pos; } @@ -4943,10 +4940,10 @@ handle_single_display_spec (struct it *it, Lisp_Object spec, Lisp_Object object, if (NILP (object)) XSETBUFFER (object, current_buffer); specbind (Qobject, object); - specbind (Qposition, make_number (CHARPOS (*position))); - specbind (Qbuffer_position, make_number (bufpos)); + specbind (Qposition, make_fixnum (CHARPOS (*position))); + specbind (Qbuffer_position, make_fixnum (bufpos)); form = safe_eval (form); - unbind_to (count, Qnil); + form = unbind_to (count, form); } if (NILP (form)) @@ -4971,10 +4968,10 @@ handle_single_display_spec (struct it *it, Lisp_Object spec, Lisp_Object object, && (EQ (XCAR (it->font_height), Qplus) || EQ (XCAR (it->font_height), Qminus)) && CONSP (XCDR (it->font_height)) - && RANGED_INTEGERP (0, XCAR (XCDR (it->font_height)), INT_MAX)) + && RANGED_FIXNUMP (0, XCAR (XCDR (it->font_height)), INT_MAX)) { /* `(+ N)' or `(- N)' where N is an integer. */ - int steps = XINT (XCAR (XCDR (it->font_height))); + int steps = XFIXNUM (XCAR (XCDR (it->font_height))); if (EQ (XCAR (it->font_height), Qplus)) steps = - steps; it->face_id = smaller_face (it->f, it->face_id, steps); @@ -4996,9 +4993,9 @@ handle_single_display_spec (struct it *it, Lisp_Object spec, Lisp_Object object, struct face *f; f = FACE_FROM_ID (it->f, - lookup_basic_face (it->f, DEFAULT_FACE_ID)); + lookup_basic_face (it->w, it->f, DEFAULT_FACE_ID)); new_height = (XFLOATINT (it->font_height) - * XINT (f->lface[LFACE_HEIGHT_INDEX])); + * XFIXNUM (f->lface[LFACE_HEIGHT_INDEX])); } else if (enable_eval_p) { @@ -5009,7 +5006,7 @@ handle_single_display_spec (struct it *it, Lisp_Object spec, Lisp_Object object, specbind (Qheight, face->lface[LFACE_HEIGHT_INDEX]); value = safe_eval (it->font_height); - unbind_to (count, Qnil); + value = unbind_to (count, value); if (NUMBERP (value)) new_height = XFLOATINT (value); @@ -5183,12 +5180,12 @@ handle_single_display_spec (struct it *it, Lisp_Object spec, Lisp_Object object, if (it) { - int face_id = lookup_basic_face (it->f, DEFAULT_FACE_ID); + int face_id = lookup_basic_face (it->w, it->f, DEFAULT_FACE_ID); if (CONSP (XCDR (XCDR (spec)))) { Lisp_Object face_name = XCAR (XCDR (XCDR (spec))); - int face_id2 = lookup_derived_face (it->f, face_name, + int face_id2 = lookup_derived_face (it->w, it->f, face_name, FRINGE_FACE_ID, false); if (face_id2 >= 0) face_id = face_id2; @@ -5497,11 +5494,11 @@ string_buffer_position_lim (Lisp_Object string, Lisp_Object limit, prop, pos; bool found = false; - pos = make_number (max (from, BEGV)); + pos = make_fixnum (max (from, BEGV)); if (!back_p) /* looking forward */ { - limit = make_number (min (to, ZV)); + limit = make_fixnum (min (to, ZV)); while (!found && !EQ (pos, limit)) { prop = Fget_char_property (pos, Qdisplay, Qnil); @@ -5514,7 +5511,7 @@ string_buffer_position_lim (Lisp_Object string, } else /* looking back */ { - limit = make_number (max (to, BEGV)); + limit = make_fixnum (max (to, BEGV)); while (!found && !EQ (pos, limit)) { prop = Fget_char_property (pos, Qdisplay, Qnil); @@ -5526,7 +5523,7 @@ string_buffer_position_lim (Lisp_Object string, } } - return found ? XINT (pos) : 0; + return found ? XFIXNUM (pos) : 0; } /* Determine which buffer position in current buffer STRING comes from. @@ -5828,11 +5825,7 @@ compare_overlay_entries (const void *e1, const void *e2) static void load_overlay_strings (struct it *it, ptrdiff_t charpos) { - Lisp_Object overlay, window, str, invisible; - struct Lisp_Overlay *ov; - ptrdiff_t start, end; - ptrdiff_t n = 0, i, j; - int invis; + ptrdiff_t n = 0; struct overlay_entry entriesbuf[20]; ptrdiff_t size = ARRAYELTS (entriesbuf); struct overlay_entry *entries = entriesbuf; @@ -5861,19 +5854,20 @@ load_overlay_strings (struct it *it, ptrdiff_t charpos) entries[n].string = (STRING); \ entries[n].overlay = (OVERLAY); \ priority = Foverlay_get ((OVERLAY), Qpriority); \ - entries[n].priority = INTEGERP (priority) ? XINT (priority) : 0; \ + entries[n].priority = FIXNUMP (priority) ? XFIXNUM (priority) : 0; \ entries[n].after_string_p = (AFTER_P); \ ++n; \ } \ while (false) /* Process overlay before the overlay center. */ - for (ov = current_buffer->overlays_before; ov; ov = ov->next) + for (struct Lisp_Overlay *ov = current_buffer->overlays_before; + ov; ov = ov->next) { - XSETMISC (overlay, ov); + Lisp_Object overlay = make_lisp_ptr (ov, Lisp_Vectorlike); eassert (OVERLAYP (overlay)); - start = OVERLAY_POSITION (OVERLAY_START (overlay)); - end = OVERLAY_POSITION (OVERLAY_END (overlay)); + ptrdiff_t start = OVERLAY_POSITION (OVERLAY_START (overlay)); + ptrdiff_t end = OVERLAY_POSITION (OVERLAY_END (overlay)); if (end < charpos) break; @@ -5884,17 +5878,18 @@ load_overlay_strings (struct it *it, ptrdiff_t charpos) continue; /* Skip this overlay if it doesn't apply to IT->w. */ - window = Foverlay_get (overlay, Qwindow); + Lisp_Object window = Foverlay_get (overlay, Qwindow); if (WINDOWP (window) && XWINDOW (window) != it->w) continue; /* If the text ``under'' the overlay is invisible, both before- and after-strings from this overlay are visible; start and end position are indistinguishable. */ - invisible = Foverlay_get (overlay, Qinvisible); - invis = TEXT_PROP_MEANS_INVISIBLE (invisible); + Lisp_Object invisible = Foverlay_get (overlay, Qinvisible); + int invis = TEXT_PROP_MEANS_INVISIBLE (invisible); /* If overlay has a non-empty before-string, record it. */ + Lisp_Object str; if ((start == charpos || (end == charpos && invis != 0)) && (str = Foverlay_get (overlay, Qbefore_string), STRINGP (str)) && SCHARS (str)) @@ -5908,12 +5903,13 @@ load_overlay_strings (struct it *it, ptrdiff_t charpos) } /* Process overlays after the overlay center. */ - for (ov = current_buffer->overlays_after; ov; ov = ov->next) + for (struct Lisp_Overlay *ov = current_buffer->overlays_after; + ov; ov = ov->next) { - XSETMISC (overlay, ov); + Lisp_Object overlay = make_lisp_ptr (ov, Lisp_Vectorlike); eassert (OVERLAYP (overlay)); - start = OVERLAY_POSITION (OVERLAY_START (overlay)); - end = OVERLAY_POSITION (OVERLAY_END (overlay)); + ptrdiff_t start = OVERLAY_POSITION (OVERLAY_START (overlay)); + ptrdiff_t end = OVERLAY_POSITION (OVERLAY_END (overlay)); if (start > charpos) break; @@ -5924,16 +5920,17 @@ load_overlay_strings (struct it *it, ptrdiff_t charpos) continue; /* Skip this overlay if it doesn't apply to IT->w. */ - window = Foverlay_get (overlay, Qwindow); + Lisp_Object window = Foverlay_get (overlay, Qwindow); if (WINDOWP (window) && XWINDOW (window) != it->w) continue; /* If the text ``under'' the overlay is invisible, it has a zero dimension, and both before- and after-strings apply. */ - invisible = Foverlay_get (overlay, Qinvisible); - invis = TEXT_PROP_MEANS_INVISIBLE (invisible); + Lisp_Object invisible = Foverlay_get (overlay, Qinvisible); + int invis = TEXT_PROP_MEANS_INVISIBLE (invisible); /* If overlay has a non-empty before-string, record it. */ + Lisp_Object str; if ((start == charpos || (end == charpos && invis != 0)) && (str = Foverlay_get (overlay, Qbefore_string), STRINGP (str)) && SCHARS (str)) @@ -5959,12 +5956,11 @@ load_overlay_strings (struct it *it, ptrdiff_t charpos) /* IT->current.overlay_string_index is the number of overlay strings that have already been consumed by IT. Copy some of the remaining overlay strings to IT->overlay_strings. */ - i = 0; - j = it->current.overlay_string_index; - while (i < OVERLAY_STRING_CHUNK_SIZE && j < n) + ptrdiff_t j = it->current.overlay_string_index; + for (ptrdiff_t i = 0; i < OVERLAY_STRING_CHUNK_SIZE && j < n; i++, j++) { it->overlay_strings[i] = entries[j].string; - it->string_overlays[i++] = entries[j++].overlay; + it->string_overlays[i] = entries[j].overlay; } CHECK_IT (it); @@ -6394,9 +6390,9 @@ forward_to_next_line_start (struct it *it, bool *skipped_p, overlays, we can just use the position of the newline in buffer text. */ if (it->stop_charpos >= limit - || ((pos = Fnext_single_property_change (make_number (start), + || ((pos = Fnext_single_property_change (make_fixnum (start), Qdisplay, Qnil, - make_number (limit)), + make_fixnum (limit)), NILP (pos)) && next_overlay_change (start) == ZV)) { @@ -6472,7 +6468,7 @@ back_to_previous_visible_line_start (struct it *it) /* Check the newline before point for invisibility. */ { Lisp_Object prop; - prop = Fget_char_property (make_number (IT_CHARPOS (*it) - 1), + prop = Fget_char_property (make_fixnum (IT_CHARPOS (*it) - 1), Qinvisible, it->window); if (TEXT_PROP_MEANS_INVISIBLE (prop) != 0) continue; @@ -6505,7 +6501,7 @@ back_to_previous_visible_line_start (struct it *it) it2.from_disp_prop_p = false; if (handle_display_prop (&it2) == HANDLED_RETURN && !NILP (val = get_char_property_and_overlay - (make_number (pos), Qdisplay, Qnil, &overlay)) + (make_fixnum (pos), Qdisplay, Qnil, &overlay)) && (OVERLAYP (overlay) ? (beg = OVERLAY_POSITION (OVERLAY_START (overlay))) : get_property_and_range (pos, Qdisplay, &val, &beg, &end, Qnil))) @@ -6993,7 +6989,7 @@ merge_escape_glyph_face (struct it *it) else { /* Merge the `escape-glyph' face into the current face. */ - face_id = merge_faces (it->f, Qescape_glyph, 0, it->face_id); + face_id = merge_faces (it->w, Qescape_glyph, 0, it->face_id); last_escape_glyph_frame = it->f; last_escape_glyph_face_id = it->face_id; last_escape_glyph_merged_face_id = face_id; @@ -7018,7 +7014,7 @@ merge_glyphless_glyph_face (struct it *it) else { /* Merge the `glyphless-char' face into the current face. */ - face_id = merge_faces (it->f, Qglyphless_char, 0, it->face_id); + face_id = merge_faces (it->w, Qglyphless_char, 0, it->face_id); last_glyphless_glyph_frame = it->f; last_glyphless_glyph_face_id = it->face_id; last_glyphless_glyph_merged_face_id = face_id; @@ -7192,7 +7188,7 @@ get_next_display_element (struct it *it) } face_id = (lface_id - ? merge_faces (it->f, Qt, lface_id, it->face_id) + ? merge_faces (it->w, Qt, lface_id, it->face_id) : merge_escape_glyph_face (it)); XSETINT (it->ctl_chars[0], g); @@ -7207,7 +7203,7 @@ get_next_display_element (struct it *it) if (nonascii_space_p && EQ (Vnobreak_char_display, Qt)) { /* Merge `nobreak-space' into the current face. */ - face_id = merge_faces (it->f, Qnobreak_space, 0, + face_id = merge_faces (it->w, Qnobreak_space, 0, it->face_id); XSETINT (it->ctl_chars[0], ' '); ctl_len = 1; @@ -7220,7 +7216,7 @@ get_next_display_element (struct it *it) if (nonascii_hyphen_p && EQ (Vnobreak_char_display, Qt)) { /* Merge `nobreak-space' into the current face. */ - face_id = merge_faces (it->f, Qnobreak_hyphen, 0, + face_id = merge_faces (it->w, Qnobreak_hyphen, 0, it->face_id); XSETINT (it->ctl_chars[0], '-'); ctl_len = 1; @@ -7240,7 +7236,7 @@ get_next_display_element (struct it *it) } face_id = (lface_id - ? merge_faces (it->f, Qt, lface_id, it->face_id) + ? merge_faces (it->w, Qt, lface_id, it->face_id) : merge_escape_glyph_face (it)); /* Draw non-ASCII space/hyphen with escape glyph: */ @@ -7868,7 +7864,7 @@ next_element_from_display_vector (struct it *it) { int lface_id = GLYPH_CODE_FACE (gc); if (lface_id > 0) - it->face_id = merge_faces (it->f, Qt, lface_id, + it->face_id = merge_faces (it->w, Qt, lface_id, it->saved_face_id); } @@ -7897,7 +7893,7 @@ next_element_from_display_vector (struct it *it) GLYPH_CODE_FACE (it->dpvec[it->current.dpvec_index + 1]); if (lface_id > 0) - next_face_id = merge_faces (it->f, Qt, lface_id, + next_face_id = merge_faces (it->w, Qt, lface_id, it->saved_face_id); } } @@ -8197,7 +8193,7 @@ next_element_from_c_string (struct it *it) eassert (!it->bidi_p || it->s == it->bidi_it.string.s); it->what = IT_CHARACTER; BYTEPOS (it->position) = CHARPOS (it->position) = 0; - it->object = make_number (0); + it->object = make_fixnum (0); /* With bidi reordering, the character to display might not be the character at IT_CHARPOS. BIDI_IT.FIRST_ELT means that @@ -8393,7 +8389,7 @@ next_element_from_buffer (struct it *it) eassert (IT_CHARPOS (*it) >= BEGV); eassert (NILP (it->string) && !it->s); eassert (!it->bidi_p - || (EQ (it->bidi_it.string.lstring, Qnil) + || (NILP (it->bidi_it.string.lstring) && it->bidi_it.string.s == NULL)); /* With bidi reordering, the character to display might not be the @@ -8579,7 +8575,7 @@ run_redisplay_end_trigger_hook (struct it *it) them again, even if they get an error. */ wset_redisplay_end_trigger (it->w, Qnil); CALLN (Frun_hook_with_args, Qredisplay_end_trigger_functions, it->window, - make_number (charpos)); + make_fixnum (charpos)); /* Notice if it changed the face of the character we are on. */ handle_face_prop (it); @@ -10152,8 +10148,8 @@ include the height of both, if present, in the return value. */) } else { - CHECK_NUMBER_COERCE_MARKER (from); - start = min (max (XINT (from), BEGV), ZV); + CHECK_FIXNUM_COERCE_MARKER (from); + start = min (max (XFIXNUM (from), BEGV), ZV); } if (NILP (to)) @@ -10169,17 +10165,17 @@ include the height of both, if present, in the return value. */) } else { - CHECK_NUMBER_COERCE_MARKER (to); - end = max (start, min (XINT (to), ZV)); + CHECK_FIXNUM_COERCE_MARKER (to); + end = max (start, min (XFIXNUM (to), ZV)); } - if (!NILP (x_limit) && RANGED_INTEGERP (0, x_limit, INT_MAX)) - max_x = XINT (x_limit); + if (!NILP (x_limit) && RANGED_FIXNUMP (0, x_limit, INT_MAX)) + max_x = XFIXNUM (x_limit); if (NILP (y_limit)) max_y = INT_MAX; - else if (RANGED_INTEGERP (0, y_limit, INT_MAX)) - max_y = XINT (y_limit); + else if (RANGED_FIXNUMP (0, y_limit, INT_MAX)) + max_y = XFIXNUM (y_limit); itdata = bidi_shelve_cache (); SET_TEXT_POS (startp, start, CHAR_TO_BYTE (start)); @@ -10259,7 +10255,7 @@ include the height of both, if present, in the return value. */) if (old_b) set_buffer_internal (old_b); - return Fcons (make_number (x), make_number (y)); + return Fcons (make_fixnum (x), make_fixnum (y)); } /*********************************************************************** @@ -10427,6 +10423,13 @@ message_dolog (const char *m, ptrdiff_t nbytes, bool nlflag, bool multibyte) ptrdiff_t this_bol, this_bol_byte, prev_bol, prev_bol_byte; printmax_t dups; + /* Since we call del_range_both passing false for PREPARE, + we aren't prepared to run modification hooks (we could + end up calling modification hooks from another buffer and + only with AFTER=t, Bug#21824). */ + ptrdiff_t count = SPECPDL_INDEX (); + specbind (Qinhibit_modification_hooks, Qt); + insert_1_both ("\n", 1, 1, true, false, false); scan_newline (Z, Z_BYTE, BEG, BEG_BYTE, -2, false); @@ -10466,12 +10469,14 @@ message_dolog (const char *m, ptrdiff_t nbytes, bool nlflag, bool multibyte) in the *Messages* buffer now, delete the oldest ones. This is safe because we don't have undo in this buffer. */ - if (NATNUMP (Vmessage_log_max)) + if (FIXNATP (Vmessage_log_max)) { scan_newline (Z, Z_BYTE, BEG, BEG_BYTE, - -XFASTINT (Vmessage_log_max) - 1, false); + -XFIXNAT (Vmessage_log_max) - 1, false); del_range_both (BEG, BEG_BYTE, PT, PT_BYTE, false); } + + unbind_to (count, Qnil); } BEGV = marker_position (oldbegv); BEGV_BYTE = marker_byte_position (oldbegv); @@ -10972,22 +10977,22 @@ with_echo_area_buffer_unwind_data (struct window *w) Vwith_echo_area_save_vector = Qnil; if (NILP (vector)) - vector = Fmake_vector (make_number (11), Qnil); + vector = make_nil_vector (11); XSETBUFFER (tmp, current_buffer); ASET (vector, i, tmp); ++i; ASET (vector, i, Vdeactivate_mark); ++i; - ASET (vector, i, make_number (windows_or_buffers_changed)); ++i; + ASET (vector, i, make_fixnum (windows_or_buffers_changed)); ++i; if (w) { XSETWINDOW (tmp, w); ASET (vector, i, tmp); ++i; ASET (vector, i, w->contents); ++i; - ASET (vector, i, make_number (marker_position (w->pointm))); ++i; - ASET (vector, i, make_number (marker_byte_position (w->pointm))); ++i; - ASET (vector, i, make_number (marker_position (w->old_pointm))); ++i; - ASET (vector, i, make_number (marker_byte_position (w->old_pointm))); ++i; - ASET (vector, i, make_number (marker_position (w->start))); ++i; - ASET (vector, i, make_number (marker_byte_position (w->start))); ++i; + ASET (vector, i, make_fixnum (marker_position (w->pointm))); ++i; + ASET (vector, i, make_fixnum (marker_byte_position (w->pointm))); ++i; + ASET (vector, i, make_fixnum (marker_position (w->old_pointm))); ++i; + ASET (vector, i, make_fixnum (marker_byte_position (w->old_pointm))); ++i; + ASET (vector, i, make_fixnum (marker_position (w->start))); ++i; + ASET (vector, i, make_fixnum (marker_byte_position (w->start))); ++i; } else { @@ -11009,7 +11014,7 @@ unwind_with_echo_area_buffer (Lisp_Object vector) { set_buffer_internal_1 (XBUFFER (AREF (vector, 0))); Vdeactivate_mark = AREF (vector, 1); - windows_or_buffers_changed = XFASTINT (AREF (vector, 2)); + windows_or_buffers_changed = XFIXNAT (AREF (vector, 2)); if (WINDOWP (AREF (vector, 3))) { @@ -11021,14 +11026,14 @@ unwind_with_echo_area_buffer (Lisp_Object vector) wset_buffer (w, buffer); set_marker_both (w->pointm, buffer, - XFASTINT (AREF (vector, 5)), - XFASTINT (AREF (vector, 6))); + XFIXNAT (AREF (vector, 5)), + XFIXNAT (AREF (vector, 6))); set_marker_both (w->old_pointm, buffer, - XFASTINT (AREF (vector, 7)), - XFASTINT (AREF (vector, 8))); + XFIXNAT (AREF (vector, 7)), + XFIXNAT (AREF (vector, 8))); set_marker_both (w->start, buffer, - XFASTINT (AREF (vector, 9)), - XFASTINT (AREF (vector, 10))); + XFIXNAT (AREF (vector, 9)), + XFIXNAT (AREF (vector, 10))); } Vwith_echo_area_save_vector = vector; @@ -11070,10 +11075,18 @@ setup_echo_area_for_printing (bool multibyte_p) } TEMP_SET_PT_BOTH (BEG, BEG_BYTE); - /* Set up the buffer for the multibyteness we need. */ - if (multibyte_p - != !NILP (BVAR (current_buffer, enable_multibyte_characters))) - Fset_buffer_multibyte (multibyte_p ? Qt : Qnil); + /* Set up the buffer for the multibyteness we need. We always + set it to be multibyte, except when + unibyte-display-via-language-environment is non-nil and the + buffer from which we are called is unibyte, because in that + case unibyte characters should not be displayed as octal + escapes. */ + if (unibyte_display_via_language_environment + && !multibyte_p + && !NILP (BVAR (current_buffer, enable_multibyte_characters))) + Fset_buffer_multibyte (Qnil); + else if (NILP (BVAR (current_buffer, enable_multibyte_characters))) + Fset_buffer_multibyte (Qt); /* Raise the frame containing the echo area. */ if (minibuffer_auto_raise) @@ -11149,7 +11162,7 @@ display_echo_area (struct window *w) /* Helper for display_echo_area. Display the current buffer which contains the current echo area message in window W, a mini-window, - a pointer to which is passed in A1. A2..A4 are currently not used. + a pointer to which is passed in A1. A2 is currently not used. Change the height of W so that all of the message is displayed. Value is true if height of W was changed. */ @@ -11210,8 +11223,8 @@ resize_echo_area_exactly (void) /* Callback function for with_echo_area_buffer, when used from resize_echo_area_exactly. A1 contains a pointer to the window to resize, EXACTLY non-nil means resize the mini-window exactly to the - size of the text displayed. A3 and A4 are not used. Value is what - resize_mini_window returns. */ + size of the text displayed. Value is what resize_mini_window + returns. */ static bool resize_mini_window_1 (ptrdiff_t a1, Lisp_Object exactly) @@ -11280,8 +11293,8 @@ resize_mini_window (struct window *w, bool exact_p) /* Compute the max. number of lines specified by the user. */ if (FLOATP (Vmax_mini_window_height)) max_height = XFLOAT_DATA (Vmax_mini_window_height) * total_height; - else if (INTEGERP (Vmax_mini_window_height)) - max_height = XINT (Vmax_mini_window_height) * unit; + else if (FIXNUMP (Vmax_mini_window_height)) + max_height = XFIXNUM (Vmax_mini_window_height) * unit; else max_height = total_height / 4; @@ -11519,10 +11532,17 @@ set_message_1 (ptrdiff_t a1, Lisp_Object string) { eassert (STRINGP (string)); - /* Change multibyteness of the echo buffer appropriately. */ - if (message_enable_multibyte - != !NILP (BVAR (current_buffer, enable_multibyte_characters))) - Fset_buffer_multibyte (message_enable_multibyte ? Qt : Qnil); + /* Change multibyteness of the echo buffer appropriately. We always + set it to be multibyte, except when + unibyte-display-via-language-environment is non-nil and the + string to display is unibyte, because in that case unibyte + characters should not be displayed as octal escapes. */ + if (!message_enable_multibyte + && unibyte_display_via_language_environment + && !NILP (BVAR (current_buffer, enable_multibyte_characters))) + Fset_buffer_multibyte (Qnil); + else if (NILP (BVAR (current_buffer, enable_multibyte_characters))) + Fset_buffer_multibyte (Qt); bset_truncate_lines (current_buffer, message_truncate_lines ? Qt : Qnil); if (!NILP (BVAR (current_buffer, bidi_display_reordering))) @@ -11830,10 +11850,10 @@ format_mode_line_unwind_data (struct frame *target_frame, Vmode_line_unwind_vector = Qnil; if (NILP (vector)) - vector = Fmake_vector (make_number (10), Qnil); + vector = make_nil_vector (12); - ASET (vector, 0, make_number (mode_line_target)); - ASET (vector, 1, make_number (MODE_LINE_NOPROP_LEN (0))); + ASET (vector, 0, make_fixnum (mode_line_target)); + ASET (vector, 1, make_fixnum (MODE_LINE_NOPROP_LEN (0))); ASET (vector, 2, mode_line_string_list); ASET (vector, 3, save_proptrans ? mode_line_proptrans_alist : Qt); ASET (vector, 4, mode_line_string_face); @@ -11847,12 +11867,24 @@ format_mode_line_unwind_data (struct frame *target_frame, ASET (vector, 7, owin); if (target_frame) { + Lisp_Object buffer = XWINDOW (target_frame->selected_window)->contents; + struct buffer *b = XBUFFER (buffer); + struct buffer *cb = current_buffer; + /* Similarly to `with-selected-window', if the operation selects a window on another frame, we must restore that frame's selected window, and (for a tty) the top-frame. */ ASET (vector, 8, target_frame->selected_window); if (FRAME_TERMCAP_P (target_frame)) ASET (vector, 9, FRAME_TTY (target_frame)->top_frame); + + /* If we select a window on another frame, make sure that that + selection does not leave its buffer's point modified when + unwinding (Bug#32777). */ + ASET (vector, 10, buffer); + current_buffer = b; + ASET (vector, 11, build_marker (current_buffer, PT, PT_BYTE)); + current_buffer = cb; } return vector; @@ -11865,8 +11897,8 @@ unwind_format_mode_line (Lisp_Object vector) Lisp_Object target_frame_window = AREF (vector, 8); Lisp_Object old_top_frame = AREF (vector, 9); - mode_line_target = XINT (AREF (vector, 0)); - mode_line_noprop_ptr = mode_line_noprop_buf + XINT (AREF (vector, 1)); + mode_line_target = XFIXNUM (AREF (vector, 0)); + mode_line_noprop_ptr = mode_line_noprop_buf + XFIXNUM (AREF (vector, 1)); mode_line_string_list = AREF (vector, 2); if (! EQ (AREF (vector, 3), Qt)) mode_line_proptrans_alist = AREF (vector, 3); @@ -11892,6 +11924,24 @@ unwind_format_mode_line (Lisp_Object vector) } Fselect_window (old_window, Qt); + + /* Restore point of target_frame_window's buffer (Bug#32777). + But do this only after old_window has been reselected to + avoid that the window point of target_frame_window moves. */ + if (!NILP (target_frame_window)) + { + Lisp_Object buffer = AREF (vector, 10); + + if (BUFFER_LIVE_P (XBUFFER (buffer))) + { + struct buffer *cb = current_buffer; + + current_buffer = XBUFFER (buffer); + set_point_from_marker (AREF (vector, 11)); + ASET (vector, 11, Qnil); + current_buffer = cb; + } + } } if (!NILP (AREF (vector, 6))) @@ -11976,7 +12026,7 @@ x_consider_frame_title (Lisp_Object frame) if ((FRAME_WINDOW_P (f) || FRAME_MINIBUF_ONLY_P (f) || f->explicit_name) - && NILP (Fframe_parameter (frame, Qtooltip))) + && !FRAME_TOOLTIP_P (f)) { /* Do we have more than one visible frame on this X display? */ Lisp_Object tail, other_frame, fmt; @@ -11993,8 +12043,8 @@ x_consider_frame_title (Lisp_Object frame) if (tf != f && FRAME_KBOARD (tf) == FRAME_KBOARD (f) && !FRAME_MINIBUF_ONLY_P (tf) - && !EQ (other_frame, tip_frame) && !FRAME_PARENT_FRAME (tf) + && !FRAME_TOOLTIP_P (tf) && (FRAME_VISIBLE_P (tf) || FRAME_ICONIFIED_P (tf))) break; } @@ -12063,13 +12113,6 @@ prepare_menu_bars (void) { bool all_windows = windows_or_buffers_changed || update_mode_lines; bool some_windows = REDISPLAY_SOME_P (); - Lisp_Object tooltip_frame; - -#ifdef HAVE_WINDOW_SYSTEM - tooltip_frame = tip_frame; -#else - tooltip_frame = Qnil; -#endif if (FUNCTIONP (Vpre_redisplay_function)) { @@ -12110,7 +12153,7 @@ prepare_menu_bars (void) && !XBUFFER (w->contents)->text->redisplay) continue; - if (!EQ (frame, tooltip_frame) + if (!FRAME_TOOLTIP_P (f) && !FRAME_PARENT_FRAME (f) && (FRAME_ICONIFIED_P (f) || FRAME_VISIBLE_P (f) == 1 @@ -12148,7 +12191,7 @@ prepare_menu_bars (void) struct window *w = XWINDOW (FRAME_SELECTED_WINDOW (f)); /* Ignore tooltip frame. */ - if (EQ (frame, tooltip_frame)) + if (FRAME_TOOLTIP_P (f)) continue; if (some_windows @@ -12433,11 +12476,11 @@ build_desired_tool_bar_string (struct frame *f) /* Reuse f->desired_tool_bar_string, if possible. */ if (size < size_needed || NILP (f->desired_tool_bar_string)) fset_desired_tool_bar_string - (f, Fmake_string (make_number (size_needed), make_number (' '))); + (f, Fmake_string (make_fixnum (size_needed), make_fixnum (' '), Qnil)); else { AUTO_LIST4 (props, Qdisplay, Qnil, Qmenu_item, Qnil); - Fremove_text_properties (make_number (0), make_number (size), + Fremove_text_properties (make_fixnum (0), make_fixnum (size), props, f->desired_tool_bar_string); } @@ -12486,21 +12529,21 @@ build_desired_tool_bar_string (struct frame *f) : DEFAULT_TOOL_BAR_BUTTON_RELIEF); hmargin = vmargin = relief; - if (RANGED_INTEGERP (1, Vtool_bar_button_margin, + if (RANGED_FIXNUMP (1, Vtool_bar_button_margin, INT_MAX - max (hmargin, vmargin))) { - hmargin += XFASTINT (Vtool_bar_button_margin); - vmargin += XFASTINT (Vtool_bar_button_margin); + hmargin += XFIXNAT (Vtool_bar_button_margin); + vmargin += XFIXNAT (Vtool_bar_button_margin); } else if (CONSP (Vtool_bar_button_margin)) { - if (RANGED_INTEGERP (1, XCAR (Vtool_bar_button_margin), + if (RANGED_FIXNUMP (1, XCAR (Vtool_bar_button_margin), INT_MAX - hmargin)) - hmargin += XFASTINT (XCAR (Vtool_bar_button_margin)); + hmargin += XFIXNAT (XCAR (Vtool_bar_button_margin)); - if (RANGED_INTEGERP (1, XCDR (Vtool_bar_button_margin), + if (RANGED_FIXNUMP (1, XCDR (Vtool_bar_button_margin), INT_MAX - vmargin)) - vmargin += XFASTINT (XCDR (Vtool_bar_button_margin)); + vmargin += XFIXNAT (XCDR (Vtool_bar_button_margin)); } if (auto_raise_tool_bar_buttons_p) @@ -12509,7 +12552,7 @@ build_desired_tool_bar_string (struct frame *f) selected. */ if (selected_p) { - plist = Fplist_put (plist, QCrelief, make_number (-relief)); + plist = Fplist_put (plist, QCrelief, make_fixnum (-relief)); hmargin -= relief; vmargin -= relief; } @@ -12521,8 +12564,8 @@ build_desired_tool_bar_string (struct frame *f) raised relief. */ plist = Fplist_put (plist, QCrelief, (selected_p - ? make_number (-relief) - : make_number (relief))); + ? make_fixnum (-relief) + : make_fixnum (relief))); hmargin -= relief; vmargin -= relief; } @@ -12531,11 +12574,11 @@ build_desired_tool_bar_string (struct frame *f) if (hmargin || vmargin) { if (hmargin == vmargin) - plist = Fplist_put (plist, QCmargin, make_number (hmargin)); + plist = Fplist_put (plist, QCmargin, make_fixnum (hmargin)); else plist = Fplist_put (plist, QCmargin, - Fcons (make_number (hmargin), - make_number (vmargin))); + Fcons (make_fixnum (hmargin), + make_fixnum (vmargin))); } /* If button is not enabled, and we don't have special images @@ -12550,7 +12593,7 @@ build_desired_tool_bar_string (struct frame *f) vector. */ image = Fcons (Qimage, plist); AUTO_LIST4 (props, Qdisplay, image, Qmenu_item, - make_number (i * TOOL_BAR_ITEM_NSLOTS)); + make_fixnum (i * TOOL_BAR_ITEM_NSLOTS)); /* Let the last image hide all remaining spaces in the tool bar string. The string can be longer than needed when we reuse a @@ -12559,7 +12602,7 @@ build_desired_tool_bar_string (struct frame *f) end = SCHARS (f->desired_tool_bar_string); else end = i + 1; - Fadd_text_properties (make_number (i), make_number (end), + Fadd_text_properties (make_fixnum (i), make_fixnum (end), props, f->desired_tool_bar_string); #undef PROP } @@ -12765,7 +12808,7 @@ PIXELWISE non-nil means return the height of the tool bar in pixels. */) } #endif - return make_number (height); + return make_fixnum (height); } @@ -12836,8 +12879,8 @@ redisplay_tool_bar (struct frame *f) { int border, rows, height, extra; - if (TYPE_RANGED_INTEGERP (int, Vtool_bar_border)) - border = XINT (Vtool_bar_border); + if (TYPE_RANGED_FIXNUMP (int, Vtool_bar_border)) + border = XFIXNUM (Vtool_bar_border); else if (EQ (Vtool_bar_border, Qinternal_border_width)) border = FRAME_INTERNAL_BORDER_WIDTH (f); else if (EQ (Vtool_bar_border, Qborder_width)) @@ -12955,11 +12998,11 @@ tool_bar_item_info (struct frame *f, struct glyph *glyph, int *prop_idx) /* Get the text property `menu-item' at pos. The value of that property is the start index of this item's properties in F->tool_bar_items. */ - prop = Fget_text_property (make_number (charpos), + prop = Fget_text_property (make_fixnum (charpos), Qmenu_item, f->current_tool_bar_string); - if (! INTEGERP (prop)) + if (! FIXNUMP (prop)) return false; - *prop_idx = XINT (prop); + *prop_idx = XFIXNUM (prop); return true; } @@ -13204,9 +13247,9 @@ hscroll_window_tree (Lisp_Object window) hscroll_step_abs = 0; } } - else if (TYPE_RANGED_INTEGERP (int, Vhscroll_step)) + else if (TYPE_RANGED_FIXNUMP (int, Vhscroll_step)) { - hscroll_step_abs = XINT (Vhscroll_step); + hscroll_step_abs = XFIXNUM (Vhscroll_step); if (hscroll_step_abs < 0) hscroll_step_abs = 0; } @@ -13305,7 +13348,7 @@ hscroll_window_tree (Lisp_Object window) /* Remember window point. */ Fset_marker (w->old_pointm, ((w == XWINDOW (selected_window)) - ? make_number (BUF_PT (XBUFFER (w->contents))) + ? make_fixnum (BUF_PT (XBUFFER (w->contents))) : Fmarker_position (w->pointm)), w->contents); @@ -13562,8 +13605,8 @@ text_outside_line_unchanged_p (struct window *w, /* If selective display, can't optimize if changes start at the beginning of the line. */ if (unchanged_p - && INTEGERP (BVAR (current_buffer, selective_display)) - && XINT (BVAR (current_buffer, selective_display)) > 0 + && FIXNUMP (BVAR (current_buffer, selective_display)) + && XFIXNUM (BVAR (current_buffer, selective_display)) > 0 && (BEG_UNCHANGED < start || GPT <= start)) unchanged_p = false; @@ -13765,10 +13808,10 @@ overlay_arrow_at_row (struct it *it, struct glyph_row *row) { int fringe_bitmap = lookup_fringe_bitmap (val); if (fringe_bitmap != 0) - return make_number (fringe_bitmap); + return make_fixnum (fringe_bitmap); } #endif - return make_number (-1); /* Use default arrow bitmap. */ + return make_fixnum (-1); /* Use default arrow bitmap. */ } return overlay_arrow_string_or_property (var); } @@ -13934,7 +13977,15 @@ redisplay_internal (void) #if defined (USE_X_TOOLKIT) || defined (USE_GTK) || defined (HAVE_NS) if (popup_activated ()) - return; + { +#ifdef NS_IMPL_COCOA + /* On macOS we may have disabled screen updates due to window + resizing. We should re-enable them so the popup can be + displayed. */ + ns_enable_screen_updates (); +#endif + return; + } #endif /* I don't think this happens but let's be paranoid. */ @@ -14135,9 +14186,9 @@ redisplay_internal (void) #define AINC(a,i) \ { \ - Lisp_Object entry = Fgethash (make_number (i), a, make_number (0)); \ - if (INTEGERP (entry)) \ - Fputhash (make_number (i), make_number (1 + XINT (entry)), a); \ + Lisp_Object entry = Fgethash (make_fixnum (i), a, make_fixnum (0)); \ + if (FIXNUMP (entry)) \ + Fputhash (make_fixnum (i), make_fixnum (1 + XFIXNUM (entry)), a); \ } AINC (Vredisplay__all_windows_cause, windows_or_buffers_changed); @@ -14331,7 +14382,7 @@ redisplay_internal (void) eassert (this_line_vpos == it.vpos); eassert (this_line_y == it.current_y); set_cursor_from_row (w, row, w->current_matrix, 0, 0, 0, 0); - if (cursor_row_fully_visible_p (w, false, true)) + if (cursor_row_fully_visible_p (w, false, true, false)) { #ifdef GLYPH_DEBUG *w->desired_matrix->method = 0; @@ -14740,6 +14791,12 @@ unwind_redisplay (void) { redisplaying_p = false; unblock_buffer_flips (); +#ifdef NS_IMPL_COCOA + /* On macOS we may have disabled screen updates due to window + resizing. When redisplay completes we want to re-enable + them. */ + ns_enable_screen_updates (); +#endif } @@ -15100,7 +15157,7 @@ set_cursor_from_row (struct window *w, struct glyph_row *row, Lisp_Object chprop; ptrdiff_t glyph_pos = glyph->charpos; - chprop = Fget_char_property (make_number (glyph_pos), Qcursor, + chprop = Fget_char_property (make_fixnum (glyph_pos), Qcursor, glyph->object); if (!NILP (chprop)) { @@ -15121,9 +15178,9 @@ set_cursor_from_row (struct window *w, struct glyph_row *row, if (prop_pos >= pos_before) bpos_max = prop_pos; } - if (INTEGERP (chprop)) + if (FIXNUMP (chprop)) { - bpos_covered = bpos_max + XINT (chprop); + bpos_covered = bpos_max + XFIXNUM (chprop); /* If the `cursor' property covers buffer positions up to and including point, we should display cursor on this glyph. Note that, if a `cursor' property on one @@ -15184,7 +15241,7 @@ set_cursor_from_row (struct window *w, struct glyph_row *row, Lisp_Object chprop; ptrdiff_t glyph_pos = glyph->charpos; - chprop = Fget_char_property (make_number (glyph_pos), Qcursor, + chprop = Fget_char_property (make_fixnum (glyph_pos), Qcursor, glyph->object); if (!NILP (chprop)) { @@ -15195,9 +15252,9 @@ set_cursor_from_row (struct window *w, struct glyph_row *row, if (prop_pos >= pos_before) bpos_max = prop_pos; } - if (INTEGERP (chprop)) + if (FIXNUMP (chprop)) { - bpos_covered = bpos_max + XINT (chprop); + bpos_covered = bpos_max + XFIXNUM (chprop); /* If the `cursor' property covers buffer positions up to and including point, we should display cursor on this glyph. */ @@ -15371,7 +15428,7 @@ set_cursor_from_row (struct window *w, struct glyph_row *row, Lisp_Object cprop; ptrdiff_t gpos = glyph->charpos; - cprop = Fget_char_property (make_number (gpos), + cprop = Fget_char_property (make_fixnum (gpos), Qcursor, glyph->object); if (!NILP (cprop)) @@ -15502,7 +15559,7 @@ set_cursor_from_row (struct window *w, struct glyph_row *row, /* Previous candidate is a glyph from a string that has a non-nil `cursor' property. */ || (STRINGP (g1->object) - && (!NILP (Fget_char_property (make_number (g1->charpos), + && (!NILP (Fget_char_property (make_fixnum (g1->charpos), Qcursor, g1->object)) /* Previous candidate is from the same display string as this one, and the display string @@ -15585,7 +15642,7 @@ run_window_scroll_functions (Lisp_Object window, struct text_pos startp) if (!NILP (Vwindow_scroll_functions)) { run_hook_with_args_2 (Qwindow_scroll_functions, window, - make_number (CHARPOS (startp))); + make_fixnum (CHARPOS (startp))); SET_TEXT_POS_FROM_MARKER (startp, w->start); /* In case the hook functions switch buffers. */ set_buffer_internal (XBUFFER (w->contents)); @@ -15607,19 +15664,46 @@ run_window_scroll_functions (Lisp_Object window, struct text_pos startp) window's current glyph matrix; otherwise use the desired glyph matrix. + If JUST_TEST_USER_PREFERENCE_P, just test what the value of + make-cursor-row-fully-visible requires, don't test the actual + cursor position. The assumption is that in that case the caller + performs the necessary testing of the cursor position. + A value of false means the caller should do scrolling as if point had gone off the screen. */ static bool cursor_row_fully_visible_p (struct window *w, bool force_p, - bool current_matrix_p) + bool current_matrix_p, + bool just_test_user_preference_p) { struct glyph_matrix *matrix; struct glyph_row *row; int window_height; + Lisp_Object mclfv_p = + buffer_local_value (Qmake_cursor_line_fully_visible, w->contents); - if (!make_cursor_line_fully_visible_p) + /* If no local binding, use the global value. */ + if (EQ (mclfv_p, Qunbound)) + mclfv_p = Vmake_cursor_line_fully_visible; + /* Follow mode sets the variable to a Lisp function in buffers that + are under Follow mode. */ + if (FUNCTIONP (mclfv_p)) + { + Lisp_Object window; + XSETWINDOW (window, w); + /* Implementation note: if the function we call here signals an + error, we will NOT scroll when the cursor is partially-visible. */ + Lisp_Object val = safe_call1 (mclfv_p, window); + if (NILP (val)) + return true; + else if (just_test_user_preference_p) + return false; + } + else if (NILP (mclfv_p)) return true; + else if (just_test_user_preference_p) + return false; /* It's not always possible to find the cursor, e.g, when a window is full of overlay strings. Don't do anything in that case. */ @@ -15981,7 +16065,7 @@ try_scrolling (Lisp_Object window, bool just_this_one_p, /* If cursor ends up on a partially visible line, treat that as being off the bottom of the screen. */ if (! cursor_row_fully_visible_p (w, extra_scroll_margin_lines <= 1, - false) + false, false) /* It's possible that the cursor is on the first line of the buffer, which is partially obscured due to a vscroll (Bug#7537). In that case, avoid looping forever. */ @@ -16346,7 +16430,7 @@ try_cursor_movement (Lisp_Object window, struct text_pos startp, /* Make sure this isn't a header line by any chance, since then MATRIX_ROW_PARTIALLY_VISIBLE_P might yield true. */ && !row->mode_line_p - && make_cursor_line_fully_visible_p) + && !cursor_row_fully_visible_p (w, true, true, true)) { if (PT == MATRIX_ROW_END_CHARPOS (row) && !row->ends_at_zv_p @@ -16364,7 +16448,7 @@ try_cursor_movement (Lisp_Object window, struct text_pos startp, else { set_cursor_from_row (w, row, w->current_matrix, 0, 0, 0, 0); - if (!cursor_row_fully_visible_p (w, false, true)) + if (!cursor_row_fully_visible_p (w, false, true, false)) rc = CURSOR_MOVEMENT_MUST_SCROLL; else rc = CURSOR_MOVEMENT_SUCCESS; @@ -16920,18 +17004,18 @@ redisplay_window (Lisp_Object window, bool just_this_one_p) position past that. */ struct glyph_row *r = NULL; Lisp_Object invprop = - get_char_property_and_overlay (make_number (PT), Qinvisible, + get_char_property_and_overlay (make_fixnum (PT), Qinvisible, Qnil, NULL); if (TEXT_PROP_MEANS_INVISIBLE (invprop) != 0) { ptrdiff_t alt_pt; Lisp_Object invprop_end = - Fnext_single_char_property_change (make_number (PT), Qinvisible, + Fnext_single_char_property_change (make_fixnum (PT), Qinvisible, Qnil, Qnil); - if (NATNUMP (invprop_end)) - alt_pt = XFASTINT (invprop_end); + if (FIXNATP (invprop_end)) + alt_pt = XFIXNAT (invprop_end); else alt_pt = ZV; r = row_containing_pos (w, alt_pt, w->desired_matrix->rows, @@ -16943,7 +17027,7 @@ redisplay_window (Lisp_Object window, bool just_this_one_p) new_vpos = window_box_height (w) / 2; } - if (!cursor_row_fully_visible_p (w, false, false)) + if (!cursor_row_fully_visible_p (w, false, false, false)) { /* Point does appear, but on a line partly visible at end of window. Move it back to a fully-visible line. */ @@ -17038,7 +17122,8 @@ redisplay_window (Lisp_Object window, bool just_this_one_p) goto need_larger_matrices; } } - if (w->cursor.vpos < 0 || !cursor_row_fully_visible_p (w, false, false)) + if (w->cursor.vpos < 0 + || !cursor_row_fully_visible_p (w, false, false, false)) { clear_glyph_matrix (w->desired_matrix); goto try_to_scroll; @@ -17185,7 +17270,7 @@ redisplay_window (Lisp_Object window, bool just_this_one_p) /* Forget any recorded base line for line number display. */ w->base_line_number = 0; - if (!cursor_row_fully_visible_p (w, true, false)) + if (!cursor_row_fully_visible_p (w, true, false, false)) { clear_glyph_matrix (w->desired_matrix); last_line_misfit = true; @@ -17452,18 +17537,18 @@ redisplay_window (Lisp_Object window, bool just_this_one_p) if (!row) { Lisp_Object val = - get_char_property_and_overlay (make_number (PT), Qinvisible, + get_char_property_and_overlay (make_fixnum (PT), Qinvisible, Qnil, NULL); if (TEXT_PROP_MEANS_INVISIBLE (val) != 0) { ptrdiff_t alt_pos; Lisp_Object invis_end = - Fnext_single_char_property_change (make_number (PT), Qinvisible, + Fnext_single_char_property_change (make_fixnum (PT), Qinvisible, Qnil, Qnil); - if (NATNUMP (invis_end)) - alt_pos = XFASTINT (invis_end); + if (FIXNATP (invis_end)) + alt_pos = XFIXNAT (invis_end); else alt_pos = ZV; row = row_containing_pos (w, alt_pos, matrix->rows, NULL, 0); @@ -17481,7 +17566,7 @@ redisplay_window (Lisp_Object window, bool just_this_one_p) set_cursor_from_row (w, row, matrix, 0, 0, 0, 0); } - if (!cursor_row_fully_visible_p (w, false, false)) + if (!cursor_row_fully_visible_p (w, false, false, false)) { /* If vscroll is enabled, disable it and try again. */ if (w->vscroll) @@ -19047,9 +19132,10 @@ try_window_id (struct window *w) && CHARPOS (start) > BEGV) /* Old redisplay didn't take scroll margin into account at the bottom, but then global-hl-line-mode doesn't scroll. KFS 2004-06-14 */ - || (w->cursor.y + (make_cursor_line_fully_visible_p - ? cursor_height + this_scroll_margin - : 1)) > it.last_visible_y) + || (w->cursor.y + + (cursor_row_fully_visible_p (w, false, true, true) + ? 1 + : cursor_height + this_scroll_margin)) > it.last_visible_y) { w->cursor.vpos = -1; clear_glyph_matrix (w->desired_matrix); @@ -19572,7 +19658,7 @@ with numeric argument, its value is passed as the GLYPHS flag. */) w->cursor.x, w->cursor.y, w->cursor.hpos, w->cursor.vpos); fprintf (stderr, "=============================================\n"); dump_glyph_matrix (w->current_matrix, - TYPE_RANGED_INTEGERP (int, glyphs) ? XINT (glyphs) : 0); + TYPE_RANGED_FIXNUMP (int, glyphs) ? XFIXNUM (glyphs) : 0); return Qnil; } @@ -19616,14 +19702,14 @@ GLYPHS > 1 or omitted means dump glyphs in long form. */) } else { - CHECK_NUMBER (row); - vpos = XINT (row); + CHECK_FIXNUM (row); + vpos = XFIXNUM (row); } matrix = XWINDOW (selected_window)->current_matrix; if (vpos >= 0 && vpos < matrix->nrows) dump_glyph_row (MATRIX_ROW (matrix, vpos), vpos, - TYPE_RANGED_INTEGERP (int, glyphs) ? XINT (glyphs) : 2); + TYPE_RANGED_FIXNUMP (int, glyphs) ? XFIXNUM (glyphs) : 2); return Qnil; } @@ -19648,12 +19734,12 @@ do nothing. */) vpos = 0; else { - CHECK_NUMBER (row); - vpos = XINT (row); + CHECK_FIXNUM (row); + vpos = XFIXNUM (row); } if (vpos >= 0 && vpos < m->nrows) dump_glyph_row (MATRIX_ROW (m, vpos), vpos, - TYPE_RANGED_INTEGERP (int, glyphs) ? XINT (glyphs) : 2); + TYPE_RANGED_FIXNUMP (int, glyphs) ? XFIXNUM (glyphs) : 2); #endif return Qnil; } @@ -19669,7 +19755,7 @@ With ARG, turn tracing on if and only if ARG is positive. */) else { arg = Fprefix_numeric_value (arg); - trace_redisplay_p = XINT (arg) > 0; + trace_redisplay_p = XFIXNUM (arg) > 0; } return Qnil; @@ -19735,7 +19821,7 @@ get_overlay_arrow_glyph_row (struct window *w, Lisp_Object overlay_arrow_string) p += it.len; /* Get its face. */ - ilisp = make_number (p - arrow_string); + ilisp = make_fixnum (p - arrow_string); face = Fget_text_property (ilisp, Qface, overlay_arrow_string); it.face_id = compute_char_face (f, it.char_to_display, face); @@ -20071,7 +20157,7 @@ append_space_for_newline (struct it *it, bool default_face_p) /* If the default face was remapped, be sure to use the remapped face for the appended newline. */ if (default_face_p) - it->face_id = lookup_basic_face (it->f, DEFAULT_FACE_ID); + it->face_id = lookup_basic_face (it->w, it->f, DEFAULT_FACE_ID); else if (it->face_before_selective_p) it->face_id = it->saved_face_id; face = FACE_FROM_ID (it->f, it->face_id); @@ -20135,8 +20221,8 @@ append_space_for_newline (struct it *it, bool default_face_p) it->phys_ascent = it->ascent; it->phys_descent = it->descent; if (!NILP (height) - && XINT (height) > it->ascent + it->descent) - it->ascent = XINT (height) - it->descent; + && XFIXNUM (height) > it->ascent + it->descent) + it->ascent = XFIXNUM (height) - it->descent; if (!NILP (total_height)) spacing = calc_line_height_property (it, total_height, font, @@ -20147,9 +20233,9 @@ append_space_for_newline (struct it *it, bool default_face_p) spacing = calc_line_height_property (it, spacing, font, boff, false); } - if (INTEGERP (spacing)) + if (FIXNUMP (spacing)) { - extra_line_spacing = XINT (spacing); + extra_line_spacing = XFIXNUM (spacing); if (!NILP (total_height)) extra_line_spacing -= (it->phys_ascent + it->phys_descent); } @@ -20218,8 +20304,8 @@ extend_face_to_end_of_line (struct it *it) return; /* The default face, possibly remapped. */ - default_face = FACE_FROM_ID_OR_NULL (f, - lookup_basic_face (f, DEFAULT_FACE_ID)); + default_face = + FACE_FROM_ID_OR_NULL (f, lookup_basic_face (it->w, f, DEFAULT_FACE_ID)); /* Face extension extends the background and box of IT->face_id to the end of the line. If the background equals the background @@ -20231,7 +20317,7 @@ extend_face_to_end_of_line (struct it *it) if (FRAME_WINDOW_P (f) && MATRIX_ROW_DISPLAYS_TEXT_P (it->glyph_row) && face->box == FACE_NO_BOX - && face->background == FRAME_BACKGROUND_PIXEL (f) + && FACE_COLOR_TO_PIXEL (face->background, f) == FRAME_BACKGROUND_PIXEL (f) #ifdef HAVE_WINDOW_SYSTEM && !face->stipple #endif @@ -20376,7 +20462,7 @@ extend_face_to_end_of_line (struct it *it) && (it->glyph_row->used[LEFT_MARGIN_AREA] < WINDOW_LEFT_MARGIN_WIDTH (it->w)) && !it->glyph_row->mode_line_p - && default_face->background != FRAME_BACKGROUND_PIXEL (f)) + && FACE_COLOR_TO_PIXEL (face->background, f) != FRAME_BACKGROUND_PIXEL (f)) { struct glyph *g = it->glyph_row->glyphs[LEFT_MARGIN_AREA]; struct glyph *e = g + it->glyph_row->used[LEFT_MARGIN_AREA]; @@ -20417,7 +20503,7 @@ extend_face_to_end_of_line (struct it *it) && (it->glyph_row->used[RIGHT_MARGIN_AREA] < WINDOW_RIGHT_MARGIN_WIDTH (it->w)) && !it->glyph_row->mode_line_p - && default_face->background != FRAME_BACKGROUND_PIXEL (f)) + && FACE_COLOR_TO_PIXEL (face->background, f) != FRAME_BACKGROUND_PIXEL (f)) { struct glyph *g = it->glyph_row->glyphs[RIGHT_MARGIN_AREA]; struct glyph *e = g + it->glyph_row->used[RIGHT_MARGIN_AREA]; @@ -20473,11 +20559,12 @@ trailing_whitespace_p (ptrdiff_t charpos) } -/* Highlight trailing whitespace, if any, in ROW. */ +/* Highlight trailing whitespace, if any, in row at IT. */ static void -highlight_trailing_whitespace (struct frame *f, struct glyph_row *row) +highlight_trailing_whitespace (struct it *it) { + struct glyph_row *row = it->glyph_row; int used = row->used[TEXT_AREA]; if (used) @@ -20522,7 +20609,7 @@ highlight_trailing_whitespace (struct frame *f, struct glyph_row *row) && glyph->u.ch == ' ')) && trailing_whitespace_p (glyph->charpos)) { - int face_id = lookup_named_face (f, Qtrailing_whitespace, false); + int face_id = lookup_named_face (it->w, it->f, Qtrailing_whitespace, false); if (face_id < 0) return; @@ -20584,7 +20671,7 @@ row_for_charpos_p (struct glyph_row *row, ptrdiff_t charpos) if (STRINGP (glyph->object)) { Lisp_Object prop - = Fget_char_property (make_number (charpos), + = Fget_char_property (make_fixnum (charpos), Qdisplay, Qnil); result = (!NILP (prop) @@ -20600,7 +20687,7 @@ row_for_charpos_p (struct glyph_row *row, ptrdiff_t charpos) { ptrdiff_t gpos = glyph->charpos; - if (!NILP (Fget_char_property (make_number (gpos), + if (!NILP (Fget_char_property (make_fixnum (gpos), Qcursor, s))) { result = true; @@ -20739,10 +20826,10 @@ get_it_property (struct it *it, Lisp_Object prop) Lisp_Object position, object = it->object; if (STRINGP (object)) - position = make_number (IT_STRING_CHARPOS (*it)); + position = make_fixnum (IT_STRING_CHARPOS (*it)); else if (BUFFERP (object)) { - position = make_number (IT_CHARPOS (*it)); + position = make_fixnum (IT_CHARPOS (*it)); object = it->window; } else @@ -21094,9 +21181,9 @@ maybe_produce_line_number (struct it *it) char lnum_buf[INT_STRLEN_BOUND (ptrdiff_t) + 1]; bool beyond_zv = IT_BYTEPOS (*it) >= ZV_BYTE ? true : false; ptrdiff_t lnum_offset = -1; /* to produce 1-based line numbers */ - int lnum_face_id = merge_faces (it->f, Qline_number, 0, DEFAULT_FACE_ID); + int lnum_face_id = merge_faces (it->w, Qline_number, 0, DEFAULT_FACE_ID); int current_lnum_face_id - = merge_faces (it->f, Qline_number_current_line, 0, DEFAULT_FACE_ID); + = merge_faces (it->w, Qline_number_current_line, 0, DEFAULT_FACE_ID); /* Compute point's line number if needed. */ if ((EQ (Vdisplay_line_numbers, Qrelative) || EQ (Vdisplay_line_numbers, Qvisual) @@ -21115,8 +21202,8 @@ maybe_produce_line_number (struct it *it) /* Compute the required width if needed. */ if (!it->lnum_width) { - if (NATNUMP (Vdisplay_line_numbers_width)) - it->lnum_width = XFASTINT (Vdisplay_line_numbers_width); + if (FIXNATP (Vdisplay_line_numbers_width)) + it->lnum_width = XFIXNAT (Vdisplay_line_numbers_width); /* Max line number to be displayed cannot be more than the one corresponding to the last row of the desired matrix. */ @@ -21286,13 +21373,7 @@ should_produce_line_number (struct it *it) #ifdef HAVE_WINDOW_SYSTEM /* Don't display line number in tooltip frames. */ - if (FRAMEP (tip_frame) && EQ (WINDOW_FRAME (it->w), tip_frame) -#ifdef USE_GTK - /* GTK builds store in tip_frame the frame that shows the tip, - so we need an additional test. */ - && !NILP (Fframe_parameter (tip_frame, Qtooltip)) -#endif - ) + if (FRAME_TOOLTIP_P (XFRAME (WINDOW_FRAME (it->w)))) return false; #endif @@ -21300,7 +21381,7 @@ should_produce_line_number (struct it *it) property, disable line numbers for this row. This is for packages such as company-mode, which need this for their tricky layout, where line numbers get in the way. */ - Lisp_Object val = Fget_char_property (make_number (IT_CHARPOS (*it)), + Lisp_Object val = Fget_char_property (make_fixnum (IT_CHARPOS (*it)), Qdisplay_line_numbers_disable, it->window); /* For ZV, we need to also look in empty overlays at that point, @@ -21563,7 +21644,8 @@ display_line (struct it *it, int cursor_vpos) portions of the screen will clear with the default face's background color. */ if (row->reversed_p - || lookup_basic_face (it->f, DEFAULT_FACE_ID) != DEFAULT_FACE_ID) + || lookup_basic_face (it->w, it->f, DEFAULT_FACE_ID) + != DEFAULT_FACE_ID) extend_face_to_end_of_line (it); break; } @@ -22188,15 +22270,15 @@ display_line (struct it *it, int cursor_vpos) } else { - eassert (INTEGERP (overlay_arrow_string)); - row->overlay_arrow_bitmap = XINT (overlay_arrow_string); + eassert (FIXNUMP (overlay_arrow_string)); + row->overlay_arrow_bitmap = XFIXNUM (overlay_arrow_string); } overlay_arrow_seen = true; } /* Highlight trailing whitespace. */ if (!NILP (Vshow_trailing_whitespace)) - highlight_trailing_whitespace (it->f, it->glyph_row); + highlight_trailing_whitespace (it); /* Compute pixel dimensions of this line. */ compute_line_metrics (it); @@ -22452,8 +22534,8 @@ the `bidi-class' property of a character. */) set_buffer_temp (buf); validate_region (&from, &to); - from_pos = XINT (from); - to_pos = XINT (to); + from_pos = XFIXNUM (from); + to_pos = XFIXNUM (to); if (from_pos >= ZV) return Qnil; @@ -22495,7 +22577,7 @@ the `bidi-class' property of a character. */) bidi_unshelve_cache (itb_data, false); set_buffer_temp (old); - return (from_pos <= found && found < to_pos) ? make_number (found) : Qnil; + return (from_pos <= found && found < to_pos) ? make_fixnum (found) : Qnil; } DEFUN ("move-point-visually", Fmove_point_visually, @@ -22521,8 +22603,8 @@ Value is the new character position of point. */) && (GLYPH)->charpos >= 0 \ && !(GLYPH)->avoid_cursor_p) - CHECK_NUMBER (direction); - dir = XINT (direction); + CHECK_FIXNUM (direction); + dir = XFIXNUM (direction); if (dir > 0) dir = 1; else @@ -22555,7 +22637,7 @@ Value is the new character position of point. */) { SET_PT (g->charpos); w->cursor.vpos = -1; - return make_number (PT); + return make_fixnum (PT); } else if (!NILP (g->object) && !EQ (g->object, gpt->object)) { @@ -22580,7 +22662,7 @@ Value is the new character position of point. */) break; SET_PT (new_pos); w->cursor.vpos = -1; - return make_number (PT); + return make_fixnum (PT); } else if (ROW_GLYPH_NEWLINE_P (row, g)) { @@ -22596,7 +22678,7 @@ Value is the new character position of point. */) else break; w->cursor.vpos = -1; - return make_number (PT); + return make_fixnum (PT); } } if (g == e || NILP (g->object)) @@ -22617,7 +22699,7 @@ Value is the new character position of point. */) { SET_PT (MATRIX_ROW_END_CHARPOS (row) - 1); w->cursor.vpos = -1; - return make_number (PT); + return make_fixnum (PT); } g = row->glyphs[TEXT_AREA]; e = g + row->used[TEXT_AREA]; @@ -22645,7 +22727,7 @@ Value is the new character position of point. */) else continue; w->cursor.vpos = -1; - return make_number (PT); + return make_fixnum (PT); } } } @@ -22655,7 +22737,7 @@ Value is the new character position of point. */) { SET_PT (MATRIX_ROW_END_CHARPOS (row) - 1); w->cursor.vpos = -1; - return make_number (PT); + return make_fixnum (PT); } e = row->glyphs[TEXT_AREA]; g = e + row->used[TEXT_AREA] - 1; @@ -22683,7 +22765,7 @@ Value is the new character position of point. */) else continue; w->cursor.vpos = -1; - return make_number (PT); + return make_fixnum (PT); } } } @@ -22943,7 +23025,7 @@ Value is the new character position of point. */) SET_PT_BOTH (IT_CHARPOS (it), IT_BYTEPOS (it)); } - return make_number (PT); + return make_fixnum (PT); #undef ROW_GLYPH_NEWLINE_P } @@ -22992,8 +23074,8 @@ Emacs UBA implementation, in particular with the test suite. */) } else { - CHECK_NUMBER_COERCE_MARKER (vpos); - nrow = XINT (vpos); + CHECK_FIXNUM (vpos); + nrow = XFIXNUM (vpos); } /* We require up-to-date glyph matrix for this window. */ @@ -23032,7 +23114,7 @@ Emacs UBA implementation, in particular with the test suite. */) /* Create and fill the array. */ levels = make_uninit_vector (nglyphs); for (i = 0; g1 < g; i++, g1++) - ASET (levels, i, make_number (g1->resolved_level)); + ASET (levels, i, make_fixnum (g1->resolved_level)); } else /* Right-to-left glyph row. */ { @@ -23047,7 +23129,7 @@ Emacs UBA implementation, in particular with the test suite. */) nglyphs++; levels = make_uninit_vector (nglyphs); for (i = 0; g1 > g; i++, g1--) - ASET (levels, i, make_number (g1->resolved_level)); + ASET (levels, i, make_fixnum (g1->resolved_level)); } return levels; } @@ -23149,7 +23231,7 @@ display_menu_bar (struct window *w) break; /* Remember where item was displayed. */ - ASET (items, i + 3, make_number (it.hpos)); + ASET (items, i + 3, make_fixnum (it.hpos)); /* Display the item, pad with one space. */ if (it.current_x < it.last_visible_x) @@ -23356,6 +23438,23 @@ display_mode_lines (struct window *w) Lisp_Object old_frame_selected_window = XFRAME (new_frame)->selected_window; int n = 0; + if (window_wants_mode_line (w)) + { + Lisp_Object window; + Lisp_Object default_help + = buffer_local_value (Qmode_line_default_help_echo, w->contents); + + /* Set up mode line help echo. Do this before selecting w so it + can reasonably tell whether a mouse click will select w. */ + XSETWINDOW (window, w); + if (FUNCTIONP (default_help)) + wset_mode_line_help_echo (w, safe_call1 (default_help, window)); + else if (STRINGP (default_help)) + wset_mode_line_help_echo (w, default_help); + else + wset_mode_line_help_echo (w, Qnil); + } + selected_frame = new_frame; /* FIXME: If we were to allow the mode-line's computation changing the buffer or window's point, then we'd need select_window_1 here as well. */ @@ -23370,7 +23469,6 @@ display_mode_lines (struct window *w) { Lisp_Object window_mode_line_format = window_parameter (w, Qmode_line_format); - struct window *sel_w = XWINDOW (old_selected_window); /* Select mode line face based on the real selected window. */ @@ -23503,6 +23601,17 @@ move_elt_to_front (Lisp_Object elt, Lisp_Object list) return list; } +/* Subroutine to call Fset_text_properties through + internal_condition_case_n. ARGS are the arguments of + Fset_text_properties, in order. */ + +static Lisp_Object +safe_set_text_properties (ptrdiff_t nargs, Lisp_Object *args) +{ + eassert (nargs == 4); + return Fset_text_properties (args[0], args[1], args[2], args[3]); +} + /* Contribute ELT to the mode line for window IT->w. How it translates into text depends on its data type. @@ -23552,7 +23661,7 @@ display_mode_element (struct it *it, int depth, int field_width, int precision, && (!NILP (props) || risky)) { Lisp_Object oprops, aelt; - oprops = Ftext_properties_at (make_number (0), elt); + oprops = Ftext_properties_at (make_fixnum (0), elt); /* If the starting string's properties are not what we want, translate the string. Also, if the string @@ -23597,15 +23706,24 @@ display_mode_element (struct it *it, int depth, int field_width, int precision, = Fdelq (aelt, mode_line_proptrans_alist); elt = Fcopy_sequence (elt); - Fset_text_properties (make_number (0), Flength (elt), - props, elt); + /* PROPS might cause set-text-properties to signal + an error, so we call it via internal_condition_case_n, + to avoid an infloop in redisplay due to the error. */ + internal_condition_case_n (safe_set_text_properties, + 4, + ((Lisp_Object []) + {make_fixnum (0), + Flength (elt), + props, + elt}), + Qt, safe_eval_handler); /* Add this item to mode_line_proptrans_alist. */ mode_line_proptrans_alist = Fcons (Fcons (elt, props), mode_line_proptrans_alist); /* Truncate mode_line_proptrans_alist to at most 50 elements. */ - tem = Fnthcdr (make_number (50), + tem = Fnthcdr (make_fixnum (50), mode_line_proptrans_alist); if (! NILP (tem)) XSETCDR (tem, Qnil); @@ -23676,8 +23794,8 @@ display_mode_element (struct it *it, int depth, int field_width, int precision, ? string_byte_to_char (elt, offset) : charpos + nchars); Lisp_Object mode_string - = Fsubstring (elt, make_number (charpos), - make_number (endpos)); + = Fsubstring (elt, make_fixnum (charpos), + make_fixnum (endpos)); n += store_mode_line_string (NULL, mode_string, false, 0, 0, Qnil); } @@ -23740,7 +23858,7 @@ display_mode_element (struct it *it, int depth, int field_width, int precision, case MODE_LINE_STRING: { Lisp_Object tem = build_string (spec); - props = Ftext_properties_at (make_number (charpos), elt); + props = Ftext_properties_at (make_fixnum (charpos), elt); /* Should only keep face property in props */ n += store_mode_line_string (NULL, tem, false, field, prec, props); @@ -23897,9 +24015,9 @@ display_mode_element (struct it *it, int depth, int field_width, int precision, elt = XCAR (elt); goto tail_recurse; } - else if (INTEGERP (car)) + else if (FIXNUMP (car)) { - register int lim = XINT (car); + register int lim = XFIXNUM (car); elt = XCDR (elt); if (lim < 0) { @@ -24014,23 +24132,23 @@ store_mode_line_string (const char *string, Lisp_Object lisp_string, face = list2 (face, mode_line_string_face); props = Fplist_put (props, Qface, face); } - Fadd_text_properties (make_number (0), make_number (len), + Fadd_text_properties (make_fixnum (0), make_fixnum (len), props, lisp_string); } else { - len = XFASTINT (Flength (lisp_string)); + len = XFIXNAT (Flength (lisp_string)); if (precision > 0 && len > precision) { len = precision; - lisp_string = Fsubstring (lisp_string, make_number (0), make_number (len)); + lisp_string = Fsubstring (lisp_string, make_fixnum (0), make_fixnum (len)); precision = -1; } if (!NILP (mode_line_string_face)) { Lisp_Object face; if (NILP (props)) - props = Ftext_properties_at (make_number (0), lisp_string); + props = Ftext_properties_at (make_fixnum (0), lisp_string); face = Fplist_get (props, Qface); if (NILP (face)) face = mode_line_string_face; @@ -24041,7 +24159,7 @@ store_mode_line_string (const char *string, Lisp_Object lisp_string, lisp_string = Fcopy_sequence (lisp_string); } if (!NILP (props)) - Fadd_text_properties (make_number (0), make_number (len), + Fadd_text_properties (make_fixnum (0), make_fixnum (len), props, lisp_string); } @@ -24054,9 +24172,10 @@ store_mode_line_string (const char *string, Lisp_Object lisp_string, if (field_width > len) { field_width -= len; - lisp_string = Fmake_string (make_number (field_width), make_number (' ')); + lisp_string = Fmake_string (make_fixnum (field_width), make_fixnum (' '), + Qnil); if (!NILP (props)) - Fadd_text_properties (make_number (0), make_number (field_width), + Fadd_text_properties (make_fixnum (0), make_fixnum (field_width), props, lisp_string); mode_line_string_list = Fcons (lisp_string, mode_line_string_list); n += field_width; @@ -24093,7 +24212,7 @@ are the selected window and the WINDOW's buffer). */) struct window *w; struct buffer *old_buffer = NULL; int face_id; - bool no_props = INTEGERP (face); + bool no_props = FIXNUMP (face); ptrdiff_t count = SPECPDL_INDEX (); Lisp_Object str; int string_start = 0; @@ -24169,8 +24288,7 @@ are the selected window and the WINDOW's buffer). */) empty_unibyte_string); } - unbind_to (count, Qnil); - return str; + return unbind_to (count, str); } /* Write a null-terminated, right justified decimal representation of @@ -24349,7 +24467,7 @@ decode_mode_spec_coding (Lisp_Object coding_system, char *buf, bool eol_flag) eolvalue = AREF (val, 2); *buf++ = multibyte - ? XFASTINT (CODING_ATTR_MNEMONIC (attrs)) + ? XFIXNAT (CODING_ATTR_MNEMONIC (attrs)) : ' '; if (eol_flag) @@ -24378,7 +24496,7 @@ decode_mode_spec_coding (Lisp_Object coding_system, char *buf, bool eol_flag) } else if (CHARACTERP (eoltype)) { - int c = XFASTINT (eoltype); + int c = XFIXNAT (eoltype); return buf + CHAR_STRING (c, (unsigned char *) buf); } else @@ -24584,8 +24702,8 @@ decode_mode_spec (struct window *w, register int c, int field_width, goto no_value; /* If the buffer is very big, don't waste time. */ - if (INTEGERP (Vline_number_display_limit) - && BUF_ZV (b) - BUF_BEGV (b) > XINT (Vline_number_display_limit)) + if (FIXNUMP (Vline_number_display_limit) + && BUF_ZV (b) - BUF_BEGV (b) > XFIXNUM (Vline_number_display_limit)) { w->base_line_pos = 0; w->base_line_number = 0; @@ -24790,7 +24908,7 @@ decode_mode_spec (struct window *w, register int c, int field_width, if (STRINGP (curdir)) val = call1 (intern ("file-remote-p"), curdir); - unbind_to (count, Qnil); + val = unbind_to (count, val); if (NILP (val)) return "-"; @@ -24873,7 +24991,7 @@ display_count_lines (ptrdiff_t start_byte, check only for newlines. */ bool selective_display = (!NILP (BVAR (current_buffer, selective_display)) - && !INTEGERP (BVAR (current_buffer, selective_display))); + && !FIXNUMP (BVAR (current_buffer, selective_display))); if (count > 0) { @@ -25272,13 +25390,13 @@ display may depend on `buffer-invisibility-spec', which see. */) (Lisp_Object pos) { Lisp_Object prop - = (NATNUMP (pos) || MARKERP (pos) + = (FIXNATP (pos) || MARKERP (pos) ? Fget_char_property (pos, Qinvisible, Qnil) : pos); int invis = TEXT_PROP_MEANS_INVISIBLE (prop); return (invis == 0 ? Qnil : invis == 1 ? Qt - : make_number (invis)); + : make_fixnum (invis)); } /* Calculate a width or height in pixels from a specification using @@ -25552,7 +25670,7 @@ calc_pixel_width_or_height (double *res, struct it *it, Lisp_Object prop, /* '(NUM)': absolute number of pixels. */ if (NUMBERP (car)) - { +{ double fact; int offset = width_p && align_to && *align_to < 0 ? it->lnum_pixel_width : 0; @@ -27177,23 +27295,23 @@ produce_image_glyph (struct it *it) slice.width = img->width; slice.height = img->height; - if (INTEGERP (it->slice.x)) - slice.x = XINT (it->slice.x); + if (FIXNUMP (it->slice.x)) + slice.x = XFIXNUM (it->slice.x); else if (FLOATP (it->slice.x)) slice.x = XFLOAT_DATA (it->slice.x) * img->width; - if (INTEGERP (it->slice.y)) - slice.y = XINT (it->slice.y); + if (FIXNUMP (it->slice.y)) + slice.y = XFIXNUM (it->slice.y); else if (FLOATP (it->slice.y)) slice.y = XFLOAT_DATA (it->slice.y) * img->height; - if (INTEGERP (it->slice.width)) - slice.width = XINT (it->slice.width); + if (FIXNUMP (it->slice.width)) + slice.width = XFIXNUM (it->slice.width); else if (FLOATP (it->slice.width)) slice.width = XFLOAT_DATA (it->slice.width) * img->width; - if (INTEGERP (it->slice.height)) - slice.height = XINT (it->slice.height); + if (FIXNUMP (it->slice.height)) + slice.height = XFIXNUM (it->slice.height); else if (FLOATP (it->slice.height)) slice.height = XFLOAT_DATA (it->slice.height) * img->height; @@ -27827,7 +27945,7 @@ calc_line_height_property (struct it *it, Lisp_Object val, struct font *font, face_name = XCAR (val); val = XCDR (val); if (!NUMBERP (val)) - val = make_number (1); + val = make_fixnum (1); if (NILP (face_name)) { height = it->ascent + it->descent; @@ -27849,10 +27967,10 @@ calc_line_height_property (struct it *it, Lisp_Object val, struct font *font, int face_id; struct face *face; - face_id = lookup_named_face (it->f, face_name, false); + face_id = lookup_named_face (it->w, it->f, face_name, false); face = FACE_FROM_ID_OR_NULL (it->f, face_id); if (face == NULL || ((font = face->font) == NULL)) - return make_number (-1); + return make_fixnum (-1); boff = font->baseline_offset; if (font->vertical_centering) boff = VCENTER_BASELINE_OFFSET (font, it->f) - boff; @@ -27870,12 +27988,17 @@ calc_line_height_property (struct it *it, Lisp_Object val, struct font *font, height = ascent + descent; scale: + /* FIXME: Check for overflow in multiplication or conversion. */ if (FLOATP (val)) height = (int)(XFLOAT_DATA (val) * height); else if (INTEGERP (val)) - height *= XINT (val); + { + intmax_t v; + if (integer_to_intmax (val, &v)) + height *= v; + } - return make_number (height); + return make_fixnum (height); } @@ -28363,8 +28486,8 @@ x_produce_glyphs (struct it *it) it->descent += face->box_line_width; } if (!NILP (height) - && XINT (height) > it->ascent + it->descent) - it->ascent = XINT (height) - it->descent; + && XFIXNUM (height) > it->ascent + it->descent) + it->ascent = XFIXNUM (height) - it->descent; if (!NILP (total_height)) spacing = calc_line_height_property (it, total_height, font, @@ -28375,9 +28498,9 @@ x_produce_glyphs (struct it *it) spacing = calc_line_height_property (it, spacing, font, boff, false); } - if (INTEGERP (spacing)) + if (FIXNUMP (spacing)) { - extra_line_spacing = XINT (spacing); + extra_line_spacing = XFIXNUM (spacing); if (!NILP (total_height)) extra_line_spacing -= (it->phys_ascent + it->phys_descent); } @@ -28594,7 +28717,7 @@ x_produce_glyphs (struct it *it) && font->default_ascent && CHAR_TABLE_P (Vuse_default_ascent) && !NILP (Faref (Vuse_default_ascent, - make_number (it->char_to_display)))) + make_fixnum (it->char_to_display)))) highest = font->default_ascent + boff; /* Draw the first glyph at the normal position. It may be @@ -28645,7 +28768,7 @@ x_produce_glyphs (struct it *it) if (font->relative_compose && (! CHAR_TABLE_P (Vignore_relative_composition) || NILP (Faref (Vignore_relative_composition, - make_number (ch))))) + make_fixnum (ch))))) { if (- descent >= font->relative_compose) @@ -29081,9 +29204,9 @@ get_specified_cursor_type (Lisp_Object arg, int *width) if (CONSP (arg) && EQ (XCAR (arg), Qbar) - && RANGED_INTEGERP (0, XCDR (arg), INT_MAX)) + && RANGED_FIXNUMP (0, XCDR (arg), INT_MAX)) { - *width = XINT (XCDR (arg)); + *width = XFIXNUM (XCDR (arg)); return BAR_CURSOR; } @@ -29095,9 +29218,9 @@ get_specified_cursor_type (Lisp_Object arg, int *width) if (CONSP (arg) && EQ (XCAR (arg), Qhbar) - && RANGED_INTEGERP (0, XCDR (arg), INT_MAX)) + && RANGED_FIXNUMP (0, XCDR (arg), INT_MAX)) { - *width = XINT (XCDR (arg)); + *width = XFIXNUM (XCDR (arg)); return HBAR_CURSOR; } @@ -30720,13 +30843,13 @@ on_hot_spot_p (Lisp_Object hot_spot, int x, int y) return false; if (!CONSP (XCDR (rect))) return false; - if (!(tem = XCAR (XCAR (rect)), INTEGERP (tem) && x >= XINT (tem))) + if (!(tem = XCAR (XCAR (rect)), FIXNUMP (tem) && x >= XFIXNUM (tem))) return false; - if (!(tem = XCDR (XCAR (rect)), INTEGERP (tem) && y >= XINT (tem))) + if (!(tem = XCDR (XCAR (rect)), FIXNUMP (tem) && y >= XFIXNUM (tem))) return false; - if (!(tem = XCAR (XCDR (rect)), INTEGERP (tem) && x <= XINT (tem))) + if (!(tem = XCAR (XCDR (rect)), FIXNUMP (tem) && x <= XFIXNUM (tem))) return false; - if (!(tem = XCDR (XCDR (rect)), INTEGERP (tem) && y <= XINT (tem))) + if (!(tem = XCDR (XCDR (rect)), FIXNUMP (tem) && y <= XFIXNUM (tem))) return false; return true; } @@ -30738,12 +30861,12 @@ on_hot_spot_p (Lisp_Object hot_spot, int x, int y) if (CONSP (circ) && CONSP (XCAR (circ)) && (lr = XCDR (circ), NUMBERP (lr)) - && (lx0 = XCAR (XCAR (circ)), INTEGERP (lx0)) - && (ly0 = XCDR (XCAR (circ)), INTEGERP (ly0))) + && (lx0 = XCAR (XCAR (circ)), FIXNUMP (lx0)) + && (ly0 = XCDR (XCAR (circ)), FIXNUMP (ly0))) { double r = XFLOATINT (lr); - double dx = XINT (lx0) - x; - double dy = XINT (ly0) - y; + double dx = XFIXNUM (lx0) - x; + double dy = XFIXNUM (ly0) - y; return (dx * dx + dy * dy <= r * r); } } @@ -30768,17 +30891,17 @@ on_hot_spot_p (Lisp_Object hot_spot, int x, int y) If count is odd, we are inside polygon. Pixels on edges may or may not be included depending on actual geometry of the polygon. */ - if ((lx = poly[n-2], !INTEGERP (lx)) - || (ly = poly[n-1], !INTEGERP (lx))) + if ((lx = poly[n-2], !FIXNUMP (lx)) + || (ly = poly[n-1], !FIXNUMP (lx))) return false; - x0 = XINT (lx), y0 = XINT (ly); + x0 = XFIXNUM (lx), y0 = XFIXNUM (ly); for (i = 0; i < n; i += 2) { int x1 = x0, y1 = y0; - if ((lx = poly[i], !INTEGERP (lx)) - || (ly = poly[i+1], !INTEGERP (ly))) + if ((lx = poly[i], !FIXNUMP (lx)) + || (ly = poly[i+1], !FIXNUMP (ly))) return false; - x0 = XINT (lx), y0 = XINT (ly); + x0 = XFIXNUM (lx), y0 = XFIXNUM (ly); /* Does this segment cross the X line? */ if (x0 >= x) @@ -30830,12 +30953,12 @@ Returns the alist element for the first matching AREA in MAP. */) if (NILP (map)) return Qnil; - CHECK_NUMBER (x); - CHECK_NUMBER (y); + CHECK_FIXNUM (x); + CHECK_FIXNUM (y); return find_hot_spot (map, - clip_to_bounds (INT_MIN, XINT (x), INT_MAX), - clip_to_bounds (INT_MIN, XINT (y), INT_MAX)); + clip_to_bounds (INT_MIN, XFIXNUM (x), INT_MAX), + clip_to_bounds (INT_MIN, XFIXNUM (y), INT_MAX)); } #endif /* HAVE_WINDOW_SYSTEM */ @@ -30894,9 +31017,6 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y, struct window *w = XWINDOW (window); struct frame *f = XFRAME (w->frame); Mouse_HLInfo *hlinfo = MOUSE_HL_INFO (f); -#ifdef HAVE_WINDOW_SYSTEM - Display_Info *dpyinfo; -#endif Cursor cursor = No_Cursor; Lisp_Object pointer = Qnil; int dx, dy, width, height; @@ -30986,11 +31106,12 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y, #endif /* HAVE_WINDOW_SYSTEM */ if (STRINGP (string)) - pos = make_number (charpos); + pos = make_fixnum (charpos); /* Set the help text and mouse pointer. If the mouse is on a part of the mode line without any text (e.g. past the right edge of - the mode line text), use the default help text and pointer. */ + the mode line text), use that windows's mode line help echo if it + has been set. */ if (STRINGP (string) || area == ON_MODE_LINE) { /* Arrange to display the help by setting the global variables @@ -31007,19 +31128,13 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y, help_echo_object = string; help_echo_pos = charpos; } - else if (area == ON_MODE_LINE) + else if (area == ON_MODE_LINE + && !NILP (w->mode_line_help_echo)) { - Lisp_Object default_help - = buffer_local_value (Qmode_line_default_help_echo, - w->contents); - - if (STRINGP (default_help)) - { - help_echo_string = default_help; - XSETWINDOW (help_echo_window, w); - help_echo_object = Qnil; - help_echo_pos = -1; - } + help_echo_string = w->mode_line_help_echo; + XSETWINDOW (help_echo_window, w); + help_echo_object = Qnil; + help_echo_pos = -1; } } @@ -31031,7 +31146,6 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y, || minibuf_level || NILP (Vresize_mini_windows)); - dpyinfo = FRAME_DISPLAY_INFO (f); if (STRINGP (string)) { cursor = FRAME_X_OUTPUT (f)->nontext_cursor; @@ -31041,25 +31155,28 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y, /* Change the mouse pointer according to what is under X/Y. */ if (NILP (pointer) - && ((area == ON_MODE_LINE) || (area == ON_HEADER_LINE))) + && (area == ON_MODE_LINE || area == ON_HEADER_LINE)) { Lisp_Object map; + map = Fget_text_property (pos, Qlocal_map, string); if (!KEYMAPP (map)) map = Fget_text_property (pos, Qkeymap, string); - if (!KEYMAPP (map) && draggable) - cursor = dpyinfo->vertical_scroll_bar_cursor; + if (!KEYMAPP (map) && draggable && area == ON_MODE_LINE) + cursor = FRAME_X_OUTPUT (f)->vertical_drag_cursor; } } - else if (draggable) - /* Default mode-line pointer. */ - cursor = FRAME_DISPLAY_INFO (f)->vertical_scroll_bar_cursor; + else if (draggable && area == ON_MODE_LINE) + cursor = FRAME_X_OUTPUT (f)->vertical_drag_cursor; + else + cursor = FRAME_X_OUTPUT (f)->nontext_cursor; } #endif } /* Change the mouse face according to what is under X/Y. */ bool mouse_face_shown = false; + if (STRINGP (string)) { mouse_face = Fget_text_property (pos, Qmouse_face, string); @@ -31078,18 +31195,18 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y, int vpos, hpos; - b = Fprevious_single_property_change (make_number (charpos + 1), + b = Fprevious_single_property_change (make_fixnum (charpos + 1), Qmouse_face, string, Qnil); if (NILP (b)) begpos = 0; else - begpos = XINT (b); + begpos = XFIXNUM (b); e = Fnext_single_property_change (pos, Qmouse_face, string, Qnil); if (NILP (e)) endpos = SCHARS (string); else - endpos = XINT (e); + endpos = XFIXNUM (e); /* Calculate the glyph position GPOS of GLYPH in the displayed string, relative to the beginning of the @@ -31487,7 +31604,7 @@ note_mouse_highlight (struct frame *f, int x, int y) ZV = Z; /* Is this char mouse-active or does it have help-echo? */ - position = make_number (pos); + position = make_fixnum (pos); USE_SAFE_ALLOCA; @@ -31558,15 +31675,15 @@ note_mouse_highlight (struct frame *f, int x, int y) ptrdiff_t ignore; s = Fprevious_single_property_change - (make_number (pos + 1), Qmouse_face, object, Qnil); + (make_fixnum (pos + 1), Qmouse_face, object, Qnil); e = Fnext_single_property_change (position, Qmouse_face, object, Qnil); if (NILP (s)) - s = make_number (0); + s = make_fixnum (0); if (NILP (e)) - e = make_number (SCHARS (object)); + e = make_fixnum (SCHARS (object)); mouse_face_from_string_pos (w, hlinfo, object, - XINT (s), XINT (e)); + XFIXNUM (s), XFIXNUM (e)); hlinfo->mouse_face_past_end = false; hlinfo->mouse_face_window = window; hlinfo->mouse_face_face_id @@ -31592,7 +31709,7 @@ note_mouse_highlight (struct frame *f, int x, int y) if (pos > 0) { mouse_face = get_char_property_and_overlay - (make_number (pos), Qmouse_face, w->contents, &overlay); + (make_fixnum (pos), Qmouse_face, w->contents, &overlay); buffer = w->contents; disp_string = object; } @@ -31623,7 +31740,7 @@ note_mouse_highlight (struct frame *f, int x, int y) : Qnil; Lisp_Object lim2 = NILP (BVAR (XBUFFER (buffer), bidi_display_reordering)) - ? make_number (BUF_Z (XBUFFER (buffer)) + ? make_fixnum (BUF_Z (XBUFFER (buffer)) - w->window_end_pos) : Qnil; @@ -31631,9 +31748,9 @@ note_mouse_highlight (struct frame *f, int x, int y) { /* Handle the text property case. */ before = Fprevious_single_property_change - (make_number (pos + 1), Qmouse_face, buffer, lim1); + (make_fixnum (pos + 1), Qmouse_face, buffer, lim1); after = Fnext_single_property_change - (make_number (pos), Qmouse_face, buffer, lim2); + (make_fixnum (pos), Qmouse_face, buffer, lim2); before_string = after_string = Qnil; } else @@ -31651,10 +31768,10 @@ note_mouse_highlight (struct frame *f, int x, int y) mouse_face_from_buffer_pos (window, hlinfo, pos, NILP (before) ? 1 - : XFASTINT (before), + : XFIXNAT (before), NILP (after) ? BUF_Z (XBUFFER (buffer)) - : XFASTINT (after), + : XFIXNAT (after), before_string, after_string, disp_string); cursor = No_Cursor; @@ -31693,7 +31810,7 @@ note_mouse_highlight (struct frame *f, int x, int y) && charpos >= 0 && charpos < SCHARS (obj)) { - help = Fget_text_property (make_number (charpos), + help = Fget_text_property (make_fixnum (charpos), Qhelp_echo, obj); if (NILP (help)) { @@ -31705,7 +31822,7 @@ note_mouse_highlight (struct frame *f, int x, int y) ptrdiff_t p = string_buffer_position (obj, start); if (p > 0) { - help = Fget_char_property (make_number (p), + help = Fget_char_property (make_fixnum (p), Qhelp_echo, w->contents); if (!NILP (help)) { @@ -31718,7 +31835,7 @@ note_mouse_highlight (struct frame *f, int x, int y) else if (BUFFERP (obj) && charpos >= BEGV && charpos < ZV) - help = Fget_text_property (make_number (charpos), Qhelp_echo, + help = Fget_text_property (make_fixnum (charpos), Qhelp_echo, obj); if (!NILP (help)) @@ -31749,7 +31866,7 @@ note_mouse_highlight (struct frame *f, int x, int y) && charpos >= 0 && charpos < SCHARS (obj)) { - pointer = Fget_text_property (make_number (charpos), + pointer = Fget_text_property (make_fixnum (charpos), Qpointer, obj); if (NILP (pointer)) { @@ -31760,14 +31877,14 @@ note_mouse_highlight (struct frame *f, int x, int y) ptrdiff_t start = MATRIX_ROW_START_CHARPOS (r); ptrdiff_t p = string_buffer_position (obj, start); if (p > 0) - pointer = Fget_char_property (make_number (p), + pointer = Fget_char_property (make_fixnum (p), Qpointer, w->contents); } } else if (BUFFERP (obj) && charpos >= BEGV && charpos < ZV) - pointer = Fget_text_property (make_number (charpos), + pointer = Fget_text_property (make_fixnum (charpos), Qpointer, obj); } } @@ -32084,7 +32201,7 @@ x_draw_bottom_divider (struct window *w) int x1 = WINDOW_RIGHT_EDGE_X (w); int y0 = WINDOW_BOTTOM_EDGE_Y (w) - WINDOW_BOTTOM_DIVIDER_WIDTH (w); int y1 = WINDOW_BOTTOM_EDGE_Y (w); - struct window *p = !NILP (w->parent) ? XWINDOW (w->parent) : false; + struct window *p = !NILP (w->parent) ? XWINDOW (w->parent) : NULL; /* If W is vertically combined and has a sibling below, don't draw over any right divider. */ @@ -32168,6 +32285,18 @@ expose_window (struct window *w, XRectangle *fr) y0 or y1 is negative (can happen for tall images). */ int r_bottom = r.y + r.height; + /* We must temporarily switch to the window's buffer, in case + the fringe face has been remapped in that buffer's + face-remapping-alist, so that draw_row_fringe_bitmaps, + called from expose_line, will use the right face. */ + bool buffer_changed = false; + struct buffer *oldbuf = current_buffer; + if (!w->pseudo_window_p) + { + set_buffer_internal_1 (XBUFFER (w->contents)); + buffer_changed = true; + } + /* Update lines intersecting rectangle R. */ first_overlapping_row = last_overlapping_row = NULL; for (row = w->current_matrix->rows; @@ -32213,6 +32342,9 @@ expose_window (struct window *w, XRectangle *fr) break; } + if (buffer_changed) + set_buffer_internal_1 (oldbuf); + /* Display the mode line if there is one. */ if (window_wants_mode_line (w) && (row = MATRIX_MODE_LINE_ROW (w->current_matrix), @@ -32755,7 +32887,7 @@ not span the full frame width. A value of nil means to respect the value of `truncate-lines'. If `word-wrap' is enabled, you might want to reduce this. */); - Vtruncate_partial_width_windows = make_number (50); + Vtruncate_partial_width_windows = make_fixnum (50); DEFVAR_LISP ("line-number-display-limit", Vline_number_display_limit, doc: /* Maximum buffer size for which line number should be displayed. @@ -32809,7 +32941,7 @@ and is used only on frames for which no explicit name has been set doc: /* Maximum number of lines to keep in the message log buffer. If nil, disable message logging. If t, log messages but don't truncate the buffer when it becomes large. */); - Vmessage_log_max = make_number (1000); + Vmessage_log_max = make_fixnum (1000); DEFVAR_LISP ("window-scroll-functions", Vwindow_scroll_functions, doc: /* List of functions to call before redisplaying a window with scrolling. @@ -32869,9 +33001,15 @@ automatically; to decrease the tool-bar height, use \\[recenter]. */); doc: /* Non-nil means raise tool-bar buttons when the mouse moves over them. */); auto_raise_tool_bar_buttons_p = true; - DEFVAR_BOOL ("make-cursor-line-fully-visible", make_cursor_line_fully_visible_p, - doc: /* Non-nil means to scroll (recenter) cursor line if it is not fully visible. */); - make_cursor_line_fully_visible_p = true; + DEFVAR_LISP ("make-cursor-line-fully-visible", Vmake_cursor_line_fully_visible, + doc: /* Whether to scroll the window if the cursor line is not fully visible. +If the value is non-nil, Emacs scrolls or recenters the window to make +the cursor line fully visible. The value could also be a function, which +is called with a single argument, the window to be scrolled, and should +return non-nil if the partially-visible cursor requires scrolling the +window, nil if it's okay to leave the cursor partially-visible. */); + Vmake_cursor_line_fully_visible = Qt; + DEFSYM (Qmake_cursor_line_fully_visible, "make-cursor-line-fully-visible"); DEFVAR_LISP ("tool-bar-border", Vtool_bar_border, doc: /* Border below tool-bar in pixels. @@ -32887,7 +33025,7 @@ If an integer, use that for both horizontal and vertical margins. Otherwise, value should be a pair of integers `(HORZ . VERT)' with HORZ specifying the horizontal margin, and VERT specifying the vertical margin. */); - Vtool_bar_button_margin = make_number (DEFAULT_TOOL_BAR_BUTTON_MARGIN); + Vtool_bar_button_margin = make_fixnum (DEFAULT_TOOL_BAR_BUTTON_MARGIN); DEFVAR_INT ("tool-bar-button-relief", tool_bar_button_relief, doc: /* Relief thickness of tool-bar buttons. */); @@ -32995,7 +33133,7 @@ scroll more than the value given by the scroll step. Note that the lower bound for automatic hscrolling specified by `scroll-left' and `scroll-right' overrides this variable's effect. */); - Vhscroll_step = make_number (0); + Vhscroll_step = make_fixnum (0); DEFVAR_BOOL ("message-truncate-lines", message_truncate_lines, doc: /* If non-nil, messages are truncated instead of resizing the echo area. @@ -33134,6 +33272,7 @@ particularly when using variable `x-use-underline-position-properties' with fonts that specify an UNDERLINE_POSITION relatively close to the baseline. The default value is 1. */); underline_minimum_offset = 1; + DEFSYM (Qunderline_minimum_offset, "underline-minimum-offset"); DEFVAR_BOOL ("display-hourglass", display_hourglass_p, doc: /* Non-nil means show an hourglass pointer, when Emacs is busy. @@ -33143,7 +33282,7 @@ cursor shapes. */); DEFVAR_LISP ("hourglass-delay", Vhourglass_delay, doc: /* Seconds to wait before displaying an hourglass pointer when Emacs is busy. */); - Vhourglass_delay = make_number (DEFAULT_HOURGLASS_DELAY); + Vhourglass_delay = make_fixnum (DEFAULT_HOURGLASS_DELAY); #ifdef HAVE_WINDOW_SYSTEM hourglass_atimer = NULL; @@ -33168,7 +33307,7 @@ or t (meaning all windows). */); /* Symbol for the purpose of Vglyphless_char_display. */ DEFSYM (Qglyphless_char_display, "glyphless-char-display"); - Fput (Qglyphless_char_display, Qchar_table_extra_slots, make_number (1)); + Fput (Qglyphless_char_display, Qchar_table_extra_slots, make_fixnum (1)); DEFVAR_LISP ("glyphless-char-display", Vglyphless_char_display, doc: /* Char-table defining glyphless characters. @@ -33191,7 +33330,7 @@ If a character has a non-nil entry in an active display table, the display table takes effect; in this case, Emacs does not consult `glyphless-char-display' at all. */); Vglyphless_char_display = Fmake_char_table (Qglyphless_char_display, Qnil); - Fset_char_table_extra_slot (Vglyphless_char_display, make_number (0), + Fset_char_table_extra_slot (Vglyphless_char_display, make_fixnum (0), Qempty_box); DEFVAR_LISP ("debug-on-message", Vdebug_on_message, @@ -33259,7 +33398,7 @@ init_xdisp (void) /* The default ellipsis glyphs `...'. */ for (i = 0; i < 3; ++i) - default_invis_vector[i] = make_number ('.'); + default_invis_vector[i] = make_fixnum ('.'); } { @@ -33318,9 +33457,9 @@ start_hourglass (void) cancel_hourglass (); - if (INTEGERP (Vhourglass_delay) - && XINT (Vhourglass_delay) > 0) - delay = make_timespec (min (XINT (Vhourglass_delay), + if (FIXNUMP (Vhourglass_delay) + && XFIXNUM (Vhourglass_delay) > 0) + delay = make_timespec (min (XFIXNUM (Vhourglass_delay), TYPE_MAXIMUM (time_t)), 0); else if (FLOATP (Vhourglass_delay) |