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