Прежде всего, getWindowEvent
будет блокироваться, пока не произойдет следующее событие, поэтому все отрисовывается только по событию. Если вы считаете, что событие окна запускается слишком часто, вы можете напечатать события на стандартный вывод, чтобы выяснить, какое событие вызвано, и просто проигнорировать его (например, пропустить рисование для всех событий, кроме события Button).
Кстати: вы не IORef, вы можете просто пропустить текущий цвет через цикл.
testDemo points =
runGraphics $
do
w <- openWindow "Test" (480, 550)
let
loop0 color = do
e <- getWindowEvent w
let newColor = case e of
Button {pt=pt, isDown=isDown}
| isDown && color == Green -> Red
| isDown && color == Red -> Green
_ -> color
when (newColor != color) (drawInWindow w (withColor color (polyline points)))
loop0 color
let color = Red
drawInWindow w (withColor color (polyline points))
loop0 color
(Код не проверяется с помощью компилятора, поэтому ...)