xref: /minix3/lib/libcurses/PSD.doc/ex2.c (revision 51ffecc181005cb45a40108612ee28d1daaeeb86)
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