about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2012-02-29 23:15:27 +0000
committerJames Booth <boothj5@gmail.com>2012-02-29 23:15:27 +0000
commit88de44744adaceca26b7795d6190606ec882d629 (patch)
tree9908b4006927da648215ca780bc1894237c3ceb0
parentef4c7ce55fcbb6c5a4514b0237b7ea41a2702be3 (diff)
downloadprofani-tty-88de44744adaceca26b7795d6190606ec882d629.tar.gz
TIdey up input win functions
-rw-r--r--input_win.c227
1 files changed, 119 insertions, 108 deletions
diff --git a/input_win.c b/input_win.c
index dfe0939a..f1329047 100644
--- a/input_win.c
+++ b/input_win.c
@@ -20,6 +20,22 @@
  *
  */
 
+/*
+ * Non blocking input char handling
+ *
+ * *size  - holds the current size of input
+ * *input - holds the current input string, NOT null terminated at this point
+ * *ch    - getch will put a charater here if there was any input
+ * 
+ * The example below shows the values of size, input, a call to wgetyx to
+ * find the current cursor location, and the index of the input string.
+ *
+ * size  : "       7 "
+ * input : " example "
+ * inp_x : "012345678"
+ * index : " 0123456 " (inp_x - 1)
+ */
+
 #include <string.h>
 #include <ncurses.h>
 #include "windows.h"
@@ -27,6 +43,10 @@
 
 static WINDOW *inp_win;
 
+static int _handle_edit(int ch, char *input, int *size);
+static int _printable(int ch);
+static void _replace_input(char *input, char *new_input, int *size);
+
 void create_input_window(void)
 {
     int rows, cols;
@@ -34,7 +54,7 @@ void create_input_window(void)
 
     inp_win = newwin(1, cols, rows-1, 0);
     keypad(inp_win, TRUE);
-    wattron(inp_win, A_BOLD);
+    wattrset(inp_win, A_BOLD);
     wmove(inp_win, 0, 1);
     wrefresh(inp_win);
 }
@@ -57,38 +77,78 @@ void inp_block(void)
     wtimeout(inp_win, -1);
 }
 
