按下按钮时 gtk3 motionNotifyEvent 不起作用

gtk3 motionNotifyEvent doesn't work when button is depressed

module Main where

import Control.Monad.IO.Class
import Graphics.UI.Gtk

main :: IO ()
main = do
    initGUI
    window <- windowNew
    canvas <- drawingAreaNew

    widgetAddEvents canvas [Button1MotionMask]

    canvas `on` motionNotifyEvent $ do
        c <- eventCoordinates
        liftIO $ print c
        return False

    containerAdd window canvas
    widgetShowAll window
    mainGUI

在上面的代码中,我试图在按下鼠标左键的 GtkDrawingArea 上处理 'mouse drag'。但是,没有打印任何内容,表明该事件从未触发。更奇怪的是,当我将 Button1MotionMask 更改为 PointerMotionMask 时,事件会在我正常移动鼠标(如预期)时触发,但在按下鼠标左键的同时移动鼠标时不会触发。这里发生了什么?我在 Windows 10.

上使用 gtk3-0.14.8

编辑: 我应该更清楚地了解我的问题。当我在移动鼠标的同时按住鼠标左键时,motionNotifyEvent 不触发。这不取决于我是否添加了 PointerMotionMaskButton1MotionMask.

有趣的是,关于 motion-notify-event 的 C 文档说

To receive this signal, the GdkWindow associated to the widget needs to enable the GDK_POINTER_MOTION_MASK mask

仅启用 GDK_BUTTON1_MOTION_MASK 对我也不起作用。 幸运的是,GdkEventMotion 有字段 state,你可以在其中检查 button1 是否被按下。

文档中好像没有提到,但事实证明你还需要启用ButtonPressMask来接收any鼠标按钮事件按下 - 包括按下按钮时发生的运动事件。这会导致矛盾的行为,即仅启用 Button1MotionMask 会导致收不到任何事件,除非您也启用 ButtonPressMask。在发现 gtk-demo 示例应用程序后,我终于弄明白了这一点 - 它对学习 GTK 非常有用!