Date: Wed, 21 Jan 2009 19:43:10 +0000 (UTC) From: Ed Schouten <ed@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r187562 - head/sys/dev/syscons/teken Message-ID: <200901211943.n0LJhADQ088174@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ed Date: Wed Jan 21 19:43:10 2009 New Revision: 187562 URL: http://svn.freebsd.org/changeset/base/187562 Log: Add Unicode rendering to the teken demo application. Some time ago I tried adding Unicode rendering to the teken demo application, but I didn't get it working. It seems I forgot to call setlocale(). Polish this code and make sure it doesn't get lost. Also a small fix for my previous commit: all Unicode characters in teken_boxdrawing are below 0x10000, so store them as 16-bit values. Modified: head/sys/dev/syscons/teken/teken_demo.c head/sys/dev/syscons/teken/teken_scs.h Modified: head/sys/dev/syscons/teken/teken_demo.c ============================================================================== --- head/sys/dev/syscons/teken/teken_demo.c Wed Jan 21 18:54:35 2009 (r187561) +++ head/sys/dev/syscons/teken/teken_demo.c Wed Jan 21 19:43:10 2009 (r187562) @@ -31,6 +31,7 @@ #include <assert.h> #include <errno.h> #include <inttypes.h> +#include <locale.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -83,7 +84,8 @@ static void printchar(const teken_pos_t *p) { int y, x, attr = 0; - struct pixel *px, pt; + struct pixel *px; + char str[5] = { 0 }; assert(p->tp_row < NROWS); assert(p->tp_col < NCOLS); @@ -92,14 +94,26 @@ printchar(const teken_pos_t *p) px = &buffer[p->tp_col][p->tp_row]; - if (px->c >= 0x80) { - /* Mark UTF-8 chars (we don't support it). */ - px = &pt; - px->c = '?'; - px->a.ta_format = TF_BOLD; - px->a.ta_fgcolor = TC_BROWN; - px->a.ta_bgcolor = TC_RED; + /* Convert Unicode to UTF-8. */ +#ifdef TEKEN_UTF8 + if (px->c < 0x80) { + str[0] = px->c; + } else if (px->c < 0x800) { + str[0] = 0xc0 | (px->c >> 6); + str[1] = 0x80 | (px->c & 0x3f); + } else if (px->c < 0x10000) { + str[0] = 0xe0 | (px->c >> 12); + str[1] = 0x80 | ((px->c >> 6) & 0x3f); + str[2] = 0x80 | (px->c & 0x3f); + } else { + str[0] = 0xf0 | (px->c >> 18); + str[1] = 0x80 | ((px->c >> 12) & 0x3f); + str[2] = 0x80 | ((px->c >> 6) & 0x3f); + str[3] = 0x80 | (px->c & 0x3f); } +#else /* !TEKEN_UTF8 */ + str[0] = px->c; +#endif /* TEKEN_UTF8 */ if (px->a.ta_format & TF_BOLD) attr |= A_BOLD; @@ -109,7 +123,7 @@ printchar(const teken_pos_t *p) attr |= A_BLINK; bkgdset(attr | COLOR_PAIR(px->a.ta_fgcolor + 8 * px->a.ta_bgcolor)); - mvaddch(p->tp_row, p->tp_col, px->c); + mvaddstr(p->tp_row, p->tp_col, str); move(y, x); } @@ -272,9 +286,16 @@ main(int argc __unused, char *argv[] __u fd_set rfds; char b[256]; ssize_t bl; - const int ccolors[8] = { COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW, COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE }; + const int ccolors[8] = { + COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW, + COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE + }; int i, j; +#ifdef TEKEN_UTF8 + setlocale(LC_CTYPE, "UTF-8"); +#endif /* TEKEN_UTF8 */ + tp.tp_row = ws.ws_row = NROWS; tp.tp_col = ws.ws_col = NCOLS; Modified: head/sys/dev/syscons/teken/teken_scs.h ============================================================================== --- head/sys/dev/syscons/teken/teken_scs.h Wed Jan 21 18:54:35 2009 (r187561) +++ head/sys/dev/syscons/teken/teken_scs.h Wed Jan 21 19:43:10 2009 (r187562) @@ -62,7 +62,7 @@ teken_scs_process(teken_t *t, teken_char } /* Unicode points for VT100 box drawing. */ -static const teken_char_t teken_boxdrawing[31] = { +static const uint16_t teken_boxdrawing[31] = { 0x25c6, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0, 0x00b1, 0x2424, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, 0x23ba, 0x23bb, 0x2500, 0x23bc, 0x23bd, 0x251c, 0x2524, 0x2534, 0x252c,
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200901211943.n0LJhADQ088174>