X-Git-Url: http://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=ncurses%2Ftinfo%2Flib_setup.c;h=3508242088309427f5f9677bbc66d52782ba7634;hb=027ae42953e3186daed8f3882da73de48291b606;hp=4b0ec46ea6eaabe36414a7d87a8ed60dc2cd5dbf;hpb=55ccd2b959766810cf7db8d1c4462f338ce0afc8;p=ncurses.git diff --git a/ncurses/tinfo/lib_setup.c b/ncurses/tinfo/lib_setup.c index 4b0ec46e..35082420 100644 --- a/ncurses/tinfo/lib_setup.c +++ b/ncurses/tinfo/lib_setup.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2004,2005 Free Software Foundation, Inc. * + * Copyright (c) 1998-2005,2006 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 * @@ -53,7 +53,7 @@ #include /* lines, columns, cur_term */ -MODULE_ID("$Id: lib_setup.c,v 1.88 2005/03/12 19:41:45 tom Exp $") +MODULE_ID("$Id: lib_setup.c,v 1.95 2006/07/28 22:58:13 tom Exp $") /**************************************************************************** * @@ -106,6 +106,52 @@ NCURSES_EXPORT_VAR(int) TABSIZE = 0; static int _use_env = TRUE; +#if USE_SIGWINCH +int +_nc_handle_sigwinch(int enable) +{ + static int have_sigwinch = 0; /* initially no SIGWINCH's */ + static int can_resizeall = 1; /* initially enabled */ + SCREEN *scan; + int result; + + switch (enable) { + default: + /* record a SIGWINCH */ + have_sigwinch = 1; + break; + case 0: + /* temporarily disable the next block */ + --can_resizeall; + break; + case 1: + /* temporarily enable the next block */ + ++can_resizeall; + break; + } + + /* + * If we have a pending SIGWINCH, set the flag in each screen. + * But do this only if the block is enabled. + */ + if (can_resizeall-- >= 0) { /* test and disable */ + if (have_sigwinch) { + scan = _nc_screen_chain; + while (scan) { + scan->_sig_winch = TRUE; + scan = scan->_next_screen; + } + have_sigwinch = 0; + } + } + result = can_resizeall + 1; /* reenable (unless disables are nested) */ + can_resizeall = result; + + return result; +} + +#endif + NCURSES_EXPORT(void) use_env(bool f) { @@ -121,6 +167,7 @@ _nc_get_screensize(int *linep, int *colp) /* figure out the size of the screen */ T(("screen size: terminfo lines = %d columns = %d", lines, columns)); + _nc_handle_sigwinch(0); if (!_use_env) { *linep = (int) lines; *colp = (int) columns; @@ -167,7 +214,7 @@ _nc_get_screensize(int *linep, int *colp) * environment variable. */ if (*linep <= 0) - *linep = WINSIZE_ROWS(size); + *linep = (SP != 0 && SP->_filtered) ? 1 : WINSIZE_ROWS(size); if (*colp <= 0) *colp = WINSIZE_COLS(size); } @@ -199,6 +246,7 @@ _nc_get_screensize(int *linep, int *colp) lines = (short) (*linep); columns = (short) (*colp); } + _nc_handle_sigwinch(1); T(("screen size is %dx%d", *linep, *colp)); @@ -257,38 +305,15 @@ _nc_update_screensize(void) } #if USE_DATABASE || USE_TERMCAP +/* + * Return 1 if entry found, 0 if not found, -1 if database not accessible, + * just like tgetent(). + */ static int grab_entry(const char *const tn, TERMTYPE *const tp) -/* return 1 if entry found, 0 if not found, -1 if database not accessible */ { -#if USE_DATABASE char filename[PATH_MAX]; -#endif - int status; - - /* - * $TERM shouldn't contain pathname delimiters. - */ - if (strchr(tn, '/')) - return 0; - -#if USE_DATABASE - if ((status = _nc_read_entry(tn, filename, tp)) != 1) { - -#if !PURE_TERMINFO - /* - * Try falling back on the termcap file. - * Note: allowing this call links the entire terminfo/termcap - * compiler into the startup code. It's preferable to build a - * real terminfo database and use that. - */ - status = _nc_read_termcap_entry(tn, tp); -#endif /* PURE_TERMINFO */ - - } -#else - status = _nc_read_termcap_entry(tn, tp); -#endif + int status = _nc_read_entry(tn, filename, tp); /* * If we have an entry, force all of the cancelled strings to null @@ -296,7 +321,7 @@ grab_entry(const char *const tn, TERMTYPE *const tp) * (The terminfo compiler bypasses this logic, since it must know if * a string is cancelled, for merging entries). */ - if (status == 1) { + if (status == TGETENT_YES) { unsigned n; for_each_boolean(n, tp) { if (!VALID_BOOLEAN(tp->Booleans[n])) @@ -316,7 +341,6 @@ grab_entry(const char *const tn, TERMTYPE *const tp) ** ** 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(void) @@ -417,7 +441,7 @@ _nc_locale_breaks_acs(void) } /* - * This entrypoint is called from tgetent() to allow special a case of reusing + * This entrypoint is called from tgetent() to allow a special case of reusing * the same TERMINAL data (see comment). */ NCURSES_EXPORT(int) @@ -431,11 +455,13 @@ _nc_setupterm(NCURSES_CONST char *tname, int Filedes, int *errret, bool reuse) if (tname == 0) { tname = getenv("TERM"); if (tname == 0 || *tname == '\0') { - ret_error0(-1, "TERM environment variable not set.\n"); + ret_error0(TGETENT_ERR, "TERM environment variable not set.\n"); } } + if (strlen(tname) > MAX_NAME_SIZE) { - ret_error(-1, "TERM environment must be <= %d characters.\n", + ret_error(TGETENT_ERR, + "TERM environment must be <= %d characters.\n", MAX_NAME_SIZE); } @@ -477,31 +503,31 @@ _nc_setupterm(NCURSES_CONST char *tname, int Filedes, int *errret, bool reuse) term_ptr = typeCalloc(TERMINAL, 1); if (term_ptr == 0) { - ret_error0(-1, + ret_error0(TGETENT_ERR, "Not enough memory to create terminal structure.\n"); } #if USE_DATABASE || USE_TERMCAP status = grab_entry(tname, &term_ptr->type); #else - status = 0; + status = TGETENT_NO; #endif /* try fallback list if entry on disk */ - if (status != 1) { + if (status != TGETENT_YES) { const TERMTYPE *fallback = _nc_fallback(tname); if (fallback) { term_ptr->type = *fallback; - status = 1; + status = TGETENT_YES; } } - if (status <= 0) { + if (status != TGETENT_YES) { del_curterm(term_ptr); - if (status == -1) { - ret_error0(-1, "terminals database is inaccessible\n"); - } else if (status == 0) { - ret_error(0, "'%s': unknown terminal type.\n", tname); + 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); } } @@ -534,15 +560,15 @@ _nc_setupterm(NCURSES_CONST char *tname, int Filedes, int *errret, bool reuse) _nc_get_screensize(&LINES, &COLS); if (errret) - *errret = 1; + *errret = TGETENT_YES; T((T_CREATE("screen %s %dx%d"), tname, LINES, COLS)); if (generic_type) { - ret_error(0, "'%s': I need something more specific.\n", tname); + ret_error(TGETENT_NO, "'%s': I need something more specific.\n", tname); } if (hard_copy) { - ret_error(1, "'%s': I can't handle hardcopy terminals.\n", tname); + ret_error(TGETENT_YES, "'%s': I can't handle hardcopy terminals.\n", tname); } returnCode(OK); } @@ -552,9 +578,7 @@ _nc_setupterm(NCURSES_CONST char *tname, int Filedes, int *errret, bool reuse) * * Find and read the appropriate object file for the terminal * Make cur_term point to the structure. - * */ - NCURSES_EXPORT(int) setupterm(NCURSES_CONST char *tname, int Filedes, int *errret) {