Deleted Added
full compact
terminal.c (75409) terminal.c (119614)
1/* $FreeBSD: head/contrib/libreadline/terminal.c 75409 2001-04-11 03:15:56Z ache $ */
2/* terminal.c -- controlling the terminal with termcap. */
3
4/* Copyright (C) 1996 Free Software Foundation, Inc.
5
6 This file is part of the GNU Readline Library, a library for
7 reading lines of text with interactive input and history editing.
8
9 The GNU Readline Library is free software; you can redistribute it

--- 5 unchanged lines hidden (view full) ---

15 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
16 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 The GNU General Public License is often shipped with GNU software, and
20 is generally kept in a file called COPYING or LICENSE. If you do not
21 have a copy of the license, write to the Free Software Foundation,
22 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
1/* terminal.c -- controlling the terminal with termcap. */
2
3/* Copyright (C) 1996 Free Software Foundation, Inc.
4
5 This file is part of the GNU Readline Library, a library for
6 reading lines of text with interactive input and history editing.
7
8 The GNU Readline Library is free software; you can redistribute it

--- 5 unchanged lines hidden (view full) ---

14 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
15 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 The GNU General Public License is often shipped with GNU software, and
19 is generally kept in a file called COPYING or LICENSE. If you do not
20 have a copy of the license, write to the Free Software Foundation,
21 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
22/* $FreeBSD: head/contrib/libreadline/terminal.c 119614 2003-08-31 18:29:38Z ache $ */
23#define READLINE_LIBRARY
24
25#if defined (HAVE_CONFIG_H)
26# include <config.h>
27#endif
28
29#include <sys/types.h>
30#include "posixstat.h"

--- 29 unchanged lines hidden (view full) ---

60#include "tcap.h"
61
62/* Some standard library routines. */
63#include "readline.h"
64#include "history.h"
65
66#include "rlprivate.h"
67#include "rlshell.h"
23#define READLINE_LIBRARY
24
25#if defined (HAVE_CONFIG_H)
26# include <config.h>
27#endif
28
29#include <sys/types.h>
30#include "posixstat.h"

--- 29 unchanged lines hidden (view full) ---

60#include "tcap.h"
61
62/* Some standard library routines. */
63#include "readline.h"
64#include "history.h"
65
66#include "rlprivate.h"
67#include "rlshell.h"
68#include "xmalloc.h"
68
69
70#define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay)
71#define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc)
72
69/* **************************************************************** */
70/* */
71/* Terminal and Termcap */
72/* */
73/* **************************************************************** */
74
75static char *term_buffer = (char *)NULL;
76static char *term_string_buffer = (char *)NULL;

--- 58 unchanged lines hidden (view full) ---

135
136/* How to initialize and reset the arrow keys, if this terminal has any. */
137static char *_rl_term_ks;
138static char *_rl_term_ke;
139
140/* The key sequences sent by the Home and End keys, if any. */
141static char *_rl_term_kh;
142static char *_rl_term_kH;
73/* **************************************************************** */
74/* */
75/* Terminal and Termcap */
76/* */
77/* **************************************************************** */
78
79static char *term_buffer = (char *)NULL;
80static char *term_string_buffer = (char *)NULL;

--- 58 unchanged lines hidden (view full) ---

139
140/* How to initialize and reset the arrow keys, if this terminal has any. */
141static char *_rl_term_ks;
142static char *_rl_term_ke;
143
144/* The key sequences sent by the Home and End keys, if any. */
145static char *_rl_term_kh;
146static char *_rl_term_kH;
147static char *_rl_term_at7; /* @7 */
143
148
149/* Insert key */
150static char *_rl_term_kI;
151
152/* Cursor control */
153static char *_rl_term_vs; /* very visible */
154static char *_rl_term_ve; /* normal */
155
156static void bind_termcap_arrow_keys PARAMS((Keymap));
157
144/* Variables that hold the screen dimensions, used by the display code. */
145int _rl_screenwidth, _rl_screenheight, _rl_screenchars;
146
147/* Non-zero means the user wants to enable the keypad. */
148int _rl_enable_keypad;
149
150/* Non-zero means the user wants to enable a meta key. */
151int _rl_enable_meta = 1;

--- 117 unchanged lines hidden (view full) ---

