diff options
author | Eric Williams | 2019-03-15 17:41:28 +0000 |
---|---|---|
committer | Eric Williams | 2019-03-15 19:09:18 +0000 |
commit | 503289d0caf86406cbac61cd86030cd7d18ec4d8 (patch) | |
tree | 676128344b7fff6f202fbfb876bc957e482147cb | |
parent | 43234122f502f709237b72a329b42036a27582db (diff) | |
download | eclipse.platform.swt-503289d0caf86406cbac61cd86030cd7d18ec4d8.tar.gz eclipse.platform.swt-503289d0caf86406cbac61cd86030cd7d18ec4d8.tar.xz eclipse.platform.swt-503289d0caf86406cbac61cd86030cd7d18ec4d8.zip |
Bug 545403: [GTK3] MouseWheel event only reports GDK.GDK_SCROLL_UP
gdk_event_get_scroll_direction() will return false if GDK_SMOOTH is
enabled. The fix is to check if this function returns false, and then
call gdk_event_get_scroll_deltas() to get the scroll delta.
Change-Id: I27bb15b61d9da4c5e749e71d6bb27bbcfc63b879
Signed-off-by: Eric Williams <ericwill@redhat.com>
3 files changed, 64 insertions, 24 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java index 9d202ecfcc..8ae4bbbdb5 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java @@ -4131,6 +4131,7 @@ long /*int*/ gtk_realize (long /*int*/ widget) { @Override long /*int*/ gtk_scroll_event (long /*int*/ widget, long /*int*/ eventPtr) { + long /*int*/ result = 0; double [] eventX = new double[1]; double [] eventY = new double[1]; GDK.gdk_event_get_coords(eventPtr, eventX, eventY); @@ -4143,31 +4144,31 @@ long /*int*/ gtk_scroll_event (long /*int*/ widget, long /*int*/ eventPtr) { lastInput.x = (int) eventX[0]; lastInput.y = (int) eventY[0]; int [] direction = new int[1]; - GDK.gdk_event_get_scroll_direction(eventPtr, direction); + boolean fetched = GDK.gdk_event_get_scroll_direction(eventPtr, direction); if (containedInRegion(lastInput.x, lastInput.y)) return 0; - switch (direction[0]) { - case GDK.GDK_SCROLL_UP: - return sendMouseEvent (SWT.MouseWheel, 0, 3, SWT.SCROLL_LINE, true, time, eventRX[0], eventRY[0], false, state[0]) ? 0 : 1; - case GDK.GDK_SCROLL_DOWN: - return sendMouseEvent (SWT.MouseWheel, 0, -3, SWT.SCROLL_LINE, true, time, eventRX[0], eventRY[0], false, state[0]) ? 0 : 1; - case GDK.GDK_SCROLL_LEFT: - return sendMouseEvent (SWT.MouseHorizontalWheel, 0, 3, 0, true, time, eventRX[0], eventRY[0], false, state[0]) ? 0 : 1; - case GDK.GDK_SCROLL_RIGHT: - return sendMouseEvent (SWT.MouseHorizontalWheel, 0, -3, 0, true, time, eventRX[0], eventRY[0], false, state[0]) ? 0 : 1; - case GDK.GDK_SCROLL_SMOOTH: - long /*int*/ result = 0; - double[] delta_x = new double[1], delta_y = new double [1]; - if (GDK.gdk_event_get_scroll_deltas (eventPtr, delta_x, delta_y)) { - if (delta_x [0] != 0) { - result = (sendMouseEvent (SWT.MouseHorizontalWheel, 0, (int)(-3 * delta_x [0]), 0, true, time, eventRX[0], eventRY[0], false, state[0]) ? 0 : 1); - } - if (delta_y [0] != 0) { - result = (sendMouseEvent (SWT.MouseWheel, 0, (int)(-3 * delta_y [0]), SWT.SCROLL_LINE, true, time, eventRX[0], eventRY[0], false, state[0]) ? 0 : 1); - } + if (fetched) { + switch (direction[0]) { + case GDK.GDK_SCROLL_UP: + return sendMouseEvent (SWT.MouseWheel, 0, 3, SWT.SCROLL_LINE, true, time, eventRX[0], eventRY[0], false, state[0]) ? 0 : 1; + case GDK.GDK_SCROLL_DOWN: + return sendMouseEvent (SWT.MouseWheel, 0, -3, SWT.SCROLL_LINE, true, time, eventRX[0], eventRY[0], false, state[0]) ? 0 : 1; + case GDK.GDK_SCROLL_LEFT: + return sendMouseEvent (SWT.MouseHorizontalWheel, 0, 3, 0, true, time, eventRX[0], eventRY[0], false, state[0]) ? 0 : 1; + case GDK.GDK_SCROLL_RIGHT: + return sendMouseEvent (SWT.MouseHorizontalWheel, 0, -3, 0, true, time, eventRX[0], eventRY[0], false, state[0]) ? 0 : 1; + } + } else { + double[] delta_x = new double[1], delta_y = new double [1]; + if (GDK.gdk_event_get_scroll_deltas (eventPtr, delta_x, delta_y)) { + if (delta_x [0] != 0) { + result = (sendMouseEvent (SWT.MouseHorizontalWheel, 0, (int)(-3 * delta_x [0]), 0, true, time, eventRX[0], eventRY[0], false, state[0]) ? 0 : 1); } - return result; + if (delta_y [0] != 0) { + result = (sendMouseEvent (SWT.MouseWheel, 0, (int)(-3 * delta_y [0]), SWT.SCROLL_LINE, true, time, eventRX[0], eventRY[0], false, state[0]) ? 0 : 1); + } + } } - return 0; + return result; } @Override diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scrollable.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scrollable.java index c8c10beccb..1c9054a060 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scrollable.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scrollable.java @@ -315,8 +315,8 @@ long /*int*/ gtk_scroll_event (long /*int*/ widget, long /*int*/ eventPtr) { if ((state & CANVAS) != 0) { ScrollBar scrollBar; int [] direction = new int[1]; - GDK.gdk_event_get_scroll_direction(eventPtr, direction); - if (direction[0] == GDK.GDK_SCROLL_SMOOTH) { + boolean fetched = GDK.gdk_event_get_scroll_direction(eventPtr, direction); + if (!fetched) { double[] delta_x = new double[1], delta_y = new double [1]; if (GDK.gdk_event_get_scroll_deltas (eventPtr, delta_x, delta_y)) { if (delta_x [0] != 0) { diff --git a/tests/org.eclipse.swt.tests.gtk/ManualTests/org/eclipse/swt/tests/gtk/snippets/Bug545403_ScrollDirection.java b/tests/org.eclipse.swt.tests.gtk/ManualTests/org/eclipse/swt/tests/gtk/snippets/Bug545403_ScrollDirection.java new file mode 100644 index 0000000000..718ead0126 --- /dev/null +++ b/tests/org.eclipse.swt.tests.gtk/ManualTests/org/eclipse/swt/tests/gtk/snippets/Bug545403_ScrollDirection.java @@ -0,0 +1,39 @@ +/******************************************************************************* + * Copyright (c) 2019 Red Hat and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Red Hat - initial API and implementation + *******************************************************************************/ +package org.eclipse.swt.tests.gtk.snippets; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; + +public class Bug545403_ScrollDirection { + + public static void main(String[] args) { + final Display display = new Display(); + + final Shell shell = new Shell(display); + shell.addListener(SWT.MouseWheel, event -> System.out.println(event.count)); + + shell.setSize(300, 200); + shell.open(); + + while (!shell.isDisposed()) { + if (!display.readAndDispatch()) { + display.sleep(); + } + } + + display.dispose(); + } +}
\ No newline at end of file |