X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=keyhandler.c;h=0ba3c6a368bcd9503e01ecf77369fe98408351c7;hb=851ac869ee55686234ae246ab9b5d938aec0f225;hp=af0eb766ce54bc6aa85243a59859c16459b0ff6b;hpb=15155262dff7689ef3601df89e70d42ec3c127ca;p=pd_readline diff --git a/keyhandler.c b/keyhandler.c index af0eb76..0ba3c6a 100644 --- a/keyhandler.c +++ b/keyhandler.c @@ -1,165 +1,94 @@ -/* 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 -#include -#include -#include -#include +/* 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 +#include +#include +#include +#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) { - - 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(); 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; +} + + + -} -