X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Fedit_field.c;h=b2b2084593576ad08907c41a8777fab74b350303;hp=8c58cd6a6bf5d25ef503ad1bf3e0c34aab68eb78;hb=3e91848cbe3dad23fdb60962fa9b678592591c34;hpb=d7e4a265b50f6fddbad20ea238fdc05a35cbdc2f diff --git a/test/edit_field.c b/test/edit_field.c index 8c58cd6a..b2b20845 100644 --- a/test/edit_field.c +++ b/test/edit_field.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 2003-2013,2014 Free Software Foundation, Inc. * + * Copyright 2019,2020 Thomas E. Dickey * + * Copyright 2003-2014,2017 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 * @@ -26,7 +27,7 @@ * authorization. * ****************************************************************************/ /* - * $Id: edit_field.c,v 1.24 2014/09/05 08:39:52 tom Exp $ + * $Id: edit_field.c,v 1.31 2020/02/02 23:34:34 tom Exp $ * * A wrapper for form_driver() which keeps track of the user's editing changes * for each field, and makes the resulting length available as a @@ -40,6 +41,7 @@ #if USE_LIBFORM #include +#include static struct { int code; @@ -169,151 +171,71 @@ static struct { } }; -static WINDOW *old_window; - -static void -begin_popup(void) -{ - doupdate(); - old_window = dupwin(curscr); -} - -static void -end_popup(void) -{ - touchwin(old_window); - wnoutrefresh(old_window); - doupdate(); - delwin(old_window); -} - /* * Display a temporary window listing the keystroke-commands we recognize. */ void help_edit_field(void) { - int x0 = 4; - int y0 = 2; - int y1 = 0; - int y2 = 0; - int wide = COLS - ((x0 + 1) * 2); - int high = LINES - ((y0 + 1) * 2); - WINDOW *help = newwin(high, wide, y0, x0); - WINDOW *data = newpad(2 + SIZEOF(commands), wide - 4); + int used = 0; unsigned n; - int ch = ERR; + char **msgs = typeCalloc(char *, 3 + SIZEOF(commands)); - begin_popup(); - - keypad(help, TRUE); - keypad(data, TRUE); - waddstr(data, "Defined form edit/traversal keys:\n"); + msgs[used++] = strdup("Defined form edit/traversal keys:"); for (n = 0; n < SIZEOF(commands); ++n) { + char *msg; const char *name; + const char *code = keyname(commands[n].code); + size_t need = 5; #ifdef NCURSES_VERSION if ((name = form_request_name(commands[n].result)) == 0) #endif name = commands[n].help; - wprintw(data, "%s -- %s\n", - keyname(commands[n].code), - name != 0 ? name : commands[n].help); + need = 5 + strlen(code) + strlen(name); + msg = typeMalloc(char, need); + _nc_SPRINTF(msg, _nc_SLIMIT(need) "%s -- %s", code, name); + msgs[used++] = msg; } - waddstr(data, "Arrow keys move within a field as you would expect."); - y2 = getcury(data); - - 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) - --y1; - else - beep(); - break; - case CTRL('N'): - case KEY_DOWN: - if (y1 < y2) - ++y1; - else - beep(); - break; - default: - beep(); - break; - case ERR: - break; - } - werase(help); - box(help, 0, 0); - wnoutrefresh(help); - pnoutrefresh(data, y1, 0, y0 + 1, x0 + 1, high, wide); - doupdate(); - } while ((ch = wgetch(data)) != ERR && ch != QUIT && ch != ESCAPE); - werase(help); - wrefresh(help); - delwin(help); - delwin(data); - - end_popup(); + msgs[used++] = + strdup("Arrow keys move within a field as you would expect."); + msgs[used] = 0; + popup_msg2(stdscr, msgs); + for (n = 0; msgs[n] != 0; ++n) { + free(msgs[n]); + } + free(msgs); } static int -offset_in_field(FORM * form) +offset_in_field(FORM *form) { FIELD *field = current_field(form); int currow, curcol; form_getyx(form, currow, curcol); - return curcol + currow * field->dcols; + return curcol + currow * (int) field->dcols; } static void -inactive_field(FIELD * f) +inactive_field(FIELD *f) { set_field_back(f, field_attrs(f)->background); } FieldAttrs * -field_attrs(FIELD * f) +field_attrs(FIELD *f) { return (FieldAttrs *) field_userptr(f); } static int -buffer_length(FIELD * f) +buffer_length(FIELD *f) { return field_attrs(f)->row_lengths[0]; } static void -set_buffer_length(FIELD * f, int length) +set_buffer_length(FIELD *f, int length) { field_attrs(f)->row_lengths[0] = length; } @@ -323,7 +245,7 @@ set_buffer_length(FIELD * f, int length) * keeping track of the actual lengths of lines in a multiline field. */ void -init_edit_field(FIELD * f, char *value) +init_edit_field(FIELD *f, char *value) { char empty[1]; FieldAttrs *ptr = field_attrs(f); @@ -348,7 +270,7 @@ init_edit_field(FIELD * f, char *value) } int -edit_field(FORM * form, int *result) +edit_field(FORM *form, int *result) { int ch = wgetch(form_win(form)); int status; @@ -404,12 +326,12 @@ edit_field(FORM * form, int *result) if (before_col > 0) { --length; } else if (before_row > 0) { - length -= before->cols + before_col; + length -= (int) before->cols + before_col; } } break; case REQ_NEW_LINE: - length += before->cols; + length += (int) before->cols; break; #if 0 /* FIXME: finish these */ @@ -494,6 +416,16 @@ edit_field(FORM * form, int *result) inactive_field(before); return status; } + +void +free_edit_field(FIELD *f) +{ + FieldAttrs *ptr = field_attrs(f); + if (ptr != 0) { + free(ptr->row_lengths); + free(ptr); + } +} #else extern void no_edit_field(void);