diff options
Diffstat (limited to 'gnu/lib/libodialog/lineedit.c')
-rw-r--r-- | gnu/lib/libodialog/lineedit.c | 213 |
1 files changed, 0 insertions, 213 deletions
diff --git a/gnu/lib/libodialog/lineedit.c b/gnu/lib/libodialog/lineedit.c deleted file mode 100644 index 7bfe0e0..0000000 --- a/gnu/lib/libodialog/lineedit.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Changes Copyright (C) 1995 by Andrey A. Chernov, Moscow - * - * Original Copyright: - * - * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - -#include <dialog.h> -#include "dialog.priv.h" - -static void redraw_field(WINDOW *dialog, int box_y, int box_x, int flen, int box_width, unsigned char instr[], int input_x, int scroll, chtype attr, chtype old_attr, int fexit, int attr_mask); - -/* - * Line editor - */ -int line_edit(WINDOW* dialog, int box_y, int box_x, int flen, int box_width, chtype attr, int first, unsigned char *result, int attr_mask) -{ - int i, key; - chtype old_attr; - static int input_x, scroll; - static unsigned char instr[MAX_LEN+1]; - unsigned char erase_char = erasechar(); - unsigned char kill_char = killchar(); -#ifdef notyet - unsignec char werase_char = cur_term->Ottyb.c_cc[VWERASE]; -#endif - - old_attr = getattrs(dialog); - keypad(dialog, TRUE); - - if (first) { - memset(instr, 0, sizeof(instr)); - strcpy(instr, result); - i = strlen(instr); -/* input_x = i % box_width;*/ - input_x = (i > box_width) ? box_width - 1 : i; -/* scroll = i - input_x;*/ - scroll = (i > box_width) ? i - box_width + 1: 0; - } - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - - for (;;) { - wattrset(dialog, attr); - wrefresh(dialog); - key = wgetch(dialog); - switch (key) { - case ctrl('q'): - goto ret; - break; - case KEY_F(1): - display_helpfile(); - break; - case TAB: - case KEY_BTAB: - case KEY_UP: - case KEY_DOWN: - case ESC: - case '\r': - case '\n': - for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) - instr[i] = '\0'; - if (key == '\r') - key = '\n'; - goto ret; - case '\025': - case '\030': - kill_it: - input_x = scroll = 0; - /* fall through */ - case '\013': - case KEY_EOL: - memset(instr + scroll + input_x, '\0', sizeof(instr) - scroll - input_x); - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - continue; - case '\001': - case KEY_HOME: - input_x = scroll = 0; - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - continue; - case '\005': - case KEY_END: - for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) - instr[i] = '\0'; - i++; - input_x = i % box_width; - scroll = i - input_x; - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - continue; - case '\002': - case KEY_LEFT: - if (input_x || scroll) { - if (!input_x) { - int oldscroll = scroll; - scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1); - input_x = oldscroll - 1 - scroll; - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - } else { - input_x--; - wmove(dialog, box_y, input_x + box_x); - } - } else - beep(); - continue; - case '\006': - case KEY_RIGHT: - if ( scroll+input_x < MAX_LEN - && (flen < 0 || scroll+input_x < flen) - ) { - if (!instr[scroll+input_x]) - instr[scroll+input_x] = ' '; - if (input_x == box_width-1) { - scroll++; - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - } - else { - wmove(dialog, box_y, input_x + box_x); - waddch(dialog, instr[scroll+input_x]); - input_x++; - } - } else - beep(); /* Alarm user about overflow */ - continue; - case '\b': - case '\177': - case KEY_BACKSPACE: - erase_it: - if (input_x || scroll) { - i = strlen(instr); - memmove(instr+scroll+input_x-1, instr+scroll+input_x, i-(scroll+input_x)+1); - if (!input_x) { - int oldscroll = scroll; - scroll = scroll < box_width-1 ? 0 : scroll-(box_width-1); - input_x = oldscroll - 1 - scroll; - } else - input_x--; - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - } else - beep(); - continue; - case '\004': - case KEY_DC: - for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) - instr[i] = '\0'; - i++; - if (i == 0) { - beep(); - continue; - } - memmove(instr+scroll+input_x, instr+scroll+input_x+1, i-(scroll+input_x)); - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - continue; - default: - if (CCEQ(key, erase_char)) - goto erase_it; - if (CCEQ(key, kill_char)) - goto kill_it; - if (key < 0x100 && isprint(key)) { - for (i = strlen(instr) - 1; i >= scroll + input_x && instr[i] == ' '; i--) - instr[i] = '\0'; - i++; - if (i < MAX_LEN && (flen < 0 || scroll+input_x < flen)) { - if (flen < 0 || i < flen) - memmove(instr+scroll+input_x+1, instr+scroll+input_x, i-(scroll+input_x)); - instr[scroll+input_x] = key; - if (input_x == box_width-1 && (flen < 0 || i < flen)) - scroll++; - else - input_x++; - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, FALSE, attr_mask); - } else - beep(); /* Alarm user about overflow */ - continue; - } - } - } -ret: - redraw_field(dialog, box_y, box_x, flen, box_width, instr, input_x, scroll, attr, old_attr, TRUE, attr_mask); - wrefresh(dialog); - strcpy(result, instr); - return key; -} - -static void -redraw_field(WINDOW *dialog, int box_y, int box_x, int flen, int box_width, unsigned char instr[], int input_x, int scroll, chtype attr, chtype old_attr, int fexit, int attr_mask) -{ - int i, fix_len; - - wattrset(dialog, fexit ? old_attr : attr); - wmove(dialog, box_y, box_x); - fix_len = flen >= 0 ? MIN(flen-scroll,box_width) : box_width; - for (i = 0; i < fix_len; i++) - waddch(dialog, instr[scroll+i] ? ((attr_mask & DITEM_NO_ECHO) ? '*' : instr[scroll+i]) : ' '); - wattrset(dialog, old_attr); - for ( ; i < box_width; i++) - waddch(dialog, instr[scroll+i] ? ((attr_mask & DITEM_NO_ECHO) ? '*' : instr[scroll+i]) : ' '); - wmove(dialog, box_y, input_x + box_x); -} |