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 { .. }
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