在gtk2hs中切换事件处理程序

时间:2011-02-24 20:37:55

标签: haskell event-handling gtk gtk2hs

我想做这样的事情:

handlerOn = do
  cid <- canvas `on` buttonPressEvent $ tryEvent do
    signalDisconnect cid
    handlerOff
  putStrLn "handlerOn"

handlerOff = do
  cid <- canvas `on` buttonPressEvent $ tryEvent do
    signalDisconnect cid
    handlerOn
  putStrLn "handlerOff"

当然,这不会起作用,因为我正在尝试在尚未分配cid的代码块中使用cid。

这个想法是注册一个事件监听器,当它收到一个事件时,它将取消注册自己并注册一个不同的事件监听器,它将来回执行相同的操作。

1 个答案:

答案 0 :(得分:5)

GHC支持recursive do

handlerOn = do
  rec cid <- canvas `on` buttonPressEvent $ tryEvent do
    signalDisconnect cid
    handlerOff
  putStrLn "handlerOn"

您也可以使用Control.Monad.Fix

handlerOff = do
  mfix $ \cid -> canvas `on` buttonPressEvent $ tryEvent do
    signalDisconnect cid
    handlerOn
  putStrLn "handlerOff"

或者自己管理处理程序。

do ...
    h <- newIORef undefined
    let handlerOn = do
            ...
            writeIORef h handlerOff
        handlerOff = do
            ...
            writeIORef h handlerOn
    writeIORef h handlerOn
    canvas `on` buttonPressEvent $ tryEvent =<< readIORef h

或者只是把所有东西都变成一个处理程序。

do ...
    ms <- newIORef False
    canvas `on` buttonPressEvent $ tryEvent do
        s <- readIORef ms
        if s
            then ...
            else ...
相关问题