From owner-svn-src-head@FreeBSD.ORG Wed Jan 21 19:43:11 2009 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 3026410656C1; Wed, 21 Jan 2009 19:43:11 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 1CD6C8FC1A; Wed, 21 Jan 2009 19:43:11 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n0LJhBXv088176; Wed, 21 Jan 2009 19:43:11 GMT (envelope-from ed@svn.freebsd.org) Received: (from ed@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n0LJhADQ088174; Wed, 21 Jan 2009 19:43:10 GMT (envelope-from ed@svn.freebsd.org) Message-Id: <200901211943.n0LJhADQ088174@svn.freebsd.org> From: Ed Schouten Date: Wed, 21 Jan 2009 19:43:10 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r187562 - head/sys/dev/syscons/teken X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 21 Jan 2009 19:43:12 -0000 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 #include #include +#include #include #include #include @@ -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,