-/*
- * Non blocking input char handling
- *
- * *size  - holds the current size of input
- * *input - holds the current input string
- * *ch    - getch will put a charater here if there was any input
- * 
- * The example below shows the values of size, input, a call to wgetyx to
- * find the current cursor location, and the index of the input string.
- *
- * size  : "       7 "
- * input : " example "
- * inp_x : "012345678"
- * index : " 0123456 " (inp_x - 1)
- */
 void inp_poll_char(int *ch, char *input, int *size)
 {
     int inp_y = 0;
     int inp_x = 0;
-
-    // move cursor back to inp_win
-    getyx(inp_win, inp_y, inp_x);
-    wmove(inp_win, inp_y, inp_x);
+    int i;
 
     // echo off, and get some more input
     noecho();
     *ch = wgetch(inp_win);
 
-    // if delete pressed, go back and delete it
-    if (*ch == 127 || *ch == KEY_BACKSPACE) {
-        if (*size > 0) {
+    // if it wasn't an arrow key etc
+    if (!_handle_edit(*ch, input, size)) {
+        if (_printable(*ch)) {
             getyx(inp_win, inp_y, inp_x);
+           
+            // handle insert if not at end of input
+            if (inp_x <= *size) {
+                winsch(inp_win, *ch);
+                wmove(inp_win, inp_y, inp_x+1);
+
+                for (i = *size; i > inp_x -1; i--)
+                    input[i] = input[i-1];
+                input[inp_x -1] = *ch;
+
+                (*size)++;
+
+            // otherwise just append
+            } else {
+                waddch(inp_win, *ch);
+                input[(*size)++] = *ch;
+            }
+        }
+    }
+
+    echo();
+}
+
+void inp_get_password(char *passwd)
+{
+    wclear(inp_win);
+    noecho();
+    mvwgetnstr(inp_win, 0, 1, passwd, 20);
+    wmove(inp_win, 0, 1);
+    echo();
+    status_bar_clear();
+}
+
+void inp_put_back(void)
+{
+    wrefresh(inp_win);
+}
+
+/*
+ * Deal with command editing, return 1 if ch was an edit
+ * key press: up, down, left, right or backspace
+ * return 0 if it wasnt
+ */
+static int _handle_edit(int ch, char *input, int *size)
+{
+    int i;
+    char *prev = NULL;
+    char *next = NULL;
+    int inp_y = 0;
+    int inp_x = 0;
+    
+    getyx(inp_win, inp_y, inp_x);
+
+    switch(ch) {
+    
+    case 127:
+    case KEY_BACKSPACE:
+        if (*size > 0) {
 
             // if at end, delete last char
             if (inp_x > *size) {
@@ -98,7 +158,6 @@ void inp_poll_char(int *ch, char *input, int *size)
 
             // if in middle, delete and shift chars left
             } else if (inp_x > 1 && inp_x <= *size) {
-                int i;
                 for (i = inp_x-1; i < *size; i++)
                     input[i-1] = input[i];
                 (*size)--;
@@ -109,99 +168,51 @@ void inp_poll_char(int *ch, char *input, int *size)
                 wmove(inp_win, 0, inp_x -1);
             }
         }
+        return 1;
 
-    // left arrow
-    } else if (*ch == KEY_LEFT) {
-        getyx(inp_win, inp_y, inp_x);
-        if (inp_x > 1) {
+    case KEY_LEFT:
+        if (inp_x > 1)
             wmove(inp_win, inp_y, inp_x-1);
-        }
+        return 1;
 
-    // right arrow
-    } else if (*ch == KEY_RIGHT) {
-        getyx(inp_win, inp_y, inp_x);
-        if (inp_x <= *size ) {
+    case KEY_RIGHT:
+        if (inp_x <= *size )
             wmove(inp_win, inp_y, inp_x+1);
-        }
-
-    // up arrow
-    } else if (*ch == KEY_UP) {
-        char *prev = history_previous();
-        if (prev) {
-            strcpy(input, prev);
-            *size = strlen(input);
-            inp_clear();
-            int i;
-            for (i = 0; i < *size; i++)
-                waddch(inp_win, input[i]);
-        }
-
-    // down arrow
-    } else if (*ch == KEY_DOWN) {
-        char *next = history_next();
-        if (next) {
-            strcpy(input, next);
-            *size = strlen(input);
-            inp_clear();
-            int i;
-            for (i = 0; i < *size; i++)
-                waddch(inp_win, input[i]);
-        }
-
-    // else if not error, newline or special key, 
-    // show it and store it
-    } else if (*ch != ERR &&
-             *ch != '\n' &&
-             *ch != KEY_LEFT &&
-             *ch != KEY_RIGHT &&
-             *ch != KEY_UP &&
-             *ch != KEY_DOWN &&
-             *ch != KEY_F(1) &&
-             *ch != KEY_F(2) &&
-             *ch != KEY_F(3) &&
-             *ch != KEY_F(4) &&
-             *ch != KEY_F(5) &&
-             *ch != KEY_F(6) &&
-             *ch != KEY_F(7) &&
-             *ch != KEY_F(8) &&
-             *ch != KEY_F(9) &&
-             *ch != KEY_F(10)) {
-
-        getyx(inp_win, inp_y, inp_x);
-       
-        // handle insert if not at end of input
-        if (inp_x <= *size) {
-            winsch(inp_win, *ch);
-            wmove(inp_win, inp_y, inp_x+1);
-
-            int i;
-            for (i = *size; i > inp_x -1; i--)
-                input[i] = input[i-1];
-            input[inp_x -1] = *ch;
-
-            (*size)++;
-
-        // otherwise just append
-        } else {
-            waddch(inp_win, *ch);
-            input[(*size)++] = *ch;
-        }
+        return 1;
+
+    case KEY_UP:
+        prev = history_previous();
+        if (prev)
+            _replace_input(input, prev, size);
+        return 1;
+
+    case KEY_DOWN:
+        next = history_next();
+        if (next)
+            _replace_input(input, next, size);
+        return 1;
+
+    default:
+        return 0;
     }
-
-    echo();
 }
 
-void inp_get_password(char *passwd)
+static int _printable(int ch)
 {
-    wclear(inp_win);
-    noecho();
-    mvwgetnstr(inp_win, 0, 1, passwd, 20);
-    wmove(inp_win, 0, 1);
-    echo();
-    status_bar_clear();
+   return (ch != ERR && ch != '\n' &&
+            ch != KEY_F(1) && ch != KEY_F(2) && ch != KEY_F(3) && 
+            ch != KEY_F(4) && ch != KEY_F(5) && ch != KEY_F(6) &&
+            ch != KEY_F(7) && ch != KEY_F(8) && ch != KEY_F(9) &&
+            ch != KEY_F(10));
 }
 
-void inp_put_back(void)
+static void _replace_input(char *input, char *new_input, int *size)
 {
-    wrefresh(inp_win);
+    int i;
+
+    strcpy(input, new_input);
+    *size = strlen(input);
+    inp_clear();
+    for (i = 0; i < *size; i++)
+        waddch(inp_win, input[i]);
 }