ncurses 6.0 - patch 20170401
[ncurses.git] / test / extended_color.c
1 /****************************************************************************
2  * Copyright (c) 2017 Free Software Foundation, Inc.                        *
3  *                                                                          *
4  * Permission is hereby granted, free of charge, to any person obtaining a  *
5  * copy of this software and associated documentation files (the            *
6  * "Software"), to deal in the Software without restriction, including      *
7  * without limitation the rights to use, copy, modify, merge, publish,      *
8  * distribute, distribute with modifications, sublicense, and/or sell       *
9  * copies of the Software, and to permit persons to whom the Software is    *
10  * furnished to do so, subject to the following conditions:                 *
11  *                                                                          *
12  * The above copyright notice and this permission notice shall be included  *
13  * in all copies or substantial portions of the Software.                   *
14  *                                                                          *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
16  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
18  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
19  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
20  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
21  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
22  *                                                                          *
23  * Except as contained in this notice, the name(s) of the above copyright   *
24  * holders shall not be used in advertising or otherwise to promote the     *
25  * sale, use or other dealings in this Software without prior written       *
26  * authorization.                                                           *
27  ****************************************************************************/
28 /*
29  * $Id: extended_color.c,v 1.8 2017/04/01 19:35:18 tom Exp $
30  */
31
32 #include <test.priv.h>
33
34 #if HAVE_INIT_EXTENDED_COLOR
35
36 #define SHOW(n) ((n) == ERR ? "ERR" : "OK")
37
38 static bool opt_s = FALSE;
39
40 static void
41 failed(const char *name)
42 {
43     printw("...%s failed", name);
44     getch();
45     endwin();
46     ExitProgram(EXIT_FAILURE);
47 }
48
49 static void
50 do_pair_content(SCREEN *sp, int pair)
51 {
52     int i, f, b;
53
54     if (opt_s) {
55         i = extended_pair_content_sp(sp, pair, &f, &b);
56     } else {
57         i = extended_pair_content(0, &f, &b);
58     }
59     if (i != OK)
60         failed("pair_content");
61     printw("pair %d contains (%d,%d)\n", pair, f, b);
62     getch();
63 }
64
65 static void
66 do_init_pair(SCREEN *sp, int pair, int fg, int bg)
67 {
68     int i;
69     if (opt_s) {
70         i = init_extended_pair_sp(sp, pair, fg, bg);
71     } else {
72         i = init_extended_pair(pair, fg, bg);
73     }
74     if (i != OK)
75         failed("init_pair");
76 }
77
78 static void
79 do_init_color(SCREEN *sp, int color, int adjust)
80 {
81     int r, g, b;
82     int i;
83     if (opt_s) {
84         i = extended_color_content_sp(sp, color, &r, &g, &b);
85     } else {
86         i = extended_color_content(color, &r, &g, &b);
87     }
88
89     r = (adjust + 1000 + r) % 1000;
90     g = (adjust + 1000 + g) % 1000;
91     b = (adjust + 1000 + b) % 1000;
92
93     if (opt_s) {
94         i = init_extended_color_sp(sp, color, r, g, b);
95     } else {
96         i = init_extended_color(color, r, g, b);
97     }
98     if (i != OK)
99         failed("init_color");
100 }
101
102 static void
103 do_color_set(const char *expected, int pair)
104 {
105     int i = color_set(pair, NULL);
106     printw("%s (%s)\n", expected, SHOW(i));
107     if (i != OK)
108         failed("color_set");
109     getch();
110 }
111
112 static void
113 show_1_rgb(SCREEN *sp, const char *name, int color, int y, int x)
114 {
115     int r, g, b;
116     int i;
117     if (opt_s) {
118         i = extended_color_content_sp(sp, color, &r, &g, &b);
119     } else {
120         i = extended_color_content(color, &r, &g, &b);
121     }
122     wmove(stdscr, y, x);
123     if (i == OK) {
124         printw("%-8s %3d/%3d/%3d", name, r, g, b);
125     } else {
126         printw("%-8s %s", name, SHOW(i));
127     }
128 }
129
130 static void
131 show_rgb(SCREEN *sp)
132 {
133     int y, x;
134     getyx(stdscr, y, x);
135     show_1_rgb(sp, "RED", COLOR_RED, y + 1, x);
136     show_1_rgb(sp, "GREEN", COLOR_GREEN, y + 2, x);
137     show_1_rgb(sp, "BLUE", COLOR_BLUE, y + 3, x);
138     wmove(stdscr, y, x);
139 }
140
141 static void
142 usage(void)
143 {
144     static const char *tbl[] =
145     {
146         "Usage: extended_color",
147         "",
148         "Options:",
149         " -s   use sp-funcs",
150         NULL
151     };
152     size_t n;
153     for (n = 0; n < SIZEOF(tbl); ++n) {
154         fprintf(stderr, "%s\n", tbl[n]);
155     }
156     ExitProgram(EXIT_FAILURE);
157 }
158
159 int
160 main(int argc GCC_UNUSED, char *argv[]GCC_UNUSED)
161 {
162     int i;
163     SCREEN *sp;
164
165     while ((i = getopt(argc, argv, "s")) != -1) {
166         switch (i) {
167         case 's':
168             opt_s = TRUE;
169             break;
170         default:
171             usage();
172             /* NOTREACHED */
173         }
174     }
175
176     slk_init(1);
177     sp = newterm(NULL, stdout, stdin);
178     cbreak();
179     noecho();
180
181     if (!has_colors()) {
182         endwin();
183         fprintf(stderr, "This demo requires a color terminal\n");
184         ExitProgram(EXIT_FAILURE);
185     }
186
187     start_color();
188
189     do_pair_content(sp, 0);
190
191     printw("Initializing pair 1 to red/black\n");
192     do_init_pair(sp, 1, COLOR_RED, COLOR_BLACK);
193     do_color_set("RED/BLACK", 1);
194
195     printw("Initializing pair 2 to white/blue\n");
196     do_init_pair(sp, 2, COLOR_WHITE, COLOR_BLUE);
197     do_color_set("WHITE/BLUE", 2);
198
199     printw("Initializing pair 3 to green/black\n");
200     do_init_pair(sp, 3, COLOR_GREEN, COLOR_BLACK);
201     do_color_set("GREEN/BLACK", 3);
202
203     printw("Resetting colors to pair 0\n");
204     do_color_set("Default Colors", 0);
205
206     printw("Resetting colors to pair 1\n");
207     do_color_set("RED/BLACK", 1);
208
209     printw("Drawing soft-key tabs with pair 2\n");
210     slk_attrset(A_BOLD);        /* reverse-video is hard to see */
211     if (opt_s) {
212         extended_slk_color_sp(sp, 2);
213     } else {
214         extended_slk_color(2);
215     }
216     for (i = 1; i <= 8; ++i) {
217         char temp[80];
218         sprintf(temp, "(SLK-%d)", i);
219         slk_set(i, temp, 0);
220     }
221     slk_touch();
222     slk_noutrefresh();
223
224     if (opt_s ? can_change_color_sp(sp) : can_change_color()) {
225         do_color_set("Default Colors", 0);
226         printw("Press any key to stop...\n");
227         nodelay(stdscr, TRUE);
228         while (getch() == ERR) {
229             show_rgb(sp);
230             do_init_color(sp, COLOR_RED, 1);
231             do_init_color(sp, COLOR_BLUE, -1);
232             napms(50);
233         }
234         printw("...done");
235         nodelay(stdscr, FALSE);
236         getch();
237     }
238
239     endwin();
240
241     ExitProgram(EXIT_SUCCESS);
242 }
243
244 #else
245 int
246 main(void)
247 {
248     printf("This program requires the ncurses extended color/pair functions\n");
249     ExitProgram(EXIT_FAILURE);
250 }
251 #endif