diff options
author | Silenio Quarti <silenio_quarti@ca.ibm.com> | 2012-11-09 10:17:05 -0500 |
---|---|---|
committer | Silenio Quarti <silenio_quarti@ca.ibm.com> | 2012-11-09 10:17:19 -0500 |
commit | 92eda262fe6609e637257b664ef3791c831227e8 (patch) | |
tree | a6968996171d2bf8d1592d79873641b17d727b8e | |
parent | 3119075dc00aef0a5db54f40d0f324cff6c8737f (diff) | |
download | eclipse.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
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 { |