diff options
| author | Josh Rahm <rahm@google.com> | 2024-03-27 17:14:59 -0600 |
|---|---|---|
| committer | Josh Rahm <rahm@google.com> | 2024-03-27 17:14:59 -0600 |
| commit | 0a7f561f3821968605c16a03ea278e3611b6c775 (patch) | |
| tree | f2a8e63262dd709163a0b620777072a97956f9ee /src/Wetterhorn/Keys/MagicModifierKey.hs | |
| parent | 58857e81a97165541bbc83e63c589d904279c640 (diff) | |
| download | montis-0a7f561f3821968605c16a03ea278e3611b6c775.tar.gz montis-0a7f561f3821968605c16a03ea278e3611b6c775.tar.bz2 montis-0a7f561f3821968605c16a03ea278e3611b6c775.zip | |
Just a whole bunch of changes
Diffstat (limited to 'src/Wetterhorn/Keys/MagicModifierKey.hs')
| -rw-r--r-- | src/Wetterhorn/Keys/MagicModifierKey.hs | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/Wetterhorn/Keys/MagicModifierKey.hs b/src/Wetterhorn/Keys/MagicModifierKey.hs new file mode 100644 index 0000000..6bc8bb3 --- /dev/null +++ b/src/Wetterhorn/Keys/MagicModifierKey.hs @@ -0,0 +1,50 @@ +module Wetterhorn.Keys.MagicModifierKey where + +import Data.Data +import Data.Default.Class +import GHC.TypeNats +import Wetterhorn.Core.KeyEvent +import Wetterhorn.Core.W +import Wetterhorn.Dsl.Bind +import Wetterhorn.Dsl.Input +import Control.Monad.RWS (MonadTrans(lift)) +import Control.Monad.Trans.Maybe (MaybeT(..)) + +data MagicModifierProxy (keycode :: Natural) inputproxy + deriving (Typeable) + +newtype MagicModifierState (keycode :: Natural) = MagicModifierState {isPressed :: Bool} + deriving (Typeable, Eq, Show, Ord, Read) + +instance Default (MagicModifierState k) where + def = MagicModifierState False + +instance (KnownNat k) => ExtensionClass (MagicModifierState k) + +instance + (KnownNat keycode, InputProxy inputproxy) => + InputProxy (MagicModifierProxy keycode inputproxy) + where + onKeyEvent proxy ie = do + case ie of + (InputKeyEvent (KeyEvent {keycode = kc, state = state})) + | fromIntegral kc == natVal (keycodeProxy proxy) -> do + lift $ setMagicModifierPressed proxy (state == KeyPressed) + MaybeT (return Nothing) + _ -> do + pressed <- lift $ isMagicModifierPressed proxy + if pressed + then onKeyEvent (Proxy :: Proxy inputproxy) ie + else return ie + where + keycodeProxy :: Proxy (MagicModifierProxy kc a) -> Proxy kc + keycodeProxy _ = Proxy + + isMagicModifierPressed p = isPressed <$> getModState p + setMagicModifierPressed p = modifyModState p . const + + getModState :: (KnownNat kc) => Proxy (MagicModifierProxy kc a) -> W (MagicModifierState kc) + getModState _ = xget + + modifyModState :: (KnownNat kc) => Proxy (MagicModifierProxy kc a) -> (MagicModifierState kc -> Bool) -> W () + modifyModState _ fn = xmodify (MagicModifierState . fn) |