X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftinfo%2Flib_setup.c;h=0b81a5e06de3860b7228524c46a0d20c6928fa33;hp=5fcf2ae3fc32f48c3229455978471fd6043b1249;hb=b8cca229aaa89adcc41dbd7c7710515e983e60f2;hpb=8639fbcc9f182c74c2974dec2da5eed5cb703700 diff --git a/ncurses/tinfo/lib_setup.c b/ncurses/tinfo/lib_setup.c index 5fcf2ae3..0b81a5e0 100644 --- a/ncurses/tinfo/lib_setup.c +++ b/ncurses/tinfo/lib_setup.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. * + * Copyright (c) 1998-2013,2014 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 * @@ -37,21 +37,18 @@ * Terminal setup routines common to termcap and terminfo: * * use_env(bool) + * use_tioctl(bool) * setupterm(char *, int, int *) */ #include #include /* for MAX_NAME_SIZE */ -#if SVR4_TERMIO && !defined(_POSIX_SOURCE) -#define _POSIX_SOURCE -#endif - #if HAVE_LOCALE_H #include #endif -MODULE_ID("$Id: lib_setup.c,v 1.135 2011/02/06 01:04:21 tom Exp $") +MODULE_ID("$Id: lib_setup.c,v 1.161 2014/11/01 12:33:16 tom Exp $") /**************************************************************************** * @@ -225,6 +222,7 @@ NCURSES_SP_NAME(use_env) (NCURSES_SP_DCLx bool f) { T((T_CALLED("use_env(%p,%d)"), (void *) SP_PARM, (int) f)); #if NCURSES_SP_FUNCS + START_TRACE(); if (IsPreScreen(SP_PARM)) { SP_PARM->_use_env = f; } @@ -234,14 +232,39 @@ NCURSES_SP_NAME(use_env) (NCURSES_SP_DCLx bool f) returnVoid; } +NCURSES_EXPORT(void) +NCURSES_SP_NAME(use_tioctl) (NCURSES_SP_DCLx bool f) +{ + T((T_CALLED("use_tioctl(%p,%d)"), (void *) SP_PARM, (int) f)); +#if NCURSES_SP_FUNCS + START_TRACE(); + if (IsPreScreen(SP_PARM)) { + SP_PARM->_use_tioctl = f; + } +#else + _nc_prescreen.use_tioctl = f; +#endif + returnVoid; +} + #if NCURSES_SP_FUNCS NCURSES_EXPORT(void) use_env(bool f) { T((T_CALLED("use_env(%d)"), (int) f)); + START_TRACE(); _nc_prescreen.use_env = f; returnVoid; } + +NCURSES_EXPORT(void) +use_tioctl(bool f) +{ + T((T_CALLED("use_tioctl(%d)"), (int) f)); + START_TRACE(); + _nc_prescreen.use_tioctl = f; + returnVoid; +} #endif NCURSES_EXPORT(void) @@ -260,7 +283,7 @@ _nc_get_screensize(SCREEN *sp, TCB = (TERMINAL_CONTROL_BLOCK *) termp; my_tabsize = TCB->info.tabsize; - TCB->drv->size(TCB, linep, colp); + TCB->drv->td_size(TCB, linep, colp); #if USE_REENTRANT if (sp != 0) { @@ -281,7 +304,7 @@ _nc_get_screensize(SCREEN *sp, *linep = (int) lines; *colp = (int) columns; - if (_nc_prescreen.use_env) { + if (_nc_prescreen.use_env || _nc_prescreen.use_tioctl) { int value; #ifdef __EMX__ @@ -289,14 +312,16 @@ _nc_get_screensize(SCREEN *sp, int screendata[2]; _scrsize(screendata); *colp = screendata[0]; - *linep = screendata[1]; + *linep = ((sp != 0 && sp->_filtered) + ? 1 + : screendata[1]); T(("EMX screen size: environment LINES = %d COLUMNS = %d", *linep, *colp)); } #endif #if HAVE_SIZECHANGE /* try asking the OS */ - if (isatty(cur_term->Filedes)) { + if (NC_ISATTY(cur_term->Filedes)) { STRUCT_WINSIZE size; errno = 0; @@ -315,19 +340,33 @@ _nc_get_screensize(SCREEN *sp, } #endif /* HAVE_SIZECHANGE */ - /* - * Finally, look for environment variables. - * - * Solaris lets users override either dimension with an environment - * variable. - */ - if ((value = _nc_getenv_num("LINES")) > 0) { - *linep = value; - T(("screen size: environment LINES = %d", *linep)); - } - if ((value = _nc_getenv_num("COLUMNS")) > 0) { - *colp = value; - T(("screen size: environment COLUMNS = %d", *colp)); + if (_nc_prescreen.use_env) { + if (_nc_prescreen.use_tioctl) { + /* + * If environment variables are used, update them. + */ + if ((sp == 0 || !sp->_filtered) && _nc_getenv_num("LINES") > 0) { + _nc_setenv_num("LINES", *linep); + } + if (_nc_getenv_num("COLUMNS") > 0) { + _nc_setenv_num("COLUMNS", *colp); + } + } + + /* + * Finally, look for environment variables. + * + * Solaris lets users override either dimension with an environment + * variable. + */ + if ((value = _nc_getenv_num("LINES")) > 0) { + *linep = value; + T(("screen size: environment LINES = %d", *linep)); + } + if ((value = _nc_getenv_num("COLUMNS")) > 0) { + *colp = value; + T(("screen size: environment COLUMNS = %d", *colp)); + } } /* if we can't get dynamic info about the size, use static */ @@ -384,7 +423,7 @@ _nc_update_screensize(SCREEN *sp) assert(sp != 0); - CallDriver_2(sp, getsize, &old_lines, &old_cols); + CallDriver_2(sp, td_getsize, &old_lines, &old_cols); #else TERMINAL *termp = cur_term; @@ -399,10 +438,12 @@ _nc_update_screensize(SCREEN *sp) * We're doing it this way because those functions belong to the upper * ncurses library, while this resides in the lower terminfo library. */ - if (sp != 0 - && sp->_resize != 0) { - if ((new_lines != old_lines) || (new_cols != old_cols)) + if (sp != 0 && sp->_resize != 0) { + if ((new_lines != old_lines) || (new_cols != old_cols)) { sp->_resize(NCURSES_SP_ARGx new_lines, new_cols); + } else if (sp->_sig_winch && (sp->_ungetch != 0)) { + sp->_ungetch(SP_PARM, KEY_RESIZE); /* so application can know this */ + } sp->_sig_winch = FALSE; } } @@ -414,23 +455,7 @@ _nc_update_screensize(SCREEN *sp) * ****************************************************************************/ -#define ret_error(code, fmt, arg) if (errret) {\ - *errret = code;\ - returnCode(ERR);\ - } else {\ - fprintf(stderr, fmt, arg);\ - exit(EXIT_FAILURE);\ - } - -#define ret_error0(code, msg) if (errret) {\ - *errret = code;\ - returnCode(ERR);\ - } else {\ - fprintf(stderr, msg);\ - exit(EXIT_FAILURE);\ - } - -#if USE_DATABASE || USE_TERMCAP +#if NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP /* * Return 1 if entry found, 0 if not found, -1 if database not accessible, * just like tgetent(). @@ -467,7 +492,7 @@ _nc_setup_tinfo(const char *const tn, TERMTYPE *const tp) ** and substitute it in for the prototype given in 'command_character'. */ void -_nc_tinfo_cmdch(TERMINAL * termp, char proto) +_nc_tinfo_cmdch(TERMINAL * termp, int proto) { unsigned i; char CC; @@ -481,8 +506,8 @@ _nc_tinfo_cmdch(TERMINAL * termp, char proto) if ((tmp = getenv("CC")) != 0 && strlen(tmp) == 1) { CC = *tmp; for_each_string(i, &(termp->type)) { - for (tmp = termp->type.Strings[i]; *tmp; tmp++) { - if (*tmp == proto) + for (tmp = termp->type.Strings[i]; tmp && *tmp; tmp++) { + if (UChar(*tmp) == proto) *tmp = CC; } } @@ -520,7 +545,9 @@ NCURSES_EXPORT(int) _nc_unicode_locale(void) { int result = 0; -#if HAVE_LANGINFO_CODESET +#if defined(__MINGW32__) && USE_WIDEC_SUPPORT + result = 1; +#elif HAVE_LANGINFO_CODESET char *env = nl_langinfo(CODESET); result = !strcmp(env, "UTF-8"); T(("_nc_unicode_locale(%s) ->%d", env, result)); @@ -547,11 +574,11 @@ NCURSES_EXPORT(int) _nc_locale_breaks_acs(TERMINAL * termp) { const char *env_name = "NCURSES_NO_UTF8_ACS"; - char *env; + const char *env; int value; int result = 0; - if ((env = getenv(env_name)) != 0) { + if (getenv(env_name) != 0) { result = _nc_getenv_num(env_name); } else if ((value = tigetnum("U8")) >= 0) { result = value; /* use extension feature */ @@ -578,7 +605,7 @@ TINFO_SETUP_TERM(TERMINAL ** tp, NCURSES_CONST char *tname, int Filedes, int *errret, - bool reuse) + int reuse) { #ifdef USE_TERM_DRIVER TERMINAL_CONTROL_BLOCK *TCB = 0; @@ -608,7 +635,11 @@ TINFO_SETUP_TERM(TERMINAL ** tp, if (tname == 0) { tname = getenv("TERM"); if (tname == 0 || *tname == '\0') { +#ifdef USE_TERM_DRIVER + tname = "unknown"; +#else ret_error0(TGETENT_ERR, "TERM environment variable not set.\n"); +#endif } } @@ -624,7 +655,7 @@ TINFO_SETUP_TERM(TERMINAL ** tp, * Allow output redirection. This is what SVr3 does. If stdout is * directed to a file, screen updates go to standard error. */ - if (Filedes == STDOUT_FILENO && !isatty(Filedes)) + if (Filedes == STDOUT_FILENO && !NC_ISATTY(Filedes)) Filedes = STDERR_FILENO; /* @@ -651,9 +682,14 @@ TINFO_SETUP_TERM(TERMINAL ** tp, && _nc_name_match(termp->type.term_names, tname, "|")) { T(("reusing existing terminal information and mode-settings")); code = OK; +#ifdef USE_TERM_DRIVER + TCB = (TERMINAL_CONTROL_BLOCK *) termp; +#endif } else { #ifdef USE_TERM_DRIVER - termp = (TERMINAL *) typeCalloc(TERMINAL_CONTROL_BLOCK, 1); + TERMINAL_CONTROL_BLOCK *my_tcb; + my_tcb = typeCalloc(TERMINAL_CONTROL_BLOCK, 1); + termp = &(my_tcb->term); #else termp = typeCalloc(TERMINAL, 1); #endif @@ -673,7 +709,7 @@ TINFO_SETUP_TERM(TERMINAL ** tp, "Could not find any driver to handle this terminal.\n"); } #else -#if USE_DATABASE || USE_TERMCAP +#if NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP status = _nc_setup_tinfo(tname, &termp->type); #else status = TGETENT_NO; @@ -684,7 +720,7 @@ TINFO_SETUP_TERM(TERMINAL ** tp, const TERMTYPE *fallback = _nc_fallback(tname); if (fallback) { - termp->type = *fallback; + _nc_copy_termtype(&(termp->type), fallback); status = TGETENT_YES; } } @@ -694,11 +730,11 @@ TINFO_SETUP_TERM(TERMINAL ** tp, if (status == TGETENT_ERR) { ret_error0(status, "terminals database is inaccessible\n"); } else if (status == TGETENT_NO) { - ret_error(status, "'%s': unknown terminal type.\n", tname); + ret_error1(status, "unknown terminal type.\n", tname); } } #if !USE_REENTRANT - strncpy(ttytype, termp->type.term_names, NAMESIZE - 1); + strncpy(ttytype, termp->type.term_names, (size_t) (NAMESIZE - 1)); ttytype[NAMESIZE - 1] = '\0'; #endif @@ -708,7 +744,7 @@ TINFO_SETUP_TERM(TERMINAL ** tp, set_curterm(termp); if (command_character) - _nc_tinfo_cmdch(termp, *command_character); + _nc_tinfo_cmdch(termp, UChar(*command_character)); /* * If an application calls setupterm() rather than initscr() or @@ -716,7 +752,7 @@ TINFO_SETUP_TERM(TERMINAL ** tp, * _nc_setupscreen(). Do it now anyway, so we can initialize the * baudrate. */ - if (isatty(Filedes)) { + if (NC_ISATTY(Filedes)) { def_prog_mode(); baudrate(); } @@ -727,7 +763,7 @@ TINFO_SETUP_TERM(TERMINAL ** tp, #ifdef USE_TERM_DRIVER *tp = termp; NCURSES_SP_NAME(set_curterm) (sp, termp); - TCB->drv->init(TCB); + TCB->drv->td_init(TCB); #else sp = SP; #endif @@ -742,10 +778,20 @@ TINFO_SETUP_TERM(TERMINAL ** tp, #ifndef USE_TERM_DRIVER if (generic_type) { - ret_error(TGETENT_NO, "'%s': I need something more specific.\n", tname); - } - if (hard_copy) { - ret_error(TGETENT_YES, "'%s': I can't handle hardcopy terminals.\n", tname); + /* + * BSD 4.3's termcap contains mis-typed "gn" for wy99. Do a sanity + * check before giving up. + */ + if ((VALID_STRING(cursor_address) + || (VALID_STRING(cursor_down) && VALID_STRING(cursor_home))) + && VALID_STRING(clear_screen)) { + ret_error1(TGETENT_YES, "terminal is not really generic.\n", tname); + } else { + del_curterm(termp); + ret_error1(TGETENT_NO, "I need something more specific.\n", tname); + } + } else if (hard_copy) { + ret_error1(TGETENT_YES, "I can't handle hardcopy terminals.\n", tname); } #endif returnCode(code); @@ -798,10 +844,10 @@ NCURSES_EXPORT(int) _nc_setupterm(NCURSES_CONST char *tname, int Filedes, int *errret, - bool reuse) + int reuse) { int res; - TERMINAL *termp; + TERMINAL *termp = 0; res = TINFO_SETUP_TERM(&termp, tname, Filedes, errret, reuse); if (ERR != res) NCURSES_SP_NAME(set_curterm) (CURRENT_SCREEN_PRE, termp);