A similar function is wcwidth(). There is an implementation here: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
I don't know how it compares to the complexity or feature completeness of Pango's implementation (which I think is a wrapper around HarfBuzz) On Mon, Jul 8, 2013 at 5:07 PM, Kristian Høgsberg <[email protected]> wrote: > On Thu, Jun 06, 2013 at 03:32:42PM +0800, Peng Wu wrote: >> --- >> clients/Makefile.am | 2 +- >> clients/terminal.c | 18 ++++++++++++++++-- >> 2 files changed, 17 insertions(+), 3 deletions(-) > > This makes sense, but I'm not happy about the pango dependency. One > of the few reasons (if not the only reason) for weston-terminal to > exist is that it only depends on a few wayland libraries. In > particular, it doesn't pull in any of the major toolkit silos. > > I suspect that we would have to copy some unicode table into the > weston terminal to replace g_unichar_iswide(), and if that's a crazy > suggestion, let's just not do it. But if it's feasible, let's do > that, and maybe also see if you can make selection work with wide characters? > > Kristian > >> diff --git a/clients/Makefile.am b/clients/Makefile.am >> index cad0d40..d37d66a 100644 >> --- a/clients/Makefile.am >> +++ b/clients/Makefile.am >> @@ -104,7 +104,7 @@ weston_screenshooter_SOURCES = \ >> weston_screenshooter_LDADD = libtoytoolkit.la >> >> weston_terminal_SOURCES = terminal.c >> -weston_terminal_LDADD = libtoytoolkit.la -lutil >> +weston_terminal_LDADD = libtoytoolkit.la -lutil $(PANGO_LIBS) >> >> image_SOURCES = image.c >> image_LDADD = libtoytoolkit.la >> diff --git a/clients/terminal.c b/clients/terminal.c >> index 0d4f726..4495530 100644 >> --- a/clients/terminal.c >> +++ b/clients/terminal.c >> @@ -33,6 +33,7 @@ >> #include <ctype.h> >> #include <cairo.h> >> #include <sys/epoll.h> >> +#include <glib.h> >> >> #include <wayland-client.h> >> >> @@ -942,6 +943,9 @@ redraw_handler(struct widget *widget, void *data) >> struct glyph_run run; >> cairo_font_extents_t extents; >> double average_width; >> + gunichar unichar; >> + gboolean iswide; >> + int extracol; >> >> surface = window_get_surface(terminal->window); >> widget_get_allocation(terminal->widget, &allocation); >> @@ -991,22 +995,32 @@ redraw_handler(struct widget *widget, void *data) >> glyph_run_init(&run, terminal, cr); >> for (row = 0; row < terminal->height; row++) { >> p_row = terminal_get_row(terminal, row); >> + extracol = 0; >> for (col = 0; col < terminal->width; col++) { >> /* get the attributes for this character cell */ >> terminal_decode_attr(terminal, row, col, &attr); >> >> glyph_run_flush(&run, attr); >> >> - text_x = col * average_width; >> + /* check dual width unicode character */ >> + unichar = g_utf8_get_char((const char*) >> p_row[col].byte); >> + iswide = g_unichar_iswide(unichar); >> + >> + text_x = (col + extracol) * average_width; >> text_y = extents.ascent + row * extents.height; >> if (attr.attr.a & ATTRMASK_UNDERLINE) { >> terminal_set_color(terminal, cr, attr.attr.fg); >> cairo_move_to(cr, text_x, (double)text_y + >> 1.5); >> - cairo_line_to(cr, text_x + average_width, >> (double) text_y + 1.5); >> + if (iswide) >> + cairo_line_to(cr, text_x + >> average_width * 2, (double) text_y + 1.5); >> + else >> + cairo_line_to(cr, text_x + >> average_width, (double) text_y + 1.5); >> cairo_stroke(cr); >> } >> >> glyph_run_add(&run, text_x, text_y, &p_row[col]); >> + if (iswide) >> + extracol++; >> } >> } >> >> -- >> 1.8.1.4 >> >> _______________________________________________ >> wayland-devel mailing list >> [email protected] >> http://lists.freedesktop.org/mailman/listinfo/wayland-devel > _______________________________________________ > wayland-devel mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/wayland-devel _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
