diff options
author | Eric Williams | 2019-01-09 22:01:59 +0000 |
---|---|---|
committer | Eric Williams | 2019-01-14 18:29:55 +0000 |
commit | 03522764fd5f22abd333b3fdffb2f75eee6ae8d2 (patch) | |
tree | 00bfe6a484389da7cc29c2be2d9568f9c18a2574 | |
parent | a004725d04eb6702b57a47e0a7b3d0c003b110b2 (diff) | |
download | eclipse.platform.swt-03522764fd5f22abd333b3fdffb2f75eee6ae8d2.tar.gz eclipse.platform.swt-03522764fd5f22abd333b3fdffb2f75eee6ae8d2.tar.xz eclipse.platform.swt-03522764fd5f22abd333b3fdffb2f75eee6ae8d2.zip |
Bug 541650: [GTK4] GdkEvents are private and can no longer be created
Handle GdkEventButton memmoves as well as some others. Stop using
gdk_event_free() for results of gtk_get_current_event(). Added missing
accessor functions for GdkEvent* fields.
Change-Id: I894b86593e15e901609399b7871bc2bf1f4e7bb3
Signed-off-by: Eric Williams <ericwill@redhat.com>
26 files changed, 588 insertions, 415 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 354609c0e9..8b05e64a49 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 @@ -838,6 +838,18 @@ JNIEXPORT jintLong JNICALL GDK_NATIVE(_1gdk_1display_1get_1primary_1monitor) } #endif +#ifndef NO__1gdk_1display_1peek_1event +JNIEXPORT jintLong JNICALL GDK_NATIVE(_1gdk_1display_1peek_1event) + (JNIEnv *env, jclass that, jintLong arg0) +{ + jintLong rc = 0; + GDK_NATIVE_ENTER(env, that, _1gdk_1display_1peek_1event_FUNC); + rc = (jintLong)gdk_display_peek_event((GdkDisplay *)arg0); + GDK_NATIVE_EXIT(env, that, _1gdk_1display_1peek_1event_FUNC); + return rc; +} +#endif + #ifndef NO__1gdk_1display_1supports_1cursor_1color JNIEXPORT jboolean JNICALL GDK_NATIVE(_1gdk_1display_1supports_1cursor_1color) (JNIEnv *env, jclass that, jintLong arg0) @@ -962,6 +974,22 @@ JNIEXPORT jintLong JNICALL GDK_NATIVE(_1gdk_1event_1get) } #endif +#ifndef NO__1gdk_1event_1get_1button +JNIEXPORT jboolean JNICALL GDK_NATIVE(_1gdk_1event_1get_1button) + (JNIEnv *env, jclass that, jintLong arg0, jintArray arg1) +{ + jint *lparg1=NULL; + jboolean rc = 0; + GDK_NATIVE_ENTER(env, that, _1gdk_1event_1get_1button_FUNC); + if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail; + rc = (jboolean)gdk_event_get_button((GdkEvent *)arg0, (guint *)lparg1); +fail: + if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0); + GDK_NATIVE_EXIT(env, that, _1gdk_1event_1get_1button_FUNC); + return rc; +} +#endif + #ifndef NO__1gdk_1event_1get_1coords JNIEXPORT jboolean JNICALL GDK_NATIVE(_1gdk_1event_1get_1coords) (JNIEnv *env, jclass that, jintLong arg0, jdoubleArray arg1, jdoubleArray arg2) @@ -1001,6 +1029,41 @@ JNIEXPORT jint JNICALL GDK_NATIVE(_1gdk_1event_1get_1event_1type) } #endif +#ifndef NO__1gdk_1event_1get_1focus_1in +JNIEXPORT jboolean JNICALL GDK_NATIVE(_1gdk_1event_1get_1focus_1in) + (JNIEnv *env, jclass that, jintLong arg0, jbooleanArray arg1) +{ + jboolean *lparg1=NULL; + jboolean rc = 0; + GDK_NATIVE_ENTER(env, that, _1gdk_1event_1get_1focus_1in_FUNC); + if (arg1) if ((lparg1 = (*env)->GetBooleanArrayElements(env, arg1, NULL)) == NULL) goto fail; + rc = (jboolean)gdk_event_get_focus_in((GdkEvent *)arg0, (gboolean *)lparg1); +fail: + if (arg1 && lparg1) (*env)->ReleaseBooleanArrayElements(env, arg1, lparg1, 0); + GDK_NATIVE_EXIT(env, that, _1gdk_1event_1get_1focus_1in_FUNC); + return rc; +} +#endif + +#ifndef NO__1gdk_1event_1get_1root_1coords +JNIEXPORT jboolean JNICALL GDK_NATIVE(_1gdk_1event_1get_1root_1coords) + (JNIEnv *env, jclass that, jintLong arg0, jdoubleArray arg1, jdoubleArray arg2) +{ + jdouble *lparg1=NULL; + jdouble *lparg2=NULL; + jboolean rc = 0; + GDK_NATIVE_ENTER(env, that, _1gdk_1event_1get_1root_1coords_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_root_coords((GdkEvent *)arg0, (gdouble *)lparg1, (gdouble *)lparg2); +fail: + if (arg2 && lparg2) (*env)->ReleaseDoubleArrayElements(env, arg2, lparg2, 0); + if (arg1 && lparg1) (*env)->ReleaseDoubleArrayElements(env, arg1, lparg1, 0); + GDK_NATIVE_EXIT(env, that, _1gdk_1event_1get_1root_1coords_FUNC); + return rc; +} +#endif + #ifndef NO__1gdk_1event_1get_1scroll_1deltas JNIEXPORT jboolean JNICALL GDK_NATIVE(_1gdk_1event_1get_1scroll_1deltas) (JNIEnv *env, jclass that, jintLong arg0, jdoubleArray arg1, jdoubleArray arg2) @@ -1056,6 +1119,18 @@ fail: } #endif +#ifndef NO__1gdk_1event_1get_1surface +JNIEXPORT jintLong JNICALL GDK_NATIVE(_1gdk_1event_1get_1surface) + (JNIEnv *env, jclass that, jintLong arg0) +{ + jintLong rc = 0; + GDK_NATIVE_ENTER(env, that, _1gdk_1event_1get_1surface_FUNC); + rc = (jintLong)gdk_event_get_surface((GdkEvent *)arg0); + GDK_NATIVE_EXIT(env, that, _1gdk_1event_1get_1surface_FUNC); + return rc; +} +#endif + #ifndef NO__1gdk_1event_1get_1time JNIEXPORT jint JNICALL GDK_NATIVE(_1gdk_1event_1get_1time) (JNIEnv *env, jclass that, jintLong arg0) @@ -1068,6 +1143,18 @@ JNIEXPORT jint JNICALL GDK_NATIVE(_1gdk_1event_1get_1time) } #endif +#ifndef NO__1gdk_1event_1get_1window +JNIEXPORT jintLong JNICALL GDK_NATIVE(_1gdk_1event_1get_1window) + (JNIEnv *env, jclass that, jintLong arg0) +{ + jintLong rc = 0; + GDK_NATIVE_ENTER(env, that, _1gdk_1event_1get_1window_FUNC); + rc = (jintLong)gdk_event_get_window((GdkEvent *)arg0); + GDK_NATIVE_EXIT(env, that, _1gdk_1event_1get_1window_FUNC); + return rc; +} +#endif + #ifndef NO__1gdk_1event_1handler_1set JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1event_1handler_1set) (JNIEnv *env, jclass that, jintLong arg0, jintLong arg1, jintLong arg2) @@ -18286,30 +18373,6 @@ fail: } #endif -#if (!defined(NO_memmove__ILorg_eclipse_swt_internal_gtk_GdkEventExpose_2I) && !defined(JNI64)) || (!defined(NO_memmove__JLorg_eclipse_swt_internal_gtk_GdkEventExpose_2J) && defined(JNI64)) -#ifndef JNI64 -JNIEXPORT void JNICALL OS_NATIVE(memmove__ILorg_eclipse_swt_internal_gtk_GdkEventExpose_2I)(JNIEnv *env, jclass that, jintLong arg0, jobject arg1, jintLong arg2) -#else -JNIEXPORT void JNICALL OS_NATIVE(memmove__JLorg_eclipse_swt_internal_gtk_GdkEventExpose_2J)(JNIEnv *env, jclass that, jintLong arg0, jobject arg1, jintLong arg2) -#endif -{ - GdkEventExpose _arg1, *lparg1=NULL; -#ifndef JNI64 - OS_NATIVE_ENTER(env, that, memmove__ILorg_eclipse_swt_internal_gtk_GdkEventExpose_2I_FUNC); -#else - OS_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GdkEventExpose_2J_FUNC); -#endif - if (arg1) if ((lparg1 = getGdkEventExposeFields(env, arg1, &_arg1)) == NULL) goto fail; - memmove((void *)arg0, (const void *)lparg1, (size_t)arg2); -fail: -#ifndef JNI64 - OS_NATIVE_EXIT(env, that, memmove__ILorg_eclipse_swt_internal_gtk_GdkEventExpose_2I_FUNC); -#else - OS_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GdkEventExpose_2J_FUNC); -#endif -} -#endif - #if (!defined(NO_memmove__ILorg_eclipse_swt_internal_gtk_GdkEventKey_2I) && !defined(JNI64)) || (!defined(NO_memmove__JLorg_eclipse_swt_internal_gtk_GdkEventKey_2J) && defined(JNI64)) #ifndef JNI64 JNIEXPORT void JNICALL OS_NATIVE(memmove__ILorg_eclipse_swt_internal_gtk_GdkEventKey_2I)(JNIEnv *env, jclass that, jintLong arg0, jobject arg1, jintLong arg2) @@ -18334,30 +18397,6 @@ fail: } #endif -#if (!defined(NO_memmove__ILorg_eclipse_swt_internal_gtk_GdkEventMotion_2I) && !defined(JNI64)) || (!defined(NO_memmove__JLorg_eclipse_swt_internal_gtk_GdkEventMotion_2J) && defined(JNI64)) -#ifndef JNI64 -JNIEXPORT void JNICALL OS_NATIVE(memmove__ILorg_eclipse_swt_internal_gtk_GdkEventMotion_2I)(JNIEnv *env, jclass that, jintLong arg0, jobject arg1, jintLong arg2) -#else -JNIEXPORT void JNICALL OS_NATIVE(memmove__JLorg_eclipse_swt_internal_gtk_GdkEventMotion_2J)(JNIEnv *env, jclass that, jintLong arg0, jobject arg1, jintLong arg2) -#endif -{ - GdkEventMotion _arg1, *lparg1=NULL; -#ifndef JNI64 - OS_NATIVE_ENTER(env, that, memmove__ILorg_eclipse_swt_internal_gtk_GdkEventMotion_2I_FUNC); -#else - OS_NATIVE_ENTER(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GdkEventMotion_2J_FUNC); -#endif - if (arg1) if ((lparg1 = getGdkEventMotionFields(env, arg1, &_arg1)) == NULL) goto fail; - memmove((void *)arg0, (const void *)lparg1, (size_t)arg2); -fail: -#ifndef JNI64 - OS_NATIVE_EXIT(env, that, memmove__ILorg_eclipse_swt_internal_gtk_GdkEventMotion_2I_FUNC); -#else - OS_NATIVE_EXIT(env, that, memmove__JLorg_eclipse_swt_internal_gtk_GdkEventMotion_2J_FUNC); -#endif -} -#endif - #if (!defined(NO_memmove__ILorg_eclipse_swt_internal_gtk_GdkRGBA_2I) && !defined(JNI64)) || (!defined(NO_memmove__JLorg_eclipse_swt_internal_gtk_GdkRGBA_2J) && defined(JNI64)) #ifndef JNI64 JNIEXPORT void JNICALL OS_NATIVE(memmove__ILorg_eclipse_swt_internal_gtk_GdkRGBA_2I)(JNIEnv *env, jclass that, jintLong arg0, jobject arg1, jintLong arg2) @@ -18543,32 +18582,6 @@ fail: } #endif -#if (!defined(NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventAny_2II) && !defined(JNI64)) || (!defined(NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventAny_2JJ) && defined(JNI64)) -#ifndef JNI64 -JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GdkEventAny_2II)(JNIEnv *env, jclass that, jobject arg0, jintLong arg1, jintLong arg2) -#else -JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GdkEventAny_2JJ)(JNIEnv *env, jclass that, jobject arg0, jintLong arg1, jintLong arg2) -#endif -{ - GdkEventAny _arg0, *lparg0=NULL; -#ifndef JNI64 - OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEventAny_2II_FUNC); -#else - OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEventAny_2JJ_FUNC); -#endif - if (!arg0) goto fail; - if ((lparg0 = &_arg0) == NULL) goto fail; - memmove((void *)lparg0, (const void *)arg1, (size_t)arg2); -fail: - if (arg0 && lparg0) setGdkEventAnyFields(env, arg0, lparg0); -#ifndef JNI64 - OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEventAny_2II_FUNC); -#else - OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEventAny_2JJ_FUNC); -#endif -} -#endif - #if (!defined(NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventButton_2II) && !defined(JNI64)) || (!defined(NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventButton_2JJ) && defined(JNI64)) #ifndef JNI64 JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GdkEventButton_2II)(JNIEnv *env, jclass that, jobject arg0, jintLong arg1, jintLong arg2) @@ -18777,32 +18790,6 @@ fail: } #endif -#if (!defined(NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEvent_2II) && !defined(JNI64)) || (!defined(NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEvent_2JJ) && defined(JNI64)) -#ifndef JNI64 -JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GdkEvent_2II)(JNIEnv *env, jclass that, jobject arg0, jintLong arg1, jintLong arg2) -#else -JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GdkEvent_2JJ)(JNIEnv *env, jclass that, jobject arg0, jintLong arg1, jintLong arg2) -#endif -{ - GdkEvent _arg0, *lparg0=NULL; -#ifndef JNI64 - OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEvent_2II_FUNC); -#else - OS_NATIVE_ENTER(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEvent_2JJ_FUNC); -#endif - if (!arg0) goto fail; - if ((lparg0 = &_arg0) == NULL) goto fail; - memmove((void *)lparg0, (const void *)arg1, (size_t)arg2); -fail: - if (arg0 && lparg0) setGdkEventFields(env, arg0, lparg0); -#ifndef JNI64 - OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEvent_2II_FUNC); -#else - OS_NATIVE_EXIT(env, that, memmove__Lorg_eclipse_swt_internal_gtk_GdkEvent_2JJ_FUNC); -#endif -} -#endif - #if (!defined(NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkKeymapKey_2II) && !defined(JNI64)) || (!defined(NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkKeymapKey_2JJ) && defined(JNI64)) #ifndef JNI64 JNIEXPORT void JNICALL OS_NATIVE(memmove__Lorg_eclipse_swt_internal_gtk_GdkKeymapKey_2II)(JNIEnv *env, jclass that, jobject arg0, jintLong arg1, jintLong arg2) diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.h b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.h index 5ee41cf405..f3c369d7bb 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.h +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.h @@ -195,12 +195,8 @@ #define NO_memmove__LLorg_eclipse_swt_internal_gtk_GtkTargetEntry_2JJ #define NO_memmove__Iorg_eclipse_swt_internal_gtk_GdkEvent_2I #define NO_memmove__Jorg_eclipse_swt_internal_gtk_GdkEvent_2J -#define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEvent_2II -#define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEvent_2JJ #define NO_memmove__Iorg_eclipse_swt_internal_gtk_GdkEventAny_2I #define NO_memmove__Jorg_eclipse_swt_internal_gtk_GdkEventAny_2J -#define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventAny_2II -#define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventAny_2JJ #define NO_memmove__ILorg_eclipse_swt_internal_gtk_GdkEventButton_2I #define NO_memmove__JLorg_eclipse_swt_internal_gtk_GdkEventButton_2J #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventButton_2II @@ -209,8 +205,6 @@ #define NO_memmove__Jorg_eclipse_swt_internal_gtk_GdkEventCrossing_2J #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventCrossing_2II #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventCrossing_2JJ -#define NO_memmove__ILorg_eclipse_swt_internal_gtk_GdkEventExpose_2I -#define NO_memmove__JLorg_eclipse_swt_internal_gtk_GdkEventExpose_2J #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventExpose_2II #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventExpose_2JJ #define NO_memmove__Iorg_eclipse_swt_internal_gtk_GdkEventFocus_2I @@ -221,8 +215,6 @@ #define NO_memmove__JLorg_eclipse_swt_internal_gtk_GdkEventKey_2J #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventKey_2II #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventKey_2JJ -#define NO_memmove__ILorg_eclipse_swt_internal_gtk_GdkEventMotion_2I -#define NO_memmove__JLorg_eclipse_swt_internal_gtk_GdkEventMotion_2J #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventMotion_2II #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventMotion_2JJ #define NO_memmove__Iorg_eclipse_swt_internal_gtk_GdkEventScroll_2I @@ -362,6 +354,7 @@ #define NO__1gdk_1window_1show_1unraised #define NO__1gdk_1device_1get_1window_1at_1position #define NO__1gdk_1window_1set_1background_1pattern +#define NO__1gdk_1event_1get_1window // GdkDragContext removals #define NO__1gdk_1drag_1context_1get_1dest_1window @@ -432,6 +425,7 @@ #define NO__1gdk_1surface_1set_1functions #define NO__1gdk_1surface_1get_1root_1origin #define NO__1gdk_1surface_1invalidate_1region +#define NO__1gdk_1event_1get_1surface // No GtkSnapshot on GTK3 #define NO__1gtk_1snapshot_1append_1cairo @@ -449,6 +443,9 @@ #define NO__1gdk_1cursor_1new_1from_1name___3BJ #define NO__1gdk_1display_1get_1keymap #define NO__1gtk_1style_1context_1add_1provider_1for_1display + +// GdkEvent functions which do not exist on GTK3 +#define NO__1gdk_1event_1get_1focus_1in #endif #include "os_custom.h" 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 77fdbb859f..9a650a8cad 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 @@ -92,6 +92,7 @@ char * GDK_nativeFunctionNames[] = { "_1gdk_1display_1get_1monitor_1at_1window", "_1gdk_1display_1get_1n_1monitors", "_1gdk_1display_1get_1primary_1monitor", + "_1gdk_1display_1peek_1event", "_1gdk_1display_1supports_1cursor_1color", "_1gdk_1drag_1context_1get_1actions", "_1gdk_1drag_1context_1get_1dest_1window", @@ -102,12 +103,17 @@ char * GDK_nativeFunctionNames[] = { "_1gdk_1event_1copy", "_1gdk_1event_1free", "_1gdk_1event_1get", + "_1gdk_1event_1get_1button", "_1gdk_1event_1get_1coords", "_1gdk_1event_1get_1event_1type", + "_1gdk_1event_1get_1focus_1in", + "_1gdk_1event_1get_1root_1coords", "_1gdk_1event_1get_1scroll_1deltas", "_1gdk_1event_1get_1seat", "_1gdk_1event_1get_1state", + "_1gdk_1event_1get_1surface", "_1gdk_1event_1get_1time", + "_1gdk_1event_1get_1window", "_1gdk_1event_1handler_1set", "_1gdk_1event_1new", "_1gdk_1event_1peek", @@ -1735,21 +1741,11 @@ char * OS_nativeFunctionNames[] = { "memmove__JLorg_eclipse_swt_internal_gtk_GdkEventButton_2J", #endif #ifndef JNI64 - "memmove__ILorg_eclipse_swt_internal_gtk_GdkEventExpose_2I", -#else - "memmove__JLorg_eclipse_swt_internal_gtk_GdkEventExpose_2J", -#endif -#ifndef JNI64 "memmove__ILorg_eclipse_swt_internal_gtk_GdkEventKey_2I", #else "memmove__JLorg_eclipse_swt_internal_gtk_GdkEventKey_2J", #endif #ifndef JNI64 - "memmove__ILorg_eclipse_swt_internal_gtk_GdkEventMotion_2I", -#else - "memmove__JLorg_eclipse_swt_internal_gtk_GdkEventMotion_2J", -#endif -#ifndef JNI64 "memmove__ILorg_eclipse_swt_internal_gtk_GdkRGBA_2I", #else "memmove__JLorg_eclipse_swt_internal_gtk_GdkRGBA_2J", @@ -1790,11 +1786,6 @@ char * OS_nativeFunctionNames[] = { "memmove__Lorg_eclipse_swt_internal_gtk_GTypeQuery_2JJ", #endif #ifndef JNI64 - "memmove__Lorg_eclipse_swt_internal_gtk_GdkEventAny_2II", -#else - "memmove__Lorg_eclipse_swt_internal_gtk_GdkEventAny_2JJ", -#endif -#ifndef JNI64 "memmove__Lorg_eclipse_swt_internal_gtk_GdkEventButton_2II", #else "memmove__Lorg_eclipse_swt_internal_gtk_GdkEventButton_2JJ", @@ -1835,11 +1826,6 @@ char * OS_nativeFunctionNames[] = { "memmove__Lorg_eclipse_swt_internal_gtk_GdkEventWindowState_2JJ", #endif #ifndef JNI64 - "memmove__Lorg_eclipse_swt_internal_gtk_GdkEvent_2II", -#else - "memmove__Lorg_eclipse_swt_internal_gtk_GdkEvent_2JJ", -#endif -#ifndef JNI64 "memmove__Lorg_eclipse_swt_internal_gtk_GdkKeymapKey_2II", #else "memmove__Lorg_eclipse_swt_internal_gtk_GdkKeymapKey_2JJ", 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 689686c448..1ca8451325 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 @@ -102,6 +102,7 @@ typedef enum { _1gdk_1display_1get_1monitor_1at_1window_FUNC, _1gdk_1display_1get_1n_1monitors_FUNC, _1gdk_1display_1get_1primary_1monitor_FUNC, + _1gdk_1display_1peek_1event_FUNC, _1gdk_1display_1supports_1cursor_1color_FUNC, _1gdk_1drag_1context_1get_1actions_FUNC, _1gdk_1drag_1context_1get_1dest_1window_FUNC, @@ -112,12 +113,17 @@ typedef enum { _1gdk_1event_1copy_FUNC, _1gdk_1event_1free_FUNC, _1gdk_1event_1get_FUNC, + _1gdk_1event_1get_1button_FUNC, _1gdk_1event_1get_1coords_FUNC, _1gdk_1event_1get_1event_1type_FUNC, + _1gdk_1event_1get_1focus_1in_FUNC, + _1gdk_1event_1get_1root_1coords_FUNC, _1gdk_1event_1get_1scroll_1deltas_FUNC, _1gdk_1event_1get_1seat_FUNC, _1gdk_1event_1get_1state_FUNC, + _1gdk_1event_1get_1surface_FUNC, _1gdk_1event_1get_1time_FUNC, + _1gdk_1event_1get_1window_FUNC, _1gdk_1event_1handler_1set_FUNC, _1gdk_1event_1new_FUNC, _1gdk_1event_1peek_FUNC, @@ -1709,21 +1715,11 @@ typedef enum { memmove__JLorg_eclipse_swt_internal_gtk_GdkEventButton_2J_FUNC, #endif #ifndef JNI64 - memmove__ILorg_eclipse_swt_internal_gtk_GdkEventExpose_2I_FUNC, -#else - memmove__JLorg_eclipse_swt_internal_gtk_GdkEventExpose_2J_FUNC, -#endif -#ifndef JNI64 memmove__ILorg_eclipse_swt_internal_gtk_GdkEventKey_2I_FUNC, #else memmove__JLorg_eclipse_swt_internal_gtk_GdkEventKey_2J_FUNC, #endif #ifndef JNI64 - memmove__ILorg_eclipse_swt_internal_gtk_GdkEventMotion_2I_FUNC, -#else - memmove__JLorg_eclipse_swt_internal_gtk_GdkEventMotion_2J_FUNC, -#endif -#ifndef JNI64 memmove__ILorg_eclipse_swt_internal_gtk_GdkRGBA_2I_FUNC, #else memmove__JLorg_eclipse_swt_internal_gtk_GdkRGBA_2J_FUNC, @@ -1764,11 +1760,6 @@ typedef enum { memmove__Lorg_eclipse_swt_internal_gtk_GTypeQuery_2JJ_FUNC, #endif #ifndef JNI64 - memmove__Lorg_eclipse_swt_internal_gtk_GdkEventAny_2II_FUNC, -#else - memmove__Lorg_eclipse_swt_internal_gtk_GdkEventAny_2JJ_FUNC, -#endif -#ifndef JNI64 memmove__Lorg_eclipse_swt_internal_gtk_GdkEventButton_2II_FUNC, #else memmove__Lorg_eclipse_swt_internal_gtk_GdkEventButton_2JJ_FUNC, @@ -1809,11 +1800,6 @@ typedef enum { memmove__Lorg_eclipse_swt_internal_gtk_GdkEventWindowState_2JJ_FUNC, #endif #ifndef JNI64 - memmove__Lorg_eclipse_swt_internal_gtk_GdkEvent_2II_FUNC, -#else - memmove__Lorg_eclipse_swt_internal_gtk_GdkEvent_2JJ_FUNC, -#endif -#ifndef JNI64 memmove__Lorg_eclipse_swt_internal_gtk_GdkKeymapKey_2II_FUNC, #else memmove__Lorg_eclipse_swt_internal_gtk_GdkKeymapKey_2JJ_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 fcbf5dfc28..c52c19cd2e 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 @@ -986,6 +986,47 @@ public class GDK extends OS { } /** * @param event cast=(GdkEvent *) + * @param button cast=(guint *) + */ + public static final native boolean _gdk_event_get_button(long /*int*/ event, int[] button); + public static final boolean gdk_event_get_button(long /*int*/ event, int[] button) { + lock.lock(); + try { + return _gdk_event_get_button(event, button); + } finally { + lock.unlock(); + } + } + /** + * @param event cast=(GdkEvent *) + * @param in cast=(gboolean *) + */ + public static final native boolean _gdk_event_get_focus_in(long /*int*/ event, boolean [] in); + /** [GTK4 only, if-def'd in os.h] */ + public static final boolean gdk_event_get_focus_in(long /*int*/ event, boolean [] in) { + lock.lock(); + try { + return _gdk_event_get_focus_in(event, in); + } finally { + lock.unlock(); + } + } + /** + * @param event cast=(GdkEvent *) + * @param x cast=(gdouble *) + * @param y cast=(gdouble *) + */ + public static final native boolean _gdk_event_get_root_coords(long /*int*/ event, double[] x, double[] y); + public static final boolean gdk_event_get_root_coords(long /*int*/ event, double[] x, double[] y) { + lock.lock(); + try { + return _gdk_event_get_root_coords(event, x, y); + } finally { + lock.unlock(); + } + } + /** + * @param event cast=(GdkEvent *) * @param pmod cast=(GdkModifierType *) */ public static final native boolean _gdk_event_get_state(long /*int*/ event, int[] pmod); @@ -1023,6 +1064,32 @@ public class GDK extends OS { lock.unlock(); } } + /** + * @param event cast=(GdkEvent *) + */ + public static final native long /*int*/ _gdk_event_get_surface(long /*int*/ event); + /** [GTK4 only, if-def'd in os.h] **/ + public static final long /*int*/ gdk_event_get_surface(long /*int*/ event) { + lock.lock(); + try { + return _gdk_event_get_surface(event); + } finally { + lock.unlock(); + } + } + /** + * @param event cast=(GdkEvent *) + */ + public static final native long /*int*/ _gdk_event_get_window(long /*int*/ event); + /** [GTK3 only, if-def'd in os.h] **/ + public static final long /*int*/ gdk_event_get_window(long /*int*/ event) { + lock.lock(); + try { + return _gdk_event_get_window(event); + } finally { + lock.unlock(); + } + } /** @param event cast=(GdkEvent *) */ public static final native int _gdk_event_get_time(long /*int*/ event); public static final int gdk_event_get_time(long /*int*/ event) { @@ -1743,6 +1810,16 @@ public class GDK extends OS { lock.unlock(); } } + /** @param display cast=(GdkDisplay *) */ + public static final native long /*int*/ _gdk_display_peek_event(long /*int*/ display); + public static final long /*int*/ gdk_display_peek_event(long /*int*/ display) { + lock.lock(); + try { + return _gdk_display_peek_event(display); + } finally { + lock.unlock(); + } + } /** * @method flags=dynamic * @param screen cast=(GdkScreen *) diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java index 2beb91700a..7ae2b69c78 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java @@ -2877,18 +2877,6 @@ public static final native void memmove(long /*int*/ dest, GdkEventButton src, l * @param size cast=(size_t) */ public static final native void memmove(long /*int*/ dest, GdkEventKey src, long /*int*/ size); -/** - * @param dest cast=(void *) - * @param src cast=(const void *),flags=no_out - * @param size cast=(size_t) - */ -public static final native void memmove(long /*int*/ dest, GdkEventExpose src, long /*int*/ size); -/** - * @param dest cast=(void *) - * @param src cast=(const void *),flags=no_out - * @param size cast=(size_t) - */ -public static final native void memmove(long /*int*/ dest, GdkEventMotion src, long /*int*/ size); /** @param src flags=no_out */ public static final native void memmove(long /*int*/ dest, GtkWidgetClass src); /** @@ -2933,18 +2921,6 @@ public static final native void memmove(GdkRGBA dest, long /*int*/ src, long /*i * @param src cast=(const void *) * @param size cast=(size_t) */ -public static final native void memmove(GdkEvent dest, long /*int*/ src, long /*int*/ size); -/** - * @param dest cast=(void *),flags=no_in - * @param src cast=(const void *) - * @param size cast=(size_t) - */ -public static final native void memmove(GdkEventAny dest, long /*int*/ src, long /*int*/ size); -/** - * @param dest cast=(void *),flags=no_in - * @param src cast=(const void *) - * @param size cast=(size_t) - */ public static final native void memmove(GdkEventButton dest, long /*int*/ src, long /*int*/ size); /** * @param dest cast=(void *),flags=no_in diff --git a/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/browser/WebKit.java b/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/browser/WebKit.java index 3a72a52ae2..3c6d1b8f12 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/browser/WebKit.java +++ b/bundles/org.eclipse.swt/Eclipse SWT WebKit/gtk/org/eclipse/swt/browser/WebKit.java @@ -2083,7 +2083,11 @@ boolean handleDOMEvent (long /*int*/ event, int type) { keyEventState = gdkEvent.state; break; } - GDK.gdk_event_free (eventPtr); + if (GTK.GTK4) { + OS.g_object_unref(eventPtr); + } else { + GDK.gdk_event_free (eventPtr); + } } int keyCode = (int)WebKitGTK.webkit_dom_ui_event_get_key_code (event); int charCode = (int)WebKitGTK.webkit_dom_ui_event_get_char_code (event); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Combo.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Combo.java index 6be8f47936..2a1213032e 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Combo.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Combo.java @@ -1312,9 +1312,10 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { * the left mouse button event from being propagated. The fix is to * send the mouse event from the event_after handler. */ - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, event, GdkEventButton.sizeof); - if (gdkEvent.type == GDK.GDK_BUTTON_PRESS && gdkEvent.button == 1) { + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(event, eventButton); + int eventType = GDK.gdk_event_get_event_type(event); + if (eventType == GDK.GDK_BUTTON_PRESS && eventButton[0] == 1) { return gtk_button_press_event(widget, event, false); } return super.gtk_button_press_event (widget, event); @@ -1361,7 +1362,7 @@ long /*int*/ gtk_changed (long /*int*/ widget) { keyPress = true; break; } - GDK.gdk_event_free (eventPtr); + gdk_event_free (eventPtr); } if (keyPress) { postEvent (SWT.Modify); @@ -1520,14 +1521,19 @@ long /*int*/ gtk_event_after (long /*int*/ widget, long /*int*/ gdkEvent) { * user clicks on the drop down button focus is assigned to the text * field. */ - GdkEvent event = new GdkEvent (); - OS.memmove (event, gdkEvent, GdkEvent.sizeof); - switch (event.type) { + int eventType = GDK.gdk_event_get_event_type(gdkEvent); + switch (eventType) { case GDK.GDK_BUTTON_PRESS: { - GdkEventButton gdkEventButton = new GdkEventButton (); - OS.memmove (gdkEventButton, gdkEvent, GdkEventButton.sizeof); - if (gdkEventButton.button == 1) { - if (!sendMouseEvent (SWT.MouseDown, gdkEventButton.button, display.clickCount, 0, false, gdkEventButton.time, gdkEventButton.x_root, gdkEventButton.y_root, false, gdkEventButton.state)) { + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(gdkEvent, eventButton); + int eventTime = GDK.gdk_event_get_time(gdkEvent); + double [] eventRX = new double [1]; + double [] eventRY = new double [1]; + GDK.gdk_event_get_root_coords(gdkEvent, eventRX, eventRY); + int [] eventState = new int [1]; + GDK.gdk_event_get_state(gdkEvent, eventState); + if (eventButton[0] == 1) { + if (!sendMouseEvent (SWT.MouseDown, eventButton[0], display.clickCount, 0, false, eventTime, eventRX[0], eventRY[0], false, eventState[0])) { return 1; } if ((style & SWT.READ_ONLY) == 0 && widget == buttonHandle) { @@ -1538,9 +1544,15 @@ long /*int*/ gtk_event_after (long /*int*/ widget, long /*int*/ gdkEvent) { } case GDK.GDK_FOCUS_CHANGE: { if ((style & SWT.READ_ONLY) == 0) { - GdkEventFocus gdkEventFocus = new GdkEventFocus (); - OS.memmove (gdkEventFocus, gdkEvent, GdkEventFocus.sizeof); - if (gdkEventFocus.in != 0) { + boolean [] focusIn = new boolean [1]; + if (GTK.GTK4) { + GDK.gdk_event_get_focus_in(gdkEvent, focusIn); + } else { + GdkEventFocus gdkEventFocus = new GdkEventFocus (); + OS.memmove (gdkEventFocus, gdkEvent, GdkEventFocus.sizeof); + focusIn[0] = gdkEventFocus.in != 0; + } + if (focusIn[0]) { if (GTK.GTK_VERSION >= OS.VERSION(3, 20, 0)) { GTK.gtk_widget_set_focus_on_click(handle, false); } else { @@ -2599,7 +2611,7 @@ String verifyText (String string, int start, int end) { setKeyState (event, gdkEvent); break; } - GDK.gdk_event_free (eventPtr); + gdk_event_free (eventPtr); } /* * It is possible (but unlikely), that application 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 89dfb9b4fa..a1b6f6718f 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 @@ -842,9 +842,9 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { if (result != 0) return result; if ((state & CANVAS) != 0) { if ((style & SWT.NO_FOCUS) == 0 && hooksKeys ()) { - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, event, GdkEventButton.sizeof); - if (gdkEvent.button == 1) { + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(event, eventButton); + if (eventButton[0] == 1) { if (getChildrenCount () == 0) setFocus (); } } 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 9f265d8c97..19aec1c21e 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 @@ -3308,12 +3308,24 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event, bo mouseDown = true; dragBegun = false; - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, event, GdkEventButton.sizeof); - lastInput.x = (int) gdkEvent.x; - lastInput.y = (int) gdkEvent.y; + // Event fields + double [] eventX = new double [1]; + double [] eventY = new double [1]; + GDK.gdk_event_get_coords(event, eventX, eventY); + int eventType = GDK.gdk_event_get_event_type(event); + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(event, eventButton); + int eventTime = GDK.gdk_event_get_time(event); + double [] eventRX = new double [1]; + double [] eventRY = new double [1]; + GDK.gdk_event_get_root_coords(event, eventRX, eventRY); + int [] eventState = new int [1]; + GDK.gdk_event_get_state(event, eventState); + + lastInput.x = (int) eventX[0]; + lastInput.y = (int) eventY[0]; if (containedInRegion(lastInput.x, lastInput.y)) return 0; - if (gdkEvent.type == GDK.GDK_3BUTTON_PRESS) return 0; + if (eventType == GDK.GDK_3BUTTON_PRESS) return 0; /* * When a shell is created with SWT.ON_TOP and SWT.NO_FOCUS, @@ -3326,15 +3338,16 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event, bo shell.forceActive(); } long /*int*/ result = 0; - if (gdkEvent.type == GDK.GDK_BUTTON_PRESS) { + if (eventType == GDK.GDK_BUTTON_PRESS) { boolean dragging = false; display.clickCount = 1; - long /*int*/ nextEvent = GDK.gdk_event_peek (); + long /*int*/ defaultDisplay = GDK.gdk_display_get_default(); + long /*int*/ nextEvent = GTK.GTK4 ? GDK.gdk_display_peek_event(defaultDisplay) : GDK.gdk_event_peek (); if (nextEvent != 0) { - int eventType = GDK.GDK_EVENT_TYPE (nextEvent); - if (eventType == GDK.GDK_2BUTTON_PRESS) display.clickCount = 2; - if (eventType == GDK.GDK_3BUTTON_PRESS) display.clickCount = 3; - GDK.gdk_event_free (nextEvent); + int peekedEventType = GDK.GDK_EVENT_TYPE (nextEvent); + if (peekedEventType == GDK.GDK_2BUTTON_PRESS) display.clickCount = 2; + if (peekedEventType == GDK.GDK_3BUTTON_PRESS) display.clickCount = 3; + gdk_event_free (nextEvent); } /* * Feature in GTK: DND detection for X.11 & Wayland support is done through motion notify event @@ -3342,9 +3355,9 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event, bo */ if (OS.isX11()) { // Wayland if ((state & DRAG_DETECT) != 0 && hooks (SWT.DragDetect)) { - if (gdkEvent.button == 1) { + if (eventButton[0] == 1) { boolean [] consume = new boolean [1]; - if (dragDetect ((int) gdkEvent.x, (int) gdkEvent.y, true, true, consume)) { + if (dragDetect ((int) eventX[0], (int) eventY[0], true, true, consume)) { dragging = true; if (consume [0]) result = 1; } @@ -3352,7 +3365,7 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event, bo } } } - if (sendMouseDown && !sendMouseEvent (SWT.MouseDown, gdkEvent.button, display.clickCount, 0, false, gdkEvent.time, gdkEvent.x_root, gdkEvent.y_root, false, gdkEvent.state)) { + if (sendMouseDown && !sendMouseEvent (SWT.MouseDown, eventButton[0], display.clickCount, 0, false, eventTime, eventRX[0], eventRY[0], false, eventState[0])) { result = 1; } if (isDisposed ()) return 1; @@ -3362,8 +3375,8 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event, bo */ if (OS.isX11()) { // Wayland if (dragging) { - Point scaledEvent = DPIUtil.autoScaleDown(new Point((int)gdkEvent.x, (int) gdkEvent.y)); - sendDragEvent (gdkEvent.button, gdkEvent.state, scaledEvent.x, scaledEvent.y, false); + Point scaledEvent = DPIUtil.autoScaleDown(new Point((int)eventX[0], (int) eventY[0])); + sendDragEvent (eventButton[0], eventState[0], scaledEvent.x, scaledEvent.y, false); if (isDisposed ()) return 1; } } @@ -3373,15 +3386,15 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event, bo * operating system from displaying the menu if necessary. */ if ((state & MENU) != 0) { - if (gdkEvent.button == 3) { - if (showMenu ((int)gdkEvent.x_root, (int)gdkEvent.y_root)) { + if (eventButton[0] == 3) { + if (showMenu ((int)eventRX[0], (int)eventRY[0])) { result = 1; } } } } else { display.clickCount = 2; - result = sendMouseEvent (SWT.MouseDoubleClick, gdkEvent.button, display.clickCount, 0, false, gdkEvent.time, gdkEvent.x_root, gdkEvent.y_root, false, gdkEvent.state) ? 0 : 1; + result = sendMouseEvent (SWT.MouseDoubleClick, eventButton[0], display.clickCount, 0, false, eventTime, eventRX[0],eventRY[0], false, eventState[0]) ? 0 : 1; if (isDisposed ()) return 1; } if (!shell.isDisposed ()) shell.setActiveControl (this, SWT.MouseDown); @@ -3391,12 +3404,23 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event, bo @Override long /*int*/ gtk_button_release_event (long /*int*/ widget, long /*int*/ event) { mouseDown = false; - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, event, GdkEventButton.sizeof); - lastInput.x = (int) gdkEvent.x; - lastInput.y = (int) gdkEvent.y; + // Event fields + double [] eventX = new double [1]; + double [] eventY = new double [1]; + GDK.gdk_event_get_coords(event, eventX, eventY); + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(event, eventButton); + int eventTime = GDK.gdk_event_get_time(event); + double [] eventRX = new double [1]; + double [] eventRY = new double [1]; + GDK.gdk_event_get_root_coords(event, eventRX, eventRY); + int [] eventState = new int [1]; + GDK.gdk_event_get_state(event, eventState); + + lastInput.x = (int) eventX[0]; + lastInput.y = (int) eventY[0]; if (containedInRegion(lastInput.x, lastInput.y)) return 0; - return sendMouseEvent (SWT.MouseUp, gdkEvent.button, display.clickCount, 0, false, gdkEvent.time, gdkEvent.x_root, gdkEvent.y_root, false, gdkEvent.state) ? 0 : 1; + return sendMouseEvent (SWT.MouseUp, eventButton[0], display.clickCount, 0, false, eventTime, eventRX[0], eventRY[0], false, eventState[0]) ? 0 : 1; } @Override @@ -3460,9 +3484,8 @@ boolean checkSubwindow () { @Override long /*int*/ gtk_event_after (long /*int*/ widget, long /*int*/ gdkEvent) { - GdkEvent event = new GdkEvent (); - OS.memmove (event, gdkEvent, GdkEvent.sizeof); - switch (event.type) { + int eventType = GDK.gdk_event_get_event_type(gdkEvent); + switch (eventType) { case GDK.GDK_BUTTON_PRESS: { if (widget != eventHandle ()) break; /* @@ -3471,18 +3494,27 @@ long /*int*/ gtk_event_after (long /*int*/ widget, long /*int*/ gdkEvent) { * such as GtkTreeView to select items before a menu is shown. */ if ((state & MENU) == 0) { - GdkEventButton gdkEventButton = new GdkEventButton (); - OS.memmove (gdkEventButton, gdkEvent, GdkEventButton.sizeof); - if (gdkEventButton.button == 3) { - showMenu ((int) gdkEventButton.x_root, (int) gdkEventButton.y_root); + double [] eventRX = new double [1]; + double [] eventRY = new double [1]; + GDK.gdk_event_get_root_coords(gdkEvent, eventRX, eventRY); + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(gdkEvent, eventButton); + if (eventButton[0] == 3) { + showMenu ((int) eventRX[0], (int) eventRY[0]); } } break; } case GDK.GDK_FOCUS_CHANGE: { if (!isFocusHandle (widget)) break; - GdkEventFocus gdkEventFocus = new GdkEventFocus (); - OS.memmove (gdkEventFocus, gdkEvent, GdkEventFocus.sizeof); + boolean [] focusIn = new boolean [1]; + if (GTK.GTK4) { + GDK.gdk_event_get_focus_in(gdkEvent, focusIn); + } else { + GdkEventFocus gdkEventFocus = new GdkEventFocus (); + OS.memmove (gdkEventFocus, gdkEvent, GdkEventFocus.sizeof); + focusIn[0] = gdkEventFocus.in != 0; + } /* * Feature in GTK. The GTK combo box popup under some window managers @@ -3494,7 +3526,7 @@ long /*int*/ gtk_event_after (long /*int*/ widget, long /*int*/ gdkEvent) { * NOTE: This code runs for all menus. */ Display display = this.display; - if (gdkEventFocus.in != 0) { + if (focusIn[0]) { if (display.ignoreFocus) { display.ignoreFocus = false; break; @@ -3510,7 +3542,7 @@ long /*int*/ gtk_event_after (long /*int*/ widget, long /*int*/ gdkEvent) { } } - sendFocusEvent (gdkEventFocus.in != 0 ? SWT.FocusIn : SWT.FocusOut); + sendFocusEvent (focusIn[0] ? SWT.FocusIn : SWT.FocusOut); break; } } @@ -3729,7 +3761,7 @@ long /*int*/ gtk_mnemonic_activate (long /*int*/ widget, long /*int*/ arg1) { } result = 1; } - GDK.gdk_event_free (eventPtr); + gdk_event_free (eventPtr); } return result; } @@ -3762,11 +3794,17 @@ long /*int*/ gtk_motion_notify_event (long /*int*/ widget, long /*int*/ event) { } if (dragging) { GTK.gtk_event_controller_handle_event(dragGesture,event); - GdkEventButton gdkEvent1 = new GdkEventButton (); - OS.memmove (gdkEvent1, event, GdkEventButton.sizeof); - if (gdkEvent1.type == GDK.GDK_3BUTTON_PRESS) return 0; - Point scaledEvent = DPIUtil.autoScaleDown(new Point((int)gdkEvent1.x, (int) gdkEvent1.y)); - if (sendDragEvent (gdkEvent1.button, gdkEvent1.state, scaledEvent.x, scaledEvent.y, false)){ + int eventType = GDK.gdk_event_get_event_type(event); + if (eventType == GDK.GDK_3BUTTON_PRESS) return 0; + double [] eventX = new double [1]; + double [] eventY = new double [1]; + GDK.gdk_event_get_coords(event, eventX, eventY); + Point scaledEvent = DPIUtil.autoScaleDown(new Point((int)eventX[0], (int) eventY[0])); + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(event, eventButton); + int [] eventState = new int [1]; + GDK.gdk_event_get_state(event, eventState); + if (sendDragEvent (eventButton[0], eventState[0], scaledEvent.x, scaledEvent.y, false)){ return 1; } } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Link.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Link.java index 8f98c9ab22..95c26a4de1 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Link.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Link.java @@ -331,12 +331,16 @@ public String getText () { long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { long /*int*/ result = super.gtk_button_press_event (widget, event); if (result != 0) return result; - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, event, GdkEventButton.sizeof); - if (gdkEvent.button == 1 && gdkEvent.type == GDK.GDK_BUTTON_PRESS) { + int eventType = GDK.gdk_event_get_event_type(event); + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(event, eventButton); + double [] eventX = new double [1]; + double [] eventY = new double [1]; + GDK.gdk_event_get_coords(event, eventX, eventY); + if (eventButton[0] == 1 && eventType == GDK.GDK_BUTTON_PRESS) { if (focusIndex != -1) setFocus (); - int x = (int) gdkEvent.x; - int y = (int) gdkEvent.y; + int x = (int) eventX[0]; + int y = (int) eventY[0]; if ((style & SWT.MIRRORED) != 0) x = getClientWidth () - x; int offset = DPIUtil.autoScaleUp(layout.getOffset (x, y, null)); int oldSelectionX = selection.x; @@ -372,11 +376,14 @@ long /*int*/ gtk_button_release_event (long /*int*/ widget, long /*int*/ event) long /*int*/ result = super.gtk_button_release_event (widget, event); if (result != 0) return result; if (focusIndex == -1) return result; - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, event, GdkEventButton.sizeof); - if (gdkEvent.button == 1) { - int x = (int) gdkEvent.x; - int y = (int) gdkEvent.y; + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(event, eventButton); + double [] eventX = new double [1]; + double [] eventY = new double [1]; + GDK.gdk_event_get_coords(event, eventX, eventY); + if (eventButton[0] == 1) { + int x = (int) eventX[0]; + int y = (int) eventY[0]; if ((style & SWT.MIRRORED) != 0) x = getClientWidth () - x; Rectangle [] rects = getRectanglesInPixels (focusIndex); for (int i = 0; i < rects.length; i++) { @@ -410,9 +417,8 @@ long /*int*/ gtk_draw (long /*int*/ widget, long /*int*/ cairo) { @Override long /*int*/ gtk_event_after (long /*int*/ widget, long /*int*/ gdkEvent) { long /*int*/ result = super.gtk_event_after (widget, gdkEvent); - GdkEvent event = new GdkEvent (); - OS.memmove (event, gdkEvent, GdkEvent.sizeof); - switch (event.type) { + int eventType = GDK.gdk_event_get_event_type(gdkEvent); + switch (eventType) { case GDK.GDK_FOCUS_CHANGE: redraw (); break; 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 095f4e5e23..aac3010759 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 @@ -796,22 +796,28 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { * in GTK in the case that additional items aren't being added (CTRL_MASK or SHIFT_MASK) and the item being dragged is already * selected, we can give the DnD handling to MOTION-NOTIFY. See Bug 503431 */ - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, event, GdkEventButton.sizeof); + double [] eventX = new double [1]; + double [] eventY = new double [1]; + GDK.gdk_event_get_coords(event, eventX, eventY); + int eventType = GDK.gdk_event_get_event_type(event); + int [] eventState = new int [1]; + GDK.gdk_event_get_state(event, eventState); + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(event, eventButton); if ((state & DRAG_DETECT) != 0 && hooks (SWT.DragDetect) && - !OS.isX11() && gdkEvent.type == GDK.GDK_BUTTON_PRESS) { // Wayland + !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 (); if (nextEvent == 0) { long /*int*/ [] path = new long /*int*/ [1]; long /*int*/ selection = GTK.gtk_tree_view_get_selection (handle); - if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)gdkEvent.x, (int)gdkEvent.y, path, null, null, null) && + if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)eventX[0], (int)eventY[0], path, null, null, null) && path[0] != 0) { // selection count is used in the case of clicking an already selected item while holding Control selectionCountOnPress = getSelectionCount(); if (GTK.gtk_tree_selection_path_is_selected (selection, path[0])) { - if (((gdkEvent.state & (GDK.GDK_CONTROL_MASK|GDK.GDK_SHIFT_MASK)) == 0) || - ((gdkEvent.state & GDK.GDK_CONTROL_MASK) != 0)) { + if (((eventState[0] & (GDK.GDK_CONTROL_MASK|GDK.GDK_SHIFT_MASK)) == 0) || + ((eventState[0] & GDK.GDK_CONTROL_MASK) != 0)) { /** * Disable selection on a mouse click if there are multiple items already selected. Also, * if control is currently being held down, we will designate the selection logic over to release @@ -837,10 +843,10 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { * run the default handler when the item is already part of the current selection. */ - int button = gdkEvent.button; - if (button == 3 && gdkEvent.type == GDK.GDK_BUTTON_PRESS) { + int button = eventButton[0]; + if (button == 3 && eventType == GDK.GDK_BUTTON_PRESS) { long /*int*/ [] path = new long /*int*/ [1]; - if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)gdkEvent.x, (int)gdkEvent.y, path, null, null, null)) { + if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)eventX[0], (int)eventY[0], path, null, null, null)) { if (path [0] != 0) { long /*int*/ selection = GTK.gtk_tree_view_get_selection (handle); if (GTK.gtk_tree_selection_path_is_selected (selection, path [0])) result = 1; @@ -858,7 +864,7 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { */ if ((style & SWT.SINGLE) != 0 && getSelectionCount () == 0) { long /*int*/ [] path = new long /*int*/ [1]; - if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)gdkEvent.x, (int)gdkEvent.y, path, null, null, null)) { + if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)eventX[0], (int)eventY[0], path, null, null, null)) { if (path [0] != 0) { long /*int*/ selection = GTK.gtk_tree_view_get_selection (handle); OS.g_signal_handlers_block_matched (selection, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); @@ -876,7 +882,7 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { * that 'row-activated' signal comes before double-click event. This prevents * opening of the current highlighted item when double clicking on any expander arrow. */ - if (gdkEvent.type == GDK.GDK_2BUTTON_PRESS && rowActivated) { + if (eventType == GDK.GDK_2BUTTON_PRESS && rowActivated) { sendTreeDefaultSelection (); rowActivated = false; } @@ -902,9 +908,17 @@ long /*int*/ gtk_key_press_event (long /*int*/ widget, long /*int*/ event) { @Override long /*int*/ gtk_button_release_event (long /*int*/ widget, long /*int*/ event) { - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, event, GdkEventButton.sizeof); - if (gdkEvent.window != GTK.gtk_tree_view_get_bin_window (handle)) return 0; + int [] eventState = new int [1]; + GDK.gdk_event_get_state(event, eventState); + 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); + if (GTK.GTK4) { + if (eventGdkResource != gtk_widget_get_surface (handle)) return 0; + } else { + if (eventGdkResource != GTK.gtk_tree_view_get_bin_window (handle)) return 0; + } /* * Feature in GTK. In multi-select tree view there is a problem with using DnD operations while also selecting multiple items. * When doing a DnD, GTK de-selects all other items except for the widget being dragged from. By disabling the selection function @@ -917,15 +931,15 @@ long /*int*/ gtk_button_release_event (long /*int*/ widget, long /*int*/ event) long /*int*/ selection = GTK.gtk_tree_view_get_selection (handle); // free up the selection function on release. GTK.gtk_tree_selection_set_select_function(selection,0,0,0); - if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)gdkEvent.x, (int)gdkEvent.y, path, null, null, null) && + if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)eventX[0], (int)eventY[0], path, null, null, null) && path[0] != 0 && GTK.gtk_tree_selection_path_is_selected (selection, path[0])) { selectionCountOnRelease = getSelectionCount(); - if ((gdkEvent.state & (GDK.GDK_CONTROL_MASK|GDK.GDK_SHIFT_MASK)) == 0) { + if ((eventState[0] & (GDK.GDK_CONTROL_MASK|GDK.GDK_SHIFT_MASK)) == 0) { GTK.gtk_tree_view_set_cursor(handle, path[0], 0, false); } // Check to see if there has been a new tree item selected when holding Control in Path. // If not, deselect the item. - if ((gdkEvent.state & GDK.GDK_CONTROL_MASK) != 0 && selectionCountOnRelease == selectionCountOnPress) { + if ((eventState[0] & GDK.GDK_CONTROL_MASK) != 0 && selectionCountOnRelease == selectionCountOnPress) { GTK.gtk_tree_selection_unselect_path (selection,path[0]); } } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Sash.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Sash.java index d37b060359..a8b5edf7bd 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Sash.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Sash.java @@ -154,20 +154,27 @@ void drawBand (int x, int y, int width, int height) { } @Override -long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ eventPtr) { - long /*int*/ result = super.gtk_button_press_event (widget, eventPtr); +long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { + long /*int*/ result = super.gtk_button_press_event (widget, event); if (result != 0) return result; - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, eventPtr, GdkEventButton.sizeof); - int button = gdkEvent.button; + // Event fields + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(event, eventButton); + int eventType = GDK.gdk_event_get_event_type(event); + double [] eventRX = new double [1]; + double [] eventRY = new double [1]; + GDK.gdk_event_get_root_coords(event, eventRX, eventRY); + int eventTime = GDK.gdk_event_get_time(event); + + int button = eventButton[0]; if (button != 1) return 0; - if (gdkEvent.type == GDK.GDK_2BUTTON_PRESS) return 0; - if (gdkEvent.type == GDK.GDK_3BUTTON_PRESS) return 0; + if (eventType == GDK.GDK_2BUTTON_PRESS) return 0; + if (eventType == GDK.GDK_3BUTTON_PRESS) return 0; long /*int*/ window = gtk_widget_get_window (widget); int [] origin_x = new int [1], origin_y = new int [1]; GDK.gdk_window_get_origin (window, origin_x, origin_y); - startX = (int) (gdkEvent.x_root - origin_x [0]); - startY = (int) (gdkEvent.y_root - origin_y [0]); + startX = (int) (eventRX[0] - origin_x [0]); + startY = (int) (eventRY[0] - origin_y [0]); GtkAllocation allocation = new GtkAllocation (); GTK.gtk_widget_get_allocation(handle, allocation); int x = allocation.x; @@ -176,19 +183,19 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ eventPtr) int height = allocation.height; lastX = x; lastY = y; - Event event = new Event (); - event.time = gdkEvent.time; + Event jEvent = new Event (); + jEvent.time = eventTime; Rectangle eventRect = new Rectangle (lastX, lastY, width, height); - event.setBounds (DPIUtil.autoScaleDown (eventRect)); + jEvent.setBounds (DPIUtil.autoScaleDown (eventRect)); if ((style & SWT.SMOOTH) == 0) { - event.detail = SWT.DRAG; + jEvent.detail = SWT.DRAG; } - if ((parent.style & SWT.MIRRORED) != 0) event.x = DPIUtil.autoScaleDown (parent.getClientWidth () - width) - event.x; - sendSelectionEvent (SWT.Selection, event, true); + if ((parent.style & SWT.MIRRORED) != 0) jEvent.x = DPIUtil.autoScaleDown (parent.getClientWidth () - width) - jEvent.x; + sendSelectionEvent (SWT.Selection, jEvent, true); if (isDisposed ()) return 0; - if (event.doit) { + if (jEvent.doit) { dragging = true; - Rectangle rect = DPIUtil.autoScaleUp (event.getBounds ()); + Rectangle rect = DPIUtil.autoScaleUp (jEvent.getBounds ()); lastX = rect.x; lastY = rect.y; if ((parent.style & SWT.MIRRORED) != 0) lastX = parent.getClientWidth () - width - lastX; @@ -203,12 +210,13 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ eventPtr) } @Override -long /*int*/ gtk_button_release_event (long /*int*/ widget, long /*int*/ eventPtr) { - long /*int*/ result = super.gtk_button_release_event (widget, eventPtr); +long /*int*/ gtk_button_release_event (long /*int*/ widget, long /*int*/ event) { + long /*int*/ result = super.gtk_button_release_event (widget, event); if (result != 0) return result; - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, eventPtr, GdkEventButton.sizeof); - int button = gdkEvent.button; + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(event, eventButton); + int eventTime = GDK.gdk_event_get_time(event); + int button = eventButton[0]; if (button != 1) return 0; if (!dragging) return 0; dragging = false; @@ -216,17 +224,17 @@ long /*int*/ gtk_button_release_event (long /*int*/ widget, long /*int*/ eventPt GTK.gtk_widget_get_allocation (handle, allocation); int width = allocation.width; int height = allocation.height; - Event event = new Event (); - event.time = gdkEvent.time; + Event jEvent = new Event (); + jEvent.time = eventTime; Rectangle eventRect = new Rectangle (lastX, lastY, width, height); - event.setBounds (DPIUtil.autoScaleDown (eventRect)); + jEvent.setBounds (DPIUtil.autoScaleDown (eventRect)); drawBand (lastX, lastY, width, height); - if ((parent.style & SWT.MIRRORED) != 0) event.x = DPIUtil.autoScaleDown (parent.getClientWidth () - width) - event.x; - sendSelectionEvent (SWT.Selection, event, true); + if ((parent.style & SWT.MIRRORED) != 0) jEvent.x = DPIUtil.autoScaleDown (parent.getClientWidth () - width) - jEvent.x; + sendSelectionEvent (SWT.Selection, jEvent, true); if (isDisposed ()) return result; - if (event.doit) { + if (jEvent.doit) { if ((style & SWT.SMOOTH) != 0) { - Rectangle rect = DPIUtil.autoScaleUp (event.getBounds ()); + Rectangle rect = DPIUtil.autoScaleUp (jEvent.getBounds ()); setBoundsInPixels (rect.x, rect.y, width, height); // widget could be disposed at this point } 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 76ffd0d193..6aea071f21 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 @@ -551,13 +551,12 @@ long /*int*/ gtk_value_changed (long /*int*/ adjustment) { @Override long /*int*/ gtk_event_after (long /*int*/ widget, long /*int*/ gdkEvent) { - GdkEvent gtkEvent = new GdkEvent (); - OS.memmove (gtkEvent, gdkEvent, GdkEvent.sizeof); - switch (gtkEvent.type) { + int eventType = GDK.gdk_event_get_event_type(gdkEvent); + switch (eventType) { case GDK.GDK_BUTTON_RELEASE: { - GdkEventButton gdkEventButton = new GdkEventButton (); - OS.memmove (gdkEventButton, gdkEvent, GdkEventButton.sizeof); - if (gdkEventButton.button == 1 && detail == GTK.GTK_SCROLL_JUMP) { + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(gdkEvent, eventButton); + if (eventButton[0] == 1 && detail == GTK.GTK_SCROLL_JUMP) { if (!dragSent) { Event event = new Event (); event.detail = SWT.DRAG; diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java index c4afe111f1..4a3a4ab497 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java @@ -1359,11 +1359,14 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { if (OS.isX11() && (style & SWT.ON_TOP) != 0 && (style & SWT.NO_FOCUS) == 0) { forceActive (); } - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, event, GdkEventButton.sizeof); - if (gdkEvent.button == 1) { - display.resizeLocationX = gdkEvent.x_root; - display.resizeLocationY = gdkEvent.y_root; + double [] eventRX = new double [1]; + double [] eventRY = new double [1]; + GDK.gdk_event_get_root_coords(event, eventRX, eventRY); + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(event, eventButton); + if (eventButton[0] == 1) { + display.resizeLocationX = eventRX[0]; + display.resizeLocationY = eventRY[0]; int [] x = new int [1], y = new int [1]; GTK.gtk_window_get_position (shellHandle, x, y); display.resizeBoundsX = x [0]; 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 880b48a143..86f1742aa2 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 @@ -223,13 +223,12 @@ long /*int*/ gtk_value_changed (long /*int*/ adjustment) { @Override long /*int*/ gtk_event_after (long /*int*/ widget, long /*int*/ gdkEvent) { - GdkEvent gtkEvent = new GdkEvent (); - OS.memmove (gtkEvent, gdkEvent, GdkEvent.sizeof); - switch (gtkEvent.type) { + int eventType = GDK.gdk_event_get_event_type(gdkEvent); + switch (eventType) { case GDK.GDK_BUTTON_RELEASE: { - GdkEventButton gdkEventButton = new GdkEventButton (); - OS.memmove (gdkEventButton, gdkEvent, GdkEventButton.sizeof); - if (gdkEventButton.button == 1 && detail == SWT.DRAG) { + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(gdkEvent, eventButton); + if (eventButton[0] == 1 && detail == SWT.DRAG) { if (!dragSent) { Event event = new Event (); event.detail = SWT.DRAG; diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Spinner.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Spinner.java index 3e34ab592e..b2a2abe18b 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Spinner.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Spinner.java @@ -611,7 +611,7 @@ long /*int*/ gtk_changed (long /*int*/ widget) { keyPress = true; break; } - GDK.gdk_event_free (eventPtr); + gdk_event_free (eventPtr); } if (keyPress) { postEvent (SWT.Modify); @@ -1225,7 +1225,7 @@ String verifyText (String string, int start, int end) { setKeyState (event, gdkEvent); break; } - GDK.gdk_event_free (eventPtr); + gdk_event_free (eventPtr); } int index = 0; if (GTK.gtk_spin_button_get_digits (handle) > 0) { 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 4bbbf7f1a9..03a1fcb889 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 @@ -1984,9 +1984,23 @@ public int getTopIndex () { @Override long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, event, GdkEventButton.sizeof); - if (gdkEvent.window != GTK.gtk_tree_view_get_bin_window (handle)) return 0; + double [] eventX = new double [1]; + double [] eventY = new double [1]; + GDK.gdk_event_get_coords(event, eventX, eventY); + int eventType = GDK.gdk_event_get_event_type(event); + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(event, eventButton); + double [] eventRX = new double [1]; + double [] eventRY = new double [1]; + 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); + if (GTK.GTK4) { + if (eventGdkResource != gtk_widget_get_surface (handle)) return 0; + } else { + if (eventGdkResource != GTK.gtk_tree_view_get_bin_window (handle)) return 0; + } long /*int*/ result = super.gtk_button_press_event (widget, event); if (result != 0) return result; /* @@ -1996,19 +2010,19 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { * selected, we can give the DnD handling to MOTION-NOTIFY. Seee Bug 503431 */ if ((state & DRAG_DETECT) != 0 && hooks (SWT.DragDetect) && - !OS.isX11() && gdkEvent.type == GDK.GDK_BUTTON_PRESS) { // Wayland + !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 (); if (nextEvent == 0) { long /*int*/ [] path = new long /*int*/ [1]; long /*int*/ selection = GTK.gtk_tree_view_get_selection (handle); - if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)gdkEvent.x, (int)gdkEvent.y, path, null, null, null) && + if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)eventX[0], (int)eventY[0], path, null, null, null) && path[0] != 0) { // selection count is used in the case of clicking an already selected item while holding Control selectionCountOnPress = getSelectionCount(); if (GTK.gtk_tree_selection_path_is_selected (selection, path[0])) { - if (((gdkEvent.state & (GDK.GDK_CONTROL_MASK|GDK.GDK_SHIFT_MASK)) == 0) || - ((gdkEvent.state & GDK.GDK_CONTROL_MASK) != 0)) { + if (((eventState[0] & (GDK.GDK_CONTROL_MASK|GDK.GDK_SHIFT_MASK)) == 0) || + ((eventState[0] & GDK.GDK_CONTROL_MASK) != 0)) { /** * Disable selection on a mouse click if there are multiple items already selected. Also, * if control is currently being held down, we will designate the selection logic over to release @@ -2033,10 +2047,10 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { * an unwanted selection event. The workaround is to detect that case and not * run the default handler when the item is already part of the current selection. */ - int button = gdkEvent.button; - if (button == 3 && gdkEvent.type == GDK.GDK_BUTTON_PRESS) { + int button = eventButton[0]; + if (button == 3 && eventType == GDK.GDK_BUTTON_PRESS) { long /*int*/ [] path = new long /*int*/ [1]; - if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)gdkEvent.x, (int)gdkEvent.y, path, null, null, null)) { + if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)eventX[0], (int)eventY[0], path, null, null, null)) { if (path [0] != 0) { long /*int*/ selection = GTK.gtk_tree_view_get_selection (handle); if (GTK.gtk_tree_selection_path_is_selected (selection, path [0])) result = 1; @@ -2054,7 +2068,7 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { */ if ((style & SWT.SINGLE) != 0 && getSelectionCount () == 0) { long /*int*/ [] path = new long /*int*/ [1]; - if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)gdkEvent.x, (int)gdkEvent.y, path, null, null, null)) { + if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)eventX[0], (int)eventY[0], path, null, null, null)) { if (path [0] != 0) { long /*int*/ selection = GTK.gtk_tree_view_get_selection (handle); OS.g_signal_handlers_block_matched (selection, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); @@ -2072,7 +2086,7 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { * that 'row-activated' signal comes before double-click event. This prevents * opening of the current highlighted item when double clicking on any expander arrow. */ - if (gdkEvent.type == GDK.GDK_2BUTTON_PRESS && rowActivated) { + if (eventType == GDK.GDK_2BUTTON_PRESS && rowActivated) { sendTreeDefaultSelection (); rowActivated = false; } @@ -2138,13 +2152,26 @@ void sendTreeDefaultSelection() { @Override long /*int*/ gtk_button_release_event (long /*int*/ widget, long /*int*/ event) { - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, event, GdkEventButton.sizeof); + double [] eventX = new double [1]; + double [] eventY = new double [1]; + GDK.gdk_event_get_coords(event, eventX, eventY); + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(event, eventButton); + double [] eventRX = new double [1]; + double [] eventRY = new double [1]; + 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); + if (GTK.GTK4) { + if (eventGdkResource != gtk_widget_get_surface (handle)) return 0; + } else { + if (eventGdkResource != GTK.gtk_tree_view_get_bin_window (handle)) return 0; + } // Check region since super.gtk_button_release_event() isn't called - lastInput.x = (int) gdkEvent.x; - lastInput.y = (int) gdkEvent.y; + lastInput.x = (int) eventX[0]; + lastInput.y = (int) eventY[0]; if (containedInRegion(lastInput.x, lastInput.y)) return 0; - if (gdkEvent.window != GTK.gtk_tree_view_get_bin_window (handle)) return 0; /* * Feature in GTK. In multi-select tree view there is a problem with using DnD operations while also selecting multiple items. * When doing a DnD, GTK de-selects all other items except for the widget being dragged from. By disabling the selection function @@ -2157,15 +2184,15 @@ long /*int*/ gtk_button_release_event (long /*int*/ widget, long /*int*/ event) long /*int*/ selection = GTK.gtk_tree_view_get_selection (handle); // free up the selection function on release. GTK.gtk_tree_selection_set_select_function(selection,0,0,0); - if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)gdkEvent.x, (int)gdkEvent.y, path, null, null, null) && + if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)eventX[0], (int)eventY[0], path, null, null, null) && path[0] != 0 && GTK.gtk_tree_selection_path_is_selected (selection, path[0])) { selectionCountOnRelease = getSelectionCount(); - if ((gdkEvent.state & (GDK.GDK_CONTROL_MASK|GDK.GDK_SHIFT_MASK)) == 0) { + if ((eventState[0] & (GDK.GDK_CONTROL_MASK|GDK.GDK_SHIFT_MASK)) == 0) { GTK.gtk_tree_view_set_cursor(handle, path[0], 0, false); } // Check to see if there has been a new tree item selected when holding Control in Path. // If not, deselect the item. - if ((gdkEvent.state & GDK.GDK_CONTROL_MASK) != 0 && selectionCountOnRelease == selectionCountOnPress) { + if ((eventState[0] & GDK.GDK_CONTROL_MASK) != 0 && selectionCountOnRelease == selectionCountOnPress) { GTK.gtk_tree_selection_unselect_path (selection,path[0]); } } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableColumn.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableColumn.java index e05dd7d720..da4add2fad 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableColumn.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableColumn.java @@ -349,21 +349,22 @@ long /*int*/ gtk_clicked (long /*int*/ widget) { boolean postEvent = true; long /*int*/ eventPtr = GTK.gtk_get_current_event (); if (eventPtr != 0) { - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, eventPtr, GdkEventButton.sizeof); - GDK.gdk_event_free (eventPtr); - switch (gdkEvent.type) { + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(eventPtr, eventButton); + int eventType = GDK.gdk_event_get_event_type(eventPtr); + int eventTime = GDK.gdk_event_get_time(eventPtr); + switch (eventType) { case GDK.GDK_BUTTON_RELEASE: { int clickTime = display.getDoubleClickTime (); - int eventTime = gdkEvent.time, eventButton = gdkEvent.button; - if (lastButton == eventButton && lastTime != 0 && Math.abs (lastTime - eventTime) <= clickTime) { + if (lastButton == eventButton[0] && lastTime != 0 && Math.abs (lastTime - eventTime) <= clickTime) { doubleClick = true; } lastTime = eventTime == 0 ? 1: eventTime; - lastButton = eventButton; + lastButton = eventButton[0]; break; } } + gdk_event_free (eventPtr); } if (postEvent) sendSelectionEvent (doubleClick ? SWT.DefaultSelection : SWT.Selection); return 0; @@ -371,14 +372,16 @@ long /*int*/ gtk_clicked (long /*int*/ widget) { @Override long /*int*/ gtk_event_after (long /*int*/ widget, long /*int*/ gdkEvent) { - GdkEvent event = new GdkEvent (); - OS.memmove (event, gdkEvent, GdkEvent.sizeof); - switch (event.type) { + int eventType = GDK.gdk_event_get_event_type(gdkEvent); + switch (eventType) { case GDK.GDK_BUTTON_PRESS: { - GdkEventButton gdkEventButton = new GdkEventButton (); - OS.memmove (gdkEventButton, gdkEvent, GdkEventButton.sizeof); - if (gdkEventButton.button == 3) { - parent.showMenu ((int) gdkEventButton.x_root, (int) gdkEventButton.y_root); + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(gdkEvent, eventButton); + if (eventButton[0] == 3) { + double [] eventRX = new double [1]; + double [] eventRY = new double [1]; + GDK.gdk_event_get_root_coords(gdkEvent, eventRX, eventRY); + parent.showMenu ((int) eventRX[0], (int) eventRY[0]); } break; } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java index e6a2586b4e..b5120e546d 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java @@ -1454,10 +1454,9 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { long /*int*/ result; result = super.gtk_button_press_event (widget, event); if (result != 0) return result; - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, event, GdkEventButton.sizeof); + int eventType = GDK.gdk_event_get_event_type(event); if (!doubleClick) { - switch (gdkEvent.type) { + switch (eventType) { case GDK.GDK_2BUTTON_PRESS: case GDK.GDK_3BUTTON_PRESS: return 1; @@ -1485,7 +1484,7 @@ long /*int*/ gtk_changed (long /*int*/ widget) { keyPress = true; break; } - GDK.gdk_event_free (eventPtr); + gdk_event_free (eventPtr); } if (keyPress) { postEvent (SWT.Modify); @@ -1635,13 +1634,18 @@ long /*int*/ gtk_event_after (long /*int*/ widget, long /*int*/ gdkEvent) { * use the correct value. */ if ((style & SWT.SINGLE) != 0 && display.entrySelectOnFocus) { - GdkEvent event = new GdkEvent (); - OS.memmove (event, gdkEvent, GdkEvent.sizeof); - switch (event.type) { + int eventType = GDK.gdk_event_get_event_type(gdkEvent); + switch (eventType) { case GDK.GDK_FOCUS_CHANGE: - GdkEventFocus gdkEventFocus = new GdkEventFocus (); - OS.memmove (gdkEventFocus, gdkEvent, GdkEventFocus.sizeof); - if (gdkEventFocus.in == 0) { + boolean [] focusIn = new boolean [1]; + if (GTK.GTK4) { + GDK.gdk_event_get_focus_in(gdkEvent, focusIn); + } else { + GdkEventFocus gdkEventFocus = new GdkEventFocus (); + OS.memmove (gdkEventFocus, gdkEvent, GdkEventFocus.sizeof); + focusIn[0] = gdkEventFocus.in != 0; + } + if (focusIn[0]) { long /*int*/ settings = GTK.gtk_settings_get_default (); OS.g_object_set (settings, GTK.gtk_entry_select_on_focus, true, 0); } @@ -2820,7 +2824,7 @@ String verifyText (String string, int start, int end) { setKeyState (event, gdkEvent); break; } - GDK.gdk_event_free (eventPtr); + gdk_event_free (eventPtr); } /* * It is possible (but unlikely), that application diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolItem.java index eea60be5a3..e56237571c 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolItem.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolItem.java @@ -470,6 +470,8 @@ int getWidthInPixels () { @Override long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { + // TODO_GTK4: this method needs to be converted to use GTK4 GdkEvent API + // as all the event structs are sealed now. GdkEventButton gdkEvent = new GdkEventButton (); OS.memmove (gdkEvent, event, GdkEventButton.sizeof); GtkAllocation allocation = new GtkAllocation (); @@ -486,6 +488,8 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { @Override long /*int*/ gtk_button_release_event (long /*int*/ widget, long /*int*/ event) { + // TODO_GTK4: this method needs to be converted to use GTK4 GdkEvent API + // as all the event structs are sealed now. GdkEventButton gdkEvent = new GdkEventButton (); OS.memmove (gdkEvent, event, GdkEventButton.sizeof); GtkAllocation allocation = new GtkAllocation (); @@ -506,10 +510,9 @@ long /*int*/ gtk_clicked (long /*int*/ widget) { if ((style & SWT.DROP_DOWN) != 0) { long /*int*/ eventPtr = GTK.gtk_get_current_event (); if (eventPtr != 0) { - GdkEvent gdkEvent = new GdkEvent (); - OS.memmove (gdkEvent, eventPtr, GdkEvent.sizeof); + int eventType = GDK.gdk_event_get_event_type(eventPtr); long /*int*/ topHandle = topHandle(); - switch (gdkEvent.type) { + switch (eventType) { case GDK.GDK_KEY_RELEASE: //Fall Through.. case GDK.GDK_BUTTON_PRESS: case GDK.GDK_2BUTTON_PRESS: @@ -537,7 +540,7 @@ long /*int*/ gtk_clicked (long /*int*/ widget) { break; } } - GDK.gdk_event_free (eventPtr); + gdk_event_free (eventPtr); } } if ((style & SWT.RADIO) != 0) { @@ -662,14 +665,16 @@ long /*int*/ gtk_enter_notify_event (long /*int*/ widget, long /*int*/ event) { @Override long /*int*/ gtk_event_after (long /*int*/ widget, long /*int*/ gdkEvent) { - GdkEvent event = new GdkEvent (); - OS.memmove (event, gdkEvent, GdkEvent.sizeof); - switch (event.type) { + int eventType = GDK.gdk_event_get_event_type(gdkEvent); + switch (eventType) { case GDK.GDK_BUTTON_PRESS: { - GdkEventButton gdkEventButton = new GdkEventButton (); - OS.memmove (gdkEventButton, gdkEvent, GdkEventButton.sizeof); - if (gdkEventButton.button == 3) { - parent.showMenu ((int) gdkEventButton.x_root, (int) gdkEventButton.y_root); + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(gdkEvent, eventButton); + if (eventButton[0] == 3) { + double [] eventRX = new double [1]; + double [] eventRY = new double [1]; + GDK.gdk_event_get_root_coords(gdkEvent, eventRX, eventRY); + parent.showMenu ((int) eventRX[0], (int) eventRY[0]); } break; } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tracker.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tracker.java index aa5bad2424..86225614de 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tracker.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tracker.java @@ -894,10 +894,9 @@ private void setTrackerBackground(boolean opaque) { } boolean processEvent (long /*int*/ eventPtr) { - GdkEvent gdkEvent = new GdkEvent(); - OS.memmove (gdkEvent, eventPtr, GdkEvent.sizeof); + int eventType = GDK.gdk_event_get_event_type(eventPtr); long /*int*/ widget = GTK.gtk_get_event_widget (eventPtr); - switch (gdkEvent.type) { + switch (eventType) { case GDK.GDK_MOTION_NOTIFY: gtk_motion_notify_event (widget, eventPtr); break; case GDK.GDK_BUTTON_RELEASE: gtk_button_release_event (widget, eventPtr); break; case GDK.GDK_KEY_PRESS: gtk_key_press_event (widget, eventPtr); break; 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 38f6f6ac1f..0e49decdae 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 @@ -261,7 +261,7 @@ long /*int*/ gtk_activate (long /*int*/ widget) { int currEventType = 0; if (currEvent != 0) { currEventType = GDK.GDK_EVENT_TYPE (currEvent); - GDK.gdk_event_free (currEvent); + gdk_event_free(currEvent); } GDK.gdk_event_free (nextEvent); if (currEventType == GDK.GDK_BUTTON_PRESS && nextEventType == GDK.GDK_2BUTTON_PRESS) { @@ -272,15 +272,16 @@ long /*int*/ gtk_activate (long /*int*/ widget) { } @Override -long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ eventPtr) { - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, eventPtr, GdkEventButton.sizeof); - if (gdkEvent.type == GDK.GDK_3BUTTON_PRESS) return 0; - if (gdkEvent.button == 3 && gdkEvent.type == GDK.GDK_BUTTON_PRESS) { +long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { + int eventType = GDK.gdk_event_get_event_type(event); + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(event, eventButton); + if (eventType == GDK.GDK_3BUTTON_PRESS) return 0; + if (eventButton[0] == 3 && eventType == GDK.GDK_BUTTON_PRESS) { sendEvent (SWT.MenuDetect); return 0; } - if (gdkEvent.type == GDK.GDK_2BUTTON_PRESS) { + if (eventType == GDK.GDK_2BUTTON_PRESS) { sendSelectionEvent (SWT.DefaultSelection); } else { sendSelectionEvent (SWT.Selection); 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 dc3483db2a..8c5ecbe69c 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 @@ -2050,9 +2050,23 @@ TreeItem _getCachedTopItem() { @Override long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, event, GdkEventButton.sizeof); - if (gdkEvent.window != GTK.gtk_tree_view_get_bin_window (handle)) return 0; + double [] eventX = new double [1]; + double [] eventY = new double [1]; + GDK.gdk_event_get_coords(event, eventX, eventY); + int eventType = GDK.gdk_event_get_event_type(event); + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(event, eventButton); + double [] eventRX = new double [1]; + double [] eventRY = new double [1]; + 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); + if (GTK.GTK4) { + if (eventGdkResource != gtk_widget_get_surface (handle)) return 0; + } else { + if (eventGdkResource != GTK.gtk_tree_view_get_bin_window (handle)) return 0; + } long /*int*/ result = super.gtk_button_press_event (widget, event); if (result != 0) return result; /* @@ -2062,19 +2076,19 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { * selected, we can give the DnD handling to MOTION-NOTIFY. Seee Bug 503431 */ if ((state & DRAG_DETECT) != 0 && hooks (SWT.DragDetect) && - !OS.isX11() && gdkEvent.type == GDK.GDK_BUTTON_PRESS) { // Wayland + !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 (); if (nextEvent == 0) { long /*int*/ [] path = new long /*int*/ [1]; long /*int*/ selection = GTK.gtk_tree_view_get_selection (handle); - if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)gdkEvent.x, (int)gdkEvent.y, path, null, null, null) && + if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)eventX[0], (int)eventY[0], path, null, null, null) && path[0] != 0) { // selection count is used in the case of clicking an already selected item while holding Control selectionCountOnPress = getSelectionCount(); if (GTK.gtk_tree_selection_path_is_selected (selection, path[0])) { - if (((gdkEvent.state & (GDK.GDK_CONTROL_MASK|GDK.GDK_SHIFT_MASK)) == 0) || - ((gdkEvent.state & GDK.GDK_CONTROL_MASK) != 0)) { + if (((eventState[0] & (GDK.GDK_CONTROL_MASK|GDK.GDK_SHIFT_MASK)) == 0) || + ((eventState[0] & GDK.GDK_CONTROL_MASK) != 0)) { /** * Disable selection on a mouse click if there are multiple items already selected. Also, * if control is currently being held down, we will designate the selection logic over to release @@ -2099,10 +2113,10 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { * an unwanted selection event. The workaround is to detect that case and not * run the default handler when the item is already part of the current selection. */ - int button = gdkEvent.button; - if (button == 3 && gdkEvent.type == GDK.GDK_BUTTON_PRESS) { + int button = eventButton[0]; + if (button == 3 && eventType == GDK.GDK_BUTTON_PRESS) { long /*int*/ [] path = new long /*int*/ [1]; - if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)gdkEvent.x, (int)gdkEvent.y, path, null, null, null)) { + if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)eventX[0], (int)eventY[0], path, null, null, null)) { if (path [0] != 0) { long /*int*/ selection = GTK.gtk_tree_view_get_selection (handle); if (GTK.gtk_tree_selection_path_is_selected (selection, path [0])) result = 1; @@ -2120,7 +2134,7 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { */ if ((style & SWT.SINGLE) != 0 && getSelectionCount () == 0) { long /*int*/ [] path = new long /*int*/ [1]; - if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)gdkEvent.x, (int)gdkEvent.y, path, null, null, null)) { + if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)eventX[0], (int)eventY[0], path, null, null, null)) { if (path [0] != 0) { long /*int*/ selection = GTK.gtk_tree_view_get_selection (handle); OS.g_signal_handlers_block_matched (selection, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CHANGED); @@ -2138,7 +2152,7 @@ long /*int*/ gtk_button_press_event (long /*int*/ widget, long /*int*/ event) { * that 'row-activated' signal comes before double-click event. This prevents * opening of the current highlighted item when double clicking on any expander arrow. */ - if (gdkEvent.type == GDK.GDK_2BUTTON_PRESS && rowActivated) { + if (eventType == GDK.GDK_2BUTTON_PRESS && rowActivated) { sendTreeDefaultSelection (); rowActivated = false; } @@ -2202,13 +2216,26 @@ void sendTreeDefaultSelection() { @Override long /*int*/ gtk_button_release_event (long /*int*/ widget, long /*int*/ event) { - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, event, GdkEventButton.sizeof); + double [] eventX = new double [1]; + double [] eventY = new double [1]; + GDK.gdk_event_get_coords(event, eventX, eventY); + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(event, eventButton); + double [] eventRX = new double [1]; + double [] eventRY = new double [1]; + 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); + if (GTK.GTK4) { + if (eventGdkResource != gtk_widget_get_surface (handle)) return 0; + } else { + if (eventGdkResource != GTK.gtk_tree_view_get_bin_window (handle)) return 0; + } // Check region since super.gtk_button_release_event() isn't called - lastInput.x = (int) gdkEvent.x; - lastInput.y = (int) gdkEvent.y; + lastInput.x = (int) eventX[0]; + lastInput.y = (int) eventY[0]; if (containedInRegion(lastInput.x, lastInput.y)) return 0; - if (gdkEvent.window != GTK.gtk_tree_view_get_bin_window (handle)) return 0; /* * Feature in GTK. In multi-select tree view there is a problem with using DnD operations while also selecting multiple items. * When doing a DnD, GTK de-selects all other items except for the widget being dragged from. By disabling the selection function @@ -2221,15 +2248,15 @@ long /*int*/ gtk_button_release_event (long /*int*/ widget, long /*int*/ event) long /*int*/ selection = GTK.gtk_tree_view_get_selection (handle); // free up the selection function on release. GTK.gtk_tree_selection_set_select_function(selection,0,0,0); - if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)gdkEvent.x, (int)gdkEvent.y, path, null, null, null) && + if (GTK.gtk_tree_view_get_path_at_pos (handle, (int)eventX[0], (int)eventY[0], path, null, null, null) && path[0] != 0 && GTK.gtk_tree_selection_path_is_selected (selection, path[0])) { selectionCountOnRelease = getSelectionCount(); - if ((gdkEvent.state & (GDK.GDK_CONTROL_MASK|GDK.GDK_SHIFT_MASK)) == 0) { + if ((eventState[0] & (GDK.GDK_CONTROL_MASK|GDK.GDK_SHIFT_MASK)) == 0) { GTK.gtk_tree_view_set_cursor(handle, path[0], 0, false); } // Check to see if there has been a new tree item selected when holding Control in Path. // If not, deselect the item. - if ((gdkEvent.state & GDK.GDK_CONTROL_MASK) != 0 && selectionCountOnRelease == selectionCountOnPress) { + if ((eventState[0] & GDK.GDK_CONTROL_MASK) != 0 && selectionCountOnRelease == selectionCountOnPress) { GTK.gtk_tree_selection_unselect_path (selection,path[0]); } } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeColumn.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeColumn.java index c1fb6879fa..3f82e32523 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeColumn.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeColumn.java @@ -351,21 +351,22 @@ long /*int*/ gtk_clicked (long /*int*/ widget) { boolean postEvent = true; long /*int*/ eventPtr = GTK.gtk_get_current_event (); if (eventPtr != 0) { - GdkEventButton gdkEvent = new GdkEventButton (); - OS.memmove (gdkEvent, eventPtr, GdkEventButton.sizeof); - GDK.gdk_event_free (eventPtr); - switch (gdkEvent.type) { + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(eventPtr, eventButton); + int eventType = GDK.gdk_event_get_event_type(eventPtr); + int eventTime = GDK.gdk_event_get_time(eventPtr); + switch (eventType) { case GDK.GDK_BUTTON_RELEASE: { int clickTime = display.getDoubleClickTime (); - int eventTime = gdkEvent.time, eventButton = gdkEvent.button; - if (lastButton == eventButton && lastTime != 0 && Math.abs (lastTime - eventTime) <= clickTime) { + if (lastButton == eventButton[0] && lastTime != 0 && Math.abs (lastTime - eventTime) <= clickTime) { doubleClick = true; } lastTime = eventTime == 0 ? 1: eventTime; - lastButton = eventButton; + lastButton = eventButton[0]; break; } } + gdk_event_free (eventPtr); } if (postEvent) sendSelectionEvent (doubleClick ? SWT.DefaultSelection : SWT.Selection); return 0; @@ -373,14 +374,16 @@ long /*int*/ gtk_clicked (long /*int*/ widget) { @Override long /*int*/ gtk_event_after (long /*int*/ widget, long /*int*/ gdkEvent) { - GdkEvent event = new GdkEvent (); - OS.memmove (event, gdkEvent, GdkEvent.sizeof); - switch (event.type) { + int eventType = GDK.gdk_event_get_event_type(gdkEvent); + switch (eventType) { case GDK.GDK_BUTTON_PRESS: { - GdkEventButton gdkEventButton = new GdkEventButton (); - OS.memmove (gdkEventButton, gdkEvent, GdkEventButton.sizeof); - if (gdkEventButton.button == 3) { - parent.showMenu ((int) gdkEventButton.x_root, (int) gdkEventButton.y_root); + int [] eventButton = new int [1]; + GDK.gdk_event_get_button(gdkEvent, eventButton); + double [] eventRX = new double [1]; + double [] eventRY = new double [1]; + GDK.gdk_event_get_root_coords(gdkEvent, eventRX, eventRY); + if (eventButton[0] == 3) { + parent.showMenu ((int) eventRX[0], (int) eventRY[0]); } break; } 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 535fdaf9b1..16c7246922 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 @@ -1498,7 +1498,7 @@ char [] sendIMKeyEvent (int type, GdkEventKey keyEvent, char [] chars) { * the key by returning null. */ if (isDisposed ()) { - if (ptr != 0) GDK.gdk_event_free (ptr); + if (ptr != 0) gdk_event_free (ptr); return null; } if (event.doit) chars [count++] = chars [index]; @@ -1525,9 +1525,8 @@ void sendSelectionEvent (int eventType, Event event, boolean send) { if (event == null) event = new Event (); long /*int*/ ptr = GTK.gtk_get_current_event (); if (ptr != 0) { - GdkEvent gdkEvent = new GdkEvent (); - OS.memmove (gdkEvent, ptr, GdkEvent.sizeof); - switch (gdkEvent.type) { + int currentEventType = GDK.gdk_event_get_event_type(ptr); + switch (currentEventType) { case GDK.GDK_KEY_PRESS: case GDK.GDK_KEY_RELEASE: case GDK.GDK_BUTTON_PRESS: @@ -1539,7 +1538,7 @@ void sendSelectionEvent (int eventType, Event event, boolean send) { break; } } - GDK.gdk_event_free (ptr); + gdk_event_free (ptr); } sendEvent (eventType, event, send); } @@ -1864,6 +1863,19 @@ void gdk_surface_get_size (long /*int*/ surface, int[] width, int[] height) { height[0] = GDK.gdk_surface_get_height (surface); } +/** + * GTK4 does not hand out copies of events anymore, only references. + * Call gdk_event_free() on GTK3 and g_object_unref() on GTK4. + * + * @param event the event to be freed + */ +void gdk_event_free (long /*int*/ event) { + if (GTK.GTK4) { + OS.g_object_unref(event); + } else { + GDK.gdk_event_free(event); + } +} /** * Wrapper function for gdk_event_get_state() |