diff options
author | Silenio Quarti <silenio_quarti@ca.ibm.com> | 2012-11-08 14:24:47 -0500 |
---|---|---|
committer | Silenio Quarti <silenio_quarti@ca.ibm.com> | 2012-11-08 14:25:21 -0500 |
commit | 79b4c494683ecd3609c3ab417806e1f053ca5e78 (patch) | |
tree | 7ac31f1f5d459ac982b656a379c6c81dae03c2aa | |
parent | 73ee56991535559e50652ecc6391cdfa11c08af2 (diff) | |
download | eclipse.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
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; |