aboutsummaryrefslogtreecommitdiff
path: root/contrib/ncurses/test/lrtest.c
blob: a3b856a8fd3d84da3171bb47735c3018aeceed02 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
 * Test lower-right-hand corner access
 *
 * originally by Eric S. Raymond <esr@thyrsus.com>, written for animation
 * and resizing -TD
 *
 * This can't be part of the ncurses test-program, because ncurses rips off the
 * bottom line to do labels.
 *
 * $Id: lrtest.c,v 0.17 2002/04/06 20:45:22 tom Exp $
 */

#include <test.priv.h>

typedef struct {
    int y, x, mode, dir, inc;
    chtype value;
} MARK;

/*
 * Make a couple of markers go 'round the border to demonstrate that we can
 * really write to all positions properly.
 */
static void
show(MARK * m)
{
    mvaddch(m->y, m->x, m->value);
    if (m->mode == 0) {		/* along the x-direction */
	m->x += m->inc;
	if (m->x >= COLS) {
	    m->x = COLS - 1;
	    m->inc = -m->dir * m->inc;
	    m->y += m->inc;
	    m->mode = 1;
	} else if (m->x < 0) {
	    m->x = 0;
	    m->inc = -m->dir * m->inc;
	    m->y += m->inc;
	    m->mode = 1;
	}
    } else {			/* along the y-direction */
	m->y += m->inc;
	if (m->y >= LINES) {
	    m->y = LINES - 1;
	    m->inc = m->dir * m->inc;
	    m->x += m->inc;
	    m->mode = 0;
	} else if (m->y < 0) {
	    m->y = 0;
	    m->inc = m->dir * m->inc;
	    m->x += m->inc;
	    m->mode = 0;
	}
    }
}

int
main(
	int argc GCC_UNUSED,
	char *argv[]GCC_UNUSED)
{
    static MARK marks[] =
    {
	{0, 0, 0, -1, 1, '+' | A_BOLD},
	{0, 0, 1, 1, 2, 'X'},
	{0, 0, 1, -1, 3, 'Y'},
	{0, 8, 0, -1, 1, '+' | A_BOLD},
	{0, 9, 0, -1, 1, '+' | A_BOLD},
	{1, 0, 1, 1, 1, '*' | A_REVERSE},
	{2, 0, 1, 1, 1, '*' | A_REVERSE}
    };

    initscr();
    noecho();
    cbreak();
    nodelay(stdscr, TRUE);
    curs_set(0);

#ifdef KEY_RESIZE
    keypad(stdscr, TRUE);
  restart:
#endif
    move(LINES / 2 - 1, 4);
    if (!(has_ic()
    /* see PutCharLR() */
	  || auto_right_margin
	  || (enter_am_mode && exit_am_mode))) {
	addstr("Your terminal lacks the capabilities needed to address the\n");
	move(LINES / 2, 4);
	addstr("lower-right-hand corner of the screen.\n");
    } else {
	addstr("This is a test of access to the lower right corner.\n");
	move(LINES / 2, 4);
	addstr("If the top of the box is missing, the test failed.\n");
	move(LINES / 2 + 1, 4);
	addstr("Please report this (with a copy of your terminfo entry).\n");
	move(LINES / 2 + 2, 4);
	addstr("to the ncurses maintainers, at bug-ncurses@gnu.org.\n");
    }

    for (;;) {
	int ch;
	unsigned n;

	box(stdscr, 0, 0);
	for (n = 0; n < SIZEOF(marks); n++) {
	    show(&marks[n]);
	}

	if ((ch = getch()) > 0) {
	    if (ch == 'q')
		break;
	    else if (ch == 's')
		nodelay(stdscr, FALSE);
	    else if (ch == ' ')
		nodelay(stdscr, TRUE);
#ifdef KEY_RESIZE
	    else if (ch == KEY_RESIZE) {
		for (n = 0; n < SIZEOF(marks); n++) {
		    if (marks[n].mode == 0) {	/* moving along x-direction */
			if (marks[n].y)
			    marks[n].y = LINES - 1;
		    } else {
			if (marks[n].x)
			    marks[n].x = COLS - 1;
		    }
		}
		flash();
		erase();
		wrefresh(curscr);
		goto restart;
	    }
#endif
	}
	napms(50);
	refresh();
    }

    curs_set(1);
    endwin();
    ExitProgram(EXIT_SUCCESS);
}

/* lrtest.c ends here */