1*6b445a62SJohn Marino /* terminal.c -- controlling the terminal with termcap. */ 2*6b445a62SJohn Marino 3*6b445a62SJohn Marino /* Copyright (C) 1996-2009 Free Software Foundation, Inc. 4*6b445a62SJohn Marino 5*6b445a62SJohn Marino This file is part of the GNU Readline Library (Readline), a library 6*6b445a62SJohn Marino for reading lines of text with interactive input and history editing. 7*6b445a62SJohn Marino 8*6b445a62SJohn Marino Readline is free software: you can redistribute it and/or modify 9*6b445a62SJohn Marino it under the terms of the GNU General Public License as published by 10*6b445a62SJohn Marino the Free Software Foundation, either version 3 of the License, or 11*6b445a62SJohn Marino (at your option) any later version. 12*6b445a62SJohn Marino 13*6b445a62SJohn Marino Readline is distributed in the hope that it will be useful, 14*6b445a62SJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of 15*6b445a62SJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*6b445a62SJohn Marino GNU General Public License for more details. 17*6b445a62SJohn Marino 18*6b445a62SJohn Marino You should have received a copy of the GNU General Public License 19*6b445a62SJohn Marino along with Readline. If not, see <http://www.gnu.org/licenses/>. 20*6b445a62SJohn Marino */ 21*6b445a62SJohn Marino 22*6b445a62SJohn Marino #define READLINE_LIBRARY 23*6b445a62SJohn Marino 24*6b445a62SJohn Marino #if defined (HAVE_CONFIG_H) 25*6b445a62SJohn Marino # include <config.h> 26*6b445a62SJohn Marino #endif 27*6b445a62SJohn Marino 28*6b445a62SJohn Marino #include <sys/types.h> 29*6b445a62SJohn Marino #include "posixstat.h" 30*6b445a62SJohn Marino #include <fcntl.h> 31*6b445a62SJohn Marino #if defined (HAVE_SYS_FILE_H) 32*6b445a62SJohn Marino # include <sys/file.h> 33*6b445a62SJohn Marino #endif /* HAVE_SYS_FILE_H */ 34*6b445a62SJohn Marino 35*6b445a62SJohn Marino #if defined (HAVE_UNISTD_H) 36*6b445a62SJohn Marino # include <unistd.h> 37*6b445a62SJohn Marino #endif /* HAVE_UNISTD_H */ 38*6b445a62SJohn Marino 39*6b445a62SJohn Marino #if defined (HAVE_STDLIB_H) 40*6b445a62SJohn Marino # include <stdlib.h> 41*6b445a62SJohn Marino #else 42*6b445a62SJohn Marino # include "ansi_stdlib.h" 43*6b445a62SJohn Marino #endif /* HAVE_STDLIB_H */ 44*6b445a62SJohn Marino 45*6b445a62SJohn Marino #if defined (HAVE_LOCALE_H) 46*6b445a62SJohn Marino # include <locale.h> 47*6b445a62SJohn Marino #endif 48*6b445a62SJohn Marino 49*6b445a62SJohn Marino #include <stdio.h> 50*6b445a62SJohn Marino 51*6b445a62SJohn Marino /* System-specific feature definitions and include files. */ 52*6b445a62SJohn Marino #include "rldefs.h" 53*6b445a62SJohn Marino 54*6b445a62SJohn Marino #if defined (GWINSZ_IN_SYS_IOCTL) && !defined (TIOCGWINSZ) 55*6b445a62SJohn Marino # include <sys/ioctl.h> 56*6b445a62SJohn Marino #endif /* GWINSZ_IN_SYS_IOCTL && !TIOCGWINSZ */ 57*6b445a62SJohn Marino 58*6b445a62SJohn Marino #ifdef __MSDOS__ 59*6b445a62SJohn Marino # include <pc.h> 60*6b445a62SJohn Marino #endif 61*6b445a62SJohn Marino 62*6b445a62SJohn Marino #include "rltty.h" 63*6b445a62SJohn Marino #include "tcap.h" 64*6b445a62SJohn Marino 65*6b445a62SJohn Marino /* Some standard library routines. */ 66*6b445a62SJohn Marino #include "readline.h" 67*6b445a62SJohn Marino #include "history.h" 68*6b445a62SJohn Marino 69*6b445a62SJohn Marino #include "rlprivate.h" 70*6b445a62SJohn Marino #include "rlshell.h" 71*6b445a62SJohn Marino #include "xmalloc.h" 72*6b445a62SJohn Marino 73*6b445a62SJohn Marino #if defined (__MINGW32__) 74*6b445a62SJohn Marino # include <windows.h> 75*6b445a62SJohn Marino # include <wincon.h> 76*6b445a62SJohn Marino 77*6b445a62SJohn Marino static void _win_get_screensize PARAMS((int *, int *)); 78*6b445a62SJohn Marino #endif 79*6b445a62SJohn Marino 80*6b445a62SJohn Marino #if defined (__EMX__) 81*6b445a62SJohn Marino static void _emx_get_screensize PARAMS((int *, int *)); 82*6b445a62SJohn Marino #endif 83*6b445a62SJohn Marino 84*6b445a62SJohn Marino #if defined (__MINGW32__) 85*6b445a62SJohn Marino # include <windows.h> 86*6b445a62SJohn Marino # include <wincon.h> 87*6b445a62SJohn Marino #endif 88*6b445a62SJohn Marino 89*6b445a62SJohn Marino #define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay) 90*6b445a62SJohn Marino #define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc) 91*6b445a62SJohn Marino 92*6b445a62SJohn Marino /* If the calling application sets this to a non-zero value, readline will 93*6b445a62SJohn Marino use the $LINES and $COLUMNS environment variables to set its idea of the 94*6b445a62SJohn Marino window size before interrogating the kernel. */ 95*6b445a62SJohn Marino int rl_prefer_env_winsize = 0; 96*6b445a62SJohn Marino 97*6b445a62SJohn Marino /* **************************************************************** */ 98*6b445a62SJohn Marino /* */ 99*6b445a62SJohn Marino /* Terminal and Termcap */ 100*6b445a62SJohn Marino /* */ 101*6b445a62SJohn Marino /* **************************************************************** */ 102*6b445a62SJohn Marino 103*6b445a62SJohn Marino #ifndef __MSDOS__ 104*6b445a62SJohn Marino static char *term_buffer = (char *)NULL; 105*6b445a62SJohn Marino static char *term_string_buffer = (char *)NULL; 106*6b445a62SJohn Marino #endif /* !__MSDOS__ */ 107*6b445a62SJohn Marino 108*6b445a62SJohn Marino static int tcap_initialized; 109*6b445a62SJohn Marino 110*6b445a62SJohn Marino #if !defined (__linux__) && !defined (NCURSES_VERSION) 111*6b445a62SJohn Marino # if defined (__EMX__) || defined (NEED_EXTERN_PC) 112*6b445a62SJohn Marino extern 113*6b445a62SJohn Marino # endif /* __EMX__ || NEED_EXTERN_PC */ 114*6b445a62SJohn Marino char PC, *BC, *UP; 115*6b445a62SJohn Marino #endif /* !__linux__ && !NCURSES_VERSION */ 116*6b445a62SJohn Marino 117*6b445a62SJohn Marino /* Some strings to control terminal actions. These are output by tputs (). */ 118*6b445a62SJohn Marino char *_rl_term_clreol; 119*6b445a62SJohn Marino char *_rl_term_clrpag; 120*6b445a62SJohn Marino char *_rl_term_cr; 121*6b445a62SJohn Marino char *_rl_term_backspace; 122*6b445a62SJohn Marino char *_rl_term_goto; 123*6b445a62SJohn Marino char *_rl_term_pc; 124*6b445a62SJohn Marino 125*6b445a62SJohn Marino /* Non-zero if we determine that the terminal can do character insertion. */ 126*6b445a62SJohn Marino int _rl_terminal_can_insert = 0; 127*6b445a62SJohn Marino 128*6b445a62SJohn Marino /* How to insert characters. */ 129*6b445a62SJohn Marino char *_rl_term_im; 130*6b445a62SJohn Marino char *_rl_term_ei; 131*6b445a62SJohn Marino char *_rl_term_ic; 132*6b445a62SJohn Marino char *_rl_term_ip; 133*6b445a62SJohn Marino char *_rl_term_IC; 134*6b445a62SJohn Marino 135*6b445a62SJohn Marino /* How to delete characters. */ 136*6b445a62SJohn Marino char *_rl_term_dc; 137*6b445a62SJohn Marino char *_rl_term_DC; 138*6b445a62SJohn Marino 139*6b445a62SJohn Marino char *_rl_term_forward_char; 140*6b445a62SJohn Marino 141*6b445a62SJohn Marino /* How to go up a line. */ 142*6b445a62SJohn Marino char *_rl_term_up; 143*6b445a62SJohn Marino 144*6b445a62SJohn Marino /* A visible bell; char if the terminal can be made to flash the screen. */ 145*6b445a62SJohn Marino static char *_rl_visible_bell; 146*6b445a62SJohn Marino 147*6b445a62SJohn Marino /* Non-zero means the terminal can auto-wrap lines. */ 148*6b445a62SJohn Marino int _rl_term_autowrap = -1; 149*6b445a62SJohn Marino 150*6b445a62SJohn Marino /* Non-zero means that this terminal has a meta key. */ 151*6b445a62SJohn Marino static int term_has_meta; 152*6b445a62SJohn Marino 153*6b445a62SJohn Marino /* The sequences to write to turn on and off the meta key, if this 154*6b445a62SJohn Marino terminal has one. */ 155*6b445a62SJohn Marino static char *_rl_term_mm; 156*6b445a62SJohn Marino static char *_rl_term_mo; 157*6b445a62SJohn Marino 158*6b445a62SJohn Marino /* The key sequences output by the arrow keys, if this terminal has any. */ 159*6b445a62SJohn Marino static char *_rl_term_ku; 160*6b445a62SJohn Marino static char *_rl_term_kd; 161*6b445a62SJohn Marino static char *_rl_term_kr; 162*6b445a62SJohn Marino static char *_rl_term_kl; 163*6b445a62SJohn Marino 164*6b445a62SJohn Marino /* How to initialize and reset the arrow keys, if this terminal has any. */ 165*6b445a62SJohn Marino static char *_rl_term_ks; 166*6b445a62SJohn Marino static char *_rl_term_ke; 167*6b445a62SJohn Marino 168*6b445a62SJohn Marino /* The key sequences sent by the Home and End keys, if any. */ 169*6b445a62SJohn Marino static char *_rl_term_kh; 170*6b445a62SJohn Marino static char *_rl_term_kH; 171*6b445a62SJohn Marino static char *_rl_term_at7; /* @7 */ 172*6b445a62SJohn Marino 173*6b445a62SJohn Marino /* Delete key */ 174*6b445a62SJohn Marino static char *_rl_term_kD; 175*6b445a62SJohn Marino 176*6b445a62SJohn Marino /* Insert key */ 177*6b445a62SJohn Marino static char *_rl_term_kI; 178*6b445a62SJohn Marino 179*6b445a62SJohn Marino /* Cursor control */ 180*6b445a62SJohn Marino static char *_rl_term_vs; /* very visible */ 181*6b445a62SJohn Marino static char *_rl_term_ve; /* normal */ 182*6b445a62SJohn Marino 183*6b445a62SJohn Marino static void bind_termcap_arrow_keys PARAMS((Keymap)); 184*6b445a62SJohn Marino 185*6b445a62SJohn Marino /* Variables that hold the screen dimensions, used by the display code. */ 186*6b445a62SJohn Marino int _rl_screenwidth, _rl_screenheight, _rl_screenchars; 187*6b445a62SJohn Marino 188*6b445a62SJohn Marino /* Non-zero means the user wants to enable the keypad. */ 189*6b445a62SJohn Marino int _rl_enable_keypad; 190*6b445a62SJohn Marino 191*6b445a62SJohn Marino /* Non-zero means the user wants to enable a meta key. */ 192*6b445a62SJohn Marino int _rl_enable_meta = 1; 193*6b445a62SJohn Marino 194*6b445a62SJohn Marino #if defined (__EMX__) 195*6b445a62SJohn Marino static void 196*6b445a62SJohn Marino _emx_get_screensize (swp, shp) 197*6b445a62SJohn Marino int *swp, *shp; 198*6b445a62SJohn Marino { 199*6b445a62SJohn Marino int sz[2]; 200*6b445a62SJohn Marino 201*6b445a62SJohn Marino _scrsize (sz); 202*6b445a62SJohn Marino 203*6b445a62SJohn Marino if (swp) 204*6b445a62SJohn Marino *swp = sz[0]; 205*6b445a62SJohn Marino if (shp) 206*6b445a62SJohn Marino *shp = sz[1]; 207*6b445a62SJohn Marino } 208*6b445a62SJohn Marino #endif 209*6b445a62SJohn Marino 210*6b445a62SJohn Marino #if defined (__MINGW32__) 211*6b445a62SJohn Marino static void 212*6b445a62SJohn Marino _win_get_screensize (swp, shp) 213*6b445a62SJohn Marino int *swp, *shp; 214*6b445a62SJohn Marino { 215*6b445a62SJohn Marino HANDLE hConOut; 216*6b445a62SJohn Marino CONSOLE_SCREEN_BUFFER_INFO scr; 217*6b445a62SJohn Marino 218*6b445a62SJohn Marino hConOut = GetStdHandle (STD_OUTPUT_HANDLE); 219*6b445a62SJohn Marino if (hConOut != INVALID_HANDLE_VALUE) 220*6b445a62SJohn Marino { 221*6b445a62SJohn Marino if (GetConsoleScreenBufferInfo (hConOut, &scr)) 222*6b445a62SJohn Marino { 223*6b445a62SJohn Marino *swp = scr.dwSize.X; 224*6b445a62SJohn Marino *shp = scr.srWindow.Bottom - scr.srWindow.Top + 1; 225*6b445a62SJohn Marino } 226*6b445a62SJohn Marino } 227*6b445a62SJohn Marino } 228*6b445a62SJohn Marino #endif 229*6b445a62SJohn Marino 230*6b445a62SJohn Marino /* Get readline's idea of the screen size. TTY is a file descriptor open 231*6b445a62SJohn Marino to the terminal. If IGNORE_ENV is true, we do not pay attention to the 232*6b445a62SJohn Marino values of $LINES and $COLUMNS. The tests for TERM_STRING_BUFFER being 233*6b445a62SJohn Marino non-null serve to check whether or not we have initialized termcap. */ 234*6b445a62SJohn Marino void 235*6b445a62SJohn Marino _rl_get_screen_size (tty, ignore_env) 236*6b445a62SJohn Marino int tty, ignore_env; 237*6b445a62SJohn Marino { 238*6b445a62SJohn Marino char *ss; 239*6b445a62SJohn Marino #if defined (TIOCGWINSZ) 240*6b445a62SJohn Marino struct winsize window_size; 241*6b445a62SJohn Marino #endif /* TIOCGWINSZ */ 242*6b445a62SJohn Marino int wr, wc; 243*6b445a62SJohn Marino 244*6b445a62SJohn Marino wr = wc = -1; 245*6b445a62SJohn Marino #if defined (TIOCGWINSZ) 246*6b445a62SJohn Marino if (ioctl (tty, TIOCGWINSZ, &window_size) == 0) 247*6b445a62SJohn Marino { 248*6b445a62SJohn Marino wc = (int) window_size.ws_col; 249*6b445a62SJohn Marino wr = (int) window_size.ws_row; 250*6b445a62SJohn Marino } 251*6b445a62SJohn Marino #endif /* TIOCGWINSZ */ 252*6b445a62SJohn Marino 253*6b445a62SJohn Marino /* For MinGW, we get the console size from the Windows API. */ 254*6b445a62SJohn Marino #if defined (__MINGW32__) 255*6b445a62SJohn Marino HANDLE hConOut = GetStdHandle (STD_OUTPUT_HANDLE); 256*6b445a62SJohn Marino if (hConOut != INVALID_HANDLE_VALUE) 257*6b445a62SJohn Marino { 258*6b445a62SJohn Marino CONSOLE_SCREEN_BUFFER_INFO scr; 259*6b445a62SJohn Marino if (GetConsoleScreenBufferInfo (hConOut, &scr)) 260*6b445a62SJohn Marino { 261*6b445a62SJohn Marino wc = scr.dwSize.X; 262*6b445a62SJohn Marino wr = scr.srWindow.Bottom - scr.srWindow.Top + 1; 263*6b445a62SJohn Marino } 264*6b445a62SJohn Marino } 265*6b445a62SJohn Marino #endif 266*6b445a62SJohn Marino 267*6b445a62SJohn Marino #if defined (__EMX__) 268*6b445a62SJohn Marino _emx_get_screensize (&wc, &wr); 269*6b445a62SJohn Marino #elif defined (__MINGW32__) 270*6b445a62SJohn Marino _win_get_screensize (&wc, &wr); 271*6b445a62SJohn Marino #endif 272*6b445a62SJohn Marino 273*6b445a62SJohn Marino if (ignore_env || rl_prefer_env_winsize == 0) 274*6b445a62SJohn Marino { 275*6b445a62SJohn Marino _rl_screenwidth = wc; 276*6b445a62SJohn Marino _rl_screenheight = wr; 277*6b445a62SJohn Marino } 278*6b445a62SJohn Marino else 279*6b445a62SJohn Marino _rl_screenwidth = _rl_screenheight = -1; 280*6b445a62SJohn Marino 281*6b445a62SJohn Marino /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV 282*6b445a62SJohn Marino is unset. If we prefer the environment, check it first before 283*6b445a62SJohn Marino assigning the value returned by the kernel. */ 284*6b445a62SJohn Marino if (_rl_screenwidth <= 0) 285*6b445a62SJohn Marino { 286*6b445a62SJohn Marino if (ignore_env == 0 && (ss = sh_get_env_value ("COLUMNS"))) 287*6b445a62SJohn Marino _rl_screenwidth = atoi (ss); 288*6b445a62SJohn Marino 289*6b445a62SJohn Marino if (_rl_screenwidth <= 0) 290*6b445a62SJohn Marino _rl_screenwidth = wc; 291*6b445a62SJohn Marino 292*6b445a62SJohn Marino #if defined (__DJGPP__) 293*6b445a62SJohn Marino if (_rl_screenwidth <= 0) 294*6b445a62SJohn Marino _rl_screenwidth = ScreenCols (); 295*6b445a62SJohn Marino #else 296*6b445a62SJohn Marino if (_rl_screenwidth <= 0 && term_string_buffer) 297*6b445a62SJohn Marino _rl_screenwidth = tgetnum ("co"); 298*6b445a62SJohn Marino #endif 299*6b445a62SJohn Marino } 300*6b445a62SJohn Marino 301*6b445a62SJohn Marino /* Environment variable LINES overrides setting of "li" if IGNORE_ENV 302*6b445a62SJohn Marino is unset. */ 303*6b445a62SJohn Marino if (_rl_screenheight <= 0) 304*6b445a62SJohn Marino { 305*6b445a62SJohn Marino if (ignore_env == 0 && (ss = sh_get_env_value ("LINES"))) 306*6b445a62SJohn Marino _rl_screenheight = atoi (ss); 307*6b445a62SJohn Marino 308*6b445a62SJohn Marino if (_rl_screenheight <= 0) 309*6b445a62SJohn Marino _rl_screenheight = wr; 310*6b445a62SJohn Marino 311*6b445a62SJohn Marino #if defined (__DJGPP__) 312*6b445a62SJohn Marino if (_rl_screenheight <= 0) 313*6b445a62SJohn Marino _rl_screenheight = ScreenRows (); 314*6b445a62SJohn Marino #else 315*6b445a62SJohn Marino if (_rl_screenheight <= 0 && term_string_buffer) 316*6b445a62SJohn Marino _rl_screenheight = tgetnum ("li"); 317*6b445a62SJohn Marino #endif 318*6b445a62SJohn Marino } 319*6b445a62SJohn Marino 320*6b445a62SJohn Marino /* If all else fails, default to 80x24 terminal. */ 321*6b445a62SJohn Marino if (_rl_screenwidth <= 1) 322*6b445a62SJohn Marino _rl_screenwidth = 80; 323*6b445a62SJohn Marino 324*6b445a62SJohn Marino if (_rl_screenheight <= 0) 325*6b445a62SJohn Marino _rl_screenheight = 24; 326*6b445a62SJohn Marino 327*6b445a62SJohn Marino /* If we're being compiled as part of bash, set the environment 328*6b445a62SJohn Marino variables $LINES and $COLUMNS to new values. Otherwise, just 329*6b445a62SJohn Marino do a pair of putenv () or setenv () calls. */ 330*6b445a62SJohn Marino sh_set_lines_and_columns (_rl_screenheight, _rl_screenwidth); 331*6b445a62SJohn Marino 332*6b445a62SJohn Marino if (_rl_term_autowrap == 0) 333*6b445a62SJohn Marino _rl_screenwidth--; 334*6b445a62SJohn Marino 335*6b445a62SJohn Marino _rl_screenchars = _rl_screenwidth * _rl_screenheight; 336*6b445a62SJohn Marino } 337*6b445a62SJohn Marino 338*6b445a62SJohn Marino void 339*6b445a62SJohn Marino _rl_set_screen_size (rows, cols) 340*6b445a62SJohn Marino int rows, cols; 341*6b445a62SJohn Marino { 342*6b445a62SJohn Marino if (_rl_term_autowrap == -1) 343*6b445a62SJohn Marino _rl_init_terminal_io (rl_terminal_name); 344*6b445a62SJohn Marino 345*6b445a62SJohn Marino if (rows > 0) 346*6b445a62SJohn Marino _rl_screenheight = rows; 347*6b445a62SJohn Marino if (cols > 0) 348*6b445a62SJohn Marino { 349*6b445a62SJohn Marino _rl_screenwidth = cols; 350*6b445a62SJohn Marino if (_rl_term_autowrap == 0) 351*6b445a62SJohn Marino _rl_screenwidth--; 352*6b445a62SJohn Marino } 353*6b445a62SJohn Marino 354*6b445a62SJohn Marino if (rows > 0 || cols > 0) 355*6b445a62SJohn Marino _rl_screenchars = _rl_screenwidth * _rl_screenheight; 356*6b445a62SJohn Marino } 357*6b445a62SJohn Marino 358*6b445a62SJohn Marino void 359*6b445a62SJohn Marino rl_set_screen_size (rows, cols) 360*6b445a62SJohn Marino int rows, cols; 361*6b445a62SJohn Marino { 362*6b445a62SJohn Marino _rl_set_screen_size (rows, cols); 363*6b445a62SJohn Marino } 364*6b445a62SJohn Marino 365*6b445a62SJohn Marino void 366*6b445a62SJohn Marino rl_get_screen_size (rows, cols) 367*6b445a62SJohn Marino int *rows, *cols; 368*6b445a62SJohn Marino { 369*6b445a62SJohn Marino if (rows) 370*6b445a62SJohn Marino *rows = _rl_screenheight; 371*6b445a62SJohn Marino if (cols) 372*6b445a62SJohn Marino *cols = _rl_screenwidth; 373*6b445a62SJohn Marino } 374*6b445a62SJohn Marino 375*6b445a62SJohn Marino void 376*6b445a62SJohn Marino rl_reset_screen_size () 377*6b445a62SJohn Marino { 378*6b445a62SJohn Marino _rl_get_screen_size (fileno (rl_instream), 0); 379*6b445a62SJohn Marino } 380*6b445a62SJohn Marino 381*6b445a62SJohn Marino void 382*6b445a62SJohn Marino rl_resize_terminal () 383*6b445a62SJohn Marino { 384*6b445a62SJohn Marino _rl_get_screen_size (fileno (rl_instream), 1); 385*6b445a62SJohn Marino if (_rl_echoing_p) 386*6b445a62SJohn Marino { 387*6b445a62SJohn Marino if (CUSTOM_REDISPLAY_FUNC ()) 388*6b445a62SJohn Marino rl_forced_update_display (); 389*6b445a62SJohn Marino else if (RL_ISSTATE(RL_STATE_REDISPLAYING) == 0) 390*6b445a62SJohn Marino _rl_redisplay_after_sigwinch (); 391*6b445a62SJohn Marino } 392*6b445a62SJohn Marino } 393*6b445a62SJohn Marino 394*6b445a62SJohn Marino struct _tc_string { 395*6b445a62SJohn Marino const char * const tc_var; 396*6b445a62SJohn Marino char **tc_value; 397*6b445a62SJohn Marino }; 398*6b445a62SJohn Marino 399*6b445a62SJohn Marino /* This should be kept sorted, just in case we decide to change the 400*6b445a62SJohn Marino search algorithm to something smarter. */ 401*6b445a62SJohn Marino static const struct _tc_string tc_strings[] = 402*6b445a62SJohn Marino { 403*6b445a62SJohn Marino { "@7", &_rl_term_at7 }, 404*6b445a62SJohn Marino { "DC", &_rl_term_DC }, 405*6b445a62SJohn Marino { "IC", &_rl_term_IC }, 406*6b445a62SJohn Marino { "ce", &_rl_term_clreol }, 407*6b445a62SJohn Marino { "cl", &_rl_term_clrpag }, 408*6b445a62SJohn Marino { "cr", &_rl_term_cr }, 409*6b445a62SJohn Marino { "dc", &_rl_term_dc }, 410*6b445a62SJohn Marino { "ei", &_rl_term_ei }, 411*6b445a62SJohn Marino { "ic", &_rl_term_ic }, 412*6b445a62SJohn Marino { "im", &_rl_term_im }, 413*6b445a62SJohn Marino { "kD", &_rl_term_kD }, /* delete */ 414*6b445a62SJohn Marino { "kH", &_rl_term_kH }, /* home down ?? */ 415*6b445a62SJohn Marino { "kI", &_rl_term_kI }, /* insert */ 416*6b445a62SJohn Marino { "kd", &_rl_term_kd }, 417*6b445a62SJohn Marino { "ke", &_rl_term_ke }, /* end keypad mode */ 418*6b445a62SJohn Marino { "kh", &_rl_term_kh }, /* home */ 419*6b445a62SJohn Marino { "kl", &_rl_term_kl }, 420*6b445a62SJohn Marino { "kr", &_rl_term_kr }, 421*6b445a62SJohn Marino { "ks", &_rl_term_ks }, /* start keypad mode */ 422*6b445a62SJohn Marino { "ku", &_rl_term_ku }, 423*6b445a62SJohn Marino { "le", &_rl_term_backspace }, 424*6b445a62SJohn Marino { "mm", &_rl_term_mm }, 425*6b445a62SJohn Marino { "mo", &_rl_term_mo }, 426*6b445a62SJohn Marino { "nd", &_rl_term_forward_char }, 427*6b445a62SJohn Marino { "pc", &_rl_term_pc }, 428*6b445a62SJohn Marino { "up", &_rl_term_up }, 429*6b445a62SJohn Marino { "vb", &_rl_visible_bell }, 430*6b445a62SJohn Marino { "vs", &_rl_term_vs }, 431*6b445a62SJohn Marino { "ve", &_rl_term_ve }, 432*6b445a62SJohn Marino }; 433*6b445a62SJohn Marino 434*6b445a62SJohn Marino #define NUM_TC_STRINGS (sizeof (tc_strings) / sizeof (struct _tc_string)) 435*6b445a62SJohn Marino 436*6b445a62SJohn Marino /* Read the desired terminal capability strings into BP. The capabilities 437*6b445a62SJohn Marino are described in the TC_STRINGS table. */ 438*6b445a62SJohn Marino static void 439*6b445a62SJohn Marino get_term_capabilities (bp) 440*6b445a62SJohn Marino char **bp; 441*6b445a62SJohn Marino { 442*6b445a62SJohn Marino #if !defined (__DJGPP__) /* XXX - doesn't DJGPP have a termcap library? */ 443*6b445a62SJohn Marino register int i; 444*6b445a62SJohn Marino 445*6b445a62SJohn Marino for (i = 0; i < NUM_TC_STRINGS; i++) 446*6b445a62SJohn Marino *(tc_strings[i].tc_value) = tgetstr ((char *)tc_strings[i].tc_var, bp); 447*6b445a62SJohn Marino #endif 448*6b445a62SJohn Marino tcap_initialized = 1; 449*6b445a62SJohn Marino } 450*6b445a62SJohn Marino 451*6b445a62SJohn Marino int 452*6b445a62SJohn Marino _rl_init_terminal_io (terminal_name) 453*6b445a62SJohn Marino const char *terminal_name; 454*6b445a62SJohn Marino { 455*6b445a62SJohn Marino const char *term; 456*6b445a62SJohn Marino char *buffer; 457*6b445a62SJohn Marino int tty, tgetent_ret; 458*6b445a62SJohn Marino 459*6b445a62SJohn Marino term = terminal_name ? terminal_name : sh_get_env_value ("TERM"); 460*6b445a62SJohn Marino _rl_term_clrpag = _rl_term_cr = _rl_term_clreol = (char *)NULL; 461*6b445a62SJohn Marino tty = rl_instream ? fileno (rl_instream) : 0; 462*6b445a62SJohn Marino 463*6b445a62SJohn Marino if (term == 0) 464*6b445a62SJohn Marino term = "dumb"; 465*6b445a62SJohn Marino 466*6b445a62SJohn Marino #ifdef __MSDOS__ 467*6b445a62SJohn Marino _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL; 468*6b445a62SJohn Marino _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL; 469*6b445a62SJohn Marino _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL; 470*6b445a62SJohn Marino _rl_term_mm = _rl_term_mo = (char *)NULL; 471*6b445a62SJohn Marino _rl_terminal_can_insert = term_has_meta = _rl_term_autowrap = 0; 472*6b445a62SJohn Marino _rl_term_cr = "\r"; 473*6b445a62SJohn Marino _rl_term_clreol = _rl_term_clrpag = _rl_term_backspace = (char *)NULL; 474*6b445a62SJohn Marino _rl_term_goto = _rl_term_pc = _rl_term_ip = (char *)NULL; 475*6b445a62SJohn Marino _rl_term_ks = _rl_term_ke =_rl_term_vs = _rl_term_ve = (char *)NULL; 476*6b445a62SJohn Marino _rl_term_kh = _rl_term_kH = _rl_term_at7 = _rl_term_kI = (char *)NULL; 477*6b445a62SJohn Marino #if defined(HACK_TERMCAP_MOTION) 478*6b445a62SJohn Marino _rl_term_forward_char = (char *)NULL; 479*6b445a62SJohn Marino #endif 480*6b445a62SJohn Marino 481*6b445a62SJohn Marino _rl_get_screen_size (tty, 0); 482*6b445a62SJohn Marino #else /* !__MSDOS__ */ 483*6b445a62SJohn Marino /* I've separated this out for later work on not calling tgetent at all 484*6b445a62SJohn Marino if the calling application has supplied a custom redisplay function, 485*6b445a62SJohn Marino (and possibly if the application has supplied a custom input function). */ 486*6b445a62SJohn Marino if (CUSTOM_REDISPLAY_FUNC()) 487*6b445a62SJohn Marino { 488*6b445a62SJohn Marino tgetent_ret = -1; 489*6b445a62SJohn Marino } 490*6b445a62SJohn Marino else 491*6b445a62SJohn Marino { 492*6b445a62SJohn Marino if (term_string_buffer == 0) 493*6b445a62SJohn Marino term_string_buffer = (char *)xmalloc(2032); 494*6b445a62SJohn Marino 495*6b445a62SJohn Marino if (term_buffer == 0) 496*6b445a62SJohn Marino term_buffer = (char *)xmalloc(4080); 497*6b445a62SJohn Marino 498*6b445a62SJohn Marino buffer = term_string_buffer; 499*6b445a62SJohn Marino 500*6b445a62SJohn Marino tgetent_ret = tgetent (term_buffer, term); 501*6b445a62SJohn Marino } 502*6b445a62SJohn Marino 503*6b445a62SJohn Marino if (tgetent_ret <= 0) 504*6b445a62SJohn Marino { 505*6b445a62SJohn Marino FREE (term_string_buffer); 506*6b445a62SJohn Marino FREE (term_buffer); 507*6b445a62SJohn Marino buffer = term_buffer = term_string_buffer = (char *)NULL; 508*6b445a62SJohn Marino 509*6b445a62SJohn Marino _rl_term_autowrap = 0; /* used by _rl_get_screen_size */ 510*6b445a62SJohn Marino 511*6b445a62SJohn Marino /* Allow calling application to set default height and width, using 512*6b445a62SJohn Marino rl_set_screen_size */ 513*6b445a62SJohn Marino if (_rl_screenwidth <= 0 || _rl_screenheight <= 0) 514*6b445a62SJohn Marino { 515*6b445a62SJohn Marino #if defined (__EMX__) 516*6b445a62SJohn Marino _emx_get_screensize (&_rl_screenwidth, &_rl_screenheight); 517*6b445a62SJohn Marino _rl_screenwidth--; 518*6b445a62SJohn Marino #else /* !__EMX__ */ 519*6b445a62SJohn Marino _rl_get_screen_size (tty, 0); 520*6b445a62SJohn Marino #endif /* !__EMX__ */ 521*6b445a62SJohn Marino } 522*6b445a62SJohn Marino 523*6b445a62SJohn Marino /* Defaults. */ 524*6b445a62SJohn Marino if (_rl_screenwidth <= 0 || _rl_screenheight <= 0) 525*6b445a62SJohn Marino { 526*6b445a62SJohn Marino _rl_screenwidth = 79; 527*6b445a62SJohn Marino _rl_screenheight = 24; 528*6b445a62SJohn Marino } 529*6b445a62SJohn Marino 530*6b445a62SJohn Marino /* Everything below here is used by the redisplay code (tputs). */ 531*6b445a62SJohn Marino _rl_screenchars = _rl_screenwidth * _rl_screenheight; 532*6b445a62SJohn Marino _rl_term_cr = "\r"; 533*6b445a62SJohn Marino _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL; 534*6b445a62SJohn Marino _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL; 535*6b445a62SJohn Marino _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL; 536*6b445a62SJohn Marino _rl_term_kh = _rl_term_kH = _rl_term_kI = _rl_term_kD = (char *)NULL; 537*6b445a62SJohn Marino _rl_term_ks = _rl_term_ke = _rl_term_at7 = (char *)NULL; 538*6b445a62SJohn Marino _rl_term_mm = _rl_term_mo = (char *)NULL; 539*6b445a62SJohn Marino _rl_term_ve = _rl_term_vs = (char *)NULL; 540*6b445a62SJohn Marino _rl_term_forward_char = (char *)NULL; 541*6b445a62SJohn Marino _rl_terminal_can_insert = term_has_meta = 0; 542*6b445a62SJohn Marino 543*6b445a62SJohn Marino /* Reasonable defaults for tgoto(). Readline currently only uses 544*6b445a62SJohn Marino tgoto if _rl_term_IC or _rl_term_DC is defined, but just in case we 545*6b445a62SJohn Marino change that later... */ 546*6b445a62SJohn Marino PC = '\0'; 547*6b445a62SJohn Marino BC = _rl_term_backspace = "\b"; 548*6b445a62SJohn Marino UP = _rl_term_up; 549*6b445a62SJohn Marino 550*6b445a62SJohn Marino return 0; 551*6b445a62SJohn Marino } 552*6b445a62SJohn Marino 553*6b445a62SJohn Marino get_term_capabilities (&buffer); 554*6b445a62SJohn Marino 555*6b445a62SJohn Marino /* Set up the variables that the termcap library expects the application 556*6b445a62SJohn Marino to provide. */ 557*6b445a62SJohn Marino PC = _rl_term_pc ? *_rl_term_pc : 0; 558*6b445a62SJohn Marino BC = _rl_term_backspace; 559*6b445a62SJohn Marino UP = _rl_term_up; 560*6b445a62SJohn Marino 561*6b445a62SJohn Marino if (!_rl_term_cr) 562*6b445a62SJohn Marino _rl_term_cr = "\r"; 563*6b445a62SJohn Marino 564*6b445a62SJohn Marino _rl_term_autowrap = tgetflag ("am") && tgetflag ("xn"); 565*6b445a62SJohn Marino 566*6b445a62SJohn Marino /* Allow calling application to set default height and width, using 567*6b445a62SJohn Marino rl_set_screen_size */ 568*6b445a62SJohn Marino if (_rl_screenwidth <= 0 || _rl_screenheight <= 0) 569*6b445a62SJohn Marino _rl_get_screen_size (tty, 0); 570*6b445a62SJohn Marino 571*6b445a62SJohn Marino /* "An application program can assume that the terminal can do 572*6b445a62SJohn Marino character insertion if *any one of* the capabilities `IC', 573*6b445a62SJohn Marino `im', `ic' or `ip' is provided." But we can't do anything if 574*6b445a62SJohn Marino only `ip' is provided, so... */ 575*6b445a62SJohn Marino _rl_terminal_can_insert = (_rl_term_IC || _rl_term_im || _rl_term_ic); 576*6b445a62SJohn Marino 577*6b445a62SJohn Marino /* Check to see if this terminal has a meta key and clear the capability 578*6b445a62SJohn Marino variables if there is none. */ 579*6b445a62SJohn Marino term_has_meta = tgetflag ("km") != 0; 580*6b445a62SJohn Marino if (term_has_meta == 0) 581*6b445a62SJohn Marino _rl_term_mm = _rl_term_mo = (char *)NULL; 582*6b445a62SJohn Marino 583*6b445a62SJohn Marino #endif /* !__MSDOS__ */ 584*6b445a62SJohn Marino 585*6b445a62SJohn Marino /* Attempt to find and bind the arrow keys. Do not override already 586*6b445a62SJohn Marino bound keys in an overzealous attempt, however. */ 587*6b445a62SJohn Marino 588*6b445a62SJohn Marino bind_termcap_arrow_keys (emacs_standard_keymap); 589*6b445a62SJohn Marino 590*6b445a62SJohn Marino #if defined (VI_MODE) 591*6b445a62SJohn Marino bind_termcap_arrow_keys (vi_movement_keymap); 592*6b445a62SJohn Marino bind_termcap_arrow_keys (vi_insertion_keymap); 593*6b445a62SJohn Marino #endif /* VI_MODE */ 594*6b445a62SJohn Marino 595*6b445a62SJohn Marino return 0; 596*6b445a62SJohn Marino } 597*6b445a62SJohn Marino 598*6b445a62SJohn Marino /* Bind the arrow key sequences from the termcap description in MAP. */ 599*6b445a62SJohn Marino static void 600*6b445a62SJohn Marino bind_termcap_arrow_keys (map) 601*6b445a62SJohn Marino Keymap map; 602*6b445a62SJohn Marino { 603*6b445a62SJohn Marino Keymap xkeymap; 604*6b445a62SJohn Marino 605*6b445a62SJohn Marino xkeymap = _rl_keymap; 606*6b445a62SJohn Marino _rl_keymap = map; 607*6b445a62SJohn Marino 608*6b445a62SJohn Marino rl_bind_keyseq_if_unbound (_rl_term_ku, rl_get_previous_history); 609*6b445a62SJohn Marino rl_bind_keyseq_if_unbound (_rl_term_kd, rl_get_next_history); 610*6b445a62SJohn Marino rl_bind_keyseq_if_unbound (_rl_term_kr, rl_forward_char); 611*6b445a62SJohn Marino rl_bind_keyseq_if_unbound (_rl_term_kl, rl_backward_char); 612*6b445a62SJohn Marino 613*6b445a62SJohn Marino rl_bind_keyseq_if_unbound (_rl_term_kh, rl_beg_of_line); /* Home */ 614*6b445a62SJohn Marino rl_bind_keyseq_if_unbound (_rl_term_at7, rl_end_of_line); /* End */ 615*6b445a62SJohn Marino 616*6b445a62SJohn Marino rl_bind_keyseq_if_unbound (_rl_term_kD, rl_delete); 617*6b445a62SJohn Marino 618*6b445a62SJohn Marino _rl_keymap = xkeymap; 619*6b445a62SJohn Marino } 620*6b445a62SJohn Marino 621*6b445a62SJohn Marino char * 622*6b445a62SJohn Marino rl_get_termcap (cap) 623*6b445a62SJohn Marino const char *cap; 624*6b445a62SJohn Marino { 625*6b445a62SJohn Marino register int i; 626*6b445a62SJohn Marino 627*6b445a62SJohn Marino if (tcap_initialized == 0) 628*6b445a62SJohn Marino return ((char *)NULL); 629*6b445a62SJohn Marino for (i = 0; i < NUM_TC_STRINGS; i++) 630*6b445a62SJohn Marino { 631*6b445a62SJohn Marino if (tc_strings[i].tc_var[0] == cap[0] && strcmp (tc_strings[i].tc_var, cap) == 0) 632*6b445a62SJohn Marino return *(tc_strings[i].tc_value); 633*6b445a62SJohn Marino } 634*6b445a62SJohn Marino return ((char *)NULL); 635*6b445a62SJohn Marino } 636*6b445a62SJohn Marino 637*6b445a62SJohn Marino /* Re-initialize the terminal considering that the TERM/TERMCAP variable 638*6b445a62SJohn Marino has changed. */ 639*6b445a62SJohn Marino int 640*6b445a62SJohn Marino rl_reset_terminal (terminal_name) 641*6b445a62SJohn Marino const char *terminal_name; 642*6b445a62SJohn Marino { 643*6b445a62SJohn Marino _rl_screenwidth = _rl_screenheight = 0; 644*6b445a62SJohn Marino _rl_init_terminal_io (terminal_name); 645*6b445a62SJohn Marino return 0; 646*6b445a62SJohn Marino } 647*6b445a62SJohn Marino 648*6b445a62SJohn Marino /* A function for the use of tputs () */ 649*6b445a62SJohn Marino #ifdef _MINIX 650*6b445a62SJohn Marino void 651*6b445a62SJohn Marino _rl_output_character_function (c) 652*6b445a62SJohn Marino int c; 653*6b445a62SJohn Marino { 654*6b445a62SJohn Marino putc (c, _rl_out_stream); 655*6b445a62SJohn Marino } 656*6b445a62SJohn Marino #else /* !_MINIX */ 657*6b445a62SJohn Marino int 658*6b445a62SJohn Marino _rl_output_character_function (c) 659*6b445a62SJohn Marino int c; 660*6b445a62SJohn Marino { 661*6b445a62SJohn Marino return putc (c, _rl_out_stream); 662*6b445a62SJohn Marino } 663*6b445a62SJohn Marino #endif /* !_MINIX */ 664*6b445a62SJohn Marino 665*6b445a62SJohn Marino /* Write COUNT characters from STRING to the output stream. */ 666*6b445a62SJohn Marino void 667*6b445a62SJohn Marino _rl_output_some_chars (string, count) 668*6b445a62SJohn Marino const char *string; 669*6b445a62SJohn Marino int count; 670*6b445a62SJohn Marino { 671*6b445a62SJohn Marino fwrite (string, 1, count, _rl_out_stream); 672*6b445a62SJohn Marino } 673*6b445a62SJohn Marino 674*6b445a62SJohn Marino /* Move the cursor back. */ 675*6b445a62SJohn Marino int 676*6b445a62SJohn Marino _rl_backspace (count) 677*6b445a62SJohn Marino int count; 678*6b445a62SJohn Marino { 679*6b445a62SJohn Marino register int i; 680*6b445a62SJohn Marino 681*6b445a62SJohn Marino #ifndef __MSDOS__ 682*6b445a62SJohn Marino if (_rl_term_backspace) 683*6b445a62SJohn Marino for (i = 0; i < count; i++) 684*6b445a62SJohn Marino tputs (_rl_term_backspace, 1, _rl_output_character_function); 685*6b445a62SJohn Marino else 686*6b445a62SJohn Marino #endif 687*6b445a62SJohn Marino for (i = 0; i < count; i++) 688*6b445a62SJohn Marino putc ('\b', _rl_out_stream); 689*6b445a62SJohn Marino return 0; 690*6b445a62SJohn Marino } 691*6b445a62SJohn Marino 692*6b445a62SJohn Marino /* Move to the start of the next line. */ 693*6b445a62SJohn Marino int 694*6b445a62SJohn Marino rl_crlf () 695*6b445a62SJohn Marino { 696*6b445a62SJohn Marino #if defined (NEW_TTY_DRIVER) || defined (__MINT__) 697*6b445a62SJohn Marino if (_rl_term_cr) 698*6b445a62SJohn Marino tputs (_rl_term_cr, 1, _rl_output_character_function); 699*6b445a62SJohn Marino #endif /* NEW_TTY_DRIVER || __MINT__ */ 700*6b445a62SJohn Marino putc ('\n', _rl_out_stream); 701*6b445a62SJohn Marino return 0; 702*6b445a62SJohn Marino } 703*6b445a62SJohn Marino 704*6b445a62SJohn Marino /* Ring the terminal bell. */ 705*6b445a62SJohn Marino int 706*6b445a62SJohn Marino rl_ding () 707*6b445a62SJohn Marino { 708*6b445a62SJohn Marino if (_rl_echoing_p) 709*6b445a62SJohn Marino { 710*6b445a62SJohn Marino switch (_rl_bell_preference) 711*6b445a62SJohn Marino { 712*6b445a62SJohn Marino case NO_BELL: 713*6b445a62SJohn Marino default: 714*6b445a62SJohn Marino break; 715*6b445a62SJohn Marino case VISIBLE_BELL: 716*6b445a62SJohn Marino #ifdef __MSDOS__ 717*6b445a62SJohn Marino ScreenVisualBell (); 718*6b445a62SJohn Marino break; 719*6b445a62SJohn Marino #else 720*6b445a62SJohn Marino if (_rl_visible_bell) 721*6b445a62SJohn Marino { 722*6b445a62SJohn Marino tputs (_rl_visible_bell, 1, _rl_output_character_function); 723*6b445a62SJohn Marino break; 724*6b445a62SJohn Marino } 725*6b445a62SJohn Marino /* FALLTHROUGH */ 726*6b445a62SJohn Marino #endif 727*6b445a62SJohn Marino case AUDIBLE_BELL: 728*6b445a62SJohn Marino fprintf (stderr, "\007"); 729*6b445a62SJohn Marino fflush (stderr); 730*6b445a62SJohn Marino break; 731*6b445a62SJohn Marino } 732*6b445a62SJohn Marino return (0); 733*6b445a62SJohn Marino } 734*6b445a62SJohn Marino return (-1); 735*6b445a62SJohn Marino } 736*6b445a62SJohn Marino 737*6b445a62SJohn Marino /* **************************************************************** */ 738*6b445a62SJohn Marino /* */ 739*6b445a62SJohn Marino /* Controlling the Meta Key and Keypad */ 740*6b445a62SJohn Marino /* */ 741*6b445a62SJohn Marino /* **************************************************************** */ 742*6b445a62SJohn Marino 743*6b445a62SJohn Marino void 744*6b445a62SJohn Marino _rl_enable_meta_key () 745*6b445a62SJohn Marino { 746*6b445a62SJohn Marino #if !defined (__DJGPP__) 747*6b445a62SJohn Marino if (term_has_meta && _rl_term_mm) 748*6b445a62SJohn Marino tputs (_rl_term_mm, 1, _rl_output_character_function); 749*6b445a62SJohn Marino #endif 750*6b445a62SJohn Marino } 751*6b445a62SJohn Marino 752*6b445a62SJohn Marino void 753*6b445a62SJohn Marino _rl_control_keypad (on) 754*6b445a62SJohn Marino int on; 755*6b445a62SJohn Marino { 756*6b445a62SJohn Marino #if !defined (__DJGPP__) 757*6b445a62SJohn Marino if (on && _rl_term_ks) 758*6b445a62SJohn Marino tputs (_rl_term_ks, 1, _rl_output_character_function); 759*6b445a62SJohn Marino else if (!on && _rl_term_ke) 760*6b445a62SJohn Marino tputs (_rl_term_ke, 1, _rl_output_character_function); 761*6b445a62SJohn Marino #endif 762*6b445a62SJohn Marino } 763*6b445a62SJohn Marino 764*6b445a62SJohn Marino /* **************************************************************** */ 765*6b445a62SJohn Marino /* */ 766*6b445a62SJohn Marino /* Controlling the Cursor */ 767*6b445a62SJohn Marino /* */ 768*6b445a62SJohn Marino /* **************************************************************** */ 769*6b445a62SJohn Marino 770*6b445a62SJohn Marino /* Set the cursor appropriately depending on IM, which is one of the 771*6b445a62SJohn Marino insert modes (insert or overwrite). Insert mode gets the normal 772*6b445a62SJohn Marino cursor. Overwrite mode gets a very visible cursor. Only does 773*6b445a62SJohn Marino anything if we have both capabilities. */ 774*6b445a62SJohn Marino void 775*6b445a62SJohn Marino _rl_set_cursor (im, force) 776*6b445a62SJohn Marino int im, force; 777*6b445a62SJohn Marino { 778*6b445a62SJohn Marino #ifndef __MSDOS__ 779*6b445a62SJohn Marino if (_rl_term_ve && _rl_term_vs) 780*6b445a62SJohn Marino { 781*6b445a62SJohn Marino if (force || im != rl_insert_mode) 782*6b445a62SJohn Marino { 783*6b445a62SJohn Marino if (im == RL_IM_OVERWRITE) 784*6b445a62SJohn Marino tputs (_rl_term_vs, 1, _rl_output_character_function); 785*6b445a62SJohn Marino else 786*6b445a62SJohn Marino tputs (_rl_term_ve, 1, _rl_output_character_function); 787*6b445a62SJohn Marino } 788*6b445a62SJohn Marino } 789*6b445a62SJohn Marino #endif 790*6b445a62SJohn Marino } 791