I just re-read my example patch a little, and thought it might be
better to instead write:


  if ((GetTickCount () - t->last_ctrl_c) < MIN_CTRL_C_SLOP ||
      (GetEnvironmentVariable("CYGWIN_HANDLE_NONTTY_CTRL_C",
                              envBuf, MAX_PATH-1)==0 &&
       (!t->getpgid () || t->getpgid () != myself->pid)))
    return TRUE;

to avoid re-introducing a bug that I presume this timing check
was added to prevent ;->

Sorry about that.  Like I said, I don't claim it's clean.

Troy

-----Original Message-----
From: Troy Noble [mailto:[EMAIL PROTECTED]]
Sent: Friday, May 04, 2001 12:41 PM
To: '[EMAIL PROTECTED]'
Subject: Brainstorming a fix for CTRL-C handling in an emacs shell
buffer (non-TTY)


I have been reading through the list archives and the latest CVS 1.3.2 code
a bit today, so am pretty confident I understand most of the issues related
to CTRL-C not generating SIGINT when stdin is not a tty (like inside a
Win32 NTEmacs shell buffer).  Here's an earlier discussion on this same
subject:

   http://cygwin.com/ml/cygwin/2001-01/msg00578.html  and ff.

Would it be possible to add a new "CYGWIN=" option or environment variable
to allow one to turn on CTRL-C handling even if stdin is not a tty?

.../cygwin$ diff -b --unified=3 exceptions.cc-orig exceptions.cc
diff -b --unified=3 exceptions.cc-orig exceptions.cc
--- exceptions.cc-orig  Sun Apr 29 21:09:18 2001
+++ exceptions.cc       Fri May  4 12:10:44 2001
@@ -878,6 +878,7 @@
 static BOOL WINAPI
 ctrl_c_handler (DWORD type)
 {
+  static CHAR envBuf[MAX_PATH];
   if (type == CTRL_LOGOFF_EVENT)
     return TRUE;
 
@@ -892,8 +893,10 @@
   tty_min *t = cygwin_shared->tty.get_tty (myself->ctty);
   /* Ignore this if we're not the process group lead since it should be
handled
      *by* the process group leader. */
-  if (!t->getpgid () || t->getpgid () != myself->pid ||
-      (GetTickCount () - t->last_ctrl_c) < MIN_CTRL_C_SLOP)
+  if (GetEnvironmentVariable("CYGWIN_HANDLE_NONTTY_CTRL_C",
+                             envBuf, MAX_PATH-1)==0 &&
+      (!t->getpgid () || t->getpgid () != myself->pid ||
+       (GetTickCount () - t->last_ctrl_c) < MIN_CTRL_C_SLOP))
     return TRUE;
   else
     /* Otherwise we just send a SIGINT to the process group and return TRUE
(to indicate



I tried the above hack of the latest sources just to test my theory.  I
don't claim it's
the best way to do it, or even that it's "good" code.  I don't know enough
about
internals of CYGWIN to advocate one way or another whether it should be a
CYGWIN= or an environment variable.  But it would really be nice to have if
you can come up with a cleaner way to do it.

The only obvious side-effect I've observed thusfar is:

bash: [792: 1] tcsetattr: Not a character device

when I use CTRL-C inside emacs.  But the subprocess does get a SIGINT as I'd
like.

Outside of emacs, everything works as it always has.  For non-cygwin apps
running inside of emacs, I was still able to kill the processes as well
(Note
that I discovered a while back that I also had to NOT put "tty" in my
CYGWIN=
variable to allow me to kill non-cygwin processes... but that's possibly
another issue altogether).


P.S.  I did also read the discussion about switching to XEmacs built for
cygwin, but
would like to get it to work with native NTEmacs as well... since that's
what we use
here.  BTW, this same CTRL-C behavior did work in B20.1.  There was some
doubt about that in the prior e-mail thread.


--
Want to unsubscribe from this list?
Check out: http://cygwin.com/ml/#unsubscribe-simple

--
Want to unsubscribe from this list?
Check out: http://cygwin.com/ml/#unsubscribe-simple

Reply via email to