1 /**************************************************************************** 2 * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. * 3 * * 4 * Permission is hereby granted, free of charge, to any person obtaining a * 5 * copy of this software and associated documentation files (the * 6 * "Software"), to deal in the Software without restriction, including * 7 * without limitation the rights to use, copy, modify, merge, publish, * 8 * distribute, distribute with modifications, sublicense, and/or sell * 9 * copies of the Software, and to permit persons to whom the Software is * 10 * furnished to do so, subject to the following conditions: * 11 * * 12 * The above copyright notice and this permission notice shall be included * 13 * in all copies or substantial portions of the Software. * 14 * * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * 16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * 18 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * 20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * 21 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * 22 * * 23 * Except as contained in this notice, the name(s) of the above copyright * 24 * holders shall not be used in advertising or otherwise to promote the * 25 * sale, use or other dealings in this Software without prior written * 26 * authorization. * 27 ****************************************************************************/ 28 29 /**************************************************************************** 30 * Author: Thomas E. Dickey <dickey@clark.net> 1997 * 31 ****************************************************************************/ 32 /* 33 * Module that "owns" the 'cur_term' variable: 34 * 35 * TERMINAL *set_curterm(TERMINAL *) 36 * int del_curterm(TERMINAL *) 37 */ 38 39 #include <curses.priv.h> 40 #include <termcap.h> /* ospeed */ 41 42 MODULE_ID("$Id: lib_cur_term.c,v 1.33 2014/03/08 20:32:59 tom Exp $") 43 44 #undef CUR 45 #define CUR termp->type. 46 47 #if USE_REENTRANT 48 49 NCURSES_EXPORT(TERMINAL *) 50 NCURSES_SP_NAME(_nc_get_cur_term) (NCURSES_SP_DCL0) 51 { 52 return ((0 != TerminalOf(SP_PARM)) ? TerminalOf(SP_PARM) : CurTerm); 53 } 54 55 #if NCURSES_SP_FUNCS 56 57 NCURSES_EXPORT(TERMINAL *) 58 _nc_get_cur_term(void) 59 { 60 return NCURSES_SP_NAME(_nc_get_cur_term) (CURRENT_SCREEN); 61 } 62 #endif 63 64 NCURSES_EXPORT(TERMINAL *) 65 NCURSES_PUBLIC_VAR(cur_term) (void) 66 { 67 #if NCURSES_SP_FUNCS 68 return NCURSES_SP_NAME(_nc_get_cur_term) (CURRENT_SCREEN); 69 #else 70 return NCURSES_SP_NAME(_nc_get_cur_term) (NCURSES_SP_ARG); 71 #endif 72 } 73 74 #else 75 NCURSES_EXPORT_VAR(TERMINAL *) cur_term = 0; 76 #endif 77 78 NCURSES_EXPORT(TERMINAL *) 79 NCURSES_SP_NAME(set_curterm) (NCURSES_SP_DCLx TERMINAL * termp) 80 { 81 TERMINAL *oldterm; 82 83 T((T_CALLED("set_curterm(%p)"), (void *) termp)); 84 85 _nc_lock_global(curses); 86 oldterm = cur_term; 87 if (SP_PARM) 88 SP_PARM->_term = termp; 89 #if USE_REENTRANT 90 CurTerm = termp; 91 #else 92 cur_term = termp; 93 #endif 94 if (termp != 0) { 95 #ifdef USE_TERM_DRIVER 96 TERMINAL_CONTROL_BLOCK *TCB = (TERMINAL_CONTROL_BLOCK *) termp; 97 ospeed = (NCURSES_OSPEED) _nc_ospeed(termp->_baudrate); 98 if (TCB->drv->isTerminfo && termp->type.Strings) { 99 PC = (char) ((pad_char != NULL) ? pad_char[0] : 0); 100 } 101 TCB->csp = SP_PARM; 102 #else 103 ospeed = (NCURSES_OSPEED) _nc_ospeed(termp->_baudrate); 104 if (termp->type.Strings) { 105 PC = (char) ((pad_char != NULL) ? pad_char[0] : 0); 106 } 107 #endif 108 } 109 _nc_unlock_global(curses); 110 111 T((T_RETURN("%p"), (void *) oldterm)); 112 return (oldterm); 113 } 114 115 #if NCURSES_SP_FUNCS 116 NCURSES_EXPORT(TERMINAL *) 117 set_curterm(TERMINAL * termp) 118 { 119 return NCURSES_SP_NAME(set_curterm) (CURRENT_SCREEN, termp); 120 } 121 #endif 122 123 NCURSES_EXPORT(int) 124 NCURSES_SP_NAME(del_curterm) (NCURSES_SP_DCLx TERMINAL * termp) 125 { 126 int rc = ERR; 127 128 T((T_CALLED("del_curterm(%p, %p)"), (void *) SP_PARM, (void *) termp)); 129 130 if (termp != 0) { 131 #ifdef USE_TERM_DRIVER 132 TERMINAL_CONTROL_BLOCK *TCB = (TERMINAL_CONTROL_BLOCK *) termp; 133 #endif 134 TERMINAL *cur = ( 135 #if USE_REENTRANT 136 NCURSES_SP_NAME(_nc_get_cur_term) (NCURSES_SP_ARG) 137 #else 138 cur_term 139 #endif 140 ); 141 142 _nc_free_termtype(&(termp->type)); 143 if (termp == cur) 144 NCURSES_SP_NAME(set_curterm) (NCURSES_SP_ARGx 0); 145 146 FreeIfNeeded(termp->_termname); 147 #if USE_HOME_TERMINFO 148 if (_nc_globals.home_terminfo != 0) { 149 FreeAndNull(_nc_globals.home_terminfo); 150 } 151 #endif 152 #ifdef USE_TERM_DRIVER 153 if (TCB->drv) 154 TCB->drv->td_release(TCB); 155 #endif 156 free(termp); 157 158 rc = OK; 159 } 160 returnCode(rc); 161 } 162 163 #if NCURSES_SP_FUNCS 164 NCURSES_EXPORT(int) 165 del_curterm(TERMINAL * termp) 166 { 167 int rc = ERR; 168 169 _nc_lock_global(curses); 170 rc = NCURSES_SP_NAME(del_curterm) (CURRENT_SCREEN, termp); 171 _nc_unlock_global(curses); 172 173 return (rc); 174 } 175 #endif 176