diff options
author | Paul D'Pong | 2020-08-27 17:30:28 +0000 |
---|---|---|
committer | Alexander Kurtakov | 2020-09-08 18:31:56 +0000 |
commit | 92b1b1b26f82a083958f385083df42b365e223f1 (patch) | |
tree | e4006a96bd906e64995613753405b79b7aba8d39 | |
parent | 3326ba2329d9185a94e99b92c30b6eb0837c313b (diff) | |
download | eclipse.platform.swt-92b1b1b26f82a083958f385083df42b365e223f1.tar.gz eclipse.platform.swt-92b1b1b26f82a083958f385083df42b365e223f1.tar.xz eclipse.platform.swt-92b1b1b26f82a083958f385083df42b365e223f1.zip |
Bug 566415 - [GTK4] Get Snippet 14 to run
- Set hexpand & vexpand to true for scrolled window in Composite widget
(only for GTK4)
- Added GTK4 specific handling for gtk_enter_notify_event &
gtk_leave_notify_event (currently an issue of being able to retrieve the
event from "enter" & "leave" signals)
- Removed GTK version handling in Proc functions since they these
callbacks are only called/registered in GTK4.
- Removed gdk_event_free as it seems to be freed by the event controller
Change-Id: I1c24c4ad0fc287ee97938a94e4b1d87de2d96a03
Signed-off-by: Paul D'Pong <sdamrong@redhat.com>
8 files changed, 136 insertions, 83 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 d0bc4a1e41..dff6a85ec1 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 @@ -1018,7 +1018,7 @@ JNIEXPORT jboolean JNICALL GDK_NATIVE(gdk_1event_1get_1position) GDK_NATIVE_ENTER(env, that, gdk_1event_1get_1position_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_position((GdkEvent *)arg0, (gdouble *)lparg1, (gdouble *)lparg2); + rc = (jboolean)gdk_event_get_position((GdkEvent *)arg0, (double *)lparg1, (double *)lparg2); fail: if (arg2 && lparg2) (*env)->ReleaseDoubleArrayElements(env, arg2, lparg2, 0); if (arg1 && lparg1) (*env)->ReleaseDoubleArrayElements(env, arg1, lparg1, 0); @@ -5519,7 +5519,7 @@ JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1event_1controller_1get_1current_1event) { jlong rc = 0; GTK_NATIVE_ENTER(env, that, gtk_1event_1controller_1get_1current_1event_FUNC); - rc = (jlong)gtk_event_controller_get_current_event(arg0); + rc = (jlong)gtk_event_controller_get_current_event((GtkEventController *)arg0); GTK_NATIVE_EXIT(env, that, gtk_1event_1controller_1get_1current_1event_FUNC); return rc; } @@ -5605,12 +5605,12 @@ JNIEXPORT void JNICALL GTK_NATIVE(gtk_1event_1controller_1set_1propagation_1phas { GTK_NATIVE_ENTER(env, that, gtk_1event_1controller_1set_1propagation_1phase_FUNC); /* - gtk_event_controller_set_propagation_phase(arg0, arg1); + gtk_event_controller_set_propagation_phase((GtkEventController *)arg0, (GtkPropagationPhase)arg1); */ { GTK_LOAD_FUNCTION(fp, gtk_event_controller_set_propagation_phase) if (fp) { - ((void (CALLING_CONVENTION*)(jlong, jint))fp)(arg0, arg1); + ((void (CALLING_CONVENTION*)(GtkEventController *, GtkPropagationPhase))fp)((GtkEventController *)arg0, (GtkPropagationPhase)arg1); } } GTK_NATIVE_EXIT(env, that, gtk_1event_1controller_1set_1propagation_1phase_FUNC); @@ -8880,6 +8880,16 @@ JNIEXPORT void JNICALL GTK_NATIVE(gtk_1scrolled_1window_1set_1child) } #endif +#ifndef NO_gtk_1scrolled_1window_1set_1hadjustment +JNIEXPORT void JNICALL GTK_NATIVE(gtk_1scrolled_1window_1set_1hadjustment) + (JNIEnv *env, jclass that, jlong arg0, jlong arg1) +{ + GTK_NATIVE_ENTER(env, that, gtk_1scrolled_1window_1set_1hadjustment_FUNC); + gtk_scrolled_window_set_hadjustment((GtkScrolledWindow *)arg0, (GtkAdjustment *)arg1); + GTK_NATIVE_EXIT(env, that, gtk_1scrolled_1window_1set_1hadjustment_FUNC); +} +#endif + #ifndef NO_gtk_1scrolled_1window_1set_1has_1frame JNIEXPORT void JNICALL GTK_NATIVE(gtk_1scrolled_1window_1set_1has_1frame) (JNIEnv *env, jclass that, jlong arg0, jboolean arg1) @@ -8910,6 +8920,16 @@ JNIEXPORT void JNICALL GTK_NATIVE(gtk_1scrolled_1window_1set_1shadow_1type) } #endif +#ifndef NO_gtk_1scrolled_1window_1set_1vadjustment +JNIEXPORT void JNICALL GTK_NATIVE(gtk_1scrolled_1window_1set_1vadjustment) + (JNIEnv *env, jclass that, jlong arg0, jlong arg1) +{ + GTK_NATIVE_ENTER(env, that, gtk_1scrolled_1window_1set_1vadjustment_FUNC); + gtk_scrolled_window_set_vadjustment((GtkScrolledWindow *)arg0, (GtkAdjustment *)arg1); + GTK_NATIVE_EXIT(env, that, gtk_1scrolled_1window_1set_1vadjustment_FUNC); +} +#endif + #ifndef NO_gtk_1search_1entry_1new JNIEXPORT jlong JNICALL GTK_NATIVE(gtk_1search_1entry_1new) (JNIEnv *env, jclass that) 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 a2aa310a6a..44951971a1 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 @@ -708,9 +708,11 @@ char * GTK_nativeFunctionNames[] = { "gtk_1scrolled_1window_1new__", "gtk_1scrolled_1window_1new__JJ", "gtk_1scrolled_1window_1set_1child", + "gtk_1scrolled_1window_1set_1hadjustment", "gtk_1scrolled_1window_1set_1has_1frame", "gtk_1scrolled_1window_1set_1policy", "gtk_1scrolled_1window_1set_1shadow_1type", + "gtk_1scrolled_1window_1set_1vadjustment", "gtk_1search_1entry_1new", "gtk_1selection_1data_1free", "gtk_1selection_1data_1get_1data", 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 eb21ffd584..85728920c6 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 @@ -706,9 +706,11 @@ typedef enum { gtk_1scrolled_1window_1new___FUNC, gtk_1scrolled_1window_1new__JJ_FUNC, gtk_1scrolled_1window_1set_1child_FUNC, + gtk_1scrolled_1window_1set_1hadjustment_FUNC, gtk_1scrolled_1window_1set_1has_1frame_FUNC, gtk_1scrolled_1window_1set_1policy_FUNC, gtk_1scrolled_1window_1set_1shadow_1type_FUNC, + gtk_1scrolled_1window_1set_1vadjustment_FUNC, gtk_1search_1entry_1new_FUNC, gtk_1selection_1data_1free_FUNC, gtk_1selection_1data_1get_1data_FUNC, diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GDK.java b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GDK.java index eaf62534dd..ffab3255c0 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GDK.java +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GDK.java @@ -558,8 +558,8 @@ public class GDK extends OS { public static final native void gdk_event_unref(long event); /** * @param event cast=(GdkEvent *) - * @param px cast=(gdouble *) - * @param py cast=(gdouble *) + * @param px cast=(double *) + * @param py cast=(double *) */ public static final native boolean gdk_event_get_position(long event, double[] px, double[] py); /** @param event cast=(GdkEvent *) */ diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GTK.java b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GTK.java index 5cc30fe1a4..871c8524fc 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GTK.java +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GTK.java @@ -1131,6 +1131,8 @@ public class GTK extends OS { public static final native void gtk_widget_add_controller(long widget, long controller); /** * @method flags=dynamic + * @param controller cast=(GtkEventController *) + * @param phase cast=(GtkPropagationPhase) */ public static final native void gtk_event_controller_set_propagation_phase(long controller, int phase); /** @@ -1321,6 +1323,7 @@ public class GTK extends OS { /* [GTK3 only, if-def'd in os.h] */ public static final native long gtk_get_current_event(); /* [GTK4 only, if-def'd in os.h] */ + /** @param controller cast=(GtkEventController *) */ public static final native long gtk_event_controller_get_current_event(long controller); /** @param state cast=(GdkModifierType*) */ public static final native boolean gtk_get_current_event_state(int[] state); @@ -2178,6 +2181,16 @@ public class GTK extends OS { * @param scrolled_window cast=(GtkScrolledWindow *) */ public static final native boolean gtk_scrolled_window_get_overlay_scrolling(long scrolled_window); + /** + * @param scrolled_window cast=(GtkScrolledWindow *) + * @param adjustment cast=(GtkAdjustment *) + * */ + public static final native void gtk_scrolled_window_set_vadjustment(long scrolled_window, long adjustment); + /** + * @param scrolled_window cast=(GtkScrolledWindow *) + * @param adjustment cast=(GtkAdjustment *) + * */ + public static final native void gtk_scrolled_window_set_hadjustment(long scrolled_window, long adjustment); /* GtkScrolledWindow [GTK3 only, if-def'd in os.h] */ /** diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java index 01095a695d..495bf780de 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Composite.java @@ -307,16 +307,20 @@ void createHandle (int index, boolean fixed, boolean scrolled) { gtk_widget_set_has_surface_or_window (fixedHandle, true); } + long vadj = GTK.gtk_adjustment_new (0, 0, 100, 1, 10, 10); + if (vadj == 0) error (SWT.ERROR_NO_HANDLES); + long hadj = GTK.gtk_adjustment_new (0, 0, 100, 1, 10, 10); + if (hadj == 0) error (SWT.ERROR_NO_HANDLES); + if (GTK.GTK4) { scrolledHandle = GTK.gtk_scrolled_window_new(); + GTK.gtk_scrolled_window_set_hadjustment(scrolledHandle, hadj); + GTK.gtk_scrolled_window_set_vadjustment(scrolledHandle, vadj); + GTK.gtk_widget_set_hexpand(scrolledHandle, true); + GTK.gtk_widget_set_vexpand(scrolledHandle, true); } else { - long vadj = GTK.gtk_adjustment_new (0, 0, 100, 1, 10, 10); - if (vadj == 0) error (SWT.ERROR_NO_HANDLES); - long hadj = GTK.gtk_adjustment_new (0, 0, 100, 1, 10, 10); - if (hadj == 0) error (SWT.ERROR_NO_HANDLES); scrolledHandle = GTK.gtk_scrolled_window_new (hadj, vadj); } - if (scrolledHandle == 0) error (SWT.ERROR_NO_HANDLES); } handle = OS.g_object_new (display.gtk_fixed_get_type (), 0); 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 c7769aaa45..40d4390450 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 @@ -3686,6 +3686,21 @@ long gtk_commit (long imcontext, long text) { @Override long gtk_enter_notify_event (long widget, long event) { + if (GTK.GTK4) { + if (display.currentControl == this) return 0; + + if (display.currentControl != null && !display.currentControl.isDisposed ()) { + display.removeMouseHoverTimeout (display.currentControl.handle); + display.currentControl.sendMouseEvent (SWT.MouseExit, 0, 0, 0, 0, false, 0); + } + if (!isDisposed ()) { + display.currentControl = this; + return sendMouseEvent (SWT.MouseEnter, 0, 0, 0, 0, false, 0) ? 0 : 1; + } + + return 0; + } + /* * Feature in GTK. Children of a shell will inherit and display the shell's * tooltip if they do not have a tooltip of their own. The fix is to use the @@ -4021,6 +4036,19 @@ long gtk_key_release_event (long widget, long event) { @Override long gtk_leave_notify_event (long widget, long event) { + if (GTK.GTK4) { + if (display.currentControl != this) return 0; + + display.removeMouseHoverTimeout (handle); + int result = 0; + if (sendLeaveNotify () || display.getCursorControl () == null) { + result = sendMouseEvent (SWT.MouseExit, 0, 0, 0, 0, false, 0) ? 0 : 1; + display.currentControl = null; + } + return result; + } + + if (display.currentControl != this) return 0; int [] state = new int [1]; double [] eventX = new double [1]; @@ -4087,25 +4115,23 @@ long gtk_mnemonic_activate (long widget, long arg1) { @Override long gtk_motion_notify_event (long widget, long event) { + int result; if (mouseDown) { dragBegun = true; } - int result; - double [] eventX = new double [1]; - double [] eventY = new double [1]; + + double[] eventX = new double[1]; + double[] eventY = new double[1]; if (GTK.GTK4) { GDK.gdk_event_get_position(event, eventX, eventY); } else { GDK.gdk_event_get_coords(event, eventX, eventY); } - double [] eventRX = new double[1]; - double [] eventRY = new double[1]; - GDK.gdk_event_get_root_coords(event, eventRX, eventRY); - - lastInput.x = (int) eventX[0]; - lastInput.y = (int) eventY[0]; + lastInput.x = (int)eventX[0]; + lastInput.y = (int)eventY[0]; if (containedInRegion(lastInput.x, lastInput.y)) return 0; + /* * Feature in GTK: DND detection for X.11 & Wayland support is done through motion notify event * instead of mouse click event. See Bug 503431. @@ -4143,16 +4169,33 @@ long gtk_motion_notify_event (long widget, long event) { } } } - if (this == display.currentControl && (hooks (SWT.MouseHover) || filters (SWT.MouseHover))) { - display.addMouseHoverTimeout (handle); + + if (this == display.currentControl && (hooks(SWT.MouseHover) || filters(SWT.MouseHover))) { + display.addMouseHoverTimeout(handle); } - double x = eventRX[0], y = eventRY[0]; + + int time = GDK.gdk_event_get_time(event); + double x, y; int [] state = new int [1]; - GdkEventMotion gdkEvent = new GdkEventMotion(); - if (!GTK.GTK4) { + boolean isHint = false; + + if (GTK.GTK4) { + state[0] = GDK.gdk_event_get_modifier_state(event); + x = eventX[0]; + y = eventY[0]; + } else { + double [] eventRX = new double[1]; + double [] eventRY = new double[1]; + GDK.gdk_event_get_root_coords(event, eventRX, eventRY); + x = eventRX[0]; + y = eventRY[0]; + + GdkEventMotion gdkEvent = new GdkEventMotion(); OS.memmove(gdkEvent, event, GdkEventMotion.sizeof); state[0] = gdkEvent.state; - if (gdkEvent.is_hint != 0) { + isHint = gdkEvent.is_hint != 0; + + if (isHint) { int [] pointer_x = new int [1], pointer_y = new int [1], mask = new int [1]; long window = eventWindow (); display.gdk_window_get_device_position (window, pointer_x, pointer_y, mask); @@ -4160,22 +4203,21 @@ long gtk_motion_notify_event (long widget, long event) { y = pointer_y [0]; state[0] = mask [0]; } - } else { - state[0] = GDK.gdk_event_get_modifier_state(event); } - int time = GDK.gdk_event_get_time(event); + if (this != display.currentControl) { if (display.currentControl != null && !display.currentControl.isDisposed ()) { - display.removeMouseHoverTimeout (display.currentControl.handle); - Point pt = display.mapInPixels (this, display.currentControl, (int) x, (int) y); - display.currentControl.sendMouseEvent (SWT.MouseExit, 0, time, pt.x, pt.y, GTK.GTK4 ? false : gdkEvent.is_hint != 0, state[0]); + display.removeMouseHoverTimeout(display.currentControl.handle); + Point pt = display.mapInPixels(this, display.currentControl, (int)x, (int)y); + display.currentControl.sendMouseEvent(SWT.MouseExit, 0, time, pt.x, pt.y, isHint, state[0]); } if (!isDisposed ()) { display.currentControl = this; - sendMouseEvent (SWT.MouseEnter, 0, time, x, y, GTK.GTK4 ? false : gdkEvent.is_hint != 0, state[0]); + sendMouseEvent(SWT.MouseEnter, 0, time, x, y, isHint, state[0]); } } - result = sendMouseEvent (SWT.MouseMove, 0, time, x, y, GTK.GTK4 ? false : gdkEvent.is_hint != 0, state[0]) ? 0 : 1; + + result = sendMouseEvent(SWT.MouseMove, 0, time, x, y, isHint, state[0]) ? 0 : 1; return result; } @@ -4931,10 +4973,10 @@ boolean sendMouseEvent (int type, int button, int count, int detail, boolean sen int [] origin_x = new int [1], origin_y = new int [1]; Rectangle eventRect; if (GTK.GTK4) { - long surface = eventSurface (); - GDK.gdk_surface_get_origin (surface, origin_x, origin_y); - eventRect = new Rectangle ((int)x - origin_x [0], (int)y - origin_y [0], 0, 0); - event.setBounds (DPIUtil.autoScaleDown (eventRect)); +// long surface = eventSurface (); +// GDK.gdk_surface_get_origin (surface, origin_x, origin_y); +// eventRect = new Rectangle ((int)x - origin_x [0], (int)y - origin_y [0], 0, 0); +// event.setBounds (DPIUtil.autoScaleDown (eventRect)); } else { long window = eventWindow (); GDK.gdk_window_get_origin (window, origin_x, origin_y); 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 bddc494c20..1d044176e4 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 @@ -2143,15 +2143,9 @@ boolean translateTraversal (int event) { return false; } -long enterMotionScrollProc (long controller, long handle, double x, double y, long user_data) { - long event; +long enterMotionScrollProc(long controller, long handle, double x, double y, long user_data) { long result = 0; - - if (GTK.GTK4) { - event = GTK.gtk_event_controller_get_current_event(controller); - } else { - event = GTK.gtk_get_current_event(); - } + long event = GTK.gtk_event_controller_get_current_event(controller); switch ((int)user_data) { case ENTER: @@ -2167,19 +2161,13 @@ long enterMotionScrollProc (long controller, long handle, double x, double y, lo result = gtk_scroll_event(handle, event); break; } - gdk_event_free(event); + return result; } -long focusProc (long controller, long handle, long user_data) { - long event; +long focusProc(long controller, long handle, long user_data) { long result = 0; - - if (GTK.GTK4) { - event = GTK.gtk_event_controller_get_current_event(controller); - } else { - event = GTK.gtk_get_current_event(); - } + long event = GTK.gtk_event_controller_get_current_event(controller); switch ((int)user_data) { case FOCUS_IN: @@ -2189,19 +2177,13 @@ long focusProc (long controller, long handle, long user_data) { result = gtk_focus_out_event(handle, event); break; } - gdk_event_free(event); + return result; } -long keyPressReleaseProc (long controller, long handle, int keyval, int keycode, int state, long user_data) { - long event; +long keyPressReleaseProc(long controller, long handle, int keyval, int keycode, int state, long user_data) { long result = 0; - - if (GTK.GTK4) { - event = GTK.gtk_event_controller_get_current_event(controller); - } else { - event = GTK.gtk_get_current_event(); - } + long event = GTK.gtk_event_controller_get_current_event(controller); switch ((int)user_data) { case KEY_PRESSED: @@ -2211,19 +2193,13 @@ long keyPressReleaseProc (long controller, long handle, int keyval, int keycode, result = gtk_key_release_event(handle, event); break; } - gdk_event_free(event); + return result; } -long gesturePressReleaseProc (long gesture, int n_press, double x, double y, long user_data) { - long event; +long gesturePressReleaseProc(long gesture, int n_press, double x, double y, long user_data) { long result = 0; - - if (GTK.GTK4) { - event = GTK.gtk_event_controller_get_current_event(gesture); - } else { - event = GTK.gtk_get_current_event(); - } + long event = GTK.gtk_event_controller_get_current_event(gesture); switch ((int)user_data) { case GESTURE_PRESSED: @@ -2233,26 +2209,20 @@ long gesturePressReleaseProc (long gesture, int n_press, double x, double y, lon result = gtk_gesture_release_event(gesture, n_press, x, y, event); break; } - gdk_event_free(event); + return result; } -long leaveProc (long controller, long handle, long user_data) { - long event; +long leaveProc(long controller, long handle, long user_data) { long result = 0; - - if (GTK.GTK4) { - event = GTK.gtk_event_controller_get_current_event(controller); - } else { - event = GTK.gtk_get_current_event(); - } + long event = GTK.gtk_event_controller_get_current_event(controller); switch ((int)user_data) { case LEAVE: result = gtk_leave_notify_event(handle, event); break; } - gdk_event_free(event); + return result; } |