在我的一个项目中,我注意到当我在一个特殊的滚动视口中滚动时,程序不时挂起。我将问题浓缩为最小程序。
当您在可滚动区域中快速上下滚动时,它会挂起,但不会抛出任何错误消息。
通过尝试我发现了
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
答案 0 :(得分:0)
这是haskell-gi的问题,由维护人员解决。