/****************************************************************************
- * 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.315 2008/07/05 23:26:35 tom Exp $
+$Id: ncurses.c,v 1.343 2009/07/30 09:13:37 tom Exp $
***************************************************************************/
#endif
+#if HAVE_WCSRTOMBS
+#define count_wchars(src, len, state) wcsrtombs(0, &src, len, state)
+#define trans_wchars(dst, src, len, state) wcsrtombs(dst, &src, len, state)
+#define reset_wchars(state) memset(&state, 0, sizeof(state))
+#elif HAVE_WCSTOMBS && HAVE_MBTOWC && HAVE_MBLEN
+#define count_wchars(src, len, state) wcstombs(0, src, len)
+#define trans_wchars(dst, src, len, state) wcstombs(dst, src, len)
+#define reset_wchars(state) mblen(NULL, 0), mbtowc(NULL, NULL, 0)
+#define state_unused
+#endif
+
+#if HAVE_MBSRTOWCS
+#define count_mbytes(src, len, state) mbsrtowcs(0, &src, len, state)
+#define trans_mbytes(dst, src, len, state) mbsrtowcs(dst, &src, len, state)
+#define reset_mbytes(state) memset(&state, 0, sizeof(state))
+#elif HAVE_MBSTOWCS && HAVE_MBTOWC && HAVE_MBLEN
+#define count_mbytes(src, len, state) mbstowcs(0, src, len)
+#define trans_mbytes(dst, src, len, state) mbstowcs(dst, src, len)
+#define reset_mbytes(state) mblen(NULL, 0), mbtowc(NULL, NULL, 0)
+#define state_unused
+#endif
+
#define ToggleAcs(temp,real) temp = ((temp == real) ? 0 : real)
#define P(string) printw("%s\n", string)
getyx(win, y0, x0);
wattrset(win, A_REVERSE);
- x = strlen(buffer);
+ x = (int) strlen(buffer);
while (!done) {
if (x > (int) strlen(buffer))
x = (int) strlen(buffer);
beep();
} else if ((int) strlen(buffer) < limit) {
int j;
- for (j = strlen(buffer) + 1; j > x; --j) {
+ for (j = (int) strlen(buffer) + 1; j > x; --j) {
buffer[j] = buffer[j - 1];
}
- buffer[x++] = ch;
+ buffer[x++] = (char) ch;
} else {
flash();
}
*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)
getyx(win, y0, x0);
wattrset(win, A_REVERSE);
- x = wcslen(buffer);
+ x = (int) wcslen(buffer);
while (!done) {
if (x > (int) wcslen(buffer))
x = (int) wcslen(buffer);
beep();
} else if ((int) wcslen(buffer) < limit) {
int j;
- for (j = wcslen(buffer) + 1; j > x; --j) {
+ for (j = (int) wcslen(buffer) + 1; j > x; --j) {
buffer[j] = buffer[j - 1];
}
- buffer[x++] = ch;
+ buffer[x++] = (wchar_t) ch;
} else {
beep();
}
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[] =
{
printw("Type any key to see its %s value. Also:\n",
flags['k'] ? "keypad" : "literal");
for (n = 0; n < SIZEOF(help); ++n) {
- int row = 1 + (n % chk);
+ int row = 1 + (int) (n % chk);
int col = (n >= chk) ? COLS / 2 : 0;
int flg = ((strstr(help[n], "toggle") != 0)
&& (flags[UChar(*help[n])] != FALSE));
{
unsigned need = (level + 1) * 2;
+ assert(level < (unsigned) COLS);
+
if (winstack == 0) {
len_winstack = 20;
winstack = typeMalloc(WINSTACK, len_winstack);
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 = (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
wcstos(const wchar_t *src)
{
int need;
- mbstate_t state;
char *result = 0;
const wchar_t *tmp = src;
+#ifndef state_unused
+ mbstate_t state;
+#endif
- memset(&state, 0, sizeof(state));
- if ((need = wcsrtombs(0, &tmp, 0, &state)) > 0) {
- unsigned have = need;
- result = typeCalloc(char, have + 1);
- tmp = src;
- if (wcsrtombs(result, &tmp, have, &state) != have) {
- free(result);
- result = 0;
+ reset_wchars(state);
+ if ((need = (int) count_wchars(tmp, 0, &state)) > 0) {
+ unsigned have = (unsigned) need;
+ if ((result = typeCalloc(char, have + 1)) != 0) {
+ tmp = src;
+ if (trans_wchars(result, tmp, have, &state) != have) {
+ free(result);
+ result = 0;
+ }
}
}
return result;
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);
wprintw(win, "wgetn_wstr returns an error.");
} else {
int n;
- for (n = 0; (wchar_buf[n] = wint_buf[n]) != 0; ++n) ;
+ for (n = 0; (wchar_buf[n] = (wchar_t) wint_buf[n]) != 0; ++n) {
+ ;
+ }
if ((temp = wcstos(wchar_buf)) != 0) {
wprintw(win, "I saw %d characters:\n\t`%s'.",
(int) wcslen(wchar_buf), temp);
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 = 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
wget_wch_test(0, stdscr, delay);
forget_boxes();
finish_getch_test();
+ slk_clear();
}
#endif
if (use_colors) {
switch (ch) {
case 'f':
- *fg = (*fg + 1);
+ *fg = (short) (*fg + 1);
break;
case 'F':
- *fg = (*fg - 1);
+ *fg = (short) (*fg - 1);
break;
case 'b':
- *bg = (*bg + 1);
+ *bg = (short) (*bg + 1);
break;
case 'B':
- *bg = (*bg - 1);
+ *bg = (short) (*bg - 1);
break;
case 't':
- *tx = (*tx + 1);
+ *tx = (short) (*tx + 1);
break;
case 'T':
- *tx = (*tx - 1);
+ *tx = (short) (*tx - 1);
break;
default:
beep();
break;
}
if (*fg >= COLORS)
- *fg = min_colors;
+ *fg = (short) min_colors;
if (*fg < min_colors)
- *fg = COLORS - 1;
+ *fg = (short) (COLORS - 1);
if (*bg >= COLORS)
- *bg = min_colors;
+ *bg = (short) min_colors;
if (*bg < min_colors)
- *bg = COLORS - 1;
+ *bg = (short) (COLORS - 1);
if (*tx >= COLORS)
*tx = -1;
if (*tx < -1)
- *tx = COLORS - 1;
+ *tx = (short) (COLORS - 1);
} else {
beep();
error = TRUE;
if (first >= ' ' && last <= '~') { /* 32..126 */
int j, k;
for (j = 0, k = first; j < MAX_ATTRSTRING && k <= last; ++j, ++k) {
- attr_test_string[j] = k;
+ attr_test_string[j] = (char) k;
if (((k + 1 - first) % 5) == 0) {
- ++j;
- if (j < MAX_ATTRSTRING)
- attr_test_string[j] = ' ';
+ if (++j >= MAX_ATTRSTRING)
+ break;
+ attr_test_string[j] = ' ';
}
}
while (j < MAX_ATTRSTRING)
do {
int row = 2;
chtype normal = A_NORMAL | BLANK;
- chtype extras = ac;
+ chtype extras = (chtype) ac;
if (use_colors) {
- short pair = (fg != COLOR_BLACK || bg != COLOR_BLACK);
+ short pair = (short) (fg != COLOR_BLACK || bg != COLOR_BLACK);
if (pair != 0) {
pair = 1;
if (init_pair(pair, fg, bg) == ERR) {
for (j = 0, k = first; j < MAX_ATTRSTRING && k <= last; ++j, ++k) {
wide_attr_test_string[j] = k;
if (((k + 1 - first) % 5) == 0) {
- ++j;
- if (j < MAX_ATTRSTRING)
- wide_attr_test_string[j] = ' ';
+ if (++j >= MAX_ATTRSTRING)
+ break;
+ wide_attr_test_string[j] = ' ';
}
}
while (j < MAX_ATTRSTRING)
short extras = 0;
if (use_colors) {
- pair = (fg != COLOR_BLACK || bg != COLOR_BLACK);
+ pair = (short) (fg != COLOR_BLACK || bg != COLOR_BLACK);
if (pair != 0) {
pair = 1;
if (init_pair(pair, fg, bg) == ERR) {
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 = (base_row * per_row); i < pairs_max; i++) {
+ for (i = (short) (base_row * per_row); i < pairs_max; i++) {
int row = grid_top + (i / per_row) - base_row;
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 = i % COLORS;
- short bg = 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++) {
int row = grid_top + (i / per_row) - base_row;
int col = (i % per_row + 1) * width;
- int pair = i;
+ short pair = (short) i;
if (row >= 0 && move(row, col) != ERR) {
- init_pair(pair, i % COLORS, 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;
switch (field) {
case 0:
- red = usebase ? red + value : value;
+ red = (short) (usebase ? (red + value) : value);
break;
case 1:
- green = usebase ? green + value : value;
+ green = (short) (usebase ? (green + value) : value);
break;
case 2:
- blue = usebase ? blue + value : value;
+ blue = (short) (usebase ? (blue + value) : value);
break;
}
color_edit(void)
/* display the color test pattern, without trying to edit colors */
{
- short i;
- short current = 0;
+ int i;
+ int current = 0;
int this_c = 0, value = 0, field = 0;
int last_c;
int top_color = 0;
refresh();
for (i = 0; i < max_colors; i++)
- init_pair(i, COLOR_WHITE, i);
+ init_pair((short) i, (short) COLOR_WHITE, (short) i);
mvprintw(LINES - 2, 0, "Number: %d", value);
mvaddstr(0, 20, "Color RGB Value Editing");
attroff(A_BOLD);
- for (i = top_color;
+ for (i = (short) top_color;
(i - top_color < page_size)
&& (i < max_colors); i++) {
char numeric[80];
addstr(" ");
attrset(A_NORMAL);
- color_content(i, &red, &green, &blue);
+ color_content((short) i, &red, &green, &blue);
addstr(" R = ");
if (current == i && field == 0)
attron(A_STANDOUT);
break;
case '+':
- change_color(current, field, value, 1);
+ change_color((short) current, field, value, 1);
break;
case '-':
- change_color(current, field, -value, 1);
+ change_color((short) current, field, -value, 1);
break;
case '=':
- change_color(current, field, value, 0);
+ change_color((short) current, field, value, 0);
break;
case '?':
#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"
#if HAVE_SLK_COLOR
case 'F':
if (use_colors) {
- fg = (fg + 1) % COLORS;
+ fg = (short) ((fg + 1) % COLORS);
call_slk_color(fg, bg);
}
break;
case 'B':
if (use_colors) {
- bg = (bg + 1) % COLORS;
+ bg = (short) ((bg + 1) % COLORS);
call_slk_color(fg, bg);
}
break;
size_t used = strlen(temp);
size_t want = SLKLEN;
size_t test;
+#ifndef state_unused
mbstate_t state;
+#endif
buf[0] = L'\0';
while (want > 0 && used != 0) {
const char *base = s;
- memset(&state, 0, sizeof(state));
- test = mbsrtowcs(0, &base, 0, &state);
+ reset_mbytes(state);
+ test = count_mbytes(base, 0, &state);
if (test == (size_t) -1) {
temp[--used] = 0;
} else if (test > want) {
temp[--used] = 0;
} else {
- memset(&state, 0, sizeof(state));
- mbsrtowcs(buf, &base, want, &state);
+ reset_mbytes(state);
+ trans_mbytes(buf, base, want, &state);
break;
}
}
case 'F':
if (use_colors) {
- fg = (fg + 1) % COLORS;
+ fg = (short) ((fg + 1) % COLORS);
call_slk_color(fg, bg);
}
break;
case 'B':
if (use_colors) {
- bg = (bg + 1) % COLORS;
+ bg = (short) ((bg + 1) % COLORS);
call_slk_color(fg, bg);
}
break;
} attrs_to_cycle[] = {
{ A_NORMAL, "normal" },
{ A_BOLD, "bold" },
+ { A_BLINK, "blink" },
{ A_REVERSE, "reverse" },
{ A_UNDERLINE, "underline" },
};
*at_code = 0;
break;
case 'V':
- if (*at_code == 1)
+ if (*at_code == 0)
*at_code = SIZEOF(attrs_to_cycle) - 1;
else
*at_code -= 1;
break;
}
if (result) {
- *pair = (*fg != COLOR_BLACK || *bg != COLOR_BLACK);
+ *pair = (short) (*fg != COLOR_BLACK || *bg != COLOR_BLACK);
if (*pair != 0) {
*pair = 1;
- if (init_pair(*pair, *fg, *bg) == ERR) {
+ if (init_pair(*pair, (short) *fg, (short) *bg) == ERR) {
result = FALSE;
}
}
for (code = first; code <= last; code++) {
int count = repeat;
- int row = 2 + ((code - first) % 16);
- int col = ((code - first) / 16) * COLS / 2;
+ int row = 2 + ((int) (code - first) % 16);
+ int col = ((int) (code - first) / 16) * COLS / 2;
char tmp[80];
sprintf(tmp, "%3u (0x%x)", code, code);
mvprintw(row, col, "%*s: ", COLS / 4, tmp);
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) {
}
for (code = 0; code < 256; code++) {
int count = repeat;
- int row = 3 + (code / 16) + (code >= 128);
- int col = 8 + (code % 16) * PC_COLS;
+ int row = 3 + (int) (code / 16) + (code >= 128);
+ int col = 8 + (int) (code % 16) * PC_COLS;
if ((code % 16) == 0)
mvprintw(row, 0, "0x%02x:", code);
move(row, col);
*/
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);
if (last_show_acs != 0)
last_show_acs(repeat, attr, pair);
else
- show_upper_chars(digit * 32 + 128, repeat, attr, pair);
+ show_upper_chars((unsigned) (digit * 32 + 128), repeat, attr, pair);
mvprintw(LINES - 3, 0,
"Note: ANSI terminals may not display C1 characters.");
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, 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* */
}
#define is_scrollok(win) FALSE
#endif
+static WINDOW *
+frame_win(FRAME * curp)
+{
+ return (curp != 0) ? curp->wind : stdscr;
+}
+
/* We need to know if these flags are actually set, so don't look in FRAME.
* These names are known to work with SVr4 curses as well as ncurses. The
* _use_keypad name does not work with Solaris 8.
static bool
HaveKeypad(FRAME * curp)
{
- WINDOW *win = (curp ? curp->wind : stdscr);
+ WINDOW *win = frame_win(curp);
(void) win;
return is_keypad(win);
}
static bool
HaveScroll(FRAME * curp)
{
- WINDOW *win = (curp ? curp->wind : stdscr);
+ WINDOW *win = frame_win(curp);
(void) win;
return is_scrollok(win);
}
newwin_report(FRAME * curp)
/* report on the cursor's current position, then restore it */
{
- WINDOW *win = (curp != 0) ? curp->wind : stdscr;
+ WINDOW *win = frame_win(curp);
int y, x;
if (win != stdscr)
static void
newwin_move(FRAME * curp, int dy, int dx)
{
- WINDOW *win = (curp != 0) ? curp->wind : stdscr;
+ WINDOW *win = frame_win(curp);
int cur_y, cur_x;
int max_y, max_x;
static FRAME *
delete_framed(FRAME * fp, bool showit)
{
- FRAME *np;
+ FRAME *np = 0;
- fp->last->next = fp->next;
- fp->next->last = fp->last;
+ if (fp != 0) {
+ fp->last->next = fp->next;
+ fp->next->last = fp->last;
- if (showit) {
- werase(fp->wind);
- wrefresh(fp->wind);
- }
- delwin(fp->wind);
+ if (showit) {
+ werase(fp->wind);
+ wrefresh(fp->wind);
+ }
+ delwin(fp->wind);
- np = (fp == fp->next) ? 0 : fp->next;
- free(fp);
+ np = (fp == fp->next) ? 0 : fp->next;
+ free(fp);
+ }
return np;
}
transient((FRAME *) 0, (char *) 0);
switch (c) {
case CTRL('C'):
- neww = typeCalloc(FRAME, 1);
- if ((neww->wind = getwindow()) == (WINDOW *) 0)
+ if ((neww = typeCalloc(FRAME, 1)) == 0) {
+ goto breakout;
+ }
+ if ((neww->wind = getwindow()) == (WINDOW *) 0) {
+ free(neww);
goto breakout;
+ }
if (current == 0) { /* First element, */
neww->next = neww; /* so point it at itself */
case CTRL('F'): /* scroll current window forward */
if (current)
- wscrl(current->wind, 1);
+ wscrl(frame_win(current), 1);
break;
case CTRL('B'): /* scroll current window backwards */
if (current)
- wscrl(current->wind, -1);
+ wscrl(frame_win(current), -1);
break;
case CTRL('K'): /* toggle keypad mode for current */
#if HAVE_PUTWIN && HAVE_GETWIN
case CTRL('W'): /* save and delete window */
- if (current == current->next) {
+ if ((current != 0) && (current == current->next)) {
transient(current, "Will not save/delete ONLY window");
break;
} else if ((fp = fopen(DUMPFILE, "w")) == (FILE *) 0) {
transient(current, "Can't open screen dump file");
} else {
- (void) putwin(current->wind, fp);
+ (void) putwin(frame_win(current), fp);
(void) fclose(fp);
current = delete_framed(current, TRUE);
if ((fp = fopen(DUMPFILE, "r")) == (FILE *) 0) {
transient(current, "Can't open screen dump file");
} else {
- neww = typeCalloc(FRAME, 1);
+ if ((neww = typeCalloc(FRAME, 1)) != 0) {
- neww->next = current->next;
- neww->last = current;
- neww->last->next = neww;
- neww->next->last = neww;
+ neww->next = current ? current->next : 0;
+ neww->last = current;
+ neww->last->next = neww;
+ neww->next->last = neww;
- neww->wind = getwin(fp);
- (void) fclose(fp);
+ neww->wind = getwin(fp);
- wrefresh(neww->wind);
+ wrefresh(neww->wind);
+ }
+ (void) fclose(fp);
}
break;
#endif
case KEY_DC:
{
int y, x;
- getyx(current->wind, y, x);
+ getyx(frame_win(current), y, x);
if (--x < 0) {
if (--y < 0)
break;
- x = getmaxx(current->wind) - 1;
+ x = getmaxx(frame_win(current)) - 1;
}
- mvwdelch(current->wind, y, x);
+ mvwdelch(frame_win(current), y, x);
}
break;
break;
}
newwin_report(current);
- usescr = (current ? current->wind : stdscr);
+ usescr = frame_win(current);
wrefresh(usescr);
} while
(!isQuit(c = wGetchar(usescr))
if ((pan = new_panel(win)) == 0) {
delwin(win);
} else if (use_colors) {
- short fg = (color == COLOR_BLUE) ? COLOR_WHITE : COLOR_BLACK;
+ short fg = (short) ((color == COLOR_BLUE) ? COLOR_WHITE : COLOR_BLACK);
short bg = color;
init_pair(color, fg, bg);
fill_panel(PANEL * pan)
{
WINDOW *win = panel_window(pan);
- int num = ((const char *) panel_userptr(pan))[1];
+ const char *userptr = (const char *) panel_userptr(pan);
+ int num = (userptr && *userptr) ? userptr[1] : '?';
int y, x;
wmove(win, 1, 1);
fill_wide_panel(PANEL * pan)
{
WINDOW *win = panel_window(pan);
- int num = ((const char *) panel_userptr(pan))[1];
+ const char *userptr = (const char *) panel_userptr(pan);
+ int num = (userptr && *userptr) ? userptr[1] : '?';
int y, x;
wmove(win, 1, 1);
"Use <,> (or h,l) to grow/shrink the panner horizontally.",
"Number repeats. Toggle legend:? filler:a timer:t scrollmark:s."
};
- int n = (SIZEOF(legend) - (LINES - line));
+ int n = ((int) SIZEOF(legend) - (LINES - line));
if (line < LINES && (n >= 0)) {
move(line, 0);
if (show_panner_legend)
waddch(panpad, pan_lines ? ACS_LTEE : '+');
else
waddch(panpad, (chtype) ((pan_lines ? 'a' : 'A') +
- (gridcount++ % 26)));
+ (int) (gridcount++ % 26)));
} else if (y % GRIDSIZE == 0)
waddch(panpad, pan_lines ? ACS_HLINE : '-');
else if (x % GRIDSIZE == 0)
int length = (portx - top_x - 1);
float ratio = ((float) length) / ((float) pxmax);
- lowend = (int) (top_x + (basex * ratio));
- highend = (int) (top_x + ((basex + length) * ratio));
+ lowend = (int) ((float) top_x + ((float) basex * ratio));
+ highend = (int) ((float) top_x + ((float) (basex + length) * ratio));
do_h_line(porty - 1, top_x, ACS_HLINE, lowend);
if (highend < portx) {
int length = (porty - top_y - 1);
float ratio = ((float) length) / ((float) pymax);
- lowend = (int) (top_y + (basey * ratio));
- highend = (int) (top_y + ((basey + length) * ratio));
+ lowend = (int) ((float) top_y + ((float) basey * ratio));
+ highend = (int) ((float) top_y + ((float) (basey + length) * ratio));
do_v_line(top_y, portx - 1, ACS_VLINE, lowend);
if (highend < porty) {
mvaddstr(5, 0, " Press return to exit.");
refresh();
- for (ap = animals; *ap; ap++)
- *ip++ = new_item(*ap, "");
+ for (ap = animals; *ap; ap++) {
+ if ((*ip = new_item(*ap, "")) != 0)
+ ++ip;
+ }
*ip = (ITEM *) 0;
m = new_menu(items);
refresh();
- for (n = 0; t_tbl[n].name != 0; n++)
- *ip++ = new_item(t_tbl[n].name, "");
+ for (n = 0; t_tbl[n].name != 0; n++) {
+ if ((*ip = new_item(t_tbl[n].name, "")) != 0) {
+ ++ip;
+ }
+ }
*ip = (ITEM *) 0;
m = new_menu(items);
len = (long) (char *) field_userptr(me);
if (c <= KEY_MAX) {
if (isgraph(c) && (len + 1) < (int) sizeof(temp)) {
- temp[len++] = c;
+ temp[len++] = (char) c;
temp[len] = 0;
set_field_buffer(me, 1, temp);
c = '*';
/* force the form to display a leading capital */
if (islower(UChar(s[0]))) {
- s[0] = toupper(UChar(s[0]));
+ s[0] = (char) toupper(UChar(s[0]));
set_field_buffer(fld, 0, s);
}
return TRUE;
refresh();
/* describe the form */
+ memset(f, 0, sizeof(f));
f[n++] = make_label(0, 15, "Sample Form");
f[n++] = make_label(2, 0, "Last Name");
set_field_type(f[n - 1], fty_passwd);
f[n++] = (FIELD *) 0;
- form = new_form(f);
+ if ((form = new_form(f)) != 0) {
- display_form(form);
+ display_form(form);
- w = form_win(form);
- raw();
- nonl(); /* lets us read ^M's */
- while (!finished) {
- switch (form_driver(form, c = form_virtualize(form, w))) {
- case E_OK:
- mvaddstr(5, 57, field_buffer(secure, 1));
- clrtoeol();
- refresh();
- break;
- case E_UNKNOWN_COMMAND:
- finished = my_form_driver(form, c);
- break;
- default:
- beep();
- break;
+ w = form_win(form);
+ raw();
+ nonl(); /* lets us read ^M's */
+ while (!finished) {
+ switch (form_driver(form, c = form_virtualize(form, w))) {
+ case E_OK:
+ mvaddstr(5, 57, field_buffer(secure, 1));
+ clrtoeol();
+ refresh();
+ break;
+ case E_UNKNOWN_COMMAND:
+ finished = my_form_driver(form, c);
+ break;
+ default:
+ beep();
+ break;
+ }
}
- }
- erase_form(form);
+ erase_form(form);
- free_form(form);
+ free_form(form);
+ }
for (c = 0; f[c] != 0; c++)
free_field(f[c]);
free_fieldtype(fty_middle);
static void
overlap_test_1_attr(WINDOW *win, int flavor, int col)
{
- short cpair = 1 + (flavor * 2) + col;
+ short cpair = (short) (1 + (flavor * 2) + col);
switch (flavor) {
case 0:
static void
overlap_test_2_attr(WINDOW *win, int flavor, int col)
{
- short cpair = 9 + (flavor * 2) + col;
+ short cpair = (short) (9 + (flavor * 2) + col);
switch (flavor) {
case 0:
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);
if (state < 0)
state += OVERLAP_FLAVORS;
state = state % OVERLAP_FLAVORS;
+ assert(state >= 0 && state < OVERLAP_FLAVORS);
for (item = 0; item < (2 * OVERLAP_FLAVORS); ++item) {
row = item / 2;
*/
command = 0;
for (;;) {
- char ch;
+ char ch = '\0';
if (read(fileno(stdin), &ch, 1) <= 0) {
if (command == 0)
command = 'q';
#endif
#ifdef TRACE
case 't':
- save_trace = strtol(optarg, 0, 0);
+ save_trace = (unsigned) strtol(optarg, 0, 0);
break;
#endif
default:
if (can_change_color()) {
short cp;
- all_colors = typeMalloc(RGB_DATA, max_colors);
+ all_colors = typeMalloc(RGB_DATA, (unsigned) max_colors);
for (cp = 0; cp < max_colors; ++cp) {
color_content(cp,
&all_colors[cp].red,
&& okRGB(red)
&& okRGB(green)
&& okRGB(blue)) {
- all_colors[c].red = (red * 1000) / scale;
- all_colors[c].green = (green * 1000) / scale;
- all_colors[c].blue = (blue * 1000) / scale;
+ all_colors[c].red = (short) ((red * 1000) / scale);
+ all_colors[c].green = (short) ((green * 1000) / scale);
+ all_colors[c].blue = (short) ((blue * 1000) / scale);
}
}
fclose(fp);