xref: /netbsd-src/lib/libcurses/EXAMPLES/ex1.c (revision e124de36d8a3bb2fd90b77ec25eb7736f29ee44d)
1*e124de36Sblymn /*	$NetBSD: ex1.c,v 1.5 2007/05/28 15:01:58 blymn Exp $	*/
2b51ed80fSperry 
30c2185c6Scgd /*
40c2185c6Scgd  * Copyright (c) 1992, 1993
50c2185c6Scgd  *	The Regents of the University of California.  All rights reserved.
60c2185c6Scgd  *
70c2185c6Scgd  *
80c2185c6Scgd  * Redistribution and use in source and binary forms, with or without
90c2185c6Scgd  * modification, are permitted provided that the following conditions
100c2185c6Scgd  * are met:
110c2185c6Scgd  * 1. Redistributions of source code must retain the above copyright
120c2185c6Scgd  *    notice, this list of conditions and the following disclaimer.
130c2185c6Scgd  * 2. Redistributions in binary form must reproduce the above copyright
140c2185c6Scgd  *    notice, this list of conditions and the following disclaimer in the
150c2185c6Scgd  *    documentation and/or other materials provided with the distribution.
16eb7c1594Sagc  * 3. Neither the name of the University nor the names of its contributors
170c2185c6Scgd  *    may be used to endorse or promote products derived from this software
180c2185c6Scgd  *    without specific prior written permission.
190c2185c6Scgd  *
200c2185c6Scgd  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
210c2185c6Scgd  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
220c2185c6Scgd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
230c2185c6Scgd  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
240c2185c6Scgd  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
250c2185c6Scgd  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
260c2185c6Scgd  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
270c2185c6Scgd  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
280c2185c6Scgd  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
290c2185c6Scgd  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
300c2185c6Scgd  * SUCH DAMAGE.
310c2185c6Scgd  */
320c2185c6Scgd 
330c2185c6Scgd #ifndef lint
340c2185c6Scgd static char copyright[] =
350c2185c6Scgd "@(#) Copyright (c) 1992, 1993\n\
360c2185c6Scgd 	The Regents of the University of California.  All rights reserved.\n";
370c2185c6Scgd #endif /* not lint */
380c2185c6Scgd 
390c2185c6Scgd #ifndef lint
400c2185c6Scgd static char sccsid[] = "@(#)ex1.c	8.1 (Berkeley) 6/4/93";
410c2185c6Scgd #endif /* not lint */
420c2185c6Scgd #include <sys/types.h>
430c2185c6Scgd #include <curses.h>
440c2185c6Scgd #include <stdio.h>
45*e124de36Sblymn #include <stdlib.h>
46*e124de36Sblymn #include <string.h>
470c2185c6Scgd #include <signal.h>
48*e124de36Sblymn #include <locale.h>
49*e124de36Sblymn #include <assert.h>
500c2185c6Scgd 
51*e124de36Sblymn #define YSIZE 4
52*e124de36Sblymn #define XSIZE 30
530c2185c6Scgd 
54*e124de36Sblymn void quit( int );
550c2185c6Scgd 
main()560c2185c6Scgd main()
570c2185c6Scgd {
58*e124de36Sblymn 	int i, j, c, n = 0, ac = 0;
590c2185c6Scgd 	size_t len;
600c2185c6Scgd 	char id[100];
610c2185c6Scgd 	FILE *fp;
620c2185c6Scgd 	char *s;
63*e124de36Sblymn     cchar_t cc, ncc, cstr[ 128 ], icc, icstr[ 128 ], bcc;
64*e124de36Sblymn     int wc_on = 0, wgc_on = 0;
65*e124de36Sblymn     char mbs[] = "��";
66*e124de36Sblymn     char mbstr[] = "��ѧ֮�����������£���������ֹ�����ơ� (Liji)";
67*e124de36Sblymn     wchar_t wstr[ 128 ], owstr[ 4 ], gwstr[ 128 ], iwstr[ 128 ];
68*e124de36Sblymn     int wslen = 0;
69*e124de36Sblymn     wint_t wc;
70*e124de36Sblymn     char nostr[ 128 ];
71*e124de36Sblymn     attr_t al[ 15 ] = { WA_BLINK,
72*e124de36Sblymn                         WA_BOLD,
73*e124de36Sblymn                         WA_DIM,
74*e124de36Sblymn                         WA_LOW,
75*e124de36Sblymn                         WA_TOP,
76*e124de36Sblymn                         WA_INVIS,
77*e124de36Sblymn                         WA_HORIZONTAL,
78*e124de36Sblymn                         WA_VERTICAL,
79*e124de36Sblymn                         WA_LEFT,
80*e124de36Sblymn                         WA_RIGHT,
81*e124de36Sblymn                         WA_PROTECT,
82*e124de36Sblymn                         WA_REVERSE,
83*e124de36Sblymn                         WA_STANDOUT,
84*e124de36Sblymn                         WA_UNDERLINE };
85*e124de36Sblymn 
86*e124de36Sblymn     fprintf( stderr, "Current locale: %s\n", setlocale(LC_ALL, ""));
87*e124de36Sblymn     if (( wslen =  mbstowcs( &cc.vals[ 0 ], mbs, strlen( mbs ))) < 0 ) {
88*e124de36Sblymn         fprintf( stderr, "mbstowcs() failed\n" );
89*e124de36Sblymn         return -1;
90*e124de36Sblymn     }
91*e124de36Sblymn     fprintf( stderr, "WC string length: %d\n", wslen );
92*e124de36Sblymn     fprintf( stderr, "WC width: %d\n", wcwidth( cc.vals[ 0 ]));
93*e124de36Sblymn     cc.elements = ncc.elements = 8;
94*e124de36Sblymn     cc.attributes = ncc.attributes = 0;
95*e124de36Sblymn     ncc.vals[ 0 ] = 0xda00;
96*e124de36Sblymn     cc.vals[ 1 ] = ncc.vals[ 1 ] = 0xda01;
97*e124de36Sblymn     cc.vals[ 2 ] = ncc.vals[ 2 ] = 0xda02;
98*e124de36Sblymn     cc.vals[ 3 ] = ncc.vals[ 3 ] = 0xda03;
99*e124de36Sblymn     cc.vals[ 4 ] = ncc.vals[ 4 ] = 0xda04;
100*e124de36Sblymn     cc.vals[ 5 ] = ncc.vals[ 5 ] = 0xda05;
101*e124de36Sblymn     cc.vals[ 6 ] = ncc.vals[ 6 ] = 0xda06;
102*e124de36Sblymn     cc.vals[ 7 ] = ncc.vals[ 7 ] = 0xda07;
103*e124de36Sblymn 
104*e124de36Sblymn     if (( wslen =  mbstowcs( wstr, mbstr, strlen( mbstr ))) < 0 ) {
105*e124de36Sblymn         fprintf( stderr, "mbstowcs() failed\n" );
106*e124de36Sblymn         return -1;
107*e124de36Sblymn     }
108*e124de36Sblymn 
109*e124de36Sblymn     for ( i = 0; i < wslen; i++ ) {
110*e124de36Sblymn         cstr[ i ].vals[ 0 ] = wstr[ i ];
111*e124de36Sblymn     }
112*e124de36Sblymn     cstr[ wslen ].vals[ 0 ] = 0;
113*e124de36Sblymn 
114*e124de36Sblymn     bcc.elements = 8;
115*e124de36Sblymn     bcc.attributes = 0;
116*e124de36Sblymn     bcc.vals[ 0 ] = L'_';
117*e124de36Sblymn     bcc.vals[ 1 ] = 0xda01;
118*e124de36Sblymn     bcc.vals[ 2 ] = 0xda02;
119*e124de36Sblymn     bcc.vals[ 3 ] = 0xda03;
120*e124de36Sblymn     bcc.vals[ 4 ] = 0xda04;
121*e124de36Sblymn     bcc.vals[ 5 ] = 0xda05;
122*e124de36Sblymn     bcc.vals[ 6 ] = 0xda06;
123*e124de36Sblymn     bcc.vals[ 7 ] = 0xda07;
1240c2185c6Scgd 
1250c2185c6Scgd 	initscr();			/* Always call initscr() first */
1260c2185c6Scgd 	signal(SIGINT, quit);		/* Make sure wou have a 'cleanup' fn */
1270c2185c6Scgd 	crmode();			/* We want cbreak mode */
1280c2185c6Scgd 	noecho();			/* We want to have control of chars */
1290c2185c6Scgd 	delwin(stdscr);			/* Create our own stdscr */
130*e124de36Sblymn 	stdscr = newwin(YSIZE, XSIZE, 1, 1);
1310c2185c6Scgd 	flushok(stdscr, TRUE);		/* Enable flushing of stdout */
1320c2185c6Scgd 	scrollok(stdscr, TRUE);		/* Enable scrolling */
1330c2185c6Scgd 	erase();			/* Initially, clear the screen */
1340c2185c6Scgd 
1350c2185c6Scgd 	standout();
1360c2185c6Scgd 	move(0,0);
1370c2185c6Scgd 	while (1) {
138*e124de36Sblymn         if ( !wgc_on ) {
1390c2185c6Scgd 		    c = getchar();
1400c2185c6Scgd 		    switch(c) {
1410c2185c6Scgd 		        case 'q':		/* Quit on 'q' */
142*e124de36Sblymn 			        quit( 0 );
143*e124de36Sblymn 			        break;
144*e124de36Sblymn                 case 'p':
145*e124de36Sblymn                     keypad( stdscr, TRUE );
146*e124de36Sblymn                     break;
147*e124de36Sblymn                 case 'P':
148*e124de36Sblymn                     keypad( stdscr, FALSE );
149*e124de36Sblymn                     break;
150*e124de36Sblymn                 case 'g':
151*e124de36Sblymn                     wgc_on = 1;
152*e124de36Sblymn                     echo();
153*e124de36Sblymn                     break;
154*e124de36Sblymn                 case 'b':
155*e124de36Sblymn                     get_wstr( gwstr );
156*e124de36Sblymn                     move( 1, 0 );
157*e124de36Sblymn                     addstr( "Input:" );
158*e124de36Sblymn                     addwstr( gwstr );
159*e124de36Sblymn                     refresh();
160*e124de36Sblymn                     break;
161*e124de36Sblymn                 case 'h':
162*e124de36Sblymn                     move( 0, 0 );
163*e124de36Sblymn                     in_wch( &icc );
164*e124de36Sblymn                     move( 1, 0 );
165*e124de36Sblymn                     add_wch( &icc );
166*e124de36Sblymn                     refresh();
167*e124de36Sblymn                     break;
168*e124de36Sblymn                 case 'y':
169*e124de36Sblymn                     move( 0, 0 );
170*e124de36Sblymn                     in_wchstr( icstr );
171*e124de36Sblymn                     move( 1, 0 );
172*e124de36Sblymn                     add_wchstr( icstr );
173*e124de36Sblymn                     refresh();
174*e124de36Sblymn                     break;
175*e124de36Sblymn                 case 'u':
176*e124de36Sblymn                     move( 0, 0 );
177*e124de36Sblymn                     inwstr( iwstr );
178*e124de36Sblymn                     move( 1, 0 );
179*e124de36Sblymn                     addwstr( iwstr );
180*e124de36Sblymn                     refresh();
181*e124de36Sblymn                     break;
182*e124de36Sblymn                 case 'i':
183*e124de36Sblymn                     move( 0, 0 );
184*e124de36Sblymn                     hline_set( &cc, 20 );
185*e124de36Sblymn                     move( 0, 0 );
186*e124de36Sblymn                     vline_set( &cc, 20 );
187*e124de36Sblymn                     refresh();
188*e124de36Sblymn                     break;
189*e124de36Sblymn                 case 'o':
190*e124de36Sblymn                     clrtobot();
191*e124de36Sblymn                     refresh();
1920c2185c6Scgd                     break;
1930c2185c6Scgd 		        case 's':		/* Go into standout mode on 's' */
1940c2185c6Scgd 			        standout();
1950c2185c6Scgd 			        break;
1960c2185c6Scgd 		        case 'e':		/* Exit standout mode on 'e' */
1970c2185c6Scgd 			        standend();
1980c2185c6Scgd 			        break;
1990c2185c6Scgd 		        case 'r':		/* Force a refresh on 'r' */
2000c2185c6Scgd 			        wrefresh(curscr);
2010c2185c6Scgd 			        break;
202*e124de36Sblymn 		        case 'w':		/* Turn on/off add_wch() tests */
203*e124de36Sblymn                     wc_on = 1 - wc_on;
204*e124de36Sblymn                     break;
205*e124de36Sblymn                 case 'd':
206*e124de36Sblymn                     add_wchstr(( const cchar_t *)&cstr );
207*e124de36Sblymn                     refresh();
208*e124de36Sblymn                     break;
209*e124de36Sblymn                 case 'c':
210*e124de36Sblymn                     addwstr(( const wchar_t *)&wstr );
211*e124de36Sblymn                     refresh();
212*e124de36Sblymn                     break;
213*e124de36Sblymn                 case 'z':
214*e124de36Sblymn                     move( 0, 1 );
215*e124de36Sblymn                     if ( wc_on )
216*e124de36Sblymn                         add_wch( &cc );
217*e124de36Sblymn                     else
2180c2185c6Scgd                         addch( c );
2190c2185c6Scgd                     refresh();
220*e124de36Sblymn                     break;
221*e124de36Sblymn                 case 'x':
222*e124de36Sblymn                     move( 0, 3 );
223*e124de36Sblymn                     if ( wc_on )
224*e124de36Sblymn                         add_wch( &cc );
225*e124de36Sblymn                     else
226*e124de36Sblymn                         addch( c );
227*e124de36Sblymn                     refresh();
228*e124de36Sblymn                     break;
229*e124de36Sblymn                 case 'n':
230*e124de36Sblymn                     add_wch( &ncc );
231*e124de36Sblymn                     refresh();
232*e124de36Sblymn                     break;
233*e124de36Sblymn                 case 'm':
234*e124de36Sblymn                     //border( 0, 0, 0, 0, 0, 0, 0, 0 );
235*e124de36Sblymn                     border_set( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL );
236*e124de36Sblymn                     refresh();
237*e124de36Sblymn                     break;
238*e124de36Sblymn                 case 'j':
239*e124de36Sblymn                     box_set( stdscr, &cc, &cc );
240*e124de36Sblymn                     refresh();
241*e124de36Sblymn                     break;
242*e124de36Sblymn                 case 'k':
243*e124de36Sblymn                     erase();
244*e124de36Sblymn                     refresh();
245*e124de36Sblymn                     break;
246*e124de36Sblymn                 case '1':
247*e124de36Sblymn                     move( 0, 0 );
248*e124de36Sblymn                     clrtoeol();
249*e124de36Sblymn                     refresh();
250*e124de36Sblymn                     break;
251*e124de36Sblymn                 case '2':
252*e124de36Sblymn                     move( 0, 0 );
253*e124de36Sblymn                     sprintf( nostr, "Orig:%x", al[ ac ]);
254*e124de36Sblymn                     addstr( nostr );
255*e124de36Sblymn                     ac = ( ac + 1 ) % 16;
256*e124de36Sblymn                     bcc.attributes = al[ ac ];
257*e124de36Sblymn                     bkgrnd( &bcc );
258*e124de36Sblymn                     move( 1, 0 );
259*e124de36Sblymn                     sprintf( nostr, "New:%x", al[ ac ]);
260*e124de36Sblymn                     //addstr( nostr );
261*e124de36Sblymn                     insstr( nostr );
262*e124de36Sblymn                     refresh();
263*e124de36Sblymn                     break;
264*e124de36Sblymn                 case 'v':
265*e124de36Sblymn                     if ( wc_on )
266*e124de36Sblymn                         ins_wch( &cc );
267*e124de36Sblymn                     else
268*e124de36Sblymn                         insch( c );
269*e124de36Sblymn                     refresh();
270*e124de36Sblymn                     break;
271*e124de36Sblymn                 case 'f':
272*e124de36Sblymn                     ins_wstr(( const wchar_t *)&wstr );
273*e124de36Sblymn                     refresh();
274*e124de36Sblymn                     break;
275*e124de36Sblymn                 case 't':
276*e124de36Sblymn                     for ( i = 0; i < 4; i++ ) {
277*e124de36Sblymn                         owstr[ i ] = wstr[ i + 5 ];
278*e124de36Sblymn                         wstr[ i + 5 ] = i + 0xda05;
279*e124de36Sblymn                     }
280*e124de36Sblymn                     ins_wstr(( const wchar_t *)&wstr );
281*e124de36Sblymn                     refresh();
282*e124de36Sblymn                     for ( i = 0; i < 4; i++ )
283*e124de36Sblymn                         wstr[ i + 5 ] = owstr[ i ];
284*e124de36Sblymn                     break;
285*e124de36Sblymn 		        default:		/* By default output the character */
286*e124de36Sblymn                     if ( wc_on )
287*e124de36Sblymn                         add_wch( &cc );
288*e124de36Sblymn                     else {
289*e124de36Sblymn                         if ( c < 0x7F )
290*e124de36Sblymn                             addch( c );
291*e124de36Sblymn                         else {
292*e124de36Sblymn                             addstr( keyname( c ));
293*e124de36Sblymn                         }
294*e124de36Sblymn                     }
295*e124de36Sblymn                     refresh();
296*e124de36Sblymn 		    }
297*e124de36Sblymn         } else {
298*e124de36Sblymn             get_wch( &wc );
299*e124de36Sblymn             switch ( wc ) {
300*e124de36Sblymn                 case L'w':
301*e124de36Sblymn                     wgc_on = 0;
302*e124de36Sblymn                     noecho();
303*e124de36Sblymn                     break;
304*e124de36Sblymn                 case L'q':
305*e124de36Sblymn                     quit( 0 );
306*e124de36Sblymn                     break;
307*e124de36Sblymn                 case L't':
308*e124de36Sblymn                     notimeout( stdscr, TRUE );
309*e124de36Sblymn                     break;
310*e124de36Sblymn                 case L'T':
311*e124de36Sblymn                     notimeout( stdscr, FALSE );
312*e124de36Sblymn                     break;
313*e124de36Sblymn                 case L'd':
314*e124de36Sblymn                     nodelay( stdscr, TRUE );
315*e124de36Sblymn                     break;
316*e124de36Sblymn                 case L'D':
317*e124de36Sblymn                     nodelay( stdscr, FALSE );
318*e124de36Sblymn                     break;
319*e124de36Sblymn                 case L'p':
320*e124de36Sblymn                     keypad( stdscr, TRUE );
321*e124de36Sblymn                     break;
322*e124de36Sblymn                 case L'P':
323*e124de36Sblymn                     keypad( stdscr, FALSE );
324*e124de36Sblymn                     break;
325*e124de36Sblymn                 default:
326*e124de36Sblymn                     break;
327*e124de36Sblymn             }
3280c2185c6Scgd         }
3290c2185c6Scgd 	}
3300c2185c6Scgd }
3310c2185c6Scgd 
quit(int sig)332*e124de36Sblymn void quit( int sig )
3330c2185c6Scgd {
3340c2185c6Scgd 	erase();		/* Terminate by erasing the screen */
3350c2185c6Scgd 	refresh();
3360c2185c6Scgd 	endwin();		/* Always end with endwin() */
3370c2185c6Scgd 	delwin(curscr);		/* Return storage */
3380c2185c6Scgd 	delwin(stdscr);
3390c2185c6Scgd 	putchar('\n');
340*e124de36Sblymn 	exit( sig );
3410c2185c6Scgd }
3420c2185c6Scgd 
343