From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Dmitry Antipov Newsgroups: gmane.emacs.devel Subject: Dead or unused face handling code Date: Thu, 7 Jul 2016 09:57:03 +0300 Message-ID: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------DF3423857FCF10AC5D40D948" X-Trace: ger.gmane.org 1467874664 13099 80.91.229.3 (7 Jul 2016 06:57:44 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 7 Jul 2016 06:57:44 +0000 (UTC) Cc: Eli Zaretskii To: Emacs development discussions Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Jul 07 08:57:37 2016 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1bL3Fg-0005F5-U2 for ged-emacs-devel@m.gmane.org; Thu, 07 Jul 2016 08:57:37 +0200 Original-Received: from localhost ([::1]:37888 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bL3Fg-0004fR-7e for ged-emacs-devel@m.gmane.org; Thu, 07 Jul 2016 02:57:36 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:35424) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bL3FZ-0004fL-41 for emacs-devel@gnu.org; Thu, 07 Jul 2016 02:57:31 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bL3FW-0006la-I0 for emacs-devel@gnu.org; Thu, 07 Jul 2016 02:57:29 -0400 Original-Received: from forward2m.cmail.yandex.net ([5.255.216.20]:51625) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bL3FO-0006ep-0a; Thu, 07 Jul 2016 02:57:19 -0400 Original-Received: from smtp2m.mail.yandex.net (smtp2m.mail.yandex.net [IPv6:2a02:6b8:0:2519::122]) by forward2m.cmail.yandex.net (Yandex) with ESMTP id 8A4E920F3A; Thu, 7 Jul 2016 09:57:04 +0300 (MSK) Original-Received: from smtp2m.mail.yandex.net (localhost [127.0.0.1]) by smtp2m.mail.yandex.net (Yandex) with ESMTP id 6D1344205EC; Thu, 7 Jul 2016 09:57:04 +0300 (MSK) Original-Received: by smtp2m.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id SYlZdjHQBU-v4LuqnI4; Thu, 07 Jul 2016 09:57:04 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client certificate not present) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1467874624; bh=CuSvBnBT8I1aoTAGqPsbOneh/kG2RyiX+9AxHi0uOnY=; h=To:Cc:From:Subject:Message-ID:Date; b=SsmT6fDW7agMno3byDSKKJNvLLA9DGTNmZZyyaV4nh25UxAcK5jtLvS3wTLl+4yxq FB6kLx1SCXikRbxjqBaWMREB5NRXpFVboRPiiNL+I1GvDWORSCMr+VxoMOMHai3JKo ykva3OMM0+jhkMNZI6vVYmEeldgJfPrGLmTxBASs= Authentication-Results: smtp2m.mail.yandex.net; dkim=pass header.i=@yandex.ru X-Yandex-Suid-Status: 1 0,1 0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 5.255.216.20 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:205299 Archived-At: This is a multi-part message in MIME format. --------------DF3423857FCF10AC5D40D948 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit I've found a few dummy/unused bits around face_at_xxx functions, and running with these patches (which see) for a few days without any problems. But since redisplay is very tricky, I don't feel brave enough to install them without having some feedback first... Dmitry --------------DF3423857FCF10AC5D40D948 Content-Type: text/x-diff; name="0001-Simplify-face_at_string_position-and-related-users.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0001-Simplify-face_at_string_position-and-related-users.patc"; filename*1="h" >From 40a8513ac2f94130ca79a1ddfa956b5f01370282 Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Thu, 7 Jul 2016 08:20:09 +0300 Subject: [PATCH 1/3] Simplify face_at_string_position and related users * src/xfaces.c (face_at_string_position): Remove 4th and 5th args, avoid call to Fnext_single_property_change because it's not actually required by the callers. * src/dispextern.h (face_at_string_position): Adjust prototype. * src/font.c (font_at): * src/xdisp.c (handle_face_prop, face_before_or_after_it_pos) (get_next_display_element, display_string, note_mouse_highlight) (note_mode_line_or_margin_highlight): Related users changed. --- src/dispextern.h | 4 ++-- src/font.c | 2 +- src/xdisp.c | 54 +++++++++++++++++------------------------------------- src/xfaces.c | 36 +++++------------------------------- 4 files changed, 25 insertions(+), 71 deletions(-) diff --git a/src/dispextern.h b/src/dispextern.h index 1325ff9..922534f 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -3440,8 +3440,8 @@ int face_at_buffer_position (struct window *, ptrdiff_t, ptrdiff_t *, ptrdiff_t, bool, int); int face_for_overlay_string (struct window *, ptrdiff_t, ptrdiff_t *, ptrdiff_t, bool, Lisp_Object); -int face_at_string_position (struct window *, Lisp_Object, ptrdiff_t, ptrdiff_t, - ptrdiff_t *, enum face_id, bool); +int face_at_string_position (struct window *, Lisp_Object, ptrdiff_t, + enum face_id, bool); int merge_faces (struct frame *, Lisp_Object, int, int); int compute_char_face (struct frame *, int, Lisp_Object); void free_all_realized_faces (Lisp_Object); diff --git a/src/font.c b/src/font.c index 144ba07..2abb508 100644 --- a/src/font.c +++ b/src/font.c @@ -3747,7 +3747,7 @@ font_at (int c, ptrdiff_t pos, struct face *face, struct window *w, ptrdiff_t endptr; if (STRINGP (string)) - face_id = face_at_string_position (w, string, pos, 0, &endptr, + face_id = face_at_string_position (w, string, pos, DEFAULT_FACE_ID, false); else face_id = face_at_buffer_position (w, pos, &endptr, diff --git a/src/xdisp.c b/src/xdisp.c index d5ffb25..f7db9de 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -3907,7 +3907,6 @@ handle_face_prop (struct it *it) else { int base_face_id; - ptrdiff_t bufpos; int i; Lisp_Object from_overlay = (it->current.overlay_string_index >= 0 @@ -3936,23 +3935,18 @@ handle_face_prop (struct it *it) } if (! NILP (from_overlay)) - { - bufpos = IT_CHARPOS (*it); - /* For a string from an overlay, the base face depends - only on text properties and ignores overlays. */ - base_face_id - = face_for_overlay_string (it->w, - IT_CHARPOS (*it), - &next_stop, - (IT_CHARPOS (*it) - + TEXT_PROP_DISTANCE_LIMIT), - false, - from_overlay); - } + /* For a string from an overlay, the base face depends + only on text properties and ignores overlays. */ + base_face_id + = face_for_overlay_string (it->w, + IT_CHARPOS (*it), + &next_stop, + (IT_CHARPOS (*it) + + TEXT_PROP_DISTANCE_LIMIT), + false, + from_overlay); else { - bufpos = 0; - /* For strings from a `display' property, use the face at IT's current buffer position as the base face to merge with, so that overlay strings appear in the same face as @@ -3979,8 +3973,6 @@ handle_face_prop (struct it *it) new_face_id = face_at_string_position (it->w, it->string, IT_STRING_CHARPOS (*it), - bufpos, - &next_stop, base_face_id, false); /* Is this a start of a run of characters with box? Caveat: @@ -4046,7 +4038,7 @@ face_before_or_after_it_pos (struct it *it, bool before_p) if (STRINGP (it->string)) { - ptrdiff_t bufpos, charpos; + ptrdiff_t charpos; int base_face_id; /* No face change past the end of the string (for the case @@ -4115,19 +4107,10 @@ face_before_or_after_it_pos (struct it *it, bool before_p) } eassert (0 <= charpos && charpos <= SCHARS (it->string)); - if (it->current.overlay_string_index >= 0) - bufpos = IT_CHARPOS (*it); - else - bufpos = 0; - base_face_id = underlying_face_id (it); /* Get the face for ASCII, or unibyte. */ - face_id = face_at_string_position (it->w, - it->string, - charpos, - bufpos, - &next_check_charpos, + face_id = face_at_string_position (it->w, it->string, charpos, base_face_id, false); /* Correct the face for charsets different from ASCII. Do it @@ -7288,8 +7271,8 @@ get_next_display_element (struct it *it) { next_face_id = face_at_string_position (it->w, base_string, - CHARPOS (pos), 0, - &ignore, face_id, false); + CHARPOS (pos), + face_id, false); it->end_of_box_run_p = (FACE_FROM_ID (it->f, next_face_id)->box == FACE_NO_BOX); @@ -23991,12 +23974,11 @@ display_string (const char *string, Lisp_Object lisp_string, Lisp_Object face_st FACE_STRING, if that's given. */ if (STRINGP (face_string)) { - ptrdiff_t endptr; struct face *face; it->face_id = face_at_string_position (it->w, face_string, face_string_pos, - 0, &endptr, it->base_face_id, false); + it->base_face_id, false); face = FACE_FROM_ID (it->f, it->face_id); it->face_box_p = face->box != FACE_NO_BOX; } @@ -29898,7 +29880,7 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y, int gpos; int gseq_length; int total_pixel_width; - ptrdiff_t begpos, endpos, ignore; + ptrdiff_t begpos, endpos; int vpos, hpos; @@ -30002,7 +29984,6 @@ note_mode_line_or_margin_highlight (Lisp_Object window, int x, int y, hlinfo->mouse_face_face_id = face_at_string_position (w, string, charpos, - 0, &ignore, glyph->face_id, true); show_mouse_face (hlinfo, DRAW_MOUSE_FACE); @@ -30318,7 +30299,6 @@ note_mouse_highlight (struct frame *f, int x, int y) /* The mouse-highlighting comes from a display string with a mouse-face. */ Lisp_Object s, e; - ptrdiff_t ignore; s = Fprevious_single_property_change (make_number (pos + 1), Qmouse_face, object, Qnil); @@ -30333,7 +30313,7 @@ note_mouse_highlight (struct frame *f, int x, int y) hlinfo->mouse_face_past_end = false; hlinfo->mouse_face_window = window; hlinfo->mouse_face_face_id - = face_at_string_position (w, object, pos, 0, &ignore, + = face_at_string_position (w, object, pos, glyph->face_id, true); show_mouse_face (hlinfo, DRAW_MOUSE_FACE); cursor = No_Cursor; diff --git a/src/xfaces.c b/src/xfaces.c index 0a1315d..6146ef5 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -6032,33 +6032,20 @@ face_for_overlay_string (struct window *w, ptrdiff_t pos, /* Compute the face at character position POS in Lisp string STRING on - window W, for ASCII characters. + window W, for ASCII characters. W must display the current buffer. - If STRING is an overlay string, it comes from position BUFPOS in - current_buffer, otherwise BUFPOS is zero to indicate that STRING is - not an overlay string. W must display the current buffer. - REGION_BEG and REGION_END give the start and end positions of the - region; both are -1 if no region is visible. - - BASE_FACE_ID is the id of a face to merge with. For strings coming - from overlays or the `display' property it is the face at BUFPOS. + BASE_FACE_ID is the id of a face to merge with. If MOUSE_P, use the character's mouse-face, not its face. - Set *ENDPTR to the next position where to check for faces in - STRING; -1 if the face is constant from POS to the end of the - string. - Value is the id of the face to use. The face returned is suitable for displaying ASCII characters. */ int -face_at_string_position (struct window *w, Lisp_Object string, - ptrdiff_t pos, ptrdiff_t bufpos, - ptrdiff_t *endptr, enum face_id base_face_id, - bool mouse_p) +face_at_string_position (struct window *w, Lisp_Object string, ptrdiff_t pos, + enum face_id base_face_id, bool mouse_p) { - Lisp_Object prop, position, end, limit; + Lisp_Object prop, position; struct frame *f = XFRAME (WINDOW_FRAME (w)); Lisp_Object attrs[LFACE_VECTOR_SIZE]; struct face *base_face; @@ -6070,19 +6057,6 @@ face_at_string_position (struct window *w, Lisp_Object string, XSETFASTINT (position, pos); prop = Fget_text_property (position, prop_name, string); - /* Get the next position at which to check for faces. Value of end - is nil if face is constant all the way to the end of the string. - Otherwise it is a string position where to check faces next. - Limit is the maximum position up to which to check for property - changes in Fnext_single_property_change. Strings are usually - short, so set the limit to the end of the string. */ - XSETFASTINT (limit, SCHARS (string)); - end = Fnext_single_property_change (position, prop_name, string, limit); - if (INTEGERP (end)) - *endptr = XFASTINT (end); - else - *endptr = -1; - base_face = FACE_FROM_ID (f, base_face_id); /* Optimize the default case that there is no face property. */ -- 2.9.0 --------------DF3423857FCF10AC5D40D948 Content-Type: text/x-diff; name="0002-Simplify-face_for_overlay_string-and-related-users.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0002-Simplify-face_for_overlay_string-and-related-users.patc"; filename*1="h" >From 4f1bdeac06f0395441dad1ffa6db577aeaf81f75 Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Thu, 7 Jul 2016 09:24:55 +0300 Subject: [PATCH 2/3] Simplify face_for_overlay_string and related users * src/xfaces.c (face_for_overlay_string): Remove 2nd and 3rd args, avoid call to Fnext_single_property_change because it's not actually required by the caller. * src/dispextern.h (face_for_overlay_string): Adjust prototype. * src/xdisp.c (handle_face_prop): The only user changed. --- src/dispextern.h | 3 +-- src/xdisp.c | 9 ++------- src/xfaces.c | 15 --------------- 3 files changed, 3 insertions(+), 24 deletions(-) diff --git a/src/dispextern.h b/src/dispextern.h index 922534f..bf44cd0 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -3438,8 +3438,7 @@ void free_frame_faces (struct frame *); void recompute_basic_faces (struct frame *); int face_at_buffer_position (struct window *, ptrdiff_t, ptrdiff_t *, ptrdiff_t, bool, int); -int face_for_overlay_string (struct window *, ptrdiff_t, ptrdiff_t *, ptrdiff_t, - bool, Lisp_Object); +int face_for_overlay_string (struct window *, ptrdiff_t, bool, Lisp_Object); int face_at_string_position (struct window *, Lisp_Object, ptrdiff_t, enum face_id, bool); int merge_faces (struct frame *, Lisp_Object, int, int); diff --git a/src/xdisp.c b/src/xdisp.c index f7db9de..790709e 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -3938,13 +3938,8 @@ handle_face_prop (struct it *it) /* For a string from an overlay, the base face depends only on text properties and ignores overlays. */ base_face_id - = face_for_overlay_string (it->w, - IT_CHARPOS (*it), - &next_stop, - (IT_CHARPOS (*it) - + TEXT_PROP_DISTANCE_LIMIT), - false, - from_overlay); + = face_for_overlay_string (it->w, IT_CHARPOS (*it), + false, from_overlay); else { /* For strings from a `display' property, use the face at diff --git a/src/xfaces.c b/src/xfaces.c index 6146ef5..41a45cf 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -5981,34 +5981,21 @@ face_at_buffer_position (struct window *w, ptrdiff_t pos, int face_for_overlay_string (struct window *w, ptrdiff_t pos, - ptrdiff_t *endptr, ptrdiff_t limit, bool mouse, Lisp_Object overlay) { struct frame *f = XFRAME (w->frame); Lisp_Object attrs[LFACE_VECTOR_SIZE]; Lisp_Object prop, position; - ptrdiff_t endpos; Lisp_Object propname = mouse ? Qmouse_face : Qface; - Lisp_Object limit1, end; struct face *default_face; /* W must display the current buffer. We could write this function to use the frame and buffer of W, but right now it doesn't. */ - /* eassert (XBUFFER (w->contents) == current_buffer); */ - XSETFASTINT (position, pos); - endpos = ZV; - /* Get the `face' or `mouse_face' text property at POS, and determine the next position at which the property changes. */ prop = Fget_text_property (position, propname, w->contents); - XSETFASTINT (limit1, (limit < endpos ? limit : endpos)); - end = Fnext_single_property_change (position, propname, w->contents, limit1); - if (INTEGERP (end)) - endpos = XINT (end); - - *endptr = endpos; /* Optimize common case where we can use the default face. */ if (NILP (prop) @@ -6023,8 +6010,6 @@ face_for_overlay_string (struct window *w, ptrdiff_t pos, if (!NILP (prop)) merge_face_ref (f, prop, attrs, true, 0); - *endptr = endpos; - /* Look up a realized face with the given face attributes, or realize a new one for ASCII characters. */ return lookup_face (f, attrs); -- 2.9.0 --------------DF3423857FCF10AC5D40D948 Content-Type: text/x-diff; name="0003-Simplify-face_at_buffer_position-and-related-users.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0003-Simplify-face_at_buffer_position-and-related-users.patc"; filename*1="h" >From c482a125a9bc0f0fcf1763be9d340ec8f164ed10 Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Thu, 7 Jul 2016 09:42:06 +0300 Subject: [PATCH 3/3] Simplify face_at_buffer_position and related users * src/xfaces.c (face_at_buffer_position): Remove 3rd arg, avoid call to Fnext_single_property_change because it's not actually required by the callers. * src/dispextern.h (face_at_buffer_position): Adjust prototype. * src/font.c (font_at, font_range, Finternal_char_font): * src/xdisp.c (handle_face_prop, face_before_or_after_it_pos) (get_next_display_element, mouse_face_from_buffer_pos): Related users changed. --- src/dispextern.h | 3 +-- src/font.c | 13 ++++--------- src/xdisp.c | 18 +++++------------- src/xfaces.c | 35 +++-------------------------------- 4 files changed, 13 insertions(+), 56 deletions(-) diff --git a/src/dispextern.h b/src/dispextern.h index bf44cd0..d8ca923 100644 --- a/src/dispextern.h +++ b/src/dispextern.h @@ -3436,8 +3436,7 @@ int lookup_derived_face (struct frame *, Lisp_Object, int, bool); void init_frame_faces (struct frame *); void free_frame_faces (struct frame *); void recompute_basic_faces (struct frame *); -int face_at_buffer_position (struct window *, ptrdiff_t, ptrdiff_t *, ptrdiff_t, - bool, int); +int face_at_buffer_position (struct window *, ptrdiff_t, ptrdiff_t, bool, int); int face_for_overlay_string (struct window *, ptrdiff_t, bool, Lisp_Object); int face_at_string_position (struct window *, Lisp_Object, ptrdiff_t, enum face_id, bool); diff --git a/src/font.c b/src/font.c index 2abb508..17d1518 100644 --- a/src/font.c +++ b/src/font.c @@ -3744,14 +3744,12 @@ font_at (int c, ptrdiff_t pos, struct face *face, struct window *w, if (! face) { int face_id; - ptrdiff_t endptr; if (STRINGP (string)) face_id = face_at_string_position (w, string, pos, DEFAULT_FACE_ID, false); else - face_id = face_at_buffer_position (w, pos, &endptr, - pos + 100, false, -1); + face_id = face_at_buffer_position (w, pos, pos + 100, false, -1); face = FACE_FROM_ID (f, face_id); } if (multibyte) @@ -3784,7 +3782,6 @@ Lisp_Object font_range (ptrdiff_t pos, ptrdiff_t pos_byte, ptrdiff_t *limit, struct window *w, struct face *face, Lisp_Object string) { - ptrdiff_t ignore; int c; Lisp_Object font_object = Qnil; @@ -3794,8 +3791,7 @@ font_range (ptrdiff_t pos, ptrdiff_t pos_byte, ptrdiff_t *limit, { int face_id; - face_id = face_at_buffer_position (w, pos, &ignore, - *limit, false, -1); + face_id = face_at_buffer_position (w, pos, *limit, false, -1); face = FACE_FROM_ID (XFRAME (w->frame), face_id); } } @@ -4533,7 +4529,7 @@ DEFUN ("internal-char-font", Finternal_char_font, Sinternal_char_font, 1, 2, 0, doc: /* For internal use only. */) (Lisp_Object position, Lisp_Object ch) { - ptrdiff_t pos, pos_byte, dummy; + ptrdiff_t pos, pos_byte; int face_id; int c; struct frame *f; @@ -4568,8 +4564,7 @@ DEFUN ("internal-char-font", Finternal_char_font, Sinternal_char_font, 1, 2, 0, return Qnil; w = XWINDOW (window); f = XFRAME (w->frame); - face_id = face_at_buffer_position (w, pos, &dummy, - pos + 100, false, -1); + face_id = face_at_buffer_position (w, pos, pos + 100, false, -1); } if (! CHAR_VALID_P (c)) return Qnil; diff --git a/src/xdisp.c b/src/xdisp.c index 790709e..ac7f3d2 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -3860,14 +3860,11 @@ static enum prop_handled handle_face_prop (struct it *it) { int new_face_id; - ptrdiff_t next_stop; if (!STRINGP (it->string)) { new_face_id - = face_at_buffer_position (it->w, - IT_CHARPOS (*it), - &next_stop, + = face_at_buffer_position (it->w, IT_CHARPOS (*it), (IT_CHARPOS (*it) + TEXT_PROP_DISTANCE_LIMIT), false, it->base_face_id); @@ -4025,7 +4022,6 @@ static int face_before_or_after_it_pos (struct it *it, bool before_p) { int face_id, limit; - ptrdiff_t next_check_charpos; struct it it_copy; void *it_copy_data = NULL; @@ -4197,9 +4193,7 @@ face_before_or_after_it_pos (struct it *it, bool before_p) eassert (BEGV <= CHARPOS (pos) && CHARPOS (pos) <= ZV); /* Determine face for CHARSET_ASCII, or unibyte. */ - face_id = face_at_buffer_position (it->w, - CHARPOS (pos), - &next_check_charpos, + face_id = face_at_buffer_position (it->w, CHARPOS (pos), limit, false, -1); /* Correct the face for charsets different from ASCII. Do it @@ -7214,7 +7208,6 @@ get_next_display_element (struct it *it) /* A string from display property. */ || it->from_disp_prop_p)) { - ptrdiff_t ignore; int next_face_id; bool text_from_string = false; /* Normally, the next buffer location is stored in @@ -7278,7 +7271,7 @@ get_next_display_element (struct it *it) else { next_face_id = - face_at_buffer_position (it->w, CHARPOS (pos), &ignore, + face_at_buffer_position (it->w, CHARPOS (pos), CHARPOS (pos) + TEXT_PROP_DISTANCE_LIMIT, false, -1); @@ -28985,7 +28978,7 @@ mouse_face_from_buffer_pos (Lisp_Object window, struct glyph_row *first = MATRIX_FIRST_TEXT_ROW (w->current_matrix); struct glyph_row *r1, *r2; struct glyph *glyph, *end; - ptrdiff_t ignore, pos; + ptrdiff_t pos; int x; eassert (NILP (disp_string) || STRINGP (disp_string)); @@ -29288,8 +29281,7 @@ mouse_face_from_buffer_pos (Lisp_Object window, hlinfo->mouse_face_window = window; hlinfo->mouse_face_face_id - = face_at_buffer_position (w, mouse_charpos, &ignore, - mouse_charpos + 1, + = face_at_buffer_position (w, mouse_charpos, mouse_charpos + 1, !hlinfo->mouse_face_hidden, -1); show_mouse_face (hlinfo, DRAW_MOUSE_FACE); } diff --git a/src/xfaces.c b/src/xfaces.c index 41a45cf..c401b7a 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -5858,13 +5858,8 @@ compute_char_face (struct frame *f, int ch, Lisp_Object prop) return face_id; } -/* Return the face ID associated with buffer position POS for - displaying ASCII characters. Return in *ENDPTR the position at - which a different face is needed, as far as text properties and - overlays are concerned. W is a window displaying current_buffer. - - REGION_BEG, REGION_END delimit the region, so it can be - highlighted. +/* Return the face ID associated with buffer position POS for displaying + ASCII characters. W is a window displaying current_buffer. LIMIT is a position not to scan beyond. That is to limit the time this function can take. @@ -5877,8 +5872,7 @@ compute_char_face (struct frame *f, int ch, Lisp_Object prop) The face returned is suitable for displaying ASCII characters. */ int -face_at_buffer_position (struct window *w, ptrdiff_t pos, - ptrdiff_t *endptr, ptrdiff_t limit, +face_at_buffer_position (struct window *w, ptrdiff_t pos, ptrdiff_t limit, bool mouse, int base_face_id) { struct frame *f = XFRAME (w->frame); @@ -5886,26 +5880,17 @@ face_at_buffer_position (struct window *w, ptrdiff_t pos, Lisp_Object prop, position; ptrdiff_t i, noverlays; Lisp_Object *overlay_vec; - ptrdiff_t endpos; Lisp_Object propname = mouse ? Qmouse_face : Qface; - Lisp_Object limit1, end; struct face *default_face; /* W must display the current buffer. We could write this function to use the frame and buffer of W, but right now it doesn't. */ - /* eassert (XBUFFER (w->contents) == current_buffer); */ XSETFASTINT (position, pos); - endpos = ZV; - /* Get the `face' or `mouse_face' text property at POS, and determine the next position at which the property changes. */ prop = Fget_text_property (position, propname, w->contents); - XSETFASTINT (limit1, (limit < endpos ? limit : endpos)); - end = Fnext_single_property_change (position, propname, w->contents, limit1); - if (INTEGERP (end)) - endpos = XINT (end); /* Look at properties from overlays. */ USE_SAFE_ALLOCA; @@ -5913,12 +5898,8 @@ face_at_buffer_position (struct window *w, ptrdiff_t pos, ptrdiff_t next_overlay; GET_OVERLAYS_AT (pos, overlay_vec, noverlays, &next_overlay, false); - if (next_overlay < endpos) - endpos = next_overlay; } - *endptr = endpos; - { int face_id; @@ -5951,21 +5932,11 @@ face_at_buffer_position (struct window *w, ptrdiff_t pos, noverlays = sort_overlays (overlay_vec, noverlays, w); for (i = 0; i < noverlays; i++) { - Lisp_Object oend; - ptrdiff_t oendpos; - prop = Foverlay_get (overlay_vec[i], propname); if (!NILP (prop)) merge_face_ref (f, prop, attrs, true, 0); - - oend = OVERLAY_END (overlay_vec[i]); - oendpos = OVERLAY_POSITION (oend); - if (oendpos < endpos) - endpos = oendpos; } - *endptr = endpos; - SAFE_FREE (); /* Look up a realized face with the given face attributes, -- 2.9.0 --------------DF3423857FCF10AC5D40D948--