diff options
| author | Eric Williams | 2019-09-11 18:04:55 +0000 |
|---|---|---|
| committer | Eric Williams | 2019-09-12 15:33:21 +0000 |
| commit | 3604d504487ba5ac6629a7341338d0fa513e8af0 (patch) | |
| tree | f1c52b5e28aac23a1bf25012304e2c4f5ef21089 | |
| parent | 01767e059c15023fe5951f01375b3a2d87d68171 (diff) | |
| download | eclipse.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>
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); |
