Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Williams2019-03-15 17:41:28 +0000
committerEric Williams2019-03-15 19:09:18 +0000
commit503289d0caf86406cbac61cd86030cd7d18ec4d8 (patch)
tree676128344b7fff6f202fbfb876bc957e482147cb
parent43234122f502f709237b72a329b42036a27582db (diff)
downloadeclipse.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>
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java45
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scrollable.java4
-rw-r--r--tests/org.eclipse.swt.tests.gtk/ManualTests/org/eclipse/swt/tests/gtk/snippets/Bug545403_ScrollDirection.java39
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

Back to the top