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