1 .\" $NetBSD: ex2.c,v 1.7 2003/08/07 16:44:27 agc Exp $ 2 .\" 3 .\" Copyright (c) 1992, 1993 4 .\" The Regents of the University of California. All rights reserved. 5 .\" 6 .\" Redistribution and use in source and binary forms, with or without 7 .\" modification, are permitted provided that the following conditions 8 .\" are met: 9 .\" 1. Redistributions of source code must retain the above copyright 10 .\" notice, this list of conditions and the following disclaimer. 11 .\" 2. Redistributions in binary form must reproduce the above copyright 12 .\" notice, this list of conditions and the following disclaimer in the 13 .\" documentation and/or other materials provided with the distribution. 14 .\" 3. Neither the name of the University nor the names of its contributors 15 .\" may be used to endorse or promote products derived from this software 16 .\" without specific prior written permission. 17 .\" 18 .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 19 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 22 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 .\" SUCH DAMAGE. 29 .\" 30 .\" @(#)ex2.c 8.1 (Berkeley) 6/8/93 31 .\" 32 #include <curses.h> 33 #include <stdio.h> 34 #include <signal.h> 35 36 #define YSIZE LINES 37 #define XSIZE COLS 38 39 static int quit(); 40 41 /* 42 * This program fills the screen up with characters and the allows the user to 43 * manipulate the text on the screen using some basic commands. 44 * Nothing fancy, just a demonstration of the elementary features of the 45 * curses(3) package. 46 */ 47 main() 48 { 49 int i, j, c, n, d = 0; 50 char id[100]; 51 int hh = 0; 52 int curx, cury, base, arg; 53 54 initscr(); 55 signal(SIGINT, quit); 56 crmode(); 57 noecho(); 58 nonl(); 59 delwin(stdscr); 60 stdscr = newwin(YSIZE, XSIZE, 0, 0); 61 flushok(stdscr, TRUE); 62 scrollok(stdscr, TRUE); 63 erase(); 64 refresh(); 65 66 move(0,0); 67 refresh(); 68 for (i = 0; i < YSIZE + 2; i++) { 69 (void)snprintf(id, sizeof id, "%d: ", i); 70 addstr(id); 71 for (j = 0; j < XSIZE - strlen(id); j++) 72 addch('0' + (i % 10)); 73 } 74 c = getchar(); 75 base = 2; 76 curx = cury = 0; 77 move(0, 0); 78 refresh(); 79 80 /* 81 * The screen manipulator has the following commands: 82 * 'D' - clear to the end of the current line. 83 * 'B' - clear to the bottom of the screen. 84 * 'E' - erase the screen. 85 * 's' - enter standout mode. 86 * 'e' - exit standout mode. 87 * 'd' n - delete n lines below cursor line. 88 * 'i' n - insert n lines below cursor line. 89 * 'q' - quit. 90 * 'f' - move cursor one position to the right. 91 * 'b' - move cursor one position to the left. 92 * 'n' - move cursor one line down. 93 * 'p' - move cursor one line up. 94 * 'h' - home cusor. 95 * 'l' - force refresh. 96 * 'r' - simulate a carriage return. 97 * 98 * All other characters are ignored. 99 */ 100 for(;;) { 101 switch(c = getchar()) { 102 case 'D': 103 clrtoeol(); 104 refresh(); 105 continue; 106 case 'B': 107 clrtobot(); 108 refresh(); 109 continue; 110 case 'E': 111 erase(); 112 refresh(); 113 continue; 114 case 's': 115 standout(); 116 continue; 117 case 'e': 118 standend(); 119 continue; 120 case 'd': 121 arg = getchar() - '0'; 122 for (i = 0; i < arg; i++) 123 deleteln(); 124 refresh(); 125 continue; 126 case 'i': 127 arg = getchar() - '0'; 128 for (i = 0; i < arg; i++) 129 insertln(); 130 refresh(); 131 continue; 132 case 'q': 133 quit(); 134 case 'f': 135 if (curx < XSIZE - 1) 136 curx++; 137 else { 138 cury++; 139 curx = 0; 140 } 141 break; 142 case 'b': 143 if (curx == 0) { 144 cury--; 145 curx = XSIZE - 1; 146 } else 147 curx--; 148 break; 149 case 'n': 150 cury++; 151 break; 152 case 'p': 153 cury--; 154 break; 155 case 'h': 156 curx = cury = 0; 157 break; 158 case 'l': 159 wrefresh(curscr); 160 continue; 161 case 'r': /* return */ 162 { 163 int x, y; 164 getyx(stdscr, y, x); 165 move(y+1, 0); 166 insertln(); 167 move(y, x); 168 clrtoeol(); 169 refresh(); 170 continue; 171 } 172 default: 173 continue; 174 } 175 176 if (cury < 0) { 177 base--; 178 move(0, 0); 179 insertln(); 180 (void)snprintf(id, sizeof id, "%d: ", base); 181 addstr(id); 182 for (j = 0; j < XSIZE - strlen(id) - 2; j++) 183 addch('0' + (base % 10)); 184 cury++; 185 } else if (cury >= YSIZE) { 186 move(0, 0); 187 deleteln(); 188 move(YSIZE - 1, 0); 189 (void)snprintf(id, sizeof id, "%d: ", base + YSIZE); 190 addstr(id); 191 for (j = 0; j < XSIZE - strlen(id) - 2; j++) 192 addch('0' + ((base + YSIZE) % 10)); 193 cury--; 194 base++; 195 } 196 move(cury, curx); 197 refresh(); 198 } 199 } 200 201 int 202 quit() 203 { 204 erase(); 205 refresh(); 206 endwin(); 207 exit(0); 208 } 209