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