X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fcurses.priv.h;h=9c01c92e588deb66cc2b7242a59cbeb52dfe74bf;hp=5f6b6b74345090967237bba7a52a164d78029982;hb=0141530788318928d6e4da45eb1ec88c86940645;hpb=da1f84b7eb32f17e91f6de242132ab3b2d462148 diff --git a/ncurses/curses.priv.h b/ncurses/curses.priv.h index 5f6b6b74..9c01c92e 100644 --- a/ncurses/curses.priv.h +++ b/ncurses/curses.priv.h @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. * + * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -35,7 +35,7 @@ /* - * $Id: curses.priv.h,v 1.427 2009/06/27 20:31:54 tom Exp $ + * $Id: curses.priv.h,v 1.463 2010/05/20 23:22:46 tom Exp $ * * curses.priv.h * @@ -61,6 +61,7 @@ extern "C" { #define MODULE_ID(id) /*nothing*/ #endif +#include /* for offsetof */ #include #include #include @@ -176,6 +177,20 @@ extern NCURSES_EXPORT(int) _nc_env_access (void); extern NCURSES_EXPORT(void *) _nc_memmove (void *, const void *, size_t); #endif +/* + * If we have va_copy(), use it for assigning va_list's. + */ +#if defined(HAVE___VA_COPY) +#define begin_va_copy(dst,src) __va_copy(dst, src) +#define end_va_copy(dst) va_end(dst) +#elif defined(va_copy) || defined(HAVE_VA_COPY) +#define begin_va_copy(dst,src) va_copy(dst, src) +#define end_va_copy(dst) va_end(dst) +#else +#define begin_va_copy(dst,src) (dst) = (src) +#define end_va_copy(dst) /* nothing */ +#endif + /* * Scroll hints are useless when hashmap is used */ @@ -196,11 +211,10 @@ extern NCURSES_EXPORT(void *) _nc_memmove (void *, const void *, size_t); /* * Options for terminal drivers, etc... */ -#if 0 +#ifdef USE_TERM_DRIVER #define USE_SP_RIPOFF 1 #define USE_SP_TERMTYPE 1 #define USE_SP_WINDOWLIST 1 -#define USE_TERM_DRIVER 1 #endif /* @@ -256,6 +270,7 @@ color_t; #define _nc_bkgd _bkgrnd #else #undef _XOPEN_SOURCE_EXTENDED +#undef _XPG5 #define _nc_bkgd _bkgd #define wgetbkgrnd(win, wch) *wch = win->_bkgd #define wbkgrnd wbkgd @@ -271,6 +286,10 @@ color_t; * If curses.h did not expose the SCREEN-functions, then we do not need the * parameter in the corresponding unextended functions. */ + +#define USE_SP_FUNC_SUPPORT NCURSES_SP_FUNCS +#define USE_EXT_SP_FUNC_SUPPORT (NCURSES_SP_FUNCS && NCURSES_EXT_FUNCS) + #if NCURSES_SP_FUNCS #define SP_PARM sp /* use parameter */ #define NCURSES_SP_ARG SP_PARM @@ -321,15 +340,36 @@ color_t; #include -#if NCURSES_EXT_COLORS && USE_WIDEC_SUPPORT +/* + * Use these macros internally, to make tracing less verbose. But leave the + * option for compiling the tracing into the library. + */ +#if 1 +#define ColorPair(n) NCURSES_BITS(n, 0) +#define PairNumber(a) (NCURSES_CAST(int,(((a) & A_COLOR) >> NCURSES_ATTR_SHIFT))) +#else +#define ColorPair(pair) COLOR_PAIR(pair) +#define PairNumber(attr) PAIR_NUMBER(attr) +#endif + +#define unColor(n) unColor2(AttrOf(n)) +#define unColor2(a) ((a) & ALL_BUT_COLOR) + +/* + * Extended-colors stores the color pair in a separate struct-member than the + * attributes. But for compatibility, we handle most cases where a program + * written for non-extended colors stores the color in the attributes by + * checking for a color pair in both places. + */ +#if NCURSES_EXT_COLORS #define if_EXT_COLORS(stmt) stmt -#define NetPair(value,p) (value).ext_color = (p), \ - AttrOf(value) &= ALL_BUT_COLOR, \ - AttrOf(value) |= (A_COLOR & COLOR_PAIR((p > 255) ? 255 : p)) -#define SetPair(value,p) (value).ext_color = (p) -#define GetPair(value) (value).ext_color -#define unColor(n) (AttrOf(n) & ALL_BUT_COLOR) -#define GET_WINDOW_PAIR(w) (w)->_color +#define SetPair(value,p) SetPair2((value).ext_color, AttrOf(value), p) +#define SetPair2(c,a,p) c = (p), \ + a = (unColor2(a) | (A_COLOR & ColorPair(oldColor(c)))) +#define GetPair(value) GetPair2((value).ext_color, AttrOf(value)) +#define GetPair2(c,a) ((c) ? (c) : PairNumber(a)) +#define oldColor(p) (((p) > 255) ? 255 : (p)) +#define GET_WINDOW_PAIR(w) GetPair2((w)->_color, (w)->_attrs) #define SET_WINDOW_PAIR(w,p) (w)->_color = (p) #define SameAttrOf(a,b) (AttrOf(a) == AttrOf(b) && GetPair(a) == GetPair(b)) @@ -339,16 +379,15 @@ color_t; #define VIDATTR(sp,attr,pair) vid_attr(attr, pair, 0) #endif -#else /* !(NCURSES_EXT_COLORS && USE_WIDEC_SUPPORT) */ +#else /* !NCURSES_EXT_COLORS */ #define if_EXT_COLORS(stmt) /* nothing */ #define SetPair(value,p) RemAttr(value, A_COLOR), \ - SetAttr(value, AttrOf(value) | (A_COLOR & COLOR_PAIR(p))) -#define GetPair(value) PAIR_NUMBER(AttrOf(value)) -#define unColor(n) (AttrOf(n) & ALL_BUT_COLOR) -#define GET_WINDOW_PAIR(w) PAIR_NUMBER(WINDOW_ATTRS(w)) + SetAttr(value, AttrOf(value) | (A_COLOR & ColorPair(p))) +#define GetPair(value) PairNumber(AttrOf(value)) +#define GET_WINDOW_PAIR(w) PairNumber(WINDOW_ATTRS(w)) #define SET_WINDOW_PAIR(w,p) WINDOW_ATTRS(w) &= ALL_BUT_COLOR, \ - WINDOW_ATTRS(w) |= (A_COLOR & COLOR_PAIR(p)) + WINDOW_ATTRS(w) |= (A_COLOR & ColorPair(p)) #define SameAttrOf(a,b) (AttrOf(a) == AttrOf(b)) #if NCURSES_SP_FUNCS @@ -357,7 +396,7 @@ color_t; #define VIDATTR(sp,attr,pair) vidattr(attr) #endif -#endif /* NCURSES_EXT_COLORS && USE_WIDEC_SUPPORT */ +#endif /* NCURSES_EXT_COLORS */ #if NCURSES_NO_PADDING #define GetNoPadding(sp) ((sp) ? (sp)->_no_padding : _nc_prescreen._no_padding) @@ -374,12 +413,14 @@ extern NCURSES_EXPORT(void) _nc_set_no_padding(SCREEN *); #define GET_SCREEN_PAIR(s) GetPair(SCREEN_ATTRS(s)) #define SET_SCREEN_PAIR(s,p) SetPair(SCREEN_ATTRS(s), p) -#if USE_REENTRANT - +#if USE_REENTRANT || NCURSES_SP_FUNCS NCURSES_EXPORT(int *) _nc_ptr_Lines (SCREEN *); NCURSES_EXPORT(int *) _nc_ptr_Cols (SCREEN *); NCURSES_EXPORT(int *) _nc_ptr_Tabsize (SCREEN *); NCURSES_EXPORT(int *) _nc_ptr_Escdelay (SCREEN *); +#endif + +#if USE_REENTRANT #define ptrLines(sp) (sp ? &(sp->_LINES) : &(_nc_prescreen._LINES)) #define ptrCols(sp) (sp ? &(sp->_COLS) : &(_nc_prescreen._COLS)) @@ -395,6 +436,9 @@ NCURSES_EXPORT(int *) _nc_ptr_Escdelay (SCREEN *); #define ptrLines(sp) &LINES #define ptrCols(sp) &COLS +#define ptrTabsize(sp) &TABSIZE +#define ptrEscdelay(sp) &ESCDELAY + #define SET_LINES(value) LINES = value #define SET_COLS(value) COLS = value #define SET_TABSIZE(value) TABSIZE = value @@ -413,6 +457,19 @@ NCURSES_EXPORT(int *) _nc_ptr_Escdelay (SCREEN *); data.__data.__nusers) #define TR_GLOBAL_MUTEX(name) TR_MUTEX(_nc_globals.mutex_##name) +#if USE_WEAK_SYMBOLS +#if defined(__GNUC__) +# if defined __USE_ISOC99 +# define _cat_pragma(exp) _Pragma(#exp) +# define _weak_pragma(exp) _cat_pragma(weak name) +# else +# define _weak_pragma(exp) +# endif +# define _declare(name) __extension__ extern __typeof__(name) name +# define weak_symbol(name) _weak_pragma(name) _declare(name) __attribute__((weak)) +#endif +#endif + #ifdef USE_PTHREADS #if USE_REENTRANT @@ -430,19 +487,6 @@ extern NCURSES_EXPORT(int) _nc_mutex_unlock(pthread_mutex_t *); #error POSIX threads requires --enable-reentrant option #endif -#if USE_WEAK_SYMBOLS -#if defined(__GNUC__) -# if defined __USE_ISOC99 -# define _cat_pragma(exp) _Pragma(#exp) -# define _weak_pragma(exp) _cat_pragma(weak name) -# else -# define _weak_pragma(exp) -# endif -# define _declare(name) __extension__ extern __typeof__(name) name -# define weak_symbol(name) _weak_pragma(name) _declare(name) __attribute__((weak)) -#endif -#endif - #ifdef USE_PTHREADS # if USE_WEAK_SYMBOLS weak_symbol(pthread_sigmask); @@ -467,6 +511,19 @@ extern NCURSES_EXPORT(int) _nc_sigprocmask(int, const sigset_t *, sigset_t *); #else /* !USE_PTHREADS */ +#if USE_PTHREADS_EINTR +# if USE_WEAK_SYMBOLS +#include +weak_symbol(pthread_sigmask); +weak_symbol(pthread_kill); +weak_symbol(pthread_self); +weak_symbol(pthread_equal); +extern NCURSES_EXPORT(int) _nc_sigprocmask(int, const sigset_t *, sigset_t *); +# undef sigprocmask +# define sigprocmask _nc_sigprocmask +# endif +#endif /* USE_PTHREADS_EINTR */ + #define _nc_init_pthreads() /* nothing */ #define _nc_mutex_init(obj) /* nothing */ @@ -476,6 +533,36 @@ extern NCURSES_EXPORT(int) _nc_sigprocmask(int, const sigset_t *, sigset_t *); #endif /* USE_PTHREADS */ +/* + * When using sp-funcs, locks are targeted to SCREEN-level granularity. + * So the locking is done in the non-sp-func (which calls the sp-func) rather + * than in the sp-func itself. + * + * Use the _nc_nonsp_XXX functions in the function using "NCURSES_SP_NAME()". + * Use the _nc_sp_XXX functions in the function using "#if NCURSES_SP_FUNCS". + */ +#if NCURSES_SP_FUNCS + +#define _nc_nonsp_lock_global(name) /* nothing */ +#define _nc_nonsp_try_global(name) 0 +#define _nc_nonsp_unlock_global(name) /* nothing */ + +#define _nc_sp_lock_global(name) _nc_lock_global(name) +#define _nc_sp_try_global(name) _nc_try_global(name) +#define _nc_sp_unlock_global(name) _nc_unlock_global(name) + +#else + +#define _nc_nonsp_lock_global(name) _nc_lock_global(name) +#define _nc_nonsp_try_global(name) _nc_try_global(name) +#define _nc_nonsp_unlock_global(name) _nc_unlock_global(name) + +#define _nc_sp_lock_global(name) /* nothing */ +#define _nc_sp_try_global(name) 0 +#define _nc_sp_unlock_global(name) /* nothing */ + +#endif + #if HAVE_GETTIMEOFDAY # define PRECISE_GETTIME 1 # define TimeType struct timeval @@ -490,14 +577,14 @@ extern NCURSES_EXPORT(int) _nc_sigprocmask(int, const sigset_t *, sigset_t *); typedef unsigned colorpair_t; /* type big enough to store PAIR_OF() */ #define C_SHIFT 9 /* we need more bits than there are colors */ #define C_MASK ((1 << C_SHIFT) - 1) -#define PAIR_OF(fg, bg) ((((fg) & C_MASK) << C_SHIFT) | ((bg) & C_MASK)) +#define PAIR_OF(fg, bg) (colorpair_t) ((((fg) & C_MASK) << C_SHIFT) | ((bg) & C_MASK)) #define FORE_OF(c) (((c) >> C_SHIFT) & C_MASK) #define BACK_OF(c) ((c) & C_MASK) #define isDefaultColor(c) ((c) >= COLOR_DEFAULT || (c) < 0) #define COLOR_DEFAULT C_MASK -#if defined(USE_TERMLIB) && !defined(NEED_NCURSES_CH_T) +#if defined(USE_BUILD_CC) || (defined(USE_TERMLIB) && !defined(NEED_NCURSES_CH_T)) #undef NCURSES_CH_T /* this is not a termlib feature */ #define NCURSES_CH_T void /* ...but we need a pointer in SCREEN */ @@ -523,6 +610,9 @@ typedef enum { #if USE_SYSMOUSE ,M_SYSMOUSE /* FreeBSD sysmouse on console */ #endif +#ifdef USE_TERM_DRIVER + ,M_TERM_DRIVER /* Win32 console, etc */ +#endif } MouseType; /* @@ -541,7 +631,7 @@ typedef struct { struct _SLK; -#ifndef USE_TERMLIB +#if !(defined(USE_TERMLIB) || defined(USE_BUILD_CC)) typedef struct { @@ -652,8 +742,10 @@ typedef struct { */ #if MIXEDCASE_FILENAMES #define LEAF_FMT "%c" +#define LEAF_LEN 1 #else #define LEAF_FMT "%02x" +#define LEAF_LEN 2 #endif /* @@ -666,6 +758,13 @@ typedef struct { #define TRACEMSE_MAX (80 + (5 * 10) + (32 * 15)) #define TRACEMSE_FMT "id %2d at (%2d, %2d, %2d) state %4lx = {" /* } */ +#ifdef USE_TERM_DRIVER +struct DriverTCB; /* Terminal Control Block forward declaration */ +#define INIT_TERM_DRIVER() _nc_globals.term_driver = _nc_get_driver +#else +#define INIT_TERM_DRIVER() /* nothing */ +#endif + /* * Global data which is not specific to a screen. */ @@ -712,6 +811,10 @@ typedef struct { int safeprint_rows; #endif +#ifdef USE_TERM_DRIVER + int (*term_driver)(struct DriverTCB*, const char*, int*); +#endif + #ifdef TRACE bool init_trace; char trace_fname[PATH_MAX]; @@ -748,6 +851,9 @@ typedef struct { int use_pthreads; #define _nc_use_pthreads _nc_globals.use_pthreads #endif +#if USE_PTHREADS_EINTR + pthread_t read_thread; /* The reading thread */ +#endif } NCURSES_GLOBALS; extern NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals; @@ -771,6 +877,7 @@ typedef struct { #if NCURSES_NO_PADDING bool _no_padding; /* flag to set if padding disabled */ #endif + NCURSES_SP_OUTC _outch; /* output handler if not putc */ #if BROKEN_LINKER || USE_REENTRANT chtype *real_acs_map; int _LINES; @@ -934,9 +1041,6 @@ struct screen { bool _nc_sp_idlok; bool _nc_sp_idcok; -#define _nc_idlok SP->_nc_sp_idlok -#define _nc_idcok SP->_nc_sp_idcok - /* * These are the data that support the mouse interface. */ @@ -985,6 +1089,13 @@ struct screen { int _sysmouse_new_buttons; #endif +#ifdef USE_TERM_DRIVER + MEVENT _drv_mouse_fifo[FIFO_SIZE]; + int _drv_mouse_head; + int _drv_mouse_tail; + int _drv_mouse_old_buttons; + int _drv_mouse_new_buttons; +#endif /* * This supports automatic resizing */ @@ -1053,10 +1164,10 @@ extern NCURSES_EXPORT_VAR(SCREEN *) _nc_screen_chain; extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; WINDOWLIST { - WINDOW win; /* first, so WINDOW_EXT() works */ WINDOWLIST *next; SCREEN *screen; /* screen containing the window */ -#ifdef _XOPEN_SOURCE_EXTENDED + WINDOW win; /* WINDOW_EXT() needs to account for offset */ +#ifdef NCURSES_WIDECHAR char addch_work[(MB_LEN_MAX * 9) + 1]; unsigned addch_used; /* number of bytes in addch_work[] */ int addch_x; /* x-position for addch_work[] */ @@ -1064,7 +1175,7 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; #endif }; -#define WINDOW_EXT(win,field) (((WINDOWLIST *)(win))->field) +#define WINDOW_EXT(w,m) (((WINDOWLIST *)((char *)(w) - offsetof(WINDOWLIST, win)))->m) #define SP_PRE_INIT(sp) \ sp->_cursrow = -1; \ @@ -1154,6 +1265,7 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; #define RESET_OUTCHARS() COUNT_OUTCHARS(-_nc_outchars) #define UChar(c) ((unsigned char)(c)) +#define UShort(c) ((unsigned short)(c)) #define ChCharOf(c) ((c) & (chtype)A_CHARTEXT) #define ChAttrOf(c) ((c) & (chtype)A_ATTRIBUTES) @@ -1200,7 +1312,7 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; memset(_cp, 0, sizeof(ch)); \ _cp->chars[0] = (c); \ _cp->attr = (a); \ - if_EXT_COLORS(SetPair(ch, PAIR_NUMBER(a))); \ + if_EXT_COLORS(SetPair(ch, PairNumber(a))); \ } while (0) #define CHREF(wch) (&wch) #define CHDEREF(wch) (*wch) @@ -1226,7 +1338,7 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; putc(PUTC_ch,b); \ break; \ } \ - fwrite(PUTC_buf, (unsigned) PUTC_n, 1, b); \ + IGNORE_RC(fwrite(PUTC_buf, (unsigned) PUTC_n, 1, b)); \ } \ COUNT_OUTCHARS(PUTC_i); \ } } } while (0) @@ -1246,7 +1358,7 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; #define isWidecBase(ch) (WidecExt(ch) == 1) #define isWidecExt(ch) (WidecExt(ch) > 1 && WidecExt(ch) < 32) #define SetWidecExt(dst, ext) AttrOf(dst) &= ~A_CHARTEXT, \ - AttrOf(dst) |= (ext + 1) + AttrOf(dst) |= (attr_t) (ext + 1) #define if_WIDEC(code) code #define Charable(ch) ((SP_PARM != 0 && SP_PARM->_legacy_coding) \ @@ -1299,11 +1411,11 @@ extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch; #define CHANGED_CELL(line,col) \ if (line->firstchar == _NOCHANGE) \ - line->firstchar = line->lastchar = col; \ + line->firstchar = line->lastchar = (NCURSES_SIZE_T) col; \ else if ((col) < line->firstchar) \ - line->firstchar = col; \ + line->firstchar = (NCURSES_SIZE_T) col; \ else if ((col) > line->lastchar) \ - line->lastchar = col + line->lastchar = (NCURSES_SIZE_T) col #define CHANGED_RANGE(line,start,end) \ if (line->firstchar == _NOCHANGE \ @@ -1395,11 +1507,14 @@ extern NCURSES_EXPORT(void) _nc_locked_tracef (const char *, ...) GCC_PRINTFLIKE #define T(a) TR(TRACE_CALLS, a) #define TRACE_RETURN(value,type) return _nc_retrace_##type(value) +#define NonNull(s) ((s) != 0 ? s : "") + #define returnAttr(code) TRACE_RETURN(code,attr_t) #define returnBits(code) TRACE_RETURN(code,unsigned) #define returnBool(code) TRACE_RETURN(code,bool) #define returnCPtr(code) TRACE_RETURN(code,cptr) #define returnCVoidPtr(code) TRACE_RETURN(code,cvoid_ptr) +#define returnChar(code) TRACE_RETURN(code,char) #define returnChtype(code) TRACE_RETURN(code,chtype) #define returnCode(code) TRACE_RETURN(code,int) #define returnPtr(code) TRACE_RETURN(code,ptr) @@ -1419,6 +1534,7 @@ extern NCURSES_EXPORT(char *) _nc_varargs (const char *, va_list); extern NCURSES_EXPORT(chtype) _nc_retrace_chtype (chtype); extern NCURSES_EXPORT(const char *) _nc_altcharset_name(attr_t, chtype); extern NCURSES_EXPORT(const char *) _nc_retrace_cptr (const char *); +extern NCURSES_EXPORT(char) _nc_retrace_char (char); extern NCURSES_EXPORT(int) _nc_retrace_int (int); extern NCURSES_EXPORT(unsigned) _nc_retrace_unsigned (unsigned); extern NCURSES_EXPORT(void *) _nc_retrace_void_ptr (void *); @@ -1459,6 +1575,7 @@ extern NCURSES_EXPORT(const char *) _nc_viscbuf (const NCURSES_CH_T *, int); #define returnBool(code) return code #define returnCPtr(code) return code #define returnCVoidPtr(code) return code +#define returnChar(code) return ((char) code) #define returnChtype(code) return code #define returnCode(code) return code #define returnPtr(code) return code @@ -1469,6 +1586,15 @@ extern NCURSES_EXPORT(const char *) _nc_viscbuf (const NCURSES_CH_T *, int); #endif /* TRACE/!TRACE */ +/* + * Workaround for defective implementation of gcc attribute warn_unused_result + */ +#if defined(__GNUC__) && defined(_FORTIFY_SOURCE) +#define IGNORE_RC(func) errno = func +#else +#define IGNORE_RC(func) (void) func +#endif /* gcc workarounds */ + /* * Return-codes for tgetent() and friends. */ @@ -1488,7 +1614,7 @@ extern NCURSES_EXPORT(void) name (void); \ #define XMC_CHANGES(c) ((c) & SP_PARM->_xmc_suppress) #define toggle_attr_on(S,at) {\ - if (PAIR_NUMBER(at) > 0) {\ + if (PairNumber(at) > 0) {\ (S) = ((S) & ALL_BUT_COLOR) | (at);\ } else {\ (S) |= (at);\ @@ -1497,7 +1623,7 @@ extern NCURSES_EXPORT(void) name (void); \ #define toggle_attr_off(S,at) {\ - if (PAIR_NUMBER(at) > 0) {\ + if (PairNumber(at) > 0) {\ (S) &= ~(at|A_COLOR);\ } else {\ (S) &= ~(at);\ @@ -1521,7 +1647,7 @@ extern NCURSES_EXPORT(void) name (void); \ : INFINITY))) #if USE_XMC_SUPPORT -#define UpdateAttrs(sp,c) if (!SameAttrOf(SCREEN_ATTRS(sp), c)) { \ +#define UpdateAttrs(sp,c) if (!SameAttrOf(SCREEN_ATTRS(sp), c)) { \ attr_t chg = AttrOf(SCREEN_ATTRS(sp)); \ VIDATTR(sp, AttrOf(c), GetPair(c)); \ if (magic_cookie_glitch > 0 \ @@ -1534,8 +1660,9 @@ extern NCURSES_EXPORT(void) name (void); \ } \ } #else -#define UpdateAttrs(sp,c) if (!SameAttrOf(SCREEN_ATTRS(sp), c)) \ - VIDATTR(sp, AttrOf(c), GetPair(c)); +#define UpdateAttrs(sp,c) if (!SameAttrOf(SCREEN_ATTRS(sp), c)) { \ + VIDATTR(sp, AttrOf(c), GetPair(c)); \ + } #endif /* @@ -1545,10 +1672,12 @@ extern NCURSES_EXPORT(void) name (void); \ #define EVENTLIST_0th(param) param #define EVENTLIST_1st(param) param #define EVENTLIST_2nd(param) , param +#define TWAIT_MASK (TW_ANY | TW_EVENT) #else #define EVENTLIST_0th(param) void #define EVENTLIST_1st(param) /* nothing */ #define EVENTLIST_2nd(param) /* nothing */ +#define TWAIT_MASK TW_ANY #endif #if NCURSES_EXPANDED && NCURSES_EXT_FUNCS @@ -1641,7 +1770,7 @@ NCURSES_EXPORT(int) _nc_build_wch(WINDOW *win, ARG_CH_T ch); #endif /* lib_addstr.c */ -#if USE_WIDEC_SUPPORT && !defined(USE_TERMLIB) +#if USE_WIDEC_SUPPORT && !(defined(USE_TERMLIB) || defined(USE_BUILD_CC)) extern NCURSES_EXPORT(int) _nc_wchstrlen(const cchar_t *); #endif @@ -1679,7 +1808,7 @@ extern NCURSES_EXPORT(char *) _nc_get_locale(void); extern NCURSES_EXPORT(int) _nc_unicode_locale(void); extern NCURSES_EXPORT(int) _nc_locale_breaks_acs(TERMINAL *); extern NCURSES_EXPORT(int) _nc_setupterm(NCURSES_CONST char *, int, int *, bool); -extern NCURSES_EXPORT(void) _nc_get_screensize(SCREEN *, int *, int *); +extern NCURSES_EXPORT(void) _nc_tinfo_cmdch(TERMINAL *, char); /* lib_set_term.c */ extern NCURSES_EXPORT(int) _nc_ripoffline(int, int(*)(WINDOW*, int)); @@ -1727,6 +1856,7 @@ extern NCURSES_EXPORT(int) _nc_remove_string (TRIES **, const char *); /* elsewhere ... */ extern NCURSES_EXPORT(ENTRY *) _nc_delink_entry (ENTRY *, TERMTYPE *); extern NCURSES_EXPORT(SCREEN *) _nc_screen_of (WINDOW *); +extern NCURSES_EXPORT(TERMINAL*) _nc_get_cur_term (void); extern NCURSES_EXPORT(WINDOW *) _nc_makenew (int, int, int, int, int); extern NCURSES_EXPORT(char *) _nc_trace_buf (int, size_t); extern NCURSES_EXPORT(char *) _nc_trace_bufcat (int, const char *); @@ -1771,13 +1901,17 @@ extern NCURSES_EXPORT(void) _nc_names_leaks(void); extern NCURSES_EXPORT(void) _nc_tgetent_leaks(void); #endif -#ifndef USE_TERMLIB +#if !(defined(USE_TERMLIB) || defined(USE_BUILD_CC)) extern NCURSES_EXPORT(NCURSES_CH_T) _nc_render (WINDOW *, NCURSES_CH_T); extern NCURSES_EXPORT(int) _nc_waddch_nosync (WINDOW *, const NCURSES_CH_T); extern NCURSES_EXPORT(void) _nc_scroll_window (WINDOW *, int const, NCURSES_SIZE_T const, NCURSES_SIZE_T const, NCURSES_CH_T); #endif -#if USE_WIDEC_SUPPORT && !defined(USE_TERMLIB) +#if USE_WIDEC_SUPPORT +extern NCURSES_EXPORT(int) _nc_insert_wch(WINDOW *, const cchar_t *); +#endif + +#if USE_WIDEC_SUPPORT && !(defined(USE_TERMLIB) || defined(USE_BUILD_CC)) extern NCURSES_EXPORT(size_t) _nc_wcrtomb (char *, wchar_t, mbstate_t *); #endif @@ -1798,6 +1932,26 @@ extern NCURSES_EXPORT(int) _nc_eventlist_timeout(_nc_eventlist *); #define wgetnstr_events(win, str, maxlen, evl) wgetnstr(win, str, maxlen) #endif +/* + * Wide-character macros to hide some platform-differences. + */ +#if USE_WIDEC_SUPPORT +#if HAVE_MBTOWC && HAVE_MBLEN +#define reset_mbytes(state) IGNORE_RC(mblen(NULL, 0)), IGNORE_RC(mbtowc(NULL, NULL, 0)) +#define count_mbytes(buffer,length,state) mblen(buffer,length) +#define check_mbytes(wch,buffer,length,state) \ + (int) mbtowc(&wch, buffer, length) +#define state_unused +#elif HAVE_MBRTOWC && HAVE_MBRLEN +#define reset_mbytes(state) init_mb(state) +#define count_mbytes(buffer,length,state) mbrlen(buffer,length,&state) +#define check_mbytes(wch,buffer,length,state) \ + (int) mbrtowc(&wch, buffer, length, &state) +#else +make an error +#endif +#endif + /* * Not everyone has vsscanf(), but we'd like to use it for scanw(). */ @@ -1821,6 +1975,7 @@ extern NCURSES_EXPORT_VAR(int *) _nc_oldnums; #define _nc_alloc_screen_sp() typeCalloc(SCREEN, 1) #if BROKEN_LINKER +#define SP _nc_screen() extern NCURSES_EXPORT(SCREEN *) _nc_screen (void); extern NCURSES_EXPORT(int) _nc_alloc_screen (void); extern NCURSES_EXPORT(void) _nc_set_screen (SCREEN *); @@ -1833,7 +1988,7 @@ extern NCURSES_EXPORT_VAR(SCREEN *) SP; #define _nc_set_screen(sp) SP = sp #endif -#if NCURSES_SP_FUNCS && 0 +#if NCURSES_SP_FUNCS #define CURRENT_SCREEN_PRE (IsPreScreen(CURRENT_SCREEN) ? CURRENT_SCREEN : new_prescr()) #else #define CURRENT_SCREEN_PRE CURRENT_SCREEN @@ -1848,7 +2003,7 @@ extern NCURSES_EXPORT_VAR(SCREEN *) SP; #define screen_columns(sp) (sp)->_columns extern NCURSES_EXPORT(int) _nc_slk_initialize (WINDOW *, int); -extern NCURSES_EXPORT(int) _nc_format_slks (SCREEN *, int); +extern NCURSES_EXPORT(int) _nc_format_slks (NCURSES_SP_DCLx int _c); /* * Some constants related to SLK's @@ -1892,7 +2047,7 @@ extern NCURSES_EXPORT(int) _nc_get_tty_mode(TTY *); }\ sp->jump = outc -struct DriverTCB; /* Terminal Control Block forward declaration */ +#ifdef USE_TERM_DRIVER typedef void* TERM_HANDLE; typedef struct _termInfo @@ -1909,6 +2064,7 @@ typedef struct _termInfo int maxpairs; int nocolorvideo; + int numbuttons; int numlabels; int labelwidth; int labelheight; @@ -1934,6 +2090,7 @@ typedef struct term_driver { void (*initcolor)(struct DriverTCB*,short,short,short,short); void (*docolor)(struct DriverTCB*,short,short,bool,int(*)(SCREEN*,int)); void (*initmouse)(struct DriverTCB*); + int (*testmouse)(struct DriverTCB*,int); void (*setfilter)(struct DriverTCB*); void (*hwlabel)(struct DriverTCB*,int,char*); void (*hwlabelOnOff)(struct DriverTCB*,bool); @@ -1953,7 +2110,6 @@ typedef struct term_driver { bool (*kyExist)(struct DriverTCB*, int); } TERM_DRIVER; - typedef struct DriverTCB { TERMINAL term; /* needs to be the first Element !!! */ @@ -1982,18 +2138,56 @@ typedef struct DriverTCB extern NCURSES_EXPORT_VAR(const color_t*) _nc_cga_palette; extern NCURSES_EXPORT_VAR(const color_t*) _nc_hls_palette; -#ifdef USE_TERM_DRIVER -extern NCURSES_EXPORT(int) _nc_tinfo_has_key(SCREEN*, int); -extern NCURSES_EXPORT(int) _nc_tinfo_doupdate(SCREEN *sp); -extern NCURSES_EXPORT(int) _nc_tinfo_mvcur(SCREEN*,int,int,int,int); extern NCURSES_EXPORT(int) _nc_get_driver(TERMINAL_CONTROL_BLOCK*, const char*, int*); +extern NCURSES_EXPORT(void) _nc_get_screensize_ex(SCREEN *, TERMINAL *, int *, int *); +#endif /* USE_TERM_DRIVER */ + +/* + * Entrypoints which are actually provided in the terminal driver, which would + * be an sp-name otherwise. + */ +#ifdef USE_TERM_DRIVER +#define TINFO_HAS_KEY _nc_tinfo_has_key +#define TINFO_DOUPDATE _nc_tinfo_doupdate +#define TINFO_MVCUR _nc_tinfo_mvcur +extern NCURSES_EXPORT(int) TINFO_HAS_KEY(SCREEN*, int); +extern NCURSES_EXPORT(int) TINFO_DOUPDATE(SCREEN *); +extern NCURSES_EXPORT(int) TINFO_MVCUR(SCREEN*, int, int, int, int); +#else +#define TINFO_HAS_KEY NCURSES_SP_NAME(has_key) +#define TINFO_DOUPDATE NCURSES_SP_NAME(doupdate) +#define TINFO_MVCUR NCURSES_SP_NAME(mvcur) #endif +/* + * Entrypoints using an extra parameter with the terminal driver. + */ +#ifdef USE_TERM_DRIVER +extern NCURSES_EXPORT(void) _nc_get_screensize(SCREEN *, TERMINAL *, int *, int *); +extern NCURSES_EXPORT(int) _nc_setupterm_ex(TERMINAL **, NCURSES_CONST char *, int , int *, bool); +#define TINFO_GET_SIZE(sp, tp, lp, cp) \ + _nc_get_screensize(sp, tp, lp, cp) +#define TINFO_SET_CURTERM(sp, tp) \ + NCURSES_SP_NAME(set_curterm)(sp, tp) +#define TINFO_SETUP_TERM(tpp, name, fd, err, reuse) \ + _nc_setupterm_ex(tpp, name, fd, err, reuse) +#else /* !USE_TERM_DRIVER */ +extern NCURSES_EXPORT(void) _nc_get_screensize(SCREEN *, int *, int *); +#define TINFO_GET_SIZE(sp, tp, lp, cp) \ + _nc_get_screensize(sp, lp, cp) +#define TINFO_SET_CURTERM(sp, tp) \ + set_curterm(tp) +#define TINFO_SETUP_TERM(tpp, name, fd, err, reuse) \ + _nc_setupterm(name, fd, err, reuse) +#endif /* !USE_TERM_DRIVER */ + +#ifdef USE_TERM_DRIVER #ifdef __MINGW32__ #include extern NCURSES_EXPORT_VAR(TERM_DRIVER) _nc_WIN_DRIVER; #endif extern NCURSES_EXPORT_VAR(TERM_DRIVER) _nc_TINFO_DRIVER; +#endif #ifdef USE_TERM_DRIVER #define IsTermInfo(sp) (TCBOf(sp) && ((TCBOf(sp)->drv->isTerminfo))) @@ -2014,7 +2208,6 @@ extern NCURSES_EXPORT(WINDOW *) _nc_stdscr_of(SCREEN*); extern NCURSES_EXPORT(int) _nc_outc_wrapper(SCREEN*,int); #if USE_REENTRANT -extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(_nc_ttytype)(SCREEN*); extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_TABSIZE)(SCREEN*); extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(longname)(SCREEN*); #endif @@ -2027,7 +2220,7 @@ extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_set_tabsize)(SCREEN*, int); * We put the safe versions of various calls here as they are not published * part of the API up to now */ -extern NCURSES_EXPORT(TERMINAL*) NCURSES_SP_NAME(cur_term)(SCREEN *sp); +extern NCURSES_EXPORT(TERMINAL*) NCURSES_SP_NAME(_nc_get_cur_term) (SCREEN *sp); extern NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(_nc_makenew) (SCREEN*, int, int, int, int, int); extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(_nc_reset_colors)(SCREEN*); extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(_nc_printf_string)(SCREEN*, const char *, va_list);