From eda52aa9eeffdf431637caafca573e3f1ef8d50d Mon Sep 17 00:00:00 2001
From: Matthijs Kooijman <matthijs@stdin.nl>
Date: Mon, 24 Aug 2009 22:09:08 +0200
Subject: [PATCH] Make key events work.

---
 FPPrac.hs | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/FPPrac.hs b/FPPrac.hs
index 9f5ec9d..2a67b6e 100644
--- a/FPPrac.hs
+++ b/FPPrac.hs
@@ -162,20 +162,29 @@ runGUI w h (IS { .. }) = do
 	buffer' <- Cairo.createImageSurface Cairo.FormatARGB32 w h
 	buffer <- newIORef buffer'
 
+	-- Repack state
+	let state = IS { .. }
+	
 	-- Register events
 	Gtk.on window Gtk.exposeEvent $ onExpose buffer
 	Gtk.on window Gtk.configureEvent $ onResize buffer
+	Gtk.on window Gtk.keyPressEvent $ onKeyDown state
 
-	-- Repack state
-	let state = IS { .. }
-	
 	-- Process any initial requests
 	processPostponed state
 
 	-- Show the window and start the Gtk mainloop.
 	Gtk.widgetShowAll window
 	Gtk.mainGUI
-	
+
+-- | Called when a key is pressed.
+onKeyDown :: IState -> EventM.EventM EventM.EKey Bool
+onKeyDown s = do
+	keyval <- EventM.eventKeyVal
+	case Gtk.keyToChar keyval of
+		Just c -> liftIO $ post s (KeyIn c)
+		Nothing -> return ()
+	return True -- No clue what this means
 
 -- | Called when (part of) the window should be redrawn. Copy the given surface
 --   to the exposed window on an expose event.
-- 
2.30.2