Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Williams2019-03-07 19:41:10 +0000
committerEric Williams2019-03-11 15:15:31 +0000
commitc93951982655d83f8570737f4dd26b158cfb09e9 (patch)
tree61de7956244c65f5e921ab13bceb7470d90d43bf
parentfb6eb83431395679c473167d87291f3f43f380fa (diff)
downloadeclipse.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>
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c10
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c1
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h1
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GDK.java13
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Control.java14
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java32
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/List.java8
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Menu.java2
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java8
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TrayItem.java4
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java8
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java15
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

Back to the top