summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSilenio Quarti <silenio_quarti@ca.ibm.com>2012-11-08 14:24:47 -0500
committerSilenio Quarti <silenio_quarti@ca.ibm.com>2012-11-08 14:25:21 -0500
commit79b4c494683ecd3609c3ab417806e1f053ca5e78 (patch)
tree7ac31f1f5d459ac982b656a379c6c81dae03c2aa
parent73ee56991535559e50652ecc6391cdfa11c08af2 (diff)
downloadeclipse.platform.swt-79b4c494683ecd3609c3ab417806e1f053ca5e78.tar.gz
eclipse.platform.swt-79b4c494683ecd3609c3ab417806e1f053ca5e78.tar.xz
eclipse.platform.swt-79b4c494683ecd3609c3ab417806e1f053ca5e78.zip
Bug 393793 - [GTK3] Scroll wheel does not work in editor or package explorer - support GDK_SCROLL_SMOOTH
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_structs.c16
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GdkEventScroll.java4
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java1
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java9
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scrollable.java57
5 files changed, 71 insertions, 16 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_structs.c b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_structs.c
index a8813e21e9..47cf692563 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_structs.c
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_structs.c
@@ -761,7 +761,7 @@ void setGdkEventPropertyFields(JNIEnv *env, jobject lpObject, GdkEventProperty *
typedef struct GdkEventScroll_FID_CACHE {
int cached;
jclass clazz;
- jfieldID window, send_event, time, x, y, state, direction, device, x_root, y_root;
+ jfieldID window, send_event, time, x, y, state, direction, device, x_root, y_root, delta_x, delta_y;
} GdkEventScroll_FID_CACHE;
GdkEventScroll_FID_CACHE GdkEventScrollFc;
@@ -781,6 +781,8 @@ void cacheGdkEventScrollFields(JNIEnv *env, jobject lpObject)
GdkEventScrollFc.device = (*env)->GetFieldID(env, GdkEventScrollFc.clazz, "device", I_J);
GdkEventScrollFc.x_root = (*env)->GetFieldID(env, GdkEventScrollFc.clazz, "x_root", "D");
GdkEventScrollFc.y_root = (*env)->GetFieldID(env, GdkEventScrollFc.clazz, "y_root", "D");
+ GdkEventScrollFc.delta_x = (*env)->GetFieldID(env, GdkEventScrollFc.clazz, "delta_x", "D");
+ GdkEventScrollFc.delta_y = (*env)->GetFieldID(env, GdkEventScrollFc.clazz, "delta_y", "D");
GdkEventScrollFc.cached = 1;
}
@@ -798,6 +800,12 @@ GdkEventScroll *getGdkEventScrollFields(JNIEnv *env, jobject lpObject, GdkEventS
lpStruct->device = (GdkDevice *)(*env)->GetIntLongField(env, lpObject, GdkEventScrollFc.device);
lpStruct->x_root = (gdouble)(*env)->GetDoubleField(env, lpObject, GdkEventScrollFc.x_root);
lpStruct->y_root = (gdouble)(*env)->GetDoubleField(env, lpObject, GdkEventScrollFc.y_root);
+#ifdef GTK3
+ lpStruct->delta_x = (gdouble)(*env)->GetDoubleField(env, lpObject, GdkEventScrollFc.delta_x);
+#endif
+#ifdef GTK3
+ lpStruct->delta_y = (gdouble)(*env)->GetDoubleField(env, lpObject, GdkEventScrollFc.delta_y);
+#endif
return lpStruct;
}
@@ -815,6 +823,12 @@ void setGdkEventScrollFields(JNIEnv *env, jobject lpObject, GdkEventScroll *lpSt
(*env)->SetIntLongField(env, lpObject, GdkEventScrollFc.device, (jintLong)lpStruct->device);
(*env)->SetDoubleField(env, lpObject, GdkEventScrollFc.x_root, (jdouble)lpStruct->x_root);
(*env)->SetDoubleField(env, lpObject, GdkEventScrollFc.y_root, (jdouble)lpStruct->y_root);
+#ifdef GTK3
+ (*env)->SetDoubleField(env, lpObject, GdkEventScrollFc.delta_x, (jdouble)lpStruct->delta_x);
+#endif
+#ifdef GTK3
+ (*env)->SetDoubleField(env, lpObject, GdkEventScrollFc.delta_y, (jdouble)lpStruct->delta_y);
+#endif
}
#endif
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GdkEventScroll.java b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GdkEventScroll.java
index ca84ca0a6b..2e04912c34 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GdkEventScroll.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GdkEventScroll.java
@@ -36,5 +36,9 @@ public class GdkEventScroll extends GdkEvent {
public double x_root;
/** @field cast=(gdouble) */
public double y_root;
+ /** @field cast=(gdouble),exclude=#ifdef GTK3 */
+ public double delta_x;
+ /** @field cast=(gdouble),exclude=#ifdef GTK3 */
+ public double delta_y;
public static final int sizeof = OS.GdkEventScroll_sizeof();
}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java
index bed45d6ed3..5256d811a4 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java
@@ -240,6 +240,7 @@ public class OS extends C {
public static final int GDK_SCROLL_DOWN = 1;
public static final int GDK_SCROLL_LEFT = 2;
public static final int GDK_SCROLL_RIGHT = 3;
+ public static final int GDK_SCROLL_SMOOTH = 4;
public static final int GDK_SELECTION_CLEAR = 17;
public static final int GDK_SELECTION_NOTIFY = 19;
public static final int GDK_SELECTION_REQUEST = 18;
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 7ac8e549e6..c12e2739ea 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
@@ -3269,6 +3269,15 @@ long /*int*/ gtk_scroll_event (long /*int*/ widget, long /*int*/ eventPtr) {
return sendMouseEvent (SWT.MouseHorizontalWheel, 0, 3, 0, true, gdkEvent.time, gdkEvent.x_root, gdkEvent.y_root, false, gdkEvent.state) ? 0 : 1;
case OS.GDK_SCROLL_RIGHT:
return sendMouseEvent (SWT.MouseHorizontalWheel, 0, -3, 0, true, gdkEvent.time, gdkEvent.x_root, gdkEvent.y_root, false, gdkEvent.state) ? 0 : 1;
+ case OS.GDK_SCROLL_SMOOTH:
+ long /*int*/ result = 0;
+ if (gdkEvent.delta_x != 0) {
+ result = (sendMouseEvent (SWT.MouseHorizontalWheel, 0, (int)(3 * gdkEvent.delta_x), 0, true, gdkEvent.time, gdkEvent.x_root, gdkEvent.y_root, false, gdkEvent.state) ? 0 : 1);
+ }
+ if (gdkEvent.delta_y != 0) {
+ result = (sendMouseEvent (SWT.MouseWheel, 0, (int)(3 * gdkEvent.delta_y), SWT.SCROLL_LINE, true, gdkEvent.time, gdkEvent.x_root, gdkEvent.y_root, false, gdkEvent.state) ? 0 : 1);
+ }
+ return result;
}
return 0;
}
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 967660d915..38eb0997e9 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
@@ -280,22 +280,49 @@ long /*int*/ gtk_scroll_event (long /*int*/ widget, long /*int*/ eventPtr) {
ScrollBar scrollBar;
GdkEventScroll gdkEvent = new GdkEventScroll ();
OS.memmove (gdkEvent, eventPtr, GdkEventScroll.sizeof);
- if (gdkEvent.direction == OS.GDK_SCROLL_UP || gdkEvent.direction == OS.GDK_SCROLL_DOWN) {
- scrollBar = verticalBar;
+ if (gdkEvent.direction == OS.GDK_SCROLL_SMOOTH) {
+ if (gdkEvent.delta_x != 0) {
+ scrollBar = horizontalBar;
+ if (scrollBar != null && !gtk_widget_get_visible (scrollBar.handle) && scrollBar.getEnabled()) {
+ GtkAdjustment adjustment = new GtkAdjustment ();
+ gtk_adjustment_get (scrollBar.adjustmentHandle, adjustment);
+ double delta = Math.pow(adjustment.page_size, 2.0 / 3.0) * gdkEvent.delta_x;
+ int value = (int) Math.max(adjustment.lower,
+ Math.min(adjustment.upper - adjustment.page_size, adjustment.value + delta));
+ OS.gtk_adjustment_set_value (scrollBar.adjustmentHandle, value);
+ result = 1;
+ }
+ }
+ if (gdkEvent.delta_y != 0) {
+ scrollBar = verticalBar;
+ if (scrollBar != null && !gtk_widget_get_visible (scrollBar.handle) && scrollBar.getEnabled()) {
+ GtkAdjustment adjustment = new GtkAdjustment ();
+ gtk_adjustment_get (scrollBar.adjustmentHandle, adjustment);
+ double delta = Math.pow(adjustment.page_size, 2.0 / 3.0) * gdkEvent.delta_y;
+ int value = (int) Math.max(adjustment.lower,
+ Math.min(adjustment.upper - adjustment.page_size, adjustment.value + delta));
+ OS.gtk_adjustment_set_value (scrollBar.adjustmentHandle, value);
+ result = 1;
+ }
+ }
} else {
- scrollBar = horizontalBar;
- }
- if (scrollBar != null && !gtk_widget_get_visible (scrollBar.handle) && scrollBar.getEnabled()) {
- GtkAdjustment adjustment = new GtkAdjustment ();
- gtk_adjustment_get (scrollBar.adjustmentHandle, adjustment);
- /* Calculate wheel delta to match GTK+ 2.4 and higher */
- int wheel_delta = (int) Math.pow(adjustment.page_size, 2.0 / 3.0);
- if (gdkEvent.direction == OS.GDK_SCROLL_UP || gdkEvent.direction == OS.GDK_SCROLL_LEFT)
- wheel_delta = -wheel_delta;
- int value = (int) Math.max(adjustment.lower,
- Math.min(adjustment.upper - adjustment.page_size, adjustment.value + wheel_delta));
- OS.gtk_adjustment_set_value (scrollBar.adjustmentHandle, value);
- return 1;
+ if (gdkEvent.direction == OS.GDK_SCROLL_UP || gdkEvent.direction == OS.GDK_SCROLL_DOWN) {
+ scrollBar = verticalBar;
+ } else {
+ scrollBar = horizontalBar;
+ }
+ if (scrollBar != null && !gtk_widget_get_visible (scrollBar.handle) && scrollBar.getEnabled()) {
+ GtkAdjustment adjustment = new GtkAdjustment ();
+ gtk_adjustment_get (scrollBar.adjustmentHandle, adjustment);
+ /* Calculate wheel delta to match GTK+ 2.4 and higher */
+ int wheel_delta = (int) Math.pow(adjustment.page_size, 2.0 / 3.0);
+ if (gdkEvent.direction == OS.GDK_SCROLL_UP || gdkEvent.direction == OS.GDK_SCROLL_LEFT)
+ wheel_delta = -wheel_delta;
+ int value = (int) Math.max(adjustment.lower,
+ Math.min(adjustment.upper - adjustment.page_size, adjustment.value + wheel_delta));
+ OS.gtk_adjustment_set_value (scrollBar.adjustmentHandle, value);
+ return 1;
+ }
}
}
return result;