Make the GfxClear handler work.
authorMatthijs Kooijman <matthijs@stdin.nl>
Mon, 24 Aug 2009 18:42:25 +0000 (20:42 +0200)
committerMatthijs Kooijman <matthijs@stdin.nl>
Mon, 24 Aug 2009 18:42:25 +0000 (20:42 +0200)
This adds a gfxHandler wrapper that takes care of getting in the Render
monad and redrawing the window after drawing. It also ensures that
initial events are processed after initialization.

FPPrac.hs

index 79a6a0ac9405b167d0c76b931c9292bdc49462c4..d8fd94f5c1cf7b6271277c9c2e29dafdb1e029c5 100644 (file)
--- a/FPPrac.hs
+++ b/FPPrac.hs
@@ -166,10 +166,14 @@ runGUI w h (IS { .. }) = do
 
        -- Repack state
        let state = IS { .. }
-               
+       
+       -- Process any initial requests
+       processPostponed state
+
        -- Show the window and start the Gtk mainloop.
        Gtk.widgetShowAll window
        Gtk.mainGUI
+       
 
 -- | Copy the given surface to the exposed window on an expose event.
 onExpose :: IORef Cairo.Surface -> EventM.EventM EventM.EExpose Bool
@@ -256,6 +260,13 @@ winHandler s@IS {..} (WinMenu      ms) = Just $ mkMenu >>= \ms' -> sFrame `set`
 -}
 winHandler _        _                = Nothing
 
+gfxHandler s req = case gfxHandler' s req of
+       Nothing -> Nothing
+       Just render -> Just $ do
+               buf <- readIORef (buffer s)
+               Cairo.renderWith buf render
+               Gtk.widgetQueueDraw (window s)
+               
 {-
 gfxHandler IS {..} (GfxLines     col ps)    = Just $ polyline buffer ps [penColor := col] >> dirtyPts sPanel ps
 gfxHandler IS {..} (GfxPolygon   col ps)    = Just $ polygon  buffer ps [penColor := col, brushColor := col] >> dirtyPts sPanel ps
@@ -264,10 +275,10 @@ gfxHandler IS {..} (GfxRectangle col rt)    = Just $ drawRect buffer rt [penColo
 gfxHandler IS {..} (GfxEllipse   col rt)    = Just $ ellipse buffer rt [penColor := col, brushKind := BrushTransparent] >> dirtyRect sPanel rt
 gfxHandler IS {..} (GfxDisc      col rt)    = Just $ ellipse buffer rt [penColor := col, brushColor := col] >> dirtyRect sPanel rt
 gfxHandler IS {..} (GfxFont      st  sz)    = Just $ buffer `set` [ fontSize := sz, fontFace := st ]
-gfxHandler IS {..}  GfxClear                = Just $ dcClear buffer >> windowRefresh sPanel False
 gfxHandler IS {..} (GfxPicture   fd  pt)    = Just $ bitmapCreateFromFile fd >>= \bm -> drawBitmap buffer bm pt False [] >> bitmapGetSize bm >>= dirtyRect' sPanel pt
 -}
-gfxHandler _        _                       = Nothing
+gfxHandler' IS {..}  GfxClear                = Just $ Cairo.setSourceRGB 1 1 1 >> Cairo.paint
+gfxHandler' _        _                       = Nothing
 
 {-
 dirtyPts :: Window a -> [Point] -> IO ()