# HG changeset patch # User Jason Rumney # Date 1240153765 0 # Node ID 30ed0fca4cddb9cb13c9c6299151db8f81e21eea # Parent 15bf0d8a60992dd764d6934020a29ce5bb6cba65 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. diff -r 15bf0d8a6099 -r 30ed0fca4cdd src/ChangeLog --- a/src/ChangeLog Sun Apr 19 10:53:15 2009 +0000 +++ b/src/ChangeLog Sun Apr 19 15:09:25 2009 +0000 @@ -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 -r 15bf0d8a6099 -r 30ed0fca4cdd src/nsterm.m --- a/src/nsterm.m Sun Apr 19 10:53:15 2009 +0000 +++ b/src/nsterm.m Sun Apr 19 15:09:25 2009 +0000 @@ -2412,7 +2412,6 @@ 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 -r 15bf0d8a6099 -r 30ed0fca4cdd src/w32term.c --- a/src/w32term.c Sun Apr 19 10:53:15 2009 +0000 +++ b/src/w32term.c Sun Apr 19 15:09:25 2009 +0000 @@ -4970,8 +4970,6 @@ { 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 @@ { 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 = 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 -r 15bf0d8a6099 -r 30ed0fca4cdd src/xterm.c --- a/src/xterm.c Sun Apr 19 10:53:15 2009 +0000 +++ b/src/xterm.c Sun Apr 19 15:09:25 2009 +0000 @@ -7426,7 +7426,7 @@ 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 @@ 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); }