aboutsummaryrefslogtreecommitdiff
path: root/scripts/kconfig/libcurses/initscr.c
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/kconfig/libcurses/initscr.c')
-rw-r--r--scripts/kconfig/libcurses/initscr.c431
1 files changed, 431 insertions, 0 deletions
diff --git a/scripts/kconfig/libcurses/initscr.c b/scripts/kconfig/libcurses/initscr.c
new file mode 100644
index 000000000..66940a3cf
--- /dev/null
+++ b/scripts/kconfig/libcurses/initscr.c
@@ -0,0 +1,431 @@
1/* PDCurses */
2
3#include "curspriv.h"
4
5/*man-start**************************************************************
6
7initscr
8-------
9
10### Synopsis
11
12 WINDOW *initscr(void);
13 WINDOW *Xinitscr(int argc, char **argv);
14 int endwin(void);
15 bool isendwin(void);
16 SCREEN *newterm(const char *type, FILE *outfd, FILE *infd);
17 SCREEN *set_term(SCREEN *new);
18 void delscreen(SCREEN *sp);
19
20 int resize_term(int nlines, int ncols);
21 bool is_termresized(void);
22 const char *curses_version(void);
23 void PDC_get_version(PDC_VERSION *ver);
24
25 int set_tabsize(int tabsize);
26
27### Description
28
29 initscr() should be the first curses routine called. It will
30 initialize all curses data structures, and arrange that the first
31 call to refresh() will clear the screen. In case of error, initscr()
32 will write a message to standard error and end the program.
33
34 endwin() should be called before exiting or escaping from curses mode
35 temporarily. It will restore tty modes, move the cursor to the lower
36 left corner of the screen and reset the terminal into the proper
37 non-visual mode. To resume curses after a temporary escape, call
38 refresh() or doupdate().
39
40 isendwin() returns TRUE if endwin() has been called without a
41 subsequent refresh, unless SP is NULL.
42
43 In some implementations of curses, newterm() allows the use of
44 multiple terminals. Here, it's just an alternative interface for
45 initscr(). It always returns SP, or NULL.
46
47 delscreen() frees the memory allocated by newterm() or initscr(),
48 since it's not freed by endwin(). This function is usually not
49 needed. In PDCurses, the parameter must be the value of SP, and
50 delscreen() sets SP to NULL.
51
52 set_term() does nothing meaningful in PDCurses, but is included for
53 compatibility with other curses implementations.
54
55 resize_term() is effectively two functions: When called with nonzero
56 values for nlines and ncols, it attempts to resize the screen to the
57 given size. When called with (0, 0), it merely adjusts the internal
58 structures to match the current size after the screen is resized by
59 the user. On the currently supported platforms, SDL, Windows console,
60 and X11 allow user resizing, while DOS, OS/2, SDL and Windows console
61 allow programmatic resizing. If you want to support user resizing,
62 you should check for getch() returning KEY_RESIZE, and/or call
63 is_termresized() at appropriate times; if either condition occurs,
64 call resize_term(0, 0). Then, with either user or programmatic
65 resizing, you'll have to resize any windows you've created, as
66 appropriate; resize_term() only handles stdscr and curscr.
67
68 is_termresized() returns TRUE if the curses screen has been resized
69 by the user, and a call to resize_term() is needed. Checking for
70 KEY_RESIZE is generally preferable, unless you're not handling the
71 keyboard.
72
73 curses_version() returns a string describing the version of PDCurses.
74
75 PDC_get_version() fills a PDC_VERSION structure provided by the user
76 with more detailed version info (see curses.h).
77
78 set_tabsize() sets the tab interval, stored in TABSIZE.
79
80### Return Value
81
82 All functions return NULL on error, except endwin(), which always
83 returns OK, and resize_term(), which returns either OK or ERR.
84
85### Portability
86 X/Open ncurses NetBSD
87 initscr Y Y Y
88 endwin Y Y Y
89 isendwin Y Y Y
90 newterm Y Y Y
91 set_term Y Y Y
92 delscreen Y Y Y
93 resize_term - Y Y
94 set_tabsize - Y Y
95 curses_version - Y -
96 is_termresized - - -
97
98**man-end****************************************************************/
99
100#include <stdlib.h>
101
102char ttytype[128];
103
104const char *_curses_notice = "PDCurses " PDC_VERDOT " - " __DATE__;
105
106SCREEN *SP = (SCREEN*)NULL; /* curses variables */
107WINDOW *curscr = (WINDOW *)NULL; /* the current screen image */
108WINDOW *stdscr = (WINDOW *)NULL; /* the default screen window */
109
110int LINES = 0; /* current terminal height */
111int COLS = 0; /* current terminal width */
112int TABSIZE = 8;
113
114MOUSE_STATUS Mouse_status;
115
116extern RIPPEDOFFLINE linesripped[5];
117extern char linesrippedoff;
118
119WINDOW *initscr(void)
120{
121 int i;
122
123 PDC_LOG(("initscr() - called\n"));
124
125 if (SP && SP->alive)
126 return NULL;
127
128 SP = calloc(1, sizeof(SCREEN));
129 if (!SP)
130 return NULL;
131
132 if (PDC_scr_open() == ERR)
133 {
134 fprintf(stderr, "initscr(): Unable to create SP\n");
135 exit(8);
136 }
137
138 SP->autocr = TRUE; /* cr -> lf by default */
139 SP->raw_out = FALSE; /* tty I/O modes */
140 SP->raw_inp = FALSE; /* tty I/O modes */
141 SP->cbreak = TRUE;
142 SP->key_modifiers = 0L;
143 SP->return_key_modifiers = FALSE;
144 SP->echo = TRUE;
145 SP->visibility = 1;
146 SP->resized = FALSE;
147 SP->_trap_mbe = 0L;
148 SP->linesrippedoff = 0;
149 SP->linesrippedoffontop = 0;
150 SP->delaytenths = 0;
151 SP->line_color = -1;
152 SP->lastscr = (WINDOW *)NULL;
153 SP->dbfp = NULL;
154 SP->color_started = FALSE;
155 SP->dirty = FALSE;
156 SP->sel_start = -1;
157 SP->sel_end = -1;
158
159 SP->orig_cursor = PDC_get_cursor_mode();
160
161 LINES = SP->lines = PDC_get_rows();
162 COLS = SP->cols = PDC_get_columns();
163
164 if (LINES < 2 || COLS < 2)
165 {
166 fprintf(stderr, "initscr(): LINES=%d COLS=%d: too small.\n",
167 LINES, COLS);
168 exit(4);
169 }
170
171 curscr = newwin(LINES, COLS, 0, 0);
172 if (!curscr)
173 {
174 fprintf(stderr, "initscr(): Unable to create curscr.\n");
175 exit(2);
176 }
177
178 SP->lastscr = newwin(LINES, COLS, 0, 0);
179 if (!SP->lastscr)
180 {
181 fprintf(stderr, "initscr(): Unable to create SP->lastscr.\n");
182 exit(2);
183 }
184
185 wattrset(SP->lastscr, (chtype)(-1));
186 werase(SP->lastscr);
187
188 PDC_slk_initialize();
189 LINES -= SP->slklines;
190
191 /* We have to sort out ripped off lines here, and reduce the height
192 of stdscr by the number of lines ripped off */
193
194 for (i = 0; i < linesrippedoff; i++)
195 {
196 if (linesripped[i].line < 0)
197 (*linesripped[i].init)(newwin(1, COLS, LINES - 1, 0), COLS);
198 else
199 (*linesripped[i].init)(newwin(1, COLS,
200 SP->linesrippedoffontop++, 0), COLS);
201
202 SP->linesrippedoff++;
203 LINES--;
204 }
205
206 linesrippedoff = 0;
207
208 stdscr = newwin(LINES, COLS, SP->linesrippedoffontop, 0);
209 if (!stdscr)
210 {
211 fprintf(stderr, "initscr(): Unable to create stdscr.\n");
212 exit(1);
213 }
214
215 wclrtobot(stdscr);
216
217 /* If preserving the existing screen, don't allow a screen clear */
218
219 if (SP->_preserve)
220 {
221 untouchwin(curscr);
222 untouchwin(stdscr);
223 stdscr->_clear = FALSE;
224 curscr->_clear = FALSE;
225 }
226 else
227 curscr->_clear = TRUE;
228
229 SP->atrtab = calloc(PDC_COLOR_PAIRS, sizeof(PDC_PAIR));
230 if (!SP->atrtab)
231 return NULL;
232 PDC_init_atrtab(); /* set up default colors */
233
234 MOUSE_X_POS = MOUSE_Y_POS = -1;
235 BUTTON_STATUS(1) = BUTTON_RELEASED;
236 BUTTON_STATUS(2) = BUTTON_RELEASED;
237 BUTTON_STATUS(3) = BUTTON_RELEASED;
238 Mouse_status.changes = 0;
239
240 SP->alive = TRUE;
241
242 def_shell_mode();
243
244 sprintf(ttytype, "pdcurses|PDCurses for %s", PDC_sysname());
245
246 SP->c_buffer = malloc(_INBUFSIZ * sizeof(int));
247 if (!SP->c_buffer)
248 return NULL;
249 SP->c_pindex = 0;
250 SP->c_gindex = 1;
251
252 SP->c_ungch = malloc(NUNGETCH * sizeof(int));
253 if (!SP->c_ungch)
254 return NULL;
255 SP->c_ungind = 0;
256 SP->c_ungmax = NUNGETCH;
257
258 return stdscr;
259}
260
261#ifdef XCURSES
262WINDOW *Xinitscr(int argc, char **argv)
263{
264 PDC_LOG(("Xinitscr() - called\n"));
265
266 PDC_set_args(argc, argv);
267 return initscr();
268}
269#endif
270
271int endwin(void)
272{
273 PDC_LOG(("endwin() - called\n"));
274
275 /* Allow temporary exit from curses using endwin() */
276
277 def_prog_mode();
278 PDC_scr_close();
279
280 SP->alive = FALSE;
281
282 return OK;
283}
284
285bool isendwin(void)
286{
287 PDC_LOG(("isendwin() - called\n"));
288
289 return SP ? !(SP->alive) : FALSE;
290}
291
292SCREEN *newterm(const char *type, FILE *outfd, FILE *infd)
293{
294 PDC_LOG(("newterm() - called\n"));
295
296 return initscr() ? SP : NULL;
297}
298
299SCREEN *set_term(SCREEN *new)
300{
301 PDC_LOG(("set_term() - called\n"));
302
303 /* We only support one screen */
304
305 return (new == SP) ? SP : NULL;
306}
307
308void delscreen(SCREEN *sp)
309{
310 PDC_LOG(("delscreen() - called\n"));
311
312 if (!SP || sp != SP)
313 return;
314
315 free(SP->c_ungch);
316 free(SP->c_buffer);
317 free(SP->atrtab);
318
319 PDC_slk_free(); /* free the soft label keys, if needed */
320
321 delwin(stdscr);
322 delwin(curscr);
323 delwin(SP->lastscr);
324 stdscr = (WINDOW *)NULL;
325 curscr = (WINDOW *)NULL;
326 SP->lastscr = (WINDOW *)NULL;
327
328 SP->alive = FALSE;
329
330 PDC_scr_free();
331
332 free(SP);
333 SP = (SCREEN *)NULL;
334}
335
336int resize_term(int nlines, int ncols)
337{
338 PDC_LOG(("resize_term() - called: nlines %d\n", nlines));
339
340 if (!stdscr || PDC_resize_screen(nlines, ncols) == ERR)
341 return ERR;
342
343 SP->resized = FALSE;
344
345 SP->lines = PDC_get_rows();
346 LINES = SP->lines - SP->linesrippedoff - SP->slklines;
347 SP->cols = COLS = PDC_get_columns();
348
349 if (SP->cursrow >= SP->lines)
350 SP->cursrow = SP->lines - 1;
351 if (SP->curscol >= SP->cols)
352 SP->curscol = SP->cols - 1;
353
354 if (wresize(curscr, SP->lines, SP->cols) == ERR ||
355 wresize(stdscr, LINES, COLS) == ERR ||
356 wresize(SP->lastscr, SP->lines, SP->cols) == ERR)
357 return ERR;
358
359 werase(SP->lastscr);
360 curscr->_clear = TRUE;
361
362 if (SP->slk_winptr)
363 {
364 if (wresize(SP->slk_winptr, SP->slklines, COLS) == ERR)
365 return ERR;
366
367 wmove(SP->slk_winptr, 0, 0);
368 wclrtobot(SP->slk_winptr);
369 PDC_slk_initialize();
370 slk_noutrefresh();
371 }
372
373 touchwin(stdscr);
374 wnoutrefresh(stdscr);
375
376 return OK;
377}
378
379bool is_termresized(void)
380{
381 PDC_LOG(("is_termresized() - called\n"));
382
383 return SP->resized;
384}
385
386const char *curses_version(void)
387{
388 return _curses_notice;
389}
390
391void PDC_get_version(PDC_VERSION *ver)
392{
393 if (!ver)
394 return;
395
396 ver->flags = 0
397#ifdef PDCDEBUG
398 | PDC_VFLAG_DEBUG
399#endif
400#ifdef PDC_WIDE
401 | PDC_VFLAG_WIDE
402#endif
403#ifdef PDC_FORCE_UTF8
404 | PDC_VFLAG_UTF8
405#endif
406#ifdef PDC_DLL_BUILD
407 | PDC_VFLAG_DLL
408#endif
409#ifdef PDC_RGB
410 | PDC_VFLAG_RGB
411#endif
412 ;
413
414 ver->build = PDC_BUILD;
415 ver->major = PDC_VER_MAJOR;
416 ver->minor = PDC_VER_MINOR;
417 ver->csize = sizeof(chtype);
418 ver->bsize = sizeof(bool);
419}
420
421int set_tabsize(int tabsize)
422{
423 PDC_LOG(("set_tabsize() - called: tabsize %d\n", tabsize));
424
425 if (tabsize < 1)
426 return ERR;
427
428 TABSIZE = tabsize;
429
430 return OK;
431}