Resize the backbuffer when the window is resized.
authorMatthijs Kooijman <matthijs@stdin.nl>
Mon, 24 Aug 2009 19:55:02 +0000 (21:55 +0200)
committerMatthijs Kooijman <matthijs@stdin.nl>
Mon, 24 Aug 2009 19:55:02 +0000 (21:55 +0200)
FPPrac.hs

index 14e8c4f872036b122449cf12242e3338936520c5..7e5a6914225519e0d3056b50344467794f405091 100644 (file)
--- a/FPPrac.hs
+++ b/FPPrac.hs
@@ -162,8 +162,9 @@ runGUI w h (IS { .. }) = do
        buffer' <- Cairo.createImageSurface Cairo.FormatARGB32 w h
        buffer <- newIORef buffer'
 
-       -- Register the expose event
+       -- Register events
        Gtk.on window Gtk.exposeEvent $ onExpose buffer
+       Gtk.on window Gtk.configureEvent $ onResize buffer
 
        -- Repack state
        let state = IS { .. }
@@ -187,6 +188,32 @@ onExpose buffer = do
                Cairo.paint
        return True -- No clue what this means
 
+-- | Called when the window is resized. Resize the given buffer if needed.
+onResize :: IORef Cairo.Surface -> EventM.EventM EventM.EConfigure Bool
+onResize buffer = do
+       -- Get the current buffer and see if it's still big enough
+       current_buffer <- liftIO $ readIORef buffer
+       sw <- Cairo.imageSurfaceGetWidth current_buffer
+       sh <- Cairo.imageSurfaceGetHeight current_buffer
+       -- Get the current drawwindow and its size
+       dw <- EventM.eventWindow
+       (w, h) <- liftIO $ Gtk.drawableGetSize dw
+       when (w > sw || h > sh) $ liftIO $ do
+               -- Buffer is too small, expand it.
+               new_buffer <- Cairo.createImageSurface Cairo.FormatARGB32 w h
+               -- Fill it with white and copy the old buffer
+               Cairo.renderWith new_buffer $ do
+                       Cairo.setSourceRGB 1 1 1
+                       Cairo.paint
+                       Cairo.setSourceSurface current_buffer 0 0
+                       Cairo.paint
+               -- Clean up the old buffer
+               Cairo.surfaceFinish current_buffer
+               -- Store and return the new buffer
+               writeIORef buffer new_buffer
+       return True -- No clue what this means
+                               
+
 {-
 runGUI s IS {..} = do
        sFrame <- frame