1 /**************************************************************************** 2 * Copyright (c) 1998-2005,2006 Free Software Foundation, Inc. * 3 * * 4 * Permission is hereby granted, free of charge, to any person obtaining a * 5 * copy of this software and associated documentation files (the * 6 * "Software"), to deal in the Software without restriction, including * 7 * without limitation the rights to use, copy, modify, merge, publish, * 8 * distribute, distribute with modifications, sublicense, and/or sell * 9 * copies of the Software, and to permit persons to whom the Software is * 10 * furnished to do so, subject to the following conditions: * 11 * * 12 * The above copyright notice and this permission notice shall be included * 13 * in all copies or substantial portions of the Software. * 14 * * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * 16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * 18 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * 20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * 21 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * 22 * * 23 * Except as contained in this notice, the name(s) of the above copyright * 24 * holders shall not be used in advertising or otherwise to promote the * 25 * sale, use or other dealings in this Software without prior written * 26 * authorization. * 27 ****************************************************************************/ 28 29 /**************************************************************************** 30 * Author: Zeyd M. Ben-Halim <[email protected]> 1992,1995 * 31 * and: Eric S. Raymond <[email protected]> * 32 * and: Thomas E. Dickey 1996-on * 33 ****************************************************************************/ 34 35 /* 36 * $Id: curses.priv.h,v 1.314 2006/12/10 00:55:14 tom Exp $ 37 * 38 * curses.priv.h 39 * 40 * Header file for curses library objects which are private to 41 * the library. 42 * 43 */ 44 45 #ifndef _CURSES_PRIV_H 46 #define _CURSES_PRIV_H 1 47 48 //// #include <ncurses_dll.h> 49 50 #ifdef __cplusplus 51 extern "C" { 52 #endif 53 54 //// #include <ncurses_cfg.h> 55 56 #if USE_RCS_IDS 57 #define MODULE_ID(id) static const char Ident[] = id; 58 #else 59 #define MODULE_ID(id) /*nothing*/ 60 #endif 61 62 #include <stdlib.h> 63 #include <string.h> 64 #include <sys/types.h> 65 66 #if HAVE_UNISTD_H 67 #include <unistd.h> 68 #endif 69 70 //// #if HAVE_SYS_BSDTYPES_H 71 //// #include <sys/bsdtypes.h> /* needed for ISC */ 72 //// #endif 73 74 #if HAVE_LIMITS_H 75 # include <limits.h> 76 //// #elif HAVE_SYS_PARAM_H 77 //// # include <sys/param.h> 78 #endif 79 //// 80 //// #include <assert.h> 81 #include <stdio.h> 82 83 #include <errno.h> 84 85 #if DECL_ERRNO 86 extern int errno; 87 #endif 88 89 //// #include <nc_panel.h> 90 //// 91 //// /* Some systems have a broken 'select()', but workable 'poll()'. Use that */ 92 //// #if HAVE_WORKING_POLL 93 //// #define USE_FUNC_POLL 1 94 //// #if HAVE_POLL_H 95 //// #include <poll.h> 96 //// #else 97 //// #include <sys/poll.h> 98 //// #endif 99 //// #else 100 //// #define USE_FUNC_POLL 0 101 //// #endif 102 //// 103 //// /* include signal.h before curses.h to work-around defect in glibc 2.1.3 */ 104 //// #include <signal.h> 105 106 /* Alessandro Rubini's GPM (general-purpose mouse) */ 107 #if HAVE_LIBGPM && HAVE_GPM_H 108 #define USE_GPM_SUPPORT 1 109 #else 110 #define USE_GPM_SUPPORT 0 111 #endif 112 113 /* QNX mouse support */ 114 #if defined(__QNX__) && !defined(__QNXNTO__) 115 #define USE_QNX_MOUSE 1 116 #else 117 #define USE_QNX_MOUSE 0 118 #endif 119 120 /* EMX mouse support */ 121 #ifdef __EMX__ 122 #define USE_EMX_MOUSE 1 123 #else 124 #define USE_EMX_MOUSE 0 125 #endif 126 127 #define DEFAULT_MAXCLICK 166 128 #define EV_MAX 8 /* size of mouse circular event queue */ 129 130 /* 131 * If we don't have signals to support it, don't add a sigwinch handler. 132 * In any case, resizing is an extended feature. Use it if we've got it. 133 */ 134 #if !NCURSES_EXT_FUNCS 135 #undef HAVE_SIZECHANGE 136 #define HAVE_SIZECHANGE 0 137 #endif 138 139 #if HAVE_SIZECHANGE && defined(SIGWINCH) 140 #define USE_SIZECHANGE 1 141 #else 142 #define USE_SIZECHANGE 0 143 #undef USE_SIGWINCH 144 #define USE_SIGWINCH 0 145 #endif 146 147 /* 148 * If desired, one can configure this, disabling environment variables that 149 * point to custom terminfo/termcap locations. 150 */ 151 #ifdef USE_ROOT_ENVIRON 152 #define use_terminfo_vars() 1 153 #else 154 #define use_terminfo_vars() _nc_env_access() 155 extern NCURSES_EXPORT(int) _nc_env_access (void); 156 #endif 157 158 /* 159 * Not all platforms have memmove; some have an equivalent bcopy. (Some may 160 * have neither). 161 */ 162 #if USE_OK_BCOPY 163 #define memmove(d,s,n) bcopy(s,d,n) 164 #elif USE_MY_MEMMOVE 165 #define memmove(d,s,n) _nc_memmove(d,s,n) 166 extern NCURSES_EXPORT(void *) _nc_memmove (void *, const void *, size_t); 167 #endif 168 169 /* 170 * Scroll hints are useless when hashmap is used 171 */ 172 //// #if !USE_SCROLL_HINTS 173 //// #if !USE_HASHMAP 174 //// #define USE_SCROLL_HINTS 1 175 //// #else 176 //// #define USE_SCROLL_HINTS 0 177 //// #endif 178 //// #endif 179 180 #if USE_SCROLL_HINTS 181 #define if_USE_SCROLL_HINTS(stmt) stmt 182 #else 183 #define if_USE_SCROLL_HINTS(stmt) /*nothing*/ 184 #endif 185 186 /* 187 * Note: ht/cbt expansion flakes out randomly under Linux 1.1.47, but only 188 * when we're throwing control codes at the screen at high volume. To see 189 * this, re-enable USE_HARD_TABS and run worm for a while. Other systems 190 * probably don't want to define this either due to uncertainties about tab 191 * delays and expansion in raw mode. 192 */ 193 194 struct tries { 195 struct tries *child; /* ptr to child. NULL if none */ 196 struct tries *sibling; /* ptr to sibling. NULL if none */ 197 unsigned char ch; /* character at this node */ 198 unsigned short value; /* code of string so far. 0 if none. */ 199 }; 200 201 /* 202 * Common/troublesome character definitions 203 */ 204 #define L_BRACE '{' 205 #define R_BRACE '}' 206 #define S_QUOTE '\'' 207 #define D_QUOTE '"' 208 209 #define VT_ACSC "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~" 210 211 /* 212 * Structure for palette tables 213 */ 214 215 typedef struct 216 { 217 short red, green, blue; /* what color_content() returns */ 218 short r, g, b; /* params to init_color() */ 219 int init; /* true if we called init_color() */ 220 } 221 color_t; 222 223 #define MAXCOLUMNS 135 224 #define MAXLINES 66 225 #define FIFO_SIZE MAXCOLUMNS+2 /* for nocbreak mode input */ 226 227 #define ACS_LEN 128 228 229 #define WINDOWLIST struct _win_list 230 231 #if USE_WIDEC_SUPPORT 232 #define _nc_bkgd _bkgrnd 233 #else 234 #undef _XOPEN_SOURCE_EXTENDED 235 #define _nc_bkgd _bkgd 236 #define wgetbkgrnd(win, wch) *wch = win->_bkgd 237 #define wbkgrnd wbkgd 238 #endif 239 240 //// #include <curses.h> /* we'll use -Ipath directive to get the right one! */ 241 //// #include <term.h> 242 //// #include <term_entry.h> 243 //// #include <nc_tparm.h> 244 245 #if NCURSES_EXT_COLORS && USE_WIDEC_SUPPORT 246 #define if_EXT_COLORS(stmt) stmt 247 #define NetPair(value,p) (value).ext_color = (p), \ 248 AttrOf(value) &= ALL_BUT_COLOR, \ 249 AttrOf(value) |= (A_COLOR & COLOR_PAIR((p > 255) ? 255 : p)) 250 #define SetPair(value,p) (value).ext_color = (p) 251 #define GetPair(value) (value).ext_color 252 #define unColor(n) (AttrOf(n) & ALL_BUT_COLOR) 253 #define GET_WINDOW_PAIR(w) (w)->_color 254 #define SET_WINDOW_PAIR(w,p) (w)->_color = (p) 255 #define SameAttrOf(a,b) (AttrOf(a) == AttrOf(b) && GetPair(a) == GetPair(b)) 256 #define VIDATTR(attr, pair) vid_attr(attr, pair, 0) 257 #else 258 #define if_EXT_COLORS(stmt) /* nothing */ 259 #define SetPair(value,p) RemAttr(value, A_COLOR), \ 260 SetAttr(value, AttrOf(value) | (A_COLOR & COLOR_PAIR(p))) 261 #define GetPair(value) PAIR_NUMBER(AttrOf(value)) 262 #define unColor(n) (AttrOf(n) & ALL_BUT_COLOR) 263 #define GET_WINDOW_PAIR(w) PAIR_NUMBER(WINDOW_ATTRS(w)) 264 #define SET_WINDOW_PAIR(w,p) WINDOW_ATTRS(w) &= ALL_BUT_COLOR, \ 265 WINDOW_ATTRS(w) |= (A_COLOR & COLOR_PAIR(p)) 266 #define SameAttrOf(a,b) (AttrOf(a) == AttrOf(b)) 267 #define VIDATTR(attr, pair) vidattr(attr) 268 #endif 269 270 #define WINDOW_ATTRS(w) ((w)->_attrs) 271 272 #define SCREEN_ATTRS(s) (*((s)->_current_attr)) 273 #define GET_SCREEN_PAIR(s) GetPair(SCREEN_ATTRS(s)) 274 #define SET_SCREEN_PAIR(s,p) SetPair(SCREEN_ATTRS(s), p) 275 276 /* 277 * Definitions for color pairs 278 */ 279 typedef unsigned colorpair_t; /* type big enough to store PAIR_OF() */ 280 #define C_SHIFT 9 /* we need more bits than there are colors */ 281 #define C_MASK ((1 << C_SHIFT) - 1) 282 #define PAIR_OF(fg, bg) ((((fg) & C_MASK) << C_SHIFT) | ((bg) & C_MASK)) 283 #define isDefaultColor(c) ((c) >= COLOR_DEFAULT || (c) < 0) 284 285 #define COLOR_DEFAULT C_MASK 286 287 #if defined(USE_TERMLIB) && !defined(NEED_NCURSES_CH_T) 288 289 #undef NCURSES_CH_T /* this is not a termlib feature */ 290 #define NCURSES_CH_T void /* ...but we need a pointer in SCREEN */ 291 292 #endif /* USE_TERMLIB */ 293 294 #ifndef USE_TERMLIB 295 struct ldat 296 { 297 NCURSES_CH_T *text; /* text of the line */ 298 NCURSES_SIZE_T firstchar; /* first changed character in the line */ 299 NCURSES_SIZE_T lastchar; /* last changed character in the line */ 300 NCURSES_SIZE_T oldindex; /* index of the line at last update */ 301 }; 302 #endif /* USE_TERMLIB */ 303 304 typedef enum { 305 M_XTERM = -1 /* use xterm's mouse tracking? */ 306 ,M_NONE = 0 /* no mouse device */ 307 #if USE_GPM_SUPPORT 308 ,M_GPM /* use GPM */ 309 #endif 310 #if USE_SYSMOUSE 311 ,M_SYSMOUSE /* FreeBSD sysmouse on console */ 312 #endif 313 } MouseType; 314 315 /* 316 * Structures for scrolling. 317 */ 318 319 typedef struct { 320 unsigned long hashval; 321 int oldcount, newcount; 322 int oldindex, newindex; 323 } HASHMAP; 324 325 /* 326 * Structures for soft labels. 327 */ 328 329 struct _SLK; 330 331 #ifndef USE_TERMLIB 332 333 typedef struct 334 { 335 char *ent_text; /* text for the label */ 336 char *form_text; /* formatted text (left/center/...) */ 337 int ent_x; /* x coordinate of this field */ 338 char dirty; /* this label has changed */ 339 char visible; /* field is visible */ 340 } slk_ent; 341 342 typedef struct _SLK { 343 char dirty; /* all labels have changed */ 344 char hidden; /* soft labels are hidden */ 345 WINDOW *win; 346 slk_ent *ent; 347 short maxlab; /* number of available labels */ 348 short labcnt; /* number of allocated labels */ 349 short maxlen; /* length of labels */ 350 NCURSES_CH_T attr; /* soft label attribute */ 351 } SLK; 352 353 #endif /* USE_TERMLIB */ 354 355 typedef struct { 356 int line; /* lines to take, < 0 => from bottom*/ 357 int (*hook)(WINDOW *, int); /* callback for user */ 358 WINDOW *w; /* maybe we need this for cleanup */ 359 } ripoff_t; 360 361 #if USE_GPM_SUPPORT 362 #undef buttons /* term.h defines this, and gpm uses it! */ 363 #include <gpm.h> 364 365 #ifdef HAVE_LIBDL 366 /* link dynamically to GPM */ 367 typedef int *TYPE_gpm_fd; 368 typedef int (*TYPE_Gpm_Open) (Gpm_Connect *, int); 369 typedef int (*TYPE_Gpm_Close) (void); 370 typedef int (*TYPE_Gpm_GetEvent) (Gpm_Event *); 371 372 #define my_gpm_fd SP->_mouse_gpm_fd 373 #define my_Gpm_Open SP->_mouse_Gpm_Open 374 #define my_Gpm_Close SP->_mouse_Gpm_Close 375 #define my_Gpm_GetEvent SP->_mouse_Gpm_GetEvent 376 #else 377 /* link statically to GPM */ 378 #define my_gpm_fd &gpm_fd 379 #define my_Gpm_Open Gpm_Open 380 #define my_Gpm_Close Gpm_Close 381 #define my_Gpm_GetEvent Gpm_GetEvent 382 #endif /* HAVE_LIBDL */ 383 #endif /* USE_GPM_SUPPORT */ 384 385 /* 386 * The SCREEN structure. 387 */ 388 389 struct screen { 390 int _ifd; /* input file ptr for screen */ 391 FILE *_ofp; /* output file ptr for screen */ 392 char *_setbuf; /* buffered I/O for output */ 393 bool _filtered; /* filter() was called */ 394 bool _buffered; /* setvbuf uses _setbuf data */ 395 int _checkfd; /* filedesc for typeahead check */ 396 //// TERMINAL *_term; /* terminal type information */ 397 short _lines; /* screen lines */ 398 short _columns; /* screen columns */ 399 400 short _lines_avail; /* lines available for stdscr */ 401 short _topstolen; /* lines stolen from top */ 402 ripoff_t _rippedoff[5]; /* list of lines stolen */ 403 int _rip_count; /* ...and total lines stolen */ 404 405 WINDOW *_curscr; /* current screen */ 406 WINDOW *_newscr; /* virtual screen to be updated to */ 407 WINDOW *_stdscr; /* screen's full-window context */ 408 409 struct tries *_keytry; /* "Try" for use with keypad mode */ 410 struct tries *_key_ok; /* Disabled keys via keyok(,FALSE) */ 411 bool _tried; /* keypad mode was initialized */ 412 bool _keypad_on; /* keypad mode is currently on */ 413 414 bool _called_wgetch; /* check for recursion in wgetch() */ 415 int _fifo[FIFO_SIZE]; /* input push-back buffer */ 416 short _fifohead, /* head of fifo queue */ 417 _fifotail, /* tail of fifo queue */ 418 _fifopeek, /* where to peek for next char */ 419 _fifohold; /* set if breakout marked */ 420 421 int _endwin; /* are we out of window mode? */ 422 NCURSES_CH_T *_current_attr; /* holds current attributes set */ 423 int _coloron; /* is color enabled? */ 424 int _color_defs; /* are colors modified */ 425 int _cursor; /* visibility of the cursor */ 426 int _cursrow; /* physical cursor row */ 427 int _curscol; /* physical cursor column */ 428 bool _notty; /* true if we cannot switch non-tty */ 429 int _nl; /* True if NL -> CR/NL is on */ 430 int _raw; /* True if in raw mode */ 431 int _cbreak; /* 1 if in cbreak mode */ 432 /* > 1 if in halfdelay mode */ 433 int _echo; /* True if echo on */ 434 int _use_meta; /* use the meta key? */ 435 struct _SLK *_slk; /* ptr to soft key struct / NULL */ 436 int slk_format; /* selected format for this screen */ 437 /* cursor movement costs; units are 10ths of milliseconds */ 438 #if NCURSES_NO_PADDING 439 int _no_padding; /* flag to set if padding disabled */ 440 #endif 441 int _char_padding; /* cost of character put */ 442 int _cr_cost; /* cost of (carriage_return) */ 443 int _cup_cost; /* cost of (cursor_address) */ 444 int _home_cost; /* cost of (cursor_home) */ 445 int _ll_cost; /* cost of (cursor_to_ll) */ 446 #if USE_HARD_TABS 447 int _ht_cost; /* cost of (tab) */ 448 int _cbt_cost; /* cost of (backtab) */ 449 #endif /* USE_HARD_TABS */ 450 int _cub1_cost; /* cost of (cursor_left) */ 451 int _cuf1_cost; /* cost of (cursor_right) */ 452 int _cud1_cost; /* cost of (cursor_down) */ 453 int _cuu1_cost; /* cost of (cursor_up) */ 454 int _cub_cost; /* cost of (parm_cursor_left) */ 455 int _cuf_cost; /* cost of (parm_cursor_right) */ 456 int _cud_cost; /* cost of (parm_cursor_down) */ 457 int _cuu_cost; /* cost of (parm_cursor_up) */ 458 int _hpa_cost; /* cost of (column_address) */ 459 int _vpa_cost; /* cost of (row_address) */ 460 /* used in tty_update.c, must be chars */ 461 int _ed_cost; /* cost of (clr_eos) */ 462 int _el_cost; /* cost of (clr_eol) */ 463 int _el1_cost; /* cost of (clr_bol) */ 464 int _dch1_cost; /* cost of (delete_character) */ 465 int _ich1_cost; /* cost of (insert_character) */ 466 int _dch_cost; /* cost of (parm_dch) */ 467 int _ich_cost; /* cost of (parm_ich) */ 468 int _ech_cost; /* cost of (erase_chars) */ 469 int _rep_cost; /* cost of (repeat_char) */ 470 int _hpa_ch_cost; /* cost of (column_address) */ 471 int _cup_ch_cost; /* cost of (cursor_address) */ 472 int _cuf_ch_cost; /* cost of (parm_cursor_right) */ 473 int _inline_cost; /* cost of inline-move */ 474 int _smir_cost; /* cost of (enter_insert_mode) */ 475 int _rmir_cost; /* cost of (exit_insert_mode) */ 476 int _ip_cost; /* cost of (insert_padding) */ 477 /* used in lib_mvcur.c */ 478 char * _address_cursor; 479 /* used in tty_update.c */ 480 int _scrolling; /* 1 if terminal's smart enough to */ 481 482 /* used in lib_color.c */ 483 color_t *_color_table; /* screen's color palette */ 484 int _color_count; /* count of colors in palette */ 485 colorpair_t *_color_pairs; /* screen's color pair list */ 486 int _pair_count; /* count of color pairs */ 487 #if NCURSES_EXT_FUNCS 488 bool _default_color; /* use default colors */ 489 bool _has_sgr_39_49; /* has ECMA default color support */ 490 int _default_fg; /* assumed default foreground */ 491 int _default_bg; /* assumed default background */ 492 #endif 493 chtype _ok_attributes; /* valid attributes for terminal */ 494 chtype _xmc_suppress; /* attributes to suppress if xmc */ 495 chtype _xmc_triggers; /* attributes to process if xmc */ 496 chtype * _acs_map; /* the real alternate-charset map */ 497 bool * _screen_acs_map; 498 499 /* used in lib_vidattr.c */ 500 bool _use_rmso; /* true if we may use 'rmso' */ 501 bool _use_rmul; /* true if we may use 'rmul' */ 502 503 /* 504 * These data correspond to the state of the idcok() and idlok() 505 * functions. A caveat is in order here: the XSI and SVr4 506 * documentation specify that these functions apply to the window which 507 * is given as an argument. However, ncurses implements this logic 508 * only for the newscr/curscr update process, _not_ per-window. 509 */ 510 bool _nc_sp_idlok; 511 bool _nc_sp_idcok; 512 #define _nc_idlok SP->_nc_sp_idlok 513 #define _nc_idcok SP->_nc_sp_idcok 514 515 #ifdef NCURSES_MOUSE_VERSION 516 /* 517 * These are the data that support the mouse interface. 518 */ 519 bool _mouse_initialized; 520 MouseType _mouse_type; 521 int _maxclick; 522 bool (*_mouse_event) (SCREEN *); 523 bool (*_mouse_inline)(SCREEN *); 524 bool (*_mouse_parse) (int); 525 void (*_mouse_resume)(SCREEN *); 526 void (*_mouse_wrap) (SCREEN *); 527 int _mouse_fd; /* file-descriptor, if any */ 528 bool _mouse_active; /* true if initialized */ 529 mmask_t _mouse_mask; 530 NCURSES_CONST char *_mouse_xtermcap; /* string to enable/disable mouse */ 531 MEVENT _mouse_events[EV_MAX]; /* hold the last mouse event seen */ 532 MEVENT *_mouse_eventp; /* next free slot in event queue */ 533 #endif 534 535 #if USE_GPM_SUPPORT 536 bool _mouse_gpm_loaded; 537 bool _mouse_gpm_found; 538 #ifdef HAVE_LIBDL 539 TYPE_gpm_fd _mouse_gpm_fd; 540 TYPE_Gpm_Open _mouse_Gpm_Open; 541 TYPE_Gpm_Close _mouse_Gpm_Close; 542 TYPE_Gpm_GetEvent _mouse_Gpm_GetEvent; 543 #endif 544 Gpm_Connect _mouse_gpm_connect; 545 #endif /* USE_GPM_SUPPORT */ 546 547 #if USE_EMX_MOUSE 548 int _emxmouse_wfd; 549 int _emxmouse_thread; 550 int _emxmouse_activated; 551 char _emxmouse_buttons[4]; 552 #endif 553 554 #if USE_SYSMOUSE 555 MEVENT _sysmouse_fifo[FIFO_SIZE]; 556 int _sysmouse_head; 557 int _sysmouse_tail; 558 int _sysmouse_char_width; /* character width */ 559 int _sysmouse_char_height; /* character height */ 560 int _sysmouse_old_buttons; 561 int _sysmouse_new_buttons; 562 #endif 563 564 /* 565 * This supports automatic resizing 566 */ 567 #if USE_SIZECHANGE 568 int (*_resize)(int,int); 569 #endif 570 571 /* 572 * These are data that support the proper handling of the panel stack on an 573 * per screen basis. 574 */ 575 //// struct panelhook _panelHook; 576 /* 577 * Linked-list of all windows, to support '_nc_resizeall()' and 578 * '_nc_freeall()' 579 */ 580 WINDOWLIST *_nc_sp_windows; 581 #define _nc_windows SP->_nc_sp_windows 582 583 bool _sig_winch; 584 SCREEN *_next_screen; 585 586 /* hashes for old and new lines */ 587 unsigned long *oldhash, *newhash; 588 HASHMAP *hashtab; 589 int hashtab_len; 590 591 bool _cleanup; /* cleanup after int/quit signal */ 592 int (*_outch)(int); /* output handler if not putc */ 593 594 int _legacy_coding; /* see use_legacy_coding() */ 595 596 /* 597 * ncurses/ncursesw are the same up to this point. 598 */ 599 #if USE_WIDEC_SUPPORT 600 /* recent versions of 'screen' have partially-working support for 601 * UTF-8, but do not permit ACS at the same time (see tty_update.c). 602 */ 603 bool _screen_acs_fix; 604 #endif 605 }; 606 607 extern NCURSES_EXPORT_VAR(SCREEN *) _nc_screen_chain; 608 609 WINDOWLIST { 610 WINDOW win; /* first, so WINDOW_EXT() works */ 611 WINDOWLIST *next; 612 #ifdef _XOPEN_SOURCE_EXTENDED 613 char addch_work[(MB_LEN_MAX * 9) + 1]; 614 unsigned addch_used; /* number of bytes in addch_work[] */ 615 int addch_x; /* x-position for addch_work[] */ 616 int addch_y; /* y-position for addch_work[] */ 617 #endif 618 }; 619 620 #define WINDOW_EXT(win,field) (((WINDOWLIST *)(win))->field) 621 622 /* usually in <limits.h> */ 623 #ifndef UCHAR_MAX 624 #define UCHAR_MAX 255 625 #endif 626 627 /* The terminfo source is assumed to be 7-bit ASCII */ 628 #define is7bits(c) ((unsigned)(c) < 128) 629 630 /* Checks for isprint() should be done on 8-bit characters (non-wide) */ 631 #define is8bits(c) ((unsigned)(c) <= UCHAR_MAX) 632 633 #ifndef min 634 #define min(a,b) ((a) > (b) ? (b) : (a)) 635 #endif 636 637 #ifndef max 638 #define max(a,b) ((a) < (b) ? (b) : (a)) 639 #endif 640 641 /* usually in <unistd.h> */ 642 #ifndef STDIN_FILENO 643 #define STDIN_FILENO 0 644 #endif 645 646 #ifndef STDOUT_FILENO 647 #define STDOUT_FILENO 1 648 #endif 649 650 #ifndef STDERR_FILENO 651 #define STDERR_FILENO 2 652 #endif 653 654 #ifndef EXIT_SUCCESS 655 #define EXIT_SUCCESS 0 656 #endif 657 658 #ifndef EXIT_FAILURE 659 #define EXIT_FAILURE 1 660 #endif 661 662 #ifndef R_OK 663 #define R_OK 4 /* Test for read permission. */ 664 #endif 665 #ifndef W_OK 666 #define W_OK 2 /* Test for write permission. */ 667 #endif 668 #ifndef X_OK 669 #define X_OK 1 /* Test for execute permission. */ 670 #endif 671 #ifndef F_OK 672 #define F_OK 0 /* Test for existence. */ 673 #endif 674 675 #if HAVE_FCNTL_H 676 //// #include <fcntl.h> /* may define O_BINARY */ 677 #endif 678 679 #ifndef O_BINARY 680 #define O_BINARY 0 681 #endif 682 683 #ifdef TRACE 684 #define TRACE_OUTCHARS(n) _nc_outchars += (n); 685 #else 686 #define TRACE_OUTCHARS(n) /* nothing */ 687 #endif 688 689 #define UChar(c) ((unsigned char)(c)) 690 #define ChCharOf(c) ((c) & (chtype)A_CHARTEXT) 691 #define ChAttrOf(c) ((c) & (chtype)A_ATTRIBUTES) 692 693 #ifndef MB_LEN_MAX 694 #define MB_LEN_MAX 8 /* should be >= MB_CUR_MAX, but that may be a function */ 695 #endif 696 697 #if USE_WIDEC_SUPPORT /* { */ 698 #define isEILSEQ(status) ((status == (size_t)-1) && (errno == EILSEQ)) 699 700 #define init_mb(state) memset(&state, 0, sizeof(state)) 701 702 #if NCURSES_EXT_COLORS 703 #define NulColor , 0 704 #else 705 #define NulColor /* nothing */ 706 #endif 707 708 #define NulChar 0,0,0,0 /* FIXME: see CCHARW_MAX */ 709 #define CharOf(c) ((c).chars[0]) 710 #define AttrOf(c) ((c).attr) 711 #define AddAttr(c,a) AttrOf(c) |= ((a) & A_ATTRIBUTES) 712 #define RemAttr(c,a) AttrOf(c) &= ~((a) & A_ATTRIBUTES) 713 #define SetAttr(c,a) AttrOf(c) = ((a) & A_ATTRIBUTES) 714 #define NewChar2(c,a) { a, { c, NulChar } NulColor } 715 #define NewChar(ch) NewChar2(ChCharOf(ch), ChAttrOf(ch)) 716 #define CharEq(a,b) (!memcmp(&(a), &(b), sizeof(a))) 717 #define SetChar(ch,c,a) do { \ 718 NCURSES_CH_T *_cp = &ch; \ 719 memset(_cp, 0, sizeof(ch)); \ 720 _cp->chars[0] = (c); \ 721 _cp->attr = (a); \ 722 if_EXT_COLORS(SetPair(ch, PAIR_NUMBER(a))); \ 723 } while (0) 724 #define CHREF(wch) (&wch) 725 #define CHDEREF(wch) (*wch) 726 #define ARG_CH_T NCURSES_CH_T * 727 #define CARG_CH_T const NCURSES_CH_T * 728 #define PUTC_DATA char PUTC_buf[MB_LEN_MAX]; int PUTC_i, PUTC_n; \ 729 mbstate_t PUT_st; wchar_t PUTC_ch 730 #define PUTC_INIT init_mb (PUT_st) 731 #define PUTC(ch,b) do { if(!isWidecExt(ch)) { \ 732 if (Charable(ch)) { \ 733 fputc(CharOf(ch), b); \ 734 TRACE_OUTCHARS(1); \ 735 } else { \ 736 PUTC_INIT; \ 737 for (PUTC_i = 0; PUTC_i < CCHARW_MAX; ++PUTC_i) { \ 738 PUTC_ch = (ch).chars[PUTC_i]; \ 739 if (PUTC_ch == L'\0') \ 740 break; \ 741 PUTC_n = wcrtomb(PUTC_buf, \ 742 (ch).chars[PUTC_i], &PUT_st); \ 743 if (PUTC_n <= 0) { \ 744 if (PUTC_ch && is8bits(PUTC_ch) && PUTC_i == 0) \ 745 putc(PUTC_ch,b); \ 746 break; \ 747 } \ 748 fwrite(PUTC_buf, (unsigned) PUTC_n, 1, b); \ 749 } \ 750 TRACE_OUTCHARS(PUTC_i); \ 751 } } } while (0) 752 753 #define BLANK { WA_NORMAL, {' '} NulColor } 754 #define ZEROS { WA_NORMAL, {'\0'} NulColor } 755 #define ISBLANK(ch) ((ch).chars[0] == L' ' && (ch).chars[1] == L'\0') 756 757 /* 758 * Wide characters cannot be represented in the A_CHARTEXT mask of 759 * attr_t's but an application might have set a narrow character there. 760 * But even in that case, it would only be a printable character, or 761 * zero. Otherwise we can use those bits to tell if a cell is the 762 * first or extension part of a wide character. 763 */ 764 #define WidecExt(ch) (AttrOf(ch) & A_CHARTEXT) 765 #define isWidecBase(ch) (WidecExt(ch) == 1) 766 #define isWidecExt(ch) (WidecExt(ch) > 1 && WidecExt(ch) < 32) 767 #define SetWidecExt(dst, ext) AttrOf(dst) &= ~A_CHARTEXT, \ 768 AttrOf(dst) |= (ext + 1) 769 770 #define if_WIDEC(code) code 771 #define Charable(ch) ((SP != 0 && SP->_legacy_coding) \ 772 || (AttrOf(ch) & A_ALTCHARSET) \ 773 || (!isWidecExt(ch) && \ 774 (ch).chars[1] == L'\0' && \ 775 _nc_is_charable(CharOf(ch)))) 776 777 #define L(ch) L ## ch 778 #else /* }{ */ 779 #define CharOf(c) ChCharOf(c) 780 #define AttrOf(c) ChAttrOf(c) 781 #define AddAttr(c,a) c |= (a) 782 #define RemAttr(c,a) c &= ~((a) & A_ATTRIBUTES) 783 #define SetAttr(c,a) c = ((c) & ~A_ATTRIBUTES) | (a) 784 #define NewChar(ch) (ch) 785 #define NewChar2(c,a) ((c) | (a)) 786 #define CharEq(a,b) ((a) == (b)) 787 #define SetChar(ch,c,a) ch = (c) | (a) 788 #define CHREF(wch) wch 789 #define CHDEREF(wch) wch 790 #define ARG_CH_T NCURSES_CH_T 791 #define CARG_CH_T NCURSES_CH_T 792 #define PUTC_DATA int data = 0 793 #define PUTC(ch,b) do { data = CharOf(ch); putc(data,b); } while (0) 794 795 #define BLANK (' '|A_NORMAL) 796 #define ZEROS ('\0'|A_NORMAL) 797 #define ISBLANK(ch) (CharOf(ch) == ' ') 798 799 #define isWidecExt(ch) (0) 800 #define if_WIDEC(code) /* nothing */ 801 802 #define L(ch) ch 803 #endif /* } */ 804 805 #define AttrOfD(ch) AttrOf(CHDEREF(ch)) 806 #define CharOfD(ch) CharOf(CHDEREF(ch)) 807 #define SetChar2(wch,ch) SetChar(wch,ChCharOf(ch),ChAttrOf(ch)) 808 809 #define BLANK_ATTR A_NORMAL 810 #define BLANK_TEXT L(' ') 811 812 #define CHANGED -1 813 814 #define LEGALYX(w, y, x) \ 815 ((w) != 0 && \ 816 ((x) >= 0 && (x) <= (w)->_maxx && \ 817 (y) >= 0 && (y) <= (w)->_maxy)) 818 819 #define CHANGED_CELL(line,col) \ 820 if (line->firstchar == _NOCHANGE) \ 821 line->firstchar = line->lastchar = col; \ 822 else if ((col) < line->firstchar) \ 823 line->firstchar = col; \ 824 else if ((col) > line->lastchar) \ 825 line->lastchar = col 826 827 #define CHANGED_RANGE(line,start,end) \ 828 if (line->firstchar == _NOCHANGE \ 829 || line->firstchar > (start)) \ 830 line->firstchar = start; \ 831 if (line->lastchar == _NOCHANGE \ 832 || line->lastchar < (end)) \ 833 line->lastchar = end 834 835 #define CHANGED_TO_EOL(line,start,end) \ 836 if (line->firstchar == _NOCHANGE \ 837 || line->firstchar > (start)) \ 838 line->firstchar = start; \ 839 line->lastchar = end 840 841 #define SIZEOF(v) (sizeof(v)/sizeof(v[0])) 842 843 #define FreeIfNeeded(p) if ((p) != 0) free(p) 844 845 /* FreeAndNull() is not a comma-separated expression because some compilers 846 * do not accept a mixture of void with values. 847 */ 848 #define FreeAndNull(p) free(p); p = 0 849 850 //// #include <nc_alloc.h> 851 852 /* 853 * TTY bit definition for converting tabs to spaces. 854 */ 855 #ifdef TAB3 856 # define OFLAGS_TABS TAB3 /* POSIX specifies TAB3 */ 857 #else 858 # ifdef XTABS 859 # define OFLAGS_TABS XTABS /* XTABS is usually the "same" */ 860 # else 861 # ifdef OXTABS 862 # define OFLAGS_TABS OXTABS /* the traditional BSD equivalent */ 863 # else 864 # define OFLAGS_TABS 0 865 # endif 866 # endif 867 #endif 868 869 /* 870 * Prefixes for call/return points of library function traces. We use these to 871 * instrument the public functions so that the traces can be easily transformed 872 * into regression scripts. 873 */ 874 #define T_CALLED(fmt) "called {" fmt 875 #define T_CREATE(fmt) "create :" fmt 876 #define T_RETURN(fmt) "return }" fmt 877 878 #ifdef TRACE 879 880 #define START_TRACE() \ 881 if ((_nc_tracing & TRACE_MAXIMUM) == 0) { \ 882 int t = _nc_getenv_num("NCURSES_TRACE"); \ 883 if (t >= 0) \ 884 trace((unsigned) t); \ 885 } 886 887 #define TR(n, a) if (_nc_tracing & (n)) _tracef a 888 #define T(a) TR(TRACE_CALLS, a) 889 #define TPUTS_TRACE(s) _nc_tputs_trace = s; 890 #define TRACE_RETURN(value,type) return _nc_retrace_##type(value) 891 892 #define returnAttr(code) TRACE_RETURN(code,attr_t) 893 #define returnBits(code) TRACE_RETURN(code,unsigned) 894 #define returnBool(code) TRACE_RETURN(code,bool) 895 #define returnCPtr(code) TRACE_RETURN(code,cptr) 896 #define returnCVoidPtr(code) TRACE_RETURN(code,cvoid_ptr) 897 #define returnChar(code) TRACE_RETURN(code,chtype) 898 #define returnCode(code) TRACE_RETURN(code,int) 899 #define returnPtr(code) TRACE_RETURN(code,ptr) 900 #define returnSP(code) TRACE_RETURN(code,sp) 901 #define returnVoid T((T_RETURN(""))); return 902 #define returnVoidPtr(code) TRACE_RETURN(code,void_ptr) 903 #define returnWin(code) TRACE_RETURN(code,win) 904 905 extern NCURSES_EXPORT(NCURSES_BOOL) _nc_retrace_bool (NCURSES_BOOL); 906 extern NCURSES_EXPORT(NCURSES_CONST void *) _nc_retrace_cvoid_ptr (NCURSES_CONST void *); 907 extern NCURSES_EXPORT(SCREEN *) _nc_retrace_sp (SCREEN *); 908 extern NCURSES_EXPORT(WINDOW *) _nc_retrace_win (WINDOW *); 909 extern NCURSES_EXPORT(attr_t) _nc_retrace_attr_t (attr_t); 910 extern NCURSES_EXPORT(char *) _nc_retrace_ptr (char *); 911 extern NCURSES_EXPORT(char *) _nc_trace_ttymode(TTY *tty); 912 extern NCURSES_EXPORT(char *) _nc_varargs (const char *, va_list); 913 extern NCURSES_EXPORT(chtype) _nc_retrace_chtype (chtype); 914 extern NCURSES_EXPORT(const char *) _nc_altcharset_name(attr_t, chtype); 915 extern NCURSES_EXPORT(const char *) _nc_retrace_cptr (const char *); 916 extern NCURSES_EXPORT(int) _nc_retrace_int (int); 917 extern NCURSES_EXPORT(unsigned) _nc_retrace_unsigned (unsigned); 918 extern NCURSES_EXPORT(void *) _nc_retrace_void_ptr (void *); 919 extern NCURSES_EXPORT(void) _nc_fifo_dump (void); 920 extern NCURSES_EXPORT_VAR(const char *) _nc_tputs_trace; 921 extern NCURSES_EXPORT_VAR(long) _nc_outchars; 922 extern NCURSES_EXPORT_VAR(unsigned) _nc_tracing; 923 924 #if USE_WIDEC_SUPPORT 925 extern NCURSES_EXPORT(const char *) _nc_viswbuf2 (int, const wchar_t *); 926 extern NCURSES_EXPORT(const char *) _nc_viswbufn (const wchar_t *, int); 927 #endif 928 929 extern NCURSES_EXPORT(const char *) _nc_viscbuf2 (int, const NCURSES_CH_T *, int); 930 extern NCURSES_EXPORT(const char *) _nc_viscbuf (const NCURSES_CH_T *, int); 931 932 #else /* !TRACE */ 933 934 #define START_TRACE() /* nothing */ 935 936 #define T(a) 937 #define TR(n, a) 938 #define TPUTS_TRACE(s) 939 940 #define returnAttr(code) return code 941 #define returnBits(code) return code 942 #define returnBool(code) return code 943 #define returnCPtr(code) return code 944 #define returnCVoidPtr(code) return code 945 #define returnChar(code) return code 946 #define returnCode(code) return code 947 #define returnPtr(code) return code 948 #define returnSP(code) return code 949 #define returnVoid return 950 #define returnVoidPtr(code) return code 951 #define returnWin(code) return code 952 953 #endif /* TRACE/!TRACE */ 954 955 /* 956 * Return-codes for tgetent() and friends. 957 */ 958 #define TGETENT_YES 1 /* entry is found */ 959 #define TGETENT_NO 0 /* entry is not found */ 960 #define TGETENT_ERR -1 /* an error occurred */ 961 962 extern NCURSES_EXPORT(const char *) _nc_visbuf2 (int, const char *); 963 extern NCURSES_EXPORT(const char *) _nc_visbufn (const char *, int); 964 965 #define empty_module(name) \ 966 extern NCURSES_EXPORT(void) name (void); \ 967 NCURSES_EXPORT(void) name (void) { } 968 969 #define ALL_BUT_COLOR ((chtype)~(A_COLOR)) 970 #define NONBLANK_ATTR (A_NORMAL|A_BOLD|A_DIM|A_BLINK) 971 #define XMC_CHANGES(c) ((c) & SP->_xmc_suppress) 972 973 #define toggle_attr_on(S,at) {\ 974 if (PAIR_NUMBER(at) > 0) {\ 975 (S) = ((S) & ALL_BUT_COLOR) | (at);\ 976 } else {\ 977 (S) |= (at);\ 978 }\ 979 TR(TRACE_ATTRS, ("new attribute is %s", _traceattr((S))));} 980 981 #define toggle_attr_off(S,at) {\ 982 if (PAIR_NUMBER(at) > 0) {\ 983 (S) &= ~(at|A_COLOR);\ 984 } else {\ 985 (S) &= ~(at);\ 986 }\ 987 TR(TRACE_ATTRS, ("new attribute is %s", _traceattr((S))));} 988 989 #define DelCharCost(count) \ 990 ((parm_dch != 0) \ 991 ? SP->_dch_cost \ 992 : ((delete_character != 0) \ 993 ? (SP->_dch1_cost * count) \ 994 : INFINITY)) 995 996 #define InsCharCost(count) \ 997 ((parm_ich != 0) \ 998 ? SP->_ich_cost \ 999 : ((enter_insert_mode && exit_insert_mode) \ 1000 ? SP->_smir_cost + SP->_rmir_cost + (SP->_ip_cost * count) \ 1001 : ((insert_character != 0) \ 1002 ? ((SP->_ich1_cost + SP->_ip_cost) * count) \ 1003 : INFINITY))) 1004 1005 #if USE_XMC_SUPPORT 1006 #define UpdateAttrs(c) if (!SameAttrOf(SCREEN_ATTRS(SP), c)) { \ 1007 attr_t chg = AttrOf(SCREEN_ATTRS(SP)); \ 1008 VIDATTR(AttrOf(c), GetPair(c)); \ 1009 if (magic_cookie_glitch > 0 \ 1010 && XMC_CHANGES((chg ^ AttrOf(SCREEN_ATTRS(SP))))) { \ 1011 T(("%s @%d before glitch %d,%d", \ 1012 __FILE__, __LINE__, \ 1013 SP->_cursrow, \ 1014 SP->_curscol)); \ 1015 _nc_do_xmc_glitch(chg); \ 1016 } \ 1017 } 1018 #else 1019 #define UpdateAttrs(c) if (!SameAttrOf(SCREEN_ATTRS(SP), c)) \ 1020 VIDATTR(AttrOf(c), GetPair(c)); 1021 #endif 1022 1023 /* 1024 * Macros to make additional parameter to implement wgetch_events() 1025 */ 1026 #ifdef NCURSES_WGETCH_EVENTS 1027 #define EVENTLIST_0th(param) param 1028 #define EVENTLIST_1st(param) param 1029 #define EVENTLIST_2nd(param) , param 1030 #else 1031 #define EVENTLIST_0th(param) void 1032 #define EVENTLIST_1st(param) /* nothing */ 1033 #define EVENTLIST_2nd(param) /* nothing */ 1034 #endif 1035 1036 #if NCURSES_EXPANDED && NCURSES_EXT_FUNCS 1037 1038 #undef toggle_attr_on 1039 #define toggle_attr_on(S,at) _nc_toggle_attr_on(&(S), at) 1040 extern NCURSES_EXPORT(void) _nc_toggle_attr_on (attr_t *, attr_t); 1041 1042 #undef toggle_attr_off 1043 #define toggle_attr_off(S,at) _nc_toggle_attr_off(&(S), at) 1044 extern NCURSES_EXPORT(void) _nc_toggle_attr_off (attr_t *, attr_t); 1045 1046 #undef DelCharCost 1047 #define DelCharCost(count) _nc_DelCharCost(count) 1048 extern NCURSES_EXPORT(int) _nc_DelCharCost (int); 1049 1050 #undef InsCharCost 1051 #define InsCharCost(count) _nc_InsCharCost(count) 1052 extern NCURSES_EXPORT(int) _nc_InsCharCost (int); 1053 1054 #undef UpdateAttrs 1055 #define UpdateAttrs(c) _nc_UpdateAttrs(c) 1056 extern NCURSES_EXPORT(void) _nc_UpdateAttrs (NCURSES_CH_T); 1057 1058 #else 1059 1060 extern NCURSES_EXPORT(void) _nc_expanded (void); 1061 1062 #endif 1063 1064 #if !HAVE_GETCWD 1065 #define getcwd(buf,len) getwd(buf) 1066 #endif 1067 1068 /* charable.c */ 1069 #if USE_WIDEC_SUPPORT 1070 extern NCURSES_EXPORT(bool) _nc_is_charable(wchar_t); 1071 extern NCURSES_EXPORT(int) _nc_to_char(wint_t); 1072 extern NCURSES_EXPORT(wint_t) _nc_to_widechar(int); 1073 #endif 1074 1075 /* doupdate.c */ 1076 #if USE_XMC_SUPPORT 1077 extern NCURSES_EXPORT(void) _nc_do_xmc_glitch (attr_t); 1078 #endif 1079 1080 /* hardscroll.c */ 1081 #if defined(TRACE) || defined(SCROLLDEBUG) || defined(HASHDEBUG) 1082 extern NCURSES_EXPORT(void) _nc_linedump (void); 1083 #endif 1084 1085 /* lib_acs.c */ 1086 extern NCURSES_EXPORT(void) _nc_init_acs (void); /* corresponds to traditional 'init_acs()' */ 1087 extern NCURSES_EXPORT(int) _nc_msec_cost (const char *const, int); /* used by 'tack' program */ 1088 1089 /* lib_addch.c */ 1090 #if USE_WIDEC_SUPPORT 1091 NCURSES_EXPORT(int) _nc_build_wch(WINDOW *win, ARG_CH_T ch); 1092 #endif 1093 1094 /* lib_addstr.c */ 1095 #if USE_WIDEC_SUPPORT && !defined(USE_TERMLIB) 1096 extern NCURSES_EXPORT(int) _nc_wchstrlen(const cchar_t *); 1097 #endif 1098 1099 /* lib_color.c */ 1100 extern NCURSES_EXPORT(bool) _nc_reset_colors(void); 1101 1102 /* lib_getch.c */ 1103 extern NCURSES_EXPORT(int) _nc_wgetch(WINDOW *, unsigned long *, int EVENTLIST_2nd(_nc_eventlist *)); 1104 1105 /* lib_insch.c */ 1106 extern NCURSES_EXPORT(int) _nc_insert_ch(WINDOW *, chtype); 1107 1108 /* lib_mvcur.c */ 1109 #define INFINITY 1000000 /* cost: too high to use */ 1110 1111 extern NCURSES_EXPORT(void) _nc_mvcur_init (void); 1112 extern NCURSES_EXPORT(void) _nc_mvcur_resume (void); 1113 extern NCURSES_EXPORT(void) _nc_mvcur_wrap (void); 1114 1115 extern NCURSES_EXPORT(int) _nc_scrolln (int, int, int, int); 1116 1117 extern NCURSES_EXPORT(void) _nc_screen_init (void); 1118 extern NCURSES_EXPORT(void) _nc_screen_resume (void); 1119 extern NCURSES_EXPORT(void) _nc_screen_wrap (void); 1120 1121 /* lib_mouse.c */ 1122 extern NCURSES_EXPORT(int) _nc_has_mouse (void); 1123 1124 /* lib_mvcur.c */ 1125 #define INFINITY 1000000 /* cost: too high to use */ 1126 #define BAUDBYTE 9 /* 9 = 7 bits + 1 parity + 1 stop */ 1127 1128 /* lib_setup.c */ 1129 extern NCURSES_EXPORT(char *) _nc_get_locale(void); 1130 extern NCURSES_EXPORT(int) _nc_unicode_locale(void); 1131 extern NCURSES_EXPORT(int) _nc_locale_breaks_acs(void); 1132 extern NCURSES_EXPORT(int) _nc_setupterm(NCURSES_CONST char *, int, int *, bool); 1133 1134 /* lib_tstp.c */ 1135 #if USE_SIGWINCH 1136 extern NCURSES_EXPORT(int) _nc_handle_sigwinch(int); 1137 #else 1138 #define _nc_handle_sigwinch(a) /* nothing */ 1139 #endif 1140 1141 /* lib_wacs.c */ 1142 #if USE_WIDEC_SUPPORT 1143 extern NCURSES_EXPORT(void) _nc_init_wacs(void); 1144 #endif 1145 1146 typedef struct { 1147 char *s_head; /* beginning of the string (may be null) */ 1148 char *s_tail; /* end of the string (may be null) */ 1149 size_t s_size; /* current remaining size available */ 1150 size_t s_init; /* total size available */ 1151 } string_desc; 1152 1153 /* strings.c */ 1154 extern NCURSES_EXPORT(string_desc *) _nc_str_init (string_desc *, char *, size_t); 1155 extern NCURSES_EXPORT(string_desc *) _nc_str_null (string_desc *, size_t); 1156 extern NCURSES_EXPORT(string_desc *) _nc_str_copy (string_desc *, string_desc *); 1157 extern NCURSES_EXPORT(bool) _nc_safe_strcat (string_desc *, const char *); 1158 extern NCURSES_EXPORT(bool) _nc_safe_strcpy (string_desc *, const char *); 1159 1160 #if !HAVE_STRSTR 1161 #define strstr _nc_strstr 1162 extern NCURSES_EXPORT(char *) _nc_strstr (const char *, const char *); 1163 #endif 1164 1165 /* safe_sprintf.c */ 1166 extern NCURSES_EXPORT(char *) _nc_printf_string (const char *, va_list); 1167 1168 /* tries.c */ 1169 extern NCURSES_EXPORT(void) _nc_add_to_try (struct tries **, const char *, unsigned); 1170 extern NCURSES_EXPORT(char *) _nc_expand_try (struct tries *, unsigned, int *, size_t); 1171 extern NCURSES_EXPORT(int) _nc_remove_key (struct tries **, unsigned); 1172 extern NCURSES_EXPORT(int) _nc_remove_string (struct tries **, const char *); 1173 1174 /* elsewhere ... */ 1175 //// extern NCURSES_EXPORT(ENTRY *) _nc_delink_entry(ENTRY *, TERMTYPE *); 1176 extern NCURSES_EXPORT(WINDOW *) _nc_makenew (int, int, int, int, int); 1177 extern NCURSES_EXPORT(char *) _nc_trace_buf (int, size_t); 1178 extern NCURSES_EXPORT(char *) _nc_trace_bufcat (int, const char *); 1179 extern NCURSES_EXPORT(int) _nc_access (const char *, int); 1180 extern NCURSES_EXPORT(int) _nc_baudrate (int); 1181 extern NCURSES_EXPORT(int) _nc_freewin (WINDOW *); 1182 extern NCURSES_EXPORT(int) _nc_getenv_num (const char *); 1183 extern NCURSES_EXPORT(int) _nc_keypad (bool); 1184 extern NCURSES_EXPORT(int) _nc_ospeed (int); 1185 extern NCURSES_EXPORT(int) _nc_outch (int); 1186 //// extern NCURSES_EXPORT(int) _nc_read_termcap_entry (const char *const, TERMTYPE *const); 1187 extern NCURSES_EXPORT(int) _nc_setupscreen (int, int, FILE *, bool, int); 1188 extern NCURSES_EXPORT(int) _nc_timed_wait(int, int, int * EVENTLIST_2nd(_nc_eventlist *)); 1189 extern NCURSES_EXPORT(void) _nc_do_color (short, short, bool, int (*)(int)); 1190 extern NCURSES_EXPORT(void) _nc_flush (void); 1191 //// extern NCURSES_EXPORT(void) _nc_free_entry(ENTRY *, TERMTYPE *); 1192 extern NCURSES_EXPORT(void) _nc_freeall (void); 1193 extern NCURSES_EXPORT(void) _nc_hash_map (void); 1194 extern NCURSES_EXPORT(void) _nc_init_keytry (void); 1195 extern NCURSES_EXPORT(void) _nc_keep_tic_dir (const char *); 1196 extern NCURSES_EXPORT(void) _nc_make_oldhash (int i); 1197 extern NCURSES_EXPORT(void) _nc_scroll_oldhash (int n, int top, int bot); 1198 extern NCURSES_EXPORT(void) _nc_scroll_optimize (void); 1199 extern NCURSES_EXPORT(void) _nc_set_buffer (FILE *, bool); 1200 extern NCURSES_EXPORT(void) _nc_signal_handler (bool); 1201 extern NCURSES_EXPORT(void) _nc_synchook (WINDOW *); 1202 extern NCURSES_EXPORT(void) _nc_trace_tries (struct tries *); 1203 1204 #if NO_LEAKS 1205 extern NCURSES_EXPORT(void) _nc_alloc_entry_leaks(void); 1206 extern NCURSES_EXPORT(void) _nc_captoinfo_leaks(void); 1207 extern NCURSES_EXPORT(void) _nc_comp_scan_leaks(void); 1208 extern NCURSES_EXPORT(void) _nc_keyname_leaks(void); 1209 extern NCURSES_EXPORT(void) _nc_tgetent_leaks(void); 1210 #endif 1211 1212 #ifndef USE_TERMLIB 1213 extern NCURSES_EXPORT(NCURSES_CH_T) _nc_render (WINDOW *, NCURSES_CH_T); 1214 extern NCURSES_EXPORT(int) _nc_waddch_nosync (WINDOW *, const NCURSES_CH_T); 1215 extern NCURSES_EXPORT(void) _nc_scroll_window (WINDOW *, int const, NCURSES_SIZE_T const, NCURSES_SIZE_T const, NCURSES_CH_T); 1216 #endif 1217 1218 #if USE_WIDEC_SUPPORT && !defined(USE_TERMLIB) 1219 #ifdef linux 1220 extern NCURSES_EXPORT(size_t) _nc_wcrtomb (char *, wchar_t, mbstate_t *); 1221 #else 1222 #define _nc_wcrtomb(s,wc,ps) wcrtomb(s,wc,ps) 1223 #endif 1224 #endif 1225 1226 #if USE_SIZECHANGE 1227 extern NCURSES_EXPORT(void) _nc_update_screensize (void); 1228 #endif 1229 1230 #if HAVE_RESIZETERM 1231 extern NCURSES_EXPORT(void) _nc_resize_margins (WINDOW *); 1232 #else 1233 #define _nc_resize_margins(wp) /* nothing */ 1234 #endif 1235 1236 #ifdef NCURSES_WGETCH_EVENTS 1237 extern NCURSES_EXPORT(int) _nc_eventlist_timeout(_nc_eventlist *); 1238 #else 1239 #define wgetch_events(win, evl) wgetch(win) 1240 #define wgetnstr_events(win, str, maxlen, evl) wgetnstr(win, str, maxlen) 1241 #endif 1242 1243 /* 1244 * Not everyone has vsscanf(), but we'd like to use it for scanw(). 1245 */ 1246 #if !HAVE_VSSCANF 1247 extern int vsscanf(const char *str, const char *format, va_list __arg); 1248 #endif 1249 1250 /* scroll indices */ 1251 extern NCURSES_EXPORT_VAR(int *) _nc_oldnums; 1252 1253 #define USE_SETBUF_0 0 1254 1255 #define NC_BUFFERED(flag) _nc_set_buffer(SP->_ofp, flag) 1256 1257 #define NC_OUTPUT ((SP != 0) ? SP->_ofp : stdout) 1258 1259 /* 1260 * On systems with a broken linker, define 'SP' as a function to force the 1261 * linker to pull in the data-only module with 'SP'. 1262 */ 1263 #if BROKEN_LINKER 1264 #define SP _nc_screen() 1265 extern NCURSES_EXPORT(SCREEN *) _nc_screen (void); 1266 extern NCURSES_EXPORT(int) _nc_alloc_screen (void); 1267 extern NCURSES_EXPORT(void) _nc_set_screen (SCREEN *); 1268 #else 1269 /* current screen is private data; avoid possible linking conflicts too */ 1270 extern NCURSES_EXPORT_VAR(SCREEN *) SP; 1271 #define _nc_alloc_screen() ((SP = typeCalloc(SCREEN, 1)) != 0) 1272 #define _nc_set_screen(sp) SP = sp 1273 #endif 1274 1275 /* 1276 * We don't want to use the lines or columns capabilities internally, because 1277 * if the application is running multiple screens under X, it's quite possible 1278 * they could all have type xterm but have different sizes! So... 1279 */ 1280 #define screen_lines SP->_lines 1281 #define screen_columns SP->_columns 1282 1283 extern NCURSES_EXPORT_VAR(int) _nc_slk_format; /* != 0 if slk_init() called */ 1284 extern NCURSES_EXPORT(int) _nc_slk_initialize (WINDOW *, int); 1285 1286 /* 1287 * Some constants related to SLK's 1288 */ 1289 #define MAX_SKEY_OLD 8 /* count of soft keys */ 1290 #define MAX_SKEY_LEN_OLD 8 /* max length of soft key text */ 1291 #define MAX_SKEY_PC 12 /* This is what most PC's have */ 1292 #define MAX_SKEY_LEN_PC 5 1293 1294 /* Macro to check whether or not we use a standard format */ 1295 #define SLK_STDFMT(fmt) (fmt < 3) 1296 /* Macro to determine height of label window */ 1297 #define SLK_LINES(fmt) (SLK_STDFMT(fmt) ? 1 : ((fmt) - 2)) 1298 1299 #define MAX_SKEY(fmt) (SLK_STDFMT(fmt)? MAX_SKEY_OLD : MAX_SKEY_PC) 1300 #define MAX_SKEY_LEN(fmt) (SLK_STDFMT(fmt)? MAX_SKEY_LEN_OLD : MAX_SKEY_LEN_PC) 1301 1302 extern NCURSES_EXPORT(int) _nc_ripoffline (int line, int (*init)(WINDOW *,int)); 1303 1304 /* 1305 * Common error messages 1306 */ 1307 #define MSG_NO_MEMORY "Out of memory" 1308 #define MSG_NO_INPUTS "Premature EOF" 1309 1310 #ifdef __cplusplus 1311 } 1312 #endif 1313 1314 #endif /* CURSES_PRIV_H */ 1315