From 88de44744adaceca26b7795d6190606ec882d629 Mon Sep 17 00:00:00 2001 From: James Booth Date: Wed, 29 Feb 2012 23:15:27 +0000 Subject: [PATCH] TIdey up input win functions --- input_win.c | 241 +++++++++++++++++++++++++++------------------------- 1 file changed, 126 insertions(+), 115 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 #include #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,135 +77,38 @@ 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); - // if at end, delete last char - if (inp_x > *size) { - wmove(inp_win, inp_y, inp_x-1); - wdelch(inp_win); - (*size)--; + for (i = *size; i > inp_x -1; i--) + input[i] = input[i-1]; + input[inp_x -1] = *ch; - // 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)--; + (*size)++; - inp_clear(); - for (i = 0; i < *size; i++) - waddch(inp_win, input[i]); - wmove(inp_win, 0, inp_x -1); + // otherwise just append + } else { + waddch(inp_win, *ch); + input[(*size)++] = *ch; } } - - // left arrow - } else if (*ch == KEY_LEFT) { - getyx(inp_win, inp_y, inp_x); - if (inp_x > 1) { - wmove(inp_win, inp_y, inp_x-1); - } - - // right arrow - } else if (*ch == KEY_RIGHT) { - getyx(inp_win, inp_y, inp_x); - 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; - } } echo(); @@ -205,3 +128,91 @@ 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) { + wmove(inp_win, inp_y, inp_x-1); + wdelch(inp_win); + (*size)--; + + // if in middle, delete and shift chars left + } else if (inp_x > 1 && inp_x <= *size) { + for (i = inp_x-1; i < *size; i++) + input[i-1] = input[i]; + (*size)--; + + inp_clear(); + for (i = 0; i < *size; i++) + waddch(inp_win, input[i]); + wmove(inp_win, 0, inp_x -1); + } + } + return 1; + + case KEY_LEFT: + if (inp_x > 1) + wmove(inp_win, inp_y, inp_x-1); + return 1; + + case KEY_RIGHT: + if (inp_x <= *size ) + wmove(inp_win, inp_y, inp_x+1); + 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; + } +} + +static int _printable(int ch) +{ + 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)); +} + +static void _replace_input(char *input, char *new_input, int *size) +{ + int i; + + strcpy(input, new_input); + *size = strlen(input); + inp_clear(); + for (i = 0; i < *size; i++) + waddch(inp_win, input[i]); +}