Skip to content

Commit 6abf225

Browse files
committed
[Gtk4] Fix Shell.computeSize to take header bar into account
HeaderBar is part of the regular window size in Gtk 4 on Wayland BUT gtk_window_get_headerbar returns 0 if it is not set by the application but drawn internally by Gtk itself and thus it's size can not be queried. Add a "default" GtkHeaderBar explicitly for that and take its size into account when computing Shell size.
1 parent 8b67970 commit 6abf225

File tree

4 files changed

+84
-0
lines changed

4 files changed

+84
-0
lines changed

bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk4.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1844,6 +1844,18 @@ JNIEXPORT jlong JNICALL GTK4_NATIVE(gtk_1gesture_1zoom_1new)
18441844
}
18451845
#endif
18461846

1847+
#ifndef NO_gtk_1header_1bar_1new
1848+
JNIEXPORT jlong JNICALL GTK4_NATIVE(gtk_1header_1bar_1new)
1849+
(JNIEnv *env, jclass that)
1850+
{
1851+
jlong rc = 0;
1852+
GTK4_NATIVE_ENTER(env, that, gtk_1header_1bar_1new_FUNC);
1853+
rc = (jlong)gtk_header_bar_new();
1854+
GTK4_NATIVE_EXIT(env, that, gtk_1header_1bar_1new_FUNC);
1855+
return rc;
1856+
}
1857+
#endif
1858+
18471859
#ifndef NO_gtk_1hsv_1to_1rgb
18481860
JNIEXPORT void JNICALL GTK4_NATIVE(gtk_1hsv_1to_1rgb)
18491861
(JNIEnv *env, jclass that, jfloat arg0, jfloat arg1, jfloat arg2, jfloatArray arg3, jfloatArray arg4, jfloatArray arg5)
@@ -2509,6 +2521,18 @@ JNIEXPORT jlong JNICALL GTK4_NATIVE(gtk_1widget_1get_1first_1child)
25092521
}
25102522
#endif
25112523

2524+
#ifndef NO_gtk_1widget_1get_1height
2525+
JNIEXPORT jint JNICALL GTK4_NATIVE(gtk_1widget_1get_1height)
2526+
(JNIEnv *env, jclass that, jlong arg0)
2527+
{
2528+
jint rc = 0;
2529+
GTK4_NATIVE_ENTER(env, that, gtk_1widget_1get_1height_FUNC);
2530+
rc = (jint)gtk_widget_get_height((GtkWidget *)arg0);
2531+
GTK4_NATIVE_EXIT(env, that, gtk_1widget_1get_1height_FUNC);
2532+
return rc;
2533+
}
2534+
#endif
2535+
25122536
#ifndef NO_gtk_1widget_1get_1last_1child
25132537
JNIEXPORT jlong JNICALL GTK4_NATIVE(gtk_1widget_1get_1last_1child)
25142538
(JNIEnv *env, jclass that, jlong arg0)
@@ -2598,6 +2622,18 @@ JNIEXPORT void JNICALL GTK4_NATIVE(gtk_1widget_1get_1size_1request)
25982622
}
25992623
#endif
26002624

2625+
#ifndef NO_gtk_1widget_1get_1width
2626+
JNIEXPORT jint JNICALL GTK4_NATIVE(gtk_1widget_1get_1width)
2627+
(JNIEnv *env, jclass that, jlong arg0)
2628+
{
2629+
jint rc = 0;
2630+
GTK4_NATIVE_ENTER(env, that, gtk_1widget_1get_1width_FUNC);
2631+
rc = (jint)gtk_widget_get_width((GtkWidget *)arg0);
2632+
GTK4_NATIVE_EXIT(env, that, gtk_1widget_1get_1width_FUNC);
2633+
return rc;
2634+
}
2635+
#endif
2636+
26012637
#ifndef NO_gtk_1widget_1insert_1after
26022638
JNIEXPORT void JNICALL GTK4_NATIVE(gtk_1widget_1insert_1after)
26032639
(JNIEnv *env, jclass that, jlong arg0, jlong arg1, jlong arg2)
@@ -2843,6 +2879,16 @@ JNIEXPORT void JNICALL GTK4_NATIVE(gtk_1window_1set_1icon_1name)
28432879
}
28442880
#endif
28452881

2882+
#ifndef NO_gtk_1window_1set_1titlebar
2883+
JNIEXPORT void JNICALL GTK4_NATIVE(gtk_1window_1set_1titlebar)
2884+
(JNIEnv *env, jclass that, jlong arg0, jlong arg1)
2885+
{
2886+
GTK4_NATIVE_ENTER(env, that, gtk_1window_1set_1titlebar_FUNC);
2887+
gtk_window_set_titlebar((GtkWindow *)arg0, (GtkWidget *)arg1);
2888+
GTK4_NATIVE_EXIT(env, that, gtk_1window_1set_1titlebar_FUNC);
2889+
}
2890+
#endif
2891+
28462892
#ifndef NO_gtk_1window_1unminimize
28472893
JNIEXPORT void JNICALL GTK4_NATIVE(gtk_1window_1unminimize)
28482894
(JNIEnv *env, jclass that, jlong arg0)

bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/gtk4_stats.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ typedef enum {
151151
gtk_1gesture_1rotate_1new_FUNC,
152152
gtk_1gesture_1set_1sequence_1state_FUNC,
153153
gtk_1gesture_1zoom_1new_FUNC,
154+
gtk_1header_1bar_1new_FUNC,
154155
gtk_1hsv_1to_1rgb_FUNC,
155156
gtk_1icon_1paintable_1get_1file_FUNC,
156157
gtk_1icon_1theme_1get_1for_1display_FUNC,
@@ -204,13 +205,15 @@ typedef enum {
204205
gtk_1widget_1class_1add_1binding_1signal_FUNC,
205206
gtk_1widget_1get_1clipboard_FUNC,
206207
gtk_1widget_1get_1first_1child_FUNC,
208+
gtk_1widget_1get_1height_FUNC,
207209
gtk_1widget_1get_1last_1child_FUNC,
208210
gtk_1widget_1get_1native_FUNC,
209211
gtk_1widget_1get_1next_1sibling_FUNC,
210212
gtk_1widget_1get_1prev_1sibling_FUNC,
211213
gtk_1widget_1get_1receives_1default_FUNC,
212214
gtk_1widget_1get_1root_FUNC,
213215
gtk_1widget_1get_1size_1request_FUNC,
216+
gtk_1widget_1get_1width_FUNC,
214217
gtk_1widget_1insert_1after_FUNC,
215218
gtk_1widget_1insert_1before_FUNC,
216219
gtk_1widget_1measure_FUNC,
@@ -232,5 +235,6 @@ typedef enum {
232235
gtk_1window_1set_1child_FUNC,
233236
gtk_1window_1set_1default_1widget_FUNC,
234237
gtk_1window_1set_1icon_1name_FUNC,
238+
gtk_1window_1set_1titlebar_FUNC,
235239
gtk_1window_1unminimize_FUNC,
236240
} GTK4_FUNCS;

bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk4/GTK4.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,11 @@ public class GTK4 {
464464
/** @param window cast=(GtkWindow *) */
465465
public static final native long gtk_window_get_titlebar(long window);
466466

467+
/** @param window cast=(GtkWindow *)
468+
* @param titlebar cast=(GtkWidget *)
469+
**/
470+
public static final native void gtk_window_set_titlebar(long window, long titlebar);
471+
467472
/** @param window cast=(GtkWindow *) */
468473
public static final native void gtk_window_present(long window) ;
469474

@@ -1064,4 +1069,16 @@ public class GTK4 {
10641069
*/
10651070
public static final native long gtk_gesture_get_last_updated_sequence(long gesture);
10661071

1072+
/**
1073+
* @param widget cast=(GtkWidget *)
1074+
*/
1075+
public static final native int gtk_widget_get_width(long widget);
1076+
1077+
/**
1078+
* @param widget cast=(GtkWidget *)
1079+
*/
1080+
public static final native int gtk_widget_get_height(long widget);
1081+
1082+
public static final native long gtk_header_bar_new();
1083+
10671084
}

bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Shell.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,14 @@ Rectangle computeTrimInPixels (int x, int y, int width, int height) {
728728
trim.y -= menuBarHeight;
729729
trim.height += menuBarHeight;
730730
}
731+
if (GTK.GTK4 && OS.isWayland()) {
732+
long titlebar = GTK4.gtk_window_get_titlebar(shellHandle);
733+
if (titlebar != 0) {
734+
int titleBarHeight = GTK4.gtk_widget_get_height (titlebar);
735+
trim.y -= titleBarHeight;
736+
trim.height += titleBarHeight;
737+
}
738+
}
731739
return trim;
732740
}
733741

@@ -743,6 +751,15 @@ void createHandle (int index) {
743751
if (GTK.GTK4) {
744752
// TODO: GTK4 need to handle for GTK_WINDOW_POPUP type
745753
shellHandle = GTK4.gtk_window_new();
754+
if (OS.isWayland()) {
755+
long headerbar = GTK4.gtk_window_get_titlebar(shellHandle);
756+
if (headerbar == 0) {
757+
// Force-install a headerbar if none exists in order to be able to qurey its size later
758+
// If none set by the app gtk_window_get_titlebar returns 0 but Gtk still draws one internally
759+
long hb = GTK4.gtk_header_bar_new();
760+
GTK4.gtk_window_set_titlebar(shellHandle, hb);
761+
}
762+
}
746763
} else {
747764
shellHandle = GTK3.gtk_window_new(type);
748765
}

0 commit comments

Comments
 (0)