1 /* rltty.c -- functions to prepare and restore the terminal for readline's
4 /* Copyright (C) 1992-2005 Free Software Foundation, Inc.
6 This file is part of the GNU Readline Library, a library for
7 reading lines of text with interactive input and history editing.
9 The GNU Readline Library is free software; you can redistribute it
10 and/or modify it under the terms of the GNU General Public License
11 as published by the Free Software Foundation; either version 2, or
12 (at your option) any later version.
14 The GNU Readline Library is distributed in the hope that it will be
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.
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 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
23 #define READLINE_LIBRARY
25 #if defined (HAVE_CONFIG_H)
26 # include "config_readline.h"
29 #include <sys/types.h>
34 #if defined (HAVE_UNISTD_H)
36 #endif /* HAVE_UNISTD_H */
40 #if defined (GWINSZ_IN_SYS_IOCTL)
41 # include <sys/ioctl.h>
42 #endif /* GWINSZ_IN_SYS_IOCTL */
46 #include "rlprivate.h"
52 rl_vintfunc_t
*rl_prep_term_function
= rl_prep_terminal
;
53 rl_voidfunc_t
*rl_deprep_term_function
= rl_deprep_terminal
;
55 static void block_sigint
PARAMS((void));
56 static void release_sigint
PARAMS((void));
58 static void set_winsize
PARAMS((int));
60 /* **************************************************************** */
62 /* Signal Management */
64 /* **************************************************************** */
66 #if defined (HAVE_POSIX_SIGNALS)
67 static sigset_t sigint_set
, sigint_oset
;
68 #else /* !HAVE_POSIX_SIGNALS */
69 # if defined (HAVE_BSD_SIGNALS)
70 static int sigint_oldmask
;
71 # endif /* HAVE_BSD_SIGNALS */
72 #endif /* !HAVE_POSIX_SIGNALS */
74 static int sigint_blocked
;
76 /* Cause SIGINT to not be delivered until the corresponding call to
84 #if defined (HAVE_POSIX_SIGNALS)
85 sigemptyset (&sigint_set
);
86 sigemptyset (&sigint_oset
);
87 sigaddset (&sigint_set
, SIGINT
);
88 sigprocmask (SIG_BLOCK
, &sigint_set
, &sigint_oset
);
89 #else /* !HAVE_POSIX_SIGNALS */
90 # if defined (HAVE_BSD_SIGNALS)
91 sigint_oldmask
= sigblock (sigmask (SIGINT
));
92 # else /* !HAVE_BSD_SIGNALS */
93 # if defined (HAVE_USG_SIGHOLD)
95 # endif /* HAVE_USG_SIGHOLD */
96 # endif /* !HAVE_BSD_SIGNALS */
97 #endif /* !HAVE_POSIX_SIGNALS */
102 /* Allow SIGINT to be delivered. */
106 if (sigint_blocked
== 0)
109 #if defined (HAVE_POSIX_SIGNALS)
110 sigprocmask (SIG_SETMASK
, &sigint_oset
, (sigset_t
*)NULL
);
112 # if defined (HAVE_BSD_SIGNALS)
113 sigsetmask (sigint_oldmask
);
114 # else /* !HAVE_BSD_SIGNALS */
115 # if defined (HAVE_USG_SIGHOLD)
117 # endif /* HAVE_USG_SIGHOLD */
118 # endif /* !HAVE_BSD_SIGNALS */
119 #endif /* !HAVE_POSIX_SIGNALS */
124 /* **************************************************************** */
126 /* Saving and Restoring the TTY */
128 /* **************************************************************** */
130 /* Non-zero means that the terminal is in a prepped state. */
131 static int terminal_prepped
;
133 static _RL_TTY_CHARS _rl_tty_chars
, _rl_last_tty_chars
;
135 /* If non-zero, means that this process has called tcflow(fd, TCOOFF)
136 and output is suspended. */
137 #if defined (__ksr1__)
141 /* Dummy call to force a backgrounded readline to stop before it tries
142 to get the tty settings. */
144 set_winsize (int tty
__attribute__((unused
)))
146 #if defined (TIOCGWINSZ)
149 if (ioctl (tty
, TIOCGWINSZ
, &w
) == 0)
150 (void) ioctl (tty
, TIOCSWINSZ
, &w
);
151 #endif /* TIOCGWINSZ */
154 #if defined (NO_TTY_DRIVER)
156 #elif defined (NEW_TTY_DRIVER)
158 /* Values for the `flags' field of a struct bsdtty. This tells which
159 elements of the struct bsdtty have been fetched from the system and
161 #define SGTTY_SET 0x01
162 #define LFLAG_SET 0x02
163 #define TCHARS_SET 0x04
164 #define LTCHARS_SET 0x08
167 struct sgttyb sgttyb
; /* Basic BSD tty driver information. */
168 int lflag
; /* Local mode flags, like LPASS8. */
169 #if defined (TIOCGETC)
170 struct tchars tchars
; /* Terminal special characters, including ^S and ^Q. */
172 #if defined (TIOCGLTC)
173 struct ltchars ltchars
; /* 4.2 BSD editing characters */
175 int flags
; /* Bitmap saying which parts of the struct are valid. */
178 #define TIOTYPE struct bsdtty
182 static void save_tty_chars
PARAMS((TIOTYPE
*));
183 static int _get_tty_settings
PARAMS((int, TIOTYPE
*));
184 static int get_tty_settings
PARAMS((int, TIOTYPE
*));
185 static int _set_tty_settings
PARAMS((int, TIOTYPE
*));
186 static int set_tty_settings
PARAMS((int, TIOTYPE
*));
188 static void prepare_terminal_settings
PARAMS((int, TIOTYPE
, TIOTYPE
*));
190 static void set_special_char
PARAMS((Keymap
, TIOTYPE
*, int, rl_command_func_t
));
193 save_tty_chars (tiop
)
196 _rl_last_tty_chars
= _rl_tty_chars
;
198 if (tiop
->flags
& SGTTY_SET
)
200 _rl_tty_chars
.t_erase
= tiop
->sgttyb
.sg_erase
;
201 _rl_tty_chars
.t_kill
= tiop
->sgttyb
.sg_kill
;
204 if (tiop
->flags
& TCHARS_SET
)
206 _rl_tty_chars
.t_intr
= tiop
->tchars
.t_intrc
;
207 _rl_tty_chars
.t_quit
= tiop
->tchars
.t_quitc
;
208 _rl_tty_chars
.t_start
= tiop
->tchars
.t_startc
;
209 _rl_tty_chars
.t_stop
= tiop
->tchars
.t_stopc
;
210 _rl_tty_chars
.t_eof
= tiop
->tchars
.t_eofc
;
211 _rl_tty_chars
.t_eol
= '\n';
212 _rl_tty_chars
.t_eol2
= tiop
->tchars
.t_brkc
;
215 if (tiop
->flags
& LTCHARS_SET
)
217 _rl_tty_chars
.t_susp
= tiop
->ltchars
.t_suspc
;
218 _rl_tty_chars
.t_dsusp
= tiop
->ltchars
.t_dsuspc
;
219 _rl_tty_chars
.t_reprint
= tiop
->ltchars
.t_rprntc
;
220 _rl_tty_chars
.t_flush
= tiop
->ltchars
.t_flushc
;
221 _rl_tty_chars
.t_werase
= tiop
->ltchars
.t_werasc
;
222 _rl_tty_chars
.t_lnext
= tiop
->ltchars
.t_lnextc
;
225 _rl_tty_chars
.t_status
= -1;
229 get_tty_settings (tty
, tiop
)
235 tiop
->flags
= tiop
->lflag
= 0;
238 if (ioctl (tty
, TIOCGETP
, &(tiop
->sgttyb
)) < 0)
240 tiop
->flags
|= SGTTY_SET
;
242 #if defined (TIOCLGET)
243 if (ioctl (tty
, TIOCLGET
, &(tiop
->lflag
)) == 0)
244 tiop
->flags
|= LFLAG_SET
;
247 #if defined (TIOCGETC)
248 if (ioctl (tty
, TIOCGETC
, &(tiop
->tchars
)) == 0)
249 tiop
->flags
|= TCHARS_SET
;
252 #if defined (TIOCGLTC)
253 if (ioctl (tty
, TIOCGLTC
, &(tiop
->ltchars
)) == 0)
254 tiop
->flags
|= LTCHARS_SET
;
261 set_tty_settings (tty
, tiop
)
265 if (tiop
->flags
& SGTTY_SET
)
267 ioctl (tty
, TIOCSETN
, &(tiop
->sgttyb
));
268 tiop
->flags
&= ~SGTTY_SET
;
270 readline_echoing_p
= 1;
272 #if defined (TIOCLSET)
273 if (tiop
->flags
& LFLAG_SET
)
275 ioctl (tty
, TIOCLSET
, &(tiop
->lflag
));
276 tiop
->flags
&= ~LFLAG_SET
;
280 #if defined (TIOCSETC)
281 if (tiop
->flags
& TCHARS_SET
)
283 ioctl (tty
, TIOCSETC
, &(tiop
->tchars
));
284 tiop
->flags
&= ~TCHARS_SET
;
288 #if defined (TIOCSLTC)
289 if (tiop
->flags
& LTCHARS_SET
)
291 ioctl (tty
, TIOCSLTC
, &(tiop
->ltchars
));
292 tiop
->flags
&= ~LTCHARS_SET
;
300 prepare_terminal_settings (meta_flag
, oldtio
, tiop
)
302 TIOTYPE oldtio
, *tiop
;
304 readline_echoing_p
= (oldtio
.sgttyb
.sg_flags
& ECHO
);
306 /* Copy the original settings to the structure we're going to use for
308 tiop
->sgttyb
= oldtio
.sgttyb
;
309 tiop
->lflag
= oldtio
.lflag
;
310 #if defined (TIOCGETC)
311 tiop
->tchars
= oldtio
.tchars
;
313 #if defined (TIOCGLTC)
314 tiop
->ltchars
= oldtio
.ltchars
;
316 tiop
->flags
= oldtio
.flags
;
318 /* First, the basic settings to put us into character-at-a-time, no-echo
320 tiop
->sgttyb
.sg_flags
&= ~(ECHO
| CRMOD
);
321 tiop
->sgttyb
.sg_flags
|= CBREAK
;
323 /* If this terminal doesn't care how the 8th bit is used, then we can
324 use it for the meta-key. If only one of even or odd parity is
325 specified, then the terminal is using parity, and we cannot. */
327 # define ANYP (EVENP | ODDP)
329 if (((oldtio
.sgttyb
.sg_flags
& ANYP
) == ANYP
) ||
330 ((oldtio
.sgttyb
.sg_flags
& ANYP
) == 0))
332 tiop
->sgttyb
.sg_flags
|= ANYP
;
334 /* Hack on local mode flags if we can. */
335 #if defined (TIOCLGET)
336 # if defined (LPASS8)
337 tiop
->lflag
|= LPASS8
;
339 #endif /* TIOCLGET */
342 #if defined (TIOCGETC)
343 # if defined (USE_XON_XOFF)
344 /* Get rid of terminal output start and stop characters. */
345 tiop
->tchars
.t_stopc
= -1; /* C-s */
346 tiop
->tchars
.t_startc
= -1; /* C-q */
348 /* If there is an XON character, bind it to restart the output. */
349 if (oldtio
.tchars
.t_startc
!= -1)
350 rl_bind_key (oldtio
.tchars
.t_startc
, rl_restart_output
);
351 # endif /* USE_XON_XOFF */
353 /* If there is an EOF char, bind _rl_eof_char to it. */
354 if (oldtio
.tchars
.t_eofc
!= -1)
355 _rl_eof_char
= oldtio
.tchars
.t_eofc
;
357 # if defined (NO_KILL_INTR)
358 /* Get rid of terminal-generated SIGQUIT and SIGINT. */
359 tiop
->tchars
.t_quitc
= -1; /* C-\ */
360 tiop
->tchars
.t_intrc
= -1; /* C-c */
361 # endif /* NO_KILL_INTR */
362 #endif /* TIOCGETC */
364 #if defined (TIOCGLTC)
365 /* Make the interrupt keys go away. Just enough to make people happy. */
366 tiop
->ltchars
.t_dsuspc
= -1; /* C-y */
367 tiop
->ltchars
.t_lnextc
= -1; /* C-v */
368 #endif /* TIOCGLTC */
371 #else /* !defined (NEW_TTY_DRIVER) */
381 #if defined (TERMIOS_TTY_DRIVER)
382 # define TIOTYPE struct termios
383 # define DRAIN_OUTPUT(fd) tcdrain (fd)
384 # define GETATTR(tty, tiop) (tcgetattr (tty, tiop))
386 # define SETATTR(tty, tiop) (tcsetattr (tty, TCSANOW, tiop))
388 # define SETATTR(tty, tiop) (tcsetattr (tty, TCSADRAIN, tiop))
389 # endif /* !M_UNIX */
391 # define TIOTYPE struct termio
392 # define DRAIN_OUTPUT(fd)
393 # define GETATTR(tty, tiop) (ioctl (tty, TCGETA, tiop))
394 # define SETATTR(tty, tiop) (ioctl (tty, TCSETAW, tiop))
395 #endif /* !TERMIOS_TTY_DRIVER */
399 static void save_tty_chars
PARAMS((TIOTYPE
*));
400 static int _get_tty_settings
PARAMS((int, TIOTYPE
*));
401 static int get_tty_settings
PARAMS((int, TIOTYPE
*));
402 static int _set_tty_settings
PARAMS((int, TIOTYPE
*));
403 static int set_tty_settings
PARAMS((int, TIOTYPE
*));
405 static void prepare_terminal_settings
PARAMS((int, TIOTYPE
, TIOTYPE
*));
407 static void set_special_char
PARAMS((Keymap
, TIOTYPE
*, int, rl_command_func_t
));
408 static void _rl_bind_tty_special_chars
PARAMS((Keymap
, TIOTYPE
));
411 # define OUTPUT_BEING_FLUSHED(tp) (tp->c_lflag & FLUSHO)
413 # define OUTPUT_BEING_FLUSHED(tp) 0
417 save_tty_chars (tiop
)
420 _rl_last_tty_chars
= _rl_tty_chars
;
422 _rl_tty_chars
.t_eof
= tiop
->c_cc
[VEOF
];
423 _rl_tty_chars
.t_eol
= tiop
->c_cc
[VEOL
];
425 _rl_tty_chars
.t_eol2
= tiop
->c_cc
[VEOL2
];
427 _rl_tty_chars
.t_erase
= tiop
->c_cc
[VERASE
];
429 _rl_tty_chars
.t_werase
= tiop
->c_cc
[VWERASE
];
431 _rl_tty_chars
.t_kill
= tiop
->c_cc
[VKILL
];
433 _rl_tty_chars
.t_reprint
= tiop
->c_cc
[VREPRINT
];
435 _rl_tty_chars
.t_intr
= tiop
->c_cc
[VINTR
];
436 _rl_tty_chars
.t_quit
= tiop
->c_cc
[VQUIT
];
438 _rl_tty_chars
.t_susp
= tiop
->c_cc
[VSUSP
];
441 _rl_tty_chars
.t_dsusp
= tiop
->c_cc
[VDSUSP
];
444 _rl_tty_chars
.t_start
= tiop
->c_cc
[VSTART
];
447 _rl_tty_chars
.t_stop
= tiop
->c_cc
[VSTOP
];
450 _rl_tty_chars
.t_lnext
= tiop
->c_cc
[VLNEXT
];
453 _rl_tty_chars
.t_flush
= tiop
->c_cc
[VDISCARD
];
456 _rl_tty_chars
.t_status
= tiop
->c_cc
[VSTATUS
];
460 #if defined (_AIX) || defined (_AIX41)
461 /* Currently this is only used on AIX */
466 fprintf (stderr
, "readline: warning: %s\n", msg
);
475 if ((tp
->c_oflag
& OPOST
) == 0)
477 rltty_warning ("turning on OPOST for terminal\r");
478 tp
->c_oflag
|= OPOST
|ONLCR
;
484 _get_tty_settings (tty
, tiop
)
492 ioctl_ret
= GETATTR (tty
, tiop
);
500 if (OUTPUT_BEING_FLUSHED (tiop
))
502 #if defined (FLUSHO) && defined (_AIX41)
503 rltty_warning ("turning off output flushing");
504 tiop
->c_lflag
&= ~FLUSHO
;
517 get_tty_settings (tty
, tiop
)
524 if (_get_tty_settings (tty
, tiop
) < 0)
535 _set_tty_settings (tty
, tiop
)
539 while (SETATTR (tty
, tiop
) < 0)
549 set_tty_settings (tty
, tiop
)
553 if (_set_tty_settings (tty
, tiop
) < 0)
558 #if defined (TERMIOS_TTY_DRIVER)
559 # if defined (__ksr1__)
566 tcflow (tty
, TCOON
); /* Simulate a ^Q. */
569 ioctl (tty
, TCXONC
, 1); /* Simulate a ^Q. */
570 #endif /* !TERMIOS_TTY_DRIVER */
578 prepare_terminal_settings (meta_flag
, oldtio
, tiop
)
580 TIOTYPE oldtio
, *tiop
;
582 readline_echoing_p
= (oldtio
.c_lflag
& ECHO
);
584 tiop
->c_lflag
&= ~(ICANON
| ECHO
);
586 if ((unsigned char) oldtio
.c_cc
[VEOF
] != (unsigned char) _POSIX_VDISABLE
)
587 _rl_eof_char
= oldtio
.c_cc
[VEOF
];
589 #if defined (USE_XON_XOFF)
591 tiop
->c_iflag
&= ~(IXON
| IXOFF
| IXANY
);
593 /* `strict' Posix systems do not define IXANY. */
594 tiop
->c_iflag
&= ~(IXON
| IXOFF
);
596 #endif /* USE_XON_XOFF */
598 /* Only turn this off if we are using all 8 bits. */
599 if (((tiop
->c_cflag
& CSIZE
) == CS8
) || meta_flag
)
600 tiop
->c_iflag
&= ~(ISTRIP
| INPCK
);
602 /* Make sure we differentiate between CR and NL on input. */
603 tiop
->c_iflag
&= ~(ICRNL
| INLCR
);
605 #if !defined (HANDLE_SIGNALS)
606 tiop
->c_lflag
&= ~ISIG
;
608 tiop
->c_lflag
|= ISIG
;
611 tiop
->c_cc
[VMIN
] = 1;
612 tiop
->c_cc
[VTIME
] = 0;
615 if (OUTPUT_BEING_FLUSHED (tiop
))
617 tiop
->c_lflag
&= ~FLUSHO
;
618 oldtio
.c_lflag
&= ~FLUSHO
;
622 /* Turn off characters that we need on Posix systems with job control,
623 just to be sure. This includes ^Y and ^V. This should not really
625 #if defined (TERMIOS_TTY_DRIVER) && defined (_POSIX_VDISABLE)
628 tiop
->c_cc
[VLNEXT
] = _POSIX_VDISABLE
;
632 tiop
->c_cc
[VDSUSP
] = _POSIX_VDISABLE
;
635 #endif /* TERMIOS_TTY_DRIVER && _POSIX_VDISABLE */
637 #endif /* !NEW_TTY_DRIVER */
639 /* Put the terminal in CBREAK mode so that we can detect key presses. */
640 #if defined (NO_TTY_DRIVER)
642 rl_prep_terminal (meta_flag
)
645 readline_echoing_p
= 1;
649 rl_deprep_terminal ()
653 #else /* ! NO_TTY_DRIVER */
655 rl_prep_terminal (meta_flag
)
661 if (terminal_prepped
)
664 /* Try to keep this function from being INTerrupted. */
667 tty
= fileno (rl_instream
);
669 if (get_tty_settings (tty
, &tio
) < 0)
671 #if defined (ENOTSUP)
672 /* MacOS X, at least, lies about the value of errno if tcgetattr fails. */
673 if (errno
== ENOTTY
|| errno
== ENOTSUP
)
677 readline_echoing_p
= 1; /* XXX */
684 if (_rl_bind_stty_chars
)
686 #if defined (VI_MODE)
687 /* If editing in vi mode, make sure we restore the bindings in the
688 insertion keymap no matter what keymap we ended up in. */
689 if (rl_editing_mode
== vi_mode
)
690 rl_tty_unset_default_bindings (vi_insertion_keymap
);
693 rl_tty_unset_default_bindings (_rl_keymap
);
695 save_tty_chars (&otio
);
696 RL_SETSTATE(RL_STATE_TTYCSAVED
);
697 if (_rl_bind_stty_chars
)
699 #if defined (VI_MODE)
700 /* If editing in vi mode, make sure we set the bindings in the
701 insertion keymap no matter what keymap we ended up in. */
702 if (rl_editing_mode
== vi_mode
)
703 _rl_bind_tty_special_chars (vi_insertion_keymap
, tio
);
706 _rl_bind_tty_special_chars (_rl_keymap
, tio
);
709 prepare_terminal_settings (meta_flag
, otio
, &tio
);
711 if (set_tty_settings (tty
, &tio
) < 0)
717 if (_rl_enable_keypad
)
718 _rl_control_keypad (1);
720 fflush (rl_outstream
);
721 terminal_prepped
= 1;
722 RL_SETSTATE(RL_STATE_TERMPREPPED
);
727 /* Restore the terminal's normal settings and modes. */
729 rl_deprep_terminal ()
733 if (!terminal_prepped
)
736 /* Try to keep this function from being interrupted. */
739 tty
= fileno (rl_instream
);
741 if (_rl_enable_keypad
)
742 _rl_control_keypad (0);
744 fflush (rl_outstream
);
746 if (set_tty_settings (tty
, &otio
) < 0)
752 terminal_prepped
= 0;
753 RL_UNSETSTATE(RL_STATE_TERMPREPPED
);
757 #endif /* !NO_TTY_DRIVER */
759 /* **************************************************************** */
761 /* Bogus Flow Control */
763 /* **************************************************************** */
766 rl_restart_output (count
, key
)
767 int count
__attribute__((unused
)), key
__attribute__((unused
));
769 #if defined (__MINGW32__)
771 #else /* !__MING32__ */
773 int fildes
= fileno (rl_outstream
);
774 #if defined (TIOCSTART)
776 ioctl (&fildes
, TIOCSTART
, 0);
778 ioctl (fildes
, TIOCSTART
, 0);
781 #else /* !TIOCSTART */
782 # if defined (TERMIOS_TTY_DRIVER)
783 # if defined (__ksr1__)
787 tcflow (fildes
, TCOON
);
790 tcflow (fildes
, TCOON
); /* Simulate a ^Q. */
792 # else /* !TERMIOS_TTY_DRIVER */
793 # if defined (TCXONC)
794 ioctl (fildes
, TCXONC
, TCOON
);
796 # endif /* !TERMIOS_TTY_DRIVER */
797 #endif /* !TIOCSTART */
800 #endif /* !__MINGW32__ */
804 rl_stop_output (count
, key
)
805 int count
__attribute__((unused
)), key
__attribute__((unused
));
807 #if defined (__MINGW32__)
811 int fildes
= fileno (rl_instream
);
813 #if defined (TIOCSTOP)
814 # if defined (apollo)
815 ioctl (&fildes
, TIOCSTOP
, 0);
817 ioctl (fildes
, TIOCSTOP
, 0);
819 #else /* !TIOCSTOP */
820 # if defined (TERMIOS_TTY_DRIVER)
821 # if defined (__ksr1__)
824 tcflow (fildes
, TCOOFF
);
826 # if defined (TCXONC)
827 ioctl (fildes
, TCXONC
, TCOON
);
829 # endif /* !TERMIOS_TTY_DRIVER */
830 #endif /* !TIOCSTOP */
833 #endif /* !__MINGW32__ */
836 /* **************************************************************** */
838 /* Default Key Bindings */
840 /* **************************************************************** */
842 #if !defined (NO_TTY_DRIVER)
843 #define SET_SPECIAL(sc, func) set_special_char(kmap, &ttybuff, sc, func)
846 #if defined (NO_TTY_DRIVER)
848 #define SET_SPECIAL(sc, func)
849 #define RESET_SPECIAL(c)
851 #elif defined (NEW_TTY_DRIVER)
853 set_special_char (kmap
, tiop
, sc
, func
)
857 rl_command_func_t
*func
;
859 if (sc
!= -1 && kmap
[(unsigned char)sc
].type
== ISFUNC
)
860 kmap
[(unsigned char)sc
].function
= func
;
863 #define RESET_SPECIAL(c) \
864 if (c != -1 && kmap[(unsigned char)c].type == ISFUNC)
865 kmap
[(unsigned char)c
].function
= rl_insert
;
868 _rl_bind_tty_special_chars (kmap
, ttybuff
)
872 if (ttybuff
.flags
& SGTTY_SET
)
874 SET_SPECIAL (ttybuff
.sgttyb
.sg_erase
, rl_rubout
);
875 SET_SPECIAL (ttybuff
.sgttyb
.sg_kill
, rl_unix_line_discard
);
878 # if defined (TIOCGLTC)
879 if (ttybuff
.flags
& LTCHARS_SET
)
881 SET_SPECIAL (ttybuff
.ltchars
.t_werasc
, rl_unix_word_rubout
);
882 SET_SPECIAL (ttybuff
.ltchars
.t_lnextc
, rl_quoted_insert
);
884 # endif /* TIOCGLTC */
887 #else /* !NEW_TTY_DRIVER */
889 set_special_char (kmap
, tiop
, sc
, func
)
893 rl_command_func_t
*func
;
898 if (uc
!= (unsigned char)_POSIX_VDISABLE
&& kmap
[uc
].type
== ISFUNC
)
899 kmap
[uc
].function
= func
;
903 #define RESET_SPECIAL(uc) \
904 if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC) \
905 kmap[uc].function = rl_insert;
908 _rl_bind_tty_special_chars (kmap
, ttybuff
)
912 SET_SPECIAL (VERASE
, rl_rubout
);
913 SET_SPECIAL (VKILL
, rl_unix_line_discard
);
915 # if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER)
916 SET_SPECIAL (VLNEXT
, rl_quoted_insert
);
917 # endif /* VLNEXT && TERMIOS_TTY_DRIVER */
919 # if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER)
920 SET_SPECIAL (VWERASE
, rl_unix_word_rubout
);
921 # endif /* VWERASE && TERMIOS_TTY_DRIVER */
924 #endif /* !NEW_TTY_DRIVER */
926 /* Set the system's default editing characters to their readline equivalents
927 in KMAP. Should be static, now that we have rl_tty_set_default_bindings. */
929 rltty_set_default_bindings (kmap
)
932 #if !defined (NO_TTY_DRIVER)
936 tty
= fileno (rl_instream
);
938 if (get_tty_settings (tty
, &ttybuff
) == 0)
939 _rl_bind_tty_special_chars (kmap
, ttybuff
);
943 /* New public way to set the system default editing chars to their readline
946 rl_tty_set_default_bindings (kmap
)
949 rltty_set_default_bindings (kmap
);
952 /* Rebind all of the tty special chars that readline worries about back
953 to self-insert. Call this before saving the current terminal special
954 chars with save_tty_chars(). This only works on POSIX termios or termio
957 rl_tty_unset_default_bindings (kmap
)
960 /* Don't bother before we've saved the tty special chars at least once. */
961 if (RL_ISSTATE(RL_STATE_TTYCSAVED
) == 0)
964 RESET_SPECIAL (_rl_tty_chars
.t_erase
);
965 RESET_SPECIAL (_rl_tty_chars
.t_kill
);
967 # if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER)
968 RESET_SPECIAL (_rl_tty_chars
.t_lnext
);
969 # endif /* VLNEXT && TERMIOS_TTY_DRIVER */
971 # if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER)
972 RESET_SPECIAL (_rl_tty_chars
.t_werase
);
973 # endif /* VWERASE && TERMIOS_TTY_DRIVER */
976 #if defined (HANDLE_SIGNALS)
978 #if defined (NEW_TTY_DRIVER) || defined (NO_TTY_DRIVER)
980 _rl_disable_tty_signals ()
986 _rl_restore_tty_signals ()
992 static TIOTYPE sigstty
, nosigstty
;
993 static int tty_sigs_disabled
= 0;
996 _rl_disable_tty_signals ()
998 if (tty_sigs_disabled
)
1001 if (_get_tty_settings (fileno (rl_instream
), &sigstty
) < 0)
1004 nosigstty
= sigstty
;
1006 nosigstty
.c_lflag
&= ~ISIG
;
1007 nosigstty
.c_iflag
&= ~IXON
;
1009 if (_set_tty_settings (fileno (rl_instream
), &nosigstty
) < 0)
1010 return (_set_tty_settings (fileno (rl_instream
), &sigstty
));
1012 tty_sigs_disabled
= 1;
1017 _rl_restore_tty_signals ()
1021 if (tty_sigs_disabled
== 0)
1024 r
= _set_tty_settings (fileno (rl_instream
), &sigstty
);
1027 tty_sigs_disabled
= 0;
1031 #endif /* !NEW_TTY_DRIVER */
1033 #endif /* HANDLE_SIGNALS */