diff options
| author | blymn <blymn@NetBSD.org> | 2007-05-28 15:01:53 +0000 |
|---|---|---|
| committer | blymn <blymn@NetBSD.org> | 2007-05-28 15:01:53 +0000 |
| commit | e124de36d8a3bb2fd90b77ec25eb7736f29ee44d (patch) | |
| tree | 0dac708fd51eee66b5194f8e69d6fe165e953031 /lib/libcurses/EXAMPLES | |
| parent | 599840187d9b53fe3353daa7f2892b387a1c2f29 (diff) | |
Merge in wide curses code done as a Summer of Code project by
Ruibiao Qiu.
Diffstat (limited to 'lib/libcurses/EXAMPLES')
| -rw-r--r-- | lib/libcurses/EXAMPLES/Makefile | 17 | ||||
| -rw-r--r-- | lib/libcurses/EXAMPLES/ex1.c | 296 | ||||
| -rw-r--r-- | lib/libcurses/EXAMPLES/view.c | 17 |
3 files changed, 289 insertions, 41 deletions
diff --git a/lib/libcurses/EXAMPLES/Makefile b/lib/libcurses/EXAMPLES/Makefile index 7eb7912fc2b..b3759fdc514 100644 --- a/lib/libcurses/EXAMPLES/Makefile +++ b/lib/libcurses/EXAMPLES/Makefile @@ -1,5 +1,15 @@ -#$Id: Makefile,v 1.1 2007/01/21 11:38:59 blymn Exp $ +#$Id: Makefile,v 1.2 2007/05/28 15:01:58 blymn Exp $ #$Log: Makefile,v $ +#Revision 1.2 2007/05/28 15:01:58 blymn +#Merge in wide curses code done as a Summer of Code project by +#Ruibiao Qiu. +# +#Revision 1.1.2.2 2007/01/31 10:08:47 blymn +#Fix up build errors. +# +#Revision 1.1.2.1 2007/01/21 12:05:54 blymn +#Merge wide curses. +# #Revision 1.1 2007/01/21 11:38:59 blymn #Wide curses merge # @@ -26,10 +36,10 @@ CFLAGS+= -g all: wcview nwview ccview tcview ncview ex1 wcview: view.c - gcc -DHAVE_WCHAR -o wcview view.c -I.. $(CFLAGS) -lwcurses -Wl,-rpath,.. -L.. + gcc -DHAVE_WCHAR -o wcview view.c -I.. $(CFLAGS) -lcurses -Wl,-rpath,.. -L.. nwview: view.c - gcc -DHAVE_WCHAR -o nwview view.c -DNCURSES -I/usr/pkg/include $(CFLAGS) -lncursesw -Wl,-rpath,/usr/pkg/lib -L/usr/pkg/lib + gcc -DHAVE_WCHAR -o nwview view.c -DNCURSES -I/usr/pkg/include $(CFLAGS) -lcurses -Wl,-rpath,/usr/pkg/lib -L/usr/pkg/lib ccview: view.c gcc -o ccview view.c -I.. $(CFLAGS) -lcurses -Wl,-rpath,.. -L.. @@ -41,3 +51,4 @@ ncview: view.c gcc -o ncview view.c -I/usr/pkg/include -DNCURSES -L/usr/pkg/lib -Wl,-rpath,/usr/pkg/lib $(CFLAGS) -lncurses ex1: ex1.c + gcc -DHAVE_WCHAR -o ex1 ex1.c -I.. $(CFLAGS) -lcurses -Wl,-rpath,.. -L.. diff --git a/lib/libcurses/EXAMPLES/ex1.c b/lib/libcurses/EXAMPLES/ex1.c index e8d743503a3..e71ed33d023 100644 --- a/lib/libcurses/EXAMPLES/ex1.c +++ b/lib/libcurses/EXAMPLES/ex1.c @@ -1,4 +1,4 @@ -/* $NetBSD: ex1.c,v 1.4 2003/08/07 16:44:26 agc Exp $ */ +/* $NetBSD: ex1.c,v 1.5 2007/05/28 15:01:58 blymn Exp $ */ /* * Copyright (c) 1992, 1993 @@ -42,28 +42,92 @@ static char sccsid[] = "@(#)ex1.c 8.1 (Berkeley) 6/4/93"; #include <sys/types.h> #include <curses.h> #include <stdio.h> +#include <stdlib.h> +#include <string.h> #include <signal.h> +#include <locale.h> +#include <assert.h> +#define YSIZE 4 +#define XSIZE 30 -#define YSIZE 10 -#define XSIZE 20 - -int quit(); +void quit( int ); main() { - int i, j, c; + int i, j, c, n = 0, ac = 0; size_t len; char id[100]; FILE *fp; char *s; + cchar_t cc, ncc, cstr[ 128 ], icc, icstr[ 128 ], bcc; + int wc_on = 0, wgc_on = 0; + char mbs[] = "大"; + char mbstr[] = "大学之道,在明明德,在亲民,在止于至善。 (Liji)"; + wchar_t wstr[ 128 ], owstr[ 4 ], gwstr[ 128 ], iwstr[ 128 ]; + int wslen = 0; + wint_t wc; + char nostr[ 128 ]; + attr_t al[ 15 ] = { WA_BLINK, + WA_BOLD, + WA_DIM, + WA_LOW, + WA_TOP, + WA_INVIS, + WA_HORIZONTAL, + WA_VERTICAL, + WA_LEFT, + WA_RIGHT, + WA_PROTECT, + WA_REVERSE, + WA_STANDOUT, + WA_UNDERLINE }; + + fprintf( stderr, "Current locale: %s\n", setlocale(LC_ALL, "")); + if (( wslen = mbstowcs( &cc.vals[ 0 ], mbs, strlen( mbs ))) < 0 ) { + fprintf( stderr, "mbstowcs() failed\n" ); + return -1; + } + fprintf( stderr, "WC string length: %d\n", wslen ); + fprintf( stderr, "WC width: %d\n", wcwidth( cc.vals[ 0 ])); + cc.elements = ncc.elements = 8; + cc.attributes = ncc.attributes = 0; + ncc.vals[ 0 ] = 0xda00; + cc.vals[ 1 ] = ncc.vals[ 1 ] = 0xda01; + cc.vals[ 2 ] = ncc.vals[ 2 ] = 0xda02; + cc.vals[ 3 ] = ncc.vals[ 3 ] = 0xda03; + cc.vals[ 4 ] = ncc.vals[ 4 ] = 0xda04; + cc.vals[ 5 ] = ncc.vals[ 5 ] = 0xda05; + cc.vals[ 6 ] = ncc.vals[ 6 ] = 0xda06; + cc.vals[ 7 ] = ncc.vals[ 7 ] = 0xda07; + + if (( wslen = mbstowcs( wstr, mbstr, strlen( mbstr ))) < 0 ) { + fprintf( stderr, "mbstowcs() failed\n" ); + return -1; + } + + for ( i = 0; i < wslen; i++ ) { + cstr[ i ].vals[ 0 ] = wstr[ i ]; + } + cstr[ wslen ].vals[ 0 ] = 0; + + bcc.elements = 8; + bcc.attributes = 0; + bcc.vals[ 0 ] = L'_'; + bcc.vals[ 1 ] = 0xda01; + bcc.vals[ 2 ] = 0xda02; + bcc.vals[ 3 ] = 0xda03; + bcc.vals[ 4 ] = 0xda04; + bcc.vals[ 5 ] = 0xda05; + bcc.vals[ 6 ] = 0xda06; + bcc.vals[ 7 ] = 0xda07; initscr(); /* Always call initscr() first */ signal(SIGINT, quit); /* Make sure wou have a 'cleanup' fn */ crmode(); /* We want cbreak mode */ noecho(); /* We want to have control of chars */ delwin(stdscr); /* Create our own stdscr */ - stdscr = newwin(YSIZE, XSIZE, 10, 35); + stdscr = newwin(YSIZE, XSIZE, 1, 1); flushok(stdscr, TRUE); /* Enable flushing of stdout */ scrollok(stdscr, TRUE); /* Enable scrolling */ erase(); /* Initially, clear the screen */ @@ -71,30 +135,201 @@ main() standout(); move(0,0); while (1) { - c = getchar(); - switch(c) { - case 'q': /* Quit on 'q' */ - quit(); - break; - case 's': /* Go into standout mode on 's' */ - standout(); - break; - case 'e': /* Exit standout mode on 'e' */ - standend(); - break; - case 'r': /* Force a refresh on 'r' */ - wrefresh(curscr); - break; - default: /* By default output the character */ - addch(c); - refresh(); - } + if ( !wgc_on ) { + c = getchar(); + switch(c) { + case 'q': /* Quit on 'q' */ + quit( 0 ); + break; + case 'p': + keypad( stdscr, TRUE ); + break; + case 'P': + keypad( stdscr, FALSE ); + break; + case 'g': + wgc_on = 1; + echo(); + break; + case 'b': + get_wstr( gwstr ); + move( 1, 0 ); + addstr( "Input:" ); + addwstr( gwstr ); + refresh(); + break; + case 'h': + move( 0, 0 ); + in_wch( &icc ); + move( 1, 0 ); + add_wch( &icc ); + refresh(); + break; + case 'y': + move( 0, 0 ); + in_wchstr( icstr ); + move( 1, 0 ); + add_wchstr( icstr ); + refresh(); + break; + case 'u': + move( 0, 0 ); + inwstr( iwstr ); + move( 1, 0 ); + addwstr( iwstr ); + refresh(); + break; + case 'i': + move( 0, 0 ); + hline_set( &cc, 20 ); + move( 0, 0 ); + vline_set( &cc, 20 ); + refresh(); + break; + case 'o': + clrtobot(); + refresh(); + break; + case 's': /* Go into standout mode on 's' */ + standout(); + break; + case 'e': /* Exit standout mode on 'e' */ + standend(); + break; + case 'r': /* Force a refresh on 'r' */ + wrefresh(curscr); + break; + case 'w': /* Turn on/off add_wch() tests */ + wc_on = 1 - wc_on; + break; + case 'd': + add_wchstr(( const cchar_t *)&cstr ); + refresh(); + break; + case 'c': + addwstr(( const wchar_t *)&wstr ); + refresh(); + break; + case 'z': + move( 0, 1 ); + if ( wc_on ) + add_wch( &cc ); + else + addch( c ); + refresh(); + break; + case 'x': + move( 0, 3 ); + if ( wc_on ) + add_wch( &cc ); + else + addch( c ); + refresh(); + break; + case 'n': + add_wch( &ncc ); + refresh(); + break; + case 'm': + //border( 0, 0, 0, 0, 0, 0, 0, 0 ); + border_set( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ); + refresh(); + break; + case 'j': + box_set( stdscr, &cc, &cc ); + refresh(); + break; + case 'k': + erase(); + refresh(); + break; + case '1': + move( 0, 0 ); + clrtoeol(); + refresh(); + break; + case '2': + move( 0, 0 ); + sprintf( nostr, "Orig:%x", al[ ac ]); + addstr( nostr ); + ac = ( ac + 1 ) % 16; + bcc.attributes = al[ ac ]; + bkgrnd( &bcc ); + move( 1, 0 ); + sprintf( nostr, "New:%x", al[ ac ]); + //addstr( nostr ); + insstr( nostr ); + refresh(); + break; + case 'v': + if ( wc_on ) + ins_wch( &cc ); + else + insch( c ); + refresh(); + break; + case 'f': + ins_wstr(( const wchar_t *)&wstr ); + refresh(); + break; + case 't': + for ( i = 0; i < 4; i++ ) { + owstr[ i ] = wstr[ i + 5 ]; + wstr[ i + 5 ] = i + 0xda05; + } + ins_wstr(( const wchar_t *)&wstr ); + refresh(); + for ( i = 0; i < 4; i++ ) + wstr[ i + 5 ] = owstr[ i ]; + break; + default: /* By default output the character */ + if ( wc_on ) + add_wch( &cc ); + else { + if ( c < 0x7F ) + addch( c ); + else { + addstr( keyname( c )); + } + } + refresh(); + } + } else { + get_wch( &wc ); + switch ( wc ) { + case L'w': + wgc_on = 0; + noecho(); + break; + case L'q': + quit( 0 ); + break; + case L't': + notimeout( stdscr, TRUE ); + break; + case L'T': + notimeout( stdscr, FALSE ); + break; + case L'd': + nodelay( stdscr, TRUE ); + break; + case L'D': + nodelay( stdscr, FALSE ); + break; + case L'p': + keypad( stdscr, TRUE ); + break; + case L'P': + keypad( stdscr, FALSE ); + break; + default: + break; + } + } } } - -int -quit() +void quit( int sig ) { erase(); /* Terminate by erasing the screen */ refresh(); @@ -102,9 +337,6 @@ quit() delwin(curscr); /* Return storage */ delwin(stdscr); putchar('\n'); - exit(0); + exit( sig ); } - - - diff --git a/lib/libcurses/EXAMPLES/view.c b/lib/libcurses/EXAMPLES/view.c index b0a56b75925..74df2a83d21 100644 --- a/lib/libcurses/EXAMPLES/view.c +++ b/lib/libcurses/EXAMPLES/view.c @@ -23,7 +23,7 @@ * scroll operation worked, and the refresh() code only had to do a * partial repaint. * - * $Id: view.c,v 1.1 2007/01/21 11:38:59 blymn Exp $ + * $Id: view.c,v 1.2 2007/05/28 15:01:58 blymn Exp $ */ #include <stdlib.h> @@ -72,6 +72,7 @@ static bool try_color = FALSE; static char *fname; static CURSES_CH_T **my_lines; static CURSES_CH_T **lptr; +static unsigned num_lines; static void usage(void) { @@ -232,6 +233,7 @@ int main(int argc, char *argv[]) } /* slurp the file */ + num_lines = 0; for (lptr = &my_lines[0]; (lptr - my_lines) < MAXLINES; lptr++) { char temp[BUFSIZ], *s, *d; int col; @@ -263,6 +265,7 @@ int main(int argc, char *argv[]) #endif } *lptr = ch_dup(temp); + num_lines++; } (void) fclose(fp); length = lptr - my_lines; @@ -506,14 +509,16 @@ static void show_all(const char *tag) printw("%3ld:", (long) (lptr + i - my_lines)); clrtoeol(); if ((s = lptr[i - 1]) != 0) { - int len = ch_len(s); - if (len > shift) { + if (i < num_lines) { + int len = ch_len(s); + if (len > shift) { #ifdef HAVE_WCHAR - add_wchstr(s + shift); + add_wchstr(s + shift); #else - addchstr(s + shift); + addchstr(s + shift); #endif - } + } + } } } setscrreg(1, LINES - 1); |
