From 574a94bc3d70682bde48f7f10d3c12a58e581e27 Mon Sep 17 00:00:00 2001 From: "Thomas E. Dickey" Date: Sat, 23 Jun 2007 23:14:41 +0000 Subject: [PATCH] ncurses 5.6 - patch 20070623 + add test/demo_panels.c + implement opaque version of setsyx() and getsyx(). --- NEWS | 6 +- dist.mk | 4 +- include/curses.h.in | 37 +-- test/README | 32 +-- test/demo_panels.c | 660 ++++++++++++++++++++++++++++++++------------ test/ncurses.c | 18 +- test/test.priv.h | 10 +- 7 files changed, 543 insertions(+), 224 deletions(-) diff --git a/NEWS b/NEWS index 887a56c0..6f597740 100644 --- a/NEWS +++ b/NEWS @@ -25,7 +25,7 @@ -- sale, use or other dealings in this Software without prior written -- -- authorization. -- ------------------------------------------------------------------------------- --- $Id: NEWS,v 1.1137 2007/06/12 20:37:41 tom Exp $ +-- $Id: NEWS,v 1.1138 2007/06/23 21:28:00 tom Exp $ ------------------------------------------------------------------------------- This is a log of changes that ncurses has gone through since Zeyd started @@ -45,6 +45,10 @@ See the AUTHORS file for the corresponding full names. Changes through 1.9.9e did not credit all contributions; it is not possible to add this information. +20070623 + + add test/demo_panels.c + + implement opaque version of setsyx() and getsyx(). + 20070612 + corrected xterm+pcf2 terminfo modifiers for F1-F4, to match xterm #226 -TD diff --git a/dist.mk b/dist.mk index 3e01cad8..77237019 100644 --- a/dist.mk +++ b/dist.mk @@ -25,7 +25,7 @@ # use or other dealings in this Software without prior written # # authorization. # ############################################################################## -# $Id: dist.mk,v 1.597 2007/06/12 20:17:22 tom Exp $ +# $Id: dist.mk,v 1.598 2007/06/23 15:16:37 tom Exp $ # Makefile for creating ncurses distributions. # # This only needs to be used directly as a makefile by developers, but @@ -37,7 +37,7 @@ SHELL = /bin/sh # These define the major/minor/patch versions of ncurses. NCURSES_MAJOR = 5 NCURSES_MINOR = 6 -NCURSES_PATCH = 20070612 +NCURSES_PATCH = 20070623 # We don't append the patch to the version, since this only applies to releases VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR) diff --git a/include/curses.h.in b/include/curses.h.in index 46059a48..d16147fd 100644 --- a/include/curses.h.in +++ b/include/curses.h.in @@ -32,7 +32,7 @@ * and: Thomas E. Dickey 1996-on * ****************************************************************************/ -/* $Id: curses.h.in,v 1.173 2007/04/28 20:34:23 tom Exp $ */ +/* $Id: curses.h.in,v 1.174 2007/06/23 15:56:44 tom Exp $ */ #ifndef __NCURSES_H #define __NCURSES_H @@ -900,14 +900,19 @@ extern NCURSES_EXPORT(bool) is_syncok (WINDOW *); /* generated */ #define getmaxyx(win,y,x) (y = getmaxy(win), x = getmaxx(win)) #define getparyx(win,y,x) (y = getpary(win), x = getparx(win)) -#if !NCURSES_OPAQUE -#define getsyx(y,x) do { if(newscr->_leaveok) (y)=(x)=-1; \ - else getyx(newscr,(y),(x)); \ +#define getsyx(y,x) do { if (is_leaveok(newscr)) \ + (y) = (x) = -1; \ + else \ + getyx(newscr,(y), (x)); \ } while(0) -#define setsyx(y,x) do { if((y)==-1 && (x)==-1) newscr->_leaveok=TRUE; \ - else {newscr->_leaveok=FALSE;wmove(newscr,(y),(x));} \ + +#define setsyx(y,x) do { if ((y) == -1 && (x) == -1) \ + leaveok(newscr, TRUE); \ + else { \ + leaveok(newscr, FALSE); \ + wmove(newscr, (y), (x)); \ + } \ } while(0) -#endif /* NCURSES_OPAQUE */ #ifndef NCURSES_NOMACROS @@ -929,15 +934,15 @@ extern NCURSES_EXPORT(bool) is_syncok (WINDOW *); /* generated */ /* It seems older SYSV curses versions define these */ #if !NCURSES_OPAQUE -#define getattrs(win) ((win)?(win)->_attrs:A_NORMAL) -#define getcurx(win) ((win)?(win)->_curx:ERR) -#define getcury(win) ((win)?(win)->_cury:ERR) -#define getbegx(win) ((win)?(win)->_begx:ERR) -#define getbegy(win) ((win)?(win)->_begy:ERR) -#define getmaxx(win) ((win)?((win)->_maxx + 1):ERR) -#define getmaxy(win) ((win)?((win)->_maxy + 1):ERR) -#define getparx(win) ((win)?(win)->_parx:ERR) -#define getpary(win) ((win)?(win)->_pary:ERR) +#define getattrs(win) ((win) ? (win)->_attrs : A_NORMAL) +#define getcurx(win) ((win) ? (win)->_curx : ERR) +#define getcury(win) ((win) ? (win)->_cury : ERR) +#define getbegx(win) ((win) ? (win)->_begx : ERR) +#define getbegy(win) ((win) ? (win)->_begy : ERR) +#define getmaxx(win) ((win) ? ((win)->_maxx + 1) : ERR) +#define getmaxy(win) ((win) ? ((win)->_maxy + 1) : ERR) +#define getparx(win) ((win) ? (win)->_parx : ERR) +#define getpary(win) ((win) ? (win)->_pary : ERR) #endif /* NCURSES_OPAQUE */ #define wstandout(win) (wattrset(win,A_STANDOUT)) diff --git a/test/README b/test/README index a2273cd3..8aa6234f 100644 --- a/test/README +++ b/test/README @@ -25,7 +25,7 @@ -- sale, use or other dealings in this Software without prior written -- -- authorization. -- ------------------------------------------------------------------------------- --- $Id: README,v 1.31 2007/06/09 23:03:16 tom Exp $ +-- $Id: README,v 1.33 2007/06/23 21:49:40 tom Exp $ ------------------------------------------------------------------------------- The programs in this directory are designed to test your newest toy :-) @@ -241,7 +241,7 @@ attroff test: echochar filter gdc ncurses tclock attron test: bs echochar filter gdc ncurses attrset test: bs firework gdc hanoi ncurses rain tclock testaddch testcurs baudrate lib: ncurses -beep test: blue bs cardfile chgat demo_forms demo_menus edit_field hanoi inch_wide inchs ins_wide inserts knight movewindow ncurses tclock testcurs view xmas +beep test: blue bs cardfile chgat demo_forms demo_menus demo_panels edit_field hanoi inch_wide inchs ins_wide inserts knight movewindow ncurses tclock testcurs view xmas bkgd test: background cardfile demo_forms ncurses tclock view bkgdset test: background ncurses testaddch bkgrnd test: ncurses @@ -254,7 +254,7 @@ border_set - box test: cardfile chgat demo_forms demo_menus demo_panels edit_field inch_wide inchs ins_wide inserts lrtest ncurses newdemo redraw testcurs box_set test: ncurses can_change_color test: ncurses -cbreak test: background blue bs cardfile chgat color_set demo_altkeys demo_defkey demo_forms demo_keyok demo_menus ditto filter firework foldkeys gdc hanoi hashtest inch_wide inchs ins_wide inserts knight lrtest movewindow ncurses newdemo tclock testcurs view worm xmas +cbreak test: background blue bs cardfile chgat color_set demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_panels ditto filter firework foldkeys gdc hanoi hashtest inch_wide inchs ins_wide inserts knight lrtest movewindow ncurses newdemo tclock testcurs view worm xmas chgat test: chgat clear test: blue bs gdc ncurses testcurs xmas clearok test: bs knight @@ -283,7 +283,7 @@ echo test: bs hanoi ncurses testcurs testscanw echo_wchar test: ncurses echochar test: echochar ncurses endwin test: background blue bs cardfile chgat color_set demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_panels ditto dots_mvcur echochar filter firework firstlast foldkeys gdc hanoi hashtest inch_wide inchs ins_wide inserts keynames knight lrtest movewindow ncurses newdemo rain redraw tclock testaddch testcurs testscanw view worm xmas -erase test: cardfile demo_menus demo_panels filter firework firstlast hanoi lrtest ncurses tclock testcurs +erase test: cardfile demo_menus filter firework firstlast hanoi lrtest ncurses tclock testcurs erasechar lib: ncurses erasewchar - filter test: filter @@ -292,8 +292,8 @@ flushinp test: ncurses newdemo testcurs get_wch - get_wstr - getattrs - -getbegx test: chgat demo_menus movewindow ncurses newdemo redraw testcurs -getbegy test: chgat demo_menus movewindow ncurses newdemo redraw testcurs +getbegx test: chgat demo_menus demo_panels movewindow ncurses newdemo redraw testcurs +getbegy test: chgat demo_menus demo_panels movewindow ncurses newdemo redraw testcurs getbkgd test: ncurses getbkgrnd test: ncurses getcchar test: ncurses view @@ -345,12 +345,12 @@ is_cleared - is_idcok - is_idlok - is_immedok - -is_keypad - +is_keypad test: ncurses is_leaveok - is_linetouched lib: form is_nodelay - is_notimeout - -is_scrollok - +is_scrollok test: ncurses is_syncok - is_term_resized - is_wintouched lib: ncurses @@ -360,7 +360,7 @@ key_name test: key_names ncurses keybound test: demo_altkeys demo_defkey keyname test: demo_altkeys demo_defkey demo_keyok demo_menus edit_field foldkeys keynames movewindow ncurses redraw testcurs view progs: tic keyok test: demo_keyok foldkeys -keypad test: bs cardfile chgat demo_altkeys demo_defkey demo_forms demo_keyok demo_menus edit_field filter firework foldkeys hashtest inch_wide inchs ins_wide inserts keynames knight lrtest movewindow ncurses redraw tclock testcurs testscanw view +keypad test: bs cardfile chgat demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_panels edit_field filter firework foldkeys hashtest inch_wide inchs ins_wide inserts keynames knight lrtest movewindow ncurses redraw tclock testcurs testscanw view killchar lib: ncurses killwchar - leaveok test: hanoi @@ -450,7 +450,7 @@ mvwinsnstr test: inserts mvwinsstr test: inserts testcurs mvwinstr - mvwinwstr - -mvwprintw test: chgat inch_wide inchs ncurses testcurs +mvwprintw test: chgat demo_panels inch_wide inchs ncurses testcurs mvwscanw test: testcurs mvwvline test: ins_wide inserts movewindow mvwvline_set - @@ -462,7 +462,7 @@ newwin test: cardfile chgat demo_defkey demo_forms demo_keyok demo_menus demo nl test: demo_forms ncurses rain testcurs nocbreak test: testcurs nodelay test: firework gdc lrtest ncurses newdemo rain tclock view xmas -noecho test: background bs cardfile chgat color_set demo_altkeys demo_defkey demo_forms demo_keyok demo_menus ditto firework firstlast foldkeys gdc hanoi hashtest inch_wide inchs ins_wide inserts knight lrtest movewindow ncurses rain redraw tclock testcurs view worm xmas +noecho test: background bs cardfile chgat color_set demo_altkeys demo_defkey demo_forms demo_keyok demo_menus demo_panels ditto firework firstlast foldkeys gdc hanoi hashtest inch_wide inchs ins_wide inserts knight lrtest movewindow ncurses rain redraw tclock testcurs view worm xmas nofilter - nonl test: bs demo_forms hashtest movewindow ncurses view worm xmas noqiflush - @@ -606,7 +606,7 @@ wdeleteln test: testcurs wecho_wchar lib: ncurses wechochar lib: ncurses wenclose lib: form -werase test: cardfile demo_forms demo_menus edit_field firstlast knight ncurses newdemo testcurs xmas +werase test: cardfile demo_forms demo_menus demo_panels edit_field firstlast knight ncurses newdemo testcurs xmas wget_wch test: ins_wide ncurses wget_wstr - wgetbkgrnd lib: ncurses @@ -661,12 +661,12 @@ del_panel test: demo_panels ncurses hide_panel test: demo_panels ncurses move_panel test: demo_panels ncurses new_panel test: cardfile demo_panels ncurses -panel_above - -panel_below - -panel_hidden - +panel_above test: demo_panels +panel_below test: demo_panels +panel_hidden test: demo_panels panel_userptr test: demo_panels ncurses panel_window test: cardfile demo_panels ncurses -replace_panel - +replace_panel test: demo_panels set_panel_userptr test: demo_panels ncurses show_panel test: demo_panels ncurses top_panel test: cardfile demo_panels ncurses diff --git a/test/demo_panels.c b/test/demo_panels.c index 5723263c..0ac70407 100755 --- a/test/demo_panels.c +++ b/test/demo_panels.c @@ -26,17 +26,10 @@ * authorization. * ****************************************************************************/ /* - * $Id: demo_panels.c,v 1.5 2007/05/26 22:35:46 tom Exp $ + * $Id: demo_panels.c,v 1.16 2007/06/23 21:24:23 tom Exp $ * * Demonstrate a variety of functions from the panel library. - * Thomas Dickey - 2003/4/26 */ -/* -panel_above - -panel_below - -panel_hidden - -replace_panel - -*/ #include @@ -48,31 +41,142 @@ typedef void (*InitPanel) (void); typedef void (*FillPanel) (PANEL *); static bool use_colors; +static FILE *log_in; +static FILE *log_out; + +static void +close_input(void) +{ + if (log_in != 0) { + fclose(log_in); + log_in = 0; + } +} -static NCURSES_CONST char *mod[] = +static void +close_output(void) { - "test ", - "TEST ", - "(**) ", - "*()* ", - "<--> ", - "LAST " -}; - -/*+------------------------------------------------------------------------- - saywhat(text) ---------------------------------------------------------------------------*/ + if (log_out != 0) { + fclose(log_out); + log_out = 0; + } +} + +static WINDOW * +statusline(void) +{ + WINDOW *result = stdscr; + + wmove(result, LINES - 1, 0); + wclrtoeol(result); + return result; +} + +static void +pflush(void) +{ + update_panels(); + doupdate(); +} + static void saywhat(NCURSES_CONST char *text) { - wmove(stdscr, LINES - 1, 0); - wclrtoeol(stdscr); + WINDOW *win = statusline(); if (text != 0 && *text != '\0') { - waddstr(stdscr, text); - waddstr(stdscr, "; "); + waddstr(win, text); + waddstr(win, "; "); } - waddstr(stdscr, "press any key to continue"); -} /* end of saywhat */ + waddstr(win, "press any key to continue"); +} + +static void +show_position(NCURSES_CONST char *text, + NCURSES_CONST char *also, + int which, + int ypos, + int xpos) +{ + WINDOW *win = statusline(); + + wprintw(win, "%s for panel %d now %d,%d%s", text, which, ypos, xpos, also); + wmove(stdscr, ypos, xpos); +} + +static int +get_position(NCURSES_CONST char *text, + NCURSES_CONST char *also, + int which, + int *xpos, + int *ypos) +{ + int result = 0; + int x1, y1; + WINDOW *win; + + getyx(stdscr, y1, x1); + win = statusline(); + + show_position(text, also, which, y1, x1); + + if (log_in != 0) { + (void) wgetch(stdscr); + if (fscanf(log_in, "@%d,%d\n", &y1, &x1) == 2) { + result = 1; + } else { + result = -1; + } + } else { + + switch (wgetch(stdscr)) { + case QUIT: + case ESCAPE: + case ERR: + result = -1; + break; + case ' ': + result = 1; + break; + case KEY_UP: + if (y1 > 0) { + --y1; + } else { + beep(); + } + break; + case KEY_DOWN: + if (y1 < getmaxy(stdscr)) { + ++y1; + } else { + beep(); + } + break; + case KEY_LEFT: + if (x1 > 0) { + --x1; + } else { + beep(); + } + break; + case KEY_RIGHT: + if (x1 < getmaxx(stdscr)) { + ++x1; + } else { + beep(); + } + break; + } + } + + wmove(stdscr, y1, x1); + if (result > 0) { + if (log_out) + fprintf(log_out, "@%d,%d\n", y1, x1); + *ypos = y1; + *xpos = x1; + } + return result; +} static PANEL * mkpanel(short color, int rows, int cols, int tly, int tlx) @@ -82,10 +186,13 @@ mkpanel(short color, int rows, int cols, int tly, int tlx) char *userdata = malloc(3); if ((win = newwin(rows, cols, tly, tlx)) != 0) { + keypad(win, TRUE); if ((pan = new_panel(win)) == 0) { delwin(win); } else if (use_colors) { - short fg = (color == COLOR_BLUE) ? COLOR_WHITE : COLOR_BLACK; + short fg = ((color == COLOR_BLUE) + ? COLOR_WHITE + : COLOR_BLACK); short bg = color; init_pair(color, fg, bg); @@ -99,30 +206,123 @@ mkpanel(short color, int rows, int cols, int tly, int tlx) return pan; } -/*+------------------------------------------------------------------------- - rmpanel(pan) ---------------------------------------------------------------------------*/ static void -rmpanel(PANEL * pan) +remove_panel(PANEL ** pans, int which) { - WINDOW *win = panel_window(pan); - del_panel(pan); - delwin(win); -} /* end of rmpanel */ + if (pans[which] != 0) { + PANEL *pan = pans[which]; + WINDOW *win = panel_window(pan); + char *user = panel_userptr(pan); + + free(user); + del_panel(pan); + delwin(win); + + pans[which] = 0; + } +} + +#define MIN(a,b) ((a) < (b) ? (a) : (b)) +#define ABS(a) ((a) < 0 ? -(a) : (a)) -/*+------------------------------------------------------------------------- - pflush() ---------------------------------------------------------------------------*/ static void -pflush(void) +create_panel(PANEL ** pans, int which, FillPanel myFill) { - update_panels(); - doupdate(); -} /* end of pflush */ + PANEL *pan = 0; + int code; + int pair = which; + short fg = (pair == COLOR_BLUE) ? COLOR_WHITE : COLOR_BLACK; + short bg = pair; + int x0, y0, x1, y1; + + init_pair(pair, fg, bg); + + /* remove the old panel, if any */ + remove_panel(pans, which); + + /* get the position of one corner */ + wmove(stdscr, getmaxy(stdscr) / 2, getmaxx(stdscr) / 2); + getyx(stdscr, y0, x0); + while ((code = get_position("First corner", "", which, &x0, &y0)) == 0) { + ; + } + + if (code > 0) { + char also[80]; + sprintf(also, " (first %d,%d)", y0, x0); + /* get the position of the opposite corner */ + while ((code = get_position("Opposite corner", + also, which, &x1, &y1)) == 0) { + ; + } + + if (code > 0) { + int tly = MIN(y0, y1); + int tlx = MIN(x0, x1); + pan = mkpanel(pair, ABS(y1 - y0) + 1, ABS(x1 - x0) + 1, tly, tlx); + /* finish */ + myFill(pan); + pans[which] = pan; + pflush(); + wmove(stdscr, y1, x1); + } + } +} + +static void +my_move_panel(PANEL ** pans, int which) +{ + int code; + int y0, x0; + int y1, x1; + WINDOW *win = panel_window(pans[which]); + char also[80]; + + getbegyx(win, y0, x0); + sprintf(also, " (start %d,%d)", y0, x0); + wmove(stdscr, y0, x0); + while ((code = get_position("Move panel", also, which, &x1, &y1)) == 0) { + ; + } + if (code > 0) { + move_panel(pans[which], y1, x1); + } +} + +static void +resize_panel(PANEL ** pans, int which, FillPanel myFill) +{ + int code; + int y0, x0; + int y1, x1; + WINDOW *win = panel_window(pans[which]); + char also[80]; + + getbegyx(win, y0, x0); + sprintf(also, " (start %d,%d)", y0, x0); + wmove(stdscr, y0, x0); + while ((code = get_position("Resize panel", also, which, &x1, &y1)) == 0) { + ; + } + if (code > 0) { + WINDOW *next = newwin(ABS(y1 - y0) + 1, + ABS(x1 - x0) + 1, + MIN(y0, y1), + MIN(x0, x1)); + if (next != 0) { + keypad(next, TRUE); + if (use_colors) { + wbkgdset(next, (chtype) (COLOR_PAIR(which) | ' ')); + } else { + wbkgdset(next, A_BOLD | ' '); + } + replace_panel(pans[which], next); + myFill(pans[which]); + delwin(win); + } + } +} -/*+------------------------------------------------------------------------- - fill_panel(win) ---------------------------------------------------------------------------*/ static void init_panel(void) { @@ -202,164 +402,258 @@ fill_wide_panel(PANEL * pan) #define MAX_PANELS 5 +static int +which_panel(PANEL * px[MAX_PANELS + 1], PANEL * pan) +{ + int result = 0; + int j; + + for (j = 1; j <= MAX_PANELS; ++j) { + if (px[j] == pan) { + result = j; + break; + } + } + return result; +} + static void -canned_panel(PANEL * px[MAX_PANELS + 1], NCURSES_CONST char *cmd) +show_panels(PANEL * px[MAX_PANELS + 1]) +{ + static const char *help[] = + { + "", + "Commands are letter/digit pairs. Digits are the panel number.", + "", + " b - put the panel on the bottom of the stack", + " c - create the panel", + " d - delete the panel", + " h - hide the panel", + " m - move the panel", + " r - resize the panel", + " s - show the panel", + " b - put the panel on the top of the stack" + }; + + struct { + bool valid; + bool hidden; + PANEL *above; + PANEL *below; + } table[MAX_PANELS + 1]; + + WINDOW *win; + PANEL *pan; + int j; + + for (j = 1; j <= MAX_PANELS; ++j) { + table[j].valid = (px[j] != 0); + if (table[j].valid) { + table[j].hidden = panel_hidden(px[j]); + table[j].above = panel_above(px[j]); + table[j].below = panel_below(px[j]); + } + } + + if ((win = newwin(LINES - 1, COLS, 0, 0)) != 0) { + keypad(win, TRUE); + if ((pan = new_panel(win)) != 0) { + werase(win); + mvwprintw(win, 0, 0, "Panels:\n"); + for (j = 1; j <= MAX_PANELS; ++j) { + if (table[j].valid) { + wprintw(win, " %d:", j); + if (table[j].hidden) { + waddstr(win, " hidden"); + } else { + if (table[j].above) { + wprintw(win, " above %d", + which_panel(px, table[j].above)); + } + if (table[j].below) { + wprintw(win, "%s below %d", + table[j].above ? "," : "", + which_panel(px, table[j].below)); + } + } + waddch(win, '\n'); + } + } + for (j = 0; j < (int) SIZEOF(help); ++j) { + if (wprintw(win, "%s\n", help[j]) == ERR) + break; + } + wgetch(win); + del_panel(pan); + pflush(); + } + delwin(win); + } +} + +static void +do_panel(PANEL * px[MAX_PANELS + 1], + NCURSES_CONST char *cmd, + FillPanel myFill) { int which = cmd[1] - '0'; + if (log_in != 0) { + pflush(); + (void) wgetch(stdscr); + } + saywhat(cmd); switch (*cmd) { + case 'b': + bottom_panel(px[which]); + break; + case 'c': + create_panel(px, which, myFill); + break; + case 'd': + remove_panel(px, which); + break; case 'h': hide_panel(px[which]); break; + case 'm': + my_move_panel(px, which); + break; + case 'r': + resize_panel(px, which, myFill); + break; case 's': show_panel(px[which]); break; case 't': top_panel(px[which]); break; - case 'b': - bottom_panel(px[which]); - break; - case 'd': - rmpanel(px[which]); - break; } - pflush(); - wgetch(stdscr); +} + +static bool +ok_letter(int ch) +{ + return isalpha(UChar(ch)) && strchr("bcdhmrst", ch) != 0; +} + +static bool +ok_digit(int ch) +{ + return isdigit(UChar(ch)) && (ch >= '1') && (ch - '0' <= MAX_PANELS); +} + +/* + * A command consists of one or more letter/digit pairs separated by a space. + * Digits are limited to 1..MAX_PANELS. + * + * End the command with a newline. Reject other characters. + */ +static bool +get_command(PANEL * px[MAX_PANELS + 1], char *buffer, int limit) +{ + int length = 0; + int y0, x0; + int c0, ch; + WINDOW *win; + + getyx(stdscr, y0, x0); + win = statusline(); + waddstr(win, "Command:"); + buffer[length = 0] = '\0'; + + if (log_in != 0) { + (void) wgetch(win); + if (fgets(buffer, limit - 3, log_in) != 0) { + length = strlen(buffer); + while (length > 0 && isspace(buffer[length - 1])) + buffer[--length] = '\0'; + } else { + close_input(); + } + } else { + c0 = 0; + for (;;) { + ch = wgetch(win); + if (ch == ERR || ch == QUIT || ch == ESCAPE) { + buffer[0] = '\0'; + break; + } else if (ch == '\n' || ch == KEY_ENTER) { + break; + } else if (ch == '?') { + show_panels(px); + } else if (length + 3 < limit) { + if (ch >= KEY_MIN) { + beep(); + } else if (ok_letter(UChar(ch))) { + if (isalpha(UChar(c0))) { + beep(); + } else if (isdigit(UChar(c0))) { + wprintw(win, " %c", ch); + buffer[length++] = ' '; + buffer[length++] = c0 = ch; + } else { + wprintw(win, "%c", ch); + buffer[length++] = c0 = ch; + } + } else if (ok_digit(ch)) { + if (isalpha(UChar(c0))) { + wprintw(win, "%c", ch); + buffer[length++] = c0 = ch; + } else { + beep(); + } + } else if (ch == ' ') { + if (isdigit(UChar(c0))) { + wprintw(win, "%c", ch); + buffer[length++] = c0 = ch; + } else { + beep(); + } + } else { + beep(); + } + } else { + beep(); + } + } + } + + wmove(stdscr, y0, x0); + + buffer[length] = '\0'; + if (log_out && length) { + fprintf(log_out, "%s\n", buffer); + } + return (length != 0); } static void -demo_panels(void (*myInit) (void), void (*myFill) (PANEL *)) +demo_panels(InitPanel myInit, FillPanel myFill) { int itmp; PANEL *px[MAX_PANELS + 1]; + char buffer[BUFSIZ]; scrollok(stdscr, FALSE); /* we don't want stdscr to scroll! */ refresh(); myInit(); - for (itmp = 1; itmp <= MAX_PANELS; ++itmp) - px[itmp] = 0; - - px[1] = mkpanel(COLOR_RED, - LINES / 2 - 2, - COLS / 8 + 1, - 0, - 0); - - px[2] = mkpanel(COLOR_GREEN, - LINES / 2 + 1, - COLS / 7, - LINES / 4, - COLS / 10); - - px[3] = mkpanel(COLOR_YELLOW, - LINES / 4, - COLS / 10, - LINES / 2, - COLS / 9); - - px[4] = mkpanel(COLOR_BLUE, - LINES / 2 - 2, - COLS / 8, - LINES / 2 - 2, - COLS / 3); - - px[5] = mkpanel(COLOR_MAGENTA, - LINES / 2 - 2, - COLS / 8, - LINES / 2, - COLS / 2 - 2); - - myFill(px[1]); - myFill(px[2]); - myFill(px[3]); - myFill(px[4]); - myFill(px[5]); - - hide_panel(px[4]); - hide_panel(px[5]); - pflush(); - saywhat(""); - wgetch(stdscr); - - saywhat("h3 s1 s2 s4 s5"); - move_panel(px[1], 0, 0); - hide_panel(px[3]); - show_panel(px[1]); - show_panel(px[2]); - show_panel(px[4]); - show_panel(px[5]); - pflush(); - wgetch(stdscr); - - canned_panel(px, "s1"); - canned_panel(px, "s2"); - - saywhat("m2"); - move_panel(px[2], LINES / 3 + 1, COLS / 8); - pflush(); - wgetch(stdscr); - - canned_panel(px, "s3"); - - saywhat("m3"); - move_panel(px[3], LINES / 4 + 1, COLS / 15); - pflush(); - wgetch(stdscr); - - canned_panel(px, "b3"); - canned_panel(px, "s4"); - canned_panel(px, "s5"); - canned_panel(px, "t3"); - canned_panel(px, "t1"); - canned_panel(px, "t2"); - canned_panel(px, "t3"); - canned_panel(px, "t4"); - - for (itmp = 0; itmp < 6; itmp++) { - WINDOW *w4 = panel_window(px[4]); - WINDOW *w5 = panel_window(px[5]); - - saywhat("m4"); - wmove(w4, LINES / 8, 1); - waddstr(w4, mod[itmp]); - move_panel(px[4], LINES / 6, itmp * (COLS / 8)); - wmove(w5, LINES / 6, 1); - waddstr(w5, mod[itmp]); - pflush(); - wgetch(stdscr); - - saywhat("m5"); - wmove(w4, LINES / 6, 1); - waddstr(w4, mod[itmp]); - move_panel(px[5], LINES / 3 - 1, (itmp * 10) + 6); - wmove(w5, LINES / 8, 1); - waddstr(w5, mod[itmp]); + memset(px, 0, sizeof(px)); + + while (get_command(px, buffer, sizeof(buffer))) { + int limit = strlen(buffer); + for (itmp = 0; itmp < limit; itmp += 3) { + do_panel(px, buffer + itmp, myFill); + } pflush(); - wgetch(stdscr); } - - saywhat("m4"); - move_panel(px[4], LINES / 6, itmp * (COLS / 8)); - pflush(); - wgetch(stdscr); - - canned_panel(px, "t5"); - canned_panel(px, "t2"); - canned_panel(px, "t1"); - canned_panel(px, "d2"); - canned_panel(px, "h3"); - canned_panel(px, "d1"); - canned_panel(px, "d4"); - canned_panel(px, "d5"); - canned_panel(px, "d3"); - - wgetch(stdscr); - - erase(); - endwin(); +#if NO_LEAKS + for (itmp = 1; itmp <= MAX_PANELS; ++itmp) { + remove_panel(px, itmp); + } +#endif } static void @@ -370,6 +664,8 @@ usage(void) "Usage: demo_panels [options]" ,"" ,"Options:" + ," -i file read commands from file" + ," -o file record commands in file" ," -m do not use colors" #if USE_WIDEC_SUPPORT ," -w use wide-characters in panels and background" @@ -389,8 +685,14 @@ main(int argc, char *argv[]) InitPanel myInit = init_panel; FillPanel myFill = fill_panel; - while ((c = getopt(argc, argv, "mw")) != EOF) { + while ((c = getopt(argc, argv, "i:o:mw")) != EOF) { switch (c) { + case 'i': + log_in = fopen(optarg, "r"); + break; + case 'o': + log_out = fopen(optarg, "w"); + break; case 'm': monochrome = TRUE; break; @@ -406,6 +708,9 @@ main(int argc, char *argv[]) } initscr(); + cbreak(); + noecho(); + keypad(stdscr, TRUE); use_colors = monochrome ? FALSE : has_colors(); if (use_colors) @@ -414,7 +719,10 @@ main(int argc, char *argv[]) demo_panels(myInit, myFill); endwin(); - return EXIT_SUCCESS; + close_input(); + close_output(); + + ExitProgram(EXIT_SUCCESS); } #else int diff --git a/test/ncurses.c b/test/ncurses.c index 204de46d..90497cde 100644 --- a/test/ncurses.c +++ b/test/ncurses.c @@ -40,7 +40,7 @@ AUTHOR Author: Eric S. Raymond 1993 Thomas E. Dickey (beginning revision 1.27 in 1996). -$Id: ncurses.c,v 1.289 2007/06/02 23:04:12 tom Exp $ +$Id: ncurses.c,v 1.291 2007/06/23 21:43:25 tom Exp $ ***************************************************************************/ @@ -3379,12 +3379,14 @@ FRAME WINDOW *wind; }; -#if defined(NCURSES_VERSION) && !NCURSES_OPAQUE -#define keypad_active(win) (win)->_use_keypad -#define scroll_active(win) (win)->_scroll +#if defined(NCURSES_VERSION) +#if NCURSES_VERSION_PATCH < 20070331 +#define is_keypad(win) (win)->_use_keypad +#define is_scrollok(win) (win)->_scroll +#endif #else -#define keypad_active(win) FALSE -#define scroll_active(win) FALSE +#define is_keypad(win) FALSE +#define is_scrollok(win) FALSE #endif /* We need to know if these flags are actually set, so don't look in FRAME. @@ -3396,7 +3398,7 @@ HaveKeypad(FRAME * curp) { WINDOW *win = (curp ? curp->wind : stdscr); (void) win; - return keypad_active(win); + return is_keypad(win); } static bool @@ -3404,7 +3406,7 @@ HaveScroll(FRAME * curp) { WINDOW *win = (curp ? curp->wind : stdscr); (void) win; - return scroll_active(win); + return is_scrollok(win); } static void diff --git a/test/test.priv.h b/test/test.priv.h index c8d88806..0ab41507 100644 --- a/test/test.priv.h +++ b/test/test.priv.h @@ -29,7 +29,7 @@ /**************************************************************************** * Author: Thomas E. Dickey 1996-on * ****************************************************************************/ -/* $Id: test.priv.h,v 1.66 2007/06/09 19:55:16 tom Exp $ */ +/* $Id: test.priv.h,v 1.67 2007/06/23 15:46:17 tom Exp $ */ #ifndef __TEST_PRIV_H #define __TEST_PRIV_H 1 @@ -191,10 +191,6 @@ #define NCURSES_EXT_FUNCS 0 #endif -#ifndef NCURSES_OPAQUE -#define NCURSES_OPAQUE 0 -#endif - #ifndef NEED_PTEM_H #define NEED_PTEM_H 0 #endif @@ -324,6 +320,10 @@ extern int optind; #define NCURSES_CH_T cchar_t #endif +#ifndef NCURSES_OPAQUE +#define NCURSES_OPAQUE 0 +#endif + #ifndef CCHARW_MAX #define CCHARW_MAX 5 #endif -- 2.44.0