X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_set_term.c;h=7bf6ea4db581cc348090f65c043da686340301b2;hp=e94e3c7a1583fdc2b1c32b49148c42a8ba3a5506;hb=da1f84b7eb32f17e91f6de242132ab3b2d462148;hpb=7a27c7d49c2e8b4a1ecbe85b4423d647cbc75ea5 diff --git a/ncurses/base/lib_set_term.c b/ncurses/base/lib_set_term.c index e94e3c7a..7bf6ea4d 100644 --- a/ncurses/base/lib_set_term.c +++ b/ncurses/base/lib_set_term.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2006,2007 Free Software Foundation, Inc. * + * Copyright (c) 1998-2008,2009 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 * ****************************************************************************/ /* @@ -44,26 +45,47 @@ #include /* cur_term */ #include -MODULE_ID("$Id: lib_set_term.c,v 1.96 2007/04/21 20:51:44 tom Exp $") +#ifndef CUR +#define CUR SP_TERMTYPE +#endif + +MODULE_ID("$Id: lib_set_term.c,v 1.124 2009/06/27 21:36:14 tom Exp $") NCURSES_EXPORT(SCREEN *) set_term(SCREEN *screenp) { SCREEN *oldSP; + SCREEN *newSP; T((T_CALLED("set_term(%p)"), screenp)); + _nc_lock_global(curses); + oldSP = SP; _nc_set_screen(screenp); + newSP = SP; - set_curterm(SP->_term); + if (newSP != 0) { + set_curterm(newSP->_term); #if !USE_REENTRANT - curscr = SP->_curscr; - newscr = SP->_newscr; - stdscr = SP->_stdscr; - COLORS = SP->_color_count; - COLOR_PAIRS = SP->_pair_count; + curscr = newSP->_curscr; + newscr = newSP->_newscr; + stdscr = newSP->_stdscr; + COLORS = newSP->_color_count; + COLOR_PAIRS = newSP->_pair_count; #endif + } else { + set_curterm(0); +#if !USE_REENTRANT + curscr = 0; + newscr = 0; + stdscr = 0; + COLORS = 0; + COLOR_PAIRS = 0; +#endif + } + + _nc_unlock_global(curses); T((T_RETURN("%p"), oldSP)); return (oldSP); @@ -79,95 +101,110 @@ _nc_free_keytry(TRIES * kt) } } +static bool +delink_screen(SCREEN *sp) +{ + SCREEN *last = 0; + SCREEN *temp; + bool result = FALSE; + + for (each_screen(temp)) { + if (temp == sp) { + if (last) + last = sp->_next_screen; + else + _nc_screen_chain = sp->_next_screen; + result = TRUE; + break; + } + last = temp; + } + return result; +} + /* * Free the storage associated with the given SCREEN sp. */ NCURSES_EXPORT(void) delscreen(SCREEN *sp) { - SCREEN **scan = &_nc_screen_chain; int i; T((T_CALLED("delscreen(%p)"), sp)); - while (*scan) { - if (*scan == sp) { - *scan = sp->_next_screen; - break; - } - scan = &(*scan)->_next_screen; - } + _nc_lock_global(curses); + if (delink_screen(sp)) { - (void) _nc_freewin(sp->_curscr); - (void) _nc_freewin(sp->_newscr); - (void) _nc_freewin(sp->_stdscr); + (void) _nc_freewin(sp->_curscr); + (void) _nc_freewin(sp->_newscr); + (void) _nc_freewin(sp->_stdscr); - if (sp->_slk != 0) { - if (sp->_slk->ent != 0) { - for (i = 0; i < sp->_slk->labcnt; ++i) { - FreeIfNeeded(sp->_slk->ent[i].ent_text); - FreeIfNeeded(sp->_slk->ent[i].form_text); + if (sp->_slk != 0) { + if (sp->_slk->ent != 0) { + for (i = 0; i < sp->_slk->labcnt; ++i) { + FreeIfNeeded(sp->_slk->ent[i].ent_text); + FreeIfNeeded(sp->_slk->ent[i].form_text); + } + free(sp->_slk->ent); } - free(sp->_slk->ent); + free(sp->_slk); + sp->_slk = 0; } - free(sp->_slk); - sp->_slk = 0; - } - _nc_free_keytry(sp->_keytry); - sp->_keytry = 0; + _nc_free_keytry(sp->_keytry); + sp->_keytry = 0; - _nc_free_keytry(sp->_key_ok); - sp->_key_ok = 0; + _nc_free_keytry(sp->_key_ok); + sp->_key_ok = 0; - FreeIfNeeded(sp->_current_attr); + FreeIfNeeded(sp->_current_attr); - FreeIfNeeded(sp->_color_table); - FreeIfNeeded(sp->_color_pairs); + FreeIfNeeded(sp->_color_table); + FreeIfNeeded(sp->_color_pairs); - FreeIfNeeded(sp->oldhash); - FreeIfNeeded(sp->newhash); - FreeIfNeeded(sp->hashtab); + FreeIfNeeded(sp->oldhash); + FreeIfNeeded(sp->newhash); + FreeIfNeeded(sp->hashtab); - FreeIfNeeded(sp->_acs_map); - FreeIfNeeded(sp->_screen_acs_map); + FreeIfNeeded(sp->_acs_map); + FreeIfNeeded(sp->_screen_acs_map); - del_curterm(sp->_term); - - /* - * If the associated output stream has been closed, we can discard the - * set-buffer. Limit the error check to EBADF, since fflush may fail - * for other reasons than trying to operate upon a closed stream. - */ - if (sp->_ofp != 0 - && sp->_setbuf != 0 - && fflush(sp->_ofp) != 0 - && errno == EBADF) { - free(sp->_setbuf); - } + /* + * If the associated output stream has been closed, we can discard the + * set-buffer. Limit the error check to EBADF, since fflush may fail + * for other reasons than trying to operate upon a closed stream. + */ + if (sp->_ofp != 0 + && sp->_setbuf != 0 + && fflush(sp->_ofp) != 0 + && errno == EBADF) { + free(sp->_setbuf); + } - free(sp); + del_curterm(sp->_term); + free(sp); - /* - * If this was the current screen, reset everything that the - * application might try to use (except cur_term, which may have - * multiple references in different screens). - */ - if (sp == SP) { + /* + * If this was the current screen, reset everything that the + * application might try to use (except cur_term, which may have + * multiple references in different screens). + */ + if (sp == SP) { #if !USE_REENTRANT - curscr = 0; - newscr = 0; - stdscr = 0; - COLORS = 0; - COLOR_PAIRS = 0; + curscr = 0; + newscr = 0; + stdscr = 0; + COLORS = 0; + COLOR_PAIRS = 0; #endif - _nc_set_screen(0); + _nc_set_screen(0); + } } + _nc_unlock_global(curses); + returnVoid; } -#define N_RIPS SIZEOF(SP->_rippedoff) - static bool no_mouse_event(SCREEN *sp GCC_UNUSED) { @@ -181,7 +218,7 @@ no_mouse_inline(SCREEN *sp GCC_UNUSED) } static bool -no_mouse_parse(int code GCC_UNUSED) +no_mouse_parse(SCREEN *sp GCC_UNUSED, int code GCC_UNUSED) { return TRUE; } @@ -216,9 +253,6 @@ extract_fgbg(char *src, int *result) } #endif -#define ripoff_sp _nc_prescreen.rsp -#define ripoff_stack _nc_prescreen.rippedoff - /* OS-independent screen initializations */ NCURSES_EXPORT(int) _nc_setupscreen(int slines GCC_UNUSED, @@ -227,9 +261,13 @@ _nc_setupscreen(int slines GCC_UNUSED, bool filtered, int slk_format) { +#if NCURSES_SP_FUNCS + SCREEN *sp = CURRENT_SCREEN; +#endif + char *env; int bottom_stolen = 0; - int i; bool support_cookies = USE_XMC_SUPPORT; + ripoff_t *rop; T((T_CALLED("_nc_setupscreen(%d, %d, %p, %d, %d)"), slines, scolumns, output, filtered, slk_format)); @@ -242,6 +280,9 @@ _nc_setupscreen(int slines GCC_UNUSED, } T(("created SP %p", SP)); +#if NCURSES_SP_FUNCS + sp = SP; /* fixup so SET_LINES and SET_COLS works */ +#endif SP->_next_screen = _nc_screen_chain; _nc_screen_chain = SP; @@ -251,7 +292,7 @@ _nc_setupscreen(int slines GCC_UNUSED, /* * We should always check the screensize, just in case. */ - _nc_get_screensize(&slines, &scolumns); + _nc_get_screensize(SP, &slines, &scolumns); SET_LINES(slines); SET_COLS(scolumns); T((T_CREATE("screen %s %dx%d"), termname(), LINES, COLS)); @@ -271,18 +312,6 @@ _nc_setupscreen(int slines GCC_UNUSED, cursor_home = carriage_return; T(("filter screensize %dx%d", LINES, COLS)); } - - /* If we must simulate soft labels, grab off the line to be used. - We assume that we must simulate, if it is none of the standard - formats (4-4 or 3-2-3) for which there may be some hardware - support. */ - if (num_labels <= 0 || !SLK_STDFMT(slk_format)) { - if (slk_format) { - if (ERR == _nc_ripoffline(-SLK_LINES(slk_format), - _nc_slk_initialize)) - returnCode(ERR); - } - } #ifdef __DJGPP__ T(("setting output mode to binary")); fflush(output); @@ -304,11 +333,7 @@ _nc_setupscreen(int slines GCC_UNUSED, SP->_ofp = output; SP->_cursor = -1; /* cannot know real cursor shape */ -#if NCURSES_NO_PADDING - SP->_no_padding = getenv("NCURSES_NO_PADDING") != 0; - TR(TRACE_CHARPUT | TRACE_MOVE, ("padding will%s be used", - SP->_no_padding ? " not" : "")); -#endif + SetNoPadding(SP); #if NCURSES_EXT_FUNCS SP->_default_color = FALSE; @@ -345,11 +370,10 @@ _nc_setupscreen(int slines GCC_UNUSED, * Allow those assumed/default color assumptions to be overridden at * runtime: */ - if (getenv("NCURSES_ASSUMED_COLORS") != 0) { - char *p = getenv("NCURSES_ASSUMED_COLORS"); + if ((env = getenv("NCURSES_ASSUMED_COLORS")) != 0) { int fg, bg; char sep1, sep2; - int count = sscanf(p, "%d%c%d%c", &fg, &sep1, &bg, &sep2); + int count = sscanf(env, "%d%c%d%c", &fg, &sep1, &bg, &sep2); if (count >= 1) { SP->_default_fg = (fg >= 0 && fg < max_colors) ? fg : C_MASK; if (count >= 3) { @@ -405,11 +429,6 @@ _nc_setupscreen(int slines GCC_UNUSED, SP->_mouse_wrap = no_mouse_wrap; SP->_mouse_fd = -1; - /* initialize the panel hooks */ - SP->_panelHook.top_panel = (struct panel *) 0; - SP->_panelHook.bottom_panel = (struct panel *) 0; - SP->_panelHook.stdscr_pseudo_panel = (struct panel *) 0; - /* * If we've no magic cookie support, we suppress attributes that xmc would * affect, i.e., the attributes that affect the rendition of a space. @@ -498,7 +517,7 @@ _nc_setupscreen(int slines GCC_UNUSED, /* initialize normal acs before wide, since we use mapping in the latter */ #if !USE_WIDEC_SUPPORT - if (_nc_unicode_locale() && _nc_locale_breaks_acs()) { + if (_nc_unicode_locale() && _nc_locale_breaks_acs(cur_term)) { acs_chars = NULL; ena_acs = NULL; enter_alt_charset_mode = NULL; @@ -510,20 +529,18 @@ _nc_setupscreen(int slines GCC_UNUSED, #if USE_WIDEC_SUPPORT _nc_init_wacs(); - SP->_screen_acs_fix = (_nc_unicode_locale() && _nc_locale_breaks_acs()); - { - char *env = _nc_get_locale(); - SP->_legacy_coding = ((env == 0) - || !strcmp(env, "C") - || !strcmp(env, "POSIX")); - } + SP->_screen_acs_fix = (_nc_unicode_locale() + && _nc_locale_breaks_acs(cur_term)); #endif + env = _nc_get_locale(); + SP->_legacy_coding = ((env == 0) + || !strcmp(env, "C") + || !strcmp(env, "POSIX")); + T(("legacy-coding %d", SP->_legacy_coding)); _nc_idcok = TRUE; _nc_idlok = FALSE; - _nc_windows = 0; /* no windows yet */ - SP->oldhash = 0; SP->newhash = 0; @@ -540,7 +557,7 @@ _nc_setupscreen(int slines GCC_UNUSED, curscr = SP->_curscr; #endif #if USE_SIZECHANGE - SP->_resize = resizeterm; + SP->_resize = NCURSES_SP_NAME(resizeterm); #endif newscr->_clear = TRUE; @@ -549,40 +566,47 @@ _nc_setupscreen(int slines GCC_UNUSED, def_shell_mode(); def_prog_mode(); - for (i = 0, ripoff_sp = ripoff_stack; - ripoff_sp->line && (i < (int) N_RIPS); - ripoff_sp++, i++) { - - T(("ripping off line %d at %s", i, - ((ripoff_sp->line < 0) - ? "bottom" - : "top"))); - - SP->_rippedoff[i] = ripoff_stack[i]; - if (ripoff_sp->hook) { - int count = (ripoff_sp->line < 0) ? -ripoff_sp->line : ripoff_sp->line; - - SP->_rippedoff[i].w = newwin(count, - scolumns, - ((ripoff_sp->line < 0) - ? SP->_lines_avail - count - : 0), - 0); - if (SP->_rippedoff[i].w != 0) - SP->_rippedoff[i].hook(SP->_rippedoff[i].w, scolumns); - else + for (rop = safe_ripoff_stack; + rop != safe_ripoff_sp && (rop - safe_ripoff_stack) < N_RIPS; + rop++) { + + /* If we must simulate soft labels, grab off the line to be used. + We assume that we must simulate, if it is none of the standard + formats (4-4 or 3-2-3) for which there may be some hardware + support. */ + if (rop->hook == _nc_slk_initialize) + if (!(num_labels <= 0 || !SLK_STDFMT(slk_format))) + continue; + if (rop->hook) { + int count; + WINDOW *w; + + count = (rop->line < 0) ? -rop->line : rop->line; + T(("ripping off %i lines at %s", count, + ((rop->line < 0) + ? "bottom" + : "top"))); + + w = newwin(count, scolumns, + ((rop->line < 0) + ? SP->_lines_avail - count + : 0), + 0); + if (w) { + rop->win = w; + rop->hook(w, scolumns); + } else { returnCode(ERR); - if (ripoff_sp->line < 0) + } + if (rop->line < 0) bottom_stolen += count; else SP->_topstolen += count; SP->_lines_avail -= count; } - ripoff_sp->line = 0; } - SP->_rip_count = i; /* reset the stack */ - ripoff_sp = ripoff_stack; + safe_ripoff_sp = safe_ripoff_stack; T(("creating stdscr")); assert((SP->_lines_avail + SP->_topstolen + bottom_stolen) == slines); @@ -602,31 +626,55 @@ _nc_setupscreen(int slines GCC_UNUSED, * off from the top or bottom. */ NCURSES_EXPORT(int) -_nc_ripoffline(int line, int (*init) (WINDOW *, int)) +NCURSES_SP_NAME(_nc_ripoffline) (NCURSES_SP_DCLx + int line, + int (*init) (WINDOW *, int)) { T((T_CALLED("_nc_ripoffline(%d, %p)"), line, init)); if (line != 0) { - if (ripoff_sp >= ripoff_stack + N_RIPS) + if (safe_ripoff_sp == 0) + safe_ripoff_sp = safe_ripoff_stack; + if (safe_ripoff_sp >= safe_ripoff_stack + N_RIPS) returnCode(ERR); - ripoff_sp->line = line; - ripoff_sp->hook = init; - ripoff_sp->w = 0; - ripoff_sp++; + safe_ripoff_sp->line = line; + safe_ripoff_sp->hook = init; + safe_ripoff_sp++; } returnCode(OK); } +#if NCURSES_SP_FUNCS NCURSES_EXPORT(int) -ripoffline(int line, int (*init) (WINDOW *, int)) +_nc_ripoffline(int line, int (*init) (WINDOW *, int)) +{ + return NCURSES_SP_NAME(_nc_ripoffline) (CURRENT_SCREEN, line, init); +} +#endif + +NCURSES_EXPORT(int) +NCURSES_SP_NAME(ripoffline) (NCURSES_SP_DCLx + int line, + int (*init) (WINDOW *, int)) { + START_TRACE(); T((T_CALLED("ripoffline(%d,%p)"), line, init)); if (line == 0) returnCode(OK); - returnCode(_nc_ripoffline((line < 0) ? -1 : 1, init)); + returnCode(NCURSES_SP_NAME(_nc_ripoffline) (NCURSES_SP_ARGx + (line < 0) ? -1 : 1, + init)); } + +#if NCURSES_SP_FUNCS +NCURSES_EXPORT(int) +ripoffline(int line, int (*init) (WINDOW *, int)) +{ + return NCURSES_SP_NAME(ripoffline) (CURRENT_SCREEN, line, init); +} +#endif