mirror of
				https://github.com/Drezil/dear-imgui.hs.git
				synced 2025-10-31 05:01:06 +01:00 
			
		
		
		
	This commit adds the Vulkan backend and SDL2 integration, and provides the `vulkan` example project.
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
| module Input where
 | |
| 
 | |
| -- base
 | |
| import Data.Int
 | |
|   ( Int32 )
 | |
| 
 | |
| -- sdl2
 | |
| import qualified SDL
 | |
| 
 | |
| --------------------------------------------------------------------------------
 | |
| 
 | |
| data Input = Input
 | |
|   { keysDown    :: [ SDL.Scancode ]
 | |
|   , keysPressed :: [ SDL.Scancode ]
 | |
|   , mousePos    :: ( Int32, Int32 )
 | |
|   , mouseRel    :: ( Int32, Int32 )
 | |
|   , quitAction  :: Bool
 | |
|   }
 | |
| 
 | |
| nullInput :: Input
 | |
| nullInput
 | |
|   = Input
 | |
|     { keysDown    = []
 | |
|     , keysPressed = []
 | |
|     , mousePos    = ( 0, 0 )
 | |
|     , mouseRel    = ( 0, 0 )
 | |
|     , quitAction  = False
 | |
|     }
 | |
| 
 | |
| onSDLInput :: Input -> SDL.EventPayload -> Input
 | |
| onSDLInput input SDL.QuitEvent
 | |
|   = input { quitAction = True }
 | |
| onSDLInput input (SDL.WindowClosedEvent _)
 | |
|   = input { quitAction = True }
 | |
| onSDLInput input ( SDL.KeyboardEvent ev )
 | |
|   = let keyCode = SDL.keysymScancode ( SDL.keyboardEventKeysym ev )
 | |
|     in case SDL.keyboardEventKeyMotion ev of
 | |
|          SDL.Pressed  -> input { keysDown    = keyCode : filter ( /= keyCode ) ( keysDown    input )
 | |
|                                , keysPressed = keyCode : filter ( /= keyCode ) ( keysPressed input )
 | |
|                                }
 | |
|          SDL.Released -> input { keysDown    =           filter ( /= keyCode ) ( keysDown    input ) }
 | |
| onSDLInput input ( SDL.MouseMotionEvent ev )
 | |
|   = input { mousePos = (px, py)
 | |
|           , mouseRel = (rx, ry)
 | |
|           }
 | |
|     where
 | |
|       SDL.P ( SDL.V2 px py ) = SDL.mouseMotionEventPos       ev
 | |
|       SDL.V2         rx ry   = SDL.mouseMotionEventRelMotion ev
 | |
| onSDLInput input _ = input
 | |
| 
 | |
| onSDLInputs :: Input -> [ SDL.EventPayload ] -> Input
 | |
| onSDLInputs prevInput events = escapeQuits $ foldl onSDLInput zeroedInput events
 | |
|   where
 | |
|     zeroedInput :: Input
 | |
|     zeroedInput = prevInput { keysPressed = [], mouseRel = ( 0, 0 ) }
 | |
|     escapeQuits :: Input -> Input
 | |
|     escapeQuits input
 | |
|       | SDL.ScancodeEscape `elem` keysPressed input
 | |
|       = input { quitAction = True }
 | |
|       | otherwise
 | |
|       = input
 |