4 /* This code is aimed at helping those who would like to */
\r
5 /* create menus without using the curses library. */
\r
6 /* It creates a count variable (which could be used to */
\r
7 /* keep track of which item is highlighted). Using the */
\r
8 /* up and down arrow keys increments and decrements the */
\r
9 /* count variable. Finally, when you press Enter, the */
\r
10 /* value of the count variable is printed and the program */
\r
12 /* This code is released to the public domain. */
\r
13 /* "Share and enjoy...." ;) */
\r
16 #include <string.h>
\r
18 #include <termios.h> /* For getch() */
\r
20 /* This implementation of getch() is from here - */
\r
21 /* http://wesley.vidiqatch.org/ */
\r
22 /* Thanks, Wesley! */
\r
23 static struct termios old, new;
\r
25 /* Initialize new terminal i/o settings */
\r
26 void initTermios(int echo) {
\r
27 tcgetattr(0, &old); /* grab old terminal i/o settings */
\r
28 new = old; /* make new settings same as old settings */
\r
29 new.c_lflag &= ~ICANON; /* disable buffered i/o */
\r
30 new.c_lflag &= echo ? ECHO : ~ECHO; /* set echo mode */
\r
31 tcsetattr(0, TCSANOW, &new); /* use these new terminal i/o settings now */
\r
35 /* Restore old terminal i/o settings */
\r
36 void resetTermios(void) {
\r
37 tcsetattr(0, TCSANOW, &old);
\r
41 /* Read 1 character - echo defines echo mode */
\r
42 char getch_(int echo) {
\r
51 /* Read 1 character without echo */
\r
57 /* Read 1 character with echo */
\r
64 /* Helper function, to let us see if a .history file */
\r
65 /* exists in the current directory. */
\r
66 int fexists(char *fname)
\r
71 fptr = fopen(fname, "r") ;
\r
73 if ( !fptr ) return -1 ; /* File does not exist in dir. */
\r
76 return 0; /* File DOES exist in dir. */
\r
81 /* Struct to store key sequences */
\r
88 int lbr ; /* For left-bracket ([) of escape sequences */
\r
99 printf("Public Domain Menu Program \n");
\r
106 keyseq buffer[80] ;
\r
108 /* Buffer "pointer" */
\r
112 /* Test for existence of history file. */
\r
114 exists = fexists(".history");
\r
115 printf("Result: %d \n", exists);
\r
120 int key = getch();
\r
122 /* Printable chars. */
\r
123 if ( (key >= 32) && (key <= 126) )
\r
126 buffer[bufpnt] = myseq;
\r
130 /* Up arrow is 27, 91, 65. ( ESC [ A ) */
\r
131 /* Down arrow is 27, 91, 66. ( ESC [ B ) */
\r
132 /* Right arrow is 27, 91, 67. ( ESC [ C ) */
\r
133 /* Left arrow is 27, 91, 68. ( ESC [ D ) */
\r
134 /* Function keys. */
\r
135 /* F2 is 27, 79, 81. */
\r
136 /* F3 is 27, 79, 82. */
\r
137 /* F4 is 27, 79, 83. */
\r
140 else if(key == 27)
\r
143 buffer[bufpnt] = myseq;
\r
148 buffer[bufpnt] = myseq;
\r
151 if( (key >= 65) && (key <= 68) )
\r
154 buffer[bufpnt] = myseq;
\r
161 /* The Enter key exits. Enter is 10 decimal */
\r
162 else if(key == 10)
\r
165 /* Print the array of structs. */
\r
166 for (j=0; j<10; j++)
\r
168 printf("Fnkey: %d ", buffer[j].fnkey ) ;
\r
169 printf("Ctrl: %d ", buffer[j].ctrl ) ;
\r
170 printf("Alt: %d ", buffer[j].alt ) ;
\r
171 printf("Shf: %d ", buffer[j].shf ) ;
\r
172 printf("Esc: %d ", buffer[j].esc ) ;
\r
173 printf("Lbr: %d ", buffer[j].lbr ) ;
\r
174 printf("Key: %d \n", buffer[j].key ) ;
\r
178 } /* Key = Enter */
\r