{-# LINE 1 "src/unix/System/Terminal.hsc" #-}
{-# LANGUAGE CApiFFI                  #-}

-- | The module of this name differs as between Windows and non-Windows builds.
-- This is the non-Windows version.
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
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
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
Ord, Int -> WindowWidth -> ShowS
[WindowWidth] -> ShowS
WindowWidth -> String
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 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" #-}

-- `ioctl` is variadic, so `capi` is needed, see:
-- https://www.haskell.org/ghc/blog/20210709-capi-usage.html
foreign import capi "sys/ioctl.h ioctl"
  ioctl :: CInt -> CInt -> Ptr WindowWidth -> IO CInt

getTerminalWidth :: IO (Maybe Int)
getTerminalWidth :: IO (Maybe Int)
getTerminalWidth =
  forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca 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
_ = 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 :: forall (m :: * -> *). MonadIO m => Handle -> m Bool
hIsTerminalDeviceOrMinTTY = forall (m :: * -> *). MonadIO m => Handle -> m Bool
hIsTerminalDevice