diff options
author | Eric Williams | 2018-11-26 20:50:46 +0000 |
---|---|---|
committer | Eric Williams | 2018-12-11 19:18:42 +0000 |
commit | cdd59fc81ef10b80938fb427fbc78836e5da3251 (patch) | |
tree | 2b00ee7086a0d2d2789230f640d0211a1103764c | |
parent | 285c866c3270b67bc5c6c408538cb861a7476c15 (diff) | |
download | eclipse.platform.swt-cdd59fc81ef10b80938fb427fbc78836e5da3251.tar.gz eclipse.platform.swt-cdd59fc81ef10b80938fb427fbc78836e5da3251.tar.xz eclipse.platform.swt-cdd59fc81ef10b80938fb427fbc78836e5da3251.zip |
Bug 540841: [GTK4] Rename GdkWindow to GdkSurface
Rename GdkWindow to GdkSurface, part 2 (4.11).
Change-Id: I7bcb17d4c88b9f22cf75fc2faa4f0de7a6129386
Signed-off-by: Eric Williams <ericwill@redhat.com>
28 files changed, 956 insertions, 344 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Accessibility/gtk/org/eclipse/swt/accessibility/AccessibleObject.java b/bundles/org.eclipse.swt/Eclipse SWT Accessibility/gtk/org/eclipse/swt/accessibility/AccessibleObject.java index f0c77b70e5..71ab8aa02b 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT Accessibility/gtk/org/eclipse/swt/accessibility/AccessibleObject.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Accessibility/gtk/org/eclipse/swt/accessibility/AccessibleObject.java @@ -4626,8 +4626,13 @@ class AccessibleObject { } if (widget == 0) return; long /*int*/ topLevel = GTK.gtk_widget_get_toplevel (widget); - long /*int*/ window = GTK.gtk_widget_get_window (topLevel); - GDK.gdk_window_get_origin (window, x, y); + if (GTK.GTK4) { + long /*int*/ surface = GTK.gtk_widget_get_surface (topLevel); + GDK.gdk_surface_get_origin (surface, x, y); + } else { + long /*int*/ window = GTK.gtk_widget_get_window (topLevel); + GDK.gdk_window_get_origin (window, x, y); + } } static int nextIndexOfChar (String string, String searchChars, int startIndex) { diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/DragSource.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/DragSource.java index 98d7b4f905..7f6eefe262 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/DragSource.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/DragSource.java @@ -353,7 +353,12 @@ void dragEnd(long /*int*/ widget, long /*int*/ context){ * NOTE: We believe that it is never an error to ungrab when * a drag is finished. */ - long /*int*/ display = GDK.gdk_window_get_display(GTK.gtk_widget_get_window(widget)); + long /*int*/ display; + if (GTK.GTK4) { + display = GDK.gdk_surface_get_display(GTK.gtk_widget_get_surface(widget)); + } else { + display = GDK.gdk_window_get_display(GTK.gtk_widget_get_window(widget)); + } long /*int*/ pointer = GDK.gdk_get_pointer(display); long /*int*/ keyboard = GDK.gdk_device_get_associated_device(pointer); if (GTK.GTK_VERSION >= OS.VERSION(3, 20, 0)) { diff --git a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/DropTarget.java b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/DropTarget.java index 816748b5ca..8ec97e05a3 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/DropTarget.java +++ b/bundles/org.eclipse.swt/Eclipse SWT Drag and Drop/gtk/org/eclipse/swt/dnd/DropTarget.java @@ -569,7 +569,14 @@ int getOperationFromKeyState() { int[] state = new int[1]; long /*int*/ root = GDK.gdk_get_default_root_window (); long /*int*/ pointer = GDK.gdk_get_pointer (GDK.gdk_window_get_display (root)); - GDK.gdk_window_get_device_position(root, pointer, null, null, state); + if (GTK.GTK4) { + /* + * TODO: calling gdk_window_get_device_position() here + * uses gdk_get_default_root_window(), which doesn't exist on GTK4. + */ + } else { + GDK.gdk_window_get_device_position(root, pointer, null, null, state); + } boolean ctrl = (state[0] & GDK.GDK_CONTROL_MASK) != 0; boolean shift = (state[0] & GDK.GDK_SHIFT_MASK) != 0; if (ctrl && shift) return DND.DROP_LINK; @@ -769,9 +776,14 @@ boolean setEventData(long /*int*/ context, int x, int y, int time, DNDEvent even targets = OS.g_list_next (targets); } if (dataTypes.length == 0) return false; - long /*int*/ window = GTK.gtk_widget_get_window (control.handle); int [] origin_x = new int[1], origin_y = new int[1]; - GDK.gdk_window_get_origin(window, origin_x, origin_y); + if (GTK.GTK4) { + long /*int*/ surface = GTK.gtk_widget_get_surface (control.handle); + GDK.gdk_surface_get_origin(surface, origin_x, origin_y); + } else { + long /*int*/ window = GTK.gtk_widget_get_window (control.handle); + GDK.gdk_window_get_origin(window, origin_x, origin_y); + } Point coordinates = DPIUtil.autoScaleDown(new Point(origin_x[0] + x, origin_y[0] + y)); event.widget = this; 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 259b232364..6c255b2337 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 @@ -2102,6 +2102,18 @@ fail: } #endif +#ifndef NO__1gdk_1surface_1get_1height +JNIEXPORT jint JNICALL GDK_NATIVE(_1gdk_1surface_1get_1height) + (JNIEnv *env, jclass that, jintLong arg0) +{ + jint rc = 0; + GDK_NATIVE_ENTER(env, that, _1gdk_1surface_1get_1height_FUNC); + rc = (jint)gdk_surface_get_height((GdkSurface *)arg0); + GDK_NATIVE_EXIT(env, that, _1gdk_1surface_1get_1height_FUNC); + return rc; +} +#endif + #ifndef NO__1gdk_1surface_1get_1origin JNIEXPORT jint JNICALL GDK_NATIVE(_1gdk_1surface_1get_1origin) (JNIEnv *env, jclass that, jintLong arg0, jintArray arg1, jintArray arg2) @@ -2121,6 +2133,23 @@ fail: } #endif +#ifndef NO__1gdk_1surface_1get_1root_1origin +JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1surface_1get_1root_1origin) + (JNIEnv *env, jclass that, jintLong arg0, jintArray arg1, jintArray arg2) +{ + jint *lparg1=NULL; + jint *lparg2=NULL; + GDK_NATIVE_ENTER(env, that, _1gdk_1surface_1get_1root_1origin_FUNC); + if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail; + if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail; + gdk_surface_get_root_origin((GdSurface *)arg0, (gint *)lparg1, (gint *)lparg2); +fail: + if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0); + if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0); + GDK_NATIVE_EXIT(env, that, _1gdk_1surface_1get_1root_1origin_FUNC); +} +#endif + #ifndef NO__1gdk_1surface_1get_1user_1data JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1surface_1get_1user_1data) (JNIEnv *env, jclass that, jintLong arg0, jintLongArray arg1) @@ -2135,6 +2164,28 @@ fail: } #endif +#ifndef NO__1gdk_1surface_1get_1width +JNIEXPORT jint JNICALL GDK_NATIVE(_1gdk_1surface_1get_1width) + (JNIEnv *env, jclass that, jintLong arg0) +{ + jint rc = 0; + GDK_NATIVE_ENTER(env, that, _1gdk_1surface_1get_1width_FUNC); + rc = (jint)gdk_surface_get_width((GdkSurface *)arg0); + GDK_NATIVE_EXIT(env, that, _1gdk_1surface_1get_1width_FUNC); + return rc; +} +#endif + +#ifndef NO__1gdk_1surface_1hide +JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1surface_1hide) + (JNIEnv *env, jclass that, jintLong arg0) +{ + GDK_NATIVE_ENTER(env, that, _1gdk_1surface_1hide_FUNC); + gdk_surface_hide((GdkSurface *)arg0); + GDK_NATIVE_EXIT(env, that, _1gdk_1surface_1hide_FUNC); +} +#endif + #ifndef NO__1gdk_1surface_1invalidate_1rect JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1surface_1invalidate_1rect) (JNIEnv *env, jclass that, jintLong arg0, jobject arg1) @@ -2148,6 +2199,16 @@ fail: } #endif +#ifndef NO__1gdk_1surface_1invalidate_1region +JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1surface_1invalidate_1region) + (JNIEnv *env, jclass that, jintLong arg0, jintLong arg1) +{ + GDK_NATIVE_ENTER(env, that, _1gdk_1surface_1invalidate_1region_FUNC); + gdk_surface_invalidate_region((Gdksurface *)arg0, (const cairo_region_t *)arg1); + GDK_NATIVE_EXIT(env, that, _1gdk_1surface_1invalidate_1region_FUNC); +} +#endif + #ifndef NO__1gdk_1surface_1lower JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1surface_1lower) (JNIEnv *env, jclass that, jintLong arg0) @@ -2158,6 +2219,16 @@ JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1surface_1lower) } #endif +#ifndef NO__1gdk_1surface_1move +JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1surface_1move) + (JNIEnv *env, jclass that, jintLong arg0, jint arg1, jint arg2) +{ + GDK_NATIVE_ENTER(env, that, _1gdk_1surface_1move_FUNC); + gdk_surface_move((GdkSurface *)arg0, arg1, arg2); + GDK_NATIVE_EXIT(env, that, _1gdk_1surface_1move_FUNC); +} +#endif + #ifndef NO__1gdk_1surface_1new_1child JNIEXPORT jintLong JNICALL GDK_NATIVE(_1gdk_1surface_1new_1child) (JNIEnv *env, jclass that, jintLong arg0, jobject arg1) @@ -2183,6 +2254,16 @@ JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1surface_1raise) } #endif +#ifndef NO__1gdk_1surface_1resize +JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1surface_1resize) + (JNIEnv *env, jclass that, jintLong arg0, jint arg1, jint arg2) +{ + GDK_NATIVE_ENTER(env, that, _1gdk_1surface_1resize_FUNC); + gdk_surface_resize((GdkSurface *)arg0, arg1, arg2); + GDK_NATIVE_EXIT(env, that, _1gdk_1surface_1resize_FUNC); +} +#endif + #ifndef NO__1gdk_1surface_1restack JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1surface_1restack) (JNIEnv *env, jclass that, jintLong arg0, jintLong arg1, jboolean arg2) @@ -2203,6 +2284,26 @@ JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1surface_1set_1cursor) } #endif +#ifndef NO__1gdk_1surface_1set_1decorations +JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1surface_1set_1decorations) + (JNIEnv *env, jclass that, jintLong arg0, jint arg1) +{ + GDK_NATIVE_ENTER(env, that, _1gdk_1surface_1set_1decorations_FUNC); + gdk_surface_set_decorations((GdkSurface *)arg0, (GdkWMDecoration)arg1); + GDK_NATIVE_EXIT(env, that, _1gdk_1surface_1set_1decorations_FUNC); +} +#endif + +#ifndef NO__1gdk_1surface_1set_1functions +JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1surface_1set_1functions) + (JNIEnv *env, jclass that, jintLong arg0, jint arg1) +{ + GDK_NATIVE_ENTER(env, that, _1gdk_1surface_1set_1functions_FUNC); + gdk_surface_set_functions((GdkSurface *)arg0, (GdkWMFunction)arg1); + GDK_NATIVE_EXIT(env, that, _1gdk_1surface_1set_1functions_FUNC); +} +#endif + #ifndef NO__1gdk_1surface_1set_1user_1data JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1surface_1set_1user_1data) (JNIEnv *env, jclass that, jintLong arg0, jintLong arg1) @@ -2476,23 +2577,6 @@ JNIEXPORT jintLong JNICALL GDK_NATIVE(_1gdk_1window_1get_1parent) } #endif -#ifndef NO__1gdk_1window_1get_1position -JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1window_1get_1position) - (JNIEnv *env, jclass that, jintLong arg0, jintArray arg1, jintArray arg2) -{ - jint *lparg1=NULL; - jint *lparg2=NULL; - GDK_NATIVE_ENTER(env, that, _1gdk_1window_1get_1position_FUNC); - if (arg1) if ((lparg1 = (*env)->GetIntArrayElements(env, arg1, NULL)) == NULL) goto fail; - if (arg2) if ((lparg2 = (*env)->GetIntArrayElements(env, arg2, NULL)) == NULL) goto fail; - gdk_window_get_position((GdkWindow *)arg0, (gint *)lparg1, (gint *)lparg2); -fail: - if (arg2 && lparg2) (*env)->ReleaseIntArrayElements(env, arg2, lparg2, 0); - if (arg1 && lparg1) (*env)->ReleaseIntArrayElements(env, arg1, lparg1, 0); - GDK_NATIVE_EXIT(env, that, _1gdk_1window_1get_1position_FUNC); -} -#endif - #ifndef NO__1gdk_1window_1get_1root_1origin JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1window_1get_1root_1origin) (JNIEnv *env, jclass that, jintLong arg0, jintArray arg1, jintArray arg2) @@ -2593,18 +2677,6 @@ JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1window_1invalidate_1region) } #endif -#ifndef NO__1gdk_1window_1is_1visible -JNIEXPORT jboolean JNICALL GDK_NATIVE(_1gdk_1window_1is_1visible) - (JNIEnv *env, jclass that, jintLong arg0) -{ - jboolean rc = 0; - GDK_NATIVE_ENTER(env, that, _1gdk_1window_1is_1visible_FUNC); - rc = (jboolean)gdk_window_is_visible((GdkWindow *)arg0); - GDK_NATIVE_EXIT(env, that, _1gdk_1window_1is_1visible_FUNC); - return rc; -} -#endif - #ifndef NO__1gdk_1window_1lower JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1window_1lower) (JNIEnv *env, jclass that, jintLong arg0) @@ -2786,16 +2858,6 @@ JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1window_1set_1user_1data) } #endif -#ifndef NO__1gdk_1window_1shape_1combine_1region -JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1window_1shape_1combine_1region) - (JNIEnv *env, jclass that, jintLong arg0, jintLong arg1, jint arg2, jint arg3) -{ - GDK_NATIVE_ENTER(env, that, _1gdk_1window_1shape_1combine_1region_FUNC); - gdk_window_shape_combine_region((GdkWindow *)arg0, (const cairo_region_t *)arg1, (gint)arg2, (gint)arg3); - GDK_NATIVE_EXIT(env, that, _1gdk_1window_1shape_1combine_1region_FUNC); -} -#endif - #ifndef NO__1gdk_1window_1show JNIEXPORT void JNICALL GDK_NATIVE(_1gdk_1window_1show) (JNIEnv *env, jclass that, jintLong arg0) @@ -16657,6 +16719,18 @@ JNIEXPORT jintLong JNICALL OS_NATIVE(_1pango_1cairo_1create_1layout) } #endif +#ifndef NO__1pango_1cairo_1font_1map_1get_1default +JNIEXPORT jintLong JNICALL OS_NATIVE(_1pango_1cairo_1font_1map_1get_1default) + (JNIEnv *env, jclass that) +{ + jintLong rc = 0; + OS_NATIVE_ENTER(env, that, _1pango_1cairo_1font_1map_1get_1default_FUNC); + rc = (jintLong)pango_cairo_font_map_get_default(); + OS_NATIVE_EXIT(env, that, _1pango_1cairo_1font_1map_1get_1default_FUNC); + return rc; +} +#endif + #ifndef NO__1pango_1cairo_1layout_1path JNIEXPORT void JNICALL OS_NATIVE(_1pango_1cairo_1layout_1path) (JNIEnv *env, jclass that, jintLong arg0, jintLong arg1) @@ -17001,6 +17075,18 @@ JNIEXPORT jintLong JNICALL OS_NATIVE(_1pango_1font_1get_1metrics) } #endif +#ifndef NO__1pango_1font_1map_1create_1context +JNIEXPORT jintLong JNICALL OS_NATIVE(_1pango_1font_1map_1create_1context) + (JNIEnv *env, jclass that, jintLong arg0) +{ + jintLong rc = 0; + OS_NATIVE_ENTER(env, that, _1pango_1font_1map_1create_1context_FUNC); + rc = (jintLong)pango_font_map_create_context((PangoFontMap *)arg0); + OS_NATIVE_EXIT(env, that, _1pango_1font_1map_1create_1context_FUNC); + return rc; +} +#endif + #ifndef NO__1pango_1font_1metrics_1get_1approximate_1char_1width JNIEXPORT jint JNICALL OS_NATIVE(_1pango_1font_1metrics_1get_1approximate_1char_1width) (JNIEnv *env, jclass that, jintLong arg0) 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 19ac102cbd..2676362c5c 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 @@ -319,7 +319,6 @@ #define NO__1gdk_1display_1get_1monitor_1at_1window #define NO__1gdk_1get_1default_1root_1window #define NO__1gdk_1property_1get -#define NO__1gdk_1window_1add_1filter #define NO__1gdk_1window_1begin_1draw_1frame #define NO__1gdk_1window_1create_1similar_1surface #define NO__1gdk_1window_1destroy @@ -335,7 +334,6 @@ #define NO__1gdk_1window_1get_1width #define NO__1gdk_1window_1get_1origin #define NO__1gdk_1window_1get_1parent -#define NO__1gdk_1window_1get_1position #define NO__1gdk_1window_1get_1root_1origin #define NO__1gdk_1window_1get_1state #define NO__1gdk_1window_1get_1user_1data @@ -344,7 +342,6 @@ #define NO__1gdk_1window_1hide #define NO__1gdk_1window_1invalidate_1rect #define NO__1gdk_1window_1invalidate_1region -#define NO__1gdk_1window_1is_1visible #define NO__1gdk_1window_1raise #define NO__1gdk_1window_1lower #define NO__1gdk_1window_1move @@ -355,11 +352,9 @@ #define NO__1gdk_1window_1restack #define NO__1gdk_1window_1set_1cursor #define NO__1gdk_1window_1set_1decorations -#define NO__1gdk_1window_1set_1events #define NO__1gdk_1window_1set_1functions #define NO__1gdk_1window_1set_1override_1redirect #define NO__1gdk_1window_1set_1user_1data -#define NO__1gdk_1window_1shape_1combine_1region #define NO__1gdk_1window_1show_1unraised #define NO__1gdk_1device_1get_1window_1at_1position #define NO__1gdk_1window_1set_1background_1pattern @@ -424,6 +419,15 @@ #define NO__1gdk_1surface_1get_1device_1position #define NO__1gdk_1display_1get_1monitor_1at_1surface #define NO__1gdk_1surface_1get_1frame_1extents +#define NO__1gdk_1surface_1get_1width +#define NO__1gdk_1surface_1get_1height +#define NO__1gdk_1surface_1resize +#define NO__1gdk_1surface_1move +#define NO__1gdk_1surface_1hide +#define NO__1gdk_1surface_1set_1decorations +#define NO__1gdk_1surface_1set_1functions +#define NO__1gdk_1surface_1get_1root_1origin +#define NO__1gdk_1surface_1invalidate_1region // Miscellaneous functions not present on GTK3 #define NO__1gdk_1device_1warp__III 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 bfa51e1a99..861bff696b 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 @@ -173,14 +173,23 @@ char * GDK_nativeFunctionNames[] = { "_1gdk_1surface_1get_1device_1position", "_1gdk_1surface_1get_1display", "_1gdk_1surface_1get_1frame_1extents", + "_1gdk_1surface_1get_1height", "_1gdk_1surface_1get_1origin", + "_1gdk_1surface_1get_1root_1origin", "_1gdk_1surface_1get_1user_1data", + "_1gdk_1surface_1get_1width", + "_1gdk_1surface_1hide", "_1gdk_1surface_1invalidate_1rect", + "_1gdk_1surface_1invalidate_1region", "_1gdk_1surface_1lower", + "_1gdk_1surface_1move", "_1gdk_1surface_1new_1child", "_1gdk_1surface_1raise", + "_1gdk_1surface_1resize", "_1gdk_1surface_1restack", "_1gdk_1surface_1set_1cursor", + "_1gdk_1surface_1set_1decorations", + "_1gdk_1surface_1set_1functions", "_1gdk_1surface_1set_1user_1data", "_1gdk_1surface_1show", "_1gdk_1surface_1show_1unraised", @@ -201,7 +210,6 @@ char * GDK_nativeFunctionNames[] = { "_1gdk_1window_1get_1height", "_1gdk_1window_1get_1origin", "_1gdk_1window_1get_1parent", - "_1gdk_1window_1get_1position", "_1gdk_1window_1get_1root_1origin", "_1gdk_1window_1get_1state", "_1gdk_1window_1get_1user_1data", @@ -210,7 +218,6 @@ char * GDK_nativeFunctionNames[] = { "_1gdk_1window_1hide", "_1gdk_1window_1invalidate_1rect", "_1gdk_1window_1invalidate_1region", - "_1gdk_1window_1is_1visible", "_1gdk_1window_1lower", "_1gdk_1window_1move", "_1gdk_1window_1move_1resize", @@ -227,7 +234,6 @@ char * GDK_nativeFunctionNames[] = { "_1gdk_1window_1set_1functions", "_1gdk_1window_1set_1override_1redirect", "_1gdk_1window_1set_1user_1data", - "_1gdk_1window_1shape_1combine_1region", "_1gdk_1window_1show", "_1gdk_1window_1show_1unraised", "_1gdk_1x11_1display_1error_1trap_1pop_1ignored", @@ -1540,6 +1546,7 @@ char * OS_nativeFunctionNames[] = { "_1pango_1cairo_1context_1get_1font_1options", "_1pango_1cairo_1context_1set_1font_1options", "_1pango_1cairo_1create_1layout", + "_1pango_1cairo_1font_1map_1get_1default", "_1pango_1cairo_1layout_1path", "_1pango_1cairo_1show_1layout", "_1pango_1context_1get_1base_1dir", @@ -1569,6 +1576,7 @@ char * OS_nativeFunctionNames[] = { "_1pango_1font_1family_1get_1name", "_1pango_1font_1family_1list_1faces", "_1pango_1font_1get_1metrics", + "_1pango_1font_1map_1create_1context", "_1pango_1font_1metrics_1get_1approximate_1char_1width", "_1pango_1font_1metrics_1get_1ascent", "_1pango_1font_1metrics_1get_1descent", 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 ab820ffef4..c83011da67 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 @@ -183,14 +183,23 @@ typedef enum { _1gdk_1surface_1get_1device_1position_FUNC, _1gdk_1surface_1get_1display_FUNC, _1gdk_1surface_1get_1frame_1extents_FUNC, + _1gdk_1surface_1get_1height_FUNC, _1gdk_1surface_1get_1origin_FUNC, + _1gdk_1surface_1get_1root_1origin_FUNC, _1gdk_1surface_1get_1user_1data_FUNC, + _1gdk_1surface_1get_1width_FUNC, + _1gdk_1surface_1hide_FUNC, _1gdk_1surface_1invalidate_1rect_FUNC, + _1gdk_1surface_1invalidate_1region_FUNC, _1gdk_1surface_1lower_FUNC, + _1gdk_1surface_1move_FUNC, _1gdk_1surface_1new_1child_FUNC, _1gdk_1surface_1raise_FUNC, + _1gdk_1surface_1resize_FUNC, _1gdk_1surface_1restack_FUNC, _1gdk_1surface_1set_1cursor_FUNC, + _1gdk_1surface_1set_1decorations_FUNC, + _1gdk_1surface_1set_1functions_FUNC, _1gdk_1surface_1set_1user_1data_FUNC, _1gdk_1surface_1show_FUNC, _1gdk_1surface_1show_1unraised_FUNC, @@ -211,7 +220,6 @@ typedef enum { _1gdk_1window_1get_1height_FUNC, _1gdk_1window_1get_1origin_FUNC, _1gdk_1window_1get_1parent_FUNC, - _1gdk_1window_1get_1position_FUNC, _1gdk_1window_1get_1root_1origin_FUNC, _1gdk_1window_1get_1state_FUNC, _1gdk_1window_1get_1user_1data_FUNC, @@ -220,7 +228,6 @@ typedef enum { _1gdk_1window_1hide_FUNC, _1gdk_1window_1invalidate_1rect_FUNC, _1gdk_1window_1invalidate_1region_FUNC, - _1gdk_1window_1is_1visible_FUNC, _1gdk_1window_1lower_FUNC, _1gdk_1window_1move_FUNC, _1gdk_1window_1move_1resize_FUNC, @@ -237,7 +244,6 @@ typedef enum { _1gdk_1window_1set_1functions_FUNC, _1gdk_1window_1set_1override_1redirect_FUNC, _1gdk_1window_1set_1user_1data_FUNC, - _1gdk_1window_1shape_1combine_1region_FUNC, _1gdk_1window_1show_FUNC, _1gdk_1window_1show_1unraised_FUNC, _1gdk_1x11_1display_1error_1trap_1pop_1ignored_FUNC, @@ -1526,6 +1532,7 @@ typedef enum { _1pango_1cairo_1context_1get_1font_1options_FUNC, _1pango_1cairo_1context_1set_1font_1options_FUNC, _1pango_1cairo_1create_1layout_FUNC, + _1pango_1cairo_1font_1map_1get_1default_FUNC, _1pango_1cairo_1layout_1path_FUNC, _1pango_1cairo_1show_1layout_FUNC, _1pango_1context_1get_1base_1dir_FUNC, @@ -1555,6 +1562,7 @@ typedef enum { _1pango_1font_1family_1get_1name_FUNC, _1pango_1font_1family_1list_1faces_FUNC, _1pango_1font_1get_1metrics_FUNC, + _1pango_1font_1map_1create_1context_FUNC, _1pango_1font_1metrics_1get_1approximate_1char_1width_FUNC, _1pango_1font_1metrics_1get_1ascent_FUNC, _1pango_1font_1metrics_1get_1descent_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 a384d5ead8..9037953907 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 @@ -564,6 +564,19 @@ public class GDK extends OS { } } /** + * @param surface cast=(GdkSurface *) + */ + public static final native int _gdk_surface_get_width(long /*int*/ surface); + /** [GTK4 only, if-def'd in os.h] */ + public static final int gdk_surface_get_width(long /*int*/ surface) { + lock.lock(); + try { + return _gdk_surface_get_width(surface); + } finally { + lock.unlock(); + } + } + /** * @param window cast=(GdkWindow *) */ public static final native long /*int*/ _gdk_window_get_visible_region(long /*int*/ window); @@ -590,6 +603,19 @@ public class GDK extends OS { } } /** + * @param surface cast=(GdkSurface *) + */ + public static final native int _gdk_surface_get_height(long /*int*/ surface); + /** [GTK4 only, if-def'd in os.h] */ + public static final int gdk_surface_get_height(long /*int*/ surface) { + lock.lock(); + try { + return _gdk_surface_get_height(surface); + } finally { + lock.unlock(); + } + } + /** * @param cairo cast=(cairo_t *) * @param pixbuf cast=(const GdkPixbuf *) * @param pixbuf_x cast=(gdouble) @@ -2218,27 +2244,27 @@ public class GDK extends OS { * @param x cast=(gint *) * @param y cast=(gint *) */ - public static final native void _gdk_window_get_position(long /*int*/ window, int[] x, int[] y); + public static final native void _gdk_window_get_root_origin(long /*int*/ window, int[] x, int[] y); /** [GTK3 only, if-def'd in os.h] */ - public static final void gdk_window_get_position(long /*int*/ window, int[] x, int[] y) { + public static final void gdk_window_get_root_origin(long /*int*/ window, int[] x, int[] y) { lock.lock(); try { - _gdk_window_get_position(window, x, y); + _gdk_window_get_root_origin(window, x, y); } finally { lock.unlock(); } } /** - * @param window cast=(GdkWindow *) + * @param surface cast=(GdSurface *) * @param x cast=(gint *) * @param y cast=(gint *) */ - public static final native void _gdk_window_get_root_origin(long /*int*/ window, int[] x, int[] y); - /** [GTK3 only, if-def'd in os.h] */ - public static final void gdk_window_get_root_origin(long /*int*/ window, int[] x, int[] y) { + public static final native void _gdk_surface_get_root_origin(long /*int*/ surface, int[] x, int[] y); + /** [GTK4 only, if-def'd in os.h] */ + public static final void gdk_surface_get_root_origin(long /*int*/ surface, int[] x, int[] y) { lock.lock(); try { - _gdk_window_get_root_origin(window, x, y); + _gdk_surface_get_root_origin(surface, x, y); } finally { lock.unlock(); } @@ -2282,6 +2308,17 @@ public class GDK extends OS { lock.unlock(); } } + /** @param surface cast=(GdkSurface *) */ + public static final native void _gdk_surface_hide(long /*int*/ surface); + /** [GTK4 only, if-def'd in os.h] */ + public static final void gdk_surface_hide(long /*int*/ surface) { + lock.lock(); + try { + _gdk_surface_hide(surface); + } finally { + lock.unlock(); + } + } /** * @param window cast=(GdkWindow *) * @param rectangle cast=(GdkRectangle *),flags=no_out @@ -2326,13 +2363,16 @@ public class GDK extends OS { lock.unlock(); } } - /** @param window cast=(GdkWindow *) */ - public static final native boolean _gdk_window_is_visible(long /*int*/ window); - /** [GTK3 only, if-def'd in os.h] */ - public static final boolean gdk_window_is_visible(long /*int*/ window) { + /** + * @param surface cast=(Gdksurface *) + * @param region cast=(const cairo_region_t *) + */ + public static final native void _gdk_surface_invalidate_region(long /*int*/ surface, long /*int*/ region); + /** [GTK4 only, if-def'd in os.h] */ + public static final void gdk_surface_invalidate_region(long /*int*/ surface, long /*int*/ region) { lock.lock(); try { - return _gdk_window_is_visible(window); + _gdk_surface_invalidate_region(surface, region); } finally { lock.unlock(); } @@ -2348,6 +2388,17 @@ public class GDK extends OS { lock.unlock(); } } + /** @param surface cast=(GdkSurface *) */ + public static final native void _gdk_surface_move(long /*int*/ surface, int x, int y); + /** [GTK4 only, if-def'd in os.h] */ + public static final void gdk_surface_move(long /*int*/ surface, int x, int y) { + lock.lock(); + try { + _gdk_surface_move(surface, x, y); + } finally { + lock.unlock(); + } + } /** @param window cast=(GdkWindow *) */ public static final native void _gdk_window_move_resize(long /*int*/ window, int x, int y, int width, int height); /** [GTK3 only, if-def'd in os.h] */ @@ -2470,6 +2521,17 @@ public class GDK extends OS { lock.unlock(); } } + /** @param surface cast=(GdkSurface *) */ + public static final native void _gdk_surface_resize(long /*int*/ surface, int width, int height); + /** [GTK4 only, if-def'd in os.h] */ + public static final void gdk_surface_resize(long /*int*/ surface, int width, int height) { + lock.lock(); + try { + _gdk_surface_resize(surface, width, height); + } finally { + lock.unlock(); + } + } /** * @param window cast=(GdkWindow *) * @param sibling cast=(GdkWindow *) @@ -2557,6 +2619,20 @@ public class GDK extends OS { } } /** + * @param surface cast=(GdkSurface *) + * @param decorations cast=(GdkWMDecoration) + */ + public static final native void _gdk_surface_set_decorations(long /*int*/ surface, int decorations); + /** [GTK4 only, if-def'd in os.h] */ + public static final void gdk_surface_set_decorations(long /*int*/ surface, int decorations) { + lock.lock(); + try { + _gdk_surface_set_decorations(surface, decorations); + } finally { + lock.unlock(); + } + } + /** * @param window cast=(GdkWindow *) * @param functions cast=(GdkWMFunction) */ @@ -2570,6 +2646,20 @@ public class GDK extends OS { lock.unlock(); } } + /** + * @param surface cast=(GdkSurface *) + * @param functions cast=(GdkWMFunction) + */ + public static final native void _gdk_surface_set_functions(long /*int*/ surface, int functions); + /** [GTK4 only, if-def'd in os.h] */ + public static final void gdk_surface_set_functions(long /*int*/ surface, int functions) { + lock.lock(); + try { + _gdk_surface_set_functions(surface, functions); + } finally { + lock.unlock(); + } + } /** @param window cast=(GdkWindow *) */ public static final native void _gdk_window_set_events(long /*int*/ window, int event_mask); /** [GTK3 only, if-def'd in os.h] */ @@ -2623,22 +2713,6 @@ public class GDK extends OS { lock.unlock(); } } - /** - * @param window cast=(GdkWindow *) - * @param shape_region cast=(const cairo_region_t *) - * @param offset_x cast=(gint) - * @param offset_y cast=(gint) - */ - public static final native void _gdk_window_shape_combine_region (long /*int*/ window, long /*int*/ shape_region, int offset_x, int offset_y); - /** [GTK3 only, if-def'd in os.h] */ - public static final void gdk_window_shape_combine_region (long /*int*/ window, long /*int*/ shape_region, int offset_x, int offset_y) { - lock.lock(); - try { - _gdk_window_shape_combine_region(window, shape_region, offset_x, offset_y); - } finally { - lock.unlock(); - } - } /** @param window cast=(GdkWindow *) */ public static final native void _gdk_window_show(long /*int*/ window); /** [GTK3 only, if-def'd in os.h] */ diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GTK.java b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GTK.java index a711204484..1d866c5f0f 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GTK.java +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/GTK.java @@ -1690,7 +1690,7 @@ public class GTK extends OS { * @param target_list cast=(GtkTargetList *) */ public static final native long /*int*/ _gtk_drag_dest_find_target(long /*int*/ widget, long /*int*/ context, long /*int*/ target_list); - /** [GTK3/GTK4: TODO_ericwill both have identical signatures but accept differing parameters at the native level] */ + /** [GTK3/GTK4: both have identical signatures but accept differing parameters at the native level] */ public static final long /*int*/ gtk_drag_dest_find_target(long /*int*/ widget, long /*int*/ context, long /*int*/ target_list) { lock.lock(); try { 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 0de4db4ace..2beb91700a 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 @@ -3244,6 +3244,15 @@ public static final long /*int*/ pango_cairo_create_layout(long /*int*/ cairo) { lock.unlock(); } } +public static final native long /*int*/ _pango_cairo_font_map_get_default(); +public static final long /*int*/ pango_cairo_font_map_get_default() { + lock.lock(); + try { + return _pango_cairo_font_map_get_default(); + } finally { + lock.unlock(); + } +} /** * @param context cast=(PangoContext *) */ @@ -3600,6 +3609,18 @@ public static final long /*int*/ pango_font_get_metrics(long /*int*/ font, long lock.unlock(); } } +/** + * @param fontMap cast=(PangoFontMap *) + */ +public static final native long /*int*/ _pango_font_map_create_context(long /*int*/ fontMap); +public static final long /*int*/ pango_font_map_create_context(long /*int*/ fontMap) { + lock.lock(); + try { + return _pango_font_map_create_context(fontMap); + } finally { + lock.unlock(); + } +} /** @param metrics cast=(PangoFontMetrics *) */ public static final native int _pango_font_metrics_get_approximate_char_width(long /*int*/ metrics); public static final int pango_font_metrics_get_approximate_char_width(long /*int*/ metrics) { diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Device.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Device.java index a71d1eb3ca..42920e0b03 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Device.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Device.java @@ -424,7 +424,13 @@ public FontData[] getFontList (String faceName, boolean scalable) { int[] n_families = new int[1]; long /*int*/[] faces = new long /*int*/[1]; int[] n_faces = new int[1]; - long /*int*/ context = GDK.gdk_pango_context_get(); + long /*int*/ context; + if (GTK.GTK4) { + long /*int*/ fontMap = OS.pango_cairo_font_map_get_default (); + context = OS.pango_font_map_create_context (fontMap); + } else { + context = GDK.gdk_pango_context_get(); + } OS.pango_context_list_families(context, families, n_families); int nFds = 0; FontData[] fds = new FontData[faceName != null ? 4 : n_families[0]]; diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GC.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GC.java index 1c300e6431..76b912103d 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GC.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GC.java @@ -562,7 +562,11 @@ void copyAreaInPixels(int srcX, int srcY, int width, int height, int destX, int long /*int*/ invalidateRegion = Cairo.cairo_region_create_rectangle (srcRect); Cairo.cairo_region_subtract (invalidateRegion, visibleRegion); Cairo.cairo_region_translate (invalidateRegion, deltaX, deltaY); - GDK.gdk_window_invalidate_region(drawable, invalidateRegion, false); + if (GTK.GTK4) { + GDK.gdk_surface_invalidate_region(drawable, invalidateRegion); + } else { + GDK.gdk_window_invalidate_region(drawable, invalidateRegion, false); + } Cairo.cairo_region_destroy (visibleRegion); Cairo.cairo_region_destroy (copyRegion); Cairo.cairo_region_destroy (invalidateRegion); @@ -604,7 +608,13 @@ void copyAreaInPixels(int srcX, int srcY, int width, int height, int destX, int } void createLayout() { - long /*int*/ context = GDK.gdk_pango_context_get(); + long /*int*/ context; + if (GTK.GTK4) { + long /*int*/ fontMap = OS.pango_cairo_font_map_get_default (); + context = OS.pango_font_map_create_context (fontMap); + } else { + context = GDK.gdk_pango_context_get(); + } if (context == 0) SWT.error(SWT.ERROR_NO_HANDLES); data.context = context; long /*int*/ layout = OS.pango_layout_new(context); @@ -2410,8 +2420,13 @@ void getSize(int[] width, int[] height) { return; } if (data.drawable != 0) { - width[0] = GDK.gdk_window_get_width(data.drawable); - height[0] = GDK.gdk_window_get_height(data.drawable); + if (GTK.GTK4) { + width[0] = GDK.gdk_surface_get_width(data.drawable); + height[0] = GDK.gdk_surface_get_height(data.drawable); + } else { + width[0] = GDK.gdk_window_get_width(data.drawable); + height[0] = GDK.gdk_window_get_height(data.drawable); + } return; } long /*int*/ surface = Cairo.cairo_get_target(handle); @@ -2601,7 +2616,12 @@ void initCairo() { long /*int*/ cairo = data.cairo; if (cairo != 0) return; if (GTK.GTK_VERSION >= OS.VERSION(3, 22, 0)) { - long /*int*/ surface = GDK.gdk_window_create_similar_surface(data.drawable, Cairo.CAIRO_CONTENT_COLOR_ALPHA, data.width, data.height); + long /*int*/ surface; + if (GTK.GTK4) { + surface = GDK.gdk_surface_create_similar_surface(data.drawable, Cairo.CAIRO_CONTENT_COLOR_ALPHA, data.width, data.height); + } else { + surface = GDK.gdk_window_create_similar_surface(data.drawable, Cairo.CAIRO_CONTENT_COLOR_ALPHA, data.width, data.height); + } data.cairo = cairo = Cairo.cairo_create(surface); } else { data.cairo = cairo = GDK.gdk_cairo_create(data.drawable); diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GCData.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GCData.java index ba044ea83c..157003f43f 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GCData.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/GCData.java @@ -60,7 +60,9 @@ public final class GCData { public int interpolation = SWT.DEFAULT; public Image image; - public long /*int*/ clipRgn, context, layout, damageRgn, drawable, cairo, regionSet; + public long /*int*/ clipRgn, context, layout, damageRgn, cairo, regionSet; + /** Usually a GdkWindow on GTK3, or a GdkSurface on GTK4 */ + public long /*int*/ drawable; public double cairoXoffset, cairoYoffset; public boolean disposeCairo; public double[] identity, clippingTransform; diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/TextLayout.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/TextLayout.java index 3f42472bee..d3bca490c7 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/TextLayout.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/TextLayout.java @@ -82,7 +82,12 @@ public final class TextLayout extends Resource { public TextLayout (Device device) { super(device); device = this.device; - context = GDK.gdk_pango_context_get(); + if (GTK.GTK4) { + long /*int*/ fontMap = OS.pango_cairo_font_map_get_default (); + context = OS.pango_font_map_create_context (fontMap); + } else { + context = GDK.gdk_pango_context_get(); + } if (context == 0) SWT.error(SWT.ERROR_NO_HANDLES); OS.pango_context_set_language(context, GTK.gtk_get_default_language()); OS.pango_context_set_base_dir(context, OS.PANGO_DIRECTION_LTR); 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 64bd9228a6..71c2163023 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 @@ -568,11 +568,11 @@ void fixChildren (Shell newShell, Shell oldShell, Decorations newDecorations, De } @Override -void fixParentGdkWindow() { +void fixParentGdkResource() { // Changes to this method should be verified via // org.eclipse.swt.tests.gtk/*/Bug510803_TabFolder_TreeEditor_Regression.java (part two) for (Control child : _getChildren()) { - child.fixParentGdkWindow(); + child.fixParentGdkResource(); } } @@ -1299,8 +1299,14 @@ void moveChildren(int oldWidth) { if (oldWidth > 0) x = oldWidth - controlWidth - x; int clientWidth = getClientWidth (); x = clientWidth - controlWidth - x; - if (child.enableWindow != 0) { - GDK.gdk_window_move (child.enableWindow, x, y); + if (GTK.GTK4) { + if (child.enableSurface != 0) { + GDK.gdk_surface_move (child.enableSurface, x, y); + } + } else { + if (child.enableWindow != 0) { + GDK.gdk_window_move (child.enableWindow, x, y); + } } child.moveHandle (x, y); /* 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 452267192e..8e2b8049d5 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 @@ -463,7 +463,15 @@ boolean hooksPaint () { @Override long /*int*/ hoverProc (long /*int*/ widget) { int [] x = new int [1], y = new int [1], mask = new int [1]; - gdk_window_get_device_position (0, x, y, mask); + if (GTK.GTK4) { + /* + * TODO: calling gdk_window_get_device_position() with a 0 + * for the GdkWindow uses gdk_get_default_root_window(), + * which doesn't exist on GTK4. + */ + } else { + display.gdk_window_get_device_position (0, x, y, mask); + } if (containedInRegion(x[0], y[0])) return 0; sendMouseEvent (SWT.MouseHover, 0, /*time*/0, x [0], y [0], false, mask [0]); /* Always return zero in order to cancel the hover timer */ @@ -1005,8 +1013,14 @@ int setBounds (int x, int y, int width, int height, boolean move, boolean resize int oldY = allocation.y; sameOrigin = x == oldX && y == oldY; if (!sameOrigin) { - if (enableWindow != 0) { - GDK.gdk_window_move (enableWindow, x, y); + if (GTK.GTK4) { + if (enableSurface != 0) { + GDK.gdk_surface_move (enableSurface, x, y); + } + } else { + if (enableWindow != 0) { + GDK.gdk_window_move (enableWindow, x, y); + } } moveHandle (x, y); } @@ -1020,11 +1034,20 @@ int setBounds (int x, int y, int width, int height, boolean move, boolean resize if (!sameExtent && !(width == 0 && height == 0)) { int newWidth = Math.max (1, width); int newHeight = Math.max (1, height); - if (redrawWindow != 0) { - GDK.gdk_window_resize (redrawWindow, newWidth, newHeight); - } - if (enableWindow != 0) { - GDK.gdk_window_resize (enableWindow, newWidth, newHeight); + if (GTK.GTK4) { + if (redrawSurface != 0) { + GDK.gdk_surface_resize (redrawSurface, newWidth, newHeight); + } + if (enableSurface != 0) { + GDK.gdk_surface_resize (enableSurface, newWidth, newHeight); + } + } else { + if (redrawWindow != 0) { + GDK.gdk_window_resize (redrawWindow, newWidth, newHeight); + } + if (enableWindow != 0) { + GDK.gdk_window_resize (enableWindow, newWidth, newHeight); + } } resizeHandle (newWidth, newHeight); } @@ -1085,17 +1108,33 @@ int setBounds (int x, int y, int width, int height, boolean move, boolean resize if (!sameExtent) { state = (width == 0) ? state | ZERO_WIDTH : state & ~ZERO_WIDTH; state = (height == 0) ? state | ZERO_HEIGHT : state & ~ZERO_HEIGHT; - if ((state & (ZERO_WIDTH | ZERO_HEIGHT)) != 0) { - if (enableWindow != 0) { - GDK.gdk_window_hide (enableWindow); + if (GTK.GTK4) { + if ((state & (ZERO_WIDTH | ZERO_HEIGHT)) != 0) { + if (enableSurface != 0) { + GDK.gdk_surface_hide (enableSurface); + } + GTK.gtk_widget_hide (topHandle); + } else { + if ((state & HIDDEN) == 0) { + if (enableSurface != 0) { + GDK.gdk_surface_show_unraised (enableSurface); + } + GTK.gtk_widget_show (topHandle); + } } - GTK.gtk_widget_hide (topHandle); } else { - if ((state & HIDDEN) == 0) { + if ((state & (ZERO_WIDTH | ZERO_HEIGHT)) != 0) { if (enableWindow != 0) { - GDK.gdk_window_show_unraised (enableWindow); + GDK.gdk_window_hide (enableWindow); + } + GTK.gtk_widget_hide (topHandle); + } else { + if ((state & HIDDEN) == 0) { + if (enableWindow != 0) { + GDK.gdk_window_show_unraised (enableWindow); + } + GTK.gtk_widget_show (topHandle); } - GTK.gtk_widget_show (topHandle); } } if ((style & SWT.MIRRORED) != 0) moveChildren (clientWidth); @@ -2595,7 +2634,7 @@ boolean dragDetect (int x, int y, boolean filter, boolean dragOnTimeout, boolean quit = true; } int [] newX = new int [1], newY = new int [1]; - gdk_window_get_device_position (gdkMotionEvent.window, newX, newY, null); + display.gdk_window_get_device_position (gdkMotionEvent.window, newX, newY, null); break; } case GDK.GDK_KEY_PRESS: @@ -2651,10 +2690,10 @@ void fixChildren (Shell newShell, Shell oldShell, Decorations newDecorations, De * * Note, composites should treat this differently and take child controls into consideration. */ -void fixParentGdkWindow() { +void fixParentGdkResource() { // Changes to this method should be verified via // org.eclipse.swt.tests.gtk/*/Bug510803_TabFolder_TreeEditor_Regression.java (part one) - parent.setParentGdkWindow(this); + parent.setParentGdkResource(this); } /** @@ -2696,7 +2735,7 @@ static void gtk_widget_reparent (Control control, long /*int*/ newParentHandle) // GTK.gtk_container_add (newParentHandle, widget); // OS.g_object_unref (widget); - control.fixParentGdkWindow(); + control.fixParentGdkResource(); } } @@ -3035,7 +3074,12 @@ public Monitor getMonitor () { if (GTK.GTK_VERSION >= OS.VERSION(3, 22, 0)) { long /*int*/ display = GDK.gdk_display_get_default (); if (display != 0) { - long /*int*/ monitor = GDK.gdk_display_get_monitor_at_window(display, paintWindow ()); + long /*int*/ monitor; + if (GTK.GTK4) { + monitor = GDK.gdk_display_get_monitor_at_surface(display, paintSurface ()); + } else { + monitor = GDK.gdk_display_get_monitor_at_window(display, paintWindow ()); + } long /*int*/ toCompare; for (int i = 0; i < monitors.length; i++) { toCompare = GDK.gdk_display_get_monitor(display, i); @@ -3693,7 +3737,7 @@ long /*int*/ gtk_motion_notify_event (long /*int*/ widget, long /*int*/ event) { if (gdkEvent.is_hint != 0) { int [] pointer_x = new int [1], pointer_y = new int [1], mask = new int [1]; long /*int*/ window = eventWindow (); - gdk_window_get_device_position (window, pointer_x, pointer_y, mask); + display.gdk_window_get_device_position (window, pointer_x, pointer_y, mask); x = pointer_x [0]; y = pointer_y [0]; state = mask [0]; @@ -3717,7 +3761,15 @@ long /*int*/ gtk_motion_notify_event (long /*int*/ widget, long /*int*/ event) { long /*int*/ gtk_popup_menu (long /*int*/ widget) { if (!hasFocus()) return 0; int [] x = new int [1], y = new int [1]; - gdk_window_get_device_position (0, x, y, null); + if (GTK.GTK4) { + /* + * TODO: calling gdk_window_get_device_position() with a 0 + * for the GdkWindow uses gdk_get_default_root_window(), + * which doesn't exist on GTK4. + */ + } else { + display.gdk_window_get_device_position (0, x, y, null); + } return showMenu (x [0], y [0], SWT.MENU_KEYBOARD) ? 1 : 0; } @@ -3815,17 +3867,22 @@ long /*int*/ gtk_unrealize (long /*int*/ widget) { @Override public long /*int*/ internal_new_GC (GCData data) { checkWidget (); - long /*int*/ window = paintWindow (); - if (window == 0) error (SWT.ERROR_NO_HANDLES); + long /*int*/ gdkResource = GTK.GTK4 ? paintSurface () : paintWindow (); + if (gdkResource == 0) error (SWT.ERROR_NO_HANDLES); long /*int*/ gc = data.cairo; if (gc != 0) { Cairo.cairo_reference (gc); } else { if (GTK.GTK_VERSION >= OS.VERSION(3, 22, 0)) { - long /*int*/ surface = GDK.gdk_window_create_similar_surface(window, Cairo.CAIRO_CONTENT_COLOR_ALPHA, data.width, data.height); + long /*int*/ surface; + if (GTK.GTK4) { + surface = GDK.gdk_surface_create_similar_surface(gdkResource, Cairo.CAIRO_CONTENT_COLOR_ALPHA, data.width, data.height); + } else { + surface = GDK.gdk_window_create_similar_surface(gdkResource, Cairo.CAIRO_CONTENT_COLOR_ALPHA, data.width, data.height); + } gc = Cairo.cairo_create(surface); } else { - gc = GDK.gdk_cairo_create (window); + gc = GDK.gdk_cairo_create (gdkResource); } } if (gc == 0) error (SWT.ERROR_NO_HANDLES); @@ -3838,7 +3895,7 @@ public long /*int*/ internal_new_GC (GCData data) { data.style |= SWT.MIRRORED; } } - data.drawable = window; + data.drawable = gdkResource; data.device = display; Control control = findBackgroundControl (); @@ -4126,20 +4183,36 @@ void redrawChildren () { void redrawWidget (int x, int y, int width, int height, boolean redrawAll, boolean all, boolean trim) { if (!GTK.gtk_widget_get_realized(handle)) return; - long /*int*/ window = paintWindow (); GdkRectangle rect = new GdkRectangle (); - if (redrawAll) { - int [] w = new int [1], h = new int [1]; - gdk_window_get_size (window, w, h); - rect.width = w [0]; - rect.height = h [0]; + if (GTK.GTK4) { + long /*int*/ surface = paintSurface (); + if (redrawAll) { + int [] w = new int [1], h = new int [1]; + gdk_surface_get_size (surface, w, h); + rect.width = w [0]; + rect.height = h [0]; + } else { + rect.x = x; + rect.y = y; + rect.width = Math.max (0, width); + rect.height = Math.max (0, height); + } + GDK.gdk_surface_invalidate_rect(surface, rect); } else { - rect.x = x; - rect.y = y; - rect.width = Math.max (0, width); - rect.height = Math.max (0, height); + long /*int*/ window = paintWindow (); + if (redrawAll) { + int [] w = new int [1], h = new int [1]; + gdk_window_get_size (window, w, h); + rect.width = w [0]; + rect.height = h [0]; + } else { + rect.x = x; + rect.y = y; + rect.width = Math.max (0, width); + rect.height = Math.max (0, height); + } + GDK.gdk_window_invalidate_rect (window, rect, all); } - GDK.gdk_window_invalidate_rect (window, rect, all); } @Override @@ -4412,11 +4485,19 @@ boolean sendMouseEvent (int type, int button, int count, int detail, boolean sen Rectangle eventRect = new Rectangle ((int)x, (int)y, 0, 0); event.setBounds (DPIUtil.autoScaleDown (eventRect)); } else { - long /*int*/ window = eventWindow (); int [] origin_x = new int [1], origin_y = new int [1]; - GDK.gdk_window_get_origin (window, origin_x, origin_y); - Rectangle eventRect = new Rectangle ((int)x - origin_x [0], (int)y - origin_y [0], 0, 0); - event.setBounds (DPIUtil.autoScaleDown (eventRect)); + Rectangle eventRect; + if (GTK.GTK4) { + long /*int*/ surface = eventSurface (); + GDK.gdk_surface_get_origin (surface, origin_x, origin_y); + eventRect = new Rectangle ((int)x - origin_x [0], (int)y - origin_y [0], 0, 0); + event.setBounds (DPIUtil.autoScaleDown (eventRect)); + } else { + long /*int*/ window = eventWindow (); + GDK.gdk_window_get_origin (window, origin_x, origin_y); + eventRect = new Rectangle ((int)x - origin_x [0], (int)y - origin_y [0], 0, 0); + event.setBounds (DPIUtil.autoScaleDown (eventRect)); + } } if ((style & SWT.MIRRORED) != 0) event.x = DPIUtil.autoScaleDown (getClientWidth ()) - event.x; setInputState (event, state); @@ -5379,7 +5460,7 @@ void setParentBackground () { if (fixedHandle != 0) setBackgroundGdkRGBA (fixedHandle, null); } -void setParentGdkWindow (Control child) { +void setParentGdkResource (Control child) { } boolean setRadioSelection (boolean value) { @@ -5413,36 +5494,53 @@ public void setRedraw (boolean redraw) { checkWidget(); if (redraw) { if (--drawCount == 0) { - if (redrawWindow != 0) { - long /*int*/ window = paintWindow (); - /* Explicitly hiding the window avoids flicker on GTK+ >= 2.6 */ - GDK.gdk_window_hide (redrawWindow); - GDK.gdk_window_destroy (redrawWindow); - GDK.gdk_window_set_events (window, GTK.gtk_widget_get_events (paintHandle ())); - redrawWindow = 0; + if (GTK.GTK4) { + if (redrawSurface != 0) { + GDK.gdk_surface_hide (redrawSurface); + GDK.gdk_surface_destroy (redrawSurface); + redrawSurface = 0; + } + } else { + if (redrawWindow != 0) { + long /*int*/ window = paintWindow (); + /* Explicitly hiding the window avoids flicker on GTK+ >= 2.6 */ + GDK.gdk_window_hide (redrawWindow); + GDK.gdk_window_destroy (redrawWindow); + GDK.gdk_window_set_events (window, GTK.gtk_widget_get_events (paintHandle ())); + redrawWindow = 0; + } } } } else { if (drawCount++ == 0) { if (GTK.gtk_widget_get_realized (handle)) { - long /*int*/ window = paintWindow (); Rectangle rect = getBoundsInPixels (); - GdkWindowAttr attributes = new GdkWindowAttr (); - attributes.width = rect.width; - attributes.height = rect.height; - attributes.event_mask = GDK.GDK_EXPOSURE_MASK; - attributes.window_type = GDK.GDK_WINDOW_CHILD; - redrawWindow = GDK.gdk_window_new (window, attributes, 0); - if (redrawWindow != 0) { - int mouseMask = GDK.GDK_BUTTON_PRESS_MASK | GDK.GDK_BUTTON_RELEASE_MASK | - GDK.GDK_ENTER_NOTIFY_MASK | GDK.GDK_LEAVE_NOTIFY_MASK | - GDK.GDK_POINTER_MOTION_MASK | GDK.GDK_POINTER_MOTION_HINT_MASK | - GDK.GDK_BUTTON_MOTION_MASK | GDK.GDK_BUTTON1_MOTION_MASK | - GDK.GDK_BUTTON2_MOTION_MASK | GDK.GDK_BUTTON3_MOTION_MASK; - GDK.gdk_window_set_events (window, GDK.gdk_window_get_events (window) & ~mouseMask); - // TODO: no gdk_surface_set_background_pattern() on GTK4. - GDK.gdk_window_set_background_pattern(redrawWindow, 0); - GDK.gdk_window_show (redrawWindow); + if (GTK.GTK4) { + long /*int*/ surface = paintSurface(); + GdkRectangle gdkRectangle = new GdkRectangle (); + gdkRectangle.width = rect.width; + gdkRectangle.height = rect.height; + redrawSurface = GDK.gdk_surface_new_child(surface, gdkRectangle); + GDK.gdk_surface_show(redrawSurface); + } else { + long /*int*/ window = paintWindow (); + GdkWindowAttr attributes = new GdkWindowAttr (); + attributes.width = rect.width; + attributes.height = rect.height; + attributes.event_mask = GDK.GDK_EXPOSURE_MASK; + attributes.window_type = GDK.GDK_WINDOW_CHILD; + redrawWindow = GDK.gdk_window_new (window, attributes, 0); + if (redrawWindow != 0) { + int mouseMask = GDK.GDK_BUTTON_PRESS_MASK | GDK.GDK_BUTTON_RELEASE_MASK | + GDK.GDK_ENTER_NOTIFY_MASK | GDK.GDK_LEAVE_NOTIFY_MASK | + GDK.GDK_POINTER_MOTION_MASK | GDK.GDK_POINTER_MOTION_HINT_MASK | + GDK.GDK_BUTTON_MOTION_MASK | GDK.GDK_BUTTON1_MOTION_MASK | + GDK.GDK_BUTTON2_MOTION_MASK | GDK.GDK_BUTTON3_MOTION_MASK; + GDK.gdk_window_set_events (window, GDK.gdk_window_get_events (window) & ~mouseMask); + // TODO: no gdk_surface_set_background_pattern() on GTK4. + GDK.gdk_window_set_background_pattern(redrawWindow, 0); + GDK.gdk_window_show (redrawWindow); + } } } } @@ -5585,7 +5683,11 @@ public void setVisible (boolean visible) { if (isDisposed ()) return; state &= ~HIDDEN; if ((state & (ZERO_WIDTH | ZERO_HEIGHT)) == 0) { - if (enableWindow != 0) GDK.gdk_window_show_unraised (enableWindow); + if (GTK.GTK4) { + if (enableSurface != 0) GDK.gdk_surface_show_unraised (enableSurface); + } else { + if (enableWindow != 0) GDK.gdk_window_show_unraised (enableWindow); + } GTK.gtk_widget_show (topHandle); } } else { @@ -5613,7 +5715,11 @@ public void setVisible (boolean visible) { } GTK.gtk_widget_hide (topHandle); if (isDisposed ()) return; - if (enableWindow != 0) GDK.gdk_window_hide (enableWindow); + if (GTK.GTK4) { + if (enableSurface != 0) GDK.gdk_surface_hide (enableSurface); + } else { + if (enableWindow != 0) GDK.gdk_window_hide (enableWindow); + } sendEvent (SWT.Hide); } } @@ -5802,7 +5908,7 @@ void showWidget () { state |= ZERO_WIDTH | ZERO_HEIGHT; long /*int*/ topHandle = topHandle (); long /*int*/ parentHandle = parent.parentingHandle (); - parent.setParentGdkWindow (this); + parent.setParentGdkResource (this); GTK.gtk_container_add (parentHandle, topHandle); if (handle != 0 && handle != topHandle) GTK.gtk_widget_show (handle); if ((state & (ZERO_WIDTH | ZERO_HEIGHT)) == 0) { 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 1b29df490f..41ac77c3fa 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 @@ -1671,9 +1671,18 @@ public Control getCursorControl () { int[] x = new int[1], y = new int[1]; long /*int*/ handle = 0; long /*int*/ [] user_data = new long /*int*/ [1]; - long /*int*/ window = gdk_device_get_window_at_position (x,y); - if (window != 0) { - GDK.gdk_window_get_user_data (window, user_data); + long /*int*/ gdkResource; + if (GTK.GTK4) { + gdkResource = gdk_device_get_surface_at_position (x,y); + } else { + gdkResource = gdk_device_get_window_at_position (x,y); + } + if (gdkResource != 0) { + if (GTK.GTK4) { + GDK.gdk_surface_get_user_data (gdkResource, user_data); + } else { + GDK.gdk_window_get_user_data (gdkResource, user_data); + } handle = user_data [0]; } else { /* @@ -1754,7 +1763,15 @@ public Point getCursorLocation () { Point getCursorLocationInPixels () { checkDevice (); int [] x = new int [1], y = new int [1]; - gdk_window_get_device_position (0, x, y, null); + if (GTK.GTK4) { + /* + * TODO: calling gdk_window_get_device_position() with a 0 + * for the GdkWindow uses gdk_get_default_root_window(), + * which doesn't exist on GTK4. + */ + } else { + gdk_window_get_device_position (0, x, y, null); + } /* * Wayland feature: There is no global x/y coordinates in Wayland for security measures, so they * all return relative coordinates dependant to the root window. If there is a popup window (type SWT.ON_TOP), @@ -5917,12 +5934,27 @@ long /*int*/ gdk_window_get_device_position (long /*int*/ window, int[] x, int[] return GDK.gdk_window_get_device_position(window, pointer, x, y, mask); } +long /*int*/ gdk_surface_get_device_position (long /*int*/ surface, int[] x, int[] y, int[] mask) { + long /*int*/ display = 0; + if (surface != 0) { + display = GDK.gdk_surface_get_display (surface); + } + long /*int*/ pointer = GDK.gdk_get_pointer(display); + return GDK.gdk_surface_get_device_position(surface, pointer, x, y, mask); +} + long /*int*/ gdk_device_get_window_at_position (int[] win_x, int[] win_y) { long /*int*/ display = GDK.gdk_display_get_default (); long /*int*/ device = GDK.gdk_get_pointer(display); return GDK.gdk_device_get_window_at_position (device, win_x, win_y); } +long /*int*/ gdk_device_get_surface_at_position (int[] win_x, int[] win_y) { + long /*int*/ display = GDK.gdk_display_get_default (); + long /*int*/ device = GDK.gdk_get_pointer(display); + return GDK.gdk_device_get_surface_at_position (device, win_x, win_y); +} + /** * @noreference This method is not intended to be referenced by clients. * @nooverride This method is not intended to be re-implemented or extended by clients. diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Group.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Group.java index b36c2b1d24..78818cf2d7 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Group.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Group.java @@ -456,7 +456,7 @@ long /*int*/ paintHandle() { /* we draw all our children on the clientHandle*/ long /*int*/ paintHandle = clientHandle; while (paintHandle != topHandle) { - if (GTK.gtk_widget_get_has_window (paintHandle)) break; + if (gtk_widget_get_has_surface_or_window (paintHandle)) break; paintHandle = GTK.gtk_widget_get_parent (paintHandle); } return paintHandle; 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 cf917d7797..b66eef34de 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 @@ -265,22 +265,32 @@ void _setVisible (boolean visible) { // Create the rectangle relative to the parent (in this case, global) GdkWindow GdkRectangle rect = new GdkRectangle(); if (OS.isX11()) { - // Get and (add reference to) the global GdkWindow + // Get and (add reference to) the global GdkWindow/GdkSurface event.window = GDK.gdk_display_get_default_group(GDK.gdk_display_get_default()); OS.g_object_ref(event.window); OS.memmove (eventPtr, event, GdkEventButton.sizeof); /* - * Get the origin of the global GdkWindow to calculate the size of any offsets + * Get the origin of the global GdkWindow/GdkSurface to calculate the size of any offsets * such as client side decorations, or the system tray. */ int [] globalWindowOriginY = new int [1]; int [] globalWindowOriginX = new int [1]; - GDK.gdk_window_get_origin (event.window, globalWindowOriginX, globalWindowOriginY); + if (GTK.GTK4) { + GDK.gdk_surface_get_origin (event.window, globalWindowOriginX, globalWindowOriginY); + } else { + GDK.gdk_window_get_origin (event.window, globalWindowOriginX, globalWindowOriginY); + } rect.x = this.x - globalWindowOriginX[0]; rect.y = this.y - globalWindowOriginY[0]; } else { - // On Wayland, get the relative GdkWindow from the parent shell - event.window = OS.g_object_ref(GTK.gtk_widget_get_window (getShell().topHandle())); + // On Wayland, get the relative GdkWindow from the parent shell. + long /*int*/ gdkResource; + if (GTK.GTK4) { + gdkResource = GTK.gtk_widget_get_surface (getShell().topHandle()); + } else { + gdkResource = GTK.gtk_widget_get_window (getShell().topHandle()); + } + event.window = OS.g_object_ref(gdkResource); OS.memmove (eventPtr, event, GdkEventButton.sizeof); // Bug in GTK?: testing with SWT_MENU_LOCATION_DEBUGGING=1 shows final_rect.x and // final_rect.y popup menu position is off by 1 compared to this.x and this.y @@ -1197,20 +1207,25 @@ void adjustParentWindowWayland (long /*int*/ eventPtr) { if (!OS.isX11()) { long /*int*/ display = GDK.gdk_display_get_default (); long /*int*/ pointer = GDK.gdk_get_pointer(display); - long /*int*/ deviceWindow = GDK.gdk_device_get_window_at_position(pointer, null, null); - OS.g_object_ref(deviceWindow); + long /*int*/ deviceResource; + if (GTK.GTK4) { + deviceResource = GDK.gdk_device_get_surface_at_position(pointer, null, null); + } else { + deviceResource = GDK.gdk_device_get_window_at_position(pointer, null, null); + } + OS.g_object_ref(deviceResource); int eventType = GDK.gdk_event_get_event_type(eventPtr); switch (eventType) { case GDK.GDK_BUTTON_PRESS: GdkEventButton eventButton = new GdkEventButton(); OS.memmove (eventButton, eventPtr, GdkEventButton.sizeof); - eventButton.window = deviceWindow; + eventButton.window = deviceResource; OS.memmove(eventPtr, eventButton, GdkEventButton.sizeof); break; case GDK.GDK_KEY_PRESS: GdkEventKey eventKey = new GdkEventKey(); OS.memmove (eventKey, eventPtr, GdkEventKey.sizeof); - eventKey.window = deviceWindow; + eventKey.window = deviceResource; OS.memmove(eventPtr, eventKey, GdkEventKey.sizeof); break; } @@ -1252,9 +1267,16 @@ void verifyMenuPosition (int itemCount) { GTK.gtk_widget_get_preferred_height(handle, null, naturalHeight); if (naturalHeight[0] > 0) { long /*int*/ topLevelWidget = GTK.gtk_widget_get_toplevel(handle); - long /*int*/ topLevelWindow = GTK.gtk_widget_get_window(topLevelWidget); - int width = GDK.gdk_window_get_width(topLevelWindow); - GDK.gdk_window_resize(topLevelWindow, width, naturalHeight[0]); + int width; + if (GTK.GTK4) { + long /*int*/ topLevelSurface = GTK.gtk_widget_get_surface(topLevelWidget); + width = GDK.gdk_surface_get_width(topLevelSurface); + GDK.gdk_surface_resize(topLevelSurface, width, naturalHeight[0]); + } else { + long /*int*/ topLevelWindow = GTK.gtk_widget_get_window(topLevelWidget); + width = GDK.gdk_window_get_width(topLevelWindow); + GDK.gdk_window_resize(topLevelWindow, width, naturalHeight[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 a188de1811..d37b060359 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 @@ -302,10 +302,10 @@ long /*int*/ gtk_key_press_event (long /*int*/ widget, long /*int*/ eventPtr) { if (newX == lastX && newY == lastY) return result; /* Ensure that the pointer image does not change */ - long /*int*/ window = gtk_widget_get_window (handle); + long /*int*/ gdkResource = GTK.GTK4? gtk_widget_get_surface (handle) : gtk_widget_get_window (handle); int grabMask = GDK.GDK_POINTER_MOTION_MASK | GDK.GDK_BUTTON_RELEASE_MASK; long /*int*/ gdkCursor = cursor != null ? cursor.handle : defaultCursor; - int ptrGrabResult = gdk_pointer_grab (window, GDK.GDK_OWNERSHIP_NONE, false, grabMask, window, gdkCursor, GDK.GDK_CURRENT_TIME); + int ptrGrabResult = gdk_pointer_grab (gdkResource, GDK.GDK_OWNERSHIP_NONE, false, grabMask, gdkResource, gdkCursor, GDK.GDK_CURRENT_TIME); /* The event must be sent because its doit flag is used. */ Event event = new Event (); @@ -314,7 +314,7 @@ long /*int*/ gtk_key_press_event (long /*int*/ widget, long /*int*/ eventPtr) { event.setBounds (DPIUtil.autoScaleDown (eventRect)); if ((parent.style & SWT.MIRRORED) != 0) event.x = DPIUtil.autoScaleDown (parent.getClientWidth () - width) - event.x; sendSelectionEvent (SWT.Selection, event, true); - if (ptrGrabResult == GDK.GDK_GRAB_SUCCESS) gdk_pointer_ungrab (window, GDK.GDK_CURRENT_TIME); + if (ptrGrabResult == GDK.GDK_GRAB_SUCCESS) gdk_pointer_ungrab (gdkResource, GDK.GDK_CURRENT_TIME); if (isDisposed ()) break; if (event.doit) { @@ -350,7 +350,7 @@ long /*int*/ gtk_motion_notify_event (long /*int*/ widget, long /*int*/ eventPtr int eventX, eventY, eventState; if (gdkEvent.is_hint != 0) { int [] pointer_x = new int [1], pointer_y = new int [1], mask = new int [1]; - gdk_window_get_device_position (gdkEvent.window, pointer_x, pointer_y, mask); + display.gdk_window_get_device_position (gdkEvent.window, pointer_x, pointer_y, mask); eventX = pointer_x [0]; eventY = pointer_y [0]; eventState = mask [0]; 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 52430a46d9..d4aa51e429 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 @@ -580,12 +580,17 @@ void bringToTop (boolean force) { * window. The fix is to use XSetInputFocus() to force * the focus, or gtk_grab_add() for GTK > 3.20. */ - long /*int*/ window = gtk_widget_get_window (shellHandle); + long /*int*/ gdkResource; + if (GTK.GTK4) { + gdkResource = gtk_widget_get_surface (shellHandle); + } else { + gdkResource = gtk_widget_get_window (shellHandle); + } if ((xFocus || (style & SWT.ON_TOP) != 0)) { if (OS.isX11()) { - long /*int*/ gdkDisplay = GDK.gdk_window_get_display(window); + long /*int*/ gdkDisplay = GDK.gdk_window_get_display(gdkResource); long /*int*/ xDisplay = GDK.gdk_x11_display_get_xdisplay(gdkDisplay); - long /*int*/ xWindow = GDK.gdk_x11_window_get_xid (window); + long /*int*/ xWindow = GDK.gdk_x11_window_get_xid (gdkResource); GDK.gdk_x11_display_error_trap_push(gdkDisplay); /* Use CurrentTime instead of the last event time to ensure that the shell becomes active */ OS.XSetInputFocus (xDisplay, xWindow, OS.RevertToParent, OS.CurrentTime); @@ -593,9 +598,19 @@ void bringToTop (boolean force) { } else { if (GTK.GTK_VERSION >= OS.VERSION(3, 20, 0)) { GTK.gtk_grab_add(shellHandle); - long /*int*/ seat = GDK.gdk_display_get_default_seat(GDK.gdk_window_get_display(window)); - GDK.gdk_window_show(window); - GDK.gdk_seat_grab(seat, window, GDK.GDK_SEAT_CAPABILITY_ALL, true, 0, 0, 0, 0); + long /*int*/ gdkDisplay; + if (GTK.GTK4) { + gdkDisplay = GDK.gdk_surface_get_display(gdkResource); + } else { + gdkDisplay = GDK.gdk_window_get_display(gdkResource); + } + long /*int*/ seat = GDK.gdk_display_get_default_seat(gdkDisplay); + if (GTK.GTK4) { + GDK.gdk_surface_show(gdkResource); + } else { + GDK.gdk_window_show(gdkResource); + } + GDK.gdk_seat_grab(seat, gdkResource, GDK.GDK_SEAT_CAPABILITY_ALL, true, 0, 0, 0, 0); /* * Bug 541185: Hover over to open Javadoc popup will make the popup * close instead of gaining focus due to an extra focus out signal sent @@ -607,7 +622,11 @@ void bringToTop (boolean force) { } } } else { - GDK.gdk_window_focus (window, GDK.GDK_CURRENT_TIME); + if (GTK.GTK4) { + GDK.gdk_surface_focus (gdkResource, GDK.GDK_CURRENT_TIME); + } else { + GDK.gdk_window_focus (gdkResource, GDK.GDK_CURRENT_TIME); + } } display.activeShell = this; display.activePending = true; @@ -1686,19 +1705,27 @@ long /*int*/ gtk_realize (long /*int*/ widget) { if ((style & SWT.RESIZE) != 0) decorations |= GDK.GDK_DECOR_BORDER; if ((style & SWT.NO_MOVE) == 0) functions |= GDK.GDK_FUNC_MOVE; } - GDK.gdk_window_set_decorations (gdkResource, decorations); - - /* - * For systems running Metacity, this call forces the style hints to - * be displayed in a window's titlebar. Otherwise, the decorations - * set by the function gdk_window_set_decorations (window, - * decorations) are ignored by the window manager. - */ - GDK.gdk_window_set_functions(gdkResource, functions); + if (GTK.GTK4) { + GDK.gdk_surface_set_decorations (gdkResource, decorations); + GDK.gdk_surface_set_functions(gdkResource, functions); + } else { + GDK.gdk_window_set_decorations (gdkResource, decorations); + /* + * For systems running Metacity, this call forces the style hints to + * be displayed in a window's titlebar. Otherwise, the decorations + * set by the function gdk_window_set_decorations (window, + * decorations) are ignored by the window manager. + */ + GDK.gdk_window_set_functions(gdkResource, functions); + } } else if ((style & SWT.NO_MOVE) != 0) { // if the GDK_FUNC_ALL bit is present, all the other style // bits specified as a parameter will be removed from the window - GDK.gdk_window_set_functions (gdkResource, GDK.GDK_FUNC_ALL | GDK.GDK_FUNC_MOVE); + if (GTK.GTK4) { + GDK.gdk_surface_set_functions (gdkResource, GDK.GDK_FUNC_ALL | GDK.GDK_FUNC_MOVE); + } else { + GDK.gdk_window_set_functions (gdkResource, GDK.GDK_FUNC_ALL | GDK.GDK_FUNC_MOVE); + } } if ((style & SWT.ON_TOP) != 0) GTK.gtk_window_set_keep_above(shellHandle, true); @@ -1940,14 +1967,23 @@ public void setAlpha (int alpha) { } void resizeBounds (int width, int height, boolean notify) { - if (redrawWindow != 0) { - GDK.gdk_window_resize (redrawWindow, width, height); - } - if (enableWindow != 0) { - GDK.gdk_window_resize (enableWindow, width, height); - } int border = 0; - if (!GTK.GTK4) border = GTK.gtk_container_get_border_width (shellHandle); + if (GTK.GTK4) { + if (redrawSurface != 0) { + GDK.gdk_surface_resize (redrawSurface, width, height); + } + if (redrawSurface != 0) { + GDK.gdk_surface_resize (redrawSurface, width, height); + } + } else { + if (redrawWindow != 0) { + GDK.gdk_window_resize (redrawWindow, width, height); + } + if (enableWindow != 0) { + GDK.gdk_window_resize (enableWindow, width, height); + } + border = GTK.gtk_container_get_border_width (shellHandle); + } int boxWidth = width - 2*border; int boxHeight = height - 2*border; if ((style & SWT.RESIZE) == 0) { @@ -2036,9 +2072,15 @@ int setBounds (int x, int y, int width, int height, boolean move, boolean resize @Override void setCursor (long /*int*/ cursor) { - if (enableWindow != 0) { - GDK.gdk_window_set_cursor (enableWindow, cursor); - GDK.gdk_flush (); + if (GTK.GTK4) { + if (enableSurface != 0) { + GDK.gdk_surface_set_cursor (enableSurface, cursor); + } + } else { + if (enableWindow != 0) { + GDK.gdk_window_set_cursor (enableWindow, cursor); + GDK.gdk_flush (); + } } super.setCursor (cursor); } @@ -2530,7 +2572,11 @@ public void setVisible (boolean visible) { * Feature in GTK: This handles grabbing the keyboard focus from a SWT.ON_TOP window * if it has editable fields and is running Wayland. Refer to bug 515773. */ - if (enableWindow != 0) GDK.gdk_window_raise (enableWindow); + if (GTK.GTK4) { + if (enableSurface != 0) GDK.gdk_surface_raise (enableSurface); + } else { + if (enableWindow != 0) GDK.gdk_window_raise (enableWindow); + } if (isDisposed ()) return; if (!(OS.isX11() && GTK.GTK_IS_PLUG (shellHandle))) { display.dispatchEvents = new int [] { @@ -2649,7 +2695,15 @@ void showWidget () { long /*int*/ sizeAllocateProc (long /*int*/ handle, long /*int*/ arg0, long /*int*/ user_data) { int offset = 16; int [] x = new int [1], y = new int [1]; - gdk_window_get_device_position (0, x, y, null); + if (GTK.GTK4) { + /* + * TODO: calling gdk_window_get_device_position() with a 0 + * for the GdkWindow uses gdk_get_default_root_window(), + * which doesn't exist on GTK4. + */ + } else { + display.gdk_window_get_device_position (0, x, y, null); + } y [0] += offset; GdkRectangle dest = new GdkRectangle (); if (GTK.GTK_VERSION >= OS.VERSION(3, 22, 0)) { @@ -2924,7 +2978,11 @@ Rectangle getBoundsInPixels () { if ((state & Widget.DISPOSE_SENT) == 0) { GTK.gtk_window_get_position (shellHandle, x, y); } else { - GDK.gdk_window_get_root_origin(GTK.gtk_widget_get_window(shellHandle), x, y); + if (GTK.GTK4) { + GDK.gdk_surface_get_root_origin(GTK.gtk_widget_get_surface(shellHandle), x, y); + } else { + GDK.gdk_window_get_root_origin(GTK.gtk_widget_get_window(shellHandle), x, y); + } } GtkAllocation allocation = new GtkAllocation (); GTK.gtk_widget_get_allocation (vboxHandle, allocation); 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 f6699f3322..2998b56a5f 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 @@ -1173,27 +1173,43 @@ void fixChildren (Shell newShell, Shell oldShell, Decorations newDecorations, De Rectangle getClientAreaInPixels () { checkWidget (); forceResize (); - GTK.gtk_widget_realize (handle); - long /*int*/ fixedWindow = gtk_widget_get_window (fixedHandle); - long /*int*/ binWindow = GTK.gtk_tree_view_get_bin_window (handle); - int [] binX = new int [1], binY = new int [1]; - GDK.gdk_window_get_origin (binWindow, binX, binY); - int [] fixedX = new int [1], fixedY = new int [1]; - GDK.gdk_window_get_origin (fixedWindow, fixedX, fixedY); long /*int*/ clientHandle = clientHandle (); GtkAllocation allocation = new GtkAllocation (); GTK.gtk_widget_get_allocation (clientHandle, allocation); int width = (state & ZERO_WIDTH) != 0 ? 0 : allocation.width; int height = (state & ZERO_HEIGHT) != 0 ? 0 : allocation.height; - Rectangle rect = new Rectangle (fixedX [0] - binX [0], fixedY [0] - binY [0], width, height); + Rectangle rect; + if (GTK.GTK4) { + long /*int*/ fixedSurface = gtk_widget_get_surface (fixedHandle); + long /*int*/ surface = gtk_widget_get_surface (clientHandle); + int [] surfaceX = new int [1], surfaceY = new int [1]; + GDK.gdk_surface_get_origin (surface, surfaceX, surfaceY); + int [] fixedX = new int [1], fixedY = new int [1]; + GDK.gdk_surface_get_origin (fixedSurface, fixedX, fixedY); + rect = new Rectangle (fixedX [0] - surfaceX [0], fixedY [0] - surfaceY [0], width, height); + } else { + GTK.gtk_widget_realize (handle); + long /*int*/ fixedWindow = gtk_widget_get_window (fixedHandle); + long /*int*/ binWindow = GTK.gtk_tree_view_get_bin_window (handle); + int [] binX = new int [1], binY = new int [1]; + GDK.gdk_window_get_origin (binWindow, binX, binY); + int [] fixedX = new int [1], fixedY = new int [1]; + GDK.gdk_window_get_origin (fixedWindow, fixedX, fixedY); + rect = new Rectangle (fixedX [0] - binX [0], fixedY [0] - binY [0], width, height); + } return rect; } @Override int getClientWidth () { int [] w = new int [1], h = new int [1]; - GTK.gtk_widget_realize (handle); - gdk_window_get_size(GTK.gtk_tree_view_get_bin_window(handle), w, h); + if (GTK.GTK4) { + long /*int*/ surface = gtk_widget_get_surface(handle); + gdk_surface_get_size(surface, w, h); + } else { + GTK.gtk_widget_realize (handle); + gdk_window_get_size(GTK.gtk_tree_view_get_bin_window(handle), w, h); + } return w[0]; } @@ -1483,14 +1499,24 @@ int getHeaderHeightInPixels () { } return height; } - GTK.gtk_widget_realize (handle); - long /*int*/ fixedWindow = gtk_widget_get_window (fixedHandle); - long /*int*/ binWindow = GTK.gtk_tree_view_get_bin_window (handle); - int [] binY = new int [1]; - GDK.gdk_window_get_origin (binWindow, null, binY); - int [] fixedY = new int [1]; - GDK.gdk_window_get_origin (fixedWindow, null, fixedY); - return binY [0] - fixedY [0]; + if (GTK.GTK4) { + long /*int*/ fixedSurface = gtk_widget_get_surface (fixedHandle); + long /*int*/ surface = gtk_widget_get_surface (handle); + int [] surfaceY = new int [1]; + GDK.gdk_surface_get_origin (surface, null, surfaceY); + int [] fixedY = new int [1]; + GDK.gdk_surface_get_origin (fixedSurface, null, fixedY); + return surfaceY [0] - fixedY [0]; + } else { + GTK.gtk_widget_realize (handle); + long /*int*/ fixedWindow = gtk_widget_get_window (fixedHandle); + long /*int*/ binWindow = GTK.gtk_tree_view_get_bin_window (handle); + int [] binY = new int [1]; + GDK.gdk_window_get_origin (binWindow, null, binY); + int [] fixedY = new int [1]; + GDK.gdk_window_get_origin (fixedWindow, null, fixedY); + return binY [0] - fixedY [0]; + } } /** @@ -3587,9 +3613,7 @@ void setParentBackground () { } @Override -void setParentGdkWindow (Control child) { - long /*int*/ parentGdkWindow = eventWindow (); - GTK.gtk_widget_set_parent_window (child.topHandle(), parentGdkWindow); +void setParentGdkResource (Control child) { /* * Feature in GTK3: non-native GdkWindows are not drawn implicitly * as of GTK3.10+. It is the client's responsibility to propagate draw @@ -3600,8 +3624,18 @@ void setParentGdkWindow (Control child) { * Table's fixedHandle to the draw signal, and propagate the draw * signal using gtk_container_propagate_draw(). See bug 531928. */ - hasChildren = true; - connectFixedHandleDraw(); + if (GTK.GTK4) { + long /*int*/ parentGdkSurface = eventSurface (); + GTK.gtk_widget_set_parent_surface (child.topHandle(), parentGdkSurface); + // TODO: implement connectFixedHandleDraw with the "snapshot" signal + } else { + long /*int*/ parentGdkWindow = eventWindow (); + GTK.gtk_widget_set_parent_window (child.topHandle(), parentGdkWindow); + if (GTK.GTK_VERSION >= OS.VERSION(3, 10, 0)) { + hasChildren = true; + connectFixedHandleDraw(); + } + } } @Override 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 af97760002..e05dd7d720 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 @@ -760,22 +760,43 @@ void setWidthInPixels (int width) { */ if (width != 0) { if (buttonHandle != 0) { - long /*int*/ window = GTK.gtk_widget_get_parent_window (buttonHandle); - if (window != 0) { - long /*int*/ windowList = GDK.gdk_window_get_children (window); - if (windowList != 0) { - long /*int*/ windows = windowList; - long /*int*/ [] userData = new long /*int*/ [1]; - while (windows != 0) { - long /*int*/ child = OS.g_list_data (windows); - GDK.gdk_window_get_user_data (child, userData); - if (userData[0] == buttonHandle) { - GDK.gdk_window_lower (child); - break; + if (GTK.GTK4) { + long /*int*/ surface = GTK.gtk_widget_get_parent_surface (buttonHandle); + if (surface != 0) { + long /*int*/ surfaceList = GDK.gdk_surface_get_children (surface); + if (surfaceList != 0) { + long /*int*/ surfaces = surfaceList; + long /*int*/ [] userData = new long /*int*/ [1]; + while (surfaces != 0) { + long /*int*/ child = OS.g_list_data (surfaces); + GDK.gdk_surface_get_user_data (child, userData); + if (userData[0] == buttonHandle) { + GDK.gdk_surface_lower (child); + break; + } + surfaces = OS.g_list_next (surfaces); } - windows = OS.g_list_next (windows); + OS.g_list_free (surfaceList); + } + } + } else { + long /*int*/ window = GTK.gtk_widget_get_parent_window (buttonHandle); + if (window != 0) { + long /*int*/ windowList = GDK.gdk_window_get_children (window); + if (windowList != 0) { + long /*int*/ windows = windowList; + long /*int*/ [] userData = new long /*int*/ [1]; + while (windows != 0) { + long /*int*/ child = OS.g_list_data (windows); + GDK.gdk_window_get_user_data (child, userData); + if (userData[0] == buttonHandle) { + GDK.gdk_window_lower (child); + break; + } + windows = OS.g_list_next (windows); + } + OS.g_list_free (windowList); } - OS.g_list_free (windowList); } } } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolTip.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolTip.java index 5b325836fc..66dbc0f552 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolTip.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ToolTip.java @@ -357,7 +357,15 @@ Point getLocation () { } if (x == -1 || y == -1) { int [] px = new int [1], py = new int [1]; - gdk_window_get_device_position (0, px, py, null); + if (GTK.GTK4) { + /* + * TODO: calling gdk_window_get_device_position() with a 0 + * for the GdkWindow uses gdk_get_default_root_window(), + * which doesn't exist on GTK4. + */ + } else { + display.gdk_window_get_device_position (0, px, py, null); + } x = px [0]; y = py [0]; } 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 768a1ed31f..b8ae6c7bac 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 @@ -48,6 +48,7 @@ public class Tracker extends Widget { Composite parent; Cursor cursor; long /*int*/ lastCursor, window, overlay; + long /*int*/ surface; boolean tracking, cancelled, grabbed, stippled; Rectangle [] rectangles = new Rectangle [0], proportions = rectangles; Rectangle bounds; @@ -208,13 +209,12 @@ Point adjustMoveCursor () { Point point = display.mapInPixels (parent, null, newX, newY); display.setCursorLocation (point); - /* - * The call to XWarpPointer does not always place the pointer on the - * exact location that is specified, so do a query (below) to get the - * actual location of the pointer after it has been moved. - */ int [] actualX = new int [1], actualY = new int [1], state = new int [1]; - gdk_window_get_device_position (window, actualX, actualY, state); + if (GTK.GTK4) { + display.gdk_surface_get_device_position (surface, actualX, actualY, state); + } else { + display.gdk_window_get_device_position (window, actualX, actualY, state); + } return new Point (actualX [0], actualY [0]); } @@ -247,7 +247,11 @@ Point adjustResizeCursor () { * actual location of the pointer after it has been moved. */ int [] actualX = new int [1], actualY = new int [1], state = new int [1]; - gdk_window_get_device_position (window, actualX, actualY, state); + if (GTK.GTK4) { + display.gdk_surface_get_device_position (surface, actualX, actualY, state); + } else { + display.gdk_window_get_device_position (window, actualX, actualY, state); + } return new Point (actualX [0], actualY [0]); } @@ -401,9 +405,15 @@ void drawRectangles (Rectangle [] rects) { GTK.gtk_widget_shape_combine_region (overlay, region); Cairo.cairo_region_destroy (region); - long /*int*/ overlayWindow = GTK.gtk_widget_get_window (overlay); - GDK.gdk_window_hide (overlayWindow); - GDK.gdk_window_show (overlayWindow); + if (GTK.GTK4) { + long /*int*/ overlaySurface = GTK.gtk_widget_get_surface (overlay); + GDK.gdk_surface_hide (overlaySurface); + GDK.gdk_surface_show (overlaySurface); + } else { + long /*int*/ overlayWindow = GTK.gtk_widget_get_window (overlay); + GDK.gdk_window_hide (overlayWindow); + GDK.gdk_window_show (overlayWindow); + } } /** @@ -455,7 +465,8 @@ public boolean getStippled () { boolean grab () { long /*int*/ cursor = this.cursor != null ? this.cursor.handle : 0; - int result = gdk_pointer_grab (window, GDK.GDK_OWNERSHIP_NONE, false, GDK.GDK_POINTER_MOTION_MASK | GDK.GDK_BUTTON_RELEASE_MASK, 0, cursor, GDK.GDK_CURRENT_TIME); + int result = gdk_pointer_grab (GTK.GTK4 ? surface : window, GDK.GDK_OWNERSHIP_NONE, false, + GDK.GDK_POINTER_MOTION_MASK | GDK.GDK_BUTTON_RELEASE_MASK, 0, cursor, GDK.GDK_CURRENT_TIME); return result == GDK.GDK_GRAB_SUCCESS; } @@ -611,7 +622,11 @@ long /*int*/ gtk_motion_notify_event (long /*int*/ widget, long /*int*/ eventPtr long /*int*/ gtk_mouse (int eventType, long /*int*/ widget, long /*int*/ eventPtr) { int [] newX = new int [1], newY = new int [1]; - gdk_window_get_device_position (window, newX, newY, null); + if (GTK.GTK4) { + display.gdk_surface_get_device_position (surface, newX, newY, null); + } else { + display.gdk_window_get_device_position (window, newX, newY, null); + } if (oldX != newX [0] || oldY != newY [0]) { Rectangle [] oldRectangles = rectangles; Rectangle [] rectsToErase = new Rectangle [rectangles.length]; @@ -754,7 +769,11 @@ public boolean open () { cancelled = false; tracking = true; int [] oldX = new int [1], oldY = new int [1], state = new int [1]; - gdk_window_get_device_position (window, oldX, oldY, state); + if (GTK.GTK4) { + display.gdk_surface_get_device_position (surface, oldX, oldY, state); + } else { + display.gdk_window_get_device_position (window, oldX, oldY, state); + } /* * if exactly one of UP/DOWN is specified as a style then set the cursor 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 e4693db1ea..c0d8fe0fe8 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 @@ -1203,27 +1203,43 @@ void fixChildren (Shell newShell, Shell oldShell, Decorations newDecorations, De Rectangle getClientAreaInPixels () { checkWidget (); forceResize (); - GTK.gtk_widget_realize (handle); - long /*int*/ fixedWindow = gtk_widget_get_window (fixedHandle); - long /*int*/ binWindow = GTK.gtk_tree_view_get_bin_window (handle); - int [] binX = new int [1], binY = new int [1]; - GDK.gdk_window_get_origin (binWindow, binX, binY); - int [] fixedX = new int [1], fixedY = new int [1]; - GDK.gdk_window_get_origin (fixedWindow, fixedX, fixedY); long /*int*/ clientHandle = clientHandle (); GtkAllocation allocation = new GtkAllocation (); GTK.gtk_widget_get_allocation (clientHandle, allocation); int width = (state & ZERO_WIDTH) != 0 ? 0 : allocation.width; int height = (state & ZERO_HEIGHT) != 0 ? 0 : allocation.height; - Rectangle rect = new Rectangle (fixedX [0] - binX [0], fixedY [0] - binY [0], width, height); + Rectangle rect; + if (GTK.GTK4) { + long /*int*/ fixedSurface = gtk_widget_get_surface (fixedHandle); + long /*int*/ surface = gtk_widget_get_surface (clientHandle); + int [] surfaceX = new int [1], surfaceY = new int [1]; + GDK.gdk_surface_get_origin (surface, surfaceX, surfaceY); + int [] fixedX = new int [1], fixedY = new int [1]; + GDK.gdk_surface_get_origin (fixedSurface, fixedX, fixedY); + rect = new Rectangle (fixedX [0] - surfaceX [0], fixedY [0] - surfaceY [0], width, height); + } else { + GTK.gtk_widget_realize (handle); + long /*int*/ fixedWindow = gtk_widget_get_window (fixedHandle); + long /*int*/ binWindow = GTK.gtk_tree_view_get_bin_window (handle); + int [] binX = new int [1], binY = new int [1]; + GDK.gdk_window_get_origin (binWindow, binX, binY); + int [] fixedX = new int [1], fixedY = new int [1]; + GDK.gdk_window_get_origin (fixedWindow, fixedX, fixedY); + rect = new Rectangle (fixedX [0] - binX [0], fixedY [0] - binY [0], width, height); + } return rect; } @Override int getClientWidth () { int [] w = new int [1], h = new int [1]; - GTK.gtk_widget_realize (handle); - gdk_window_get_size(GTK.gtk_tree_view_get_bin_window(handle), w, h); + if (GTK.GTK4) { + long /*int*/ surface = gtk_widget_get_surface(handle); + gdk_surface_get_size(surface, w, h); + } else { + GTK.gtk_widget_realize (handle); + gdk_window_get_size(GTK.gtk_tree_view_get_bin_window(handle), w, h); + } return w[0]; } @@ -1517,14 +1533,24 @@ int getHeaderHeightInPixels () { } return height; } - GTK.gtk_widget_realize (handle); - long /*int*/ fixedWindow = gtk_widget_get_window (fixedHandle); - long /*int*/ binWindow = GTK.gtk_tree_view_get_bin_window (handle); - int [] binY = new int [1]; - GDK.gdk_window_get_origin (binWindow, null, binY); - int [] fixedY = new int [1]; - GDK.gdk_window_get_origin (fixedWindow, null, fixedY); - return binY [0] - fixedY [0]; + if (GTK.GTK4) { + long /*int*/ fixedSurface = gtk_widget_get_surface (fixedHandle); + long /*int*/ surface = gtk_widget_get_surface (handle); + int [] surfaceY = new int [1]; + GDK.gdk_surface_get_origin (surface, null, surfaceY); + int [] fixedY = new int [1]; + GDK.gdk_surface_get_origin (fixedSurface, null, fixedY); + return surfaceY [0] - fixedY [0]; + } else { + GTK.gtk_widget_realize (handle); + long /*int*/ fixedWindow = gtk_widget_get_window (fixedHandle); + long /*int*/ binWindow = GTK.gtk_tree_view_get_bin_window (handle); + int [] binY = new int [1]; + GDK.gdk_window_get_origin (binWindow, null, binY); + int [] fixedY = new int [1]; + GDK.gdk_window_get_origin (fixedWindow, null, fixedY); + return binY [0] - fixedY [0]; + } } /** @@ -3611,21 +3637,29 @@ void setParentBackground () { } @Override -void setParentGdkWindow (Control child) { - long /*int*/ parentGdkWindow = eventWindow (); - GTK.gtk_widget_set_parent_window (child.topHandle(), parentGdkWindow); +void setParentGdkResource (Control child) { /* * Feature in GTK3: non-native GdkWindows are not drawn implicitly * as of GTK3.10+. It is the client's responsibility to propagate draw * events to these windows in the "draw" signal handler. * - * This change breaks tree editing on GTK3.10+, as the tree editor + * This change breaks table editing on GTK3.10+, as the table editor * widgets no longer receive draw signals. The fix is to connect the - * Tree's fixedHandle to the draw signal, and propagate the draw + * Table's fixedHandle to the draw signal, and propagate the draw * signal using gtk_container_propagate_draw(). See bug 531928. */ - hasChildren = true; - connectFixedHandleDraw(); + if (GTK.GTK4) { + long /*int*/ parentGdkSurface = eventSurface (); + GTK.gtk_widget_set_parent_surface (child.topHandle(), parentGdkSurface); + // TODO: implement connectFixedHandleDraw with the "snapshot" signal + } else { + long /*int*/ parentGdkWindow = eventWindow (); + GTK.gtk_widget_set_parent_window (child.topHandle(), parentGdkWindow); + if (GTK.GTK_VERSION >= OS.VERSION(3, 10, 0)) { + hasChildren = true; + connectFixedHandleDraw(); + } + } } void setScrollWidth (long /*int*/ column, TreeItem item) { 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 22d4c5a6b8..c1fb6879fa 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 @@ -731,22 +731,43 @@ void setWidthInPixels (int width) { */ if (width != 0) { if (buttonHandle != 0) { - long /*int*/ window = GTK.gtk_widget_get_parent_window (buttonHandle); - if (window != 0) { - long /*int*/ windowList = GDK.gdk_window_get_children (window); - if (windowList != 0) { - long /*int*/ windows = windowList; - long /*int*/ [] userData = new long /*int*/ [1]; - while (windows != 0) { - long /*int*/ child = OS.g_list_data (windows); - GDK.gdk_window_get_user_data (child, userData); - if (userData[0] == buttonHandle) { - GDK.gdk_window_lower (child); - break; + if (GTK.GTK4) { + long /*int*/ surface = GTK.gtk_widget_get_parent_surface (buttonHandle); + if (surface != 0) { + long /*int*/ surfaceList = GDK.gdk_surface_get_children (surface); + if (surfaceList != 0) { + long /*int*/ surfaces = surfaceList; + long /*int*/ [] userData = new long /*int*/ [1]; + while (surfaces != 0) { + long /*int*/ child = OS.g_list_data (surfaces); + GDK.gdk_surface_get_user_data (child, userData); + if (userData[0] == buttonHandle) { + GDK.gdk_surface_lower (child); + break; + } + surfaces = OS.g_list_next (surfaces); } - windows = OS.g_list_next (windows); + OS.g_list_free (surfaceList); + } + } + } else { + long /*int*/ window = GTK.gtk_widget_get_parent_window (buttonHandle); + if (window != 0) { + long /*int*/ windowList = GDK.gdk_window_get_children (window); + if (windowList != 0) { + long /*int*/ windows = windowList; + long /*int*/ [] userData = new long /*int*/ [1]; + while (windows != 0) { + long /*int*/ child = OS.g_list_data (windows); + GDK.gdk_window_get_user_data (child, userData); + if (userData[0] == buttonHandle) { + GDK.gdk_window_lower (child); + break; + } + windows = OS.g_list_next (windows); + } + OS.g_list_free (windowList); } - OS.g_list_free (windowList); } } } 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 f9d175f67a..5e0ed43028 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 @@ -1816,10 +1816,16 @@ void gtk_widget_set_visible (long /*int*/ widget, boolean visible) { } void gdk_window_get_size (long /*int*/ drawable, int[] width, int[] height) { - width[0] = GDK.gdk_window_get_width (drawable); - height[0] = GDK.gdk_window_get_height (drawable); + width[0] = GDK.gdk_window_get_width (drawable); + height[0] = GDK.gdk_window_get_height (drawable); } +void gdk_surface_get_size (long /*int*/ surface, int[] width, int[] height) { + width[0] = GDK.gdk_surface_get_width (surface); + height[0] = GDK.gdk_surface_get_height (surface); +} + + /** * Wrapper function for gdk_event_get_state() * @param event pointer to the GdkEvent. @@ -1839,13 +1845,19 @@ long /*int*/ gtk_box_new (int orientation, boolean homogeneous, int spacing) { return box; } -int gdk_pointer_grab (long /*int*/ window, int grab_ownership, boolean owner_events, int event_mask, long /*int*/ confine_to, long /*int*/ cursor, int time_) { +int gdk_pointer_grab (long /*int*/ gdkResource, int grab_ownership, boolean owner_events, int event_mask, long /*int*/ confine_to, long /*int*/ cursor, int time_) { long /*int*/ display = 0; - if( window != 0) { - display = GDK.gdk_window_get_display (window); + if (GTK.GTK4) { + if( gdkResource != 0) { + display = GDK.gdk_surface_get_display (gdkResource); + } } else { - window = GDK.gdk_get_default_root_window (); - display = GDK.gdk_window_get_display (window); + if( gdkResource != 0) { + display = GDK.gdk_window_get_display (gdkResource); + } else { + gdkResource = GDK.gdk_get_default_root_window (); + display = GDK.gdk_window_get_display (gdkResource); + } } if (GTK.GTK_VERSION >= OS.VERSION(3, 20, 0)) { long /*int*/ seat = GDK.gdk_display_get_default_seat(display); @@ -1854,15 +1866,15 @@ int gdk_pointer_grab (long /*int*/ window, int grab_ownership, boolean owner_eve } long /*int*/ gdkSeatGrabPrepareFuncAddress = gdkSeatGrabPrepareFunc.getAddress(); if (gdkSeatGrabPrepareFuncAddress == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS); - return GDK.gdk_seat_grab(seat, window, GDK.GDK_SEAT_CAPABILITY_ALL_POINTING, owner_events, cursor, 0, gdkSeatGrabPrepareFuncAddress, window); + return GDK.gdk_seat_grab(seat, gdkResource, GDK.GDK_SEAT_CAPABILITY_ALL_POINTING, owner_events, cursor, 0, gdkSeatGrabPrepareFuncAddress, gdkResource); } else { long /*int*/ pointer = GDK.gdk_get_pointer(display); - return GDK.gdk_device_grab (pointer, window, grab_ownership, owner_events, event_mask, cursor, time_); + return GDK.gdk_device_grab (pointer, gdkResource, grab_ownership, owner_events, event_mask, cursor, time_); } } -void gdk_pointer_ungrab (long /*int*/ window, int time_) { - long /*int*/ display = GDK.gdk_window_get_display (window); +void gdk_pointer_ungrab (long /*int*/ gdkResource, int time_) { + long /*int*/ display = GTK.GTK4? GDK.gdk_surface_get_display(gdkResource) : GDK.gdk_window_get_display (gdkResource); if (GTK.GTK_VERSION >= OS.VERSION(3, 20, 0)) { long /*int*/ seat = GDK.gdk_display_get_default_seat(display); GDK.gdk_seat_ungrab(seat); @@ -1872,9 +1884,13 @@ void gdk_pointer_ungrab (long /*int*/ window, int time_) { } } -static long /*int*/ GdkSeatGrabPrepareFunc (long /*int*/ gdkSeat, long /*int*/ gdkWindow, long /*int*/ userData_gdkWindow) { - if (userData_gdkWindow != 0) { - GDK.gdk_window_show(userData_gdkWindow); +static long /*int*/ GdkSeatGrabPrepareFunc (long /*int*/ gdkSeat, long /*int*/ gdkResource, long /*int*/ userData_gdkResource) { + if (userData_gdkResource != 0) { + if (GTK.GTK4) { + GDK.gdk_surface_show(userData_gdkResource); + } else { + GDK.gdk_window_show(userData_gdkResource); + } } return 0; } @@ -2020,27 +2036,6 @@ long /*int*/ windowProc (long /*int*/ handle, long /*int*/ arg0, long /*int*/ ar } } -long /*int*/ gdk_window_get_device_position (long /*int*/ window, int[] x, int[] y, int[] mask) { - long /*int*/ display = 0; - if( window != 0) { - display = GDK.gdk_window_get_display (window); - } else { - window = GDK.gdk_get_default_root_window (); - display = GDK.gdk_window_get_display (window); - } - long /*int*/ pointer = GDK.gdk_get_pointer(display); - return GDK.gdk_window_get_device_position(window, pointer, x, y, mask); -} - -long /*int*/ gdk_surface_get_device_position (long /*int*/ surface, int[] x, int[] y, int[] mask) { - long /*int*/ display = 0; - if (surface != 0) { - display = GDK.gdk_surface_get_display (surface); - } - long /*int*/ pointer = GDK.gdk_get_pointer(display); - return GDK.gdk_surface_get_device_position(surface, pointer, x, y, mask); -} - void gtk_cell_renderer_get_preferred_size (long /*int*/ cell, long /*int*/ widget, int[] width, int[] height) { GtkRequisition minimum_size = new GtkRequisition (); GTK.gtk_cell_renderer_get_preferred_size (cell, widget, minimum_size, null); |