/****************************************************************************
- * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2013,2014 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 *
#define CUR SP_TERMTYPE
#endif
-MODULE_ID("$Id: lib_set_term.c,v 1.129 2009/10/24 22:09:47 tom Exp $")
+MODULE_ID("$Id: lib_set_term.c,v 1.149 2014/03/08 20:32:59 tom Exp $")
#ifdef USE_TERM_DRIVER
#define MaxColors InfoOf(sp).maxcolors
if (newSP != 0) {
TINFO_SET_CURTERM(newSP, newSP->_term);
#if !USE_REENTRANT
- curscr = newSP->_curscr;
- newscr = newSP->_newscr;
- stdscr = newSP->_stdscr;
+ curscr = CurScreen(newSP);
+ newscr = NewScreen(newSP);
+ stdscr = StdScreen(newSP);
COLORS = newSP->_color_count;
COLOR_PAIRS = newSP->_pair_count;
#endif
for (each_screen(temp)) {
if (temp == sp) {
if (last)
- last = sp->_next_screen;
+ last->_next_screen = sp->_next_screen;
else
_nc_screen_chain = sp->_next_screen;
result = TRUE;
}
#endif
- (void) _nc_freewin(sp->_curscr);
- (void) _nc_freewin(sp->_newscr);
- (void) _nc_freewin(sp->_stdscr);
+ (void) _nc_freewin(CurScreen(sp));
+ (void) _nc_freewin(NewScreen(sp));
+ (void) _nc_freewin(StdScreen(sp));
if (sp->_slk != 0) {
if (sp->_slk->ent != 0) {
FreeIfNeeded(sp->_acs_map);
FreeIfNeeded(sp->_screen_acs_map);
- /*
- * 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);
- }
-
+ NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
NCURSES_SP_NAME(del_curterm) (NCURSES_SP_ARGx sp->_term);
free(sp);
}
#endif
-#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)
-{
- SCREEN *sp = _nc_alloc_screen_sp();
- if (sp) {
- 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
- }
- return sp;
-}
-#endif
-
-#define ReturnScreenError() _nc_set_screen(0); \
- returnCode(ERR)
+#define ReturnScreenError() { _nc_set_screen(0); \
+ returnCode(ERR); } while (0)
/* OS-independent screen initializations */
NCURSES_EXPORT(int)
int slines,
int scolumns,
FILE *output,
- bool filtered,
+ int filtered,
int slk_format)
{
char *env;
ReturnScreenError();
}
- T(("created SP %p", sp));
+ T(("created SP %p", (void *) sp));
sp->_next_screen = _nc_screen_chain;
_nc_screen_chain = sp;
slines = 1;
SET_LINES(slines);
#ifdef USE_TERM_DRIVER
- CallDriver(sp, setfilter);
+ CallDriver(sp, td_setfilter);
#else
clear_screen = 0;
cursor_down = parm_down_cursor = 0;
setmode(output, O_BINARY);
#endif
NCURSES_SP_NAME(_nc_set_buffer) (NCURSES_SP_ARGx output, TRUE);
- sp->_lines = slines;
- sp->_lines_avail = slines;
- sp->_columns = scolumns;
+ sp->_lines = (NCURSES_SIZE_T) slines;
+ sp->_lines_avail = (NCURSES_SIZE_T) slines;
+ sp->_columns = (NCURSES_SIZE_T) scolumns;
+
+ fflush(output);
+ sp->_ofd = output ? fileno(output) : -1;
sp->_ofp = output;
+ sp->out_limit = (size_t) ((2 + slines) * (6 + scolumns));
+ if ((sp->out_buffer = malloc(sp->out_limit)) == 0)
+ sp->out_limit = 0;
+ sp->out_inuse = 0;
+
SP_PRE_INIT(sp);
SetNoPadding(sp);
if (magic_cookie_glitch > 0) { /* tvi, wyse */
- sp->_xmc_triggers = sp->_ok_attributes & (
- A_STANDOUT |
- A_UNDERLINE |
- A_REVERSE |
- A_BLINK |
- A_DIM |
- A_BOLD |
- A_INVIS |
- A_PROTECT
- );
+ sp->_xmc_triggers = sp->_ok_attributes & XMC_CONFLICT;
#if 0
/*
* We "should" treat colors as an attribute. The wyse350 (and its
NCURSES_SP_NAME(_nc_init_acs) (NCURSES_SP_ARG);
#if USE_WIDEC_SUPPORT
+ sp->_screen_unicode = _nc_unicode_locale();
_nc_init_wacs();
+ if (_nc_wacs == 0) {
+ ReturnScreenError();
+ }
- sp->_screen_acs_fix = (_nc_unicode_locale()
+ sp->_screen_acs_fix = (sp->_screen_unicode
&& _nc_locale_breaks_acs(sp->_term));
#endif
env = _nc_get_locale();
sp->newhash = 0;
T(("creating newscr"));
- sp->_newscr = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx slines, scolumns,
- 0, 0);
- if (sp->_newscr == 0) {
+ NewScreen(sp) = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx slines, scolumns,
+ 0, 0);
+ if (NewScreen(sp) == 0) {
ReturnScreenError();
}
T(("creating curscr"));
- sp->_curscr = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx slines, scolumns,
- 0, 0);
- if (sp->_curscr == 0) {
+ CurScreen(sp) = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx slines, scolumns,
+ 0, 0);
+ if (CurScreen(sp) == 0) {
ReturnScreenError();
}
#if !USE_REENTRANT
- newscr = sp->_newscr;
- curscr = sp->_curscr;
+ newscr = NewScreen(sp);
+ curscr = CurScreen(sp);
#endif
#if USE_SIZECHANGE
sp->_resize = NCURSES_SP_NAME(resizeterm);
+ sp->_ungetch = safe_ungetch;
#endif
- sp->_newscr->_clear = TRUE;
- sp->_curscr->_clear = FALSE;
+ NewScreen(sp)->_clear = TRUE;
+ CurScreen(sp)->_clear = FALSE;
NCURSES_SP_NAME(def_shell_mode) (NCURSES_SP_ARG);
NCURSES_SP_NAME(def_prog_mode) (NCURSES_SP_ARG);
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 (!(NumLabels <= 0 || !SLK_STDFMT(slk_format)))
+ if (rop->hook == _nc_slk_initialize) {
+ if (!(NumLabels <= 0 || !SLK_STDFMT(slk_format))) {
continue;
+ }
+ }
if (rop->hook) {
int count;
WINDOW *w;
} else {
ReturnScreenError();
}
- if (rop->line < 0)
+ if (rop->line < 0) {
bottom_stolen += count;
- else
- sp->_topstolen += count;
- sp->_lines_avail -= count;
+ } else {
+ sp->_topstolen = (NCURSES_SIZE_T) (sp->_topstolen + count);
+ }
+ sp->_lines_avail = (NCURSES_SIZE_T) (sp->_lines_avail - count);
}
}
/* reset the stack */
T(("creating stdscr"));
assert((sp->_lines_avail + sp->_topstolen + bottom_stolen) == slines);
- if ((sp->_stdscr = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx
- sp->_lines_avail,
- scolumns, 0, 0)) == 0) {
+ if ((StdScreen(sp) = NCURSES_SP_NAME(newwin) (NCURSES_SP_ARGx
+ sp->_lines_avail,
+ scolumns, 0, 0)) == 0) {
ReturnScreenError();
}
SET_LINES(sp->_lines_avail);
#if !USE_REENTRANT
- stdscr = sp->_stdscr;
+ stdscr = StdScreen(sp);
#endif
sp->_prescreen = FALSE;
returnCode(OK);
_nc_setupscreen(int slines GCC_UNUSED,
int scolumns GCC_UNUSED,
FILE *output,
- bool filtered,
+ int filtered,
int slk_format)
{
SCREEN *sp = 0;
int code = ERR;
START_TRACE();
- T((T_CALLED("ripoffline(%p,%d,%p)"), (void *) SP_PARM, line, (void *) init));
+ T((T_CALLED("ripoffline(%p,%d,%p)"), (void *) SP_PARM, line, init));
- if (SP_PARM != 0 && SP_PARM->_prescreen) {
+#if NCURSES_SP_FUNCS
+ if (SP_PARM != 0 && SP_PARM->_prescreen)
+#endif
+ {
if (line == 0) {
code = OK;
} else {
int line,
int (*init) (WINDOW *, int))
{
+ START_TRACE();
return NCURSES_SP_NAME(_nc_ripoffline) (NCURSES_SP_ARGx
(line < 0) ? -1 : 1,
init);