X-Git-Url: https://git.stderr.nl/gitweb?p=matthijs%2Fprojects%2Ffpprac.git;a=blobdiff_plain;f=FPPrac.hs;fp=FPPrac.hs;h=7e5a6914225519e0d3056b50344467794f405091;hp=14e8c4f872036b122449cf12242e3338936520c5;hb=34b8f3ca223d5404d5f298e5fe9eb41c4002f0cb;hpb=25a54fccc78a8c85e3196428c677e213c1eab23e diff --git a/FPPrac.hs b/FPPrac.hs index 14e8c4f..7e5a691 100644 --- 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