vty-windows-0.1.0.0: src/Graphics/Vty/Platform/Windows/Input/Focus.hs
-- | Escape sequences for focus events and some focus related functions
module Graphics.Vty.Platform.Windows.Input.Focus
( requestFocusEvents
, disableFocusEvents
, isFocusEvent
, classifyFocusEvent
)
where
import Graphics.Vty.Input.Events
( Event(EvLostFocus, EvGainedFocus) )
import Graphics.Vty.Platform.Windows.Input.Classify.Types
( KClass )
import Graphics.Vty.Platform.Windows.Input.Classify.Parse
( expectChar, failParse, readChar, runParser )
import Control.Monad ( when )
import qualified Data.ByteString.Char8 as BS8
import Data.ByteString.Char8 (ByteString)
-- | These sequences set xterm-based terminals to send focus event
-- sequences.
requestFocusEvents :: ByteString
requestFocusEvents = BS8.pack "\ESC[?1004h"
-- | These sequences disable focus events.
disableFocusEvents :: ByteString
disableFocusEvents = BS8.pack "\ESC[?1004l"
-- | Does the specified string begin with a focus event?
isFocusEvent :: ByteString -> Bool
isFocusEvent s = BS8.isPrefixOf focusIn s ||
BS8.isPrefixOf focusOut s
focusIn :: ByteString
focusIn = BS8.pack "\ESC[I"
focusOut :: ByteString
focusOut = BS8.pack "\ESC[O"
-- | Attempt to classify an input string as a focus event.
classifyFocusEvent :: ByteString -> KClass
classifyFocusEvent s = runParser s $ do
when (not $ isFocusEvent s) failParse
expectChar '\ESC'
expectChar '['
ty <- readChar
case ty of
'I' -> return EvGainedFocus
'O' -> return EvLostFocus
_ -> failParse