1 /* rltty.c -- functions to prepare and restore the terminal for readline's
4 /* Copyright (C) 1992 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 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
23 #define READLINE_LIBRARY
25 #if defined (HAVE_CONFIG_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. */
147 #if defined (TIOCGWINSZ)
150 if (ioctl (tty
, TIOCGWINSZ
, &w
) == 0)
151 (void) ioctl (tty
, TIOCSWINSZ
, &w
);
152 #endif /* TIOCGWINSZ */
155 #if defined (NEW_TTY_DRIVER)
157 /* Values for the `flags' field of a struct bsdtty. This tells which
158 elements of the struct bsdtty have been fetched from the system and
160 #define SGTTY_SET 0x01
161 #define LFLAG_SET 0x02
162 #define TCHARS_SET 0x04
163 #define LTCHARS_SET 0x08
166 struct sgttyb sgttyb
; /* Basic BSD tty driver information. */
167 int lflag
; /* Local mode flags, like LPASS8. */
168 #if defined (TIOCGETC)
169 struct tchars tchars
; /* Terminal special characters, including ^S and ^Q. */
171 #if defined (TIOCGLTC)
172 struct ltchars ltchars
; /* 4.2 BSD editing characters */
174 int flags
; /* Bitmap saying which parts of the struct are valid. */
177 #define TIOTYPE struct bsdtty
181 static void save_tty_chars
PARAMS((TIOTYPE
*));
182 static int _get_tty_settings
PARAMS((int, TIOTYPE
*));
183 static int get_tty_settings
PARAMS((int, TIOTYPE
*));
184 static int _set_tty_settings
PARAMS((int, TIOTYPE
*));
185 static int set_tty_settings
PARAMS((int, TIOTYPE
*));
187 static void prepare_terminal_settings
PARAMS((int, TIOTYPE
, TIOTYPE
*));
189 static void set_special_char
PARAMS((Keymap
, TIOTYPE
*, int, rl_command_func_t
));
192 save_tty_chars (tiop
)
195 _rl_last_tty_chars
= _rl_tty_chars
;
197 if (tiop
->flags
& SGTTY_SET
)
199 _rl_tty_chars
.t_erase
= tiop
->sgttyb
.sg_erase
;
200 _rl_tty_chars
.t_kill
= tiop
->sgttyb
.sg_kill
;
203 if (tiop
->flags
& TCHARS_SET
)
205 _rl_tty_chars
.t_intr
= tiop
->tchars
.t_intrc
;
206 _rl_tty_chars
.t_quit
= tiop
->tchars
.t_quitc
;
207 _rl_tty_chars
.t_start
= tiop
->tchars
.t_startc
;
208 _rl_tty_chars
.t_stop
= tiop
->tchars
.t_stopc
;
209 _rl_tty_chars
.t_eof
= tiop
->tchars
.t_eofc
;
210 _rl_tty_chars
.t_eol
= '\n';
211 _rl_tty_chars
.t_eol2
= tiop
->tchars
.t_brkc
;
214 if (tiop
->flags
& LTCHARS_SET
)
216 _rl_tty_chars
.t_susp
= tiop
->ltchars
.t_suspc
;
217 _rl_tty_chars
.t_dsusp
= tiop
->ltchars
.t_dsuspc
;
218 _rl_tty_chars
.t_reprint
= tiop
->ltchars
.t_rprntc
;
219 _rl_tty_chars
.t_flush
= tiop
->ltchars
.t_flushc
;
220 _rl_tty_chars
.t_werase
= tiop
->ltchars
.t_werasc
;
221 _rl_tty_chars
.t_lnext
= tiop
->ltchars
.t_lnextc
;
224 _rl_tty_chars
.t_status
= -1;
228 get_tty_settings (tty
, tiop
)
234 tiop
->flags
= tiop
->lflag
= 0;
236 if (ioctl (tty
, TIOCGETP
, &(tiop
->sgttyb
)) < 0)
238 tiop
->flags
|= SGTTY_SET
;
240 #if defined (TIOCLGET)
241 if (ioctl (tty
, TIOCLGET
, &(tiop
->lflag
)) == 0)
242 tiop
->flags
|= LFLAG_SET
;
245 #if defined (TIOCGETC)
246 if (ioctl (tty
, TIOCGETC
, &(tiop
->tchars
)) == 0)
247 tiop
->flags
|= TCHARS_SET
;
250 #if defined (TIOCGLTC)
251 if (ioctl (tty
, TIOCGLTC
, &(tiop
->ltchars
)) == 0)
252 tiop
->flags
|= LTCHARS_SET
;
259 set_tty_settings (tty
, tiop
)
263 if (tiop
->flags
& SGTTY_SET
)
265 ioctl (tty
, TIOCSETN
, &(tiop
->sgttyb
));
266 tiop
->flags
&= ~SGTTY_SET
;
268 readline_echoing_p
= 1;
270 #if defined (TIOCLSET)
271 if (tiop
->flags
& LFLAG_SET
)
273 ioctl (tty
, TIOCLSET
, &(tiop
->lflag
));
274 tiop
->flags
&= ~LFLAG_SET
;
278 #if defined (TIOCSETC)
279 if (tiop
->flags
& TCHARS_SET
)
281 ioctl (tty
, TIOCSETC
, &(tiop
->tchars
));
282 tiop
->flags
&= ~TCHARS_SET
;
286 #if defined (TIOCSLTC)
287 if (tiop
->flags
& LTCHARS_SET
)
289 ioctl (tty
, TIOCSLTC
, &(tiop
->ltchars
));
290 tiop
->flags
&= ~LTCHARS_SET
;
298 prepare_terminal_settings (meta_flag
, oldtio
, tiop
)
300 TIOTYPE oldtio
, *tiop
;
302 readline_echoing_p
= (oldtio
.sgttyb
.sg_flags
& ECHO
);
304 /* Copy the original settings to the structure we're going to use for
306 tiop
->sgttyb
= oldtio
.sgttyb
;
307 tiop
->lflag
= oldtio
.lflag
;
308 #if defined (TIOCGETC)
309 tiop
->tchars
= oldtio
.tchars
;
311 #if defined (TIOCGLTC)
312 tiop
->ltchars
= oldtio
.ltchars
;
314 tiop
->flags
= oldtio
.flags
;
316 /* First, the basic settings to put us into character-at-a-time, no-echo
318 tiop
->sgttyb
.sg_flags
&= ~(ECHO
| CRMOD
);
319 tiop
->sgttyb
.sg_flags
|= CBREAK
;
321 /* If this terminal doesn't care how the 8th bit is used, then we can
322 use it for the meta-key. If only one of even or odd parity is
323 specified, then the terminal is using parity, and we cannot. */
325 # define ANYP (EVENP | ODDP)
327 if (((oldtio
.sgttyb
.sg_flags
& ANYP
) == ANYP
) ||
328 ((oldtio
.sgttyb
.sg_flags
& ANYP
) == 0))
330 tiop
->sgttyb
.sg_flags
|= ANYP
;
332 /* Hack on local mode flags if we can. */
333 #if defined (TIOCLGET)
334 # if defined (LPASS8)
335 tiop
->lflag
|= LPASS8
;
337 #endif /* TIOCLGET */
340 #if defined (TIOCGETC)
341 # if defined (USE_XON_XOFF)
342 /* Get rid of terminal output start and stop characters. */
343 tiop
->tchars
.t_stopc
= -1; /* C-s */
344 tiop
->tchars
.t_startc
= -1; /* C-q */
346 /* If there is an XON character, bind it to restart the output. */
347 if (oldtio
.tchars
.t_startc
!= -1)
348 rl_bind_key (oldtio
.tchars
.t_startc
, rl_restart_output
);
349 # endif /* USE_XON_XOFF */
351 /* If there is an EOF char, bind _rl_eof_char to it. */
352 if (oldtio
.tchars
.t_eofc
!= -1)
353 _rl_eof_char
= oldtio
.tchars
.t_eofc
;
355 # if defined (NO_KILL_INTR)
356 /* Get rid of terminal-generated SIGQUIT and SIGINT. */
357 tiop
->tchars
.t_quitc
= -1; /* C-\ */
358 tiop
->tchars
.t_intrc
= -1; /* C-c */
359 # endif /* NO_KILL_INTR */
360 #endif /* TIOCGETC */
362 #if defined (TIOCGLTC)
363 /* Make the interrupt keys go away. Just enough to make people happy. */
364 tiop
->ltchars
.t_dsuspc
= -1; /* C-y */
365 tiop
->ltchars
.t_lnextc
= -1; /* C-v */
366 #endif /* TIOCGLTC */
369 #else /* !defined (NEW_TTY_DRIVER) */
379 #if defined (TERMIOS_TTY_DRIVER)
380 # define TIOTYPE struct termios
381 # define DRAIN_OUTPUT(fd) tcdrain (fd)
382 # define GETATTR(tty, tiop) (tcgetattr (tty, tiop))
384 # define SETATTR(tty, tiop) (tcsetattr (tty, TCSANOW, tiop))
386 # define SETATTR(tty, tiop) (tcsetattr (tty, TCSADRAIN, tiop))
387 # endif /* !M_UNIX */
389 # define TIOTYPE struct termio
390 # define DRAIN_OUTPUT(fd)
391 # define GETATTR(tty, tiop) (ioctl (tty, TCGETA, tiop))
392 # define SETATTR(tty, tiop) (ioctl (tty, TCSETAW, tiop))
393 #endif /* !TERMIOS_TTY_DRIVER */
397 static void save_tty_chars
PARAMS((TIOTYPE
*));
398 static int _get_tty_settings
PARAMS((int, TIOTYPE
*));
399 static int get_tty_settings
PARAMS((int, TIOTYPE
*));
400 static int _set_tty_settings
PARAMS((int, TIOTYPE
*));
401 static int set_tty_settings
PARAMS((int, TIOTYPE
*));
403 static void prepare_terminal_settings
PARAMS((int, TIOTYPE
, TIOTYPE
*));
405 static void set_special_char
PARAMS((Keymap
, TIOTYPE
*, int, rl_command_func_t
));
406 static void _rl_bind_tty_special_chars
PARAMS((Keymap
, TIOTYPE
));
409 # define OUTPUT_BEING_FLUSHED(tp) (tp->c_lflag & FLUSHO)
411 # define OUTPUT_BEING_FLUSHED(tp) 0
415 save_tty_chars (tiop
)
418 _rl_last_tty_chars
= _rl_tty_chars
;
420 _rl_tty_chars
.t_eof
= tiop
->c_cc
[VEOF
];
421 _rl_tty_chars
.t_eol
= tiop
->c_cc
[VEOL
];
423 _rl_tty_chars
.t_eol2
= tiop
->c_cc
[VEOL2
];
425 _rl_tty_chars
.t_erase
= tiop
->c_cc
[VERASE
];
427 _rl_tty_chars
.t_werase
= tiop
->c_cc
[VWERASE
];
429 _rl_tty_chars
.t_kill
= tiop
->c_cc
[VKILL
];
431 _rl_tty_chars
.t_reprint
= tiop
->c_cc
[VREPRINT
];
433 _rl_tty_chars
.t_intr
= tiop
->c_cc
[VINTR
];
434 _rl_tty_chars
.t_quit
= tiop
->c_cc
[VQUIT
];
436 _rl_tty_chars
.t_susp
= tiop
->c_cc
[VSUSP
];
439 _rl_tty_chars
.t_dsusp
= tiop
->c_cc
[VDSUSP
];
442 _rl_tty_chars
.t_start
= tiop
->c_cc
[VSTART
];
445 _rl_tty_chars
.t_stop
= tiop
->c_cc
[VSTOP
];
448 _rl_tty_chars
.t_lnext
= tiop
->c_cc
[VLNEXT
];
451 _rl_tty_chars
.t_flush
= tiop
->c_cc
[VDISCARD
];
454 _rl_tty_chars
.t_status
= tiop
->c_cc
[VSTATUS
];
458 #if defined (_AIX) || defined (_AIX41)
459 /* Currently this is only used on AIX */
464 fprintf (stderr
, "readline: warning: %s\n", msg
);
473 if ((tp
->c_oflag
& OPOST
) == 0)
475 rltty_warning ("turning on OPOST for terminal\r");
476 tp
->c_oflag
|= OPOST
|ONLCR
;
482 _get_tty_settings (tty
, tiop
)
490 ioctl_ret
= GETATTR (tty
, tiop
);
498 if (OUTPUT_BEING_FLUSHED (tiop
))
500 #if defined (FLUSHO) && defined (_AIX41)
501 rltty_warning ("turning off output flushing");
502 tiop
->c_lflag
&= ~FLUSHO
;
515 get_tty_settings (tty
, tiop
)
521 if (_get_tty_settings (tty
, tiop
) < 0)
532 _set_tty_settings (tty
, tiop
)
536 while (SETATTR (tty
, tiop
) < 0)
546 set_tty_settings (tty
, tiop
)
550 if (_set_tty_settings (tty
, tiop
) < 0)
555 #if defined (TERMIOS_TTY_DRIVER)
556 # if defined (__ksr1__)
563 tcflow (tty
, TCOON
); /* Simulate a ^Q. */
566 ioctl (tty
, TCXONC
, 1); /* Simulate a ^Q. */
567 #endif /* !TERMIOS_TTY_DRIVER */
575 prepare_terminal_settings (meta_flag
, oldtio
, tiop
)
577 TIOTYPE oldtio
, *tiop
;
579 readline_echoing_p
= (oldtio
.c_lflag
& ECHO
);
581 tiop
->c_lflag
&= ~(ICANON
| ECHO
);
583 if ((unsigned char) oldtio
.c_cc
[VEOF
] != (unsigned char) _POSIX_VDISABLE
)
584 _rl_eof_char
= oldtio
.c_cc
[VEOF
];
586 #if defined (USE_XON_XOFF)
588 tiop
->c_iflag
&= ~(IXON
| IXOFF
| IXANY
);
590 /* `strict' Posix systems do not define IXANY. */
591 tiop
->c_iflag
&= ~(IXON
| IXOFF
);
593 #endif /* USE_XON_XOFF */
595 /* Only turn this off if we are using all 8 bits. */
596 if (((tiop
->c_cflag
& CSIZE
) == CS8
) || meta_flag
)
597 tiop
->c_iflag
&= ~(ISTRIP
| INPCK
);
599 /* Make sure we differentiate between CR and NL on input. */
600 tiop
->c_iflag
&= ~(ICRNL
| INLCR
);
602 #if !defined (HANDLE_SIGNALS)
603 tiop
->c_lflag
&= ~ISIG
;
605 tiop
->c_lflag
|= ISIG
;
608 tiop
->c_cc
[VMIN
] = 1;
609 tiop
->c_cc
[VTIME
] = 0;
612 if (OUTPUT_BEING_FLUSHED (tiop
))
614 tiop
->c_lflag
&= ~FLUSHO
;
615 oldtio
.c_lflag
&= ~FLUSHO
;
619 /* Turn off characters that we need on Posix systems with job control,
620 just to be sure. This includes ^Y and ^V. This should not really
622 #if defined (TERMIOS_TTY_DRIVER) && defined (_POSIX_VDISABLE)
625 tiop
->c_cc
[VLNEXT
] = _POSIX_VDISABLE
;
629 tiop
->c_cc
[VDSUSP
] = _POSIX_VDISABLE
;
632 #endif /* TERMIOS_TTY_DRIVER && _POSIX_VDISABLE */
634 #endif /* NEW_TTY_DRIVER */
636 /* Put the terminal in CBREAK mode so that we can detect key presses. */
638 rl_prep_terminal (meta_flag
)
644 if (terminal_prepped
)
647 /* Try to keep this function from being INTerrupted. */
650 tty
= fileno (rl_instream
);
652 if (get_tty_settings (tty
, &tio
) < 0)
660 rl_tty_unset_default_bindings (_rl_keymap
);
661 save_tty_chars (&otio
);
662 RL_SETSTATE(RL_STATE_TTYCSAVED
);
663 _rl_bind_tty_special_chars (_rl_keymap
, tio
);
665 prepare_terminal_settings (meta_flag
, otio
, &tio
);
667 if (set_tty_settings (tty
, &tio
) < 0)
673 if (_rl_enable_keypad
)
674 _rl_control_keypad (1);
676 fflush (rl_outstream
);
677 terminal_prepped
= 1;
678 RL_SETSTATE(RL_STATE_TERMPREPPED
);
683 /* Restore the terminal's normal settings and modes. */
685 rl_deprep_terminal ()
689 if (!terminal_prepped
)
692 /* Try to keep this function from being interrupted. */
695 tty
= fileno (rl_instream
);
697 if (_rl_enable_keypad
)
698 _rl_control_keypad (0);
700 fflush (rl_outstream
);
702 if (set_tty_settings (tty
, &otio
) < 0)
708 terminal_prepped
= 0;
709 RL_UNSETSTATE(RL_STATE_TERMPREPPED
);
714 /* **************************************************************** */
716 /* Bogus Flow Control */
718 /* **************************************************************** */
721 rl_restart_output (count
, key
)
724 int fildes
= fileno (rl_outstream
);
725 #if defined (TIOCSTART)
727 ioctl (&fildes
, TIOCSTART
, 0);
729 ioctl (fildes
, TIOCSTART
, 0);
732 #else /* !TIOCSTART */
733 # if defined (TERMIOS_TTY_DRIVER)
734 # if defined (__ksr1__)
738 tcflow (fildes
, TCOON
);
741 tcflow (fildes
, TCOON
); /* Simulate a ^Q. */
743 # else /* !TERMIOS_TTY_DRIVER */
744 # if defined (TCXONC)
745 ioctl (fildes
, TCXONC
, TCOON
);
747 # endif /* !TERMIOS_TTY_DRIVER */
748 #endif /* !TIOCSTART */
754 rl_stop_output (count
, key
)
757 int fildes
= fileno (rl_instream
);
759 #if defined (TIOCSTOP)
760 # if defined (apollo)
761 ioctl (&fildes
, TIOCSTOP
, 0);
763 ioctl (fildes
, TIOCSTOP
, 0);
765 #else /* !TIOCSTOP */
766 # if defined (TERMIOS_TTY_DRIVER)
767 # if defined (__ksr1__)
770 tcflow (fildes
, TCOOFF
);
772 # if defined (TCXONC)
773 ioctl (fildes
, TCXONC
, TCOON
);
775 # endif /* !TERMIOS_TTY_DRIVER */
776 #endif /* !TIOCSTOP */
781 /* **************************************************************** */
783 /* Default Key Bindings */
785 /* **************************************************************** */
787 #define SET_SPECIAL(sc, func) set_special_char(kmap, &ttybuff, sc, func)
789 #if defined (NEW_TTY_DRIVER)
791 set_special_char (kmap
, tiop
, sc
, func
)
795 rl_command_func_t
*func
;
797 if (sc
!= -1 && kmap
[(unsigned char)sc
].type
== ISFUNC
)
798 kmap
[(unsigned char)sc
].function
= func
;
801 #define RESET_SPECIAL(c) \
802 if (c != -1 && kmap[(unsigned char)c].type == ISFUNC)
803 kmap
[(unsigned char)c
].function
= rl_insert
;
806 _rl_bind_tty_special_chars (kmap
, ttybuff
)
810 if (ttybuff
.flags
& SGTTY_SET
)
812 SET_SPECIAL (ttybuff
.sgttyb
.sg_erase
, rl_rubout
);
813 SET_SPECIAL (ttybuff
.sgttyb
.sg_kill
, rl_unix_line_discard
);
816 # if defined (TIOCGLTC)
817 if (ttybuff
.flags
& LTCHARS_SET
)
819 SET_SPECIAL (ttybuff
.ltchars
.t_werasc
, rl_unix_word_rubout
);
820 SET_SPECIAL (ttybuff
.ltchars
.t_lnextc
, rl_quoted_insert
);
822 # endif /* TIOCGLTC */
825 #else /* !NEW_TTY_DRIVER */
827 set_special_char (kmap
, tiop
, sc
, func
)
831 rl_command_func_t
*func
;
836 if (uc
!= (unsigned char)_POSIX_VDISABLE
&& kmap
[uc
].type
== ISFUNC
)
837 kmap
[uc
].function
= func
;
841 #define RESET_SPECIAL(uc) \
842 if (uc != (unsigned char)_POSIX_VDISABLE && kmap[uc].type == ISFUNC) \
843 kmap[uc].function = rl_insert;
846 _rl_bind_tty_special_chars (kmap
, ttybuff
)
850 SET_SPECIAL (VERASE
, rl_rubout
);
851 SET_SPECIAL (VKILL
, rl_unix_line_discard
);
853 # if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER)
854 SET_SPECIAL (VLNEXT
, rl_quoted_insert
);
855 # endif /* VLNEXT && TERMIOS_TTY_DRIVER */
857 # if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER)
858 SET_SPECIAL (VWERASE
, rl_unix_word_rubout
);
859 # endif /* VWERASE && TERMIOS_TTY_DRIVER */
862 #endif /* !NEW_TTY_DRIVER */
864 /* Set the system's default editing characters to their readline equivalents
865 in KMAP. Should be static, now that we have rl_tty_set_default_bindings. */
867 rltty_set_default_bindings (kmap
)
872 static int called
= 0;
874 tty
= fileno (rl_instream
);
876 if (get_tty_settings (tty
, &ttybuff
) == 0)
877 _rl_bind_tty_special_chars (kmap
, ttybuff
);
880 /* New public way to set the system default editing chars to their readline
883 rl_tty_set_default_bindings (kmap
)
886 rltty_set_default_bindings (kmap
);
889 /* Rebind all of the tty special chars that readline worries about back
890 to self-insert. Call this before saving the current terminal special
891 chars with save_tty_chars(). This only works on POSIX termios or termio
894 rl_tty_unset_default_bindings (kmap
)
897 /* Don't bother before we've saved the tty special chars at least once. */
898 if (RL_ISSTATE(RL_STATE_TTYCSAVED
) == 0)
901 RESET_SPECIAL (_rl_tty_chars
.t_erase
);
902 RESET_SPECIAL (_rl_tty_chars
.t_kill
);
904 # if defined (VLNEXT) && defined (TERMIOS_TTY_DRIVER)
905 RESET_SPECIAL (_rl_tty_chars
.t_lnext
);
906 # endif /* VLNEXT && TERMIOS_TTY_DRIVER */
908 # if defined (VWERASE) && defined (TERMIOS_TTY_DRIVER)
909 RESET_SPECIAL (_rl_tty_chars
.t_werase
);
910 # endif /* VWERASE && TERMIOS_TTY_DRIVER */
913 #if defined (HANDLE_SIGNALS)
915 #if defined (NEW_TTY_DRIVER)
917 _rl_disable_tty_signals ()
923 _rl_restore_tty_signals ()
929 static TIOTYPE sigstty
, nosigstty
;
930 static int tty_sigs_disabled
= 0;
933 _rl_disable_tty_signals ()
935 if (tty_sigs_disabled
)
938 if (_get_tty_settings (fileno (rl_instream
), &sigstty
) < 0)
943 nosigstty
.c_lflag
&= ~ISIG
;
944 nosigstty
.c_iflag
&= ~IXON
;
946 if (_set_tty_settings (fileno (rl_instream
), &nosigstty
) < 0)
947 return (_set_tty_settings (fileno (rl_instream
), &sigstty
));
949 tty_sigs_disabled
= 1;
954 _rl_restore_tty_signals ()
958 if (tty_sigs_disabled
== 0)
961 r
= _set_tty_settings (fileno (rl_instream
), &sigstty
);
964 tty_sigs_disabled
= 0;
968 #endif /* !NEW_TTY_DRIVER */
970 #endif /* HANDLE_SIGNALS */