Haskell与gi-cairo和gi-gtk挂起

时间:2017-04-15 19:31:52

标签: haskell gtk gtk3 cairo

在我的一个项目中,我注意到当我在一个特殊的滚动视口中滚动时,程序不时挂起。我将问题浓缩为最小程序。

当您在可滚动区域中快速上下滚动时,它会挂起,但不会抛出任何错误消息。

通过尝试我发现了

onWidgetDraw drawingArea $ \(Context fp) -> withManagedPtr fp $ \p -> (`runReaderT` Cairo (castPtr p)) $ runRender $ do
   return True

负责挂起。没有这两行,它就可以正常工作。虽然我需要它们(在我的项目中,它只有两行,但它已经只挂了两行)。

我不知道发生了什么事。有人知道如何解决这个问题吗?

代码(github上的所有文件):

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE OverloadedLabels #-}

module NotificationCenter where

import Data.Maybe
import qualified Data.Text as Text
import Control.Monad.Trans.Reader (ReaderT(..))
import GI.Gtk as Gtk
import Graphics.Rendering.Cairo
import Graphics.Rendering.Cairo.Types (Cairo(..))
import Graphics.Rendering.Cairo.Internal (Render(..))
import GI.Cairo
import Foreign.Ptr (castPtr)

main :: IO ()
main = do
  Gtk.init Nothing
  let objsToGet = [ "main_window" , "main_bg" ]
  builder <- Gtk.builderNew
  Gtk.builderAddFromFile builder "crash.glade"

  (Just win) <- Gtk.builderGetObject builder "main_window"
  (Just bg) <- Gtk.builderGetObject builder "main_bg"

  mainWindow <- (Gtk.unsafeCastTo Gtk.Window) $ win
  drawingArea <- (Gtk.unsafeCastTo Gtk.DrawingArea) $ bg

  onWidgetDraw drawingArea $ \(Context fp) -> withManagedPtr fp $ \p -> (`runReaderT` Cairo (castPtr p)) $ runRender $ do
    return True

  onWidgetDestroy mainWindow mainQuit
  widgetShowAll mainWindow
  Gtk.main

1 个答案:

答案 0 :(得分:0)

这是haskell-gi的问题,由维护人员解决。