{-# LINE 1 "src/unix/System/Terminal.hsc" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
module System.Terminal
( fixCodePage
, getTerminalWidth
, hIsTerminalDeviceOrMinTTY
) where

import           Foreign
import           Foreign.C.Types
import           RIO (MonadIO, Handle, 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
/= :: WindowWidth -> WindowWidth -> Bool
$c/= :: WindowWidth -> WindowWidth -> Bool
== :: WindowWidth -> WindowWidth -> Bool
$c== :: 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
min :: WindowWidth -> WindowWidth -> WindowWidth
$cmin :: WindowWidth -> WindowWidth -> WindowWidth
max :: WindowWidth -> WindowWidth -> WindowWidth
$cmax :: WindowWidth -> WindowWidth -> WindowWidth
>= :: WindowWidth -> WindowWidth -> Bool
$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
compare :: WindowWidth -> WindowWidth -> Ordering
$ccompare :: WindowWidth -> WindowWidth -> Ordering
$cp1Ord :: Eq 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
showList :: [WindowWidth] -> ShowS
$cshowList :: [WindowWidth] -> ShowS
show :: WindowWidth -> String
$cshow :: WindowWidth -> String
showsPrec :: Int -> WindowWidth -> ShowS
$cshowsPrec :: Int -> WindowWidth -> ShowS
Show)

instance Storable WindowWidth where
  sizeOf :: WindowWidth -> Int
sizeOf WindowWidth
_ = ((Int
8))
{-# LINE 21 "src/unix/System/Terminal.hsc" #-}
  alignment _ = (2)
{-# LINE 22 "src/unix/System/Terminal.hsc" #-}
  peek p = WindowWidth <$> ((\hsc_ptr -> peekByteOff hsc_ptr 2)) p
{-# LINE 23 "src/unix/System/Terminal.hsc" #-}
  poke p (WindowWidth w) = do
    ((\hsc_ptr -> pokeByteOff hsc_ptr 2)) p w
{-# LINE 25 "src/unix/System/Terminal.hsc" #-}

foreign import ccall "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 33 "src/unix/System/Terminal.hsc" #-}
        if CInt
errno CInt -> CInt -> Bool
forall a. Ord a => a -> a -> Bool
< CInt
0
        then Maybe Int -> IO (Maybe Int)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Int
forall a. Maybe a
Nothing
        else do
            WindowWidth CUShort
w <- Ptr WindowWidth -> IO WindowWidth
forall a. Storable a => Ptr a -> IO a
peek Ptr WindowWidth
p
            Maybe Int -> IO (Maybe Int)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Int -> IO (Maybe Int))
-> (CUShort -> Maybe Int) -> CUShort -> IO (Maybe Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Maybe Int
forall a. a -> Maybe a
Just (Int -> Maybe Int) -> (CUShort -> Int) -> CUShort -> Maybe Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CUShort -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CUShort -> IO (Maybe Int)) -> CUShort -> IO (Maybe Int)
forall a b. (a -> b) -> a -> b
$ CUShort
w

fixCodePage :: x -> y -> a -> a
fixCodePage :: x -> y -> a -> a
fixCodePage x
_ y
_ = a -> a
forall a. a -> a
id

-- | hIsTerminaDevice does not recognise handles to mintty terminals as terminal
-- devices, but isMinTTYHandle does.
hIsTerminalDeviceOrMinTTY :: MonadIO m => Handle -> m Bool
hIsTerminalDeviceOrMinTTY :: Handle -> m Bool
hIsTerminalDeviceOrMinTTY = Handle -> m Bool
forall (m :: * -> *). MonadIO m => Handle -> m Bool
hIsTerminalDevice