@@ -60,7 +60,14 @@ module Graphics.UI.GLUT.Callbacks.Window (
6060
6161 -- * Joystick callback
6262 JoystickButtons (.. ), JoystickPosition (.. ),
63- JoystickCallback , joystickCallback
63+ JoystickCallback , joystickCallback ,
64+
65+ -- * Multi-touch support
66+ TouchID ,
67+ MultiMouseCallback , multiMouseCallback ,
68+ MultiCrossingCallback , multiCrossingCallback ,
69+ MultiMotionCallback , multiMotionCallback , multiPassiveMotionCallback
70+
6471) where
6572
6673import Data.Bits hiding ( shift )
@@ -294,15 +301,20 @@ windowStateCallback = makeSettableStateVar $
294301
295302--------------------------------------------------------------------------------
296303
304+ -- | A window close callback
305+
297306type CloseCallback = IO ()
298307
308+ -- | Controls the window close callback for the /current window/.
309+
299310closeCallback :: SettableStateVar (Maybe CloseCallback )
300311closeCallback = makeSettableStateVar $
301312 setCallback CloseCB glutCloseFunc makeCloseFunc
302313
303314--------------------------------------------------------------------------------
304315
305316-- | A keyboard callback
317+
306318type KeyboardCallback = Char -> Position -> IO ()
307319
308320setKeyboardCallback :: Maybe KeyboardCallback -> IO ()
@@ -313,6 +325,7 @@ setKeyboardCallback =
313325
314326-- | Controls the keyboard callback for the /current window/. This is
315327-- activated only when a key is pressed.
328+
316329keyboardCallback :: SettableStateVar (Maybe KeyboardCallback )
317330keyboardCallback = makeSettableStateVar setKeyboardCallback
318331
@@ -327,8 +340,10 @@ setKeyboardUpCallback =
327340
328341-- | Controls the keyboard callback for the /current window/. This is
329342-- activated only when a key is released.
343+
330344keyboardUpCallback :: SettableStateVar (Maybe KeyboardCallback )
331345keyboardUpCallback = makeSettableStateVar setKeyboardUpCallback
346+
332347--------------------------------------------------------------------------------
333348
334349-- | Special keys
@@ -406,6 +421,7 @@ unmarshalSpecialKey x
406421--------------------------------------------------------------------------------
407422
408423-- | A special key callback
424+
409425type SpecialCallback = SpecialKey -> Position -> IO ()
410426
411427setSpecialCallback :: Maybe SpecialCallback -> IO ()
@@ -416,8 +432,10 @@ setSpecialCallback =
416432
417433-- | Controls the special key callback for the /current window/. This is
418434-- activated only when a special key is pressed.
435+
419436specialCallback :: SettableStateVar (Maybe SpecialCallback )
420437specialCallback = makeSettableStateVar setSpecialCallback
438+
421439--------------------------------------------------------------------------------
422440
423441setSpecialUpCallback :: Maybe SpecialCallback -> IO ()
@@ -428,8 +446,10 @@ setSpecialUpCallback =
428446
429447-- | Controls the special key callback for the /current window/. This is
430448-- activated only when a special key is released.
449+
431450specialUpCallback :: SettableStateVar (Maybe SpecialCallback )
432451specialUpCallback = makeSettableStateVar setSpecialUpCallback
452+
433453--------------------------------------------------------------------------------
434454
435455-- | The current state of a key or button
@@ -448,6 +468,7 @@ unmarshalKeyState x
448468--------------------------------------------------------------------------------
449469
450470-- | A mouse callback
471+
451472type MouseCallback = MouseButton -> KeyState -> Position -> IO ()
452473
453474setMouseCallback :: Maybe MouseCallback -> IO ()
@@ -458,8 +479,10 @@ setMouseCallback =
458479 (Position (fromIntegral x) (fromIntegral y))
459480
460481-- | Controls the mouse callback for the /current window/.
482+
461483mouseCallback :: SettableStateVar (Maybe MouseCallback )
462484mouseCallback = makeSettableStateVar setMouseCallback
485+
463486--------------------------------------------------------------------------------
464487
465488-- | The state of the keyboard modifiers
@@ -867,3 +890,56 @@ joystickCallback =
867890 (JoystickPosition (fromIntegral x)
868891 (fromIntegral y)
869892 (fromIntegral z))
893+
894+ --------------------------------------------------------------------------------
895+
896+ -- | A description where the multi-touch event is coming from, the freeglut
897+ -- specs are very vague about the actual semantics. It contains the device ID
898+ -- and\/or the cursor\/finger ID.
899+
900+ type TouchID = Int
901+
902+ -- | A multi-touch variant of 'MouseCallback'.
903+
904+ type MultiMouseCallback = TouchID -> MouseCallback
905+
906+ -- | (/freeglut only/) A multi-touch variant of 'mouseCallback'.
907+
908+ multiMouseCallback :: SettableStateVar (Maybe MultiMouseCallback )
909+ multiMouseCallback = makeSettableStateVar $
910+ setCallback MultiButtonCB glutMultiButtonFunc (makeMultiButtonFunc . unmarshal)
911+ where unmarshal cb d x y b s = cb (fromIntegral d)
912+ (unmarshalMouseButton b)
913+ (unmarshalKeyState s)
914+ (Position (fromIntegral x) (fromIntegral y))
915+
916+ -- | A multi-touch variant of 'CrossingCallback'.
917+
918+ type MultiCrossingCallback = TouchID -> CrossingCallback
919+
920+ -- | (/freeglut only/) A multi-touch variant of 'crossingCallback'.
921+
922+ multiCrossingCallback :: SettableStateVar (Maybe MultiCrossingCallback )
923+ multiCrossingCallback = makeSettableStateVar $
924+ setCallback MultiEntryCB glutMultiEntryFunc (makeMultiEntryFunc . unmarshal)
925+ where unmarshal cb d c = cb (fromIntegral d) (unmarshalCrossing c)
926+
927+ -- | A multi-touch variant of 'MotionCallback'.
928+
929+ type MultiMotionCallback = TouchID -> MotionCallback
930+
931+ -- | (/freeglut only/) A multi-touch variant of 'motionCallback'.
932+
933+ multiMotionCallback :: SettableStateVar (Maybe MultiMotionCallback )
934+ multiMotionCallback = makeSettableStateVar $
935+ setCallback MultiMotionCB glutMultiMotionFunc (makeMultiMotionFunc . unmarshal)
936+ where unmarshal cb d x y =
937+ cb (fromIntegral d) (Position (fromIntegral x) (fromIntegral y))
938+
939+ -- | (/freeglut only/) A multi-touch variant of 'passiveMotionCallback'.
940+
941+ multiPassiveMotionCallback :: SettableStateVar (Maybe MultiMotionCallback )
942+ multiPassiveMotionCallback = makeSettableStateVar $
943+ setCallback MultiPassiveCB glutMultiPassiveFunc (makeMultiPassiveFunc . unmarshal)
944+ where unmarshal cb d x y =
945+ cb (fromIntegral d) (Position (fromIntegral x) (fromIntegral y))
0 commit comments