diff options
author | Eric Williams | 2019-03-07 19:41:10 +0000 |
---|---|---|
committer | Eric Williams | 2019-03-11 15:15:31 +0000 |
commit | c93951982655d83f8570737f4dd26b158cfb09e9 (patch) | |
tree | 61de7956244c65f5e921ab13bceb7470d90d43bf | |
parent | fb6eb83431395679c473167d87291f3f43f380fa (diff) | |
download | eclipse.platform.swt-c93951982655d83f8570737f4dd26b158cfb09e9.tar.gz eclipse.platform.swt-c93951982655d83f8570737f4dd26b158cfb09e9.tar.xz eclipse.platform.swt-c93951982655d83f8570737f4dd26b158cfb09e9.zip |
Bug 540808: [GTK4] Replace removed gdk_event_* functions
Handle remaining GdkEvent API calls that are removed/changed on GTK4.
Change-Id: I2613ca71877813a3e074622edf04fb45be122b9a
Signed-off-by: Eric Williams <ericwill@redhat.com>
12 files changed, 91 insertions, 25 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 5b46ef2ddd..3bdf6391cd 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 @@ -862,6 +862,16 @@ JNIEXPORT jintLong JNICALL GDK_NATIVE(_1gdk_1display_1peek_1event) } #endif +#ifndef NO__1gdk_1display_1put_1event +JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1display_1put_1event) + (JNIEnv *env, jclass that, jintLong arg0, jintLong arg1) +{ + GDK_NATIVE_ENTER(env, that, _1gdk_1display_1put_1event_FUNC); + gdk_display_put_event((GdkDisplay *)arg0, (const GdkEvent *)arg1); + GDK_NATIVE_EXIT(env, that, _1gdk_1display_1put_1event_FUNC); +} +#endif + #ifndef NO__1gdk_1display_1supports_1cursor_1color JNIEXPORT jboolean JNICALL GDK_NATIVE(_1gdk_1display_1supports_1cursor_1color) (JNIEnv *env, jclass that, jintLong arg0) 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 6cadfe4b8c..8d7c0091d0 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 @@ -94,6 +94,7 @@ char * GDK_nativeFunctionNames[] = { "_1gdk_1display_1get_1primary_1monitor", "_1gdk_1display_1is_1composited", "_1gdk_1display_1peek_1event", + "_1gdk_1display_1put_1event", "_1gdk_1display_1supports_1cursor_1color", "_1gdk_1drag_1context_1get_1actions", "_1gdk_1drag_1context_1get_1dest_1window", 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 6c536a4de8..810be764bf 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 @@ -104,6 +104,7 @@ typedef enum { _1gdk_1display_1get_1primary_1monitor_FUNC, _1gdk_1display_1is_1composited_FUNC, _1gdk_1display_1peek_1event_FUNC, + _1gdk_1display_1put_1event_FUNC, _1gdk_1display_1supports_1cursor_1color_FUNC, _1gdk_1drag_1context_1get_1actions_FUNC, _1gdk_1drag_1context_1get_1dest_1window_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 d51614411e..7fcdd861c7 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 @@ -1920,6 +1920,19 @@ public class GDK extends OS { } } /** + * @param display cast=(GdkDisplay *) + * @param event cast=(const GdkEvent *) + */ + public static final native void _gdk_display_put_event(long /*int*/ display, long /*int*/ event); + public static final void gdk_display_put_event(long /*int*/ display, long /*int*/ event) { + lock.lock(); + try { + _gdk_display_put_event(display, event); + } finally { + lock.unlock(); + } + } + /** * @method flags=dynamic * @param screen cast=(GdkScreen *) * @param dest flags=no_in 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 f1c70efccc..ee2c76a15c 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 @@ -2735,7 +2735,7 @@ boolean dragDetect (int x, int y, boolean filter, boolean dragOnTimeout, boolean long timeout = System.currentTimeMillis() + 500; display.sendPreExternalEventDispatchEvent(); while (System.currentTimeMillis() < timeout) { - eventPtr = GDK.gdk_event_get (); + eventPtr = GTK.GTK4 ? GTK.gtk_get_current_event() : GDK.gdk_event_get (); if (eventPtr != 0) { break; } else { @@ -2785,14 +2785,19 @@ boolean dragDetect (int x, int y, boolean filter, boolean dragOnTimeout, boolean case GDK.GDK_BUTTON_PRESS: case GDK.GDK_2BUTTON_PRESS: case GDK.GDK_3BUTTON_PRESS: { - GDK.gdk_event_put (eventPtr); + if (GTK.GTK4) { + long /*int*/ display = GDK.gdk_display_get_default(); + GDK.gdk_display_put_event(display, eventPtr); + } else { + GDK.gdk_event_put (eventPtr); + } quit = true; break; } default: GTK.gtk_main_do_event (eventPtr); } - GDK.gdk_event_free (eventPtr); + gdk_event_free (eventPtr); } } return dragging; @@ -3557,8 +3562,7 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event, bo if (eventType == GDK.GDK_BUTTON_PRESS) { boolean dragging = false; display.clickCount = 1; - long /*int*/ defaultDisplay = GDK.gdk_display_get_default(); - long /*int*/ nextEvent = GTK.GTK4 ? GDK.gdk_display_peek_event(defaultDisplay) : GDK.gdk_event_peek (); + long /*int*/ nextEvent = gdk_event_peek (); if (nextEvent != 0) { int peekedEventType = GDK.GDK_EVENT_TYPE (nextEvent); if (peekedEventType == GDK.GDK_2BUTTON_PRESS) display.clickCount = 2; 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 81cb8a0cb4..f1f9a0097c 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 @@ -4468,8 +4468,17 @@ public boolean post (Event event) { OS.memmove(eventPtr, newKeyEvent, GdkEventKey.sizeof); GDK.gdk_event_set_device (eventPtr, gdkKeyboardDevice); - GDK.gdk_event_put(eventPtr); - GDK.gdk_event_free(eventPtr); + if (GTK.GTK4) { + long /*int*/ display = GDK.gdk_display_get_default(); + GDK.gdk_display_put_event(display, eventPtr); + } else { + GDK.gdk_event_put (eventPtr); + } + if (GTK.GTK4) { + OS.g_object_unref(eventPtr); + } else { + GDK.gdk_event_free (eventPtr); + } return true; case SWT.MouseDown: case SWT.MouseUp: @@ -4497,7 +4506,11 @@ public boolean post (Event event) { GDK.gdk_event_set_device(eventPtr, gdkPointerDevice); GDK.gdk_event_put(eventPtr); - GDK.gdk_event_free(eventPtr); + if (GTK.GTK4) { + OS.g_object_unref(eventPtr); + } else { + GDK.gdk_event_free (eventPtr); + } return true; } return false; @@ -4535,9 +4548,18 @@ void putGdkEvents () { long /*int*/ event = gdkEvents [i]; Widget widget = gdkEventWidgets [i]; if (widget == null || !widget.isDisposed ()) { - GDK.gdk_event_put (event); + if (GTK.GTK4) { + long /*int*/ display = GDK.gdk_display_get_default(); + GDK.gdk_display_put_event(display, event); + } else { + GDK.gdk_event_put (event); + } + } + if (GTK.GTK4) { + OS.g_object_unref (event); + } else { + GDK.gdk_event_free (event); } - GDK.gdk_event_free (event); gdkEvents [i] = 0; gdkEventWidgets [i] = null; } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/List.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/List.java index 5201bf7b17..df9281f37c 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/List.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/List.java @@ -807,7 +807,7 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { if ((state & DRAG_DETECT) != 0 && hooks (SWT.DragDetect) && !OS.isX11() && eventType == GDK.GDK_BUTTON_PRESS) { // Wayland // check to see if there is another event coming in that is not a double/triple click, this is to prevent Bug 514531 - long /*int*/ nextEvent = GDK.gdk_event_peek (); + long /*int*/ nextEvent = gdk_event_peek (); if (nextEvent == 0) { long /*int*/ [] path = new long /*int*/ [1]; long /*int*/ selection = GTK.gtk_tree_view_get_selection (handle); @@ -831,7 +831,7 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { } } } else { - GDK.gdk_event_free (nextEvent); + gdk_event_free (nextEvent); } } /* @@ -926,7 +926,7 @@ long /*int*/ gtk_button_release_event (long /*int*/ widget, long /*int*/ event) double [] eventX = new double [1]; double [] eventY = new double [1]; GDK.gdk_event_get_coords(event, eventX, eventY); - long /*int*/ eventGdkResource = GTK.GTK4 ? GDK.gdk_event_get_surface(event) : GDK.gdk_event_get_window(event); + long /*int*/ eventGdkResource = gdk_event_get_surface_or_window(event); if (GTK.GTK4) { if (eventGdkResource != gtk_widget_get_surface (handle)) return 0; } else { @@ -1231,7 +1231,7 @@ public void remove (int [] indices) { /** * Removes all of the items from the receiver. - * + * * @exception SWTException <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java index 54b149a206..7e769750e3 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java @@ -300,7 +300,7 @@ void _setVisible (boolean visible) { // Popup the menu and pin it at the top left corner of the GdkRectangle relative to the GdkWindow GTK.gtk_menu_popup_at_rect(handle, event.window, rect, GDK.GDK_GRAVITY_NORTH_WEST, GDK.GDK_GRAVITY_NORTH_WEST, eventPtr); - GDK.gdk_event_free (eventPtr); + gdk_event_free (eventPtr); } else { /* * GTK Feature: gtk_menu_popup is deprecated as of GTK3.22 and the new method gtk_menu_popup_at_pointer diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java index 639daabbbd..c0a979e66b 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java @@ -1996,7 +1996,7 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { GDK.gdk_event_get_root_coords(event, eventRX, eventRY); int [] eventState = new int [1]; GDK.gdk_event_get_state(event, eventState); - long /*int*/ eventGdkResource = GTK.GTK4 ? GDK.gdk_event_get_surface(event) : GDK.gdk_event_get_window(event); + long /*int*/ eventGdkResource = gdk_event_get_surface_or_window(event); if (GTK.GTK4) { if (eventGdkResource != gtk_widget_get_surface (handle)) return 0; } else { @@ -2013,7 +2013,7 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { if ((state & DRAG_DETECT) != 0 && hooks (SWT.DragDetect) && !OS.isX11() && eventType == GDK.GDK_BUTTON_PRESS) { // Wayland // check to see if there is another event coming in that is not a double/triple click, this is to prevent Bug 514531 - long /*int*/ nextEvent = GDK.gdk_event_peek (); + long /*int*/ nextEvent = gdk_event_peek (); if (nextEvent == 0) { long /*int*/ [] path = new long /*int*/ [1]; long /*int*/ selection = GTK.gtk_tree_view_get_selection (handle); @@ -2037,7 +2037,7 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { } } } else { - GDK.gdk_event_free (nextEvent); + gdk_event_free (nextEvent); } } /* @@ -2175,7 +2175,7 @@ long /*int*/ gtk_button_release_event (long /*int*/ widget, long /*int*/ event) GDK.gdk_event_get_root_coords(event, eventRX, eventRY); int [] eventState = new int [1]; GDK.gdk_event_get_state(event, eventState); - long /*int*/ eventGdkResource = GTK.GTK4 ? GDK.gdk_event_get_surface(event) : GDK.gdk_event_get_window(event); + long /*int*/ eventGdkResource = gdk_event_get_surface_or_window(event); if (GTK.GTK4) { if (eventGdkResource != gtk_widget_get_surface (handle)) return 0; } else { diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TrayItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TrayItem.java index 7d4de86add..7c80a35e2b 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TrayItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TrayItem.java @@ -253,7 +253,7 @@ long /*int*/ gtk_activate (long /*int*/ widget) { * the single-click as the current event and for the double-click in the * event queue. */ - long /*int*/ nextEvent = GDK.gdk_event_peek (); + long /*int*/ nextEvent = gdk_event_peek (); if (nextEvent != 0) { int nextEventType = GDK.GDK_EVENT_TYPE (nextEvent); long /*int*/ currEvent = GTK.gtk_get_current_event (); @@ -262,7 +262,7 @@ long /*int*/ gtk_activate (long /*int*/ widget) { currEventType = GDK.GDK_EVENT_TYPE (currEvent); gdk_event_free(currEvent); } - GDK.gdk_event_free (nextEvent); + gdk_event_free (nextEvent); currEventType = Control.fixGdkEventTypeValues(currEventType); nextEventType = Control.fixGdkEventTypeValues(nextEventType); if (currEventType == GDK.GDK_BUTTON_PRESS && nextEventType == GDK.GDK_2BUTTON_PRESS) { diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java index a06fef4307..f8b8648ed6 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java @@ -2062,7 +2062,7 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { GDK.gdk_event_get_root_coords(event, eventRX, eventRY); int [] eventState = new int [1]; GDK.gdk_event_get_state(event, eventState); - long /*int*/ eventGdkResource = GTK.GTK4 ? GDK.gdk_event_get_surface(event) : GDK.gdk_event_get_window(event); + long /*int*/ eventGdkResource = gdk_event_get_surface_or_window(event); if (GTK.GTK4) { if (eventGdkResource != gtk_widget_get_surface (handle)) return 0; } else { @@ -2079,7 +2079,7 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { if ((state & DRAG_DETECT) != 0 && hooks (SWT.DragDetect) && !OS.isX11() && eventType == GDK.GDK_BUTTON_PRESS) { // Wayland // check to see if there is another event coming in that is not a double/triple click, this is to prevent Bug 514531 - long /*int*/ nextEvent = GDK.gdk_event_peek (); + long /*int*/ nextEvent = gdk_event_peek (); if (nextEvent == 0) { long /*int*/ [] path = new long /*int*/ [1]; long /*int*/ selection = GTK.gtk_tree_view_get_selection (handle); @@ -2103,7 +2103,7 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { } } } else { - GDK.gdk_event_free (nextEvent); + gdk_event_free (nextEvent); } } /* @@ -2240,7 +2240,7 @@ long /*int*/ gtk_button_release_event (long /*int*/ widget, long /*int*/ event) GDK.gdk_event_get_root_coords(event, eventRX, eventRY); int [] eventState = new int [1]; GDK.gdk_event_get_state(event, eventState); - long /*int*/ eventGdkResource = GTK.GTK4 ? GDK.gdk_event_get_surface(event) : GDK.gdk_event_get_window(event); + long /*int*/ eventGdkResource = gdk_event_get_surface_or_window(event); if (GTK.GTK4) { if (eventGdkResource != gtk_widget_get_surface (handle)) return 0; } else { 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 bff9003692..60e7e40329 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 @@ -1953,6 +1953,21 @@ long /*int*/ gdk_event_get_surface_or_window(long /*int*/ event) { } /** + * Wrapper function for gdk_display_peek_event() on GTK4, + * and gdk_event_peek() on GTK3. + * + * @return the GdkEvent fetched + */ +long /*int*/ gdk_event_peek() { + if (GTK.GTK4) { + long /*int*/ display = GDK.gdk_display_get_default(); + return GDK.gdk_display_peek_event(display); + } else { + return GDK.gdk_event_peek(); + } +} + +/** * Wrapper function for gdk_event_get_state() * @param event pointer to the GdkEvent. * @return the keymask to be used with constants like |