X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=test%2Fedit_field.c;h=72ddc4e7fb80b55e9b7dad5a60916ee0ce25f2f2;hp=506d08ae0396ae4fa2cc9cf568e7cf067b200b84;hb=2017ab0e60ca857accae38a01252e0cbdf5f1efe;hpb=e2dee48666d83c609f7ecced6203ecfdc94e36aa diff --git a/test/edit_field.c b/test/edit_field.c index 506d08ae..72ddc4e7 100644 --- a/test/edit_field.c +++ b/test/edit_field.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 2003-2011,2013 Free Software Foundation, Inc. * + * Copyright (c) 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 +26,7 @@ * authorization. * ****************************************************************************/ /* - * $Id: edit_field.c,v 1.22 2013/09/28 22:02:17 tom Exp $ + * $Id: edit_field.c,v 1.28 2017/06/24 23:10:08 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 +40,7 @@ #if USE_LIBFORM #include +#include static struct { int code; @@ -169,123 +170,43 @@ 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); + sprintf(msg, "%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; @@ -295,25 +216,25 @@ offset_in_field(FORM * form) } 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,8 +244,9 @@ 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); if (ptr == 0) { int rows, cols, frow, fcol, nrow, nbuf; @@ -336,6 +258,10 @@ init_edit_field(FIELD * f, char *value) ptr->row_lengths = typeCalloc(int, (size_t) nrow + 1); } } + if (value == 0) { + value = empty; + *value = '\0'; + } set_field_userptr(f, (void *) ptr); set_field_buffer(f, 0, value); /* will be formatted */ set_field_buffer(f, 1, value); /* will be unformatted */ @@ -343,7 +269,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; @@ -384,7 +310,7 @@ edit_field(FORM * form, int *result) length = before_off; break; case REQ_CLR_EOL: - if (before_row + 1 == before->rows) + if ((int) (before_row + 1) == (int) (before->rows)) length = before_off; break; case REQ_CLR_FIELD: @@ -489,6 +415,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);