X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftinfo%2Flib_setup.c;h=c2a481d7d91150b51e953edb86ac20e7e4eb04e0;hp=20c14e0fcf7febbc7add1935183548444b031af7;hb=41068edef084c39be0cecdf949d9b538d925f42c;hpb=3ce60e9f58cc00309981ed711d0b0d3362105881 diff --git a/ncurses/tinfo/lib_setup.c b/ncurses/tinfo/lib_setup.c index 20c14e0f..c2a481d7 100644 --- a/ncurses/tinfo/lib_setup.c +++ b/ncurses/tinfo/lib_setup.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2007,2008 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 * @@ -30,6 +30,7 @@ * Author: Zeyd M. Ben-Halim 1992,1995 * * and: Eric S. Raymond * * and: Thomas E. Dickey 1996-on * + * and: Juergen Pfeifer 2009 * ****************************************************************************/ /* @@ -41,7 +42,6 @@ #include #include /* for MAX_NAME_SIZE */ -#include #if SVR4_TERMIO && !defined(_POSIX_SOURCE) #define _POSIX_SOURCE @@ -51,9 +51,7 @@ #include #endif -#include /* lines, columns, cur_term */ - -MODULE_ID("$Id: lib_setup.c,v 1.109 2008/06/28 15:31:42 tom Exp $") +MODULE_ID("$Id: lib_setup.c,v 1.127 2010/01/23 17:57:43 tom Exp $") /**************************************************************************** * @@ -109,61 +107,96 @@ MODULE_ID("$Id: lib_setup.c,v 1.109 2008/06/28 15:31:42 tom Exp $") * Wrap global variables in this module. */ #if USE_REENTRANT + NCURSES_EXPORT(char *) NCURSES_PUBLIC_VAR(ttytype) (void) { static char empty[] = ""; - return cur_term ? cur_term->type.term_names : empty; + char *result = empty; + +#if NCURSES_SP_FUNCS + if (CURRENT_SCREEN) { + TERMINAL *termp = TerminalOf(CURRENT_SCREEN); + if (termp != 0) { + result = termp->type.term_names; + } + } +#else + if (cur_term != 0) { + result = cur_term->type.term_names; + } +#endif + return result; } + NCURSES_EXPORT(int *) -_nc_ptr_Lines(void) +_nc_ptr_Lines(SCREEN *sp) { - return ptrLines(); + return ptrLines(sp); } + NCURSES_EXPORT(int) NCURSES_PUBLIC_VAR(LINES) (void) { - return *_nc_ptr_Lines(); + return *_nc_ptr_Lines(CURRENT_SCREEN); } + NCURSES_EXPORT(int *) -_nc_ptr_Cols(void) +_nc_ptr_Cols(SCREEN *sp) { - return ptrCols(); + return ptrCols(sp); } + NCURSES_EXPORT(int) NCURSES_PUBLIC_VAR(COLS) (void) { - return *_nc_ptr_Cols(); + return *_nc_ptr_Cols(CURRENT_SCREEN); } + +NCURSES_EXPORT(int *) +_nc_ptr_Tabsize(SCREEN *sp) +{ + return ptrTabsize(sp); +} + NCURSES_EXPORT(int) NCURSES_PUBLIC_VAR(TABSIZE) (void) { - return SP ? SP->_TABSIZE : 8; + return *_nc_ptr_Tabsize(CURRENT_SCREEN); } #else NCURSES_EXPORT_VAR(char) ttytype[NAMESIZE] = ""; NCURSES_EXPORT_VAR(int) LINES = 0; NCURSES_EXPORT_VAR(int) COLS = 0; -NCURSES_EXPORT_VAR(int) TABSIZE = 0; +NCURSES_EXPORT_VAR(int) TABSIZE = 8; #endif #if NCURSES_EXT_FUNCS NCURSES_EXPORT(int) -set_tabsize(int value) +NCURSES_SP_NAME(set_tabsize) (NCURSES_SP_DCLx int value) { int code = OK; #if USE_REENTRANT - if (SP) { - SP->_TABSIZE = value; + if (SP_PARM) { + SP_PARM->_TABSIZE = value; } else { code = ERR; } #else + (void) SP_PARM; TABSIZE = value; #endif return code; } + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +set_tabsize(int value) +{ + return NCURSES_SP_NAME(set_tabsize) (CURRENT_SCREEN, value); +} #endif +#endif /* NCURSES_EXT_FUNCS */ #if USE_SIGWINCH /* @@ -187,18 +220,58 @@ _nc_handle_sigwinch(SCREEN *sp) #endif +NCURSES_EXPORT(void) +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 + if (IsPreScreen(SP_PARM)) { + SP_PARM->_use_env = f; + } +#else + _nc_prescreen.use_env = f; +#endif + returnVoid; +} + +#if NCURSES_SP_FUNCS NCURSES_EXPORT(void) use_env(bool f) { - T((T_CALLED("use_env()"))); + T((T_CALLED("use_env(%d)"), (int) f)); _nc_prescreen.use_env = f; returnVoid; } +#endif NCURSES_EXPORT(void) -_nc_get_screensize(SCREEN *sp, int *linep, int *colp) +_nc_get_screensize(SCREEN *sp, +#ifdef USE_TERM_DRIVER + TERMINAL * termp, +#endif + int *linep, int *colp) /* Obtain lines/columns values from the environment and/or terminfo entry */ { +#ifdef USE_TERM_DRIVER + TERMINAL_CONTROL_BLOCK *TCB; + int my_tabsize; + + assert(termp != 0 && linep != 0 && colp != 0); + TCB = (TERMINAL_CONTROL_BLOCK *) termp; + + my_tabsize = TCB->info.tabsize; + TCB->drv->size(TCB, linep, colp); + +#if USE_REENTRANT + if (sp != 0) { + sp->_TABSIZE = my_tabsize; + } +#else + (void) sp; + TABSIZE = my_tabsize; +#endif + T(("TABSIZE = %d", my_tabsize)); +#else /* !USE_TERM_DRIVER */ TERMINAL *termp = cur_term; int my_tabsize; @@ -298,19 +371,31 @@ _nc_get_screensize(SCREEN *sp, int *linep, int *colp) TABSIZE = my_tabsize; #endif T(("TABSIZE = %d", TABSIZE)); +#endif /* USE_TERM_DRIVER */ } #if USE_SIZECHANGE NCURSES_EXPORT(void) _nc_update_screensize(SCREEN *sp) { + int new_lines; + int new_cols; + +#ifdef USE_TERM_DRIVER + int old_lines; + int old_cols; + + assert(sp != 0); + + CallDriver_2(sp, getsize, &old_lines, &old_cols); + +#else TERMINAL *termp = cur_term; int old_lines = lines; - int new_lines; int old_cols = columns; - int new_cols; +#endif - _nc_get_screensize(sp, &new_lines, &new_cols); + TINFO_GET_SIZE(sp, sp->_term, &new_lines, &new_cols); /* * See is_term_resized() and resizeterm(). @@ -320,7 +405,7 @@ _nc_update_screensize(SCREEN *sp) if (sp != 0 && sp->_resize != 0) { if ((new_lines != old_lines) || (new_cols != old_cols)) - sp->_resize(new_lines, new_cols); + sp->_resize(NCURSES_SP_ARGx new_lines, new_cols); sp->_sig_winch = FALSE; } } @@ -348,6 +433,7 @@ _nc_update_screensize(SCREEN *sp) exit(EXIT_FAILURE);\ } +#ifndef USE_TERM_DRIVER #if USE_DATABASE || USE_TERMCAP /* * Return 1 if entry found, 0 if not found, -1 if database not accessible, @@ -379,29 +465,31 @@ grab_entry(const char *const tn, TERMTYPE *const tp) return (status); } #endif +#endif /* !USE_TERM_DRIVER */ /* -** do_prototype() -** ** Take the real command character out of the CC environment variable ** and substitute it in for the prototype given in 'command_character'. */ -static void -do_prototype(TERMINAL * termp) +void +_nc_tinfo_cmdch(TERMINAL * termp, char proto) { - int i; + unsigned i; char CC; - char proto; char *tmp; - tmp = getenv("CC"); - CC = *tmp; - proto = *command_character; - - for_each_string(i, &(termp->type)) { - for (tmp = termp->type.Strings[i]; *tmp; tmp++) { - if (*tmp == proto) - *tmp = CC; + /* + * Only use the character if the string is a single character, + * since it is fairly common for developers to set the C compiler + * name as an environment variable - using the same symbol. + */ + 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) + *tmp = CC; + } } } } @@ -484,18 +572,37 @@ _nc_locale_breaks_acs(TERMINAL * termp) return 0; } -/* - * This entrypoint is called from tgetent() to allow a special case of reusing - * the same TERMINAL data (see comment). - */ NCURSES_EXPORT(int) -_nc_setupterm(NCURSES_CONST char *tname, int Filedes, int *errret, bool reuse) +TINFO_SETUP_TERM(TERMINAL ** tp, + NCURSES_CONST char *tname, + int Filedes, + int *errret, + bool reuse) { - TERMINAL *termp; +#ifdef USE_TERM_DRIVER + TERMINAL_CONTROL_BLOCK *TCB = 0; +#else int status; +#endif + TERMINAL *termp; + SCREEN *sp = 0; + int code = ERR; START_TRACE(); - T((T_CALLED("setupterm(%s,%d,%p)"), _nc_visbuf(tname), Filedes, errret)); + +#ifdef USE_TERM_DRIVER + T((T_CALLED("_nc_setupterm_ex(%p,%s,%d,%p)"), + tp, _nc_visbuf(tname), Filedes, errret)); + + if (tp == 0) { + ret_error0(TGETENT_ERR, + "Invalid parameter, internal error.\n"); + } else + termp = *tp; +#else + termp = cur_term; + T((T_CALLED("setupterm(%s,%d,%p)"), _nc_visbuf(tname), Filedes, (void *) errret)); +#endif if (tname == 0) { tname = getenv("TERM"); @@ -536,20 +643,34 @@ _nc_setupterm(NCURSES_CONST char *tname, int Filedes, int *errret, bool reuse) * properly with this feature). */ if (reuse - && (termp = cur_term) != 0 + && (termp != 0) && termp->Filedes == Filedes && termp->_termname != 0 && !strcmp(termp->_termname, tname) && _nc_name_match(termp->type.term_names, tname, "|")) { T(("reusing existing terminal information and mode-settings")); + code = OK; } else { - +#ifdef USE_TERM_DRIVER + termp = (TERMINAL *) typeCalloc(TERMINAL_CONTROL_BLOCK, 1); +#else termp = typeCalloc(TERMINAL, 1); - +#endif if (termp == 0) { ret_error0(TGETENT_ERR, "Not enough memory to create terminal structure.\n"); } +#ifdef USE_TERM_DRIVER + TCB = (TERMINAL_CONTROL_BLOCK *) termp; + code = _nc_globals.term_driver(TCB, tname, errret); + if (code == OK) { + termp->Filedes = Filedes; + termp->_termname = strdup(tname); + } else { + ret_error0(TGETENT_ERR, + "Could not find any driver to handle this terminal.\n"); + } +#else #if USE_DATABASE || USE_TERMCAP status = grab_entry(tname, &termp->type); #else @@ -584,8 +705,8 @@ _nc_setupterm(NCURSES_CONST char *tname, int Filedes, int *errret, bool reuse) set_curterm(termp); - if (command_character && getenv("CC")) - do_prototype(termp); + if (command_character) + _nc_tinfo_cmdch(termp, *command_character); /* * If an application calls setupterm() rather than initscr() or @@ -597,24 +718,94 @@ _nc_setupterm(NCURSES_CONST char *tname, int Filedes, int *errret, bool reuse) def_prog_mode(); baudrate(); } + code = OK; +#endif } +#ifdef USE_TERM_DRIVER + *tp = termp; + NCURSES_SP_NAME(set_curterm) (sp, termp); + TCB->drv->init(TCB); +#else + sp = SP; +#endif + /* * We should always check the screensize, just in case. */ - _nc_get_screensize(SP, ptrLines(), ptrCols()); + TINFO_GET_SIZE(sp, termp, ptrLines(sp), ptrCols(sp)); if (errret) *errret = TGETENT_YES; +#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); } - returnCode(OK); +#endif + returnCode(code); +} + +#if NCURSES_SP_FUNCS +/* + * In case of handling multiple screens, we need to have a screen before + * initialization in setupscreen takes place. This is to extend the substitute + * for some of the stuff in _nc_prescreen, especially for slk and ripoff + * handling which should be done per screen. + */ +NCURSES_EXPORT(SCREEN *) +new_prescr(void) +{ + static SCREEN *sp; + + START_TRACE(); + T((T_CALLED("new_prescr()"))); + + if (sp == 0) { + sp = _nc_alloc_screen_sp(); + if (sp != 0) { + sp->rsp = sp->rippedoff; + sp->_filtered = _nc_prescreen.filter_mode; + sp->_use_env = _nc_prescreen.use_env; +#if NCURSES_NO_PADDING + sp->_no_padding = _nc_prescreen._no_padding; +#endif + sp->slk_format = 0; + sp->_slk = 0; + sp->_prescreen = TRUE; + SP_PRE_INIT(sp); +#if USE_REENTRANT + sp->_TABSIZE = _nc_prescreen._TABSIZE; + sp->_ESCDELAY = _nc_prescreen._ESCDELAY; +#endif + } + } + returnSP(sp); } +#endif + +#ifdef USE_TERM_DRIVER +/* + * This entrypoint is called from tgetent() to allow a special case of reusing + * the same TERMINAL data (see comment). + */ +NCURSES_EXPORT(int) +_nc_setupterm(NCURSES_CONST char *tname, + int Filedes, + int *errret, + bool reuse) +{ + int res; + TERMINAL *termp; + res = TINFO_SETUP_TERM(&termp, tname, Filedes, errret, reuse); + if (ERR != res) + NCURSES_SP_NAME(set_curterm) (CURRENT_SCREEN_PRE, termp); + return res; +} +#endif /* * setupterm(termname, Filedes, errret)