ncurses 5.3
[ncurses.git] / test / lrtest.c
index 1716899071def4fe94b76ee0d0d1580a7f88118b..78dcaad2dca82bc0f19a012ecb4be981c2a3c430 100644 (file)
 /*
  * Test lower-right-hand corner access
  *
- * by Eric S. Raymond <esr@thyrsus.com>
+ * originally by Eric S. Raymond <esr@thyrsus.com>, written for animation
+ * and resizing -TD
  *
  * This can't be part of the ncurses test-program, because ncurses rips off the
  * bottom line to do labels.
  *
- * $Id: lrtest.c,v 0.6 1997/04/26 23:47:42 tom Exp $
+ * $Id: lrtest.c,v 1.19 2002/07/13 16:55:50 tom Exp $
  */
 
 #include <test.priv.h>
 
+typedef struct {
+    int y, x, mode, dir, inc;
+    chtype value;
+} MARK;
+
+/*
+ * Make a couple of markers go 'round the border to demonstrate that we can
+ * really write to all positions properly.
+ */
+static void
+show(MARK * m)
+{
+    mvaddch(m->y, m->x, m->value);
+    if (m->mode == 0) {                /* along the x-direction */
+       m->x += m->inc;
+       if (m->x >= COLS) {
+           m->x = COLS - 1;
+           m->inc = -m->dir * m->inc;
+           m->y += m->inc;
+           m->mode = 1;
+       } else if (m->x < 0) {
+           m->x = 0;
+           m->inc = -m->dir * m->inc;
+           m->y += m->inc;
+           m->mode = 1;
+       }
+    } else {                   /* along the y-direction */
+       m->y += m->inc;
+       if (m->y >= LINES) {
+           m->y = LINES - 1;
+           m->inc = m->dir * m->inc;
+           m->x += m->inc;
+           m->mode = 0;
+       } else if (m->y < 0) {
+           m->y = 0;
+           m->inc = m->dir * m->inc;
+           m->x += m->inc;
+           m->mode = 0;
+       }
+    }
+}
+
 int
 main(
        int argc GCC_UNUSED,
-       char *argv[] GCC_UNUSED)
+       char *argv[]GCC_UNUSED)
 {
+    static MARK marks[] =
+    {
+       {0, 0, 0, -1, 1, '+' | A_BOLD},
+       {0, 0, 1, 1, 2, 'X'},
+       {0, 0, 1, -1, 3, 'Y'},
+       {0, 8, 0, -1, 1, '+' | A_BOLD},
+       {0, 9, 0, -1, 1, '+' | A_BOLD},
+       {1, 0, 1, 1, 1, '*' | A_REVERSE},
+       {2, 0, 1, 1, 1, '*' | A_REVERSE}
+    };
+
+    setlocale(LC_ALL, "");
+
     initscr();
+    noecho();
+    cbreak();
+    nodelay(stdscr, TRUE);
+    curs_set(0);
 
-    move(LINES/2-1, 4);
-    if (!has_ic())
-    {
+#ifdef KEY_RESIZE
+    keypad(stdscr, TRUE);
+  restart:
+#endif
+    move(LINES / 2 - 1, 4);
+    if (!(has_ic()
+    /* see PutCharLR() */
+         || auto_right_margin
+         || (enter_am_mode && exit_am_mode))) {
        addstr("Your terminal lacks the capabilities needed to address the\n");
-       move(LINES/2, 4);
+       move(LINES / 2, 4);
        addstr("lower-right-hand corner of the screen.\n");
-    }
-    else
-    {
+    } else {
        addstr("This is a test of access to the lower right corner.\n");
-       move(LINES/2, 4);
+       move(LINES / 2, 4);
        addstr("If the top of the box is missing, the test failed.\n");
-       move(LINES/2+1, 4);
+       move(LINES / 2 + 1, 4);
        addstr("Please report this (with a copy of your terminfo entry).\n");
-       move(LINES/2+2, 4);
-       addstr("to the ncurses maintainers, at ncurses@bsdi.com.\n");
+       move(LINES / 2 + 2, 4);
+       addstr("to the ncurses maintainers, at bug-ncurses@gnu.org.\n");
     }
 
-    box(stdscr, 0, 0);
-    move(LINES-1, COLS-1);
+    for (;;) {
+       int ch;
+       unsigned n;
+
+       box(stdscr, 0, 0);
+       for (n = 0; n < SIZEOF(marks); n++) {
+           show(&marks[n]);
+       }
 
-    refresh();
+       if ((ch = getch()) > 0) {
+           if (ch == 'q')
+               break;
+           else if (ch == 's')
+               nodelay(stdscr, FALSE);
+           else if (ch == ' ')
+               nodelay(stdscr, TRUE);
+#ifdef TRACE
+           else if (ch == 'T')
+               trace(0);
+           else if (ch == 't')
+               trace(TRACE_CALLS|TRACE_ICALLS|TRACE_UPDATE);
+#endif
+#ifdef KEY_RESIZE
+           else if (ch == KEY_RESIZE) {
+               for (n = 0; n < SIZEOF(marks); n++) {
+                   if (marks[n].mode == 0) {   /* moving along x-direction */
+                       if (marks[n].y)
+                           marks[n].y = LINES - 1;
+                   } else {
+                       if (marks[n].x)
+                           marks[n].x = COLS - 1;
+                   }
+               }
+               flash();
+               erase();
+               wrefresh(curscr);
+               goto restart;
+           }
+#endif
+       }
+       napms(50);
+       refresh();
+    }
 
-    getch();
+    curs_set(1);
     endwin();
-    return 0;
+    ExitProgram(EXIT_SUCCESS);
 }
 
 /* lrtest.c ends here */