Save the opened window in the state.
[matthijs/projects/fpprac.git] / FPPrac.hs
index ddf421ebf8821c191cfb8c2fd85fb5786c9c4b42..47b3cad30e0c80c06efa2445adeebc50b9ab7e62 100644 (file)
--- a/FPPrac.hs
+++ b/FPPrac.hs
@@ -9,6 +9,11 @@ module FPPrac (
 ) where
 
 import qualified Graphics.UI.Gtk as Gtk
+import Graphics.UI.Gtk (AttrOp(..)) -- For the := constructor
+import qualified Graphics.Rendering.Cairo as Cairo
+import qualified Graphics.UI.Gtk.Gdk.EventM as EventM
+
+import Control.Monad.Trans -- for liftIO
 import Data.IORef
 import Control.Applicative
 import Control.Monad
@@ -93,10 +98,8 @@ testProg = Main
        }
 
 data IState = forall s. IS
-       { {-sFrame    :: Frame    ()
-       , sPanel    :: Panel    ()
-       , buffer    :: MemoryDC ()
-       , -}postponed :: IORef [Request]
+       { window    :: Gtk.Window
+       , postponed :: IORef [Request]
        , usrState  :: IORef s
        , usrProg   :: TinaStep s
        }
@@ -129,11 +132,33 @@ runTina :: TinaProgram -> IO ()
 runTina Main {..} = do
        usrState  <- newIORef initialState
        postponed <- newIORef (GfxText (rgb 0 0 0) (pt 50 50) "foo" : GfxClear :initialRequests)
-       let state = IS { usrProg = eventHandler, .. }
-       runGUI {-(sz windowWidth windowHeight) -}state
+       let state = IS { window = undefined, usrProg = eventHandler, .. }
+       runGUI windowWidth windowHeight state
+
+runGUI :: Int -> Int -> IState -> IO ()
+runGUI w h s = do
+       -- Init GTK.
+       Gtk.initGUI
+       
+       -- Create a window, which will make the mainloop terminated when
+       -- it is closed.
+       window <- Gtk.windowNew
+               
+       Gtk.set window [ Gtk.containerBorderWidth := 10
+                      , Gtk.windowTitle := "FP Practicum" 
+                      , Gtk.windowDefaultWidth := w
+                      , Gtk.windowDefaultHeight := h
+                      ]
+       Gtk.onDestroy window Gtk.mainQuit
+
+       -- Add the window to the state
+       let state = s { window = window }
+       
+       -- Show the window and start the Gtk mainloop.
+       Gtk.widgetShowAll window
+       Gtk.mainGUI
+
 
-runGUI :: {-Size ->-} IState -> IO ()
-runGUI s = do return ()
 {-
 runGUI s IS {..} = do
        sFrame <- frame