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