]> pd.if.org Git - pd_readline/blobdiff - keyhandler.c
More work
[pd_readline] / keyhandler.c
index af0eb766ce54bc6aa85243a59859c16459b0ff6b..f4ca5baa146f729885ca2d639f37cb52bde323d6 100644 (file)
 
 
-/*  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; 
+}    
+
+
+
 
-} 
 
 
-