Add basic event handling

This commit is contained in:
2026-07-25 22:04:22 +01:00
parent a810fa82fb
commit 20f8421426
3 changed files with 74 additions and 9 deletions
+55 -7
View File
@@ -59,7 +59,7 @@ instance Storable PointerInfo where
pokeByteOff ptr 4 w
data Event = Event
{ event_type :: Int32,
{ event_type :: EventType,
event_window :: XcbWindow,
event_override_redirect :: Int8,
event_btn :: Word32,
@@ -72,12 +72,62 @@ data Event = Event
}
deriving (Show)
data EventType
= EvNone
| EvCreate
| EvClosed
| EvEnter
| EvShowed
| EvShowRequest
| EvMousePress
| EvMouseDrag
| EvMouseRelease
| EvKeyPress
| EvKeyRelease
| EvClosedTemp
| EvConfigureRequest
| EvResizeRequest
deriving (Show, Eq, Bounded)
instance Enum EventType where
fromEnum ev = case ev of
EvNone -> 0
EvCreate -> 1
EvClosed -> 2
EvEnter -> 3
EvShowed -> 4
EvShowRequest -> 5
EvMousePress -> 6
EvMouseDrag -> 7
EvMouseRelease -> 8
EvKeyPress -> 9
EvKeyRelease -> 10
EvClosedTemp -> 11
EvConfigureRequest -> 12
EvResizeRequest -> 13
toEnum n = case n of
0 -> EvNone
1 -> EvCreate
2 -> EvClosed
3 -> EvEnter
4 -> EvShowed
5 -> EvShowRequest
6 -> EvMousePress
7 -> EvMouseDrag
8 -> EvMouseRelease
9 -> EvKeyPress
10 -> EvKeyRelease
11 -> EvClosedTemp
12 -> EvConfigureRequest
13 -> EvResizeRequest
_ -> error $ "Unknown C EventType number: " ++ show n
instance Storable Event where
sizeOf _ = 40
alignment _ = alignment (undefined :: Word32)
peek ptr = do
eventType <- peekByteOff ptr 0
rawType <- peekByteOff ptr 0 :: IO Int32
let eventType = toEnum (fromIntegral rawType)
window <- peekByteOff ptr 4
overrideRedirect <- peekByteOff ptr 8
btn <- peekByteOff ptr 12
@@ -87,7 +137,6 @@ instance Storable Event where
width <- peekByteOff ptr 28
state <- peekByteOff ptr 32
isRoot <- peekByteOff ptr 36
pure $
Event
eventType
@@ -100,9 +149,8 @@ instance Storable Event where
width
state
isRoot
poke ptr (Event eventType (XcbWindow window) overrideRedirect btn x y height width state isRoot) = do
pokeByteOff ptr 0 eventType
pokeByteOff ptr 0 (fromIntegral (fromEnum eventType) :: Int32)
pokeByteOff ptr 4 window
pokeByteOff ptr 8 overrideRedirect
pokeByteOff ptr 12 btn
@@ -165,7 +213,7 @@ foreign import capi "x_kutu.h destroy"
destroy :: XcbWindow -> IO ()
foreign import capi "x_kutu.h show"
show :: XcbWindow -> IO ()
c_show :: XcbWindow -> IO ()
foreign import capi "x_kutu.h hide"
hide :: XcbWindow -> IO ()