{-# LINE 1 "src/unix/System/Terminal.hsc" #-}
{-# LANGUAGE CApiFFI #-}
module System.Terminal
( fixCodePage
, getTerminalWidth
, hIsTerminalDeviceOrMinTTY
) where
import Foreign
import Foreign.C.Types
import RIO ( Handle, MonadIO, hIsTerminalDevice )
newtype WindowWidth = WindowWidth CUShort
deriving (WindowWidth -> WindowWidth -> Bool
(WindowWidth -> WindowWidth -> Bool)
-> (WindowWidth -> WindowWidth -> Bool) -> Eq WindowWidth
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: WindowWidth -> WindowWidth -> Bool
== :: WindowWidth -> WindowWidth -> Bool
$c/= :: WindowWidth -> WindowWidth -> Bool
/= :: WindowWidth -> WindowWidth -> Bool
Eq, Eq WindowWidth
Eq WindowWidth =>
(WindowWidth -> WindowWidth -> Ordering)
-> (WindowWidth -> WindowWidth -> Bool)
-> (WindowWidth -> WindowWidth -> Bool)
-> (WindowWidth -> WindowWidth -> Bool)
-> (WindowWidth -> WindowWidth -> Bool)
-> (WindowWidth -> WindowWidth -> WindowWidth)
-> (WindowWidth -> WindowWidth -> WindowWidth)
-> Ord WindowWidth
WindowWidth -> WindowWidth -> Bool
WindowWidth -> WindowWidth -> Ordering
WindowWidth -> WindowWidth -> WindowWidth
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: WindowWidth -> WindowWidth -> Ordering
compare :: WindowWidth -> WindowWidth -> Ordering
$c< :: WindowWidth -> WindowWidth -> Bool
< :: WindowWidth -> WindowWidth -> Bool
$c<= :: WindowWidth -> WindowWidth -> Bool
<= :: WindowWidth -> WindowWidth -> Bool
$c> :: WindowWidth -> WindowWidth -> Bool
> :: WindowWidth -> WindowWidth -> Bool
$c>= :: WindowWidth -> WindowWidth -> Bool
>= :: WindowWidth -> WindowWidth -> Bool
$cmax :: WindowWidth -> WindowWidth -> WindowWidth
max :: WindowWidth -> WindowWidth -> WindowWidth
$cmin :: WindowWidth -> WindowWidth -> WindowWidth
min :: WindowWidth -> WindowWidth -> WindowWidth
Ord, Int -> WindowWidth -> ShowS
[WindowWidth] -> ShowS
WindowWidth -> String
(Int -> WindowWidth -> ShowS)
-> (WindowWidth -> String)
-> ([WindowWidth] -> ShowS)
-> Show WindowWidth
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> WindowWidth -> ShowS
showsPrec :: Int -> WindowWidth -> ShowS
$cshow :: WindowWidth -> String
show :: WindowWidth -> String
$cshowList :: [WindowWidth] -> ShowS
showList :: [WindowWidth] -> ShowS
Show)
instance Storable WindowWidth where
sizeOf :: WindowWidth -> Int
sizeOf WindowWidth
_ = ((Int
8))
{-# LINE 24 "src/unix/System/Terminal.hsc" #-}
alignment _ = (2)
{-# LINE 25 "src/unix/System/Terminal.hsc" #-}
peek p = WindowWidth <$> ((\hsc_ptr -> peekByteOff hsc_ptr 2)) p
{-# LINE 26 "src/unix/System/Terminal.hsc" #-}
poke p (WindowWidth w) = do
((\hsc_ptr -> pokeByteOff hsc_ptr 2)) p w
{-# LINE 28 "src/unix/System/Terminal.hsc" #-}
foreign import capi "sys/ioctl.h ioctl"
ioctl :: CInt -> CInt -> Ptr WindowWidth -> IO CInt
getTerminalWidth :: IO (Maybe Int)
getTerminalWidth :: IO (Maybe Int)
getTerminalWidth =
(Ptr WindowWidth -> IO (Maybe Int)) -> IO (Maybe Int)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr WindowWidth -> IO (Maybe Int)) -> IO (Maybe Int))
-> (Ptr WindowWidth -> IO (Maybe Int)) -> IO (Maybe Int)
forall a b. (a -> b) -> a -> b
$ \Ptr WindowWidth
p -> do
CInt
errno <- CInt -> CInt -> Ptr WindowWidth -> IO CInt
ioctl (CInt
1) (CInt
21523) Ptr WindowWidth
p
{-# LINE 38 "src/unix/System/Terminal.hsc" #-}
if errno < 0
then return Nothing
else do
WindowWidth w <- peek p
return . Just . fromIntegral $ w
fixCodePage :: x -> y -> a -> a
fixCodePage :: forall x y a. x -> y -> a -> a
fixCodePage x
_ y
_ = a -> a
forall a. a -> a
id
hIsTerminalDeviceOrMinTTY :: MonadIO m => Handle -> m Bool
hIsTerminalDeviceOrMinTTY :: forall (m :: * -> *). MonadIO m => Handle -> m Bool
hIsTerminalDeviceOrMinTTY = Handle -> m Bool
forall (m :: * -> *). MonadIO m => Handle -> m Bool
hIsTerminalDevice