Author: Eric S. Raymond <esr@snark.thyrsus.com> 1993
Thomas E. Dickey (beginning revision 1.27 in 1996).
-$Id: ncurses.c,v 1.298 2008/01/12 23:06:58 tom Exp $
+$Id: ncurses.c,v 1.324 2008/08/04 16:27:54 tom Exp $
***************************************************************************/
#endif
+#define ToggleAcs(temp,real) temp = ((temp == real) ? 0 : real)
+
#define P(string) printw("%s\n", string)
#define BLANK ' ' /* this is the background character */
{
return ((c) == QUIT || (c) == ESCAPE);
}
-#define case_QUIT case QUIT: case ESCAPE
+#define case_QUIT QUIT: case ESCAPE
/* Common function to allow ^T to toggle trace-mode in the middle of a test
* so that trace-files can be made smaller.
while ((c = wgetch(win)) == CTRL('T')) {
if (_nc_tracing) {
save_trace = _nc_tracing;
- _tracef("TOGGLE-TRACING OFF");
+ Trace(("TOGGLE-TRACING OFF"));
_nc_tracing = 0;
} else {
_nc_tracing = save_trace;
}
trace(_nc_tracing);
if (_nc_tracing)
- _tracef("TOGGLE-TRACING ON");
+ Trace(("TOGGLE-TRACING ON"));
}
#else
c = wgetch(win);
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();
}
}
#if USE_WIDEC_SUPPORT
+static wchar_t
+fullwidth_of(int ch)
+{
+ return (ch + 0xff10 - '0');
+}
+
+static void
+make_fullwidth_text(wchar_t *target, const char *source)
+{
+ int ch;
+ while ((ch = *source++) != 0) {
+ *target++ = fullwidth_of(ch);
+ }
+ *target = 0;
+}
+
+static void
+make_narrow_text(wchar_t *target, const char *source)
+{
+ int ch;
+ while ((ch = *source++) != 0) {
+ *target++ = ch;
+ }
+ *target = 0;
+}
+
+static void
+make_fullwidth_digit(cchar_t *target, int digit)
+{
+ wchar_t source[2];
+
+ source[0] = fullwidth_of(digit + '0');
+ source[1] = 0;
+ setcchar(target, source, A_NORMAL, 0, 0);
+}
+
static int
wGet_wchar(WINDOW *win, wint_t *result)
{
while ((c = wget_wch(win, result)) == CTRL('T')) {
if (_nc_tracing) {
save_trace = _nc_tracing;
- _tracef("TOGGLE-TRACING OFF");
+ Trace(("TOGGLE-TRACING OFF"));
_nc_tracing = 0;
} else {
_nc_tracing = save_trace;
}
trace(_nc_tracing);
if (_nc_tracing)
- _tracef("TOGGLE-TRACING ON");
+ Trace(("TOGGLE-TRACING ON"));
}
#else
c = wget_wch(win, 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();
}
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 < COLS);
+
if (winstack == 0) {
len_winstack = 20;
- winstack = (WINSTACK *) malloc(len_winstack * sizeof(WINSTACK));
+ winstack = typeMalloc(WINSTACK, len_winstack);
} else if (need >= len_winstack) {
len_winstack = need;
- winstack = (WINSTACK *) realloc(winstack, len_winstack * sizeof(WINSTACK));
+ winstack = typeRealloc(WINSTACK, len_winstack, winstack);
}
winstack[level].text = txt_win;
winstack[level].frame = box_win;
}
-#if USE_SOFTKEYS && (NCURSES_VERSION_PATCH < 20071229)
+#if USE_SOFTKEYS && (NCURSES_VERSION_PATCH < 20071229) && NCURSES_EXT_FUNCS
static void
slk_repaint(void)
{
#endif
(void) waddstr(win, keyname(c));
} else if (c > 0x80) {
- unsigned c2 = (c & 0x7f);
+ unsigned c2 = (unsigned) (c & 0x7f);
if (isprint(c2))
(void) wprintw(win, "M-%c", UChar(c2));
else
* For wget_wch_test(), we create pairs of windows - one for a box, one for text.
* Resize both and paint the box in the parent.
*/
-#ifdef KEY_RESIZE
+#if defined(KEY_RESIZE) && HAVE_WRESIZE
static void
resize_wide_boxes(unsigned level, WINDOW *win)
{
const wchar_t *tmp = src;
memset(&state, 0, sizeof(state));
- if ((need = wcsrtombs(0, &tmp, 0, &state)) > 0) {
- unsigned have = need;
- result = (char *) calloc(have + 1, 1);
- tmp = src;
- if (wcsrtombs(result, &tmp, have, &state) != have) {
- free(result);
- result = 0;
+ if ((need = (int) wcsrtombs(0, &tmp, 0, &state)) > 0) {
+ unsigned have = (unsigned) need;
+ if ((result = typeCalloc(char, have + 1)) != 0) {
+ tmp = src;
+ if (wcsrtombs(result, &tmp, have, &state) != have) {
+ free(result);
+ result = 0;
+ }
}
}
return result;
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);
kill(getpid(), SIGTSTP);
#endif
} else {
- wprintw(win, "Key pressed: %04o ", c);
+ wprintw(win, "Key pressed: %04o ", (int) c);
#ifdef NCURSES_MOUSE_VERSION
if (c == KEY_MOUSE) {
MEVENT event;
} else
#endif /* NCURSES_MOUSE_VERSION */
if (code == KEY_CODE_YES) {
-#ifdef KEY_RESIZE
+#if defined(KEY_RESIZE) && HAVE_WRESIZE
if (c == KEY_RESIZE) {
resize_wide_boxes(level, win);
}
if (c < 256 && iscntrl(c)) {
(void) wprintw(win, "%s (control character)", unctrl(c));
} else {
- wchar_t c2 = c;
+ wchar_t c2 = (wchar_t) c;
waddnwstr(win, &c2, 1);
(void) wprintw(win, " = %#x (printable character)", c);
}
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)
}
/* *INDENT-OFF* */
static const struct {
- attr_t attr;
+ chtype attr;
NCURSES_CONST char * name;
} attrs_to_test[] = {
{ A_STANDOUT, "STANDOUT" },
case '>':
adjust_attr_string(1);
break;
- case_QUIT:
+ case case_QUIT:
result = FALSE;
break;
default:
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)
case '>':
wide_adjust_attr_string(1);
break;
- case_QUIT:
+ case case_QUIT:
result = FALSE;
break;
default:
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) {
}
static void
-color_legend(WINDOW *helpwin)
+color_legend(WINDOW *helpwin, bool wide)
{
int row = 1;
int col = 1;
mvwprintw(helpwin, row++, col,
"longer than one screen. Control/N and Control/P can be used");
mvwprintw(helpwin, row++, col,
- "in place up up/down arrow. Use pageup/pagedown to scroll a");
+ "in place of up/down arrow. Use pageup/pagedown to scroll a");
mvwprintw(helpwin, row++, col,
"full screen; control/B and control/F can be used here.");
++row;
mvwprintw(helpwin, row++, col,
"Toggles:");
+ mvwprintw(helpwin, row++, col,
+ " a/A toggle altcharset off/on");
mvwprintw(helpwin, row++, col,
" b/B toggle bold off/on");
mvwprintw(helpwin, row++, col,
" n/N toggle text/number on/off");
mvwprintw(helpwin, row++, col,
" w/W toggle width between 8/16 colors");
+#if USE_WIDEC_SUPPORT
+ if (wide) {
+ mvwprintw(helpwin, row++, col,
+ "Wide characters:");
+ mvwprintw(helpwin, row++, col,
+ " x/X toggle text between ASCII and wide-character");
+ }
+#else
+ (void) wide;
+#endif
}
#define set_color_test(name, value) if (name != value) { name = value; base_row = 0; }
char numbered[80];
const char *hello;
bool done = FALSE;
+ bool opt_acsc = FALSE;
bool opt_bold = FALSE;
bool opt_wide = FALSE;
bool opt_nums = FALSE;
show_color_name(top + 2, (i + 1) * width, i, 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;
if (row >= 0 && move(row, col) != ERR) {
- short fg = i % COLORS;
- short bg = i / COLORS;
+ short fg = (short) (i % COLORS);
+ short bg = (short) (i / COLORS);
init_pair(pair, fg, bg);
attron((attr_t) COLOR_PAIR(pair));
+ if (opt_acsc)
+ attron((attr_t) A_ALTCHARSET);
if (opt_bold)
attron((attr_t) A_BOLD);
}
switch (wGetchar(stdscr)) {
+ case 'a':
+ opt_acsc = FALSE;
+ break;
+ case 'A':
+ opt_acsc = TRUE;
+ break;
case 'b':
opt_bold = FALSE;
break;
case 'N':
opt_nums = TRUE;
break;
- case_QUIT:
+ case case_QUIT:
done = TRUE;
continue;
case 'w':
case '?':
if ((helpwin = newwin(LINES - 1, COLS - 2, 0, 0)) != 0) {
box(helpwin, 0, 0);
- color_legend(helpwin);
+ color_legend(helpwin, FALSE);
wGetchar(helpwin);
delwin(helpwin);
}
char numbered[80];
const char *hello;
bool done = FALSE;
+ bool opt_acsc = FALSE;
bool opt_bold = FALSE;
bool opt_wide = FALSE;
bool opt_nums = FALSE;
+ bool opt_xchr = FALSE;
+ wchar_t buffer[10];
WINDOW *helpwin;
while (!done) {
hello = "Hello";
per_row = 8;
}
+ if (opt_xchr) {
+ make_fullwidth_text(buffer, hello);
+ width *= 2;
+ per_row /= 2;
+ } else {
+ make_narrow_text(buffer, hello);
+ }
row_limit = (pairs_max + per_row - 1) / per_row;
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, (short) (i % COLORS), (short) (i / COLORS));
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_nums) {
sprintf(numbered, "{%02X}", i);
- hello = numbered;
+ if (opt_xchr) {
+ make_fullwidth_text(buffer, numbered);
+ } else {
+ make_narrow_text(buffer, numbered);
+ }
}
- printw("%-*.*s", width, width, hello);
+ addnwstr(buffer, width);
attr_set(A_NORMAL, 0, NULL);
if ((i % per_row) == 0 && (i % COLORS) == 0) {
}
switch (c = wGetchar(stdscr)) {
+ case 'a':
+ opt_acsc = FALSE;
+ break;
+ case 'A':
+ opt_acsc = TRUE;
+ break;
case 'b':
opt_bold = FALSE;
break;
case 'N':
opt_nums = TRUE;
break;
- case_QUIT:
+ case case_QUIT:
done = TRUE;
continue;
case 'w':
case 'W':
set_color_test(opt_wide, TRUE);
break;
+ case 'x':
+ opt_xchr = FALSE;
+ break;
+ case 'X':
+ opt_xchr = TRUE;
+ break;
case CTRL('p'):
case KEY_UP:
if (base_row <= 0) {
case '?':
if ((helpwin = newwin(LINES - 1, COLS - 2, 0, 0)) != 0) {
box(helpwin, 0, 0);
- color_legend(helpwin);
+ color_legend(helpwin, TRUE);
wGetchar(helpwin);
delwin(helpwin);
}
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 '?':
refresh();
break;
- case_QUIT:
+ case case_QUIT:
break;
default:
clrtobot();
break;
- case_QUIT:
+ case case_QUIT:
goto done;
#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;
clrtobot();
break;
- case_QUIT:
+ case case_QUIT:
goto done;
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;
* Alternate character-set stuff
*
****************************************************************************/
+/* *INDENT-OFF* */
+static struct {
+ chtype attr;
+ const char *name;
+} attrs_to_cycle[] = {
+ { A_NORMAL, "normal" },
+ { A_BOLD, "bold" },
+ { A_REVERSE, "reverse" },
+ { A_UNDERLINE, "underline" },
+};
+/* *INDENT-ON* */
+
+static bool
+cycle_attr(int ch, unsigned *at_code, chtype *attr)
+{
+ bool result = TRUE;
+
+ switch (ch) {
+ case 'v':
+ if ((*at_code += 1) >= SIZEOF(attrs_to_cycle))
+ *at_code = 0;
+ break;
+ case 'V':
+ if (*at_code == 1)
+ *at_code = SIZEOF(attrs_to_cycle) - 1;
+ else
+ *at_code -= 1;
+ break;
+ default:
+ result = FALSE;
+ break;
+ }
+ if (result)
+ *attr = attrs_to_cycle[*at_code].attr;
+ return result;
+}
+
+static bool
+cycle_colors(int ch, int *fg, int *bg, short *pair)
+{
+ bool result = FALSE;
+
+ if (use_colors) {
+ result = TRUE;
+ switch (ch) {
+ case 'F':
+ if ((*fg -= 1) < 0)
+ *fg = COLORS - 1;
+ break;
+ case 'f':
+ if ((*fg += 1) >= COLORS)
+ *fg = 0;
+ break;
+ case 'B':
+ if ((*bg -= 1) < 0)
+ *bg = COLORS - 1;
+ break;
+ case 'b':
+ if ((*bg += 1) >= COLORS)
+ *bg = 0;
+ break;
+ default:
+ result = FALSE;
+ break;
+ }
+ if (result) {
+ *pair = (short) (*fg != COLOR_BLACK || *bg != COLOR_BLACK);
+ if (*pair != 0) {
+ *pair = 1;
+ if (init_pair(*pair, (short) *fg, (short) *bg) == ERR) {
+ result = FALSE;
+ }
+ }
+ }
+ }
+ return result;
+}
/* ISO 6429: codes 0x80 to 0x9f may be control characters that cause the
* terminal to perform functions. The remaining codes can be graphic.
*/
static void
-show_upper_chars(unsigned first)
+show_upper_chars(unsigned first, int repeat, attr_t attr, short pair)
{
bool C1 = (first == 128);
unsigned code;
refresh();
for (code = first; code <= last; code++) {
- int row = 2 + ((code - first) % 16);
- int col = ((code - first) / 16) * COLS / 2;
+ int count = repeat;
+ 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);
- if (C1)
- nodelay(stdscr, TRUE);
- echochar(code);
- if (C1) {
- /* (yes, this _is_ crude) */
- while ((reply = Getchar()) != ERR) {
- addch(UChar(reply));
- napms(10);
+
+ do {
+ if (C1)
+ nodelay(stdscr, TRUE);
+ echochar(code | attr | COLOR_PAIR(pair));
+ if (C1) {
+ /* (yes, this _is_ crude) */
+ while ((reply = Getchar()) != ERR) {
+ addch(UChar(reply));
+ napms(10);
+ }
+ nodelay(stdscr, FALSE);
}
- nodelay(stdscr, FALSE);
- }
+ } while (--count > 0);
}
}
+#define PC_COLS 4
+
static void
-show_pc_chars(void)
+show_pc_chars(int repeat, attr_t attr, short pair)
{
unsigned code;
refresh();
for (code = 0; code < 16; ++code) {
- mvprintw(2, (int) code * 3 + 8, "%X", code);
+ mvprintw(2, (int) code * PC_COLS + 8, "%X", code);
}
for (code = 0; code < 256; code++) {
- int row = 3 + (code / 16) + (code >= 128);
- int col = 8 + (code % 16) * 3;
+ int count = repeat;
+ 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);
- switch (code) {
- case '\n':
- case '\r':
- case '\b':
- case '\f':
- case '\033':
- case 0x9b:
- /*
- * Skip the ones that do not work.
- */
- break;
- default:
- addch(code | A_ALTCHARSET);
- break;
- }
+ do {
+ switch (code) {
+ case '\n':
+ case '\r':
+ case '\b':
+ case '\f':
+ case '\033':
+ case 0x9b:
+ /*
+ * Skip the ones that do not work.
+ */
+ break;
+ default:
+ addch(code | A_ALTCHARSET | attr | COLOR_PAIR(pair));
+ break;
+ }
+ } while (--count > 0);
}
}
static void
-show_box_chars(void)
+show_box_chars(int repeat, attr_t attr, short pair)
{
+ (void) repeat;
+ attr |= COLOR_PAIR(pair);
+
erase();
attron(A_BOLD);
mvaddstr(0, 20, "Display of the ACS Line-Drawing Set");
refresh();
box(stdscr, 0, 0);
/* *INDENT-OFF* */
- mvhline(LINES / 2, 0, ACS_HLINE, COLS);
- mvvline(0, COLS / 2, ACS_VLINE, LINES);
- mvaddch(0, COLS / 2, ACS_TTEE);
- mvaddch(LINES / 2, COLS / 2, ACS_PLUS);
- mvaddch(LINES - 1, COLS / 2, ACS_BTEE);
- mvaddch(LINES / 2, 0, ACS_LTEE);
- mvaddch(LINES / 2, COLS - 1, ACS_RTEE);
+ 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);
/* *INDENT-ON* */
}
static int
-show_1_acs(int n, const char *name, chtype code)
+show_1_acs(int n, int repeat, const char *name, chtype code)
{
const int height = 16;
int row = 2 + (n % height);
int col = (n / height) * COLS / 2;
+
mvprintw(row, col, "%*s : ", COLS / 4, name);
- addch(code);
+ do {
+ addch(code);
+ } while (--repeat > 0);
return n + 1;
}
static void
-show_acs_chars(void)
+show_acs_chars(int repeat, attr_t attr, short pair)
/* display the ACS character set */
{
int n;
-#define BOTH(name) #name, name
+#define BOTH(name) #name, (name | attr | COLOR_PAIR(pair))
erase();
attron(A_BOLD);
attroff(A_BOLD);
refresh();
- n = show_1_acs(0, BOTH(ACS_ULCORNER));
- n = show_1_acs(n, BOTH(ACS_URCORNER));
- n = show_1_acs(n, BOTH(ACS_LLCORNER));
- n = show_1_acs(n, BOTH(ACS_LRCORNER));
+ n = show_1_acs(0, repeat, BOTH(ACS_ULCORNER));
+ n = show_1_acs(n, repeat, BOTH(ACS_URCORNER));
+ n = show_1_acs(n, repeat, BOTH(ACS_LLCORNER));
+ n = show_1_acs(n, repeat, BOTH(ACS_LRCORNER));
- n = show_1_acs(n, BOTH(ACS_LTEE));
- n = show_1_acs(n, BOTH(ACS_RTEE));
- n = show_1_acs(n, BOTH(ACS_TTEE));
- n = show_1_acs(n, BOTH(ACS_BTEE));
+ n = show_1_acs(n, repeat, BOTH(ACS_LTEE));
+ n = show_1_acs(n, repeat, BOTH(ACS_RTEE));
+ n = show_1_acs(n, repeat, BOTH(ACS_TTEE));
+ n = show_1_acs(n, repeat, BOTH(ACS_BTEE));
- n = show_1_acs(n, BOTH(ACS_HLINE));
- n = show_1_acs(n, BOTH(ACS_VLINE));
+ n = show_1_acs(n, repeat, BOTH(ACS_HLINE));
+ n = show_1_acs(n, repeat, BOTH(ACS_VLINE));
/*
* HPUX's ACS definitions are broken here. Just give up.
*/
#if !(defined(__hpux) && !defined(NCURSES_VERSION))
- n = show_1_acs(n, BOTH(ACS_LARROW));
- n = show_1_acs(n, BOTH(ACS_RARROW));
- n = show_1_acs(n, BOTH(ACS_UARROW));
- n = show_1_acs(n, BOTH(ACS_DARROW));
-
- n = show_1_acs(n, BOTH(ACS_BLOCK));
- n = show_1_acs(n, BOTH(ACS_BOARD));
- n = show_1_acs(n, BOTH(ACS_LANTERN));
- n = show_1_acs(n, BOTH(ACS_BULLET));
- n = show_1_acs(n, BOTH(ACS_CKBOARD));
- n = show_1_acs(n, BOTH(ACS_DEGREE));
- n = show_1_acs(n, BOTH(ACS_DIAMOND));
- n = show_1_acs(n, BOTH(ACS_PLMINUS));
- n = show_1_acs(n, BOTH(ACS_PLUS));
-
- n = show_1_acs(n, BOTH(ACS_GEQUAL));
- n = show_1_acs(n, BOTH(ACS_NEQUAL));
- n = show_1_acs(n, BOTH(ACS_LEQUAL));
-
- n = show_1_acs(n, BOTH(ACS_STERLING));
- n = show_1_acs(n, BOTH(ACS_PI));
- n = show_1_acs(n, BOTH(ACS_S1));
- n = show_1_acs(n, BOTH(ACS_S3));
- n = show_1_acs(n, BOTH(ACS_S7));
- n = show_1_acs(n, BOTH(ACS_S9));
+ n = show_1_acs(n, repeat, BOTH(ACS_LARROW));
+ n = show_1_acs(n, repeat, BOTH(ACS_RARROW));
+ n = show_1_acs(n, repeat, BOTH(ACS_UARROW));
+ n = show_1_acs(n, repeat, BOTH(ACS_DARROW));
+
+ n = show_1_acs(n, repeat, BOTH(ACS_BLOCK));
+ n = show_1_acs(n, repeat, BOTH(ACS_BOARD));
+ n = show_1_acs(n, repeat, BOTH(ACS_LANTERN));
+ n = show_1_acs(n, repeat, BOTH(ACS_BULLET));
+ n = show_1_acs(n, repeat, BOTH(ACS_CKBOARD));
+ n = show_1_acs(n, repeat, BOTH(ACS_DEGREE));
+ n = show_1_acs(n, repeat, BOTH(ACS_DIAMOND));
+ n = show_1_acs(n, repeat, BOTH(ACS_PLMINUS));
+ n = show_1_acs(n, repeat, BOTH(ACS_PLUS));
+
+ n = show_1_acs(n, repeat, BOTH(ACS_GEQUAL));
+ n = show_1_acs(n, repeat, BOTH(ACS_NEQUAL));
+ n = show_1_acs(n, repeat, BOTH(ACS_LEQUAL));
+
+ n = show_1_acs(n, repeat, BOTH(ACS_STERLING));
+ n = show_1_acs(n, repeat, BOTH(ACS_PI));
+ n = show_1_acs(n, repeat, BOTH(ACS_S1));
+ n = show_1_acs(n, repeat, BOTH(ACS_S3));
+ n = show_1_acs(n, repeat, BOTH(ACS_S7));
+ n = show_1_acs(n, repeat, BOTH(ACS_S9));
#endif
}
const char *pch_kludge = ((term != 0 && strstr(term, "linux"))
? "p=PC, "
: "");
+ chtype attr = A_NORMAL;
+ int digit = 0;
+ int repeat = 1;
+ int fg = COLOR_BLACK;
+ int bg = COLOR_BLACK;
+ unsigned at_code = 0;
+ short pair = 0;
+ void (*last_show_acs) (int, attr_t, short) = 0;
do {
switch (c) {
Repaint();
break;
case 'a':
- show_acs_chars();
+ ToggleAcs(last_show_acs, show_acs_chars);
+ break;
+ case 'p':
+ if (*pch_kludge)
+ ToggleAcs(last_show_acs, show_pc_chars);
+ else
+ beep();
break;
case 'x':
- show_box_chars();
+ ToggleAcs(last_show_acs, show_box_chars);
break;
case '0':
case '1':
case '2':
case '3':
- show_upper_chars((unsigned) ((c - '0') * 32 + 128));
+ digit = (c - '0');
+ last_show_acs = 0;
break;
- case 'p':
- show_pc_chars();
+ case '-':
+ if (digit > 0) {
+ --digit;
+ last_show_acs = 0;
+ } else {
+ beep();
+ }
+ break;
+ case '+':
+ if (digit < 3) {
+ ++digit;
+ last_show_acs = 0;
+ } else {
+ beep();
+ }
+ break;
+ case '>':
+ if (repeat < (COLS / 4))
+ ++repeat;
+ break;
+ case '<':
+ if (repeat > 1)
+ --repeat;
break;
default:
- beep();
+ if (cycle_attr(c, &at_code, &attr)
+ || cycle_colors(c, &fg, &bg, &pair)) {
+ break;
+ } else {
+ beep();
+ }
break;
}
+ if (last_show_acs != 0)
+ last_show_acs(repeat, attr, pair);
+ else
+ show_upper_chars((unsigned) (digit * 32 + 128), repeat, attr, pair);
+
mvprintw(LINES - 3, 0,
"Note: ANSI terminals may not display C1 characters.");
mvprintw(LINES - 2, 0,
- "Select: a=ACS, x=box, %s0=C1, 1,2,3=GR characters, ESC=quit",
+ "Select: a=ACS, x=box, %s0=C1, 1-3,+/- non-ASCII, </> repeat, ESC=quit",
pch_kludge);
+ if (use_colors) {
+ mvprintw(LINES - 1, 0,
+ "v/V, f/F, b/B cycle through video attributes (%s) and color %d/%d.",
+ attrs_to_cycle[at_code].name,
+ fg, bg);
+ } else {
+ mvprintw(LINES - 1, 0,
+ "v/V cycles through video attributes (%s).",
+ attrs_to_cycle[at_code].name);
+ }
refresh();
} while (!isQuit(c = Getchar()));
#if USE_WIDEC_SUPPORT
static cchar_t *
-merge_wide_attr(cchar_t *dst, cchar_t *src, attr_t attr, short pair)
+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;
*dst = *src;
if (count > 0) {
- if ((wch = typeMalloc(wchar_t, 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);
mvprintw(0, 20, "Display of Character Codes %d to %d", first, last);
attroff(A_BOLD);
- for (code = first; code <= last; code++) {
+ for (code = first; (int) code <= last; code++) {
int row = 2 + ((code - first) % 16);
int col = ((code - first) / 16) * COLS / 2;
wchar_t codes[10];
}
static int
-show_1_wacs(int n, const char *name, const cchar_t *code)
+show_1_wacs(int n, int repeat, const char *name, const cchar_t *code)
{
const int height = 16;
int row = 2 + (n % height);
int col = (n / height) * COLS / 2;
+
mvprintw(row, col, "%*s : ", COLS / 4, name);
- add_wchnstr(code, 1);
+ while (repeat-- >= 0) {
+ add_wch(code);
+ }
return n + 1;
}
#define MERGE_ATTR(wch) merge_wide_attr(&temp, wch, attr, pair)
static void
-show_wacs_chars(attr_t attr, short pair)
+show_wacs_chars(int repeat, attr_t attr, short pair)
/* display the wide-ACS character set */
{
cchar_t temp;
attroff(A_BOLD);
refresh();
- n = show_1_wacs(0, BOTH2(WACS_ULCORNER));
- n = show_1_wacs(n, BOTH2(WACS_URCORNER));
- n = show_1_wacs(n, BOTH2(WACS_LLCORNER));
- n = show_1_wacs(n, BOTH2(WACS_LRCORNER));
-
- n = show_1_wacs(n, BOTH2(WACS_LTEE));
- n = show_1_wacs(n, BOTH2(WACS_RTEE));
- n = show_1_wacs(n, BOTH2(WACS_TTEE));
- n = show_1_wacs(n, BOTH2(WACS_BTEE));
-
- n = show_1_wacs(n, BOTH2(WACS_HLINE));
- n = show_1_wacs(n, BOTH2(WACS_VLINE));
-
- n = show_1_wacs(n, BOTH2(WACS_LARROW));
- n = show_1_wacs(n, BOTH2(WACS_RARROW));
- n = show_1_wacs(n, BOTH2(WACS_UARROW));
- n = show_1_wacs(n, BOTH2(WACS_DARROW));
-
- n = show_1_wacs(n, BOTH2(WACS_BLOCK));
- n = show_1_wacs(n, BOTH2(WACS_BOARD));
- n = show_1_wacs(n, BOTH2(WACS_LANTERN));
- n = show_1_wacs(n, BOTH2(WACS_BULLET));
- n = show_1_wacs(n, BOTH2(WACS_CKBOARD));
- n = show_1_wacs(n, BOTH2(WACS_DEGREE));
- n = show_1_wacs(n, BOTH2(WACS_DIAMOND));
- n = show_1_wacs(n, BOTH2(WACS_PLMINUS));
- n = show_1_wacs(n, BOTH2(WACS_PLUS));
+ n = show_1_wacs(0, repeat, BOTH2(WACS_ULCORNER));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_URCORNER));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_LLCORNER));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_LRCORNER));
+
+ n = show_1_wacs(n, repeat, BOTH2(WACS_LTEE));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_RTEE));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_TTEE));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_BTEE));
+
+ n = show_1_wacs(n, repeat, BOTH2(WACS_HLINE));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_VLINE));
+
+ n = show_1_wacs(n, repeat, BOTH2(WACS_LARROW));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_RARROW));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_UARROW));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_DARROW));
+
+ n = show_1_wacs(n, repeat, BOTH2(WACS_BLOCK));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_BOARD));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_LANTERN));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_BULLET));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_CKBOARD));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_DEGREE));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_DIAMOND));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_PLMINUS));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_PLUS));
#ifdef CURSES_WACS_ARRAY
- n = show_1_wacs(n, BOTH2(WACS_GEQUAL));
- n = show_1_wacs(n, BOTH2(WACS_NEQUAL));
- n = show_1_wacs(n, BOTH2(WACS_LEQUAL));
-
- n = show_1_wacs(n, BOTH2(WACS_STERLING));
- n = show_1_wacs(n, BOTH2(WACS_PI));
- n = show_1_wacs(n, BOTH2(WACS_S1));
- n = show_1_wacs(n, BOTH2(WACS_S3));
- n = show_1_wacs(n, BOTH2(WACS_S7));
- n = show_1_wacs(n, BOTH2(WACS_S9));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_GEQUAL));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_NEQUAL));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_LEQUAL));
+
+ n = show_1_wacs(n, repeat, BOTH2(WACS_STERLING));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_PI));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_S1));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_S3));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_S7));
+ n = show_1_wacs(n, repeat, BOTH2(WACS_S9));
#endif
}
#define MERGE_ATTR(wch) merge_wide_attr(&temp, wch, attr, pair)
static void
-show_wbox_chars(attr_t attr, short pair)
+show_wbox_chars(int repeat, attr_t attr, short pair)
{
cchar_t temp;
+ (void) repeat;
erase();
attron(A_BOLD);
mvaddstr(0, 20, "Display of the Wide-ACS Line-Drawing Set");
#define SHOW_UTF8(n, name, code) show_2_wacs(n, name, code, attr, pair)
static void
-show_utf8_chars(attr_t attr, short pair)
+show_utf8_chars(int repeat, attr_t attr, short pair)
{
int n;
+ (void) repeat;
erase();
attron(A_BOLD);
mvaddstr(0, 20, "Display of the Wide-ACS Character Set");
/* *INDENT-ON* */
}
-/* *INDENT-OFF* */
-static struct {
- attr_t attr;
- const char *name;
-} attrs_to_cycle[] = {
- { A_NORMAL, "normal" },
- { A_BOLD, "bold" },
- { A_REVERSE, "reverse" },
- { A_UNDERLINE, "underline" },
-};
-/* *INDENT-ON* */
-
-static bool
-cycle_attr(int ch, unsigned *at_code, chtype *attr)
-{
- bool result = TRUE;
-
- switch (ch) {
- case 'v':
- if ((*at_code += 1) >= SIZEOF(attrs_to_cycle))
- *at_code = 0;
- break;
- case 'V':
- if (*at_code == 1)
- *at_code = SIZEOF(attrs_to_cycle) - 1;
- else
- *at_code -= 1;
- break;
- default:
- result = FALSE;
- break;
- }
- if (result)
- *attr = attrs_to_cycle[*at_code].attr;
- return result;
-}
-
-static bool
-cycle_colors(int ch, int *fg, int *bg, short *pair)
-{
- bool result = FALSE;
-
- if (use_colors) {
- result = TRUE;
- switch (ch) {
- case 'F':
- if ((*fg -= 1) < 0)
- *fg = COLORS - 1;
- break;
- case 'f':
- if ((*fg += 1) >= COLORS)
- *fg = 0;
- break;
- case 'B':
- if ((*bg -= 1) < 0)
- *bg = COLORS - 1;
- break;
- case 'b':
- if ((*bg += 1) < 0)
- *bg = 0;
- break;
- default:
- result = FALSE;
- break;
- }
- if (result) {
- *pair = (*fg != COLOR_BLACK || *bg != COLOR_BLACK);
- if (*pair != 0) {
- *pair = 1;
- if (init_pair(*pair, *fg, *bg) == ERR) {
- result = FALSE;
- }
- }
- }
- }
- return result;
-}
/* display the wide-ACS character set */
static void
{
int c = 'a';
int digit = 0;
- int repeat = 0;
+ int repeat = 1;
int space = ' ';
chtype attr = A_NORMAL;
int fg = COLOR_BLACK;
int bg = COLOR_BLACK;
unsigned at_code = 0;
short pair = 0;
- void (*last_show_wacs) (attr_t, short) = 0;
+ void (*last_show_wacs) (int, attr_t, short) = 0;
do {
switch (c) {
Repaint();
break;
case 'a':
- last_show_wacs = show_wacs_chars;
+ ToggleAcs(last_show_wacs, show_wacs_chars);
break;
case 'x':
- last_show_wacs = show_wbox_chars;
+ ToggleAcs(last_show_wacs, show_wbox_chars);
break;
case 'u':
- last_show_wacs = show_utf8_chars;
+ ToggleAcs(last_show_wacs, show_utf8_chars);
break;
default:
if (c < 256 && isdigit(c)) {
digit = (c - '0');
+ last_show_wacs = 0;
} else if (c == '+') {
++digit;
+ last_show_wacs = 0;
} else if (c == '-' && digit > 0) {
--digit;
+ last_show_wacs = 0;
} else if (c == '>' && repeat < (COLS / 4)) {
++repeat;
- } else if (c == '<' && repeat > 0) {
+ } else if (c == '<' && repeat > 1) {
--repeat;
} else if (c == '_') {
space = (space == ' ') ? '_' : ' ';
+ last_show_wacs = 0;
} else if (cycle_attr(c, &at_code, &attr)
|| cycle_colors(c, &fg, &bg, &pair)) {
if (last_show_wacs != 0)
beep();
break;
}
- last_show_wacs = 0;
- show_upper_widechars(digit * 32 + 128, repeat, space, attr, pair);
break;
}
if (last_show_wacs != 0)
- last_show_wacs(attr, pair);
+ last_show_wacs(repeat, attr, pair);
+ else
+ show_upper_widechars(digit * 32 + 128, repeat, space, attr, pair);
mvprintw(LINES - 3, 0,
"Select: a WACS, x box, u UTF-8, 0-9,+/- non-ASCII, </> repeat, ESC=quit");
};
#if defined(NCURSES_VERSION)
-#if NCURSES_VERSION_PATCH < 20070331
+#if (NCURSES_VERSION_PATCH < 20070331) && NCURSES_EXT_FUNCS
#define is_keypad(win) (win)->_use_keypad
#define is_scrollok(win) (win)->_scroll
+#elif !defined(is_keypad)
+#define is_keypad(win) FALSE
+#define is_scrollok(win) FALSE
#endif
#else
#define is_keypad(win) FALSE
#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)
case KEY_RIGHT:
j++;
break;
- case_QUIT:
+ case case_QUIT:
return ((pair *) 0);
#ifdef NCURSES_MOUSE_VERSION
case KEY_MOUSE:
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;
}
acs_and_scroll(void)
/* Demonstrate windows */
{
- int c, i;
+ int c;
FRAME *current = (FRAME *) 0, *neww;
WINDOW *usescr = stdscr;
#if HAVE_PUTWIN && HAVE_GETWIN
transient((FRAME *) 0, (char *) 0);
switch (c) {
case CTRL('C'):
- neww = (FRAME *) calloc(1, sizeof(FRAME));
- 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 = (FRAME *) calloc(1, sizeof(FRAME));
+ 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 CTRL('X'): /* resize window */
if (current) {
pair *tmp, ul, lr;
- int mx, my;
+ int i, mx, my;
move(0, 0);
clrtoeol();
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);
}
#if USE_WIDEC_SUPPORT
-static void
-make_fullwidth_digit(cchar_t *target, int digit)
-{
- wchar_t source[2];
-
- source[0] = digit + 0xff10;
- source[1] = 0;
- setcchar(target, source, A_NORMAL, 0, 0);
-}
-
static void
init_wide_panel(void)
{
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) {
c = KEY_DC;
break;
case ERR: /* FALLTHRU */
- case_QUIT:
+ case case_QUIT:
count = 0;
c = KEY_EXIT;
break;
}
}
-static const char *animals[] =
+static CONST_MENUS char *animals[] =
{
"Lions",
"Tigers",
MENU *m;
ITEM *items[SIZEOF(animals)];
ITEM **ip = items;
- const char **ap;
+ CONST_MENUS char **ap;
int mrows, mcols, c;
WINDOW *menuwin;
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);
size_t need = 12;
for (n = 0; t_tbl[n].name != 0; n++)
need += strlen(t_tbl[n].name) + 2;
- buf = (char *) malloc(need);
+ buf = typeMalloc(char, need);
}
sprintf(buf, "0x%02x = {", tlevel);
if (tlevel == 0) {
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);
if (item_value(*ip))
newtrace |= t_tbl[item_index(*ip)].mask;
trace(newtrace);
- _tracef("trace level interactively set to %s", tracetrace(_nc_tracing));
+ Trace(("trace level interactively set to %s", tracetrace(_nc_tracing)));
(void) mvprintw(LINES - 2, 0,
"Trace level is %s\n", tracetrace(_nc_tracing));
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:
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;
break;
#endif
-#if USE_WIDEC_SUPPORT
+#if USE_WIDEC_SUPPORT && USE_LIBPANEL
case 'O':
demo_panels(init_wide_panel, fill_wide_panel);
break;
*/
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 = (RGB_DATA *) malloc(max_colors * sizeof(RGB_DATA));
+ 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);