1/****************************************************************************
2 * Copyright (c) 1998-2005,2006 Free Software Foundation, Inc.              *
3 *                                                                          *
4 * Permission is hereby granted, free of charge, to any person obtaining a  *
5 * copy of this software and associated documentation files (the            *
6 * "Software"), to deal in the Software without restriction, including      *
7 * without limitation the rights to use, copy, modify, merge, publish,      *
8 * distribute, distribute with modifications, sublicense, and/or sell       *
9 * copies of the Software, and to permit persons to whom the Software is    *
10 * furnished to do so, subject to the following conditions:                 *
11 *                                                                          *
12 * The above copyright notice and this permission notice shall be included  *
13 * in all copies or substantial portions of the Software.                   *
14 *                                                                          *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
18 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
21 * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
22 *                                                                          *
23 * Except as contained in this notice, the name(s) of the above copyright   *
24 * holders shall not be used in advertising or otherwise to promote the     *
25 * sale, use or other dealings in this Software without prior written       *
26 * authorization.                                                           *
27 ****************************************************************************/
28
29/*
30 * Author:  Thomas E. Dickey <dickey@clark.net> 1998
31 *
32 * $Id: filter.c,v 1.11 2006/12/09 16:53:47 tom Exp $
33 */
34#include <test.priv.h>
35
36#if HAVE_FILTER
37
38/*
39 * An example of the 'filter()' function in ncurses, this program prompts
40 * for commands and executes them (like a command shell).  It illustrates
41 * how ncurses can be used to implement programs that are not full-screen.
42 *
43 * Ncurses differs slightly from SVr4 curses.  The latter does not flush its
44 * state when exiting program mode, so the attributes on the command lines of
45 * this program 'bleed' onto the executed commands.  Rather than use the
46 * reset_shell_mode() and reset_prog_mode() functions, we could invoke endwin()
47 * and refresh(), but that does not work any better.
48 */
49
50static int
51new_command(char *buffer, int length, attr_t underline)
52{
53    int code;
54
55    attron(A_BOLD);
56    printw("Command: ");
57    attron(underline);
58    code = getnstr(buffer, length);
59    /*
60     * If this returns anything except ERR/OK, it would be one of ncurses's
61     * extensions.  Fill the buffer with something harmless that the shell
62     * will execute as a comment.
63     */
64#ifdef KEY_EVENT
65    if (code == KEY_EVENT)
66	strcpy(buffer, "# event!");
67#endif
68#ifdef KEY_RESIZE
69    if (code == KEY_RESIZE) {
70	strcpy(buffer, "# resize!");
71	getch();
72    }
73#endif
74    attroff(underline);
75    attroff(A_BOLD);
76    printw("\n");
77
78    return code;
79}
80
81int
82main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
83{
84    char buffer[80];
85    attr_t underline;
86
87    setlocale(LC_ALL, "");
88
89    filter();
90    (void) newterm((char *) 0, stdout, stdin);
91    cbreak();
92    keypad(stdscr, TRUE);
93
94    if (has_colors()) {
95	int background = COLOR_BLACK;
96	start_color();
97#if HAVE_USE_DEFAULT_COLORS
98	if (use_default_colors() != ERR)
99	    background = -1;
100#endif
101	init_pair(1, COLOR_CYAN, background);
102	underline = COLOR_PAIR(1);
103    } else {
104	underline = A_UNDERLINE;
105    }
106
107    while (new_command(buffer, sizeof(buffer) - 1, underline) != ERR
108	   && strlen(buffer) != 0) {
109	reset_shell_mode();
110	printf("\n");
111	fflush(stdout);
112	system(buffer);
113	reset_prog_mode();
114	touchwin(stdscr);
115	erase();
116	refresh();
117    }
118    printw("done");
119    refresh();
120    endwin();
121    ExitProgram(EXIT_SUCCESS);
122}
123#else
124int
125main(void)
126{
127    printf("This program requires the filter function\n");
128    ExitProgram(EXIT_FAILURE);
129}
130#endif /* HAVE_FILTER */
131