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