1 /****************************************************************************
2 * Copyright 2018-2021,2022 Thomas E. Dickey *
3 * Copyright 2017 Free Software Foundation, Inc. *
5 * Permission is hereby granted, free of charge, to any person obtaining a *
6 * copy of this software and associated documentation files (the *
7 * "Software"), to deal in the Software without restriction, including *
8 * without limitation the rights to use, copy, modify, merge, publish, *
9 * distribute, distribute with modifications, sublicense, and/or sell *
10 * copies of the Software, and to permit persons to whom the Software is *
11 * furnished to do so, subject to the following conditions: *
13 * The above copyright notice and this permission notice shall be included *
14 * in all copies or substantial portions of the Software. *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
19 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
20 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
21 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
22 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
24 * Except as contained in this notice, the name(s) of the above copyright *
25 * holders shall not be used in advertising or otherwise to promote the *
26 * sale, use or other dealings in this Software without prior written *
28 ****************************************************************************/
30 * $Id: demo_new_pair.c,v 1.27 2022/12/04 00:40:11 tom Exp $
32 * Demonstrate the alloc_pair() function.
35 #include <test.priv.h>
37 #include <popup_msg.h>
39 #if HAVE_ALLOC_PAIR && USE_WIDEC_SUPPORT
41 #include <sys/types.h>
45 #define MAX_BITS 8 /* all but A_ALTCHARSET */
46 #define MAX_ATTR ((1<<MAX_BITS)-1)
49 valid_cap(NCURSES_CONST char *name)
51 char *value = tigetstr(name);
52 return (value != 0 && value != (char *) -1) ? TRUE : FALSE;
58 static bool init = FALSE;
59 static attr_t table[MAX_BITS * MAX_BITS];
64 attr_t bits[MAX_BITS];
67 bits[limit++] = WA_NORMAL;
68 if (valid_cap("smso"))
69 bits[limit++] = WA_STANDOUT;
70 if (valid_cap("smul"))
71 bits[limit++] = WA_UNDERLINE;
73 bits[limit++] = WA_REVERSE;
74 if (valid_cap("blink"))
75 bits[limit++] = WA_BLINK;
77 bits[limit++] = WA_DIM;
78 if (valid_cap("bold"))
79 bits[limit++] = WA_BOLD;
80 for (j = 0; j < limit; ++j) {
81 for (k = 0; k < limit; ++k) {
82 table[j * limit + k] = bits[j] | bits[k];
86 return table[now % limit];
90 our_content(int pair, int *fg, int *bg)
93 *fg = (pair / COLORS) % COLORS;
94 *bg = (pair % COLORS);
101 our_content(now, &fg, &bg);
102 return alloc_pair(fg, bg);
109 if ((short) now > 0) {
110 if (now < COLOR_PAIRS) {
112 our_content(now, &fg, &bg);
113 if (init_pair((short) now, (short) fg, (short) bg) != OK)
126 return time((time_t *) 0);
132 static const char *msg[] =
134 "Usage: demo_new_pair [options]"
136 ,"Repeatedly print using all possible color combinations."
140 ," -g use getcchar to check setcchar"
141 ," -i use init_pair rather than alloc_pair"
142 ," -p start in paged-mode"
143 ," -s start in single-step mode"
144 ," -w print a wide-character cell"
147 for (n = 0; n < SIZEOF(msg); ++n) {
148 fprintf(stderr, "%s\n", msg[n]);
150 ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
153 #define use_pages() \
154 paged_mode = TRUE, single_mode = TRUE
156 #define use_single() \
157 paged_mode = FALSE, single_mode = TRUE
159 #define update_modes() \
160 scrollok(stdscr, !paged_mode); \
161 nodelay(stdscr, !single_mode || paged_mode)
167 main(int argc, char *argv[])
169 static const char *help[] =
171 "This program iterates over the possible color combinations,",
172 "allocating or initializing color pairs. For best results,",
173 "choose screen-width dividing evenly into the number of colors,",
176 " 32x64,32x128 256 colors",
177 " 24x44,24x88 88 colors",
178 " 32x64,24x128 16 colors",
181 " c toggle between coloring and de-coloring cells",
182 " p show one page at a time",
183 " s show one character at a time",
184 " <space> display char/page without pausing",
185 " v/V cycle through video attributes",
186 " w toggle between \"#\" and a double-width equivalent",
187 " ? print this screen (exit on any character).",
189 "To exit this program, press ^Q, ^[ or \"q\".",
194 bool check_set = FALSE;
195 bool clobber = FALSE;
196 bool hascolor = FALSE;
197 bool use_init = FALSE;
198 bool use_wide = FALSE;
199 bool paged_mode = FALSE;
200 bool single_mode = FALSE;
205 time_t start = now();
206 long total_cells = 0;
209 setlocale(LC_ALL, "");
211 while ((ch = getopt(argc, argv, OPTS_COMMON "gipsw")) != -1) {
230 ExitProgram(EXIT_SUCCESS);
232 usage(ch == OPTS_USAGE);
237 if (isatty(fileno(stderr))) {
239 } else if ((ch = open("/dev/tty", O_WRONLY)) >= 0) {
240 output = fdopen(ch, "w");
242 fprintf(stderr, "cannot open terminal for output\n");
243 ExitProgram(EXIT_FAILURE);
245 if (newterm(NULL, output, stdin) == 0) {
246 fprintf(stderr, "Cannot initialize terminal\n");
248 ExitProgram(EXIT_FAILURE);
250 (void) cbreak(); /* read chars without wait for \n */
251 (void) noecho(); /* don't echo input */
255 keypad(stdscr, TRUE);
257 if ((hascolor = has_colors())) {
265 * Repeatedly cycle through all colors, initializing pairs as needed.
266 * Provide for single-stepping, or page-at-a-time, as well as quitting.
275 popup_msg(stdscr, help);
300 if (--video_mode < 0)
301 video_mode = MAX_ATTR;
304 if (video_mode > MAX_ATTR)
308 use_wide = !use_wide;
317 my_attrs = next_attr(video_mode);
320 our_content(current, &fg, &bg);
321 my_pair = find_pair(fg, bg);
328 ? next_color(current)
329 : make_color(current));
332 my_attrs = next_attr(current);
337 wch[0] = use_wide ? 0xff03 : '#';
339 setcchar(&temp, wch, my_attrs,
341 (use_init ? NULL : (void *) &my_pair));
346 attr_t chk_attrs = 0;
350 #define AllButColor(a) ((a) & (A_ATTRIBUTES & ~A_COLOR))
352 if (getcchar(&temp, NULL, &chk_attrs, &chk_pair,
353 (use_init ? NULL : (void *) &chk_pair2)) != 2) {
355 } else if (getcchar(&temp, chk_wch, &chk_attrs, &chk_pair,
356 (use_init ? NULL : (void *) &chk_pair2)) != OK) {
358 } else if (chk_wch[0] != wch[0]) {
360 } else if (AllButColor(my_attrs) != AllButColor(chk_attrs)) {
362 } else if (my_pair != chk_pair) {
364 } else if (!use_init && (my_pair != chk_pair2)) {
368 wch[0] = (wchar_t) (problem + '0');
369 setcchar(&temp, wch, my_attrs,
371 (use_init ? NULL : (void *) &my_pair));
376 * At the end of a page, move the cursor to the home position.
378 if ((add_wch(&temp) == ERR) && paged_mode) {
379 nodelay(stdscr, !single_mode);
382 total_cells += 1 + (use_wide ? 1 : 0);
388 printf("%.1f cells/second\n",
389 (double) (total_cells) / (double) (now() - start));
391 ExitProgram(EXIT_SUCCESS);
398 printf("This program requires the ncurses alloc_pair function\n");
399 ExitProgram(EXIT_FAILURE);