209 lines
4.8 KiB
C
209 lines
4.8 KiB
C
|
.\" $NetBSD: ex2.c,v 1.7 2003/08/07 16:44:27 agc Exp $
|
||
|
.\"
|
||
|
.\" Copyright (c) 1992, 1993
|
||
|
.\" The Regents of the University of California. All rights reserved.
|
||
|
.\"
|
||
|
.\" Redistribution and use in source and binary forms, with or without
|
||
|
.\" modification, are permitted provided that the following conditions
|
||
|
.\" are met:
|
||
|
.\" 1. Redistributions of source code must retain the above copyright
|
||
|
.\" notice, this list of conditions and the following disclaimer.
|
||
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||
|
.\" notice, this list of conditions and the following disclaimer in the
|
||
|
.\" documentation and/or other materials provided with the distribution.
|
||
|
.\" 3. Neither the name of the University nor the names of its contributors
|
||
|
.\" may be used to endorse or promote products derived from this software
|
||
|
.\" without specific prior written permission.
|
||
|
.\"
|
||
|
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
|
.\" SUCH DAMAGE.
|
||
|
.\"
|
||
|
.\" @(#)ex2.c 8.1 (Berkeley) 6/8/93
|
||
|
.\"
|
||
|
#include <curses.h>
|
||
|
#include <stdio.h>
|
||
|
#include <signal.h>
|
||
|
|
||
|
#define YSIZE LINES
|
||
|
#define XSIZE COLS
|
||
|
|
||
|
static int quit();
|
||
|
|
||
|
/*
|
||
|
* This program fills the screen up with characters and the allows the user to
|
||
|
* manipulate the text on the screen using some basic commands.
|
||
|
* Nothing fancy, just a demonstration of the elementary features of the
|
||
|
* curses(3) package.
|
||
|
*/
|
||
|
main()
|
||
|
{
|
||
|
int i, j, c, n, d = 0;
|
||
|
char id[100];
|
||
|
int hh = 0;
|
||
|
int curx, cury, base, arg;
|
||
|
|
||
|
initscr();
|
||
|
signal(SIGINT, quit);
|
||
|
crmode();
|
||
|
noecho();
|
||
|
nonl();
|
||
|
delwin(stdscr);
|
||
|
stdscr = newwin(YSIZE, XSIZE, 0, 0);
|
||
|
flushok(stdscr, TRUE);
|
||
|
scrollok(stdscr, TRUE);
|
||
|
erase();
|
||
|
refresh();
|
||
|
|
||
|
move(0,0);
|
||
|
refresh();
|
||
|
for (i = 0; i < YSIZE + 2; i++) {
|
||
|
(void)snprintf(id, sizeof id, "%d: ", i);
|
||
|
addstr(id);
|
||
|
for (j = 0; j < XSIZE - strlen(id); j++)
|
||
|
addch('0' + (i % 10));
|
||
|
}
|
||
|
c = getchar();
|
||
|
base = 2;
|
||
|
curx = cury = 0;
|
||
|
move(0, 0);
|
||
|
refresh();
|
||
|
|
||
|
/*
|
||
|
* The screen manipulator has the following commands:
|
||
|
* 'D' - clear to the end of the current line.
|
||
|
* 'B' - clear to the bottom of the screen.
|
||
|
* 'E' - erase the screen.
|
||
|
* 's' - enter standout mode.
|
||
|
* 'e' - exit standout mode.
|
||
|
* 'd' n - delete n lines below cursor line.
|
||
|
* 'i' n - insert n lines below cursor line.
|
||
|
* 'q' - quit.
|
||
|
* 'f' - move cursor one position to the right.
|
||
|
* 'b' - move cursor one position to the left.
|
||
|
* 'n' - move cursor one line down.
|
||
|
* 'p' - move cursor one line up.
|
||
|
* 'h' - home cusor.
|
||
|
* 'l' - force refresh.
|
||
|
* 'r' - simulate a carriage return.
|
||
|
*
|
||
|
* All other characters are ignored.
|
||
|
*/
|
||
|
for(;;) {
|
||
|
switch(c = getchar()) {
|
||
|
case 'D':
|
||
|
clrtoeol();
|
||
|
refresh();
|
||
|
continue;
|
||
|
case 'B':
|
||
|
clrtobot();
|
||
|
refresh();
|
||
|
continue;
|
||
|
case 'E':
|
||
|
erase();
|
||
|
refresh();
|
||
|
continue;
|
||
|
case 's':
|
||
|
standout();
|
||
|
continue;
|
||
|
case 'e':
|
||
|
standend();
|
||
|
continue;
|
||
|
case 'd':
|
||
|
arg = getchar() - '0';
|
||
|
for (i = 0; i < arg; i++)
|
||
|
deleteln();
|
||
|
refresh();
|
||
|
continue;
|
||
|
case 'i':
|
||
|
arg = getchar() - '0';
|
||
|
for (i = 0; i < arg; i++)
|
||
|
insertln();
|
||
|
refresh();
|
||
|
continue;
|
||
|
case 'q':
|
||
|
quit();
|
||
|
case 'f':
|
||
|
if (curx < XSIZE - 1)
|
||
|
curx++;
|
||
|
else {
|
||
|
cury++;
|
||
|
curx = 0;
|
||
|
}
|
||
|
break;
|
||
|
case 'b':
|
||
|
if (curx == 0) {
|
||
|
cury--;
|
||
|
curx = XSIZE - 1;
|
||
|
} else
|
||
|
curx--;
|
||
|
break;
|
||
|
case 'n':
|
||
|
cury++;
|
||
|
break;
|
||
|
case 'p':
|
||
|
cury--;
|
||
|
break;
|
||
|
case 'h':
|
||
|
curx = cury = 0;
|
||
|
break;
|
||
|
case 'l':
|
||
|
wrefresh(curscr);
|
||
|
continue;
|
||
|
case 'r': /* return */
|
||
|
{
|
||
|
int x, y;
|
||
|
getyx(stdscr, y, x);
|
||
|
move(y+1, 0);
|
||
|
insertln();
|
||
|
move(y, x);
|
||
|
clrtoeol();
|
||
|
refresh();
|
||
|
continue;
|
||
|
}
|
||
|
default:
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if (cury < 0) {
|
||
|
base--;
|
||
|
move(0, 0);
|
||
|
insertln();
|
||
|
(void)snprintf(id, sizeof id, "%d: ", base);
|
||
|
addstr(id);
|
||
|
for (j = 0; j < XSIZE - strlen(id) - 2; j++)
|
||
|
addch('0' + (base % 10));
|
||
|
cury++;
|
||
|
} else if (cury >= YSIZE) {
|
||
|
move(0, 0);
|
||
|
deleteln();
|
||
|
move(YSIZE - 1, 0);
|
||
|
(void)snprintf(id, sizeof id, "%d: ", base + YSIZE);
|
||
|
addstr(id);
|
||
|
for (j = 0; j < XSIZE - strlen(id) - 2; j++)
|
||
|
addch('0' + ((base + YSIZE) % 10));
|
||
|
cury--;
|
||
|
base++;
|
||
|
}
|
||
|
move(cury, curx);
|
||
|
refresh();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int
|
||
|
quit()
|
||
|
{
|
||
|
erase();
|
||
|
refresh();
|
||
|
endwin();
|
||
|
exit(0);
|
||
|
}
|