@@ -60,7 +60,14 @@ module Graphics.UI.GLUT.Callbacks.Window (
60
60
61
61
-- * Joystick callback
62
62
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
+
64
71
) where
65
72
66
73
import Data.Bits hiding ( shift )
@@ -294,15 +301,20 @@ windowStateCallback = makeSettableStateVar $
294
301
295
302
--------------------------------------------------------------------------------
296
303
304
+ -- | A window close callback
305
+
297
306
type CloseCallback = IO ()
298
307
308
+ -- | Controls the window close callback for the /current window/.
309
+
299
310
closeCallback :: SettableStateVar (Maybe CloseCallback )
300
311
closeCallback = makeSettableStateVar $
301
312
setCallback CloseCB glutCloseFunc makeCloseFunc
302
313
303
314
--------------------------------------------------------------------------------
304
315
305
316
-- | A keyboard callback
317
+
306
318
type KeyboardCallback = Char -> Position -> IO ()
307
319
308
320
setKeyboardCallback :: Maybe KeyboardCallback -> IO ()
@@ -313,6 +325,7 @@ setKeyboardCallback =
313
325
314
326
-- | Controls the keyboard callback for the /current window/. This is
315
327
-- activated only when a key is pressed.
328
+
316
329
keyboardCallback :: SettableStateVar (Maybe KeyboardCallback )
317
330
keyboardCallback = makeSettableStateVar setKeyboardCallback
318
331
@@ -327,8 +340,10 @@ setKeyboardUpCallback =
327
340
328
341
-- | Controls the keyboard callback for the /current window/. This is
329
342
-- activated only when a key is released.
343
+
330
344
keyboardUpCallback :: SettableStateVar (Maybe KeyboardCallback )
331
345
keyboardUpCallback = makeSettableStateVar setKeyboardUpCallback
346
+
332
347
--------------------------------------------------------------------------------
333
348
334
349
-- | Special keys
@@ -406,6 +421,7 @@ unmarshalSpecialKey x
406
421
--------------------------------------------------------------------------------
407
422
408
423
-- | A special key callback
424
+
409
425
type SpecialCallback = SpecialKey -> Position -> IO ()
410
426
411
427
setSpecialCallback :: Maybe SpecialCallback -> IO ()
@@ -416,8 +432,10 @@ setSpecialCallback =
416
432
417
433
-- | Controls the special key callback for the /current window/. This is
418
434
-- activated only when a special key is pressed.
435
+
419
436
specialCallback :: SettableStateVar (Maybe SpecialCallback )
420
437
specialCallback = makeSettableStateVar setSpecialCallback
438
+
421
439
--------------------------------------------------------------------------------
422
440
423
441
setSpecialUpCallback :: Maybe SpecialCallback -> IO ()
@@ -428,8 +446,10 @@ setSpecialUpCallback =
428
446
429
447
-- | Controls the special key callback for the /current window/. This is
430
448
-- activated only when a special key is released.
449
+
431
450
specialUpCallback :: SettableStateVar (Maybe SpecialCallback )
432
451
specialUpCallback = makeSettableStateVar setSpecialUpCallback
452
+
433
453
--------------------------------------------------------------------------------
434
454
435
455
-- | The current state of a key or button
@@ -448,6 +468,7 @@ unmarshalKeyState x
448
468
--------------------------------------------------------------------------------
449
469
450
470
-- | A mouse callback
471
+
451
472
type MouseCallback = MouseButton -> KeyState -> Position -> IO ()
452
473
453
474
setMouseCallback :: Maybe MouseCallback -> IO ()
@@ -458,8 +479,10 @@ setMouseCallback =
458
479
(Position (fromIntegral x) (fromIntegral y))
459
480
460
481
-- | Controls the mouse callback for the /current window/.
482
+
461
483
mouseCallback :: SettableStateVar (Maybe MouseCallback )
462
484
mouseCallback = makeSettableStateVar setMouseCallback
485
+
463
486
--------------------------------------------------------------------------------
464
487
465
488
-- | The state of the keyboard modifiers
@@ -867,3 +890,56 @@ joystickCallback =
867
890
(JoystickPosition (fromIntegral x)
868
891
(fromIntegral y)
869
892
(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