FIX #2189: re-enabled cooked mode for Console-connected Handles on Windows
authorSimon Marlow <marlowsd@gmail.com>
Thu, 5 Mar 2009 11:33:23 +0000 (11:33 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Thu, 5 Mar 2009 11:33:23 +0000 (11:33 +0000)
Patch from Sigbjorn Finne <sof@galois.com>

GHC/Handle.hs
cbits/consUtils.c

index e0995c2..c962edc 100644 (file)
@@ -1374,10 +1374,13 @@ hSetBuffering handle mode =
           is_tty <- fdIsTTY (haFD handle_)
           when (is_tty && isReadableHandleType (haType handle_)) $
                 case mode of
-                   -- Note: we used to disable 'cooked' mode setting
-                   -- for mingw / win32 here, but it is now back on (and well
-                   -- behaved for Console-connected Handles.)
+#ifndef mingw32_HOST_OS
+        -- 'raw' mode under win32 is a bit too specialised (and troublesome
+        -- for most common uses), so simply disable its use here.
                   NoBuffering -> setCooked (haFD handle_) False
+#else
+                  NoBuffering -> return ()
+#endif
                   _           -> setCooked (haFD handle_) True
 
           -- throw away spare buffers, they might be the wrong size
index fa11000..7c50c7b 100644 (file)
@@ -25,13 +25,10 @@ set_console_buffering__(int fd, int cooked)
     DWORD flgs = ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT;
     
     if ( (h = (HANDLE)_get_osfhandle(fd)) != INVALID_HANDLE_VALUE ) {
-        /* Only for console-connected Handles */
-      if ( GetFileType(h) == FILE_TYPE_CHAR ) {
        if ( GetConsoleMode(h,&st) &&
-             SetConsoleMode(h, cooked ? (st | flgs) : st & ~flgs)  ) {
+            SetConsoleMode(h, cooked ? (st | ENABLE_LINE_INPUT) : st & ~flgs)  ) {
            return 0;
-        }
-      }
+       }
     }
     return -1;
 }