269}
270
271void
272rl_resize_terminal ()
273{
274 if (readline_echoing_p)
275 {
276 _rl_get_screen_size (fileno (rl_instream), 1);
158/* Variables that hold the screen dimensions, used by the display code. */
159int _rl_screenwidth, _rl_screenheight, _rl_screenchars;
160
161/* Non-zero means the user wants to enable the keypad. */
162int _rl_enable_keypad;
163
164/* Non-zero means the user wants to enable a meta key. */
165int _rl_enable_meta = 1;

--- 117 unchanged lines hidden (view full) ---

283}
284
285void
286rl_resize_terminal ()
287{
288 if (readline_echoing_p)
289 {
290 _rl_get_screen_size (fileno (rl_instream), 1);
277 _rl_redisplay_after_sigwinch ();
291 if (CUSTOM_REDISPLAY_FUNC ())
292 rl_forced_update_display ();
293 else
294 _rl_redisplay_after_sigwinch ();
278 }
279}
280
281struct _tc_string {
282 const char *tc_var;
283 char **tc_value;
284};
285
286/* This should be kept sorted, just in case we decide to change the
287 search algorithm to something smarter. */
288static struct _tc_string tc_strings[] =
289{
295 }
296}
297
298struct _tc_string {
299 const char *tc_var;
300 char **tc_value;
301};
302
303/* This should be kept sorted, just in case we decide to change the
304 search algorithm to something smarter. */
305static struct _tc_string tc_strings[] =
306{
307 { "@7", &_rl_term_at7 },
290 { "DC", &_rl_term_DC },
291 { "IC", &_rl_term_IC },
292 { "ce", &_rl_term_clreol },
293 { "cl", &_rl_term_clrpag },
294 { "cr", &_rl_term_cr },
295 { "dc", &_rl_term_dc },
296 { "ei", &_rl_term_ei },
297 { "ic", &_rl_term_ic },
298 { "im", &_rl_term_im },
308 { "DC", &_rl_term_DC },
309 { "IC", &_rl_term_IC },
310 { "ce", &_rl_term_clreol },
311 { "cl", &_rl_term_clrpag },
312 { "cr", &_rl_term_cr },
313 { "dc", &_rl_term_dc },
314 { "ei", &_rl_term_ei },
315 { "ic", &_rl_term_ic },
316 { "im", &_rl_term_im },
317 { "kH", &_rl_term_kH }, /* home down ?? */
318 { "kI", &_rl_term_kI }, /* insert */
299 { "kd", &_rl_term_kd },
319 { "kd", &_rl_term_kd },
320 { "ke", &_rl_term_ke }, /* end keypad mode */
300 { "kh", &_rl_term_kh }, /* home */
321 { "kh", &_rl_term_kh }, /* home */
301 { "@7", &_rl_term_kH }, /* end */
302 { "kl", &_rl_term_kl },
303 { "kr", &_rl_term_kr },
322 { "kl", &_rl_term_kl },
323 { "kr", &_rl_term_kr },
324 { "ks", &_rl_term_ks }, /* start keypad mode */
304 { "ku", &_rl_term_ku },
325 { "ku", &_rl_term_ku },
305 { "ks", &_rl_term_ks },
306 { "ke", &_rl_term_ke },
307 { "le", &_rl_term_backspace },
308 { "mm", &_rl_term_mm },
309 { "mo", &_rl_term_mo },
310#if defined (HACK_TERMCAP_MOTION)
311 { "nd", &_rl_term_forward_char },
312#endif
313 { "pc", &_rl_term_pc },
314 { "up", &_rl_term_up },
315 { "vb", &_rl_visible_bell },
326 { "le", &_rl_term_backspace },
327 { "mm", &_rl_term_mm },
328 { "mo", &_rl_term_mo },
329#if defined (HACK_TERMCAP_MOTION)
330 { "nd", &_rl_term_forward_char },
331#endif
332 { "pc", &_rl_term_pc },
333 { "up", &_rl_term_up },
334 { "vb", &_rl_visible_bell },
335 { "vs", &_rl_term_vs },
336 { "ve", &_rl_term_ve },
316};
317
318#define NUM_TC_STRINGS (sizeof (tc_strings) / sizeof (struct _tc_string))
319
320/* Read the desired terminal capability strings into BP. The capabilities
321 are described in the TC_STRINGS table. */
322static void
323get_term_capabilities (bp)
324 char **bp;
325{
326#if !defined (__DJGPP__) /* XXX - doesn't DJGPP have a termcap library? */
327 register int i;
328
329 for (i = 0; i < NUM_TC_STRINGS; i++)
337};
338
339#define NUM_TC_STRINGS (sizeof (tc_strings) / sizeof (struct _tc_string))
340
341/* Read the desired terminal capability strings into BP. The capabilities
342 are described in the TC_STRINGS table. */
343static void
344get_term_capabilities (bp)
345 char **bp;
346{
347#if !defined (__DJGPP__) /* XXX - doesn't DJGPP have a termcap library? */
348 register int i;
349
350 for (i = 0; i < NUM_TC_STRINGS; i++)
351# ifdef __LCC__
352 *(tc_strings[i].tc_value) = tgetstr ((char *)tc_strings[i].tc_var, bp);
353# else
330 *(tc_strings[i].tc_value) = tgetstr (tc_strings[i].tc_var, bp);
354 *(tc_strings[i].tc_value) = tgetstr (tc_strings[i].tc_var, bp);
355# endif
331#endif
332 tcap_initialized = 1;
333}
334
356#endif
357 tcap_initialized = 1;
358}
359
335#define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay)
336#define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc)
337
338int
339_rl_init_terminal_io (terminal_name)
340 const char *terminal_name;
341{
342 const char *term;
343 char *buffer;
344 int tty, tgetent_ret;
360int
361_rl_init_terminal_io (terminal_name)
362 const char *terminal_name;
363{
364 const char *term;
365 char *buffer;
366 int tty, tgetent_ret;
345 Keymap xkeymap;
346
347 term = terminal_name ? terminal_name : sh_get_env_value ("TERM");
348 _rl_term_clrpag = _rl_term_cr = _rl_term_clreol = (char *)NULL;
349 tty = rl_instream ? fileno (rl_instream) : 0;
350 _rl_screenwidth = _rl_screenheight = 0;
351
352 if (term == 0)
353 term = "dumb";
354
355 /* I've separated this out for later work on not calling tgetent at all
356 if the calling application has supplied a custom redisplay function,
357 (and possibly if the application has supplied a custom input function). */
358 if (CUSTOM_REDISPLAY_FUNC())
359 {
360 tgetent_ret = -1;
361 }
362 else
363 {
364 if (term_string_buffer == 0)
367
368 term = terminal_name ? terminal_name : sh_get_env_value ("TERM");
369 _rl_term_clrpag = _rl_term_cr = _rl_term_clreol = (char *)NULL;
370 tty = rl_instream ? fileno (rl_instream) : 0;
371 _rl_screenwidth = _rl_screenheight = 0;
372
373 if (term == 0)
374 term = "dumb";
375
376 /* I've separated this out for later work on not calling tgetent at all
377 if the calling application has supplied a custom redisplay function,
378 (and possibly if the application has supplied a custom input function). */
379 if (CUSTOM_REDISPLAY_FUNC())
380 {
381 tgetent_ret = -1;
382 }
383 else
384 {
385 if (term_string_buffer == 0)
365 term_string_buffer = xmalloc(2032);
386 term_string_buffer = (char *)xmalloc(2032);
366
367 if (term_buffer == 0)
387
388 if (term_buffer == 0)
368 term_buffer = xmalloc(4080);
389 term_buffer = (char *)xmalloc(4080);
369
370 buffer = term_string_buffer;
371
372 tgetent_ret = tgetent (term_buffer, term);
373 }
374
375 if (tgetent_ret <= 0)
376 {

--- 18 unchanged lines hidden (view full) ---

395 }
396
397 /* Everything below here is used by the redisplay code (tputs). */
398 _rl_screenchars = _rl_screenwidth * _rl_screenheight;
399 _rl_term_cr = "\r";
400 _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL;
401 _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL;
402 _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL;
390
391 buffer = term_string_buffer;
392
393 tgetent_ret = tgetent (term_buffer, term);
394 }
395
396 if (tgetent_ret <= 0)
397 {

--- 18 unchanged lines hidden (view full) ---

416 }
417
418 /* Everything below here is used by the redisplay code (tputs). */
419 _rl_screenchars = _rl_screenwidth * _rl_screenheight;
420 _rl_term_cr = "\r";
421 _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL;
422 _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL;
423 _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL;
424 _rl_term_kh = _rl_term_kH = _rl_term_kI = (char *)NULL;
425 _rl_term_ks = _rl_term_ke = _rl_term_at7 = (char *)NULL;
403 _rl_term_mm = _rl_term_mo = (char *)NULL;
426 _rl_term_mm = _rl_term_mo = (char *)NULL;
427 _rl_term_ve = _rl_term_vs = (char *)NULL;
404#if defined (HACK_TERMCAP_MOTION)
405 term_forward_char = (char *)NULL;
406#endif
407 _rl_terminal_can_insert = term_has_meta = 0;
408
409 /* Reasonable defaults for tgoto(). Readline currently only uses
410 tgoto if _rl_term_IC or _rl_term_DC is defined, but just in case we
411 change that later... */

--- 28 unchanged lines hidden (view full) ---

440 /* Check to see if this terminal has a meta key and clear the capability
441 variables if there is none. */
442 term_has_meta = (tgetflag ("km") || tgetflag ("MT"));
443 if (!term_has_meta)
444 _rl_term_mm = _rl_term_mo = (char *)NULL;
445
446 /* Attempt to find and bind the arrow keys. Do not override already
447 bound keys in an overzealous attempt, however. */
428#if defined (HACK_TERMCAP_MOTION)
429 term_forward_char = (char *)NULL;
430#endif
431 _rl_terminal_can_insert = term_has_meta = 0;
432
433 /* Reasonable defaults for tgoto(). Readline currently only uses
434 tgoto if _rl_term_IC or _rl_term_DC is defined, but just in case we
435 change that later... */

--- 28 unchanged lines hidden (view full) ---

464 /* Check to see if this terminal has a meta key and clear the capability
465 variables if there is none. */
466 term_has_meta = (tgetflag ("km") || tgetflag ("MT"));
467 if (!term_has_meta)
468 _rl_term_mm = _rl_term_mo = (char *)NULL;
469
470 /* Attempt to find and bind the arrow keys. Do not override already
471 bound keys in an overzealous attempt, however. */
448 xkeymap = _rl_keymap;
449
472
450 _rl_keymap = emacs_standard_keymap;
451 _rl_bind_if_unbound (_rl_term_ku, rl_get_previous_history);
452 _rl_bind_if_unbound (_rl_term_kd, rl_get_next_history);
453 _rl_bind_if_unbound (_rl_term_kr, rl_forward);
454 _rl_bind_if_unbound (_rl_term_kl, rl_backward);
473 bind_termcap_arrow_keys (emacs_standard_keymap);
455
474
456 _rl_bind_if_unbound (_rl_term_kh, rl_beg_of_line); /* Home */
457 _rl_bind_if_unbound (_rl_term_kH, rl_end_of_line); /* End */
458
459#if defined (VI_MODE)
475#if defined (VI_MODE)
460 _rl_keymap = vi_movement_keymap;
476 bind_termcap_arrow_keys (vi_movement_keymap);
477 bind_termcap_arrow_keys (vi_insertion_keymap);
478#endif /* VI_MODE */
479
480 return 0;
481}
482
483/* Bind the arrow key sequences from the termcap description in MAP. */
484static void
485bind_termcap_arrow_keys (map)
486 Keymap map;
487{
488 Keymap xkeymap;
489
490 xkeymap = _rl_keymap;
491 _rl_keymap = map;
492
461 _rl_bind_if_unbound (_rl_term_ku, rl_get_previous_history);
462 _rl_bind_if_unbound (_rl_term_kd, rl_get_next_history);
463 _rl_bind_if_unbound (_rl_term_kr, rl_forward);
464 _rl_bind_if_unbound (_rl_term_kl, rl_backward);
465
466 _rl_bind_if_unbound (_rl_term_kh, rl_beg_of_line); /* Home */
493 _rl_bind_if_unbound (_rl_term_ku, rl_get_previous_history);
494 _rl_bind_if_unbound (_rl_term_kd, rl_get_next_history);
495 _rl_bind_if_unbound (_rl_term_kr, rl_forward);
496 _rl_bind_if_unbound (_rl_term_kl, rl_backward);
497
498 _rl_bind_if_unbound (_rl_term_kh, rl_beg_of_line); /* Home */
467 _rl_bind_if_unbound (_rl_term_kH, rl_end_of_line); /* End */
468#endif /* VI_MODE */
499 _rl_bind_if_unbound (_rl_term_at7, rl_end_of_line); /* End */
469
470 _rl_keymap = xkeymap;
500
501 _rl_keymap = xkeymap;
471
472 return 0;
473}
474
475char *
476rl_get_termcap (cap)
477 const char *cap;
478{
479 register int i;
480

--- 120 unchanged lines hidden (view full) ---

601{
602#if !defined (__DJGPP__)
603 if (on && _rl_term_ks)
604 tputs (_rl_term_ks, 1, _rl_output_character_function);
605 else if (!on && _rl_term_ke)
606 tputs (_rl_term_ke, 1, _rl_output_character_function);
607#endif
608}
502}
503
504char *
505rl_get_termcap (cap)
506 const char *cap;
507{
508 register int i;
509

--- 120 unchanged lines hidden (view full) ---

630{
631#if !defined (__DJGPP__)
632 if (on && _rl_term_ks)
633 tputs (_rl_term_ks, 1, _rl_output_character_function);
634 else if (!on && _rl_term_ke)
635 tputs (_rl_term_ke, 1, _rl_output_character_function);
636#endif
637}
638
639/* **************************************************************** */
640/* */
641/* Controlling the Cursor */
642/* */
643/* **************************************************************** */
644
645/* Set the cursor appropriately depending on IM, which is one of the
646 insert modes (insert or overwrite). Insert mode gets the normal
647 cursor. Overwrite mode gets a very visible cursor. Only does
648 anything if we have both capabilities. */
649void
650_rl_set_cursor (im, force)
651 int im, force;
652{
653 if (_rl_term_ve && _rl_term_vs)
654 {
655 if (force || im != rl_insert_mode)
656 {
657 if (im == RL_IM_OVERWRITE)
658 tputs (_rl_term_vs, 1, _rl_output_character_function);
659 else
660 tputs (_rl_term_ve, 1, _rl_output_character_function);
661 }
662 }
663}