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