vty-unix-0.1.0.0: src/Graphics/Vty/Platform/Unix/Input/Focus.hs
-- | Focus mode implementation.
--
-- This module is exposed for testing purposes only; applications should
-- never need to import this directly.
module Graphics.Vty.Platform.Unix.Input.Focus
( requestFocusEvents
, disableFocusEvents
, isFocusEvent
, classifyFocusEvent
)
where
import Graphics.Vty.Input.Events
import Graphics.Vty.Platform.Unix.Input.Classify.Types
import Graphics.Vty.Platform.Unix.Input.Classify.Parse
import Control.Monad
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