Terminal input processing fix
Christian LESTRADE
christian.lestrade@free.fr
Fri Jan 18 14:01:00 GMT 2002
Hello,
I would like to submit the following bugfix for theses bugs which appear
mainly when using rxvt:
* Unable to effectively disable c_cc[] input chars processing (like ^C) using
$ stty intr '^-'
When I type CTRL-SPACE, I enter a NULL char which is interpreted like ^C
* In raw mode (stty -icanon), the VDISCARD key (^O) should not be recognized,
but should be passed to the application
This fix does not prevent rxvt to hang when typing ^O in cooked mode, but only
in raw mode, instead of always.
Christian LESTRADE
mailto:christian.lestrade@free.fr
---------- winsup/cygwin/ChangeLog ----------
2002-01-18 Christian Lestrade <christian.lestrade@free.fr>
* fhandler_termios.cc (CC_EQUAL): New macro
(line_edit): Recognize disabled c_cc[] chars
Ignore VDISCARD when not in ICANON mode
---------- winsup/cygwin/fhandler_termios.cc.patch ----------
--- fhandler_termios.cc.orig Sun Aug 26 03:41:58 2001
+++ fhandler_termios.cc Tue Jan 15 11:49:04 2002
@@ -22,6 +22,18 @@
#include "pinfo.h"
#include "tty.h"
+/* Don't match caracters undefined with _POSIX_VDISABLE */
+#ifndef _POSIX_VDISABLE
+#define _POSIX_VDISABLE '\0'
+#endif
+
+/* Match char a with c_cc member b */
+/* Take care: types of a (char) and b (unsigned char)
+ don't have the same scope, so don't directly compare 'a'
+ with _POSIX_VDISABLE */
+#define CC_EQUAL(a, b) \
+ (((tc->ti.c_cc[b] != _POSIX_VDISABLE) && (a == tc->ti.c_cc[b])))
+
/* Common functions shared by tty/console */
void
@@ -207,11 +219,11 @@
if (tc->ti.c_lflag & ISIG)
{
int sig;
- if (c == tc->ti.c_cc[VINTR])
+ if (CC_EQUAL(c, VINTR))
sig = SIGINT;
- else if (c == tc->ti.c_cc[VQUIT])
+ else if (CC_EQUAL(c, VQUIT))
sig = SIGQUIT;
- else if (c == tc->ti.c_cc[VSUSP])
+ else if (CC_EQUAL(c, VSUSP))
sig = SIGTSTP;
else
goto not_a_sig;
@@ -226,7 +238,7 @@
not_a_sig:
if (tc->ti.c_iflag & IXON)
{
- if (c == tc->ti.c_cc[VSTOP])
+ if (CC_EQUAL(c, VSTOP))
{
if (!tc->output_stopped)
{
@@ -235,7 +247,7 @@
}
continue;
}
- else if (c == tc->ti.c_cc[VSTART])
+ else if (CC_EQUAL(c, VSTART))
{
restart_output:
tc->output_stopped = 0;
@@ -245,20 +257,20 @@
else if ((tc->ti.c_iflag & IXANY) && tc->output_stopped)
goto restart_output;
}
- if (tc->ti.c_lflag & IEXTEN && c == tc->ti.c_cc[VDISCARD])
+ if (iscanon && tc->ti.c_lflag & IEXTEN && CC_EQUAL(c, VDISCARD))
{
tc->ti.c_lflag ^= FLUSHO;
continue;
}
if (!iscanon)
/* nothing */;
- else if (c == tc->ti.c_cc[VERASE])
+ else if (CC_EQUAL(c, VERASE))
{
if (eat_readahead (1))
echo_erase ();
continue;
}
- else if (c == tc->ti.c_cc[VWERASE])
+ else if (CC_EQUAL(c, VWERASE))
{
int ch;
do
@@ -269,7 +281,7 @@
while ((ch = peek_readahead (1)) >= 0 && !isspace (ch));
continue;
}
- else if (c == tc->ti.c_cc[VKILL])
+ else if (CC_EQUAL(c, VKILL))
{
int nchars = eat_readahead (-1);
if (tc->ti.c_lflag & ECHO)
@@ -277,7 +289,7 @@
echo_erase (1);
continue;
}
- else if (c == tc->ti.c_cc[VREPRINT])
+ else if (CC_EQUAL(c, VREPRINT))
{
if (tc->ti.c_lflag & ECHO)
{
@@ -286,14 +298,14 @@
}
continue;
}
- else if (c == tc->ti.c_cc[VEOF])
+ else if (CC_EQUAL(c, VEOF))
{
termios_printf ("EOF");
input_done = 1;
continue;
}
- else if (c == tc->ti.c_cc[VEOL] ||
- c == tc->ti.c_cc[VEOL2] ||
+ else if (CC_EQUAL(c, VEOL) ||
+ CC_EQUAL(c, VEOL2) ||
c == '\n')
{
set_input_done (1);
More information about the Cygwin-patches
mailing list