@@ -22,7 +22,6 @@ import Graphics.Vty.DisplayRegion
23import Control.Applicative
23import Control.Applicative
24import Control.Monad ( foldM, when )
24import Control.Monad ( foldM, when )
25−import Control.Monad.Fix (mfix)
26import Control.Monad.Trans
25import Control.Monad.Trans
28import Data.Bits ( (.&.) )
27import Data.Bits ( (.&.) )
@@ -144,8 +143,9 @@ reserve_terminal in_ID out_handle = liftIO $ do
144 True -> 1
143 True -> 1
145 , supports_cursor_visibility = isJust $ civis terminfo_caps
144 , supports_cursor_visibility = isJust $ civis terminfo_caps
146 , assumed_state_ref = new_assumed_state_ref
145 , assumed_state_ref = new_assumed_state_ref
147− -- would be better to use fix, but I'm having issues avoiding <<loop>>
146+ -- I think fix would help assure t_actual is the only reference. I was having issues
148− , display_context = liftIO . terminfo_display_context terminfo_caps t
148+ , mk_display_context = \t_actual -> liftIO . terminfo_display_context t_actual terminfo_caps
150 send_cap s = send_cap_to_terminal t (s terminfo_caps)
150 send_cap s = send_cap_to_terminal t (s terminfo_caps)
151 maybe_send_cap s = when (isJust $ s terminfo_caps) . send_cap (fromJust . s)
151 maybe_send_cap s = when (isJust $ s terminfo_caps) . send_cap (fromJust . s)
@@ -191,11 +191,11 @@ get_window_size = do
191 (a,b) <- (`divMod` 65536) `fmap` c_get_window_size
191 (a,b) <- (`divMod` 65536) `fmap` c_get_window_size
192 return (fromIntegral b, fromIntegral a)
192 return (fromIntegral b, fromIntegral a)
194−terminfo_display_context :: TerminfoCaps -> Terminal -> DisplayRegion -> IO DisplayContext
194+terminfo_display_context :: Terminal -> TerminfoCaps -> DisplayRegion -> IO DisplayContext
195−terminfo_display_context terminfo_caps t r = do
195+terminfo_display_context t_actual terminfo_caps r =
196 let dc = DisplayContext
196 let dc = DisplayContext
197+ { context_device = t_actual
197− { context_region = r
198+ , context_region = r
198− , context_device = t
199 , move_cursor_required_bytes = \x y -> cap_expression_required_bytes (cup terminfo_caps)
199 , move_cursor_required_bytes = \x y -> cap_expression_required_bytes (cup terminfo_caps)
200 [toEnum y, toEnum x]
200 [toEnum y, toEnum x]
201 , serialize_move_cursor = \x y out_ptr -> serialize_cap_expression (cup terminfo_caps)
201 , serialize_move_cursor = \x y out_ptr -> serialize_cap_expression (cup terminfo_caps)
@@ -223,7 +223,7 @@ terminfo_display_context terminfo_caps t r = do
223 , serialize_row_end = serialize_cap_expression (clear_eol terminfo_caps) []
223 , serialize_row_end = serialize_cap_expression (clear_eol terminfo_caps) []
224 , inline_hack = return ()
224 , inline_hack = return ()
226− return dc
226+ in return dc
228-- | Instead of evaluating all the rules related to setting display attributes twice (once in
228-- | Instead of evaluating all the rules related to setting display attributes twice (once in
229-- required bytes and again in serialize) or some memoization scheme just return a size
229-- required bytes and again in serialize) or some memoization scheme just return a size