purge a bit extra bundled files
cannot yet enumerate every module in .cabal and purge the remaining ones due to their platform-specificity that precludes automation like cabal-fmt module expansion
This commit is contained in:
parent
97cdc074f9
commit
5097d517f4
3 changed files with 0 additions and 396 deletions
|
|
@ -1,31 +0,0 @@
|
|||
{-# LANGUAGE BangPatterns #-}
|
||||
{-# LANGUAGE DeriveDataTypeable #-}
|
||||
{-# LANGUAGE TypeFamilies #-}
|
||||
{-# LANGUAGE RebindableSyntax #-}
|
||||
{-# LANGUAGE NoImplicitPrelude #-}
|
||||
{-# LANGUAGE CPP #-}
|
||||
module Basement.Terminal
|
||||
( initialize
|
||||
, getDimensions
|
||||
) where
|
||||
|
||||
import Basement.Compat.Base
|
||||
import Basement.Terminal.Size (getDimensions)
|
||||
#ifdef mingw32_HOST_OS
|
||||
import System.IO (hSetEncoding, utf8, hPutStrLn, stderr, stdin, stdout)
|
||||
import System.Win32.Console (setConsoleCP, setConsoleOutputCP, getConsoleCP, getConsoleOutputCP)
|
||||
#endif
|
||||
|
||||
initialize :: IO ()
|
||||
initialize = do
|
||||
#ifdef mingw32_HOST_OS
|
||||
query getConsoleOutputCP (\e -> setConsoleOutputCP e >> hSetEncoding stdout utf8 >> hSetEncoding stderr utf8) utf8Code
|
||||
query getConsoleCP (\e -> setConsoleCP e >> hSetEncoding stdin utf8) utf8Code
|
||||
where
|
||||
utf8Code = 65001
|
||||
query get set expected = do
|
||||
v <- get
|
||||
if v == expected then pure () else set expected
|
||||
#else
|
||||
pure ()
|
||||
#endif
|
||||
|
|
@ -1,175 +0,0 @@
|
|||
{-# LANGUAGE BangPatterns #-}
|
||||
{-# LANGUAGE DeriveDataTypeable #-}
|
||||
{-# LANGUAGE TypeFamilies #-}
|
||||
{-# LANGUAGE RebindableSyntax #-}
|
||||
{-# LANGUAGE NoImplicitPrelude #-}
|
||||
-- |
|
||||
-- Module : Basement.Terminal.ANSI
|
||||
-- License : BSD-style
|
||||
-- Maintainer : Vincent Hanquez <vincent@snarc.org>
|
||||
--
|
||||
-- ANSI Terminal escape for cursor and attributes manipulations
|
||||
--
|
||||
-- On Unix system, it should be supported by most terminal emulators.
|
||||
--
|
||||
-- On Windows system, all escape sequences are empty for maximum
|
||||
-- compatibility purpose, and easy implementation. newer version
|
||||
-- of Windows 10 supports ANSI escape now, but we'll need
|
||||
-- some kind of detection.
|
||||
--
|
||||
{-# LANGUAGE CPP #-}
|
||||
{-# LANGUAGE DataKinds #-}
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
module Basement.Terminal.ANSI
|
||||
(
|
||||
-- * Types
|
||||
Escape
|
||||
, Displacement
|
||||
, ColorComponent
|
||||
, GrayComponent
|
||||
, RGBComponent
|
||||
-- * Simple ANSI escape factory functions
|
||||
, cursorUp
|
||||
, cursorDown
|
||||
, cursorForward
|
||||
, cursorBack
|
||||
, cursorNextLine
|
||||
, cursorPrevLine
|
||||
, cursorHorizontalAbsolute
|
||||
, cursorPosition
|
||||
, eraseScreenFromCursor
|
||||
, eraseScreenToCursor
|
||||
, eraseScreenAll
|
||||
, eraseLineFromCursor
|
||||
, eraseLineToCursor
|
||||
, eraseLineAll
|
||||
, scrollUp
|
||||
, scrollDown
|
||||
, sgrReset
|
||||
, sgrForeground
|
||||
, sgrBackground
|
||||
, sgrForegroundGray24
|
||||
, sgrBackgroundGray24
|
||||
, sgrForegroundColor216
|
||||
, sgrBackgroundColor216
|
||||
) where
|
||||
|
||||
import Basement.String
|
||||
import Basement.Bounded
|
||||
import Basement.Imports
|
||||
import Basement.Numerical.Multiplicative
|
||||
import Basement.Numerical.Additive
|
||||
|
||||
#ifndef mingw32_HOST_OS
|
||||
#define SUPPORT_ANSI_ESCAPE
|
||||
#endif
|
||||
|
||||
type Escape = String
|
||||
|
||||
type Displacement = Word64
|
||||
|
||||
-- | Simple color component on 8 color terminal (maximum compatibility)
|
||||
type ColorComponent = Zn64 8
|
||||
|
||||
-- | Gray color compent on 256colors terminals
|
||||
type GrayComponent = Zn64 24
|
||||
|
||||
-- | Color compent on 256colors terminals
|
||||
type RGBComponent = Zn64 6
|
||||
|
||||
cursorUp, cursorDown, cursorForward, cursorBack
|
||||
, cursorNextLine, cursorPrevLine
|
||||
, cursorHorizontalAbsolute :: Displacement -> Escape
|
||||
cursorUp n = csi1 n "A"
|
||||
cursorDown n = csi1 n "B"
|
||||
cursorForward n = csi1 n "C"
|
||||
cursorBack n = csi1 n "D"
|
||||
cursorNextLine n = csi1 n "E"
|
||||
cursorPrevLine n = csi1 n "F"
|
||||
cursorHorizontalAbsolute n = csi1 n "G"
|
||||
|
||||
cursorPosition :: Displacement -> Displacement -> Escape
|
||||
cursorPosition row col = csi2 row col "H"
|
||||
|
||||
eraseScreenFromCursor
|
||||
, eraseScreenToCursor
|
||||
, eraseScreenAll
|
||||
, eraseLineFromCursor
|
||||
, eraseLineToCursor
|
||||
, eraseLineAll :: Escape
|
||||
eraseScreenFromCursor = csi1 0 "J"
|
||||
eraseScreenToCursor = csi1 1 "J"
|
||||
eraseScreenAll = csi1 2 "J"
|
||||
eraseLineFromCursor = csi1 0 "K"
|
||||
eraseLineToCursor = csi1 1 "K"
|
||||
eraseLineAll = csi1 2 "K"
|
||||
|
||||
scrollUp, scrollDown :: Displacement -> Escape
|
||||
scrollUp n = csi1 n "S"
|
||||
scrollDown n = csi1 n "T"
|
||||
|
||||
-- | All attribute off
|
||||
sgrReset :: Escape
|
||||
sgrReset = csi1 0 "m"
|
||||
|
||||
-- | 8 Colors + Bold attribute for foreground
|
||||
sgrForeground :: ColorComponent -> Bool -> Escape
|
||||
sgrForeground n bold
|
||||
| bold = csi2 (30+unZn64 n) 1 "m"
|
||||
| otherwise = csi1 (30+unZn64 n) "m"
|
||||
|
||||
-- | 8 Colors + Bold attribute for background
|
||||
sgrBackground :: ColorComponent -> Bool -> Escape
|
||||
sgrBackground n bold
|
||||
| bold = csi2 (40+unZn64 n) 1 "m"
|
||||
| otherwise = csi1 (40+unZn64 n) "m"
|
||||
|
||||
-- 256 colors mode
|
||||
|
||||
sgrForegroundGray24, sgrBackgroundGray24 :: GrayComponent -> Escape
|
||||
sgrForegroundGray24 v = csi3 38 5 (0xE8 + unZn64 v) "m"
|
||||
sgrBackgroundGray24 v = csi3 48 5 (0xE8 + unZn64 v) "m"
|
||||
|
||||
sgrForegroundColor216 :: RGBComponent -- ^ Red component
|
||||
-> RGBComponent -- ^ Green component
|
||||
-> RGBComponent -- ^ Blue component
|
||||
-> Escape
|
||||
sgrForegroundColor216 r g b = csi3 38 5 (0x10 + 36 * unZn64 r + 6 * unZn64 g + unZn64 b) "m"
|
||||
|
||||
sgrBackgroundColor216 :: RGBComponent -- ^ Red component
|
||||
-> RGBComponent -- ^ Green component
|
||||
-> RGBComponent -- ^ Blue component
|
||||
-> Escape
|
||||
sgrBackgroundColor216 r g b = csi3 48 5 (0x10 + 36 * unZn64 r + 6 * unZn64 g + unZn64 b) "m"
|
||||
|
||||
#ifdef SUPPORT_ANSI_ESCAPE
|
||||
|
||||
csi0 :: String -> String
|
||||
csi0 suffix = mconcat ["\ESC[", suffix]
|
||||
|
||||
csi1 :: Displacement -> String -> String
|
||||
csi1 p1 suffix = mconcat ["\ESC[", pshow p1, suffix]
|
||||
|
||||
csi2 :: Displacement -> Displacement -> String -> String
|
||||
csi2 p1 p2 suffix = mconcat ["\ESC[", pshow p1, ";", pshow p2, suffix]
|
||||
|
||||
csi3 :: Displacement -> Displacement -> Displacement -> String -> String
|
||||
csi3 p1 p2 p3 suffix = mconcat ["\ESC[", pshow p1, ";", pshow p2, ";", pshow p3, suffix]
|
||||
|
||||
pshow = show
|
||||
|
||||
#else
|
||||
|
||||
csi0 :: String -> String
|
||||
csi0 _ = ""
|
||||
|
||||
csi1 :: Displacement -> String -> String
|
||||
csi1 _ _ = ""
|
||||
|
||||
csi2 :: Displacement -> Displacement -> String -> String
|
||||
csi2 _ _ _ = ""
|
||||
|
||||
csi3 :: Displacement -> Displacement -> Displacement -> String -> String
|
||||
csi3 _ _ _ _ = ""
|
||||
|
||||
#endif
|
||||
|
|
@ -1,190 +0,0 @@
|
|||
{-# LANGUAGE CApiFFI #-}
|
||||
module Basement.Terminal.Size
|
||||
( getDimensions
|
||||
) where
|
||||
|
||||
import Foreign
|
||||
import Foreign.C
|
||||
import Basement.Compat.Base
|
||||
import Basement.Types.OffsetSize
|
||||
import Basement.Numerical.Subtractive
|
||||
import Basement.Numerical.Additive
|
||||
import Prelude (fromIntegral)
|
||||
|
||||
#include "foundation_system.h"
|
||||
#ifdef FOUNDATION_SYSTEM_WINDOWS
|
||||
|
||||
import System.Win32.Types (HANDLE, BOOL)
|
||||
import Graphics.Win32.Misc (getStdHandle, sTD_OUTPUT_HANDLE, StdHandleId)
|
||||
|
||||
#include <windows.h>
|
||||
#elif defined FOUNDATION_SYSTEM_UNIX
|
||||
#include <sys/ioctl.h>
|
||||
#ifdef __sun
|
||||
#include <sys/termios.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#if __GLASGOW_HASKELL__ < 800
|
||||
#let alignment t = "%lu", (unsigned long)offsetof(struct {char x__; t (y__); }, y__)
|
||||
#endif
|
||||
|
||||
#ifdef FOUNDATION_SYSTEM_UNIX
|
||||
data Winsize = Winsize
|
||||
{ ws_row :: !Word16
|
||||
, ws_col :: !Word16
|
||||
, ws_xpixel :: !Word16
|
||||
, ws_ypixel :: !Word16
|
||||
}
|
||||
|
||||
instance Storable Winsize where
|
||||
sizeOf _ = #{size struct winsize}
|
||||
alignment _ = #{alignment struct winsize}
|
||||
peek ptr = do
|
||||
r <- #{peek struct winsize, ws_row} ptr
|
||||
c <- #{peek struct winsize, ws_col} ptr
|
||||
x <- #{peek struct winsize, ws_xpixel} ptr
|
||||
y <- #{peek struct winsize, ws_ypixel} ptr
|
||||
return (Winsize r c x y)
|
||||
poke ptr (Winsize r c x y) = do
|
||||
#{poke struct winsize, ws_row} ptr r
|
||||
#{poke struct winsize, ws_col} ptr c
|
||||
#{poke struct winsize, ws_xpixel} ptr x
|
||||
#{poke struct winsize, ws_ypixel} ptr y
|
||||
|
||||
#elif defined FOUNDATION_SYSTEM_WINDOWS
|
||||
type Handle = Ptr CChar -- void *
|
||||
|
||||
data SmallRect = SmallRect
|
||||
{ left :: !Int16
|
||||
, top :: !Int16
|
||||
, right :: !Int16
|
||||
, bottom :: !Int16
|
||||
} deriving (Show)
|
||||
|
||||
instance Storable SmallRect where
|
||||
sizeOf _ = #{size SMALL_RECT}
|
||||
alignment _ = #{alignment SMALL_RECT}
|
||||
peek ptr = do
|
||||
l <- #{peek SMALL_RECT, Left} ptr
|
||||
r <- #{peek SMALL_RECT, Right} ptr
|
||||
t <- #{peek SMALL_RECT, Top} ptr
|
||||
b <- #{peek SMALL_RECT, Bottom} ptr
|
||||
return (SmallRect l t r b)
|
||||
poke ptr (SmallRect l t r b) = do
|
||||
#{poke SMALL_RECT, Left} ptr l
|
||||
#{poke SMALL_RECT, Top} ptr t
|
||||
#{poke SMALL_RECT, Right} ptr r
|
||||
#{poke SMALL_RECT, Bottom} ptr b
|
||||
|
||||
data Coord = Coord
|
||||
{ x :: !Int16
|
||||
, y :: !Int16
|
||||
} deriving (Show)
|
||||
|
||||
instance Storable Coord where
|
||||
sizeOf _ = #{size COORD}
|
||||
alignment _ = #{alignment COORD}
|
||||
peek ptr = do
|
||||
x <- #{peek COORD, X} ptr
|
||||
y <- #{peek COORD, Y} ptr
|
||||
return (Coord x y)
|
||||
poke ptr (Coord x y) = do
|
||||
#{poke COORD, X} ptr x
|
||||
#{poke COORD, Y} ptr y
|
||||
|
||||
data ConsoleScreenBufferInfo = ConsoleScreenBufferInfo
|
||||
{ dwSize :: !Coord
|
||||
, dwCursorPosition :: !Coord
|
||||
, wAttributes :: !Word16
|
||||
, srWindow :: !SmallRect
|
||||
, dwMaximumWindowSize :: !Coord
|
||||
} deriving (Show)
|
||||
|
||||
instance Storable ConsoleScreenBufferInfo where
|
||||
sizeOf _ = #{size CONSOLE_SCREEN_BUFFER_INFO}
|
||||
alignment _ = #{alignment CONSOLE_SCREEN_BUFFER_INFO}
|
||||
peek ptr = do
|
||||
s <- #{peek CONSOLE_SCREEN_BUFFER_INFO, dwSize} ptr
|
||||
c <- #{peek CONSOLE_SCREEN_BUFFER_INFO, dwCursorPosition} ptr
|
||||
a <- #{peek CONSOLE_SCREEN_BUFFER_INFO, wAttributes} ptr
|
||||
w <- #{peek CONSOLE_SCREEN_BUFFER_INFO, srWindow} ptr
|
||||
m <- #{peek CONSOLE_SCREEN_BUFFER_INFO, dwMaximumWindowSize} ptr
|
||||
return (ConsoleScreenBufferInfo s c a w m)
|
||||
poke ptr (ConsoleScreenBufferInfo s c a w m) = do
|
||||
#{poke CONSOLE_SCREEN_BUFFER_INFO, dwSize} ptr s
|
||||
#{poke CONSOLE_SCREEN_BUFFER_INFO, dwCursorPosition} ptr c
|
||||
#{poke CONSOLE_SCREEN_BUFFER_INFO, wAttributes} ptr a
|
||||
#{poke CONSOLE_SCREEN_BUFFER_INFO, srWindow} ptr w
|
||||
#{poke CONSOLE_SCREEN_BUFFER_INFO, dwMaximumWindowSize} ptr m
|
||||
|
||||
invalidHandleValue :: IntPtr
|
||||
invalidHandleValue = #{const INVALID_HANDLE_VALUE}
|
||||
|
||||
stdOutputHandle :: CULong
|
||||
stdOutputHandle = #{const STD_OUTPUT_HANDLE}
|
||||
#endif
|
||||
-- defined FOUNDATION_SYSTEM_WINDOWS
|
||||
|
||||
#ifdef FOUNDATION_SYSTEM_UNIX
|
||||
|
||||
foreign import capi "sys/ioctl.h ioctl" c_ioctl :: CInt -> CULong -> Ptr a -> IO CInt
|
||||
|
||||
-- | Get the terminal windows size
|
||||
tiocgwinsz :: CULong
|
||||
tiocgwinsz = Prelude.fromIntegral (#{const TIOCGWINSZ} :: Word)
|
||||
|
||||
#elif defined FOUNDATION_SYSTEM_WINDOWS
|
||||
foreign import ccall "GetConsoleScreenBufferInfo" c_get_console_screen_buffer_info
|
||||
:: HANDLE -> Ptr ConsoleScreenBufferInfo -> IO BOOL
|
||||
#endif
|
||||
|
||||
#ifdef FOUNDATION_SYSTEM_UNIX
|
||||
ioctlWinsize :: CInt -> IO (Maybe (CountOf Char, CountOf Char))
|
||||
ioctlWinsize fd = alloca $ \winsizePtr -> do
|
||||
status <- c_ioctl fd tiocgwinsz winsizePtr
|
||||
if status == (-1 :: CInt)
|
||||
then pure Nothing
|
||||
else Just . toDimensions <$> peek winsizePtr
|
||||
where
|
||||
toDimensions winsize =
|
||||
( CountOf . Prelude.fromIntegral . ws_col $ winsize
|
||||
, CountOf . Prelude.fromIntegral . ws_row $ winsize)
|
||||
|
||||
#elif defined FOUNDATION_SYSTEM_WINDOWS
|
||||
getConsoleScreenBufferInfo :: HANDLE -> IO (Maybe ConsoleScreenBufferInfo)
|
||||
getConsoleScreenBufferInfo handle = alloca $ \infoPtr -> do
|
||||
status <- c_get_console_screen_buffer_info handle infoPtr
|
||||
if status
|
||||
then Just <$> peek infoPtr
|
||||
else pure Nothing
|
||||
|
||||
winWinsize :: StdHandleId -> IO (Maybe (CountOf Char, CountOf Char))
|
||||
winWinsize handleRef = (infoToDimensions <$>) <$>
|
||||
(getStdHandle handleRef >>= getConsoleScreenBufferInfo)
|
||||
where
|
||||
infoToDimensions info =
|
||||
let window = srWindow info
|
||||
width = Prelude.fromIntegral (right window - left window + 1)
|
||||
height = Prelude.fromIntegral (bottom window - top window + 1)
|
||||
in (CountOf width, CountOf height)
|
||||
#endif
|
||||
-- defined FOUNDATION_SYSTEM_WINDOWS
|
||||
|
||||
-- | Return the size of the current terminal
|
||||
--
|
||||
-- If the system is not supported or that querying the system result in an error
|
||||
-- then a default size of (80, 24) will be given back.
|
||||
getDimensions :: IO (CountOf Char, CountOf Char)
|
||||
getDimensions =
|
||||
#if defined FOUNDATION_SYSTEM_WINDOWS
|
||||
maybe defaultSize id <$> winWinsize sTD_OUTPUT_HANDLE
|
||||
#elif defined FOUNDATION_SYSTEM_UNIX
|
||||
maybe defaultSize id <$> ioctlWinsize 0
|
||||
#else
|
||||
pure defaultSize
|
||||
#endif
|
||||
where
|
||||
defaultSize = (80, 24)
|
||||
Loading…
Add table
Add a link
Reference in a new issue