The following changes fix Bug#3005 for wide glyphs on each platform,

without	reintroducing Bug#1258 for stretch glyphs.

* xterm.c (x_draw_bar_cursor): Limit cursor width differently for
BAR_CURSOR and HBAR_CURSOR.  Calculate width of HBAR_CURSOR using
get_phys_cursor_geometry.

* w32term.c (x_draw_bar_cursor):  Limit cursor width differently
for BAR_CURSOR and HBAR_CURSOR.  Calculate width of HBAR_CURSOR
using get_phys_cursor_geometry.

* nsterm.m (ns_draw_window_cursor): HBAR_CURSOR width already
correctly calculated.
This commit is contained in:
Jason Rumney 2009-04-19 15:09:25 +00:00
parent dc2933ebde
commit 705af33f7e
4 changed files with 56 additions and 20 deletions

View file

@ -1,3 +1,19 @@
2009-04-19 Jason Rumney <jasonr@gnu.org>
The following changes fix Bug#3005 for wide glyphs on each platform,
without reintroducing Bug#1258 for stretch glyphs.
* xterm.c (x_draw_bar_cursor): Limit cursor width differently for
BAR_CURSOR and HBAR_CURSOR. Calculate width of HBAR_CURSOR using
get_phys_cursor_geometry.
* w32term.c (x_draw_bar_cursor): Limit cursor width differently
for BAR_CURSOR and HBAR_CURSOR. Calculate width of HBAR_CURSOR
using get_phys_cursor_geometry.
* nsterm.m (ns_draw_window_cursor): HBAR_CURSOR width already
correctly calculated.
2009-04-19 Jan Djärv <jan.h.d@swipnet.se> 2009-04-19 Jan Djärv <jan.h.d@swipnet.se>
* gtkutil.c (xg_tool_bar_menu_proxy, update_frame_tool_bar): Use * gtkutil.c (xg_tool_bar_menu_proxy, update_frame_tool_bar): Use

View file

@ -2412,7 +2412,6 @@ External call (RIF): draw cursor
case HBAR_CURSOR: case HBAR_CURSOR:
s = r; s = r;
s.origin.y += lrint (0.75 * s.size.height); s.origin.y += lrint (0.75 * s.size.height);
s.size.width = min (FRAME_COLUMN_WIDTH (f), s.size.width);
s.size.height = lrint (s.size.height * 0.25); s.size.height = lrint (s.size.height * 0.25);
NSRectFill (s); NSRectFill (s);
break; break;

View file

@ -4970,8 +4970,6 @@ x_draw_bar_cursor (w, row, width, kind)
{ {
struct frame *f = XFRAME (w->frame); struct frame *f = XFRAME (w->frame);
struct glyph *cursor_glyph; struct glyph *cursor_glyph;
int x;
HDC hdc;
/* If cursor is out of bounds, don't draw garbage. This can happen /* If cursor is out of bounds, don't draw garbage. This can happen
in mini-buffer windows when switching between echo area glyphs in mini-buffer windows when switching between echo area glyphs
@ -4993,6 +4991,8 @@ x_draw_bar_cursor (w, row, width, kind)
{ {
COLORREF cursor_color = f->output_data.w32->cursor_pixel; COLORREF cursor_color = f->output_data.w32->cursor_pixel;
struct face *face = FACE_FROM_ID (f, cursor_glyph->face_id); struct face *face = FACE_FROM_ID (f, cursor_glyph->face_id);
int x;
HDC hdc;
/* If the glyph's background equals the color we normally draw /* If the glyph's background equals the color we normally draw
the bar cursor in, the bar cursor in its normal color is the bar cursor in, the bar cursor in its normal color is
@ -5004,29 +5004,36 @@ x_draw_bar_cursor (w, row, width, kind)
x = WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x); x = WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x);
if (width < 0)
width = FRAME_CURSOR_WIDTH (f);
width = min (cursor_glyph->pixel_width, width);
w->phys_cursor_width = width;
hdc = get_frame_dc (f); hdc = get_frame_dc (f);
w32_clip_to_row (w, row, TEXT_AREA, hdc); w32_clip_to_row (w, row, TEXT_AREA, hdc);
if (kind == BAR_CURSOR) if (kind == BAR_CURSOR)
{ {
if (width < 0)
width = FRAME_CURSOR_WIDTH (f);
width = min (cursor_glyph->pixel_width, width);
w->phys_cursor_width = width;
w32_fill_area (f, hdc, cursor_color, x, w32_fill_area (f, hdc, cursor_color, x,
WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y), WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y),
width, row->height); width, row->height);
} }
else else
{ {
int dummy_x, dummy_y, dummy_h;
if (width < 0)
width = row->height;
width = min (row->height, width);
get_phys_cursor_geometry (w, row, cursor_glyph, &dummy_x,
&dummy_y, &dummy_h);
w32_fill_area (f, hdc, cursor_color, x, w32_fill_area (f, hdc, cursor_color, x,
WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y + WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y +
row->height - width), row->height - width),
min (FRAME_COLUMN_WIDTH (f), cursor_glyph->pixel_width), w->phys_cursor_width, width);
width);
} }
w32_set_clip_rectangle (hdc, NULL); w32_set_clip_rectangle (hdc, NULL);

View file

@ -7426,7 +7426,7 @@ x_draw_bar_cursor (w, row, width, kind)
XGCValues xgcv; XGCValues xgcv;
/* If the glyph's background equals the color we normally draw /* If the glyph's background equals the color we normally draw
the bar cursor in, the bar cursor in its normal color is the bars cursor in, the bar cursor in its normal color is
invisible. Use the glyph's foreground color instead in this invisible. Use the glyph's foreground color instead in this
case, on the assumption that the glyph's colors are chosen so case, on the assumption that the glyph's colors are chosen so
that the glyph is legible. */ that the glyph is legible. */
@ -7444,25 +7444,39 @@ x_draw_bar_cursor (w, row, width, kind)
FRAME_X_DISPLAY_INFO (f)->scratch_cursor_gc = gc; FRAME_X_DISPLAY_INFO (f)->scratch_cursor_gc = gc;
} }
if (width < 0)
width = FRAME_CURSOR_WIDTH (f);
width = min (cursor_glyph->pixel_width, width);
w->phys_cursor_width = width;
x_clip_to_row (w, row, TEXT_AREA, gc); x_clip_to_row (w, row, TEXT_AREA, gc);
if (kind == BAR_CURSOR) if (kind == BAR_CURSOR)
{
if (width < 0)
width = FRAME_CURSOR_WIDTH (f);
width = min (cursor_glyph->pixel_width, width);
w->phys_cursor_width = width;
XFillRectangle (dpy, window, gc, XFillRectangle (dpy, window, gc,
WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x), WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x),
WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y), WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y),
width, row->height); width, row->height);
}
else else
{
int dummy_x, dummy_y, dummy_h;
if (width < 0)
width = row->height;
width = min (row->height, width);
get_phys_cursor_geometry (w, row, cursor_glyph, &dummy_x,
&dummy_y, &dummy_h);
XFillRectangle (dpy, window, gc, XFillRectangle (dpy, window, gc,
WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x), WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x),
WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y + WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y +
row->height - width), row->height - width),
min (FRAME_COLUMN_WIDTH (f), cursor_glyph->pixel_width), w->phys_cursor_width, width);
width); }
XSetClipMask (dpy, gc, None); XSetClipMask (dpy, gc, None);
} }