import TestSample ( myConfig, Config(..), TestTalker ) import Control.EventDriven ( putEvent_, initializeTalker ) import Graphics.UI.Gtk import Graphics.UI.Gtk.Gdk.GC import Graphics.Rendering.Cairo import Data.IORef data Config2 iface = Config2 { initialize :: IO iface } {- gtkConfig :: Config2 ( IORef String ) gtkConfig = Config2 { -- initialize = initializeGtk } -} {- initializeGtk :: IO ( IORef TestTalker, IORef String, IORef String, PangoLayout ) -} initializeGtk = do talker <- newIORef $ initializeTalker ( initV myConfig ) ( kbind myConfig ) buffer <- newIORef "" monitor <- newIORef "" initGUI window <- windowNew canvas <- drawingAreaNew set window [ containerChild := canvas ] pc <- cairoCreateContext Nothing lay <- layoutText pc "" on canvas exposeEvent $ do win <- eventWindow liftIO $ do gc <- gcNew win renderWithDrawable win $ do moveTo 0 0 showLayout lay return True onDestroy window mainQuit return ( window, canvas, talker, buffer, monitor, lay ) main :: IO () main = do ( window, canvas, talker, buffer, monitor, lay ) <- initializeGtk on window keyPressEvent $ do keyNam <- eventKeyName keyChar <- fmap keyToChar eventKeyVal liftIO $ case ( keyChar, keyNam ) of ( Nothing, "Return" ) -> do cmd <- readIORef buffer tk <- readIORef talker let outputToCanvas n = do modifyIORef monitor (++ '\n' : show n) return n mtk <- putEvent_ ( ebind myConfig ) outputToCanvas tk cmd case mtk of Nothing -> mainQuit Just ntk -> writeIORef talker ntk writeIORef buffer "" modifyIORef monitor (++ "\n") ( Just c , _ ) -> do modifyIORef buffer (++ [ c ]) modifyIORef monitor (++ [ c ]) _ -> return () liftIO $ do cmd <- readIORef monitor layoutSetText lay cmd widgetQueueDraw canvas return True widgetShowAll window mainGUI