Fix handling of FROM = t and TO = t by 'window-text-pixel-size'
* src/xdisp.c (Fwindow_text_pixel_size): Use byte position for accessing buffer text, not character positions. (Bug#41125)
This commit is contained in:
parent
76516465bf
commit
a76cafea0d
1 changed files with 38 additions and 15 deletions
53
src/xdisp.c
53
src/xdisp.c
|
@ -10442,7 +10442,7 @@ include the height of both, if present, in the return value. */)
|
|||
struct buffer *b;
|
||||
struct it it;
|
||||
struct buffer *old_b = NULL;
|
||||
ptrdiff_t start, end, pos;
|
||||
ptrdiff_t start, end, bpos;
|
||||
struct text_pos startp;
|
||||
void *itdata = NULL;
|
||||
int c, max_x = 0, max_y = 0, x = 0, y = 0;
|
||||
|
@ -10457,32 +10457,56 @@ include the height of both, if present, in the return value. */)
|
|||
}
|
||||
|
||||
if (NILP (from))
|
||||
start = BEGV;
|
||||
{
|
||||
start = BEGV;
|
||||
bpos = BEGV_BYTE;
|
||||
}
|
||||
else if (EQ (from, Qt))
|
||||
{
|
||||
start = pos = BEGV;
|
||||
while ((pos++ < ZV) && (c = FETCH_CHAR (pos))
|
||||
&& (c == ' ' || c == '\t' || c == '\n' || c == '\r'))
|
||||
start = pos;
|
||||
while ((pos-- > BEGV) && (c = FETCH_CHAR (pos)) && (c == ' ' || c == '\t'))
|
||||
start = pos;
|
||||
start = BEGV;
|
||||
bpos = BEGV_BYTE;
|
||||
while (bpos < ZV_BYTE)
|
||||
{
|
||||
FETCH_CHAR_ADVANCE (c, start, bpos);
|
||||
if (!(c == ' ' || c == '\t' || c == '\n' || c == '\r'))
|
||||
break;
|
||||
}
|
||||
while (bpos > BEGV_BYTE)
|
||||
{
|
||||
DEC_BOTH (start, bpos);
|
||||
c = FETCH_CHAR (bpos);
|
||||
if (!(c == ' ' || c == '\t'))
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CHECK_FIXNUM_COERCE_MARKER (from);
|
||||
start = min (max (XFIXNUM (from), BEGV), ZV);
|
||||
bpos = CHAR_TO_BYTE (start);
|
||||
}
|
||||
|
||||
SET_TEXT_POS (startp, start, bpos);
|
||||
|
||||
if (NILP (to))
|
||||
end = ZV;
|
||||
else if (EQ (to, Qt))
|
||||
{
|
||||
end = pos = ZV;
|
||||
while ((pos-- > BEGV) && (c = FETCH_CHAR (pos))
|
||||
&& (c == ' ' || c == '\t' || c == '\n' || c == '\r'))
|
||||
end = pos;
|
||||
while ((pos++ < ZV) && (c = FETCH_CHAR (pos)) && (c == ' ' || c == '\t'))
|
||||
end = pos;
|
||||
end = ZV;
|
||||
bpos = ZV_BYTE;
|
||||
while (bpos > BEGV_BYTE)
|
||||
{
|
||||
DEC_BOTH (end, bpos);
|
||||
c = FETCH_CHAR (bpos);
|
||||
if (!(c == ' ' || c == '\t' || c == '\n' || c == '\r'))
|
||||
break;
|
||||
}
|
||||
while (bpos < ZV_BYTE)
|
||||
{
|
||||
FETCH_CHAR_ADVANCE (c, end, bpos);
|
||||
if (!(c == ' ' || c == '\t'))
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -10499,7 +10523,6 @@ include the height of both, if present, in the return value. */)
|
|||
max_y = XFIXNUM (y_limit);
|
||||
|
||||
itdata = bidi_shelve_cache ();
|
||||
SET_TEXT_POS (startp, start, CHAR_TO_BYTE (start));
|
||||
start_display (&it, w, startp);
|
||||
/* It makes no sense to measure dimensions of region of text that
|
||||
crosses the point where bidi reordering changes scan direction.
|
||||
|
|
Loading…
Add table
Reference in a new issue