@@ -24,10 +24,12 @@ import Data.Maybe ( isJust, isNothing, fromJust )
2424import Data.Word
2525
2626import Foreign.Ptr
27−import Foreign.C.Types ( CLong, CSize )
27+import Foreign.C.Types ( CLong, CSize, CInt )
2828
2929import qualified System.Console.Terminfo as Terminfo
3030import System.IO
31+import System.Posix.IO
32+import System.Posix.Types ( Fd(..) )
3133
3234data Term = Term
3335 { term_info_ID :: String
@@ -42,6 +44,7 @@ data Term = Term
4244 , set_default_attr :: CapExpression
4345 , clear_screen :: CapExpression
4446 , display_attr_caps :: DisplayAttrCaps
47+ , term_fd :: Fd
4548 }
4649
4750data DisplayAttrCaps = DisplayAttrCaps
@@ -90,6 +93,7 @@ terminal_instance in_ID = do
9093 case parse_result of
9194 Left e -> fail $ show e
9295 Right cap -> return $ Just cap
96+ term_fd <- liftIO $ dup stdOutput
9397 pure Term
9498 <*> pure in_ID
9599 <*> pure ti
@@ -103,6 +107,7 @@ terminal_instance in_ID = do
103107 <*> require_cap "sgr0"
104108 <*> require_cap "clear"
105109 <*> current_display_attr_caps ti
110+ <*> pure term_fd
106111
107112current_display_attr_caps :: ( Applicative m, MonadIO m )
108113 => Terminfo.Terminal
@@ -165,16 +170,17 @@ instance Terminal Term where
165170 | otherwise -> return $ DisplayRegion (toEnum w) (toEnum h)
166171
167172 -- Output the byte buffer of the specified size to the terminal device.
168− output_byte_buffer _t out_ptr out_byte_count = do
173+ output_byte_buffer t out_ptr out_byte_count = do
169174 -- flush is required *before* the c_output_byte_buffer call
170175 -- otherwise there may still be data in GHC's internal stdout buffer.
171176 hFlush stdout
177+ let Fd c_fd = term_fd t
172178 if out_byte_count /= 0
173− then c_output_byte_buffer out_ptr ( toEnum $! fromEnum out_byte_count )
179+ then c_output_byte_buffer c_fd out_ptr ( toEnum $! fromEnum out_byte_count )
174180 else return ()
175181
176182foreign import ccall unsafe "output_buffer.h stdout_output_buffer" c_output_byte_buffer
177− :: Ptr Word8 -> CSize -> IO ()
183+ :: CInt -> Ptr Word8 -> CSize -> IO ()
178184foreign import ccall "gwinsz.h c_get_window_size" c_get_window_size
179185 :: IO CLong
180186