Author: Eric S. Raymond <esr@snark.thyrsus.com> 1993
Thomas E. Dickey (beginning revision 1.27 in 1996).
-$Id: ncurses.c,v 1.327 2008/09/06 17:31:44 tom Exp $
+$Id: ncurses.c,v 1.334 2008/12/20 17:13:27 tom Exp $
***************************************************************************/
*
****************************************************************************/
+#define NUM_GETCH_FLAGS 256
+typedef bool GetchFlags[NUM_GETCH_FLAGS];
+
static void
-setup_getch(WINDOW *win, bool flags[])
+setup_getch(WINDOW *win, GetchFlags flags)
{
keypad(win, flags['k']); /* should be redundant, but for testing */
meta(win, flags['m']); /* force this to a known state */
}
static void
-wgetch_help(WINDOW *win, bool flags[])
+init_getch(WINDOW *win, GetchFlags flags)
+{
+ memset(flags, FALSE, NUM_GETCH_FLAGS);
+ flags[UChar('k')] = (win == stdscr);
+ flags[UChar('m')] = TRUE;
+
+ setup_getch(win, flags);
+}
+
+static void
+wgetch_help(WINDOW *win, GetchFlags flags)
{
static const char *help[] =
{
int first_y, first_x;
int c;
int incount = 0;
- bool flags[256];
+ GetchFlags flags;
bool blocking = (delay < 0);
- memset(flags, FALSE, sizeof(flags));
- flags[UChar('k')] = (win == stdscr);
-
- setup_getch(win, flags);
+ init_getch(win, flags);
wtimeout(win, delay);
getyx(win, first_y, first_x);
}
#endif
(void) waddstr(win, keyname(c));
- } else if (c > 0x80) {
- unsigned c2 = (unsigned) (c & 0x7f);
- if (isprint(c2))
- (void) wprintw(win, "M-%c", UChar(c2));
- else
+ } else if (c >= 0x80) {
+ unsigned c2 = (unsigned) c;
+#if !(defined(NCURSES_VERSION) || defined(_XOPEN_CURSES))
+ /* at least Solaris SVR4 curses breaks unctrl(128), etc. */
+ c2 &= 0x7f;
+#endif
+ if (isprint(c))
+ (void) wprintw(win, "%c", UChar(c));
+ else if (c2 != UChar(c))
(void) wprintw(win, "M-%s", unctrl(c2));
+ else
+ (void) wprintw(win, "%s", unctrl(c2));
waddstr(win, " (high-half character)");
} else {
if (isprint(c))
}
wtimeout(win, -1);
+
+ if (!level)
+ init_getch(win, flags);
}
static int
int first_y, first_x;
wint_t c;
int incount = 0;
- bool flags[256];
+ GetchFlags flags;
bool blocking = (delay < 0);
int y, x, code;
char *temp;
- memset(flags, FALSE, sizeof(flags));
- flags[UChar('k')] = (win == stdscr);
-
- setup_getch(win, flags);
+ init_getch(win, flags);
wtimeout(win, delay);
getyx(win, first_y, first_x);
resize_wide_boxes(level, win);
}
#endif
- (void) waddstr(win, key_name((wchar_t) c));
+ (void) waddstr(win, keyname((wchar_t) c));
} else {
+ (void) waddstr(win, key_name((wchar_t) c));
if (c < 256 && iscntrl(c)) {
- (void) wprintw(win, "%s (control character)", unctrl(c));
+ (void) wprintw(win, " (control character)");
} else {
- wchar_t c2 = (wchar_t) c;
- waddnwstr(win, &c2, 1);
- (void) wprintw(win, " = %#x (printable character)", c);
+ (void) wprintw(win, " = %#x (printable character)",
+ (unsigned) c);
}
}
wgetch_wrap(win, first_y);
}
wtimeout(win, -1);
+
+ if (!level)
+ init_getch(win, flags);
}
static void
#if HAVE_SLK_COLOR
,"F/B -- cycle through foreground/background colors"
#endif
- ,"ESC -- return to main menu"
+ ,"ESC -- return to main menu"
,""
,"Note: if activating the soft keys causes your terminal to scroll up"
,"one line, your terminal auto-scrolls when anything is written to the"
} attrs_to_cycle[] = {
{ A_NORMAL, "normal" },
{ A_BOLD, "bold" },
+ { A_BLINK, "blink" },
{ A_REVERSE, "reverse" },
{ A_UNDERLINE, "underline" },
};
do {
if (C1)
nodelay(stdscr, TRUE);
- echochar(code | attr | COLOR_PAIR(pair));
+ echochar(colored_chtype(code, attr, pair));
if (C1) {
/* (yes, this _is_ crude) */
while ((reply = Getchar()) != ERR) {
*/
break;
default:
- addch(code | A_ALTCHARSET | attr | COLOR_PAIR(pair));
+ addch(colored_chtype(code, A_ALTCHARSET | attr, pair));
break;
}
} while (--count > 0);
mvaddstr(0, 20, "Display of the ACS Line-Drawing Set");
attroff(A_BOLD);
refresh();
- box(stdscr, 0, 0);
/* *INDENT-OFF* */
- mvhline(LINES / 2, 0, ACS_HLINE | attr, COLS);
- mvvline(0, COLS / 2, ACS_VLINE | attr, LINES);
- mvaddch(0, COLS / 2, ACS_TTEE | attr);
- mvaddch(LINES / 2, COLS / 2, ACS_PLUS | attr);
- mvaddch(LINES - 1, COLS / 2, ACS_BTEE | attr);
- mvaddch(LINES / 2, 0, ACS_LTEE | attr);
- mvaddch(LINES / 2, COLS - 1, ACS_RTEE | attr);
+ wborder(stdscr,
+ colored_chtype(ACS_VLINE, attr, pair),
+ colored_chtype(ACS_VLINE, attr, pair),
+ colored_chtype(ACS_HLINE, attr, pair),
+ colored_chtype(ACS_HLINE, attr, pair),
+ colored_chtype(ACS_ULCORNER, attr, pair),
+ colored_chtype(ACS_URCORNER, attr, pair),
+ colored_chtype(ACS_LLCORNER, attr, pair),
+ colored_chtype(ACS_LRCORNER, attr, pair));
+ mvhline(LINES / 2, 0, colored_chtype(ACS_HLINE, attr, pair), COLS);
+ mvvline(0, COLS / 2, colored_chtype(ACS_VLINE, attr, pair), LINES);
+ mvaddch(0, COLS / 2, colored_chtype(ACS_TTEE, attr, pair));
+ mvaddch(LINES / 2, COLS / 2, colored_chtype(ACS_PLUS, attr, pair));
+ mvaddch(LINES - 1, COLS / 2, colored_chtype(ACS_BTEE, attr, pair));
+ mvaddch(LINES / 2, 0, colored_chtype(ACS_LTEE, attr, pair));
+ mvaddch(LINES / 2, COLS - 1, colored_chtype(ACS_RTEE, attr, pair));
/* *INDENT-ON* */
}
{
int n;
-#define BOTH(name) #name, (name | attr | COLOR_PAIR(pair))
+#define BOTH(name) #name, colored_chtype(name, attr, pair)
erase();
attron(A_BOLD);
int col = (n / height) * COLS / 2;
mvprintw(row, col, "%*s : ", COLS / 4, name);
- while (repeat-- >= 0) {
+ while (--repeat >= 0) {
add_wch(code);
}
return n + 1;
#undef MERGE_ATTR
-#define MERGE_ATTR(wch) merge_wide_attr(&temp, wch, attr, pair)
+#define MERGE_ATTR(n,wch) merge_wide_attr(&temp[n], wch, attr, pair)
static void
show_wbox_chars(int repeat, attr_t attr, short pair)
{
- cchar_t temp;
+ cchar_t temp[8];
(void) repeat;
erase();
attroff(A_BOLD);
refresh();
- attr_set(attr, pair, 0);
- box_set(stdscr, 0, 0);
- attr_set(A_NORMAL, 0, 0);
+ wborder_set(stdscr,
+ MERGE_ATTR(0, WACS_VLINE),
+ MERGE_ATTR(1, WACS_VLINE),
+ MERGE_ATTR(2, WACS_HLINE),
+ MERGE_ATTR(3, WACS_HLINE),
+ MERGE_ATTR(4, WACS_ULCORNER),
+ MERGE_ATTR(5, WACS_URCORNER),
+ MERGE_ATTR(6, WACS_LLCORNER),
+ MERGE_ATTR(7, WACS_LRCORNER));
/* *INDENT-OFF* */
- mvhline_set(LINES / 2, 0, MERGE_ATTR(WACS_HLINE), COLS);
- mvvline_set(0, COLS / 2, MERGE_ATTR(WACS_VLINE), LINES);
- mvadd_wch(0, COLS / 2, MERGE_ATTR(WACS_TTEE));
- mvadd_wch(LINES / 2, COLS / 2, MERGE_ATTR(WACS_PLUS));
- mvadd_wch(LINES - 1, COLS / 2, MERGE_ATTR(WACS_BTEE));
- mvadd_wch(LINES / 2, 0, MERGE_ATTR(WACS_LTEE));
- mvadd_wch(LINES / 2, COLS - 1, MERGE_ATTR(WACS_RTEE));
+ mvhline_set(LINES / 2, 0, MERGE_ATTR(0, WACS_HLINE), COLS);
+ mvvline_set(0, COLS / 2, MERGE_ATTR(0, WACS_VLINE), LINES);
+ mvadd_wch(0, COLS / 2, MERGE_ATTR(0, WACS_TTEE));
+ mvadd_wch(LINES / 2, COLS / 2, MERGE_ATTR(0, WACS_PLUS));
+ mvadd_wch(LINES - 1, COLS / 2, MERGE_ATTR(0, WACS_BTEE));
+ mvadd_wch(LINES / 2, 0, MERGE_ATTR(0, WACS_LTEE));
+ mvadd_wch(LINES / 2, COLS - 1, MERGE_ATTR(0, WACS_RTEE));
/* *INDENT-ON* */
}
break;
case 2:
init_pair(cpair, COLOR_RED, COLOR_GREEN);
- wbkgdset(win, ' ' | A_BLINK | COLOR_PAIR(cpair));
+ wbkgdset(win, colored_chtype(' ', A_BLINK, cpair));
break;
case 3:
wbkgdset(win, ' ' | A_NORMAL);