From: Andy K. <and...@gm...> - 2011-02-23 16:53:48
|
2011/2/23 Mathias Fröhlich: > On Tuesday 22 February 2011, Andy Koppe wrote: >> The answer is: it doesn't. Line editing and the interpretation of all >> the other termios flags are implemented on the slave side of the >> pseudo terminal device. On Linux, that's done in the kernel; in MSYS, >> it's done in the DLL. Mintty never looks at any of that, apart from >> when it first creates the shell process, where it sets a few termios >> flags. After that, it just processes whatever comes in via read()s >> from the master side of the pty device, including any escape >> sequences. Remember it's emulating a terminal that would have been >> connected to the host via a plain ol' serial cable. > > Hmm, so, if the client application does not need to switch off canonical mode > in mintty and consequently the client stuffs together line editing in its own > msys.dll, I expect that I can read every keypress on the named pipe that is > used for stdin. > > Which means that I expect the following small test program: > > ----------------------------------------------------- > #include <windows.h> > #include <io.h> > #include <fcntl.h> > #include <stdio.h> > > int main() > { > for (;;) { > DWORD count; > char c; > ReadFile(_get_osfhandle(_fileno(stdin)), &c, 1, &count, NULL); > fprintf(stderr, "\nt = %d, '%c'\n", clock(), c); > fflush(stderr); > } > return 17; > } > -------------------------------------------------------- > > to return from the ReadFile (which is the most low level win32 call on the > input pipe to rule out msvcrt input buffering) and execute the fprintf just > past the next key stroke. So appart from output buffering, that might delay > appearing that on the screen, I expect the clock() values to be different if > I type a word with huge time delays between the successive character that I > type. > But, I get all keystrokes with the same clock value once I have hit the return > button. I stand corrected. The line editing and echoing is actually implemented on the master side rather than the slave side of the pty, i.e. in the write() routine of the MSYS DLL in the mintty process (and this time I checked). This means that the MSYS DLL shared memory, where the termios flags are stored, is in fact the relevant communication mechanism. That of course still leaves you out of luck with regards to toggling the line editing from within a non-MSYS application. Wrapping such an application can do the trick though, e.g. your test behaves as you expected with this: stty -icanon; ./test; stty icanon Andy |