X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Fedit_field.c;h=8a664e8ca9a47c84c1fd5a562d04dab9d6403c09;hp=780bdab891a993cc72715cc7efca8406067af5ca;hb=22fd3b236834311f1682b09d16eacec0d17f8683;hpb=a8987e73ec254703634802b4f7ee30d3a485524d diff --git a/test/edit_field.c b/test/edit_field.c index 780bdab8..8a664e8c 100644 --- a/test/edit_field.c +++ b/test/edit_field.c @@ -1,5 +1,32 @@ +/**************************************************************************** + * Copyright (c) 2003-2008,2011 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ /* - * $Id: edit_field.c,v 1.7 2003/05/17 23:16:13 tom Exp $ + * $Id: edit_field.c,v 1.17 2011/01/15 18:15:11 tom Exp $ * * A wrapper for form_driver() which keeps track of the user's editing changes * for each field, and makes the result available as a null-terminated string @@ -14,9 +41,6 @@ #include -#define MY_QUIT EDIT_FIELD('q') -#define MY_INS_MODE EDIT_FIELD('t') - static struct { int code; int result; @@ -77,6 +101,9 @@ static struct { { CTRL('S'), REQ_BEG_FIELD, "go to beginning of field" }, + { + CTRL('T'), MY_EDT_MODE, "toggle O_EDIT mode, clear field status", + }, { CTRL('U'), REQ_UP_FIELD, "move upward to field" }, @@ -102,7 +129,7 @@ static struct { CTRL(']'), MY_INS_MODE, "toggle REQ_INS_MODE/REQ_OVL_MODE", }, { - KEY_F(1), EDIT_FIELD('h'), "show this screen", + KEY_F(1), MY_HELP, "show this screen", }, { KEY_BACKSPACE, REQ_DEL_PREV, "delete previous character" @@ -181,7 +208,7 @@ help_edit_field(void) keypad(help, TRUE); keypad(data, TRUE); - waddstr(data, "Defined form-traversal keys:\n"); + waddstr(data, "Defined form edit/traversal keys:\n"); for (n = 0; n < SIZEOF(commands); ++n) { const char *name; #ifdef NCURSES_VERSION @@ -197,6 +224,32 @@ help_edit_field(void) do { switch (ch) { + case KEY_HOME: + y1 = 0; + break; + case KEY_END: + y1 = y2; + break; + case KEY_PREVIOUS: + case KEY_PPAGE: + if (y1 > 0) { + y1 -= high / 2; + if (y1 < 0) + y1 = 0; + } else { + beep(); + } + break; + case KEY_NEXT: + case KEY_NPAGE: + if (y1 < y2) { + y1 += high / 2; + if (y1 >= y2) + y1 = y2; + } else { + beep(); + } + break; case CTRL('P'): case KEY_UP: if (y1 > 0) @@ -235,7 +288,17 @@ static int offset_in_field(FORM * form) { FIELD *field = current_field(form); - return form->curcol + form->currow * field->dcols; + int currow, curcol; + + form_getyx(form, currow, curcol); + return curcol + currow * field->dcols; +} + +static void +inactive_field(FIELD * f) +{ + FieldAttrs *ptr = (FieldAttrs *) field_userptr(f); + set_field_back(f, ptr->background); } int @@ -244,21 +307,21 @@ edit_field(FORM * form, int *result) int ch = wgetch(form_win(form)); int status; FIELD *before; - FIELD *after; unsigned n; char lengths[80]; int length; char *buffer; - int before_row = form->currow; - int before_col = form->curcol; + int before_row; + int before_col; int before_off = offset_in_field(form); + form_getyx(form, before_row, before_col); before = current_field(form); set_field_back(before, A_NORMAL); if (ch <= KEY_MAX) { set_field_back(before, A_REVERSE); } else if (ch <= MAX_FORM_COMMAND) { - set_field_back(before, A_UNDERLINE); + inactive_field(before); } *result = ch; @@ -386,8 +449,8 @@ edit_field(FORM * form, int *result) set_field_buffer(before, 1, lengths); } - if ((after = current_field(form)) != before) - set_field_back(before, A_UNDERLINE); + if (current_field(form) != before) + inactive_field(before); return status; } #else