Commit b236615c authored by Eli Zaretskii's avatar Eli Zaretskii

Fix cursor drawing on stretch glyphs in R2L lines.

 xterm.c (x_draw_stretch_glyph_string):
 w32term.c (x_draw_stretch_glyph_string): In R2L rows, display the
 cursor on the right edge of the stretch glyph.
 xdisp.c (window_box_right_offset, window_box_right): Fix commentary.
parent 5872c762
2010-08-14 Eli Zaretskii <eliz@gnu.org>
* xterm.c (x_draw_stretch_glyph_string):
* w32term.c (x_draw_stretch_glyph_string): In R2L rows, display
the cursor on the right edge of the stretch glyph.
* xdisp.c (window_box_right_offset, window_box_right): Fix
commentary.
* xdisp.c (Fcurrent_bidi_paragraph_direction): Fix paragraph
direction when point is inside a run of whitespace characters.
......
......@@ -2106,17 +2106,34 @@ x_draw_stretch_glyph_string (struct glyph_string *s)
if (s->hl == DRAW_CURSOR
&& !x_stretch_cursor_p)
{
/* If `x-stretch-block-cursor' is nil, don't draw a block cursor
as wide as the stretch glyph. */
/* If `x-stretch-cursor' is nil, don't draw a block cursor as
wide as the stretch glyph. */
int width, background_width = s->background_width;
int x = s->x, left_x = window_box_left_offset (s->w, TEXT_AREA);
int x = s->x;
if (x < left_x)
if (!s->row->reversed_p)
{
background_width -= left_x - x;
x = left_x;
int left_x = window_box_left_offset (s->w, TEXT_AREA);
if (x < left_x)
{
background_width -= left_x - x;
x = left_x;
}
}
else
{
/* In R2L rows, draw the cursor on the right edge of the
stretch glyph. */
int right_x = window_box_right_offset (s->w, TEXT_AREA);
if (x + background_width > right_x)
background_width -= x - right_x;
x += background_width;
}
width = min (FRAME_COLUMN_WIDTH (s->f), background_width);
if (s->row->reversed_p)
x -= width;
/* Draw cursor. */
x_draw_glyph_string_bg_rect (s, x, s->y, width, s->height);
......@@ -2130,7 +2147,10 @@ x_draw_stretch_glyph_string (struct glyph_string *s)
RECT r;
HDC hdc = s->hdc;
x += width;
if (!s->row->reversed_p)
x += width;
else
x = s->x;
if (s->row->mouse_face_p
&& cursor_in_mouse_face_p (s->w))
{
......
......@@ -1208,7 +1208,7 @@ window_box_left_offset (struct window *w, int area)
/* Return the window-relative coordinate of the right edge of display
area AREA of window W. AREA < 0 means return the left edge of the
area AREA of window W. AREA < 0 means return the right edge of the
whole window, to the left of the right fringe of W. */
INLINE int
......@@ -1238,7 +1238,7 @@ window_box_left (struct window *w, int area)
/* Return the frame-relative coordinate of the right edge of display
area AREA of window W. AREA < 0 means return the left edge of the
area AREA of window W. AREA < 0 means return the right edge of the
whole window, to the left of the right fringe of W. */
INLINE int
......
......@@ -2435,17 +2435,34 @@ x_draw_stretch_glyph_string (struct glyph_string *s)
if (s->hl == DRAW_CURSOR
&& !x_stretch_cursor_p)
{
/* If `x-stretch-block-cursor' is nil, don't draw a block cursor
as wide as the stretch glyph. */
/* If `x-stretch-cursor' is nil, don't draw a block cursor as
wide as the stretch glyph. */
int width, background_width = s->background_width;
int x = s->x, left_x = window_box_left_offset (s->w, TEXT_AREA);
int x = s->x;
if (x < left_x)
if (!s->row->reversed_p)
{
background_width -= left_x - x;
x = left_x;
int left_x = window_box_left_offset (s->w, TEXT_AREA);
if (x < left_x)
{
background_width -= left_x - x;
x = left_x;
}
}
else
{
/* In R2L rows, draw the cursor on the right edge of the
stretch glyph. */
int right_x = window_box_right_offset (s->w, TEXT_AREA);
if (x + background_width > right_x)
background_width -= x - right_x;
x += background_width;
}
width = min (FRAME_COLUMN_WIDTH (s->f), background_width);
if (s->row->reversed_p)
x -= width;
/* Draw cursor. */
x_draw_glyph_string_bg_rect (s, x, s->y, width, s->height);
......@@ -2458,7 +2475,10 @@ x_draw_stretch_glyph_string (struct glyph_string *s)
XRectangle r;
GC gc;
x += width;
if (!s->row->reversed_p)
x += width;
else
x = s->x;
if (s->row->mouse_face_p
&& cursor_in_mouse_face_p (s->w))
{
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment