ncurses 6.3 - patch 20211120
[ncurses.git] / ncurses / term.priv.h
1 /****************************************************************************
2  * Copyright 2021 Thomas E. Dickey                                          *
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 /*
30  * $Id: term.priv.h,v 1.7 2021/11/20 23:33:33 tom Exp $
31  *
32  *      term.priv.h
33  *
34  *      Header file for terminfo library objects which are private to
35  *      the library.
36  *
37  */
38
39 #ifndef _TERM_PRIV_H
40 #define _TERM_PRIV_H 1
41 /* *INDENT-OFF* */
42
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46
47 #include <ncurses_cfg.h>
48
49 #undef NCURSES_OPAQUE
50 #define NCURSES_INTERNALS 1
51 #define NCURSES_OPAQUE 0
52
53 #include <limits.h>             /* PATH_MAX */
54 #include <signal.h>             /* sig_atomic_t */
55 #include <time.h>               /* time_t */
56 #include <term.h>               /* time_t */
57
58 #ifdef USE_PTHREADS
59 #if USE_REENTRANT
60 #include <pthread.h>
61 #endif
62 #endif
63
64 /*
65  * State of tparm().
66  */
67 #define STACKSIZE 20
68
69 typedef struct {
70         union {
71                 int     num;
72                 char *  str;
73         } data;
74         bool num_type;
75 } STACK_FRAME;
76
77 #define NUM_VARS 26
78
79 typedef struct {
80         const char *    tparam_base;
81
82         STACK_FRAME     stack[STACKSIZE];
83         int             stack_ptr;
84
85         char *          out_buff;
86         size_t          out_size;
87         size_t          out_used;
88
89         char *          fmt_buff;
90         size_t          fmt_size;
91
92         int             static_vars[NUM_VARS];
93 #ifdef TRACE
94         const char *    tname;
95 #endif
96 } TPARM_STATE;
97
98 typedef struct {
99         char *          text;
100         size_t          size;
101 } TRACEBUF;
102
103 typedef struct {
104         const char *    name;
105         char *          value;
106 } ITERATOR_VARS;
107
108 /*
109  * Internals for term.h
110  */
111 typedef struct term {                   /* describe an actual terminal */
112         TERMTYPE        type;           /* terminal type description */
113         short           Filedes;        /* file description being written to */
114         TTY             Ottyb;          /* original state of the terminal */
115         TTY             Nttyb;          /* current state of the terminal */
116         int             _baudrate;      /* used to compute padding */
117         char *          _termname;      /* used for termname() */
118         TPARM_STATE     tparm_state;
119 #if NCURSES_EXT_COLORS
120         TERMTYPE2       type2;          /* extended terminal type description */
121 #endif
122 #undef TERMINAL
123 } TERMINAL;
124
125 /*
126  * Internals for soft-keys
127  */
128 typedef struct {
129         WINDOW *        win;            /* the window used in the hook      */
130         int             line;           /* lines to take, < 0 => from bottom*/
131         int             (*hook)(WINDOW *, int); /* callback for user        */
132 } ripoff_t;
133
134 /*
135  * Internals for tgetent
136  */
137 typedef struct {
138         long            sequence;
139         bool            last_used;
140         char *          fix_sgr0;       /* this holds the filtered sgr0 string */
141         char *          last_bufp;      /* help with fix_sgr0 leak */
142         TERMINAL *      last_term;
143 } TGETENT_CACHE;
144
145 #define TGETENT_MAX 4
146
147 #include <term_entry.h>         /* dbdLAST */
148
149 #ifdef USE_TERM_DRIVER
150 struct DriverTCB; /* Terminal Control Block forward declaration */
151 #endif
152
153 /*
154  * Global data which is not specific to a screen.
155  */
156 typedef struct {
157         SIG_ATOMIC_T    have_sigtstp;
158         SIG_ATOMIC_T    have_sigwinch;
159         SIG_ATOMIC_T    cleanup_nested;
160
161         bool            init_signals;
162         bool            init_screen;
163
164         char *          comp_sourcename;
165         char *          comp_termtype;
166
167         bool            have_tic_directory;
168         bool            keep_tic_directory;
169         const char *    tic_directory;
170
171         char *          dbi_list;
172         int             dbi_size;
173
174         char *          first_name;
175         char **         keyname_table;
176         int             init_keyname;
177
178         int             slk_format;
179
180         int             getstr_limit;   /* getstr_limit based on POSIX LINE_MAX */
181
182         char *          safeprint_buf;
183         size_t          safeprint_used;
184
185         TGETENT_CACHE   tgetent_cache[TGETENT_MAX];
186         int             tgetent_index;
187         long            tgetent_sequence;
188         int             terminal_count;
189
190         char *          dbd_blob;       /* string-heap for dbd_list[] */
191         char **         dbd_list;       /* distinct places to look for data */
192         int             dbd_size;       /* length of dbd_list[] */
193         time_t          dbd_time;       /* cache last updated */
194         ITERATOR_VARS   dbd_vars[dbdLAST];
195
196 #if HAVE_TSEARCH
197         void *          cached_tparm;
198         int             count_tparm;
199 #endif /* HAVE_TSEARCH */
200
201 #ifdef USE_TERM_DRIVER
202         int             (*term_driver)(struct DriverTCB*, const char*, int*);
203 #endif
204
205 #define WINDOWLIST struct _win_list
206
207 #ifndef USE_SP_WINDOWLIST
208         WINDOWLIST *    _nc_windowlist;
209 #define WindowList(sp)  _nc_globals._nc_windowlist
210 #endif
211
212 #if USE_HOME_TERMINFO
213         char *          home_terminfo;
214 #endif
215
216 #if !USE_SAFE_SPRINTF
217         int             safeprint_cols;
218         int             safeprint_rows;
219 #endif
220
221 #ifdef USE_PTHREADS
222         pthread_mutex_t mutex_curses;
223         pthread_mutex_t mutex_prescreen;
224         pthread_mutex_t mutex_screen;
225         pthread_mutex_t mutex_update;
226         pthread_mutex_t mutex_tst_tracef;
227         pthread_mutex_t mutex_tracef;
228         int             nested_tracef;
229         int             use_pthreads;
230 #define _nc_use_pthreads        _nc_globals.use_pthreads
231 #if USE_PTHREADS_EINTR
232         pthread_t       read_thread;    /* The reading thread */
233 #endif
234 #endif
235 #if USE_WIDEC_SUPPORT
236         char            key_name[MB_LEN_MAX + 1];
237 #endif
238
239 #ifdef TRACE
240         bool            trace_opened;
241         char            trace_fname[PATH_MAX];
242         int             trace_level;
243         FILE *          trace_fp;
244         int             trace_fd;
245
246         char *          tracearg_buf;
247         size_t          tracearg_used;
248
249         TRACEBUF *      tracebuf_ptr;
250         size_t          tracebuf_used;
251
252         char            tracechr_buf[40];
253
254         char *          tracedmp_buf;
255         size_t          tracedmp_used;
256
257         unsigned char * tracetry_buf;
258         size_t          tracetry_used;
259
260         char            traceatr_color_buf[2][80];
261         int             traceatr_color_sel;
262         int             traceatr_color_last;
263 #if !defined(USE_PTHREADS) && USE_REENTRANT
264         int             nested_tracef;
265 #endif
266 #endif  /* TRACE */
267
268 #if NO_LEAKS
269         bool            leak_checking;
270 #endif
271 } NCURSES_GLOBALS;
272
273 extern NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals;
274
275 #define N_RIPS 5
276
277 #ifdef USE_PTHREADS
278 typedef struct _prescreen_list {
279         struct _prescreen_list *next;
280         pthread_t       id;
281         struct screen * sp;
282 } PRESCREEN_LIST;
283 #endif
284
285 /*
286  * Global data which can be swept up into a SCREEN when one is created.
287  * It may be modified before the next SCREEN is created.
288  */
289 typedef struct {
290 #ifdef USE_PTHREADS
291         PRESCREEN_LIST *allocated;
292 #else
293         struct screen * allocated;
294 #endif
295         bool            use_env;
296         bool            filter_mode;
297         attr_t          previous_attr;
298         TPARM_STATE     tparm_state;
299         TTY *           saved_tty;      /* savetty/resetty information    */
300         bool            use_tioctl;
301         NCURSES_SP_OUTC _outch;         /* output handler if not putc */
302 #ifndef USE_SP_RIPOFF
303         ripoff_t        rippedoff[N_RIPS];
304         ripoff_t *      rsp;
305 #endif
306 #if NCURSES_NO_PADDING
307         bool            _no_padding;    /* flag to set if padding disabled */
308 #endif
309 #if BROKEN_LINKER || USE_REENTRANT
310         chtype *        real_acs_map;
311         int             _LINES;
312         int             _COLS;
313         int             _TABSIZE;
314         int             _ESCDELAY;
315         TERMINAL *      _cur_term;
316 #endif
317 #ifdef TRACE
318 #if BROKEN_LINKER || USE_REENTRANT
319         long            _outchars;
320         const char *    _tputs_trace;
321 #endif
322 #endif
323 } NCURSES_PRESCREEN;
324
325 extern NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen;
326
327 extern NCURSES_EXPORT(void) _nc_free_tparm(TERMINAL*);
328
329 #ifdef __cplusplus
330 }
331 #endif
332
333 /* *INDENT-ON* */
334
335 #endif /* _TERM_PRIV_H */