/****************************************************************************
- * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2008,2009 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 *
Author: Eric S. Raymond <esr@snark.thyrsus.com> 1993
Thomas E. Dickey (beginning revision 1.27 in 1996).
-$Id: ncurses.c,v 1.328 2008/09/13 18:56:02 tom Exp $
+$Id: ncurses.c,v 1.342 2009/07/18 11:48:42 tom Exp $
***************************************************************************/
*target = 0;
}
+#if USE_LIBPANEL
static void
make_fullwidth_digit(cchar_t *target, int digit)
{
source[1] = 0;
setcchar(target, source, A_NORMAL, 0, 0);
}
+#endif
static int
wGet_wchar(WINDOW *win, wint_t *result)
addstr("Shelling out...");
def_prog_mode();
endwin();
+#ifdef __MINGW32__
+ system("cmd.exe");
+#else
system("sh");
+#endif
if (message)
addstr("returned from shellout.\n");
refresh();
*
****************************************************************************/
+#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[] =
{
{
unsigned need = (level + 1) * 2;
- assert(level < COLS);
+ assert(level < (unsigned) COLS);
if (winstack == 0) {
len_winstack = 20;
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
wgetch_test(0, stdscr, delay);
forget_boxes();
finish_getch_test();
+ slk_clear();
}
#if USE_WIDEC_SUPPORT
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)", (unsigned) 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
wget_wch_test(0, stdscr, delay);
forget_boxes();
finish_getch_test();
+ slk_clear();
}
#endif
width = 4;
} else if (color >= 8) {
sprintf(temp, "[%02d]", color);
+ } else if (color < 0) {
+ strcpy(temp, "default");
} else {
strcpy(temp, the_color_names[color]);
}
" b/B toggle bold off/on");
mvwprintw(helpwin, row++, col,
" n/N toggle text/number on/off");
+ mvwprintw(helpwin, row++, col,
+ " r/R toggle reverse on/off");
mvwprintw(helpwin, row++, col,
" w/W toggle width between 8/16 colors");
#if USE_WIDEC_SUPPORT
bool done = FALSE;
bool opt_acsc = FALSE;
bool opt_bold = FALSE;
- bool opt_wide = FALSE;
+ bool opt_revs = FALSE;
bool opt_nums = FALSE;
+ bool opt_wide = FALSE;
WINDOW *helpwin;
- if (pairs_max > COLOR_PAIRS)
- pairs_max = COLOR_PAIRS;
+ if (COLORS * COLORS == COLOR_PAIRS) {
+ int limit = (COLORS - min_colors) * (COLORS - min_colors);
+ if (pairs_max > limit)
+ pairs_max = limit;
+ } else {
+ if (pairs_max > COLOR_PAIRS)
+ pairs_max = COLOR_PAIRS;
+ }
while (!done) {
int shown = 0;
hello = "Hello";
per_row = 8;
}
+ per_row -= min_colors;
row_limit = (pairs_max + per_row - 1) / per_row;
move(0, 0);
- (void) printw("There are %d color pairs and %d colors\n",
- pairs_max, COLORS);
+ (void) printw("There are %d color pairs and %d colors%s\n",
+ pairs_max, COLORS,
+ min_colors ? " besides 'default'" : "");
clrtobot();
(void) mvprintw(top + 1, 0,
/* show color names/numbers across the top */
for (i = 0; i < per_row; i++)
- show_color_name(top + 2, (i + 1) * width, i, opt_wide);
+ show_color_name(top + 2, (i + 1) * width, i + min_colors, opt_wide);
/* show a grid of colors, with color names/ numbers on the left */
for (i = (short) (base_row * per_row); i < pairs_max; i++) {
int col = (i % per_row + 1) * width;
short pair = i;
+#define InxToFG(i) (short) ((i % (COLORS - min_colors)) + min_colors)
+#define InxToBG(i) (short) ((i / (COLORS - min_colors)) + min_colors)
if (row >= 0 && move(row, col) != ERR) {
- short fg = (short) (i % COLORS);
- short bg = (short) (i / COLORS);
+ short fg = InxToFG(i);
+ short bg = InxToBG(i);
init_pair(pair, fg, bg);
attron((attr_t) COLOR_PAIR(pair));
attron((attr_t) A_ALTCHARSET);
if (opt_bold)
attron((attr_t) A_BOLD);
+ if (opt_revs)
+ attron((attr_t) A_REVERSE);
if (opt_nums) {
sprintf(numbered, "{%02X}", i);
printw("%-*.*s", width, width, hello);
attrset(A_NORMAL);
- if ((i % per_row) == 0 && (i % COLORS) == 0) {
- show_color_name(row, 0, i / COLORS, opt_wide);
+ if ((i % per_row) == 0 && InxToFG(i) == min_colors) {
+ show_color_name(row, 0, InxToBG(i), opt_wide);
}
++shown;
} else if (shown) {
case 'N':
opt_nums = TRUE;
break;
+ case 'r':
+ opt_revs = FALSE;
+ break;
+ case 'R':
+ opt_revs = TRUE;
+ break;
case case_QUIT:
done = TRUE;
continue;
int base_row = 0;
int grid_top = top + 3;
int page_size = (LINES - grid_top);
- int pairs_max = COLOR_PAIRS;
+ int pairs_max = (unsigned short) (-1);
int row_limit;
int per_row;
char numbered[80];
bool done = FALSE;
bool opt_acsc = FALSE;
bool opt_bold = FALSE;
+ bool opt_revs = FALSE;
bool opt_wide = FALSE;
bool opt_nums = FALSE;
bool opt_xchr = FALSE;
wchar_t buffer[10];
WINDOW *helpwin;
+ if (COLORS * COLORS == COLOR_PAIRS) {
+ int limit = (COLORS - min_colors) * (COLORS - min_colors);
+ if (pairs_max > limit)
+ pairs_max = limit;
+ } else {
+ if (pairs_max > COLOR_PAIRS)
+ pairs_max = COLOR_PAIRS;
+ }
+
while (!done) {
int shown = 0;
hello = "Hello";
per_row = 8;
}
+ per_row -= min_colors;
+
if (opt_xchr) {
make_fullwidth_text(buffer, hello);
width *= 2;
row_limit = (pairs_max + per_row - 1) / per_row;
move(0, 0);
- (void) printw("There are %d color pairs and %d colors\n",
- pairs_max, COLORS);
+ (void) printw("There are %d color pairs and %d colors%s\n",
+ pairs_max, COLORS,
+ min_colors ? " besides 'default'" : "");
clrtobot();
(void) mvprintw(top + 1, 0,
/* show color names/numbers across the top */
for (i = 0; i < per_row; i++)
- show_color_name(top + 2, (i + 1) * width, i, opt_wide);
+ show_color_name(top + 2, (i + 1) * width, i + min_colors, opt_wide);
/* show a grid of colors, with color names/ numbers on the left */
for (i = (base_row * per_row); i < pairs_max; i++) {
short pair = (short) i;
if (row >= 0 && move(row, col) != ERR) {
- init_pair(pair, (short) (i % COLORS), (short) (i / COLORS));
+ init_pair(pair, InxToFG(i), InxToBG(i));
color_set(pair, NULL);
if (opt_acsc)
attr_on((attr_t) A_ALTCHARSET, NULL);
if (opt_bold)
attr_on((attr_t) A_BOLD, NULL);
+ if (opt_revs)
+ attr_on((attr_t) A_REVERSE, NULL);
if (opt_nums) {
sprintf(numbered, "{%02X}", i);
addnwstr(buffer, width);
attr_set(A_NORMAL, 0, NULL);
- if ((i % per_row) == 0 && (i % COLORS) == 0) {
- show_color_name(row, 0, i / COLORS, opt_wide);
+ if ((i % per_row) == 0 && InxToFG(i) == min_colors) {
+ show_color_name(row, 0, InxToBG(i), opt_wide);
}
++shown;
} else if (shown) {
case 'N':
opt_nums = TRUE;
break;
+ case 'r':
+ opt_revs = FALSE;
+ break;
+ case 'R':
+ opt_revs = TRUE;
+ break;
case case_QUIT:
done = TRUE;
continue;
#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);
static cchar_t *
merge_wide_attr(cchar_t *dst, const cchar_t *src, attr_t attr, short pair)
{
- int count = getcchar(src, NULL, NULL, NULL, 0);
- wchar_t *wch = 0;
- attr_t ignore_attr;
- short ignore_pair;
+ int count;
*dst = *src;
- if (count > 0) {
- if ((wch = typeMalloc(wchar_t, (unsigned) count + 1)) != 0) {
- if (getcchar(src, wch, &ignore_attr, &ignore_pair, 0) != ERR) {
- attr |= (ignore_attr & A_ALTCHARSET);
- setcchar(dst, wch, attr, pair, 0);
- }
- free(wch);
+ do {
+ TEST_CCHAR(src, count, {
+ attr |= (test_attrs & A_ALTCHARSET);
+ setcchar(dst, test_wch, attr, pair, NULL);
}
- }
+ , {
+ ;
+ });
+ } while (0);
return dst;
}
* the display.
*/
if (wcwidth(code) == 0)
- addch(space | A_REVERSE);
+ addch(space | (A_REVERSE ^ attr) | COLOR_PAIR(pair));
/*
* This could use add_wch(), but is done for comparison with the
* normal 'f' test (and to make a test-case for echo_wchar()).
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);