aboutsummaryrefslogtreecommitdiff
path: root/plug/src/Montis/Keys/MagicModifierKey.hs
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2026-01-01 20:29:02 -0700
committerJosh Rahm <joshuarahm@gmail.com>2026-01-01 20:29:02 -0700
commitcb657fa9fc8124bdab42eb148e9b4a8ac69fc05e (patch)
tree299ab9c10e0c6c40fe30f38f3c75286a282c6283 /plug/src/Montis/Keys/MagicModifierKey.hs
parent88b5144ba82393e9efbffc8ba7ecc225d99dc9ed (diff)
downloadmontis-cb657fa9fc8124bdab42eb148e9b4a8ac69fc05e.tar.gz
montis-cb657fa9fc8124bdab42eb148e9b4a8ac69fc05e.tar.bz2
montis-cb657fa9fc8124bdab42eb148e9b4a8ac69fc05e.zip
[refactor] Wetterhorn -> Montis
Diffstat (limited to 'plug/src/Montis/Keys/MagicModifierKey.hs')
-rw-r--r--plug/src/Montis/Keys/MagicModifierKey.hs50
1 files changed, 50 insertions, 0 deletions
diff --git a/plug/src/Montis/Keys/MagicModifierKey.hs b/plug/src/Montis/Keys/MagicModifierKey.hs
new file mode 100644
index 0000000..0cf1eb3
--- /dev/null
+++ b/plug/src/Montis/Keys/MagicModifierKey.hs
@@ -0,0 +1,50 @@
+module Montis.Keys.MagicModifierKey where
+
+import Data.Data
+import Data.Default.Class
+import GHC.TypeNats
+import Montis.Core.KeyEvent
+import Montis.Core.W
+import Montis.Dsl.Bind
+import Montis.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)