/****************************************************************************
- * Copyright (c) 1998-2017,2018 Free Software Foundation, Inc. *
+ * Copyright 2018-2021,2022 Thomas E. Dickey *
+ * Copyright 1998-2016,2017 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.506 2018/05/12 16:00:22 tom Exp $
+$Id: ncurses.c,v 1.528 2022/02/26 22:41:02 tom Exp $
***************************************************************************/
#endif
static void main_menu(bool);
-static void failed(const char *s) GCC_NORETURN;
+static GCC_NORETURN void failed(const char *s);
static void
failed(const char *s)
} else {
_nc_tracing = save_trace;
}
- trace(_nc_tracing);
+ curses_trace(_nc_tracing);
if (_nc_tracing)
Trace(("TOGGLE-TRACING ON"));
}
static void
wGetstring(WINDOW *win, char *buffer, int limit)
{
- int y0, x0, x, ch;
+ int y0, x0, x;
bool done = FALSE;
echo();
x = (int) strlen(buffer);
while (!done) {
+ int ch;
if (x > (int) strlen(buffer))
x = (int) strlen(buffer);
wmove(win, y0, x0);
} else {
_nc_tracing = save_trace;
}
- trace(_nc_tracing);
+ curses_trace(_nc_tracing);
if (_nc_tracing)
Trace(("TOGGLE-TRACING ON"));
}
addstr("Shelling out...");
def_prog_mode();
endwin();
-#ifdef __MINGW32__
+#ifdef _NC_WINDOWS
system("cmd.exe");
#else
IGNORE_RC(system("sh"));
static void
show_mouse(WINDOW *win)
{
- int y, x;
MEVENT event;
bool outside;
bool show_loc;
show_loc = wmouse_trafo(win, &event.y, &event.x, FALSE);
if (show_loc) {
+ int y, x;
getyx(win, y, x);
wmove(win, event.y, event.x);
waddch(win, '*');
{
char buf[BUFSIZ];
int first_y, first_x;
- int c;
int incount = 0;
GetchFlags flags;
scrollok(win, TRUE);
for (;;) {
+ int c;
+
while ((c = wGetchar(win)) == ERR) {
incount++;
if (blocking_getch(flags, delay)) {
setup_getch(win, flags);
wgetch_help(win, flags);
} else if (c == 'g') {
- waddstr(win, "getstr test: ");
+ waddstr(win, "wgetnstr test: ");
echo();
c = wgetnstr(win, buf, sizeof(buf) - 1);
noecho();
wint_t c;
int incount = 0;
GetchFlags flags;
- int code;
char *temp;
init_getch(win, flags, delay);
scrollok(win, TRUE);
for (;;) {
+ int code;
+
while ((code = wGet_wchar(win, &c)) == ERR) {
incount++;
if (blocking_getch(flags, delay)) {
setup_getch(win, flags);
wgetch_help(win, flags);
} else if (c == 'g') {
- waddstr(win, "getstr test: ");
+ waddstr(win, "wgetn_str test: ");
echo();
code = wgetn_wstr(win, wint_buf, BUFSIZ - 1);
noecho();
{
char save = attr_test_string[0];
int first = ((int) UChar(save)) + adjust;
- int j, k;
if (first >= ATTRSTRING_1ST) {
+ int j, k;
+
for (j = 0, k = first; j < MAX_ATTRSTRING; ++j, ++k) {
if (k > ATTRSTRING_END)
break;
werase(win);
if (attr & A_ALTCHARSET) {
const char *s;
- chtype ch;
for (s = attr_test_string; *s != '\0'; ++s) {
- ch = UChar(*s);
+ chtype ch = UChar(*s);
(void) waddch(win, ch | attr);
}
} else {
NCURSES_COLOR_T bg = COLOR_BLACK;
NCURSES_COLOR_T tx = -1;
int ac = 0;
- unsigned j, k;
WINDOW *my_wins[SIZEOF(attrs_to_test)];
ATTR_TBL my_list[SIZEOF(attrs_to_test)];
unsigned my_size = init_attr_list(my_list, termattrs());
if (my_size > 1) {
+ unsigned j, k;
+
for (j = 0; j < my_size; ++j) {
my_wins[j] = subwin(stdscr,
1, LEN_ATTRSTRING,
{
wchar_t save = wide_attr_test_string[0];
int first = ((int) normal_wchar(save)) + adjust;
- int j, k;
if (first >= ATTRSTRING_1ST) {
+ int j, k;
+
for (j = 0, k = first; j < MAX_ATTRSTRING; ++j, ++k) {
if (k > ATTRSTRING_END)
break;
attr_t attr;
cchar_t ch;
NCURSES_PAIRS_T pair;
- wchar_t wch[CCHARW_MAX];
memset(&ch, 0, sizeof(ch));
if (getbkgrnd(&ch) != ERR) {
+ wchar_t wch[CCHARW_MAX];
+
if (getcchar(&ch, wch, &attr, &pair, 0) != ERR) {
result = attr;
}
NCURSES_COLOR_T bg = COLOR_BLACK;
NCURSES_COLOR_T tx = -1;
int ac = 0;
- unsigned j, k;
W_ATTR_TBL my_list[SIZEOF(w_attrs_to_test)];
WINDOW *my_wins[SIZEOF(w_attrs_to_test)];
unsigned my_size = init_w_attr_list(my_list, term_attrs());
if (my_size > 1) {
+ unsigned j, k;
+
for (j = 0; j < my_size; ++j) {
my_wins[j] = subwin(stdscr,
1, LEN_ATTRSTRING,
int width = 8;
if (wide || zoom) {
- int have;
-
_nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
"%02d", color);
if (wide)
width = 4;
- if ((have = (int) strlen(temp)) >= width) {
+ if ((int) strlen(temp) >= width) {
int pwr2 = 0;
while ((1 << pwr2) < color)
++pwr2;
#if USE_WIDEC_SUPPORT
-#if HAVE_INIT_EXTENDED_COLOR
+#if USE_EXTENDED_COLOR
#define InitExtendedPair(p,f,g) init_extended_pair((p),(f),(g))
#define ExtendedColorSet(p) color_set((NCURSES_PAIRS_T) (p), &(p))
#define EXTENDED_PAIRS_T int
#else
-#define InitExtendedPair(p,f,g) init_pair((NCURSES_PAIRS_T) (p),(f),(g))
+#define InitExtendedPair(p,f,g) init_pair((NCURSES_PAIRS_T) (p),(NCURSES_COLOR_T)(f),(NCURSES_COLOR_T)(g))
#define ExtendedColorSet(p) color_set((NCURSES_PAIRS_T) (p), NULL)
#define EXTENDED_PAIRS_T NCURSES_PAIRS_T
#endif
int base_row = 0;
int grid_top = top + 3;
int page_size = (LINES - grid_top);
- int pairs_max = (unsigned short) (-1);
+ int pairs_max;
int colors_max = COLORS;
int col_limit;
int row_limit;
*/
if (xterm_colors) {
int n;
- int got;
char result[BUFSIZ];
int check_n;
unsigned check_r, check_g, check_b;
raw();
noecho();
+
for (n = 0; n < MaxColors; ++n) {
+ int got;
+
fprintf(stderr, "\033]4;%d;?\007", n);
got = (int) read(0, result, sizeof(result) - 1);
if (got < 0)
while (fgets(buffer, sizeof(buffer), fp) != 0) {
if (sscanf(buffer, "scale:%d", &c) == 1) {
scale = c;
+ if (scale < 100)
+ scale = 100;
+ if (scale > 1000)
+ scale = 1000;
} else if (sscanf(buffer, "%d:%d %d %d",
&c,
&red,
char *temp = strdup(s);
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) {
+ size_t test;
const char *base = s;
+
reset_mbytes(state);
test = count_mbytes(base, 0, &state);
if (test == (size_t) -1) {
MvAddCh(LINES / 2, 0, colored_chtype(ACS_LTEE, attr, pair));
MvAddCh(LINES / 2, COLS - 1, colored_chtype(ACS_RTEE, attr, pair));
/* *INDENT-ON* */
-
}
static int
static cchar_t *
merge_wide_attr(cchar_t *dst, const cchar_t *src, attr_t attr, NCURSES_PAIRS_T pair)
{
- int count;
*dst = *src;
do {
+ int count;
TEST_CCHAR(src, count, {
attr |= (test_attrs & A_ALTCHARSET);
setcchar(dst, test_wch, attr, pair, NULL);
- }
- , {
+ }, {
;
});
} while (0);
* into account, use 256 characters for the page.
*/
static void
-show_paged_widechars(int base,
- int pagesize,
+show_paged_widechars(unsigned base,
+ unsigned pagesize,
int repeat,
int space,
attr_t attr,
NCURSES_PAIRS_T pair)
{
- int first = base * pagesize;
- int last = first + pagesize - 1;
+ unsigned first = base * pagesize;
+ unsigned last = first + pagesize - 1;
int per_line = 16;
cchar_t temp;
wchar_t code;
MvPrintw(0, 20, "Display of Character Codes %#x to %#x", first, last);
attroff(A_BOLD);
- for (code = (wchar_t) first; (int) code <= last; code++) {
- int row = (2 + ((int) code - first) / per_line);
+ for (code = (wchar_t) first; code <= (wchar_t) last; code++) {
+ int row = (2 + (int) (code - (wchar_t) first) / per_line);
int col = 5 * ((int) code % per_line);
int count;
}
static void
-show_upper_widechars(int first, int repeat, int space, attr_t attr, NCURSES_PAIRS_T pair)
+show_upper_widechars(unsigned first, int repeat, int space, attr_t attr, NCURSES_PAIRS_T pair)
{
cchar_t temp;
wchar_t code;
- int last = first + 31;
+ unsigned last = first + 31;
erase();
attron(A_BOLD);
MvPrintw(0, 20, "Display of Character Codes %d to %d", first, last);
attroff(A_BOLD);
- for (code = (wchar_t) first; (int) code <= last; code++) {
- int row = 2 + ((code - first) % 16);
- int col = ((code - first) / 16) * COLS / 2;
+ for (code = (wchar_t) first; code <= (wchar_t) last; code++) {
+ int row = 2 + ((int) (code - (wchar_t) first) % 16);
+ int col = ((int) (code - (wchar_t) first) / 16) * COLS / 2;
wchar_t codes[10];
char tmp[80];
int count = repeat;
- int y, x;
_nc_SPRINTF(tmp, _nc_SLIMIT(sizeof(tmp))
"%3ld (0x%lx)", (long) code, (long) code);
setcchar(&temp, codes, attr, pair, 0);
do {
+ int y, x;
+
/*
* Give non-spacing characters something to combine with. If we
* don't, they'll bunch up in a heap on the space after the ":".
(void) mvadd_wch(LINES / 2, 0, MERGE_ATTR(0, WACS_LTEE));
(void) mvadd_wch(LINES / 2, COLS - 1, MERGE_ATTR(0, WACS_RTEE));
/* *INDENT-ON* */
-
}
#undef MERGE_ATTR
n = SHOW_UTF8(n, "WACS_S7", "\342\216\274");
(void) SHOW_UTF8(n, "WACS_S9", "\342\216\275");
/* *INDENT-ON* */
-
}
/* display the wide-ACS character set */
x_acs_test(bool recur GCC_UNUSED)
{
int c = 'a';
- int digit = 0;
+ unsigned digit = 0;
int repeat = 1;
int space = ' ';
- int pagesize = 32;
+ unsigned pagesize = 32;
attr_t attr = WA_NORMAL;
int fg = COLOR_BLACK;
int bg = COLOR_BLACK;
void (*last_show_wacs) (int, attr_t, NCURSES_PAIRS_T) = 0;
W_ATTR_TBL my_list[SIZEOF(w_attrs_to_test)];
unsigned my_size = init_w_attr_list(my_list, term_attrs());
+ char at_page[20];
+ bool pending_code = FALSE;
+ at_page[0] = '\0';
do {
switch (c) {
case CTRL('L'):
case 'u':
ToggleAcs(last_show_wacs, show_utf8_chars);
break;
+ case '@':
+ pending_code = !pending_code;
+ if (pending_code) {
+ _nc_SPRINTF(at_page, _nc_SLIMIT(sizeof(at_page)) "%02x", digit);
+ } else if (at_page[0] != '\0') {
+ _nc_SPRINTF(at_page, _nc_SLIMIT(sizeof(at_page)) "%x", digit);
+ }
+ break;
default:
- if (c < 256 && isdigit(c)) {
- digit = (c - '0');
+ if (pending_code && isxdigit(c)) {
+ size_t len = strlen(at_page);
+ if (len && at_page[0] == '0') {
+ memmove(at_page, at_page + 1, len--);
+ }
+ if (len < sizeof(at_page) - 1) {
+ at_page[len++] = (char) c;
+ at_page[len] = '\0';
+ }
+ } else if (pending_code
+ && (c == '\b' || c == KEY_BACKSPACE || c == KEY_DC)) {
+ size_t len = strlen(at_page);
+ if (len)
+ at_page[--len] = '\0';
+ } else if (c < 256 && isdigit(c)) {
+ digit = (unsigned) (c - '0');
last_show_wacs = 0;
} else if (c == '+') {
++digit;
+ _nc_SPRINTF(at_page, _nc_SLIMIT(sizeof(at_page)) "%02x", digit);
last_show_wacs = 0;
} else if (c == '-' && digit > 0) {
--digit;
+ _nc_SPRINTF(at_page, _nc_SLIMIT(sizeof(at_page)) "%02x",
+ UChar(digit));
last_show_wacs = 0;
} else if (c == '>' && repeat < (COLS / 4)) {
++repeat;
}
MvPrintw(LINES - 4, 0,
- "Select: a/d/t WACS, w=all x=box, u UTF-8, ^L repaint");
+ "Select: a/d/t WACS, w=%d/page, @",
+ pagesize);
+ printw("%s",
+ pending_code ? at_page : "page");
+ addstr(", x=box, u UTF-8, ^L repaint");
MvPrintw(LINES - 3, 2,
"0-9,+/- non-ASCII, </> repeat, _ space, ESC=quit");
if (UseColors) {
};
#undef DATA
size_t n;
- int x;
bool do_keypad = HaveKeypad(curp);
bool do_scroll = HaveScroll(curp);
char buf[BUFSIZ];
move(LINES - 4, 0);
+
for (n = 0; n < SIZEOF(legend); n++) {
+ int x;
+
switch (legend[n].code) {
default:
_nc_STRCPY(buf, legend[n].msg, sizeof(buf));
case CTRL('X'): /* resize window */
if (current) {
pair *tmp, ul, lr;
- int i, mx, my;
+ int mx, my;
move(0, 0);
clrtoeol();
wclrtobot(current->wind);
wmove(current->wind, lr.y, lr.x);
}
- if (mx > tmp->x - ul.x)
+ if (mx > tmp->x - ul.x) {
+ int i;
for (i = 0; i < my; i++) {
wmove(current->wind, i, tmp->x - ul.x + 1);
wclrtoeol(current->wind);
}
+ }
wnoutrefresh(current->wind);
memcpy(&lr, tmp, sizeof(pair));
"Number repeats. Toggle legend:? filler:a timer:t scrollmark:s."
};
int n = ((int) SIZEOF(legend) - (LINES - line));
- if (n >= 0) {
+ if (n >= 0 && n < (int) SIZEOF(legend)) {
if (move(line, 0) != ERR) {
if (show_panner_legend)
printw("%s", legend[n]);
{
static int count;
static int last;
- int c;
if ((pending_pan = (count > 0)) != FALSE) {
count--;
pending_pan = (count != 0);
} else {
for (;;) {
+ int c;
switch (c = wGetchar(win)) {
case '!':
ShellOut(FALSE);
}
_nc_SPRINTF(buf, _nc_SLIMIT(need) "0x%02x = {", tlevel);
if (tlevel == 0) {
- _nc_STRCAT(buf, t_tbl[0].name, need);
+ _nc_STRCAT(buf, t_tbl[0].name ? t_tbl[0].name : "", need);
_nc_STRCAT(buf, ", ", need);
} else {
for (n = 1; t_tbl[n].name != 0; n++)
for (ip = menu_items(m); *ip; ip++)
if (item_value(*ip))
newtrace |= t_tbl[item_index(*ip)].mask;
- trace(newtrace);
+ curses_trace(newtrace);
Trace(("trace level interactively set to %s", tracetrace(_nc_tracing)));
MvPrintw(LINES - 2, 0,
size_t have = (source ? strlen(source) : 0) + 1;
size_t need = 80 + have;
char *temp = malloc(need);
- size_t len;
if (temp != 0) {
+ size_t len;
_nc_STRNCPY(temp, source ? source : "", have + 1);
len = (size_t) (char *) field_userptr(me);
if (c <= KEY_MAX) {
static int mode = REQ_INS_MODE;
int c = wGetchar(w);
- unsigned n;
FIELD *me = current_field(f);
bool current = TRUE;
}
c = mode;
} else {
+ unsigned n;
for (n = 0; n < SIZEOF(lookup); n++) {
if (lookup[n].code == c) {
c = lookup[n].result;
static int
form_test(bool recur GCC_UNUSED)
{
- WINDOW *w;
FORM *form;
FIELD *f[12], *secure;
FIELDTYPE *fty_middle = new_fieldtype(mi_field_check, mi_char_check);
FIELDTYPE *fty_passwd = new_fieldtype(pw_field_check, pw_char_check);
- int finished = 0, c;
+ int c;
unsigned n = 0;
#ifdef NCURSES_MOUSE_VERSION
f[n] = (FIELD *) 0;
if ((form = new_form(f)) != 0) {
+ WINDOW *w;
+ int finished = 0;
display_form(form);
static int
overlap_help(int state, int flavors[OVERLAP_FLAVORS])
{
- int row;
- int col;
int item;
int limit[OVERLAP_FLAVORS];
- const char *ths, *tht;
char msg[80];
if (state < 0)
assert(state >= 0 && state < OVERLAP_FLAVORS);
for (item = 0; item < (2 * OVERLAP_FLAVORS); ++item) {
- row = item / 2;
- col = item % 2;
- ths = col ? "B" : "A";
- tht = col ? "A" : "B";
+ int row = item / 2;
+ int col = item % 2;
+ const char *ths = col ? "B" : "A";
+ const char *tht = col ? "A" : "B";
switch ((otBASE) row) {
case otBASE_refresh:
overlap_test_0(win2, win1);
break;
- case 'c': /* fill window A so it's visible */
+ case 'c': /* fill window A so it is visible */
overlap_test_1(flavor[otBASE_fill], 0, win1, 'A');
break;
- case 'd': /* fill window B so it's visible */
+ case 'd': /* fill window B so it is visible */
overlap_test_1(flavor[otBASE_fill], 1, win2, 'B');
break;
delwin(win2);
delwin(win1);
erase();
- exit_curses();
+ stop_curses();
return OK;
}
overlap_test_0(win2, win1);
break;
- case 'c': /* fill window A so it's visible */
+ case 'c': /* fill window A so it is visible */
x_overlap_test_1(flavor[otBASE_fill], 0, win1, WIDE_A);
break;
- case 'd': /* fill window B so it's visible */
+ case 'd': /* fill window B so it is visible */
x_overlap_test_1(flavor[otBASE_fill], 1, win2, WIDE_B);
break;
delwin(win2);
delwin(win1);
erase();
- exit_curses();
+ stop_curses();
return OK;
}
#endif /* USE_WIDEC_SUPPORT */
#if HAVE_COLOR_CONTENT
show_boolean_setting("can_change_color", can_change_color());
#endif
+ show_setting_name("LINES");
+ printw("%d\n", LINES);
+ show_setting_name("COLS");
+ printw("%d\n", COLS);
Pause();
erase();
- exit_curses();
+ stop_curses();
return OK;
}
#if USE_LIBPANEL
," -s msec specify nominal time for panel-demo (default: 1, to hold)"
#endif
-#if defined(NCURSES_VERSION_PATCH) && (NCURSES_VERSION_PATCH >= 20120714) && !defined(__MINGW32__)
+#if defined(NCURSES_VERSION_PATCH) && (NCURSES_VERSION_PATCH >= 20120714) && !defined(_NC_WINDOWS)
," -T call use_tioctl(TRUE) to allow SIGWINCH to override environment"
#endif
#ifdef TRACE
int (*doit) (bool);
char command;
unsigned n;
-
do {
printf("This is the ncurses main menu (uppercase for wide-characters)\n");
for (n = 0; n < SIZEOF(cmds); ++n) {
for (;;) {
char ch = '\0';
if (read(fileno(stdin), &ch, (size_t) 1) <= 0) {
- if (command == 0)
+ int save_err = errno;
+ perror("\nOOPS");
+ if (save_err == EINTR) {
+ clearerr(stdin);
+ continue;
+ } else if (command == 0) {
command = 'q';
+ }
break;
} else if (command == 0 && !isspace(UChar(ch))) {
command = ch;
if (doit != NULL && doit(FALSE) == OK) {
/*
- * This may be overkill; it's intended to reset everything back
+ * This may be overkill; it is intended to reset everything back
* to the initial terminal modes so that tests don't get in
* each other's way.
*/
{
int c;
int my_e_param = 1;
-#ifdef NCURSES_VERSION
+#ifdef NCURSES_VERSION_PATCH
+#if HAVE_USE_DEFAULT_COLORS
int default_fg = COLOR_WHITE;
int default_bg = COLOR_BLACK;
- bool assumed_colors = FALSE;
bool default_colors = FALSE;
+#if HAVE_ASSUME_DEFAULT_COLORS
+ bool assumed_colors = FALSE;
+#endif
+#endif
#endif
bool monochrome = FALSE;
#if HAVE_COLOR_CONTENT
while ((c = getopt(argc, argv, "a:dEe:fhmp:s:Tt:x")) != -1) {
switch (c) {
-#ifdef NCURSES_VERSION
+#ifdef NCURSES_VERSION_PATCH
+#if HAVE_USE_DEFAULT_COLORS
+#if HAVE_ASSUME_DEFAULT_COLORS
case 'a':
assumed_colors = TRUE;
switch (sscanf(optarg, "%d,%d", &default_fg, &default_bg)) {
break;
}
break;
+#endif
case 'd':
default_colors = TRUE;
break;
#endif
+#endif
#if HAVE_USE_ENV
case 'E':
use_env(FALSE);
nap_msec = (int) atol(optarg);
break;
#endif
-#if defined(NCURSES_VERSION_PATCH) && (NCURSES_VERSION_PATCH >= 20120714) && !defined(__MINGW32__)
+#if defined(NCURSES_VERSION_PATCH) && (NCURSES_VERSION_PATCH >= 20120714) && !defined(_NC_WINDOWS)
case 'T':
use_tioctl(TRUE);
break;
#ifdef TRACE
/* enable debugging */
#if !USE_LIBMENU
- trace(save_trace);
+ curses_trace(save_trace);
#else
if (!isatty(fileno(stdin)))
- trace(save_trace);
+ curses_trace(save_trace);
#endif /* USE_LIBMENU */
#endif /* TRACE */