Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Williams2019-09-11 18:04:55 +0000
committerEric Williams2019-09-12 15:33:21 +0000
commit3604d504487ba5ac6629a7341338d0fa513e8af0 (patch)
treef1c52b5e28aac23a1bf25012304e2c4f5ef21089
parent01767e059c15023fe5951f01375b3a2d87d68171 (diff)
downloadeclipse.platform.swt-3604d504487ba5ac6629a7341338d0fa513e8af0.tar.gz
eclipse.platform.swt-3604d504487ba5ac6629a7341338d0fa513e8af0.tar.xz
eclipse.platform.swt-3604d504487ba5ac6629a7341338d0fa513e8af0.zip
Bug 393269 - [GTK] Slider Selection events do not have detail field set
Connect a custom Callback to ensure the proper detail field is set. Previously this wasn't working because the double parameter in the Callback's method signature was being read as a long, causing garbage input for other parameters. Tested on GTK3.24 and X11 using Snippet17. No adverse effects observed in the IDE, and no AllNonBrowser JUnit tests fail. Change-Id: I4e330cf52509011e873c197d01b0265dad861d28 Signed-off-by: Eric Williams <ericwill@redhat.com>
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java25
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ScrollBar.java6
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Slider.java6
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java5
4 files changed, 30 insertions, 12 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java
index 22e007af83..d529a9680f 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java
@@ -128,12 +128,12 @@ public class Display extends Device {
int [] max_priority = new int [1], timeout = new int [1];
Callback eventCallback;
long eventProc, windowProc2, windowProc3, windowProc4, windowProc5, windowProc6;
- long snapshotDrawProc;
+ long snapshotDrawProc, changeValueProc;
long keyPressReleaseProc, focusProc, enterMotionScrollProc, leaveProc;
long gesturePressReleaseProc;
long notifyStateProc;
Callback windowCallback2, windowCallback3, windowCallback4, windowCallback5, windowCallback6;
- Callback snapshotDraw;
+ Callback snapshotDraw, changeValue;
Callback keyPressReleaseCallback, focusCallback, enterMotionScrollCallback, leaveCallback;
Callback gesturePressReleaseCallback;
Callback notifyStateCallback;
@@ -3540,7 +3540,15 @@ void initializeCallbacks () {
windowProc5 = windowCallback5.getAddress ();
if (windowProc5 == 0) error (SWT.ERROR_NO_MORE_CALLBACKS);
- closuresProc [Widget.CHANGE_VALUE] = windowProc5;
+ /*
+ * The "change-value" signal has a double parameter, so this
+ * needs to be handled separately. See bug
+ */
+ changeValue = new Callback (this, "changeValue", boolean.class, new Type [] {long.class, int.class, double.class, long.class}); //$NON-NLS-1$
+ changeValueProc = changeValue.getAddress ();
+ if (changeValueProc == 0) error (SWT.ERROR_NO_MORE_CALLBACKS);
+ closuresProc [Widget.CHANGE_VALUE] = changeValueProc;
+
closuresProc [Widget.EXPAND_COLLAPSE_CURSOR_ROW] = windowProc5;
closuresProc [Widget.INSERT_TEXT] = windowProc5;
closuresProc [Widget.TEXT_BUFFER_INSERT_TEXT] = windowProc5;
@@ -4485,6 +4493,11 @@ void releaseDisplay () {
}
windowProc2 = windowProc3 = windowProc4 = windowProc5 = windowProc6 = 0;
+ if (changeValue != null) {
+ changeValue.dispose(); changeValue = null;
+ }
+ changeValueProc = 0;
+
if (GTK.GTK4) {
keyPressReleaseCallback.dispose();
keyPressReleaseProc = 0;
@@ -5824,6 +5837,12 @@ long notifyStateProc (long gdk_handle, long param_spec, long user_data) {
return widget.notifyStateProc(gdk_handle, user_data);
}
+boolean changeValue (long handle, int scroll, double value, long user_data) {
+ Widget widget = getWidget (handle);
+ if (widget == null) return false;
+ return widget.gtk_change_value(handle, scroll, value, user_data);
+}
+
long windowProc (long handle, long user_data) {
Widget widget = getWidget (handle);
if (widget == null) return 0;
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ScrollBar.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ScrollBar.java
index 6c58e7978d..340cdedfd2 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ScrollBar.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ScrollBar.java
@@ -534,9 +534,9 @@ long gtk_button_press_event (long widget, long eventPtr) {
}
@Override
-long gtk_change_value (long widget, long scroll, long value1, long value2) {
- detail = (int)scroll;
- return 0;
+boolean gtk_change_value (long widget, int scroll, double value, long user_data) {
+ detail = scroll;
+ return false;
}
void gtk_range_get_slider_range (long widget, int [] slider_start, int [] slider_end) {
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Slider.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Slider.java
index 8f4f9d300d..096ec0fe58 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Slider.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Slider.java
@@ -191,9 +191,9 @@ long gtk_button_press_event (long widget, long eventPtr) {
}
@Override
-long gtk_change_value (long widget, long scroll, long value1, long value2) {
- detail = (int)scroll;
- return 0;
+boolean gtk_change_value (long widget, int scroll, double value, long user_data) {
+ detail = scroll;
+ return false;
}
@Override
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java
index 13dd69fbf9..fcaac7111a 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java
@@ -719,8 +719,8 @@ long gtk_changed (long widget) {
return 0;
}
-long gtk_change_value (long widget, long scroll, long value1, long value2) {
- return 0;
+boolean gtk_change_value (long widget, int scroll, double value, long user_data) {
+ return false;
}
long gtk_clicked (long widget) {
@@ -2280,7 +2280,6 @@ long windowProc (long handle, long arg0, long arg1, long user_data) {
long windowProc (long handle, long arg0, long arg1, long arg2, long user_data) {
switch ((int)user_data) {
- case CHANGE_VALUE: return gtk_change_value (handle, arg0, arg1, arg2);
case EXPAND_COLLAPSE_CURSOR_ROW: return gtk_expand_collapse_cursor_row (handle, arg0, arg1, arg2);
case INSERT_TEXT: return gtk_insert_text (handle, arg0, arg1, arg2);
case TEXT_BUFFER_INSERT_TEXT: return gtk_text_buffer_insert_text (handle, arg0, arg1, arg2);

Back to the top