on master help sign in
be certain to use the same output device as before any stdout redirection

Ignore-this: 8d49a95192e5f40a7e26bd403138425 darcs-hash:20100806211634-f0a0d-b80d746b71da80a8e5b7e54e0731a989f837a642.gz

commit9bad12694865afac26dab7c7e82a73d788266088 authorcoreyoconnor <coreyoconnor@gmail.com> dateFri 6 Aug 2010, 14:16 (16 years ago) parent0d48e66
3 files changed+14−8
cbits/output_buffer.c+3−3 cbits/output_buffer.h+1−1 src/Graphics/Vty/Terminal/TerminfoBased.hs+10−4
cbits/output_buffer.c+3−3
@@ -3,16 +3,16 @@
33
44#include "output_buffer.h"
55
6−void stdout_output_buffer ( uint8_t* buffer, size_t buffer_size )
6+void stdout_output_buffer ( int out_fd, uint8_t* buffer, size_t buffer_size )
77{
88 while ( buffer_size )
99 {
10− const ssize_t r = write( STDOUT_FILENO, (void*) buffer, buffer_size );
10+ const ssize_t r = write( out_fd, (void*) buffer, buffer_size );
1111
1212 buffer_size -= (size_t) r;
1313 buffer += (size_t) r;
1414 }
1515
16− fdatasync( STDOUT_FILENO );
16+ fdatasync( out_fd );
1717}
1818
cbits/output_buffer.h+1−1
@@ -2,4 +2,4 @@
22#include <unistd.h>
33#include <stdint.h>
44
5−void stdout_output_buffer ( uint8_t* buffer, size_t buffer_size );
5+void stdout_output_buffer ( int out_fd, uint8_t* buffer, size_t buffer_size );
src/Graphics/Vty/Terminal/TerminfoBased.hs+10−4
@@ -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