2012-08-02 44 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