/****************************************************************************
- * Copyright (c) 1998-2006,2007 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2007,2008 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 *
#include <term.h> /* cur_term */
#include <tic.h>
-MODULE_ID("$Id: lib_set_term.c,v 1.100 2007/09/08 21:23:43 tom Exp $")
+MODULE_ID("$Id: lib_set_term.c,v 1.106 2008/03/29 22:47:24 tom Exp $")
NCURSES_EXPORT(SCREEN *)
set_term(SCREEN *screenp)
oldSP = SP;
_nc_set_screen(screenp);
- set_curterm(SP->_term);
+ if (SP != 0) {
+ set_curterm(SP->_term);
#if !USE_REENTRANT
- curscr = SP->_curscr;
- newscr = SP->_newscr;
- stdscr = SP->_stdscr;
- COLORS = SP->_color_count;
- COLOR_PAIRS = SP->_pair_count;
+ curscr = SP->_curscr;
+ newscr = SP->_newscr;
+ stdscr = SP->_stdscr;
+ COLORS = SP->_color_count;
+ COLOR_PAIRS = SP->_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(set_SP);
T((T_CALLED("delscreen(%p)"), sp));
- _nc_lock_global(set_SP);
- while (*scan) {
- if (*scan == sp) {
- *scan = sp->_next_screen;
- break;
+ if (sp != 0) {
+ _nc_lock_global(set_SP);
+ while (*scan) {
+ if (*scan == sp) {
+ *scan = sp->_next_screen;
+ break;
+ }
+ scan = &(*scan)->_next_screen;
}
- scan = &(*scan)->_next_screen;
- }
-
- (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);
+ (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);
+ }
+ 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);
+ 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);
+ 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(set_SP);
}
- _nc_unlock_global(set_SP);
returnVoid;
}
}
#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,
bool filtered,
int slk_format)
{
+ char *env;
int bottom_stolen = 0;
bool support_cookies = USE_XMC_SUPPORT;
ripoff_t *rop;
_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"));
- }
#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;
? SP->_lines_avail - count
: 0),
0);
- if (w)
+ if (w) {
+ rop->win = w;
rop->hook(w, scolumns);
- else
+ } else {
returnCode(ERR);
+ }
if (rop->line < 0)
bottom_stolen += count;
else
NCURSES_EXPORT(int)
ripoffline(int line, int (*init) (WINDOW *, int))
{
+ START_TRACE();
T((T_CALLED("ripoffline(%d,%p)"), line, init));
if (line == 0)