]> pd.if.org Git - pd_readline/blob - pdmenu.c
First commit.
[pd_readline] / pdmenu.c
1 \r
2 \r
3 /*  pdmenu.c                                                */  \r
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
11 /*  exits.                                                  */       \r
12 /*  This code is released to the public domain.             */ \r
13 /*  "Share and enjoy...."  ;)                               */  \r
14 \r
15 \r
16 #include <string.h>   \r
17 #include <stdio.h> \r
18 #include <termios.h>  /* For getch()  */  \r
19 \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
24 \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
32 }\r
33 \r
34 \r
35 /* Restore old terminal i/o settings */\r
36 void resetTermios(void) {\r
37     tcsetattr(0, TCSANOW, &old);\r
38 }\r
39 \r
40 \r
41 /* Read 1 character - echo defines echo mode */\r
42 char getch_(int echo) {\r
43     char ch;\r
44     initTermios(echo);\r
45     ch = getchar();\r
46     resetTermios();\r
47     return ch;\r
48 }\r
49 \r
50 \r
51 /* Read 1 character without echo */\r
52 char getch(void) {\r
53     return getch_(0);\r
54 }\r
55 \r
56 \r
57 /* Read 1 character with echo */\r
58 char getche(void) {\r
59     return getch_(1);\r
60\r
61 \r
62 \r
63 \r
64 \r
65 int main(void)\r
66 {\r
67         \r
68   printf("Public Domain Menu Program \n");              \r
69   printf("\nUse the up and down arrow keys then press Enter\n"); \r
70   \r
71   int menunum = 0;            \r
72   \r
73   while(1) \r
74     {  \r
75                    \r
76       int key = getch(); \r
77                                                                        \r
78       /* Up arrow is 27, 91, 65.    ( ESC [ A )   */   \r
79       /* Down arrow is 27, 91, 66.  ( ESC [ B )   */ \r
80       /* Right arrow is 27, 91, 67. ( ESC [ C )   */ \r
81       /* Left arrow is 27, 91, 68.  ( ESC [ D )   */              \r
82       if(key == 27)  \r
83           {   key = getch(); \r
84               if(key == 91) \r
85               key = getch(); \r
86               if(key == 65)                              \r
87                { puts("You pressed up arrow! \n"); \r
88                          menunum-=1; \r
89                  printf("Menunum is now %d \n", menunum);  \r
90                }  \r
91               else if(key == 66)                              \r
92                { puts("You pressed down arrow! \n"); \r
93                          menunum+=1; \r
94                  printf("Menunum is now %d \n", menunum);  \r
95                }  \r
96               else if(key == 67)                              \r
97                { puts("You pressed right arrow! \n");                    \r
98                }  \r
99               else if(key == 68)                              \r
100                { puts("You pressed left arrow! \n");                     \r
101                }                \r
102           }\r
103               \r
104    /* A few other keys (for testing purposes ) */  \r
105      else if(key == 97) \r
106             { puts("You pressed the \"a\" key! \n");                     \r
107             }                    \r
108      else if(key == 98) \r
109             { puts("You pressed the \"b\" key! \n");                     \r
110             }   \r
111      else if(key == 99) \r
112             { puts("You pressed the \"c\" key! \n");                     \r
113             }\r
114      else if(key == 100) \r
115             { puts("You pressed the \"d\" key! \n");                     \r
116             }        \r
117                                           \r
118                                                  \r
119     /* The Enter key exits. Enter is 10 decimal */        \r
120         else if(key == 10)  \r
121                 { printf("You pressed ENTER! You chose item %d \n", menunum);  \r
122           break; }  \r
123     }                \r
124                                       \r
125         return 0;\r
126 }  \r
127 \r
128 \r
129 \r
130 \r