ncurses 6.1 - patch 20180303
[ncurses.git] / test / edit_field.c
index c3de823b618d8104ce0b0e632d91ed115e603ba8..72ddc4e7fb80b55e9b7dad5a60916ee0ce25f2f2 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 2003-2013,2014 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.23 2014/07/26 08:30:51 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 <edit_field.h>
+#include <popup_msg.h>
 
 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,7 +244,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 +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;
@@ -389,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:
@@ -494,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);