150276Speter/**************************************************************************** 2176187Srafan * Copyright (c) 1998-2007,2008 Free Software Foundation, Inc. * 350276Speter * * 450276Speter * Permission is hereby granted, free of charge, to any person obtaining a * 550276Speter * copy of this software and associated documentation files (the * 650276Speter * "Software"), to deal in the Software without restriction, including * 750276Speter * without limitation the rights to use, copy, modify, merge, publish, * 850276Speter * distribute, distribute with modifications, sublicense, and/or sell * 950276Speter * copies of the Software, and to permit persons to whom the Software is * 1050276Speter * furnished to do so, subject to the following conditions: * 1150276Speter * * 1250276Speter * The above copyright notice and this permission notice shall be included * 1350276Speter * in all copies or substantial portions of the Software. * 1450276Speter * * 1550276Speter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * 1650276Speter * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * 1750276Speter * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * 1850276Speter * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * 1950276Speter * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * 2050276Speter * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * 2150276Speter * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * 2250276Speter * * 2350276Speter * Except as contained in this notice, the name(s) of the above copyright * 2450276Speter * holders shall not be used in advertising or otherwise to promote the * 2550276Speter * sale, use or other dealings in this Software without prior written * 2650276Speter * authorization. * 2750276Speter ****************************************************************************/ 2850276Speter 2950276Speter/**************************************************************************** 3050276Speter * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 * 3150276Speter * and: Eric S. Raymond <esr@snark.thyrsus.com> * 32166124Srafan * and: Thomas E. Dickey 1996-on * 3350276Speter ****************************************************************************/ 3450276Speter 3550276Speter 3650276Speter/* 37184989Srafan * $Id: curses.priv.h,v 1.394 2008/10/04 21:37:45 tom Exp $ 3850276Speter * 3950276Speter * curses.priv.h 4050276Speter * 4150276Speter * Header file for curses library objects which are private to 4250276Speter * the library. 4350276Speter * 4450276Speter */ 4550276Speter 4650276Speter#ifndef CURSES_PRIV_H 4750276Speter#define CURSES_PRIV_H 1 4850276Speter 4976726Speter#include <ncurses_dll.h> 5076726Speter 5150276Speter#ifdef __cplusplus 5250276Speterextern "C" { 5350276Speter#endif 5450276Speter 5550276Speter#include <ncurses_cfg.h> 5650276Speter 5750276Speter#if USE_RCS_IDS 5850276Speter#define MODULE_ID(id) static const char Ident[] = id; 5950276Speter#else 6050276Speter#define MODULE_ID(id) /*nothing*/ 6150276Speter#endif 6250276Speter 6350276Speter#include <stdlib.h> 6450276Speter#include <string.h> 6550276Speter#include <sys/types.h> 6650276Speter 6750276Speter#if HAVE_UNISTD_H 6850276Speter#include <unistd.h> 6950276Speter#endif 7050276Speter 7150276Speter#if HAVE_SYS_BSDTYPES_H 7250276Speter#include <sys/bsdtypes.h> /* needed for ISC */ 7350276Speter#endif 7450276Speter 7550276Speter#if HAVE_LIMITS_H 7650276Speter# include <limits.h> 7750276Speter#elif HAVE_SYS_PARAM_H 7850276Speter# include <sys/param.h> 7950276Speter#endif 8050276Speter 81166124Srafan#include <assert.h> 82166124Srafan#include <stdio.h> 83166124Srafan 84166124Srafan#include <errno.h> 85166124Srafan 8650276Speter#ifndef PATH_MAX 8750276Speter# if defined(_POSIX_PATH_MAX) 8850276Speter# define PATH_MAX _POSIX_PATH_MAX 8950276Speter# elif defined(MAXPATHLEN) 9050276Speter# define PATH_MAX MAXPATHLEN 9150276Speter# else 9250276Speter# define PATH_MAX 255 /* the Posix minimum path-size */ 9350276Speter# endif 9450276Speter#endif 9550276Speter 9650276Speter#if DECL_ERRNO 9750276Speterextern int errno; 9850276Speter#endif 9950276Speter 10050276Speter#include <nc_panel.h> 10150276Speter 10250276Speter/* Some systems have a broken 'select()', but workable 'poll()'. Use that */ 10362449Speter#if HAVE_WORKING_POLL 10450276Speter#define USE_FUNC_POLL 1 10566963Speter#if HAVE_POLL_H 10662449Speter#include <poll.h> 10750276Speter#else 10862449Speter#include <sys/poll.h> 10962449Speter#endif 11062449Speter#else 11150276Speter#define USE_FUNC_POLL 0 11250276Speter#endif 11350276Speter 11497049Speter/* include signal.h before curses.h to work-around defect in glibc 2.1.3 */ 11597049Speter#include <signal.h> 11697049Speter 11750276Speter/* Alessandro Rubini's GPM (general-purpose mouse) */ 11850276Speter#if HAVE_LIBGPM && HAVE_GPM_H 11950276Speter#define USE_GPM_SUPPORT 1 12050276Speter#else 12150276Speter#define USE_GPM_SUPPORT 0 12250276Speter#endif 12350276Speter 12450276Speter/* QNX mouse support */ 12550276Speter#if defined(__QNX__) && !defined(__QNXNTO__) 12650276Speter#define USE_QNX_MOUSE 1 12750276Speter#else 12850276Speter#define USE_QNX_MOUSE 0 12950276Speter#endif 13050276Speter 13150276Speter/* EMX mouse support */ 13250276Speter#ifdef __EMX__ 133166124Srafan#define USE_EMX_MOUSE 1 134166124Srafan#else 135166124Srafan#define USE_EMX_MOUSE 0 13650276Speter#endif 13750276Speter 13850276Speter#define DEFAULT_MAXCLICK 166 13950276Speter#define EV_MAX 8 /* size of mouse circular event queue */ 14050276Speter 14150276Speter/* 14250276Speter * If we don't have signals to support it, don't add a sigwinch handler. 14350276Speter * In any case, resizing is an extended feature. Use it if we've got it. 14450276Speter */ 14566963Speter#if !NCURSES_EXT_FUNCS 14650276Speter#undef HAVE_SIZECHANGE 147166124Srafan#define HAVE_SIZECHANGE 0 14850276Speter#endif 14950276Speter 150184989Srafan#if HAVE_SIZECHANGE && USE_SIGWINCH && defined(SIGWINCH) 15150276Speter#define USE_SIZECHANGE 1 15250276Speter#else 153166124Srafan#define USE_SIZECHANGE 0 15450276Speter#undef USE_SIGWINCH 155166124Srafan#define USE_SIGWINCH 0 15650276Speter#endif 15750276Speter 15850276Speter/* 15966963Speter * If desired, one can configure this, disabling environment variables that 16066963Speter * point to custom terminfo/termcap locations. 16166963Speter */ 16266963Speter#ifdef USE_ROOT_ENVIRON 16366963Speter#define use_terminfo_vars() 1 16466963Speter#else 16566963Speter#define use_terminfo_vars() _nc_env_access() 16676726Speterextern NCURSES_EXPORT(int) _nc_env_access (void); 16766963Speter#endif 16866963Speter 16966963Speter/* 17050276Speter * Not all platforms have memmove; some have an equivalent bcopy. (Some may 17150276Speter * have neither). 17250276Speter */ 17350276Speter#if USE_OK_BCOPY 17450276Speter#define memmove(d,s,n) bcopy(s,d,n) 17550276Speter#elif USE_MY_MEMMOVE 17650276Speter#define memmove(d,s,n) _nc_memmove(d,s,n) 17776726Speterextern NCURSES_EXPORT(void *) _nc_memmove (void *, const void *, size_t); 17850276Speter#endif 17950276Speter 18050276Speter/* 18150276Speter * Scroll hints are useless when hashmap is used 18250276Speter */ 18350276Speter#if !USE_SCROLL_HINTS 18450276Speter#if !USE_HASHMAP 18550276Speter#define USE_SCROLL_HINTS 1 18650276Speter#else 18750276Speter#define USE_SCROLL_HINTS 0 18850276Speter#endif 18950276Speter#endif 19050276Speter 19150276Speter#if USE_SCROLL_HINTS 19250276Speter#define if_USE_SCROLL_HINTS(stmt) stmt 19350276Speter#else 19450276Speter#define if_USE_SCROLL_HINTS(stmt) /*nothing*/ 19550276Speter#endif 19650276Speter 19750276Speter/* 19850276Speter * Note: ht/cbt expansion flakes out randomly under Linux 1.1.47, but only 19950276Speter * when we're throwing control codes at the screen at high volume. To see 20050276Speter * this, re-enable USE_HARD_TABS and run worm for a while. Other systems 20150276Speter * probably don't want to define this either due to uncertainties about tab 20250276Speter * delays and expansion in raw mode. 20350276Speter */ 20450276Speter 205174993Srafan#define TRIES struct tries 206174993Srafantypedef TRIES { 207174993Srafan TRIES *child; /* ptr to child. NULL if none */ 208174993Srafan TRIES *sibling; /* ptr to sibling. NULL if none */ 20950276Speter unsigned char ch; /* character at this node */ 21050276Speter unsigned short value; /* code of string so far. 0 if none. */ 211174993Srafan#undef TRIES 212174993Srafan} TRIES; 21350276Speter 21450276Speter/* 21550276Speter * Common/troublesome character definitions 21650276Speter */ 217174993Srafan#define StringOf(ch) {ch, 0} 218174993Srafan 21950276Speter#define L_BRACE '{' 22050276Speter#define R_BRACE '}' 22150276Speter#define S_QUOTE '\'' 22297049Speter#define D_QUOTE '"' 22350276Speter 224104977Sache#define VT_ACSC "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~" 225104977Sache 22650276Speter/* 22750276Speter * Structure for palette tables 22850276Speter */ 22950276Speter 23050276Spetertypedef struct 23150276Speter{ 232166124Srafan short red, green, blue; /* what color_content() returns */ 233166124Srafan short r, g, b; /* params to init_color() */ 234166124Srafan int init; /* true if we called init_color() */ 23550276Speter} 23650276Spetercolor_t; 23750276Speter 23850276Speter#define MAXCOLUMNS 135 23950276Speter#define MAXLINES 66 24050276Speter#define FIFO_SIZE MAXCOLUMNS+2 /* for nocbreak mode input */ 24150276Speter 24250276Speter#define ACS_LEN 128 24350276Speter 24450276Speter#define WINDOWLIST struct _win_list 24550276Speter 24697049Speter#if USE_WIDEC_SUPPORT 24797049Speter#define _nc_bkgd _bkgrnd 24897049Speter#else 24997049Speter#undef _XOPEN_SOURCE_EXTENDED 25097049Speter#define _nc_bkgd _bkgd 25197049Speter#define wgetbkgrnd(win, wch) *wch = win->_bkgd 25297049Speter#define wbkgrnd wbkgd 25397049Speter#endif 25497049Speter 255174993Srafan#undef NCURSES_OPAQUE 256174993Srafan#define NCURSES_INTERNALS 1 257174993Srafan#define NCURSES_OPAQUE 0 258174993Srafan 25950276Speter#include <curses.h> /* we'll use -Ipath directive to get the right one! */ 26098503Speter#include <term.h> 261166124Srafan#include <term_entry.h> 262166124Srafan#include <nc_tparm.h> 26350276Speter 264166124Srafan#if NCURSES_EXT_COLORS && USE_WIDEC_SUPPORT 265166124Srafan#define if_EXT_COLORS(stmt) stmt 266166124Srafan#define NetPair(value,p) (value).ext_color = (p), \ 267166124Srafan AttrOf(value) &= ALL_BUT_COLOR, \ 268166124Srafan AttrOf(value) |= (A_COLOR & COLOR_PAIR((p > 255) ? 255 : p)) 269166124Srafan#define SetPair(value,p) (value).ext_color = (p) 270166124Srafan#define GetPair(value) (value).ext_color 271166124Srafan#define unColor(n) (AttrOf(n) & ALL_BUT_COLOR) 272166124Srafan#define GET_WINDOW_PAIR(w) (w)->_color 273166124Srafan#define SET_WINDOW_PAIR(w,p) (w)->_color = (p) 274166124Srafan#define SameAttrOf(a,b) (AttrOf(a) == AttrOf(b) && GetPair(a) == GetPair(b)) 275166124Srafan#define VIDATTR(attr, pair) vid_attr(attr, pair, 0) 276166124Srafan#else 277166124Srafan#define if_EXT_COLORS(stmt) /* nothing */ 278166124Srafan#define SetPair(value,p) RemAttr(value, A_COLOR), \ 279166124Srafan SetAttr(value, AttrOf(value) | (A_COLOR & COLOR_PAIR(p))) 280166124Srafan#define GetPair(value) PAIR_NUMBER(AttrOf(value)) 281166124Srafan#define unColor(n) (AttrOf(n) & ALL_BUT_COLOR) 282166124Srafan#define GET_WINDOW_PAIR(w) PAIR_NUMBER(WINDOW_ATTRS(w)) 283166124Srafan#define SET_WINDOW_PAIR(w,p) WINDOW_ATTRS(w) &= ALL_BUT_COLOR, \ 284166124Srafan WINDOW_ATTRS(w) |= (A_COLOR & COLOR_PAIR(p)) 285166124Srafan#define SameAttrOf(a,b) (AttrOf(a) == AttrOf(b)) 286166124Srafan#define VIDATTR(attr, pair) vidattr(attr) 287166124Srafan#endif 288166124Srafan 289184989Srafan#if NCURSES_NO_PADDING 290184989Srafan#define GetNoPadding(sp) ((sp) ? (sp)->_no_padding : _nc_prescreen._no_padding) 291184989Srafan#define SetNoPadding(sp) _nc_set_no_padding(sp) 292184989Srafanextern NCURSES_EXPORT(void) _nc_set_no_padding(SCREEN *); 293184989Srafan#else 294184989Srafan#define GetNoPadding(sp) FALSE 295184989Srafan#define SetNoPadding(sp) /*nothing*/ 296184989Srafan#endif 297184989Srafan 298166124Srafan#define WINDOW_ATTRS(w) ((w)->_attrs) 299166124Srafan 300166124Srafan#define SCREEN_ATTRS(s) (*((s)->_current_attr)) 301166124Srafan#define GET_SCREEN_PAIR(s) GetPair(SCREEN_ATTRS(s)) 302166124Srafan#define SET_SCREEN_PAIR(s,p) SetPair(SCREEN_ATTRS(s), p) 303166124Srafan 304174993Srafan#if USE_REENTRANT 305184989SrafanNCURSES_EXPORT(int *) _nc_ptr_Lines (void); 306184989SrafanNCURSES_EXPORT(int *) _nc_ptr_Cols (void); 307184989Srafan#define ptrLines() (SP ? &(SP->_LINES) : &(_nc_prescreen._LINES)) 308184989Srafan#define ptrCols() (SP ? &(SP->_COLS) : &(_nc_prescreen._COLS)) 309184989Srafan#define SET_LINES(value) *_nc_ptr_Lines() = value 310184989Srafan#define SET_COLS(value) *_nc_ptr_Cols() = value 311174993Srafan#else 312184989Srafan#define ptrLines() &LINES 313184989Srafan#define ptrCols() &COLS 314174993Srafan#define SET_LINES(value) LINES = value 315174993Srafan#define SET_COLS(value) COLS = value 316174993Srafan#endif 317174993Srafan 318174993Srafan#define TR_MUTEX(data) _tracef("%s@%d: me:%08lX COUNT:%2u/%2d/%6d/%2d/%s%9u: " #data, \ 319174993Srafan __FILE__, __LINE__, \ 320174993Srafan (unsigned long) (pthread_self()), \ 321174993Srafan data.__data.__lock, \ 322174993Srafan data.__data.__count, \ 323174993Srafan data.__data.__owner, \ 324174993Srafan data.__data.__kind, \ 325174993Srafan (data.__data.__nusers > 5) ? " OOPS " : "", \ 326174993Srafan data.__data.__nusers) 327174993Srafan#define TR_GLOBAL_MUTEX(name) TR_MUTEX(_nc_globals.mutex_##name) 328174993Srafan 329174993Srafan#ifdef USE_PTHREADS 330178866Srafan 331174993Srafan#if USE_REENTRANT 332174993Srafan#include <pthread.h> 333184989Srafanextern NCURSES_EXPORT(void) _nc_init_pthreads(void); 334178866Srafanextern NCURSES_EXPORT(void) _nc_mutex_init(pthread_mutex_t *); 335176187Srafanextern NCURSES_EXPORT(int) _nc_mutex_lock(pthread_mutex_t *); 336176187Srafanextern NCURSES_EXPORT(int) _nc_mutex_trylock(pthread_mutex_t *); 337176187Srafanextern NCURSES_EXPORT(int) _nc_mutex_unlock(pthread_mutex_t *); 338176187Srafan#define _nc_lock_global(name) _nc_mutex_lock(&_nc_globals.mutex_##name) 339176187Srafan#define _nc_try_global(name) _nc_mutex_trylock(&_nc_globals.mutex_##name) 340176187Srafan#define _nc_unlock_global(name) _nc_mutex_unlock(&_nc_globals.mutex_##name) 341174993Srafan 342174993Srafan#else 343174993Srafan#error POSIX threads requires --enable-reentrant option 344174993Srafan#endif 345178866Srafan 346184989Srafan#if USE_WEAK_SYMBOLS 347184989Srafan#if defined(__GNUC__) 348184989Srafan# if defined __USE_ISOC99 349184989Srafan# define _cat_pragma(exp) _Pragma(#exp) 350184989Srafan# define _weak_pragma(exp) _cat_pragma(weak name) 351184989Srafan# else 352184989Srafan# define _weak_pragma(exp) 353184989Srafan# endif 354184989Srafan# define _declare(name) __extension__ extern __typeof__(name) name 355184989Srafan# define weak_symbol(name) _weak_pragma(name) _declare(name) __attribute__((weak)) 356184989Srafan#endif 357184989Srafan#endif 358184989Srafan 359184989Srafan#ifdef USE_PTHREADS 360184989Srafan# if USE_WEAK_SYMBOLS 361184989Srafanweak_symbol(pthread_sigmask); 362184989Srafanweak_symbol(pthread_self); 363184989Srafanweak_symbol(pthread_equal); 364184989Srafanweak_symbol(pthread_mutex_init); 365184989Srafanweak_symbol(pthread_mutex_lock); 366184989Srafanweak_symbol(pthread_mutex_unlock); 367184989Srafanweak_symbol(pthread_mutex_trylock); 368184989Srafanweak_symbol(pthread_mutexattr_settype); 369184989Srafanweak_symbol(pthread_mutexattr_init); 370184989Srafanextern NCURSES_EXPORT(int) _nc_sigprocmask(int, const sigset_t *, sigset_t *); 371184989Srafan# undef sigprocmask 372184989Srafan# define sigprocmask _nc_sigprocmask 373184989Srafan# endif 374184989Srafan#endif 375184989Srafan 376178866Srafan#if HAVE_NANOSLEEP 377178866Srafan#undef HAVE_NANOSLEEP 378178866Srafan#define HAVE_NANOSLEEP 0 /* nanosleep suspends all threads */ 379178866Srafan#endif 380178866Srafan 381178866Srafan#else /* !USE_PTHREADS */ 382178866Srafan 383184989Srafan#define _nc_init_pthreads() /* nothing */ 384178866Srafan#define _nc_mutex_init(obj) /* nothing */ 385178866Srafan 386174993Srafan#define _nc_lock_global(name) /* nothing */ 387174993Srafan#define _nc_try_global(name) 0 388174993Srafan#define _nc_unlock_global(name) /* nothing */ 389174993Srafan 390178866Srafan#endif /* USE_PTHREADS */ 391178866Srafan 392178866Srafan#if HAVE_GETTIMEOFDAY 393178866Srafan# define PRECISE_GETTIME 1 394178866Srafan# define TimeType struct timeval 395178866Srafan#else 396178866Srafan# define PRECISE_GETTIME 0 397178866Srafan# define TimeType time_t 398174993Srafan#endif 399174993Srafan 400166124Srafan/* 401166124Srafan * Definitions for color pairs 402166124Srafan */ 403166124Srafantypedef unsigned colorpair_t; /* type big enough to store PAIR_OF() */ 404166124Srafan#define C_SHIFT 9 /* we need more bits than there are colors */ 405166124Srafan#define C_MASK ((1 << C_SHIFT) - 1) 406166124Srafan#define PAIR_OF(fg, bg) ((((fg) & C_MASK) << C_SHIFT) | ((bg) & C_MASK)) 407166124Srafan#define isDefaultColor(c) ((c) >= COLOR_DEFAULT || (c) < 0) 408166124Srafan 409166124Srafan#define COLOR_DEFAULT C_MASK 410166124Srafan 411166124Srafan#if defined(USE_TERMLIB) && !defined(NEED_NCURSES_CH_T) 412166124Srafan 413166124Srafan#undef NCURSES_CH_T /* this is not a termlib feature */ 414166124Srafan#define NCURSES_CH_T void /* ...but we need a pointer in SCREEN */ 415166124Srafan 416166124Srafan#endif /* USE_TERMLIB */ 417166124Srafan 418166124Srafan#ifndef USE_TERMLIB 41997049Speterstruct ldat 42097049Speter{ 421166124Srafan NCURSES_CH_T *text; /* text of the line */ 422166124Srafan NCURSES_SIZE_T firstchar; /* first changed character in the line */ 423166124Srafan NCURSES_SIZE_T lastchar; /* last changed character in the line */ 424166124Srafan NCURSES_SIZE_T oldindex; /* index of the line at last update */ 42597049Speter}; 426166124Srafan#endif /* USE_TERMLIB */ 42797049Speter 428166124Srafantypedef enum { 429166124Srafan M_XTERM = -1 /* use xterm's mouse tracking? */ 430166124Srafan ,M_NONE = 0 /* no mouse device */ 431166124Srafan#if USE_GPM_SUPPORT 432166124Srafan ,M_GPM /* use GPM */ 433166124Srafan#endif 434166124Srafan#if USE_SYSMOUSE 435166124Srafan ,M_SYSMOUSE /* FreeBSD sysmouse on console */ 436166124Srafan#endif 437166124Srafan} MouseType; 438166124Srafan 43950276Speter/* 440166124Srafan * Structures for scrolling. 44150276Speter */ 44250276Speter 443166124Srafantypedef struct { 444166124Srafan unsigned long hashval; 445166124Srafan int oldcount, newcount; 446166124Srafan int oldindex, newindex; 447166124Srafan} HASHMAP; 448166124Srafan 449166124Srafan/* 450166124Srafan * Structures for soft labels. 451166124Srafan */ 452166124Srafan 453166124Srafanstruct _SLK; 454166124Srafan 455166124Srafan#ifndef USE_TERMLIB 456166124Srafan 45750276Spetertypedef struct 45850276Speter{ 459166124Srafan char *ent_text; /* text for the label */ 460166124Srafan char *form_text; /* formatted text (left/center/...) */ 461166124Srafan int ent_x; /* x coordinate of this field */ 462166124Srafan char dirty; /* this label has changed */ 463166124Srafan char visible; /* field is visible */ 46450276Speter} slk_ent; 46550276Speter 466166124Srafantypedef struct _SLK { 467166124Srafan char dirty; /* all labels have changed */ 468166124Srafan char hidden; /* soft labels are hidden */ 469166124Srafan WINDOW *win; 47050276Speter slk_ent *ent; 471166124Srafan short maxlab; /* number of available labels */ 472166124Srafan short labcnt; /* number of allocated labels */ 473166124Srafan short maxlen; /* length of labels */ 474166124Srafan NCURSES_CH_T attr; /* soft label attribute */ 47550276Speter} SLK; 47650276Speter 477166124Srafan#endif /* USE_TERMLIB */ 47897049Speter 479166124Srafantypedef struct { 480176187Srafan WINDOW *win; /* the window used in the hook */ 481166124Srafan int line; /* lines to take, < 0 => from bottom*/ 482166124Srafan int (*hook)(WINDOW *, int); /* callback for user */ 483166124Srafan} ripoff_t; 484166124Srafan 485166124Srafan#if USE_GPM_SUPPORT 486166124Srafan#undef buttons /* term.h defines this, and gpm uses it! */ 487166124Srafan#include <gpm.h> 488166124Srafan 489166124Srafan#ifdef HAVE_LIBDL 490166124Srafan/* link dynamically to GPM */ 491166124Srafantypedef int *TYPE_gpm_fd; 492166124Srafantypedef int (*TYPE_Gpm_Open) (Gpm_Connect *, int); 493166124Srafantypedef int (*TYPE_Gpm_Close) (void); 494166124Srafantypedef int (*TYPE_Gpm_GetEvent) (Gpm_Event *); 495166124Srafan 496166124Srafan#define my_gpm_fd SP->_mouse_gpm_fd 497166124Srafan#define my_Gpm_Open SP->_mouse_Gpm_Open 498166124Srafan#define my_Gpm_Close SP->_mouse_Gpm_Close 499166124Srafan#define my_Gpm_GetEvent SP->_mouse_Gpm_GetEvent 500166124Srafan#else 501166124Srafan/* link statically to GPM */ 502166124Srafan#define my_gpm_fd &gpm_fd 503166124Srafan#define my_Gpm_Open Gpm_Open 504166124Srafan#define my_Gpm_Close Gpm_Close 505166124Srafan#define my_Gpm_GetEvent Gpm_GetEvent 506166124Srafan#endif /* HAVE_LIBDL */ 507166124Srafan#endif /* USE_GPM_SUPPORT */ 508166124Srafan 509174993Srafantypedef struct { 510174993Srafan long sequence; 511174993Srafan bool last_used; 512174993Srafan char *fix_sgr0; /* this holds the filtered sgr0 string */ 513174993Srafan char *last_bufp; /* help with fix_sgr0 leak */ 514174993Srafan TERMINAL *last_term; 515174993Srafan} TGETENT_CACHE; 516174993Srafan 517174993Srafan#define TGETENT_MAX 4 518174993Srafan 519166124Srafan/* 520174993Srafan * State of tparm(). 521174993Srafan */ 522174993Srafan#define STACKSIZE 20 523174993Srafan 524174993Srafantypedef struct { 525174993Srafan union { 526174993Srafan int num; 527174993Srafan char *str; 528174993Srafan } data; 529174993Srafan bool num_type; 530174993Srafan} STACK_FRAME; 531174993Srafan 532174993Srafan#define NUM_VARS 26 533174993Srafan 534174993Srafantypedef struct { 535174993Srafan#ifdef TRACE 536174993Srafan const char *tname; 537174993Srafan#endif 538174993Srafan const char *tparam_base; 539174993Srafan 540174993Srafan STACK_FRAME stack[STACKSIZE]; 541174993Srafan int stack_ptr; 542174993Srafan 543174993Srafan char *out_buff; 544174993Srafan size_t out_size; 545174993Srafan size_t out_used; 546174993Srafan 547174993Srafan char *fmt_buff; 548174993Srafan size_t fmt_size; 549174993Srafan 550174993Srafan int dynamic_var[NUM_VARS]; 551174993Srafan int static_vars[NUM_VARS]; 552174993Srafan} TPARM_STATE; 553174993Srafan 554174993Srafantypedef struct { 555174993Srafan char *text; 556174993Srafan size_t size; 557174993Srafan} TRACEBUF; 558174993Srafan 559174993Srafan/* 560174993Srafan * The filesystem database normally uses a single-letter for the lower level 561174993Srafan * of directories. Use a hexadecimal code for filesystems which do not 562174993Srafan * preserve mixed-case names. 563174993Srafan */ 564174993Srafan#if MIXEDCASE_FILENAMES 565174993Srafan#define LEAF_FMT "%c" 566174993Srafan#else 567174993Srafan#define LEAF_FMT "%02x" 568174993Srafan#endif 569174993Srafan 570174993Srafan/* 571174993Srafan * TRACEMSE_FMT is no longer than 80 columns, there are 5 numbers that 572174993Srafan * could at most have 10 digits, and the mask contains no more than 32 bits 573174993Srafan * with each bit representing less than 15 characters. Usually the whole 574174993Srafan * string is less than 80 columns, but this buffer size is an absolute 575174993Srafan * limit. 576174993Srafan */ 577174993Srafan#define TRACEMSE_MAX (80 + (5 * 10) + (32 * 15)) 578174993Srafan#define TRACEMSE_FMT "id %2d at (%2d, %2d, %2d) state %4lx = {" /* } */ 579174993Srafan 580174993Srafan/* 581174993Srafan * Global data which is not specific to a screen. 582174993Srafan */ 583174993Srafantypedef struct { 584174993Srafan SIG_ATOMIC_T have_sigwinch; 585174993Srafan SIG_ATOMIC_T cleanup_nested; 586174993Srafan 587174993Srafan bool init_signals; 588174993Srafan bool init_screen; 589174993Srafan 590174993Srafan const char *comp_sourcename; 591174993Srafan char *comp_termtype; 592174993Srafan 593174993Srafan bool have_tic_directory; 594174993Srafan bool keep_tic_directory; 595174993Srafan const char *tic_directory; 596174993Srafan 597174993Srafan char *dbi_list; 598174993Srafan int dbi_size; 599174993Srafan 600174993Srafan char *first_name; 601174993Srafan char **keyname_table; 602174993Srafan 603176187Srafan int slk_format; 604176187Srafan 605174993Srafan char *safeprint_buf; 606174993Srafan size_t safeprint_used; 607174993Srafan 608174993Srafan TGETENT_CACHE tgetent_cache[TGETENT_MAX]; 609174993Srafan int tgetent_index; 610174993Srafan long tgetent_sequence; 611174993Srafan 612178866Srafan WINDOWLIST *_nc_windowlist; 613178866Srafan#define _nc_windows _nc_globals._nc_windowlist 614178866Srafan 615174993Srafan#if USE_HOME_TERMINFO 616174993Srafan char *home_terminfo; 617174993Srafan#endif 618174993Srafan 619174993Srafan#if !USE_SAFE_SPRINTF 620174993Srafan int safeprint_cols; 621174993Srafan int safeprint_rows; 622174993Srafan#endif 623174993Srafan 624174993Srafan#ifdef TRACE 625174993Srafan bool init_trace; 626174993Srafan char trace_fname[PATH_MAX]; 627174993Srafan int trace_level; 628174993Srafan FILE *trace_fp; 629174993Srafan 630174993Srafan char *tracearg_buf; 631174993Srafan size_t tracearg_used; 632174993Srafan 633174993Srafan TRACEBUF *tracebuf_ptr; 634174993Srafan size_t tracebuf_used; 635174993Srafan 636174993Srafan char tracechr_buf[40]; 637174993Srafan 638174993Srafan char *tracedmp_buf; 639174993Srafan size_t tracedmp_used; 640174993Srafan 641174993Srafan unsigned char *tracetry_buf; 642174993Srafan size_t tracetry_used; 643174993Srafan 644174993Srafan char traceatr_color_buf[2][80]; 645174993Srafan int traceatr_color_sel; 646174993Srafan int traceatr_color_last; 647174993Srafan 648174993Srafan#endif /* TRACE */ 649174993Srafan 650174993Srafan#ifdef USE_PTHREADS 651184989Srafan pthread_mutex_t mutex_curses; 652184989Srafan pthread_mutex_t mutex_tst_tracef; 653184989Srafan pthread_mutex_t mutex_tracef; 654184989Srafan int nested_tracef; 655184989Srafan int use_pthreads; 656184989Srafan#define _nc_use_pthreads _nc_globals.use_pthreads 657174993Srafan#endif 658174993Srafan} NCURSES_GLOBALS; 659174993Srafan 660174993Srafanextern NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals; 661174993Srafan 662174993Srafan#define N_RIPS 5 663174993Srafan 664174993Srafan/* 665178866Srafan * Global data which can be swept up into a SCREEN when one is created. 666174993Srafan * It may be modified before the next SCREEN is created. 667174993Srafan */ 668174993Srafantypedef struct { 669174993Srafan bool use_env; 670174993Srafan bool filter_mode; 671174993Srafan attr_t previous_attr; 672174993Srafan ripoff_t rippedoff[N_RIPS]; 673174993Srafan ripoff_t *rsp; 674174993Srafan TPARM_STATE tparm_state; 675174993Srafan TTY *saved_tty; /* savetty/resetty information */ 676184989Srafan#if NCURSES_NO_PADDING 677184989Srafan bool _no_padding; /* flag to set if padding disabled */ 678184989Srafan#endif 679174993Srafan#if BROKEN_LINKER || USE_REENTRANT 680174993Srafan chtype *real_acs_map; 681174993Srafan int _LINES; 682174993Srafan int _COLS; 683184989Srafan TERMINAL *_cur_term; 684174993Srafan#ifdef TRACE 685174993Srafan long _outchars; 686174993Srafan const char *_tputs_trace; 687174993Srafan#endif 688174993Srafan#endif 689174993Srafan} NCURSES_PRESCREEN; 690174993Srafan 691176187Srafan#define ripoff_sp _nc_prescreen.rsp 692176187Srafan#define ripoff_stack _nc_prescreen.rippedoff 693176187Srafan 694174993Srafanextern NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen; 695174993Srafan 696174993Srafan/* 697166124Srafan * The SCREEN structure. 698166124Srafan */ 699166124Srafan 70050276Speterstruct screen { 701166124Srafan int _ifd; /* input file ptr for screen */ 702166124Srafan FILE *_ofp; /* output file ptr for screen */ 703166124Srafan char *_setbuf; /* buffered I/O for output */ 704166124Srafan bool _filtered; /* filter() was called */ 705166124Srafan bool _buffered; /* setvbuf uses _setbuf data */ 706166124Srafan int _checkfd; /* filedesc for typeahead check */ 707166124Srafan TERMINAL *_term; /* terminal type information */ 708174993Srafan TTY _saved_tty; /* savetty/resetty information */ 709174993Srafan NCURSES_SIZE_T _lines; /* screen lines */ 710174993Srafan NCURSES_SIZE_T _columns; /* screen columns */ 71150276Speter 712174993Srafan NCURSES_SIZE_T _lines_avail; /* lines available for stdscr */ 713174993Srafan NCURSES_SIZE_T _topstolen; /* lines stolen from top */ 71450276Speter 715166124Srafan WINDOW *_curscr; /* current screen */ 716166124Srafan WINDOW *_newscr; /* virtual screen to be updated to */ 717166124Srafan WINDOW *_stdscr; /* screen's full-window context */ 71850276Speter 719174993Srafan TRIES *_keytry; /* "Try" for use with keypad mode */ 720174993Srafan TRIES *_key_ok; /* Disabled keys via keyok(,FALSE) */ 721166124Srafan bool _tried; /* keypad mode was initialized */ 722166124Srafan bool _keypad_on; /* keypad mode is currently on */ 72350276Speter 724166124Srafan bool _called_wgetch; /* check for recursion in wgetch() */ 725166124Srafan int _fifo[FIFO_SIZE]; /* input push-back buffer */ 726166124Srafan short _fifohead, /* head of fifo queue */ 727166124Srafan _fifotail, /* tail of fifo queue */ 728166124Srafan _fifopeek, /* where to peek for next char */ 729166124Srafan _fifohold; /* set if breakout marked */ 730166124Srafan 731166124Srafan int _endwin; /* are we out of window mode? */ 732166124Srafan NCURSES_CH_T *_current_attr; /* holds current attributes set */ 733166124Srafan int _coloron; /* is color enabled? */ 734166124Srafan int _color_defs; /* are colors modified */ 735166124Srafan int _cursor; /* visibility of the cursor */ 736166124Srafan int _cursrow; /* physical cursor row */ 737166124Srafan int _curscol; /* physical cursor column */ 738166124Srafan bool _notty; /* true if we cannot switch non-tty */ 739166124Srafan int _nl; /* True if NL -> CR/NL is on */ 740166124Srafan int _raw; /* True if in raw mode */ 741166124Srafan int _cbreak; /* 1 if in cbreak mode */ 742166124Srafan /* > 1 if in halfdelay mode */ 743166124Srafan int _echo; /* True if echo on */ 744166124Srafan int _use_meta; /* use the meta key? */ 745166124Srafan struct _SLK *_slk; /* ptr to soft key struct / NULL */ 746166124Srafan int slk_format; /* selected format for this screen */ 74750276Speter /* cursor movement costs; units are 10ths of milliseconds */ 74866963Speter#if NCURSES_NO_PADDING 749184989Srafan bool _no_padding; /* flag to set if padding disabled */ 75050276Speter#endif 751166124Srafan int _char_padding; /* cost of character put */ 752166124Srafan int _cr_cost; /* cost of (carriage_return) */ 753166124Srafan int _cup_cost; /* cost of (cursor_address) */ 754166124Srafan int _home_cost; /* cost of (cursor_home) */ 755166124Srafan int _ll_cost; /* cost of (cursor_to_ll) */ 75650276Speter#if USE_HARD_TABS 757166124Srafan int _ht_cost; /* cost of (tab) */ 758166124Srafan int _cbt_cost; /* cost of (backtab) */ 75950276Speter#endif /* USE_HARD_TABS */ 760166124Srafan int _cub1_cost; /* cost of (cursor_left) */ 761166124Srafan int _cuf1_cost; /* cost of (cursor_right) */ 762166124Srafan int _cud1_cost; /* cost of (cursor_down) */ 763166124Srafan int _cuu1_cost; /* cost of (cursor_up) */ 764166124Srafan int _cub_cost; /* cost of (parm_cursor_left) */ 765166124Srafan int _cuf_cost; /* cost of (parm_cursor_right) */ 766166124Srafan int _cud_cost; /* cost of (parm_cursor_down) */ 767166124Srafan int _cuu_cost; /* cost of (parm_cursor_up) */ 768166124Srafan int _hpa_cost; /* cost of (column_address) */ 769166124Srafan int _vpa_cost; /* cost of (row_address) */ 77062449Speter /* used in tty_update.c, must be chars */ 771166124Srafan int _ed_cost; /* cost of (clr_eos) */ 772166124Srafan int _el_cost; /* cost of (clr_eol) */ 773166124Srafan int _el1_cost; /* cost of (clr_bol) */ 774166124Srafan int _dch1_cost; /* cost of (delete_character) */ 775166124Srafan int _ich1_cost; /* cost of (insert_character) */ 776166124Srafan int _dch_cost; /* cost of (parm_dch) */ 777166124Srafan int _ich_cost; /* cost of (parm_ich) */ 778166124Srafan int _ech_cost; /* cost of (erase_chars) */ 779166124Srafan int _rep_cost; /* cost of (repeat_char) */ 780166124Srafan int _hpa_ch_cost; /* cost of (column_address) */ 781166124Srafan int _cup_ch_cost; /* cost of (cursor_address) */ 782166124Srafan int _cuf_ch_cost; /* cost of (parm_cursor_right) */ 783166124Srafan int _inline_cost; /* cost of inline-move */ 784166124Srafan int _smir_cost; /* cost of (enter_insert_mode) */ 785166124Srafan int _rmir_cost; /* cost of (exit_insert_mode) */ 786166124Srafan int _ip_cost; /* cost of (insert_padding) */ 78750276Speter /* used in lib_mvcur.c */ 788166124Srafan char * _address_cursor; 78966963Speter /* used in tty_update.c */ 790166124Srafan int _scrolling; /* 1 if terminal's smart enough to */ 79150276Speter 79250276Speter /* used in lib_color.c */ 793166124Srafan color_t *_color_table; /* screen's color palette */ 794166124Srafan int _color_count; /* count of colors in palette */ 795166124Srafan colorpair_t *_color_pairs; /* screen's color pair list */ 796166124Srafan int _pair_count; /* count of color pairs */ 79766963Speter#if NCURSES_EXT_FUNCS 798166124Srafan bool _default_color; /* use default colors */ 799166124Srafan bool _has_sgr_39_49; /* has ECMA default color support */ 800166124Srafan int _default_fg; /* assumed default foreground */ 801166124Srafan int _default_bg; /* assumed default background */ 80262449Speter#endif 803166124Srafan chtype _ok_attributes; /* valid attributes for terminal */ 804166124Srafan chtype _xmc_suppress; /* attributes to suppress if xmc */ 805166124Srafan chtype _xmc_triggers; /* attributes to process if xmc */ 806166124Srafan chtype * _acs_map; /* the real alternate-charset map */ 807166124Srafan bool * _screen_acs_map; 80850276Speter 809166124Srafan 81050276Speter /* used in lib_vidattr.c */ 811166124Srafan bool _use_rmso; /* true if we may use 'rmso' */ 812166124Srafan bool _use_rmul; /* true if we may use 'rmul' */ 81350276Speter 81450276Speter /* 81550276Speter * These data correspond to the state of the idcok() and idlok() 81650276Speter * functions. A caveat is in order here: the XSI and SVr4 81750276Speter * documentation specify that these functions apply to the window which 81850276Speter * is given as an argument. However, ncurses implements this logic 81950276Speter * only for the newscr/curscr update process, _not_ per-window. 82050276Speter */ 821166124Srafan bool _nc_sp_idlok; 822166124Srafan bool _nc_sp_idcok; 82350276Speter#define _nc_idlok SP->_nc_sp_idlok 82450276Speter#define _nc_idcok SP->_nc_sp_idcok 82550276Speter 82650276Speter /* 82750276Speter * These are the data that support the mouse interface. 82850276Speter */ 829166124Srafan bool _mouse_initialized; 830166124Srafan MouseType _mouse_type; 831166124Srafan int _maxclick; 832166124Srafan bool (*_mouse_event) (SCREEN *); 833166124Srafan bool (*_mouse_inline)(SCREEN *); 834184989Srafan bool (*_mouse_parse) (SCREEN *, int); 835166124Srafan void (*_mouse_resume)(SCREEN *); 836166124Srafan void (*_mouse_wrap) (SCREEN *); 837166124Srafan int _mouse_fd; /* file-descriptor, if any */ 838166124Srafan bool _mouse_active; /* true if initialized */ 839166124Srafan mmask_t _mouse_mask; 840166124Srafan NCURSES_CONST char *_mouse_xtermcap; /* string to enable/disable mouse */ 841166124Srafan MEVENT _mouse_events[EV_MAX]; /* hold the last mouse event seen */ 842166124Srafan MEVENT *_mouse_eventp; /* next free slot in event queue */ 84350276Speter 844166124Srafan#if USE_GPM_SUPPORT 845166124Srafan bool _mouse_gpm_loaded; 846166124Srafan bool _mouse_gpm_found; 847166124Srafan#ifdef HAVE_LIBDL 848184989Srafan void *_dlopen_gpm; 849166124Srafan TYPE_gpm_fd _mouse_gpm_fd; 850166124Srafan TYPE_Gpm_Open _mouse_Gpm_Open; 851166124Srafan TYPE_Gpm_Close _mouse_Gpm_Close; 852166124Srafan TYPE_Gpm_GetEvent _mouse_Gpm_GetEvent; 853166124Srafan#endif 854166124Srafan Gpm_Connect _mouse_gpm_connect; 855166124Srafan#endif /* USE_GPM_SUPPORT */ 856166124Srafan 857166124Srafan#if USE_EMX_MOUSE 858166124Srafan int _emxmouse_wfd; 859166124Srafan int _emxmouse_thread; 860166124Srafan int _emxmouse_activated; 861166124Srafan char _emxmouse_buttons[4]; 862166124Srafan#endif 863166124Srafan 864166124Srafan#if USE_SYSMOUSE 865166124Srafan MEVENT _sysmouse_fifo[FIFO_SIZE]; 866166124Srafan int _sysmouse_head; 867166124Srafan int _sysmouse_tail; 868166124Srafan int _sysmouse_char_width; /* character width */ 869166124Srafan int _sysmouse_char_height; /* character height */ 870166124Srafan int _sysmouse_old_buttons; 871166124Srafan int _sysmouse_new_buttons; 872166124Srafan#endif 873166124Srafan 87450276Speter /* 87550276Speter * This supports automatic resizing 87650276Speter */ 87750276Speter#if USE_SIZECHANGE 87850276Speter int (*_resize)(int,int); 87950276Speter#endif 88050276Speter 881166124Srafan /* 88250276Speter * These are data that support the proper handling of the panel stack on an 88350276Speter * per screen basis. 88450276Speter */ 885166124Srafan struct panelhook _panelHook; 88650276Speter 887166124Srafan bool _sig_winch; 888166124Srafan SCREEN *_next_screen; 88950276Speter 89050276Speter /* hashes for old and new lines */ 89150276Speter unsigned long *oldhash, *newhash; 892166124Srafan HASHMAP *hashtab; 89397049Speter int hashtab_len; 894174993Srafan int *_oldnum_list; 895174993Srafan int _oldnum_size; 89656639Speter 897166124Srafan bool _cleanup; /* cleanup after int/quit signal */ 898166124Srafan int (*_outch)(int); /* output handler if not putc */ 899166124Srafan 900166124Srafan int _legacy_coding; /* see use_legacy_coding() */ 901166124Srafan 902174993Srafan#if USE_REENTRANT 903174993Srafan char _ttytype[NAMESIZE]; 904174993Srafan int _ESCDELAY; 905174993Srafan int _TABSIZE; 906174993Srafan int _LINES; 907174993Srafan int _COLS; 908174993Srafan#ifdef TRACE 909178866Srafan long _outchars; 910174993Srafan const char *_tputs_trace; 911174993Srafan#endif 912174993Srafan#endif 913184989Srafan 914184989Srafan#ifdef TRACE 915184989Srafan char tracechr_buf[40]; 916184989Srafan char tracemse_buf[TRACEMSE_MAX]; 917184989Srafan#endif 918166124Srafan /* 919166124Srafan * ncurses/ncursesw are the same up to this point. 920166124Srafan */ 921166124Srafan#if USE_WIDEC_SUPPORT 922166124Srafan /* recent versions of 'screen' have partially-working support for 923166124Srafan * UTF-8, but do not permit ACS at the same time (see tty_update.c). 924166124Srafan */ 925166124Srafan bool _screen_acs_fix; 926166124Srafan#endif 92750276Speter}; 92850276Speter 92976726Speterextern NCURSES_EXPORT_VAR(SCREEN *) _nc_screen_chain; 930174993Srafanextern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; 93150276Speter 93250276Speter WINDOWLIST { 933184989Srafan WINDOW win; /* first, so WINDOW_EXT() works */ 93450276Speter WINDOWLIST *next; 935184989Srafan SCREEN *screen; /* screen containing the window */ 936166124Srafan#ifdef _XOPEN_SOURCE_EXTENDED 937166124Srafan char addch_work[(MB_LEN_MAX * 9) + 1]; 938166124Srafan unsigned addch_used; /* number of bytes in addch_work[] */ 939166124Srafan int addch_x; /* x-position for addch_work[] */ 940166124Srafan int addch_y; /* y-position for addch_work[] */ 94197049Speter#endif 94250276Speter}; 94350276Speter 944166124Srafan#define WINDOW_EXT(win,field) (((WINDOWLIST *)(win))->field) 94550276Speter 946166124Srafan/* usually in <limits.h> */ 947166124Srafan#ifndef UCHAR_MAX 948166124Srafan#define UCHAR_MAX 255 949166124Srafan#endif 950166124Srafan 95150276Speter/* The terminfo source is assumed to be 7-bit ASCII */ 95250276Speter#define is7bits(c) ((unsigned)(c) < 128) 95350276Speter 954166124Srafan/* Checks for isprint() should be done on 8-bit characters (non-wide) */ 955166124Srafan#define is8bits(c) ((unsigned)(c) <= UCHAR_MAX) 956166124Srafan 95750276Speter#ifndef min 95850276Speter#define min(a,b) ((a) > (b) ? (b) : (a)) 95950276Speter#endif 96050276Speter 96150276Speter#ifndef max 96250276Speter#define max(a,b) ((a) < (b) ? (b) : (a)) 96350276Speter#endif 96450276Speter 96550276Speter/* usually in <unistd.h> */ 96650276Speter#ifndef STDIN_FILENO 96750276Speter#define STDIN_FILENO 0 96850276Speter#endif 96950276Speter 97050276Speter#ifndef STDOUT_FILENO 97150276Speter#define STDOUT_FILENO 1 97250276Speter#endif 97350276Speter 97450276Speter#ifndef STDERR_FILENO 97550276Speter#define STDERR_FILENO 2 97650276Speter#endif 97750276Speter 97850276Speter#ifndef EXIT_SUCCESS 97950276Speter#define EXIT_SUCCESS 0 98050276Speter#endif 98150276Speter 98250276Speter#ifndef EXIT_FAILURE 98350276Speter#define EXIT_FAILURE 1 98450276Speter#endif 98550276Speter 98650276Speter#ifndef R_OK 98750276Speter#define R_OK 4 /* Test for read permission. */ 98850276Speter#endif 98950276Speter#ifndef W_OK 99050276Speter#define W_OK 2 /* Test for write permission. */ 99150276Speter#endif 99250276Speter#ifndef X_OK 99350276Speter#define X_OK 1 /* Test for execute permission. */ 99450276Speter#endif 99550276Speter#ifndef F_OK 99650276Speter#define F_OK 0 /* Test for existence. */ 99750276Speter#endif 99850276Speter 99962449Speter#if HAVE_FCNTL_H 100062449Speter#include <fcntl.h> /* may define O_BINARY */ 100162449Speter#endif 100262449Speter 100362449Speter#ifndef O_BINARY 100462449Speter#define O_BINARY 0 100562449Speter#endif 100662449Speter 1007166124Srafan#ifdef TRACE 1008174993Srafan#if USE_REENTRANT 1009174993Srafan#define COUNT_OUTCHARS(n) _nc_count_outchars(n); 1010166124Srafan#else 1011174993Srafan#define COUNT_OUTCHARS(n) _nc_outchars += (n); 1012166124Srafan#endif 1013174993Srafan#else 1014174993Srafan#define COUNT_OUTCHARS(n) /* nothing */ 1015174993Srafan#endif 1016166124Srafan 1017174993Srafan#define RESET_OUTCHARS() COUNT_OUTCHARS(-_nc_outchars) 1018174993Srafan 101997049Speter#define UChar(c) ((unsigned char)(c)) 102097049Speter#define ChCharOf(c) ((c) & (chtype)A_CHARTEXT) 1021166124Srafan#define ChAttrOf(c) ((c) & (chtype)A_ATTRIBUTES) 102250276Speter 1023166124Srafan#ifndef MB_LEN_MAX 1024166124Srafan#define MB_LEN_MAX 8 /* should be >= MB_CUR_MAX, but that may be a function */ 1025166124Srafan#endif 1026166124Srafan 102797049Speter#if USE_WIDEC_SUPPORT /* { */ 1028174993Srafan#define isEILSEQ(status) (((size_t)status == (size_t)-1) && (errno == EILSEQ)) 1029166124Srafan 1030166124Srafan#define init_mb(state) memset(&state, 0, sizeof(state)) 1031166124Srafan 1032166124Srafan#if NCURSES_EXT_COLORS 1033166124Srafan#define NulColor , 0 1034166124Srafan#else 1035166124Srafan#define NulColor /* nothing */ 1036166124Srafan#endif 1037166124Srafan 1038166124Srafan#define NulChar 0,0,0,0 /* FIXME: see CCHARW_MAX */ 103997049Speter#define CharOf(c) ((c).chars[0]) 104097049Speter#define AttrOf(c) ((c).attr) 1041174993Srafan 1042174993Srafan#define AddAttr(c,a) AttrOf(c) |= ((a) & A_ATTRIBUTES) 1043166124Srafan#define RemAttr(c,a) AttrOf(c) &= ~((a) & A_ATTRIBUTES) 1044174993Srafan#define SetAttr(c,a) AttrOf(c) = ((a) & A_ATTRIBUTES) | WidecExt(c) 1045174993Srafan 1046166124Srafan#define NewChar2(c,a) { a, { c, NulChar } NulColor } 1047166124Srafan#define NewChar(ch) NewChar2(ChCharOf(ch), ChAttrOf(ch)) 1048174993Srafan 1049174993Srafan#if CCHARW_MAX == 5 1050174993Srafan#define CharEq(a,b) (((a).attr == (b).attr) \ 1051174993Srafan && (a).chars[0] == (b).chars[0] \ 1052174993Srafan && (a).chars[1] == (b).chars[1] \ 1053174993Srafan && (a).chars[2] == (b).chars[2] \ 1054174993Srafan && (a).chars[3] == (b).chars[3] \ 1055174993Srafan && (a).chars[4] == (b).chars[4] \ 1056174993Srafan if_EXT_COLORS(&& (a).ext_color == (b).ext_color)) 1057174993Srafan#else 1058166124Srafan#define CharEq(a,b) (!memcmp(&(a), &(b), sizeof(a))) 1059174993Srafan#endif 1060174993Srafan 1061166124Srafan#define SetChar(ch,c,a) do { \ 106297049Speter NCURSES_CH_T *_cp = &ch; \ 1063166124Srafan memset(_cp, 0, sizeof(ch)); \ 1064166124Srafan _cp->chars[0] = (c); \ 1065166124Srafan _cp->attr = (a); \ 1066166124Srafan if_EXT_COLORS(SetPair(ch, PAIR_NUMBER(a))); \ 106797049Speter } while (0) 106897049Speter#define CHREF(wch) (&wch) 106997049Speter#define CHDEREF(wch) (*wch) 107097049Speter#define ARG_CH_T NCURSES_CH_T * 107197049Speter#define CARG_CH_T const NCURSES_CH_T * 107297049Speter#define PUTC_DATA char PUTC_buf[MB_LEN_MAX]; int PUTC_i, PUTC_n; \ 107397049Speter mbstate_t PUT_st; wchar_t PUTC_ch 1074166124Srafan#define PUTC_INIT init_mb (PUT_st) 1075166124Srafan#define PUTC(ch,b) do { if(!isWidecExt(ch)) { \ 1076166124Srafan if (Charable(ch)) { \ 1077166124Srafan fputc(CharOf(ch), b); \ 1078174993Srafan COUNT_OUTCHARS(1); \ 1079166124Srafan } else { \ 1080166124Srafan PUTC_INIT; \ 1081166124Srafan for (PUTC_i = 0; PUTC_i < CCHARW_MAX; ++PUTC_i) { \ 1082166124Srafan PUTC_ch = (ch).chars[PUTC_i]; \ 1083166124Srafan if (PUTC_ch == L'\0') \ 1084166124Srafan break; \ 108597049Speter PUTC_n = wcrtomb(PUTC_buf, \ 108697049Speter (ch).chars[PUTC_i], &PUT_st); \ 1087166124Srafan if (PUTC_n <= 0) { \ 1088166124Srafan if (PUTC_ch && is8bits(PUTC_ch) && PUTC_i == 0) \ 1089166124Srafan putc(PUTC_ch,b); \ 109097049Speter break; \ 1091166124Srafan } \ 109297049Speter fwrite(PUTC_buf, (unsigned) PUTC_n, 1, b); \ 1093166124Srafan } \ 1094174993Srafan COUNT_OUTCHARS(PUTC_i); \ 1095166124Srafan } } } while (0) 109650276Speter 1097174993Srafan#define BLANK NewChar2(' ', WA_NORMAL) 1098174993Srafan#define ZEROS NewChar2('\0', WA_NORMAL) 109997049Speter#define ISBLANK(ch) ((ch).chars[0] == L' ' && (ch).chars[1] == L'\0') 110097049Speter 1101166124Srafan /* 1102166124Srafan * Wide characters cannot be represented in the A_CHARTEXT mask of 1103166124Srafan * attr_t's but an application might have set a narrow character there. 1104166124Srafan * But even in that case, it would only be a printable character, or 1105166124Srafan * zero. Otherwise we can use those bits to tell if a cell is the 1106166124Srafan * first or extension part of a wide character. 1107166124Srafan */ 1108166124Srafan#define WidecExt(ch) (AttrOf(ch) & A_CHARTEXT) 1109166124Srafan#define isWidecBase(ch) (WidecExt(ch) == 1) 1110166124Srafan#define isWidecExt(ch) (WidecExt(ch) > 1 && WidecExt(ch) < 32) 1111166124Srafan#define SetWidecExt(dst, ext) AttrOf(dst) &= ~A_CHARTEXT, \ 1112166124Srafan AttrOf(dst) |= (ext + 1) 1113166124Srafan 111497049Speter#define if_WIDEC(code) code 1115166124Srafan#define Charable(ch) ((SP != 0 && SP->_legacy_coding) \ 1116166124Srafan || (AttrOf(ch) & A_ALTCHARSET) \ 1117166124Srafan || (!isWidecExt(ch) && \ 1118166124Srafan (ch).chars[1] == L'\0' && \ 1119166124Srafan _nc_is_charable(CharOf(ch)))) 112097049Speter 112197049Speter#define L(ch) L ## ch 112297049Speter#else /* }{ */ 112397049Speter#define CharOf(c) ChCharOf(c) 112497049Speter#define AttrOf(c) ChAttrOf(c) 1125166124Srafan#define AddAttr(c,a) c |= (a) 1126166124Srafan#define RemAttr(c,a) c &= ~((a) & A_ATTRIBUTES) 1127166124Srafan#define SetAttr(c,a) c = ((c) & ~A_ATTRIBUTES) | (a) 112897049Speter#define NewChar(ch) (ch) 1129166124Srafan#define NewChar2(c,a) ((c) | (a)) 1130166124Srafan#define CharEq(a,b) ((a) == (b)) 1131166124Srafan#define SetChar(ch,c,a) ch = (c) | (a) 113297049Speter#define CHREF(wch) wch 113397049Speter#define CHDEREF(wch) wch 113497049Speter#define ARG_CH_T NCURSES_CH_T 113597049Speter#define CARG_CH_T NCURSES_CH_T 113697049Speter#define PUTC_DATA int data = 0 1137166124Srafan#define PUTC(ch,b) do { data = CharOf(ch); putc(data,b); } while (0) 113897049Speter 113997049Speter#define BLANK (' '|A_NORMAL) 1140166124Srafan#define ZEROS ('\0'|A_NORMAL) 114197049Speter#define ISBLANK(ch) (CharOf(ch) == ' ') 114297049Speter 1143166124Srafan#define isWidecExt(ch) (0) 114497049Speter#define if_WIDEC(code) /* nothing */ 114597049Speter 114697049Speter#define L(ch) ch 114797049Speter#endif /* } */ 114897049Speter 114997049Speter#define AttrOfD(ch) AttrOf(CHDEREF(ch)) 115097049Speter#define CharOfD(ch) CharOf(CHDEREF(ch)) 115197049Speter#define SetChar2(wch,ch) SetChar(wch,ChCharOf(ch),ChAttrOf(ch)) 115297049Speter 115397049Speter#define BLANK_ATTR A_NORMAL 115497049Speter#define BLANK_TEXT L(' ') 115597049Speter 115650276Speter#define CHANGED -1 115750276Speter 1158166124Srafan#define LEGALYX(w, y, x) \ 1159166124Srafan ((w) != 0 && \ 1160166124Srafan ((x) >= 0 && (x) <= (w)->_maxx && \ 1161166124Srafan (y) >= 0 && (y) <= (w)->_maxy)) 1162166124Srafan 116350276Speter#define CHANGED_CELL(line,col) \ 116450276Speter if (line->firstchar == _NOCHANGE) \ 116550276Speter line->firstchar = line->lastchar = col; \ 116650276Speter else if ((col) < line->firstchar) \ 116750276Speter line->firstchar = col; \ 116850276Speter else if ((col) > line->lastchar) \ 116950276Speter line->lastchar = col 117050276Speter 117150276Speter#define CHANGED_RANGE(line,start,end) \ 117250276Speter if (line->firstchar == _NOCHANGE \ 117350276Speter || line->firstchar > (start)) \ 117450276Speter line->firstchar = start; \ 117550276Speter if (line->lastchar == _NOCHANGE \ 117650276Speter || line->lastchar < (end)) \ 117750276Speter line->lastchar = end 117850276Speter 117950276Speter#define CHANGED_TO_EOL(line,start,end) \ 118050276Speter if (line->firstchar == _NOCHANGE \ 118150276Speter || line->firstchar > (start)) \ 118250276Speter line->firstchar = start; \ 118350276Speter line->lastchar = end 118450276Speter 118550276Speter#define SIZEOF(v) (sizeof(v)/sizeof(v[0])) 118662449Speter 118762449Speter#define FreeIfNeeded(p) if ((p) != 0) free(p) 118862449Speter 118962449Speter/* FreeAndNull() is not a comma-separated expression because some compilers 119062449Speter * do not accept a mixture of void with values. 119162449Speter */ 119250276Speter#define FreeAndNull(p) free(p); p = 0 119350276Speter 119450276Speter#include <nc_alloc.h> 119550276Speter 119650276Speter/* 1197166124Srafan * TTY bit definition for converting tabs to spaces. 1198166124Srafan */ 1199166124Srafan#ifdef TAB3 1200166124Srafan# define OFLAGS_TABS TAB3 /* POSIX specifies TAB3 */ 1201166124Srafan#else 1202166124Srafan# ifdef XTABS 1203166124Srafan# define OFLAGS_TABS XTABS /* XTABS is usually the "same" */ 1204166124Srafan# else 1205166124Srafan# ifdef OXTABS 1206166124Srafan# define OFLAGS_TABS OXTABS /* the traditional BSD equivalent */ 1207166124Srafan# else 1208166124Srafan# define OFLAGS_TABS 0 1209166124Srafan# endif 1210166124Srafan# endif 1211166124Srafan#endif 1212166124Srafan 1213166124Srafan/* 1214178866Srafan * Standardize/simplify common loops 1215178866Srafan */ 1216178866Srafan#define each_screen(p) p = _nc_screen_chain; p != 0; p = (p)->_next_screen 1217178866Srafan#define each_window(p) p = _nc_windows; p != 0; p = (p)->next 1218178866Srafan#define each_ripoff(p) p = ripoff_stack; (p - ripoff_stack) < N_RIPS; ++p 1219178866Srafan 1220178866Srafan/* 122150276Speter * Prefixes for call/return points of library function traces. We use these to 122250276Speter * instrument the public functions so that the traces can be easily transformed 122350276Speter * into regression scripts. 122450276Speter */ 122597049Speter#define T_CALLED(fmt) "called {" fmt 122697049Speter#define T_CREATE(fmt) "create :" fmt 122797049Speter#define T_RETURN(fmt) "return }" fmt 122850276Speter 122950276Speter#ifdef TRACE 1230166124Srafan 1231174993Srafan#if USE_REENTRANT 1232174993Srafan#define TPUTS_TRACE(s) _nc_set_tputs_trace(s); 1233174993Srafan#else 1234174993Srafan#define TPUTS_TRACE(s) _nc_tputs_trace = s; 1235174993Srafan#endif 1236174993Srafan 1237166124Srafan#define START_TRACE() \ 1238166124Srafan if ((_nc_tracing & TRACE_MAXIMUM) == 0) { \ 1239166124Srafan int t = _nc_getenv_num("NCURSES_TRACE"); \ 1240166124Srafan if (t >= 0) \ 1241166124Srafan trace((unsigned) t); \ 1242166124Srafan } 1243166124Srafan 1244174993Srafan/* 1245174993Srafan * Many of the _tracef() calls use static buffers; lock the trace state before 1246174993Srafan * trying to fill them. 1247174993Srafan */ 1248174993Srafan#if USE_REENTRANT 1249174993Srafan#define USE_TRACEF(mask) _nc_use_tracef(mask) 1250174993Srafanextern NCURSES_EXPORT(int) _nc_use_tracef (unsigned); 1251174993Srafanextern NCURSES_EXPORT(void) _nc_locked_tracef (const char *, ...) GCC_PRINTFLIKE(1,2); 1252174993Srafan#else 1253174993Srafan#define USE_TRACEF(mask) (_nc_tracing & (mask)) 1254174993Srafan#define _nc_locked_tracef _tracef 1255174993Srafan#endif 1256174993Srafan 1257174993Srafan#define TR(n, a) if (USE_TRACEF(n)) _nc_locked_tracef a 125850276Speter#define T(a) TR(TRACE_CALLS, a) 125950276Speter#define TRACE_RETURN(value,type) return _nc_retrace_##type(value) 1260166124Srafan 1261166124Srafan#define returnAttr(code) TRACE_RETURN(code,attr_t) 1262166124Srafan#define returnBits(code) TRACE_RETURN(code,unsigned) 1263166124Srafan#define returnBool(code) TRACE_RETURN(code,bool) 1264166124Srafan#define returnCPtr(code) TRACE_RETURN(code,cptr) 1265166124Srafan#define returnCVoidPtr(code) TRACE_RETURN(code,cvoid_ptr) 1266166124Srafan#define returnChar(code) TRACE_RETURN(code,chtype) 1267166124Srafan#define returnCode(code) TRACE_RETURN(code,int) 1268166124Srafan#define returnPtr(code) TRACE_RETURN(code,ptr) 1269166124Srafan#define returnSP(code) TRACE_RETURN(code,sp) 1270166124Srafan#define returnVoid T((T_RETURN(""))); return 1271166124Srafan#define returnVoidPtr(code) TRACE_RETURN(code,void_ptr) 1272166124Srafan#define returnWin(code) TRACE_RETURN(code,win) 1273166124Srafan 1274166124Srafanextern NCURSES_EXPORT(NCURSES_BOOL) _nc_retrace_bool (NCURSES_BOOL); 1275166124Srafanextern NCURSES_EXPORT(NCURSES_CONST void *) _nc_retrace_cvoid_ptr (NCURSES_CONST void *); 1276166124Srafanextern NCURSES_EXPORT(SCREEN *) _nc_retrace_sp (SCREEN *); 1277166124Srafanextern NCURSES_EXPORT(WINDOW *) _nc_retrace_win (WINDOW *); 1278166124Srafanextern NCURSES_EXPORT(attr_t) _nc_retrace_attr_t (attr_t); 1279166124Srafanextern NCURSES_EXPORT(char *) _nc_retrace_ptr (char *); 1280166124Srafanextern NCURSES_EXPORT(char *) _nc_trace_ttymode(TTY *tty); 1281166124Srafanextern NCURSES_EXPORT(char *) _nc_varargs (const char *, va_list); 1282166124Srafanextern NCURSES_EXPORT(chtype) _nc_retrace_chtype (chtype); 1283166124Srafanextern NCURSES_EXPORT(const char *) _nc_altcharset_name(attr_t, chtype); 1284166124Srafanextern NCURSES_EXPORT(const char *) _nc_retrace_cptr (const char *); 1285166124Srafanextern NCURSES_EXPORT(int) _nc_retrace_int (int); 1286166124Srafanextern NCURSES_EXPORT(unsigned) _nc_retrace_unsigned (unsigned); 1287166124Srafanextern NCURSES_EXPORT(void *) _nc_retrace_void_ptr (void *); 1288178866Srafanextern NCURSES_EXPORT(void) _nc_fifo_dump (SCREEN *); 1289174993Srafan 1290174993Srafan#if USE_REENTRANT 1291174993SrafanNCURSES_WRAPPED_VAR(long, _nc_outchars); 1292174993SrafanNCURSES_WRAPPED_VAR(const char *, _nc_tputs_trace); 1293174993Srafan#define _nc_outchars NCURSES_PUBLIC_VAR(_nc_outchars()) 1294174993Srafan#define _nc_tputs_trace NCURSES_PUBLIC_VAR(_nc_tputs_trace()) 1295174993Srafanextern NCURSES_EXPORT(void) _nc_set_tputs_trace (const char *); 1296174993Srafanextern NCURSES_EXPORT(void) _nc_count_outchars (long); 1297174993Srafan#else 129876726Speterextern NCURSES_EXPORT_VAR(const char *) _nc_tputs_trace; 1299166124Srafanextern NCURSES_EXPORT_VAR(long) _nc_outchars; 1300174993Srafan#endif 1301174993Srafan 1302166124Srafanextern NCURSES_EXPORT_VAR(unsigned) _nc_tracing; 1303166124Srafan 130497049Speter#if USE_WIDEC_SUPPORT 130597049Speterextern NCURSES_EXPORT(const char *) _nc_viswbuf2 (int, const wchar_t *); 1306166124Srafanextern NCURSES_EXPORT(const char *) _nc_viswbufn (const wchar_t *, int); 130797049Speter#endif 1308166124Srafan 1309166124Srafanextern NCURSES_EXPORT(const char *) _nc_viscbuf2 (int, const NCURSES_CH_T *, int); 1310166124Srafanextern NCURSES_EXPORT(const char *) _nc_viscbuf (const NCURSES_CH_T *, int); 1311166124Srafan 1312166124Srafan#else /* !TRACE */ 1313166124Srafan 1314166124Srafan#define START_TRACE() /* nothing */ 1315166124Srafan 131650276Speter#define T(a) 131750276Speter#define TR(n, a) 131850276Speter#define TPUTS_TRACE(s) 131950276Speter 1320166124Srafan#define returnAttr(code) return code 1321166124Srafan#define returnBits(code) return code 1322166124Srafan#define returnBool(code) return code 1323166124Srafan#define returnCPtr(code) return code 1324166124Srafan#define returnCVoidPtr(code) return code 1325166124Srafan#define returnChar(code) return code 1326166124Srafan#define returnCode(code) return code 1327166124Srafan#define returnPtr(code) return code 1328166124Srafan#define returnSP(code) return code 1329166124Srafan#define returnVoid return 1330166124Srafan#define returnVoidPtr(code) return code 1331166124Srafan#define returnWin(code) return code 1332166124Srafan 1333166124Srafan#endif /* TRACE/!TRACE */ 1334166124Srafan 1335166124Srafan/* 1336166124Srafan * Return-codes for tgetent() and friends. 1337166124Srafan */ 1338166124Srafan#define TGETENT_YES 1 /* entry is found */ 1339166124Srafan#define TGETENT_NO 0 /* entry is not found */ 1340166124Srafan#define TGETENT_ERR -1 /* an error occurred */ 1341166124Srafan 1342166124Srafanextern NCURSES_EXPORT(const char *) _nc_visbuf2 (int, const char *); 1343166124Srafanextern NCURSES_EXPORT(const char *) _nc_visbufn (const char *, int); 1344166124Srafan 1345184989Srafan#define EMPTY_MODULE(name) \ 134697049Speterextern NCURSES_EXPORT(void) name (void); \ 134797049Speter NCURSES_EXPORT(void) name (void) { } 134897049Speter 134950276Speter#define ALL_BUT_COLOR ((chtype)~(A_COLOR)) 1350166124Srafan#define NONBLANK_ATTR (A_NORMAL|A_BOLD|A_DIM|A_BLINK) 135150276Speter#define XMC_CHANGES(c) ((c) & SP->_xmc_suppress) 135250276Speter 135362449Speter#define toggle_attr_on(S,at) {\ 1354166124Srafan if (PAIR_NUMBER(at) > 0) {\ 135550276Speter (S) = ((S) & ALL_BUT_COLOR) | (at);\ 1356166124Srafan } else {\ 135750276Speter (S) |= (at);\ 1358166124Srafan }\ 135966963Speter TR(TRACE_ATTRS, ("new attribute is %s", _traceattr((S))));} 136050276Speter 136150276Speter 136262449Speter#define toggle_attr_off(S,at) {\ 1363166124Srafan if (PAIR_NUMBER(at) > 0) {\ 1364166124Srafan (S) &= ~(at|A_COLOR);\ 136550276Speter } else {\ 1366166124Srafan (S) &= ~(at);\ 136750276Speter }\ 136866963Speter TR(TRACE_ATTRS, ("new attribute is %s", _traceattr((S))));} 136950276Speter 137050276Speter#define DelCharCost(count) \ 137150276Speter ((parm_dch != 0) \ 137250276Speter ? SP->_dch_cost \ 137350276Speter : ((delete_character != 0) \ 137450276Speter ? (SP->_dch1_cost * count) \ 137550276Speter : INFINITY)) 137650276Speter 137750276Speter#define InsCharCost(count) \ 137850276Speter ((parm_ich != 0) \ 137950276Speter ? SP->_ich_cost \ 138050276Speter : ((enter_insert_mode && exit_insert_mode) \ 138150276Speter ? SP->_smir_cost + SP->_rmir_cost + (SP->_ip_cost * count) \ 138250276Speter : ((insert_character != 0) \ 1383166124Srafan ? ((SP->_ich1_cost + SP->_ip_cost) * count) \ 138450276Speter : INFINITY))) 138550276Speter 138650276Speter#if USE_XMC_SUPPORT 1387166124Srafan#define UpdateAttrs(c) if (!SameAttrOf(SCREEN_ATTRS(SP), c)) { \ 1388166124Srafan attr_t chg = AttrOf(SCREEN_ATTRS(SP)); \ 1389166124Srafan VIDATTR(AttrOf(c), GetPair(c)); \ 139050276Speter if (magic_cookie_glitch > 0 \ 1391166124Srafan && XMC_CHANGES((chg ^ AttrOf(SCREEN_ATTRS(SP))))) { \ 139297049Speter T(("%s @%d before glitch %d,%d", \ 139350276Speter __FILE__, __LINE__, \ 139450276Speter SP->_cursrow, \ 139550276Speter SP->_curscol)); \ 139650276Speter _nc_do_xmc_glitch(chg); \ 139750276Speter } \ 139850276Speter } 139950276Speter#else 1400166124Srafan#define UpdateAttrs(c) if (!SameAttrOf(SCREEN_ATTRS(SP), c)) \ 1401166124Srafan VIDATTR(AttrOf(c), GetPair(c)); 140250276Speter#endif 140350276Speter 1404166124Srafan/* 1405166124Srafan * Macros to make additional parameter to implement wgetch_events() 1406166124Srafan */ 1407166124Srafan#ifdef NCURSES_WGETCH_EVENTS 1408166124Srafan#define EVENTLIST_0th(param) param 1409166124Srafan#define EVENTLIST_1st(param) param 1410166124Srafan#define EVENTLIST_2nd(param) , param 1411166124Srafan#else 1412166124Srafan#define EVENTLIST_0th(param) void 1413166124Srafan#define EVENTLIST_1st(param) /* nothing */ 1414166124Srafan#define EVENTLIST_2nd(param) /* nothing */ 1415166124Srafan#endif 1416166124Srafan 141766963Speter#if NCURSES_EXPANDED && NCURSES_EXT_FUNCS 141850276Speter 141950276Speter#undef toggle_attr_on 142050276Speter#define toggle_attr_on(S,at) _nc_toggle_attr_on(&(S), at) 142176726Speterextern NCURSES_EXPORT(void) _nc_toggle_attr_on (attr_t *, attr_t); 142250276Speter 142350276Speter#undef toggle_attr_off 142450276Speter#define toggle_attr_off(S,at) _nc_toggle_attr_off(&(S), at) 142576726Speterextern NCURSES_EXPORT(void) _nc_toggle_attr_off (attr_t *, attr_t); 142650276Speter 142750276Speter#undef DelCharCost 142850276Speter#define DelCharCost(count) _nc_DelCharCost(count) 142976726Speterextern NCURSES_EXPORT(int) _nc_DelCharCost (int); 143050276Speter 143150276Speter#undef InsCharCost 143250276Speter#define InsCharCost(count) _nc_InsCharCost(count) 143376726Speterextern NCURSES_EXPORT(int) _nc_InsCharCost (int); 143450276Speter 143550276Speter#undef UpdateAttrs 143650276Speter#define UpdateAttrs(c) _nc_UpdateAttrs(c) 1437166124Srafanextern NCURSES_EXPORT(void) _nc_UpdateAttrs (NCURSES_CH_T); 143850276Speter 143950276Speter#else 144050276Speter 144176726Speterextern NCURSES_EXPORT(void) _nc_expanded (void); 144250276Speter 144350276Speter#endif 144450276Speter 1445184989Srafan#if !NCURSES_EXT_FUNCS 1446184989Srafan#define set_escdelay(value) ESCDELAY = value 1447184989Srafan#endif 1448184989Srafan 144950276Speter#if !HAVE_GETCWD 145050276Speter#define getcwd(buf,len) getwd(buf) 145150276Speter#endif 145250276Speter 1453166124Srafan/* charable.c */ 1454166124Srafan#if USE_WIDEC_SUPPORT 1455166124Srafanextern NCURSES_EXPORT(bool) _nc_is_charable(wchar_t); 1456166124Srafanextern NCURSES_EXPORT(int) _nc_to_char(wint_t); 1457166124Srafanextern NCURSES_EXPORT(wint_t) _nc_to_widechar(int); 1458166124Srafan#endif 1459166124Srafan 1460174993Srafan/* comp_captab.c */ 1461174993Srafantypedef struct { 1462174993Srafan short nte_name; /* offset of name to hash on */ 1463174993Srafan int nte_type; /* BOOLEAN, NUMBER or STRING */ 1464174993Srafan short nte_index; /* index of associated variable in its array */ 1465174993Srafan short nte_link; /* index in table of next hash, or -1 */ 1466174993Srafan} name_table_data; 1467174993Srafan 1468174993Srafantypedef struct 1469174993Srafan{ 1470174993Srafan short from; 1471174993Srafan short to; 1472174993Srafan short source; 1473174993Srafan} alias_table_data; 1474174993Srafan 147550276Speter/* doupdate.c */ 147650276Speter#if USE_XMC_SUPPORT 147776726Speterextern NCURSES_EXPORT(void) _nc_do_xmc_glitch (attr_t); 147850276Speter#endif 147950276Speter 148050276Speter/* hardscroll.c */ 148150276Speter#if defined(TRACE) || defined(SCROLLDEBUG) || defined(HASHDEBUG) 148276726Speterextern NCURSES_EXPORT(void) _nc_linedump (void); 148350276Speter#endif 148450276Speter 148550276Speter/* lib_acs.c */ 148676726Speterextern NCURSES_EXPORT(void) _nc_init_acs (void); /* corresponds to traditional 'init_acs()' */ 148776726Speterextern NCURSES_EXPORT(int) _nc_msec_cost (const char *const, int); /* used by 'tack' program */ 148850276Speter 1489166124Srafan/* lib_addch.c */ 1490166124Srafan#if USE_WIDEC_SUPPORT 1491166124SrafanNCURSES_EXPORT(int) _nc_build_wch(WINDOW *win, ARG_CH_T ch); 1492166124Srafan#endif 1493166124Srafan 149497049Speter/* lib_addstr.c */ 1495166124Srafan#if USE_WIDEC_SUPPORT && !defined(USE_TERMLIB) 149697049Speterextern NCURSES_EXPORT(int) _nc_wchstrlen(const cchar_t *); 149797049Speter#endif 149897049Speter 1499166124Srafan/* lib_color.c */ 1500166124Srafanextern NCURSES_EXPORT(bool) _nc_reset_colors(void); 1501166124Srafan 150297049Speter/* lib_getch.c */ 1503166124Srafanextern NCURSES_EXPORT(int) _nc_wgetch(WINDOW *, unsigned long *, int EVENTLIST_2nd(_nc_eventlist *)); 150497049Speter 1505166124Srafan/* lib_insch.c */ 1506166124Srafanextern NCURSES_EXPORT(int) _nc_insert_ch(WINDOW *, chtype); 1507166124Srafan 150850276Speter/* lib_mvcur.c */ 150950276Speter#define INFINITY 1000000 /* cost: too high to use */ 151050276Speter 151176726Speterextern NCURSES_EXPORT(void) _nc_mvcur_init (void); 151276726Speterextern NCURSES_EXPORT(void) _nc_mvcur_resume (void); 151376726Speterextern NCURSES_EXPORT(void) _nc_mvcur_wrap (void); 151450276Speter 151576726Speterextern NCURSES_EXPORT(int) _nc_scrolln (int, int, int, int); 151650276Speter 151776726Speterextern NCURSES_EXPORT(void) _nc_screen_init (void); 151876726Speterextern NCURSES_EXPORT(void) _nc_screen_resume (void); 151976726Speterextern NCURSES_EXPORT(void) _nc_screen_wrap (void); 152050276Speter 152166963Speter/* lib_mouse.c */ 152276726Speterextern NCURSES_EXPORT(int) _nc_has_mouse (void); 152366963Speter 152466963Speter/* lib_mvcur.c */ 152566963Speter#define INFINITY 1000000 /* cost: too high to use */ 1526166124Srafan#define BAUDBYTE 9 /* 9 = 7 bits + 1 parity + 1 stop */ 152766963Speter 1528166124Srafan/* lib_setup.c */ 1529166124Srafanextern NCURSES_EXPORT(char *) _nc_get_locale(void); 1530166124Srafanextern NCURSES_EXPORT(int) _nc_unicode_locale(void); 1531184989Srafanextern NCURSES_EXPORT(int) _nc_locale_breaks_acs(TERMINAL *); 1532166124Srafanextern NCURSES_EXPORT(int) _nc_setupterm(NCURSES_CONST char *, int, int *, bool); 1533178866Srafanextern NCURSES_EXPORT(void) _nc_get_screensize(SCREEN *, int *, int *); 1534166124Srafan 1535166124Srafan/* lib_tstp.c */ 1536166124Srafan#if USE_SIGWINCH 1537178866Srafanextern NCURSES_EXPORT(int) _nc_handle_sigwinch(SCREEN *); 1538166124Srafan#else 1539166124Srafan#define _nc_handle_sigwinch(a) /* nothing */ 1540166124Srafan#endif 1541166124Srafan 1542178866Srafan/* lib_ungetch.c */ 1543178866Srafanextern NCURSES_EXPORT(int) _nc_ungetch (SCREEN *, int); 1544178866Srafan 154597049Speter/* lib_wacs.c */ 154697049Speter#if USE_WIDEC_SUPPORT 154797049Speterextern NCURSES_EXPORT(void) _nc_init_wacs(void); 154897049Speter#endif 154997049Speter 155066963Spetertypedef struct { 1551166124Srafan char *s_head; /* beginning of the string (may be null) */ 1552166124Srafan char *s_tail; /* end of the string (may be null) */ 1553166124Srafan size_t s_size; /* current remaining size available */ 1554166124Srafan size_t s_init; /* total size available */ 155566963Speter} string_desc; 155666963Speter 155766963Speter/* strings.c */ 155897049Speterextern NCURSES_EXPORT(string_desc *) _nc_str_init (string_desc *, char *, size_t); 155997049Speterextern NCURSES_EXPORT(string_desc *) _nc_str_null (string_desc *, size_t); 156097049Speterextern NCURSES_EXPORT(string_desc *) _nc_str_copy (string_desc *, string_desc *); 156197049Speterextern NCURSES_EXPORT(bool) _nc_safe_strcat (string_desc *, const char *); 156297049Speterextern NCURSES_EXPORT(bool) _nc_safe_strcpy (string_desc *, const char *); 156366963Speter 156450276Speter#if !HAVE_STRSTR 156550276Speter#define strstr _nc_strstr 156676726Speterextern NCURSES_EXPORT(char *) _nc_strstr (const char *, const char *); 156750276Speter#endif 156850276Speter 156950276Speter/* safe_sprintf.c */ 157097049Speterextern NCURSES_EXPORT(char *) _nc_printf_string (const char *, va_list); 157150276Speter 157250276Speter/* tries.c */ 1573174993Srafanextern NCURSES_EXPORT(int) _nc_add_to_try (TRIES **, const char *, unsigned); 1574174993Srafanextern NCURSES_EXPORT(char *) _nc_expand_try (TRIES *, unsigned, int *, size_t); 1575174993Srafanextern NCURSES_EXPORT(int) _nc_remove_key (TRIES **, unsigned); 1576174993Srafanextern NCURSES_EXPORT(int) _nc_remove_string (TRIES **, const char *); 157750276Speter 157850276Speter/* elsewhere ... */ 1579184989Srafanextern NCURSES_EXPORT(ENTRY *) _nc_delink_entry (ENTRY *, TERMTYPE *); 1580184989Srafanextern NCURSES_EXPORT(NCURSES_CONST char *) _nc_keyname (SCREEN *, int); 1581184989Srafanextern NCURSES_EXPORT(NCURSES_CONST char *) _nc_unctrl (SCREEN *, chtype); 1582184989Srafanextern NCURSES_EXPORT(SCREEN *) _nc_screen_of (WINDOW *); 158376726Speterextern NCURSES_EXPORT(WINDOW *) _nc_makenew (int, int, int, int, int); 158476726Speterextern NCURSES_EXPORT(char *) _nc_trace_buf (int, size_t); 1585166124Srafanextern NCURSES_EXPORT(char *) _nc_trace_bufcat (int, const char *); 1586184989Srafanextern NCURSES_EXPORT(char *) _nc_tracechar (SCREEN *, int); 1587184989Srafanextern NCURSES_EXPORT(char *) _nc_tracemouse (SCREEN *, MEVENT const *); 1588166124Srafanextern NCURSES_EXPORT(int) _nc_access (const char *, int); 158976726Speterextern NCURSES_EXPORT(int) _nc_baudrate (int); 159097049Speterextern NCURSES_EXPORT(int) _nc_freewin (WINDOW *); 159176726Speterextern NCURSES_EXPORT(int) _nc_getenv_num (const char *); 1592178866Srafanextern NCURSES_EXPORT(int) _nc_keypad (SCREEN *, bool); 159376726Speterextern NCURSES_EXPORT(int) _nc_ospeed (int); 159476726Speterextern NCURSES_EXPORT(int) _nc_outch (int); 1595166124Srafanextern NCURSES_EXPORT(int) _nc_read_termcap_entry (const char *const, TERMTYPE *const); 1596166124Srafanextern NCURSES_EXPORT(int) _nc_setupscreen (int, int, FILE *, bool, int); 1597184989Srafanextern NCURSES_EXPORT(int) _nc_timed_wait (SCREEN *, int, int, int * EVENTLIST_2nd(_nc_eventlist *)); 1598166124Srafanextern NCURSES_EXPORT(void) _nc_do_color (short, short, bool, int (*)(int)); 159976726Speterextern NCURSES_EXPORT(void) _nc_flush (void); 1600184989Srafanextern NCURSES_EXPORT(void) _nc_free_and_exit (int); 1601184989Srafanextern NCURSES_EXPORT(void) _nc_free_entry (ENTRY *, TERMTYPE *); 160276726Speterextern NCURSES_EXPORT(void) _nc_freeall (void); 160376726Speterextern NCURSES_EXPORT(void) _nc_hash_map (void); 1604178866Srafanextern NCURSES_EXPORT(void) _nc_init_keytry (SCREEN *); 160576726Speterextern NCURSES_EXPORT(void) _nc_keep_tic_dir (const char *); 160676726Speterextern NCURSES_EXPORT(void) _nc_make_oldhash (int i); 160776726Speterextern NCURSES_EXPORT(void) _nc_scroll_oldhash (int n, int top, int bot); 160876726Speterextern NCURSES_EXPORT(void) _nc_scroll_optimize (void); 160976726Speterextern NCURSES_EXPORT(void) _nc_set_buffer (FILE *, bool); 161076726Speterextern NCURSES_EXPORT(void) _nc_signal_handler (bool); 161197049Speterextern NCURSES_EXPORT(void) _nc_synchook (WINDOW *); 1612174993Srafanextern NCURSES_EXPORT(void) _nc_trace_tries (TRIES *); 161350276Speter 1614166124Srafan#if NO_LEAKS 1615166124Srafanextern NCURSES_EXPORT(void) _nc_alloc_entry_leaks(void); 1616166124Srafanextern NCURSES_EXPORT(void) _nc_captoinfo_leaks(void); 1617174993Srafanextern NCURSES_EXPORT(void) _nc_codes_leaks(void); 1618174993Srafanextern NCURSES_EXPORT(void) _nc_comp_captab_leaks(void); 1619166124Srafanextern NCURSES_EXPORT(void) _nc_comp_scan_leaks(void); 1620166124Srafanextern NCURSES_EXPORT(void) _nc_keyname_leaks(void); 1621174993Srafanextern NCURSES_EXPORT(void) _nc_names_leaks(void); 1622166124Srafanextern NCURSES_EXPORT(void) _nc_tgetent_leaks(void); 1623166124Srafan#endif 1624166124Srafan 1625166124Srafan#ifndef USE_TERMLIB 1626166124Srafanextern NCURSES_EXPORT(NCURSES_CH_T) _nc_render (WINDOW *, NCURSES_CH_T); 1627166124Srafanextern NCURSES_EXPORT(int) _nc_waddch_nosync (WINDOW *, const NCURSES_CH_T); 1628166124Srafanextern NCURSES_EXPORT(void) _nc_scroll_window (WINDOW *, int const, NCURSES_SIZE_T const, NCURSES_SIZE_T const, NCURSES_CH_T); 1629166124Srafan#endif 1630166124Srafan 1631166124Srafan#if USE_WIDEC_SUPPORT && !defined(USE_TERMLIB) 1632166124Srafanextern NCURSES_EXPORT(size_t) _nc_wcrtomb (char *, wchar_t, mbstate_t *); 1633166124Srafan#endif 1634166124Srafan 163550276Speter#if USE_SIZECHANGE 1636178866Srafanextern NCURSES_EXPORT(void) _nc_update_screensize (SCREEN *); 163750276Speter#endif 163850276Speter 163997049Speter#if HAVE_RESIZETERM 164097049Speterextern NCURSES_EXPORT(void) _nc_resize_margins (WINDOW *); 164197049Speter#else 164297049Speter#define _nc_resize_margins(wp) /* nothing */ 164362449Speter#endif 164462449Speter 1645166124Srafan#ifdef NCURSES_WGETCH_EVENTS 1646166124Srafanextern NCURSES_EXPORT(int) _nc_eventlist_timeout(_nc_eventlist *); 1647166124Srafan#else 1648166124Srafan#define wgetch_events(win, evl) wgetch(win) 1649166124Srafan#define wgetnstr_events(win, str, maxlen, evl) wgetnstr(win, str, maxlen) 1650166124Srafan#endif 1651166124Srafan 165297049Speter/* 165397049Speter * Not everyone has vsscanf(), but we'd like to use it for scanw(). 165497049Speter */ 165597049Speter#if !HAVE_VSSCANF 165697049Speterextern int vsscanf(const char *str, const char *format, va_list __arg); 165797049Speter#endif 165897049Speter 165950276Speter/* scroll indices */ 166076726Speterextern NCURSES_EXPORT_VAR(int *) _nc_oldnums; 166150276Speter 166250276Speter#define USE_SETBUF_0 0 166350276Speter 1664166124Srafan#define NC_BUFFERED(flag) _nc_set_buffer(SP->_ofp, flag) 166550276Speter 166656639Speter#define NC_OUTPUT ((SP != 0) ? SP->_ofp : stdout) 166756639Speter 166850276Speter/* 166950276Speter * On systems with a broken linker, define 'SP' as a function to force the 167050276Speter * linker to pull in the data-only module with 'SP'. 167150276Speter */ 167250276Speter#if BROKEN_LINKER 167350276Speter#define SP _nc_screen() 167476726Speterextern NCURSES_EXPORT(SCREEN *) _nc_screen (void); 167576726Speterextern NCURSES_EXPORT(int) _nc_alloc_screen (void); 167676726Speterextern NCURSES_EXPORT(void) _nc_set_screen (SCREEN *); 167750276Speter#else 167850276Speter/* current screen is private data; avoid possible linking conflicts too */ 167976726Speterextern NCURSES_EXPORT_VAR(SCREEN *) SP; 168050276Speter#define _nc_alloc_screen() ((SP = typeCalloc(SCREEN, 1)) != 0) 168150276Speter#define _nc_set_screen(sp) SP = sp 168250276Speter#endif 168350276Speter 168450276Speter/* 168597049Speter * We don't want to use the lines or columns capabilities internally, because 168697049Speter * if the application is running multiple screens under X, it's quite possible 168797049Speter * they could all have type xterm but have different sizes! So... 168850276Speter */ 168950276Speter#define screen_lines SP->_lines 169050276Speter#define screen_columns SP->_columns 169150276Speter 169276726Speterextern NCURSES_EXPORT(int) _nc_slk_initialize (WINDOW *, int); 169350276Speter 169450276Speter/* 169550276Speter * Some constants related to SLK's 169650276Speter */ 169750276Speter#define MAX_SKEY_OLD 8 /* count of soft keys */ 169850276Speter#define MAX_SKEY_LEN_OLD 8 /* max length of soft key text */ 169950276Speter#define MAX_SKEY_PC 12 /* This is what most PC's have */ 170050276Speter#define MAX_SKEY_LEN_PC 5 170150276Speter 170250276Speter/* Macro to check whether or not we use a standard format */ 170350276Speter#define SLK_STDFMT(fmt) (fmt < 3) 170450276Speter/* Macro to determine height of label window */ 170550276Speter#define SLK_LINES(fmt) (SLK_STDFMT(fmt) ? 1 : ((fmt) - 2)) 170650276Speter 170750276Speter#define MAX_SKEY(fmt) (SLK_STDFMT(fmt)? MAX_SKEY_OLD : MAX_SKEY_PC) 170850276Speter#define MAX_SKEY_LEN(fmt) (SLK_STDFMT(fmt)? MAX_SKEY_LEN_OLD : MAX_SKEY_LEN_PC) 170950276Speter 171076726Speterextern NCURSES_EXPORT(int) _nc_ripoffline (int line, int (*init)(WINDOW *,int)); 171150276Speter 1712166124Srafan/* 1713166124Srafan * Common error messages 1714166124Srafan */ 1715166124Srafan#define MSG_NO_MEMORY "Out of memory" 1716166124Srafan#define MSG_NO_INPUTS "Premature EOF" 1717166124Srafan 171850276Speter#ifdef __cplusplus 171950276Speter} 172050276Speter#endif 172150276Speter 172250276Speter#endif /* CURSES_PRIV_H */ 1723