diff options
author | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
---|---|---|
committer | stevel@tonic-gate <none@none> | 2005-06-14 00:00:00 -0700 |
commit | 7c478bd95313f5f23a4c958a745db2134aa03244 (patch) | |
tree | c871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/lib/libcurses/screen/endwin.c | |
download | illumos-joyent-7c478bd95313f5f23a4c958a745db2134aa03244.tar.gz |
OpenSolaris Launch
Diffstat (limited to 'usr/src/lib/libcurses/screen/endwin.c')
-rw-r--r-- | usr/src/lib/libcurses/screen/endwin.c | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/usr/src/lib/libcurses/screen/endwin.c b/usr/src/lib/libcurses/screen/endwin.c new file mode 100644 index 0000000000..391c0e115c --- /dev/null +++ b/usr/src/lib/libcurses/screen/endwin.c @@ -0,0 +1,174 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 1997 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +/* Copyright (c) 1988 AT&T */ +/* All Rights Reserved */ + +/* + * University Copyright- Copyright (c) 1982, 1986, 1988 + * The Regents of the University of California + * All Rights Reserved + * + * University Acknowledgment- Portions of this document are derived from + * software developed by the University of California, Berkeley, and its + * contributors. + */ + +#pragma ident "%Z%%M% %I% %E% SMI" + +/*LINTLIBRARY*/ + +/* Clean things up before exiting. */ + +#include <stdlib.h> +#include <sys/types.h> +#include "curses_inc.h" + +#ifdef _VR2_COMPAT_CODE +char _endwin = 0; +#endif /* _VR2_COMPAT_CODE */ + +int +isendwin(void) +{ + /* + * The test below must stay at TRUE because the value of 2 + * has special meaning to wrefresh but does not mean that + * endwin has been called. + */ + if (SP && (SP->fl_endwin == TRUE)) + return (TRUE); + else + return (FALSE); +} + +int +endwin(void) +{ + /* make sure we're in program mode */ + if (SP->fl_endwin) { + /* If endwin is equal to 2 it means we just did a newscreen. */ + if (SP->fl_endwin == TRUE) { + (void) reset_prog_mode(); + if (SP->kp_state) + (void) tputs(keypad_xmit, 1, _outch); + if (SP->fl_meta) + (void) tputs(meta_on, 1, _outch); + if (cur_term->_cursorstate != 1) + _PUTS(cur_term->cursor_seq + [cur_term->_cursorstate], 0); + } + _PUTS(enter_ca_mode, 1); + (void) tputs(ena_acs, 1, _outch); + if (exit_attribute_mode) + _PUTS(tparm_p0(exit_attribute_mode), 1); + else + /* + * If there is no exit_attribute mode, then vidupdate + * could only possibly turn off one of the below three + * so that's all we ask it turn off. + */ + vidupdate(A_NORMAL, + (A_ALTCHARSET | A_STANDOUT | A_UNDERLINE), _outch); + + SP->fl_endwin = FALSE; + +#ifdef _VR2_COMPAT_CODE + _endwin = (char) FALSE; +#endif /* _VR2_COMPAT_CODE */ + } + + /* See comment above why this test is explicitly against TRUE. */ + if (SP->fl_endwin == TRUE) + return (ERR); + + /* Flush out any output not output due to typeahead. */ + if (_INPUTPENDING) + (void) force_doupdate(); + + /* Close things down. */ + (void) ttimeout(-1); + if (SP->fl_meta) + (void) tputs(meta_off, 1, _outch); + (void) mvcur(curscr->_cury, curscr->_curx, curscr->_maxy - 1, 0); + + if (SP->kp_state) + (void) tputs(keypad_local, 1, _outch); + if (cur_term->_cursorstate != 1) + (void) tputs(cursor_normal, 0, _outch); + + /* don't bother turning off colors: it will be done later anyway */ + curscr->_attrs &= ~A_COLOR; /* SS: colors */ + + if ((curscr->_attrs != A_NORMAL) && + (magic_cookie_glitch < 0) && (!ceol_standout_glitch)) + _VIDS(A_NORMAL, curscr->_attrs); + + if (SP->phys_irm) + _OFFINSERT(); + + SP->fl_endwin = TRUE; + +#ifdef _VR2_COMPAT_CODE + _endwin = TRUE; +#endif /* _VR2_COMPAT_CODE */ + + curscr->_clear = TRUE; + (void) reset_shell_mode(); + (void) tputs(exit_ca_mode, 0, _outch); + + /* restore colors and default color pair. SS: colors */ + if (orig_colors) + (void) tputs(orig_colors, 1, _outch); + if (orig_pair) + (void) tputs(tparm_p0(orig_pair), 1, _outch); + + /* SS-mouse: free the mouse. */ + + if (get_mouse) + (void) tputs(tparm_p1(get_mouse, 0), 1, _outch); + + (void) fflush(SP->term_file); + + return (OK); +} + +int +force_doupdate(void) +{ + char chars_onQ = cur_term->_chars_on_queue; + int ret; + + /* + * This will cause _chkinput to return FALSE which will force wrefresh + * to think there is no input waiting and it will finish its refresh. + */ + + cur_term->_chars_on_queue = INP_QSIZE; + ret = doupdate(); + cur_term->_chars_on_queue = chars_onQ; + return (ret); +} |