summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSilenio Quarti <silenio_quarti@ca.ibm.com>2012-11-09 10:17:05 -0500
committerSilenio Quarti <silenio_quarti@ca.ibm.com>2012-11-09 10:17:19 -0500
commit92eda262fe6609e637257b664ef3791c831227e8 (patch)
treea6968996171d2bf8d1592d79873641b17d727b8e
parent3119075dc00aef0a5db54f40d0f324cff6c8737f (diff)
downloadeclipse.platform.swt-92eda262fe6609e637257b664ef3791c831227e8.tar.gz
eclipse.platform.swt-92eda262fe6609e637257b664ef3791c831227e8.tar.xz
eclipse.platform.swt-92eda262fe6609e637257b664ef3791c831227e8.zip
Bug 393793 - [GTK3] Scroll wheel does not work in editor or package explorer
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c27
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_custom.h1
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c1
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h1
-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.java13
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java13
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scrollable.java45
9 files changed, 76 insertions, 45 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c
index f5d63095fe..0fe252e604 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c
@@ -5632,6 +5632,33 @@ fail:
}
#endif
+#ifndef NO__1gdk_1event_1get_1scroll_1deltas
+JNIEXPORT jboolean JNICALL OS_NATIVE(_1gdk_1event_1get_1scroll_1deltas)
+ (JNIEnv *env, jclass that, jintLong arg0, jdoubleArray arg1, jdoubleArray arg2)
+{
+ jdouble *lparg1=NULL;
+ jdouble *lparg2=NULL;
+ jboolean rc = 0;
+ OS_NATIVE_ENTER(env, that, _1gdk_1event_1get_1scroll_1deltas_FUNC);
+ if (arg1) if ((lparg1 = (*env)->GetDoubleArrayElements(env, arg1, NULL)) == NULL) goto fail;
+ if (arg2) if ((lparg2 = (*env)->GetDoubleArrayElements(env, arg2, NULL)) == NULL) goto fail;
+/*
+ rc = (jboolean)gdk_event_get_scroll_deltas((GdkEvent *)arg0, lparg1, lparg2);
+*/
+ {
+ OS_LOAD_FUNCTION(fp, gdk_event_get_scroll_deltas)
+ if (fp) {
+ rc = (jboolean)((jboolean (CALLING_CONVENTION*)(GdkEvent *, jdouble *, jdouble *))fp)((GdkEvent *)arg0, lparg1, lparg2);
+ }
+ }
+fail:
+ if (arg2 && lparg2) (*env)->ReleaseDoubleArrayElements(env, arg2, lparg2, 0);
+ if (arg1 && lparg1) (*env)->ReleaseDoubleArrayElements(env, arg1, lparg1, 0);
+ OS_NATIVE_EXIT(env, that, _1gdk_1event_1get_1scroll_1deltas_FUNC);
+ return rc;
+}
+#endif
+
#ifndef NO__1gdk_1event_1get_1state
JNIEXPORT jboolean JNICALL OS_NATIVE(_1gdk_1event_1get_1state)
(JNIEnv *env, jclass that, jintLong arg0, jintArray arg1)
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_custom.h b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_custom.h
index fb948ddbab..0a9abfafec 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_custom.h
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_custom.h
@@ -523,6 +523,7 @@
#define gdk_window_set_background_pattern_LIB LIB_GTK
#define gtk_widget_input_shape_combine_region_LIB LIB_GTK
#define gtk_entry_set_placeholder_text_LIB LIB_GTK
+#define gdk_event_get_scroll_deltas_LIB LIB_GTK
/* Field accessors */
#if GTK_CHECK_VERSION(3,0,0)
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c
index cc6f7515d8..9d627e2a1f 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c
@@ -460,6 +460,7 @@ char * OS_nativeFunctionNames[] = {
"_1gdk_1event_1free",
"_1gdk_1event_1get",
"_1gdk_1event_1get_1coords",
+ "_1gdk_1event_1get_1scroll_1deltas",
"_1gdk_1event_1get_1state",
"_1gdk_1event_1get_1time",
"_1gdk_1event_1handler_1set",
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h
index 43eec81338..a9a6750add 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h
@@ -470,6 +470,7 @@ typedef enum {
_1gdk_1event_1free_FUNC,
_1gdk_1event_1get_FUNC,
_1gdk_1event_1get_1coords_FUNC,
+ _1gdk_1event_1get_1scroll_1deltas_FUNC,
_1gdk_1event_1get_1state_FUNC,
_1gdk_1event_1get_1time_FUNC,
_1gdk_1event_1handler_1set_FUNC,
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 47cf692563..a8813e21e9 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, delta_x, delta_y;
+ jfieldID window, send_event, time, x, y, state, direction, device, x_root, y_root;
} GdkEventScroll_FID_CACHE;
GdkEventScroll_FID_CACHE GdkEventScrollFc;
@@ -781,8 +781,6 @@ 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;
}
@@ -800,12 +798,6 @@ 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;
}
@@ -823,12 +815,6 @@ 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 2e04912c34..ca84ca0a6b 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,9 +36,5 @@ 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 5256d811a4..0c2601f7e2 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
@@ -4175,6 +4175,19 @@ public static final boolean gdk_event_get_state(long /*int*/ event, int[] pmod)
lock.unlock();
}
}
+/**
+ * @method flags=dynamic
+ * @param event cast=(GdkEvent *)
+ */
+public static final native boolean _gdk_event_get_scroll_deltas(long /*int*/ event, double[] delta_x, double[] delta_y);
+public static final boolean gdk_event_get_scroll_deltas(long /*int*/ event, double[] delta_x, double[] delta_y) {
+ lock.lock();
+ try {
+ return _gdk_event_get_scroll_deltas(event, delta_x, delta_y);
+ } finally {
+ lock.unlock();
+ }
+}
/** @param event cast=(GdkEvent *) */
public static final native int _gdk_event_get_time(long /*int*/ event);
public static final int gdk_event_get_time(long /*int*/ event) {
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 c12e2739ea..6d17246bde 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
@@ -3271,11 +3271,14 @@ 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_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);
+ double[] delta_x = new double[1], delta_y = new double [1];
+ if (OS.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, gdkEvent.time, gdkEvent.x_root, gdkEvent.y_root, false, gdkEvent.state) ? 0 : 1);
+ }
+ if (delta_y [0] != 0) {
+ result = (sendMouseEvent (SWT.MouseWheel, 0, (int)(3 * delta_y [0]), SWT.SCROLL_LINE, true, gdkEvent.time, gdkEvent.x_root, gdkEvent.y_root, false, gdkEvent.state) ? 0 : 1);
+ }
}
return result;
}
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 38eb0997e9..8955b53b86 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
@@ -281,28 +281,31 @@ long /*int*/ gtk_scroll_event (long /*int*/ widget, long /*int*/ eventPtr) {
GdkEventScroll gdkEvent = new GdkEventScroll ();
OS.memmove (gdkEvent, eventPtr, GdkEventScroll.sizeof);
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;
+ double[] delta_x = new double[1], delta_y = new double [1];
+ if (OS.gdk_event_get_scroll_deltas (eventPtr, delta_x, delta_y)) {
+ if (delta_x [0] != 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) * delta_x [0];
+ 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;
+ if (delta_y [0] != 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) * delta_y [0];
+ 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 {