-/* keyhandler.c */
-
-/*
- A simple program to handle keys (in particular, function keys,
- Ctrl keys, Alt keys and arrow keys).
- This code is released to the public domain.
- "Share and enjoy...." ;)
-*/
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <termios.h>
-#include <ctype.h>
+/* keyhandler.c */
+/* Handle keystrokes for pd_readline. */
+/* This code is released to the public domain. */
+/* "Share and enjoy...." ;) */
+/* See the UNLICENSE file for details. */
+
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <termios.h>
+#include "pd_readline.h"
+
+
+/* This implementation of getch() is from here - */
+/* http://wesley.vidiqatch.org/ */
+/* Thanks, Wesley! */
+static struct termios old, new;
+
+/* Initialize new terminal i/o settings */
+void initTermios(int echo)
+{
+ tcgetattr(0, &old); /* grab old terminal i/o settings */
+ new = old; /* make new settings same as old settings */
+ new.c_lflag &= ~ICANON; /* disable buffered i/o */
+ new.c_lflag &= echo ? ECHO : ~ECHO; /* set echo mode */
+ tcsetattr(0, TCSANOW, &new); /* use these new terminal i/o settings now */
+}
-void func1(void)
-{
- printf("Hey, you entered foo! \n");
-}
-void func2(void)
-{
- printf("Hey, you entered bar! \n");
-}
-
-void alt_a(void)
-{
- printf("Hey, you pressed ALT a! \n");
-}
-
-void alt_b(void)
-{
- printf("Hey, you pressed ALT b! \n");
-}
+/* Restore old terminal i/o settings */
+void resetTermios(void)
+{
+ tcsetattr(0, TCSANOW, &old);
+}
-void ctrl_a(void)
-{
- printf("Hey, you pressed CTRL a! \n");
-}
-void ctrl_g(void)
-{
- printf("Hey, you pressed CTRL g! \n");
-}
+/* Read 1 character - echo defines echo mode */
+char getch_(int echo) {
+ char ch;
+ initTermios(echo);
+ ch = getchar();
+ resetTermios();
+ return ch;
+}
-void up_arrow(void)
-{
- printf("Hey, you pressed the up arrow! \n");
-}
-void down_arrow(void)
-{
- printf("Hey, you pressed the down arrow! \n");
+/* Read 1 character without echo */
+char getch(void) {
+ return getch_(0);
}
-void left_arrow(void)
-{
- printf("Hey, you pressed the left arrow! \n");
-}
-void right_arrow(void)
-{
- printf("Hey, you pressed the right arrow! \n");
+/* Read 1 character with echo */
+char getche(void) {
+ return getch_(1);
}
-void f2(void)
-{
- printf("Hey, you pressed F2! \n");
-}
-
-void f3(void)
-{
- printf("Hey, you pressed F3! \n");
-}
-
-void f4(void)
-{
- printf("Hey, you pressed F4! \n");
-}
+/* Arrow keys are esc [ A to esc [ D */
+/* Alt keys are just esc then key (e.g. Alt-g is esc g ). */
+/* Ctrl (then letter) keys are just Dec 1 to Dec 26 */
-
-int main(void)
+void keyhandler(buf b, hist h)
{
-
- char word[80];
- char ch;
-
- do {
- puts("Enter some text :");
- scanf("%s", word);
- if ( !strcmp(word, "foo") ) {
- func1();
- }
-
- else if (!strcmp(word, "bar") ) {
- func2();
- }
-
- else if (!strcmp(word, "\x1b\x61") ) {
- alt_a();
- }
+ int a = getch();
- else if (!strcmp(word, "\x1b\x62") ) {
- alt_b();
- }
+ int t = type(a);
- else if (!strcmp(word, "\x07") ) {
- ctrl_g();
- }
-
- else if (!strcmp(word, "\x01") ) {
- ctrl_a();
- }
-
- else if (!strcmp(word, "\x1b\x5b\x41") ) {
- up_arrow();
- }
-
- else if (!strcmp(word, "\x1b\x5b\x42") ) {
- down_arrow();
- }
-
- else if (!strcmp(word, "\x1b\x5b\x43") ) {
- right_arrow();
+ switch(t)
+ {
+
+ case (1): break; /* Ctrl a */
+ case (2): break; /* Ctrl b */
+ case (3): getch(); spec(h); break; /* Ctrl c */
+ case (4): set(b, a); break; /* Printable chars. */
+ case (5): delch(b); break;
+ case (6): break;
+ default: break;
+
}
- else if (!strcmp(word, "\x1b\x5b\x44") ) {
- left_arrow();
- }
-
- else if (!strcmp(word, "\x1b\x4f\x51") ) {
- f2();
- }
-
- else if (!strcmp(word, "\x1b\x4f\x52") ) {
- f3();
- }
-
- else if (!strcmp(word, "\x1b\x4f\x53") ) {
- f4();
- }
-
- else {
- printf("Nope - I do not recognise that phrase.... \n");
- }
-
- printf("Try again? (y/n) : ");
- scanf(" %c%*c", &ch);
- }
-
- while( toupper(ch) != 'N' );
-
- return 0;
+}
+
+
+
-}
-