cairo-0.13.12.0: demo/gtk3/Drawing.hs
-- Example of an drawing graphics onto a canvas.
import Graphics.UI.Gtk
import qualified Graphics.UI.Gtk as Gtk
import Graphics.Rendering.Cairo
import Graphics.UI.Gtk.Gdk.EventM
main = do
initGUI
dia <- dialogNew
-- in newer versions of GTK, 'size-request' is an invalid signal for Drawing areas,
-- so the default size of the window will be changed instead.
windowSetDefaultSize dia 400 400
dialogAddButton dia stockOk ResponseOk
contain <- dialogGetContentArea dia
canvas <- drawingAreaNew
ctxt <- cairoCreateContext Nothing
text <- layoutEmpty ctxt
text `layoutSetText` "Hello World."
canvas `on` draw $ updateCanvas canvas text
boxPackStart (castToBox contain) canvas PackGrow 0
widgetShow canvas
dialogRun dia
return ()
updateCanvas :: WidgetClass widget => widget -> PangoLayout -> Render ()
updateCanvas canvas text = do
width' <- liftIO $ widgetGetAllocatedWidth canvas
height' <- liftIO $ widgetGetAllocatedHeight canvas
let width = realToFrac width'
height = realToFrac height'
setSourceRGB 1 0 0
setLineWidth 20
setLineCap LineCapRound
setLineJoin LineJoinRound
moveTo 30 30
lineTo (width-30) (height-30)
lineTo (width-30) 30
lineTo 30 (height-30)
stroke
setSourceRGB 1 1 0
setLineWidth 4
save
translate (width / 2) (height / 2)
scale (width / 2) (height / 2)
arc 0 0 1 (135 * pi/180) (225 * pi/180)
restore
stroke
setSourceRGB 0 0 0
moveTo 30 (realToFrac height / 4)
rotate (pi/4)
showLayout text