From 705af33f7ed44c4cc71165d45836f0b5a769f27d Mon Sep 17 00:00:00 2001 From: Jason Rumney Date: Sun, 19 Apr 2009 15:09:25 +0000 Subject: [PATCH] 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. --- src/ChangeLog | 16 ++++++++++++++++ src/nsterm.m | 1 - src/w32term.c | 29 ++++++++++++++++++----------- src/xterm.c | 30 ++++++++++++++++++++++-------- 4 files changed, 56 insertions(+), 20 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 5c66a973443..cdde8a597f2 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,19 @@ +2009-04-19 Jason Rumney + + 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 * gtkutil.c (xg_tool_bar_menu_proxy, update_frame_tool_bar): Use diff --git a/src/nsterm.m b/src/nsterm.m index 07acc8d8013..5085679e04a 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -2412,7 +2412,6 @@ ns_draw_window_cursor (struct window *w, struct glyph_row *glyph_row, case HBAR_CURSOR: s = r; 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); NSRectFill (s); break; diff --git a/src/w32term.c b/src/w32term.c index bc76ac58d1a..f38895b6312 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -4970,8 +4970,6 @@ x_draw_bar_cursor (w, row, width, kind) { struct frame *f = XFRAME (w->frame); struct glyph *cursor_glyph; - int x; - HDC hdc; /* If cursor is out of bounds, don't draw garbage. This can happen 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; 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 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); - 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); w32_clip_to_row (w, row, TEXT_AREA, hdc); 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, WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y), width, row->height); } 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, WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y + row->height - width), - min (FRAME_COLUMN_WIDTH (f), cursor_glyph->pixel_width), - width); + w->phys_cursor_width, width); } w32_set_clip_rectangle (hdc, NULL); diff --git a/src/xterm.c b/src/xterm.c index 76beb62e4e3..e5f8a0c17c9 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -7426,7 +7426,7 @@ x_draw_bar_cursor (w, row, width, kind) XGCValues xgcv; /* 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 case, on the assumption that the glyph's colors are chosen so 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; } - 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); 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, WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x), WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y), width, row->height); + } 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, WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x), WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y + row->height - width), - min (FRAME_COLUMN_WIDTH (f), cursor_glyph->pixel_width), - width); + w->phys_cursor_width, width); + } XSetClipMask (dpy, gc, None); } -- 2.39.5