[PATCH 2/2] Some CJK glyphs are wide, which occupy two columns. If the glyph is wide, then use two columns instead of one.

Peng Wu peng.e.wu at gmail.com
Wed Jul 10 00:38:02 PDT 2013


Hi Kristian,

  Actually the terminal patch only uses functions from glib.
  Is it okay to use glib.h or should I try to duplicate the code in the
terminal?

  I will check the text selection for the dual-width characters soon.

Thanks,
  Peng Wu


Refer URL:
https://git.gnome.org/browse/glib/tree/glib/gutf8.c#n295
https://git.gnome.org/browse/glib/tree/glib/guniprop.c#n457


On Mon, 2013-07-08 at 18:07 -0400, Kristian Høgsberg 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
> > wayland-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/wayland-devel




More information about the wayland-devel mailing list