module Termonad.Keys where
import Termonad.Prelude
import Control.Lens (imap)
import GI.Gdk
( EventKey
, pattern KEY_1
, pattern KEY_2
, pattern KEY_3
, pattern KEY_4
, pattern KEY_5
, pattern KEY_6
, pattern KEY_7
, pattern KEY_8
, pattern KEY_9
, ModifierType(..)
, getEventKeyKeyval
, getEventKeyState
)
import Termonad.Term (altNumSwitchTerm)
import Termonad.Types (TMState)
data Key = Key
{ keyVal :: Word32
, keyMods :: Set ModifierType
} deriving (Eq, Ord, Show)
toKey :: Word32 -> Set ModifierType -> Key
toKey = Key
keyMap :: Map Key (TMState -> IO Bool)
keyMap =
let numKeys =
[ KEY_1
, KEY_2
, KEY_3
, KEY_4
, KEY_5
, KEY_6
, KEY_7
, KEY_8
, KEY_9
]
altNumKeys =
imap
(\i k ->
(toKey k [ModifierTypeMod1Mask], stopProp (altNumSwitchTerm i))
)
numKeys
in
mapFromList $
altNumKeys
stopProp :: (TMState -> IO a) -> TMState -> IO Bool
stopProp callback terState = callback terState $> True
handleKeyPress :: TMState -> EventKey -> IO Bool
handleKeyPress terState eventKey = do
keyval <- getEventKeyKeyval eventKey
modifiers <- getEventKeyState eventKey
let key = toKey keyval (setFromList modifiers)
maybeAction = lookup key keyMap
case maybeAction of
Just action -> action terState
Nothing -> pure False