2012-08-02 83 views
2

我刚将一个C程序从GTK2移植到GTK3。该程序使用其上使用鼠标滚轮的GtkDrawingArea。切换到GTK3后,我无法正确检测到滚轮的使用情况。下面是我做的,并得到:GTK3:获取鼠标滚动方向

GTK2(10年2月24日)

  1. 我的GtkDrawingArea的事件掩码设置为GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_LEAVE_NOTIFY_MASK
  2. 我将信号处理程序连接到GtkDrawingAreascroll-event
  3. 一旦我使用滚轮,信号处理程序被调用并且GdkEventScroll的属性directionGDK_SCROLL_UPGDK_SCROLL_DOWN

GTK3(3.4.2)

  1. 除了上述之外,我包括在GtkDrawingArea的事件掩码GDK_SMOOTH_SCROLL_MASK。没有这个,我的信号处理程序从来没有被调用
  2. 我使用与上述相同的信号处理程序。
  3. 一旦我使用滚轮,信号处理程序被调用,并且GdkEventScroll的属性directionGDK_SCROLL_SMOOTH。打电话gdk_event_get_scroll_deltas()给我总是0为delta_xdelta_y。我从来没有看到GDK_SCROLL_SMOOTH以外的其他方向。

虽然我的鼠标本身只提供“离散”button4/5事件,但我该如何计算滚动事件的方向?我可以接受平滑滚动事件吗?

顺便说一句:我在amd64上使用Ubuntu 12.04。

+0

我发现了一个[关于从'GDK_SCROLL_ {UP | DOWN}'切换到'GDK_SCROLL_SMOOTH']的讨论(http://comments.gmane.org/gmane.comp.gnome.desktop/46513),但是那里没有提到delta_x和delta_y为0。 – dasup 2012-08-02 11:07:57

+0

你试过添加GDK_SCROLL_MASK吗?假设你不关心平滑滚动。请参阅https://bugzilla.gnome.org/show_bug.cgi?id=671305 – ergosys 2012-08-02 17:31:38

+0

@ergosys:是的,我包含'GDK_SCROLL_MASK'(参见GTK3下的1.)。如果没有这个标志,我的信号处理程序就不会在GTK3下调用。 – dasup 2012-08-03 08:44:26

回答

2

Gtk3中有一个与“scroll-event”信号相关的bug。首先,在回调中,您应该使用GdkEventScroll结构的delta_x和delta_y成员。其次,您第一次滚动鼠标时,这些成员都将为零(错误!)。后续的滚动会给你正确的值。第三,看来这个错误不会被修复,不幸的是。

+0

谢谢你指出这一点。但是,在我的测试中,delta_x和delta_y始终为0,不仅是第一个事件。无论如何,我放弃了找到问题的根源,并转而使用GDK_SCROLL_UP/DOWN而不是GDK_SCROLL_SMOOTH。 – dasup 2012-09-03 14:05:37