summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJimmy Aguilar Mena <spacibba@aol.com>2019-10-13 16:56:50 +0200
committerJimmy Aguilar Mena <spacibba@aol.com>2019-10-14 14:18:42 +0200
commit501846c85932f1c11405f0a1748b884074a76004 (patch)
tree6744cd3205a394ee957b06a2db973096b8730a23
parentcc47cd4202aa474cf83d6fc42d959460d3cf823f (diff)
downloademacs-501846c85932f1c11405f0a1748b884074a76004.tar.gz
Modify face_at_pos to not modify change IT.
src/xdisp.c (face_at_pos): Removed code to that modified it->start_of_box_run_p and it->face_box_p. This function should not modify it. (handle_face_prop): Added code to update it->start_of_box_run_p and it->face_box_p. (underlying_face_id): Input IT made CONST.
-rw-r--r--src/xdisp.c86
1 files changed, 42 insertions, 44 deletions
diff --git a/src/xdisp.c b/src/xdisp.c
index 6c0b1f88488..d54b717a507 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -993,7 +993,7 @@ static int handle_display_spec (struct it *, Lisp_Object, Lisp_Object,
static int handle_single_display_spec (struct it *, Lisp_Object, Lisp_Object,
Lisp_Object, struct text_pos *,
ptrdiff_t, int, bool, bool);
-static int underlying_face_id (struct it *);
+static int underlying_face_id (const struct it *);
#define face_before_it_pos(IT) face_before_or_after_it_pos (IT, true)
#define face_after_it_pos(IT) face_before_or_after_it_pos (IT, false)
@@ -4158,23 +4158,20 @@ handle_fontified_prop (struct it *it)
***********************************************************************/
static int
-face_at_pos (struct it *it, enum lface_attribute_index attr_filter)
+face_at_pos (const struct it *it, enum lface_attribute_index attr_filter)
{
- int new_face_id;
ptrdiff_t next_stop;
- const bool is_string = STRINGP (it->string);
-
- if (!is_string)
- {
- new_face_id
- = face_at_buffer_position (it->w,
- IT_CHARPOS (*it),
- &next_stop,
- (IT_CHARPOS (*it)
- + TEXT_PROP_DISTANCE_LIMIT),
- false, it->base_face_id,
- attr_filter);
- }
+
+ if (!STRINGP (it->string))
+ {
+ return face_at_buffer_position (it->w,
+ IT_CHARPOS (*it),
+ &next_stop,
+ (IT_CHARPOS (*it)
+ + TEXT_PROP_DISTANCE_LIMIT),
+ false, it->base_face_id,
+ attr_filter);
+ }
else
{
int base_face_id;
@@ -4183,7 +4180,7 @@ face_at_pos (struct it *it, enum lface_attribute_index attr_filter)
Lisp_Object from_overlay
= (it->current.overlay_string_index >= 0
? it->string_overlays[it->current.overlay_string_index
- % OVERLAY_STRING_CHUNK_SIZE]
+ % OVERLAY_STRING_CHUNK_SIZE]
: Qnil);
/* See if we got to this string directly or indirectly from
@@ -4198,7 +4195,7 @@ face_at_pos (struct it *it, enum lface_attribute_index attr_filter)
if (it->stack[i].current.overlay_string_index >= 0)
from_overlay
= it->string_overlays[it->stack[i].current.overlay_string_index
- % OVERLAY_STRING_CHUNK_SIZE];
+ % OVERLAY_STRING_CHUNK_SIZE];
else if (! NILP (it->stack[i].from_overlay))
from_overlay = it->stack[i].from_overlay;
@@ -4213,11 +4210,11 @@ face_at_pos (struct it *it, enum lface_attribute_index attr_filter)
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,
+ IT_CHARPOS (*it),
+ &next_stop,
+ (IT_CHARPOS (*it)
+ + TEXT_PROP_DISTANCE_LIMIT),
+ false,
from_overlay);
}
else
@@ -4247,14 +4244,24 @@ face_at_pos (struct it *it, enum lface_attribute_index attr_filter)
: underlying_face_id (it);
}
- new_face_id = face_at_string_position (it->w,
- it->string,
- IT_STRING_CHARPOS (*it),
- bufpos,
- &next_stop,
- base_face_id, false,
- attr_filter);
- } /* !is_string. */
+ return face_at_string_position (it->w,
+ it->string,
+ IT_STRING_CHARPOS (*it),
+ bufpos,
+ &next_stop,
+ base_face_id, false,
+ attr_filter);
+ } // !STRINGP (it->string))
+}
+
+
+/* Set up iterator IT from face properties at its current position.
+ Called from handle_stop. */
+static enum prop_handled
+handle_face_prop (struct it *it)
+{
+ const int new_face_id = face_at_pos (it, 0);
+
/* Is this a start of a run of characters with box face?
Caveat: this can be called for a freshly initialized
@@ -4273,11 +4280,11 @@ face_at_pos (struct it *it, enum lface_attribute_index attr_filter)
/* If the value of face_id of the iterator is -1, we have to
look in front of IT's position and see whether there is a
face there that's different from new_face_id. */
- if (!is_string
+ if (!STRINGP (it->string)
&& !old_face
&& IT_CHARPOS (*it) > BEG)
{
- int prev_face_id = face_before_it_pos (it);
+ const int prev_face_id = face_before_it_pos (it);
old_face = FACE_FROM_ID_OR_NULL (it->f, prev_face_id);
}
@@ -4285,21 +4292,12 @@ face_at_pos (struct it *it, enum lface_attribute_index attr_filter)
/* If the new face has a box, but the old face does not,
this is the start of a run of characters with box face,
i.e. this character has a shadow on the left side. */
+ it->face_id = new_face_id;
it->start_of_box_run_p = (new_face->box != FACE_NO_BOX
&& (old_face == NULL || !old_face->box));
it->face_box_p = new_face->box != FACE_NO_BOX;
}
- return new_face_id;
-}
-
-
-/* Set up iterator IT from face properties at its current position.
- Called from handle_stop. */
-static enum prop_handled
-handle_face_prop (struct it *it)
-{
- it->face_id = face_at_pos (it, 0);
return HANDLED_NORMALLY;
}
@@ -4310,7 +4308,7 @@ handle_face_prop (struct it *it)
Otherwise, use the iterator's base_face_id. */
static int
-underlying_face_id (struct it *it)
+underlying_face_id (const struct it *it)
{
int face_id = it->base_face_id, i;