X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftinfo%2Flib_setup.c;h=83742d5b78baf38c3ea3e58b01e71bc45150df4f;hp=de4cb459728ab908f9393cdf6125b9dc30c94a1e;hb=98d8891f42d8acac5c2ade39d163f386057a22e4;hpb=03f728e5bb3630a54fffc4a2ff2f8dbfcce9088e diff --git a/ncurses/tinfo/lib_setup.c b/ncurses/tinfo/lib_setup.c index de4cb459..83742d5b 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-2011,2012 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,6 +37,7 @@ * Terminal setup routines common to termcap and terminfo: * * use_env(bool) + * use_tioctl(bool) * setupterm(char *, int, int *) */ @@ -47,7 +48,7 @@ #include #endif -MODULE_ID("$Id: lib_setup.c,v 1.142 2011/10/22 16:13:06 tom Exp $") +MODULE_ID("$Id: lib_setup.c,v 1.151 2012/11/18 00:24:56 tom Exp $") /**************************************************************************** * @@ -231,6 +232,21 @@ 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) @@ -240,6 +256,15 @@ use_env(bool f) _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) @@ -279,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__ @@ -287,7 +312,9 @@ _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)); } @@ -313,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 */ @@ -399,8 +440,11 @@ _nc_update_screensize(SCREEN *sp) */ if (sp != 0 && sp->_resize != 0) { - if ((new_lines != old_lines) || (new_cols != old_cols)) + 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; } } @@ -502,7 +546,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)); @@ -590,7 +636,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 } } @@ -666,7 +716,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; } } @@ -731,11 +781,14 @@ TINFO_SETUP_TERM(TERMINAL ** tp, if ((VALID_STRING(cursor_address) || (VALID_STRING(cursor_down) && VALID_STRING(cursor_home))) && VALID_STRING(clear_screen)) { + free(termp); ret_error1(TGETENT_YES, "terminal is not really generic.\n", tname); } else { + free(termp); ret_error1(TGETENT_NO, "I need something more specific.\n", tname); } } else if (hard_copy) { + free(termp); ret_error1(TGETENT_YES, "I can't handle hardcopy terminals.\n", tname); } #endif