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