aboutsummaryrefslogtreecommitdiff
path: root/src/Wetterhorn/Core.hs
diff options
context:
space:
mode:
authorJosh Rahm <rahm@google.com>2024-02-16 15:41:49 -0700
committerJosh Rahm <rahm@google.com>2024-02-21 12:18:46 -0700
commit22571fc455f50d1774e7abb9a77db3a51182a420 (patch)
treefbd99182c7ac48ff5dc91e9c29fae5c3da0d1dc3 /src/Wetterhorn/Core.hs
parent860a75bd4dee36880c9372d1f78ced18d1246988 (diff)
downloadwetterhorn-22571fc455f50d1774e7abb9a77db3a51182a420.tar.gz
wetterhorn-22571fc455f50d1774e7abb9a77db3a51182a420.tar.bz2
wetterhorn-22571fc455f50d1774e7abb9a77db3a51182a420.zip
Do most of keyboard handling in the plugin now.
Diffstat (limited to 'src/Wetterhorn/Core.hs')
-rw-r--r--src/Wetterhorn/Core.hs39
1 files changed, 32 insertions, 7 deletions
diff --git a/src/Wetterhorn/Core.hs b/src/Wetterhorn/Core.hs
index 5a9d9e5..16978bb 100644
--- a/src/Wetterhorn/Core.hs
+++ b/src/Wetterhorn/Core.hs
@@ -16,6 +16,8 @@ module Wetterhorn.Core
defaultConfig,
requestHotReload,
ctxConfig,
+ KeyEvent (..),
+ KeyState (..),
)
where
@@ -24,7 +26,10 @@ import Control.Exception
import Control.Monad (when)
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as CH
-import Foreign (Ptr, StablePtr, Word32, newStablePtr, ptrToIntPtr, castForeignPtr)
+import Data.Map (Map)
+import qualified Data.Map as Map
+import Data.Maybe (fromMaybe)
+import Foreign (Ptr, StablePtr, Word32, castForeignPtr, newStablePtr, ptrToIntPtr)
import Numeric (showHex)
import Text.Printf
import Wetterhorn.Core.ForeignInterface (ForeignInterface)
@@ -66,20 +71,40 @@ data WState = WState
data SurfaceState = Map | Unmap | Destroy deriving (Eq, Ord, Show, Enum)
+data KeyState = KeyPressed | KeyReleased deriving (Show, Read, Eq, Enum, Ord)
+
+data KeyEvent = KeyEvent
+ { timeMs :: Word32,
+ keycode :: Word32,
+ state :: KeyState,
+ modifiers :: Word32,
+ keysym :: Word32
+ }
+ deriving (Show, Read, Ord, Eq)
+
data WConfig = WConfig
- { keybindingHandler :: Word32 -> W (),
+ { keybindingHandler :: KeyEvent -> W Bool,
surfaceHandler :: SurfaceState -> Ptr () -> W ()
}
+defaultBindings :: Map (KeyState, Word32, Word32) (W ())
+defaultBindings =
+ Map.fromList
+ [ ((KeyPressed, 0x8, 0x72), requestHotReload),
+ ((KeyPressed, 0x8, 0x6c), requestLog "This is a log statement!\n"),
+ ((KeyPressed, 0x8, 0x71), requestExit 0)
+ ]
+
defaultConfig :: WConfig
defaultConfig =
WConfig
- { keybindingHandler = \sym -> do
+ { keybindingHandler = \keyEvent -> do
i <- incrementState
- wio (printf "[%d] Got key: %d\n" i sym)
- when (sym == 111) requestHotReload
- when (sym == 112) (requestLog "Hey daddy ths is a log statement.\n")
- when (sym == 0x71) (requestExit 0),
+ wio $ printf "%d - got %s\n" i (show keyEvent)
+ maybe (return False) (fmap (const True)) $
+ Map.lookup
+ (state keyEvent, modifiers keyEvent, keysym keyEvent)
+ defaultBindings,
surfaceHandler = \state ptr -> wio (printf "Surface %s is %s\n" (showHex (ptrToIntPtr ptr) "") (show state))
}