Leah Amelia Chen 5fa737834b gtk(wayland): prevent gtk4-layer-shell crash on old versions
Supersedes #7154

In gtk4-layer-shell versions < 1.0.4, the app could crash upon opening
a quick terminal window on certain compositors that implement the
`xdg_wm_dialog_v1` protocol. The exact reason is a bit complicated,
but is nicely summarized in the upstream issue (wmww/gtk4-layer-shell#50).

The circumstances that could cause this crash to occur should gradually
diminish as distros update to newer gtk4-layer-shell versions, but this
is known to crash on Fedora 41 and Hyprland, which could be a sizable
chunk of our userbase given that this would also occur on GNOME/Mutter
and KDE/KWin. The diff should be minimal enough that this can be removed
or reverted once this band-aid fix is no longer necessary.
2025-06-28 16:41:19 +02:00

67 lines
2.0 KiB
Zig

const std = @import("std");
const c = @cImport({
@cInclude("gtk4-layer-shell.h");
});
const gtk = @import("gtk");
pub const ShellLayer = enum(c_uint) {
background = c.GTK_LAYER_SHELL_LAYER_BACKGROUND,
bottom = c.GTK_LAYER_SHELL_LAYER_BOTTOM,
top = c.GTK_LAYER_SHELL_LAYER_TOP,
overlay = c.GTK_LAYER_SHELL_LAYER_OVERLAY,
};
pub const ShellEdge = enum(c_uint) {
left = c.GTK_LAYER_SHELL_EDGE_LEFT,
right = c.GTK_LAYER_SHELL_EDGE_RIGHT,
top = c.GTK_LAYER_SHELL_EDGE_TOP,
bottom = c.GTK_LAYER_SHELL_EDGE_BOTTOM,
};
pub const KeyboardMode = enum(c_uint) {
none = c.GTK_LAYER_SHELL_KEYBOARD_MODE_NONE,
exclusive = c.GTK_LAYER_SHELL_KEYBOARD_MODE_EXCLUSIVE,
on_demand = c.GTK_LAYER_SHELL_KEYBOARD_MODE_ON_DEMAND,
};
pub fn isSupported() bool {
return c.gtk_layer_is_supported() != 0;
}
pub fn getProtocolVersion() c_uint {
return c.gtk_layer_get_protocol_version();
}
pub fn getLibraryVersion() std.SemanticVersion {
return .{
.major = c.gtk_layer_get_major_version(),
.minor = c.gtk_layer_get_minor_version(),
.patch = c.gtk_layer_get_micro_version(),
};
}
pub fn initForWindow(window: *gtk.Window) void {
c.gtk_layer_init_for_window(@ptrCast(window));
}
pub fn setLayer(window: *gtk.Window, layer: ShellLayer) void {
c.gtk_layer_set_layer(@ptrCast(window), @intFromEnum(layer));
}
pub fn setAnchor(window: *gtk.Window, edge: ShellEdge, anchor_to_edge: bool) void {
c.gtk_layer_set_anchor(@ptrCast(window), @intFromEnum(edge), @intFromBool(anchor_to_edge));
}
pub fn setMargin(window: *gtk.Window, edge: ShellEdge, margin_size: c_int) void {
c.gtk_layer_set_margin(@ptrCast(window), @intFromEnum(edge), margin_size);
}
pub fn setKeyboardMode(window: *gtk.Window, mode: KeyboardMode) void {
c.gtk_layer_set_keyboard_mode(@ptrCast(window), @intFromEnum(mode));
}
pub fn setNamespace(window: *gtk.Window, name: [:0]const u8) void {
c.gtk_layer_set_namespace(@ptrCast(window), name.ptr);
}