mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-14 07:46:12 +03:00

This will be used for version checks that are independent of the version of GTK we built against.
81 lines
3.2 KiB
Zig
81 lines
3.2 KiB
Zig
const c = @import("c.zig").c;
|
|
|
|
/// Verifies that the GTK version is at least the given version.
|
|
///
|
|
/// This can be run in both a comptime and runtime context. If it
|
|
/// is run in a comptime context, it will only check the version
|
|
/// in the headers. If it is run in a runtime context, it will
|
|
/// check the actual version of the library we are linked against.
|
|
///
|
|
/// This function should be used in cases where the version check
|
|
/// would affect code generation, such as using symbols that are
|
|
/// only available beyond a certain version. For checks which only
|
|
/// depend on GTK's runtime behavior, use `runtimeAtLeast`.
|
|
///
|
|
/// This is inlined so that the comptime checks will disable the
|
|
/// runtime checks if the comptime checks fail.
|
|
pub inline fn atLeast(
|
|
comptime major: u16,
|
|
comptime minor: u16,
|
|
comptime micro: u16,
|
|
) bool {
|
|
// If our header has lower versions than the given version,
|
|
// we can return false immediately. This prevents us from
|
|
// compiling against unknown symbols and makes runtime checks
|
|
// very slightly faster.
|
|
if (comptime c.GTK_MAJOR_VERSION < major or
|
|
(c.GTK_MAJOR_VERSION == major and c.GTK_MINOR_VERSION < minor) or
|
|
(c.GTK_MAJOR_VERSION == major and c.GTK_MINOR_VERSION == minor and c.GTK_MICRO_VERSION < micro))
|
|
return false;
|
|
|
|
// If we're in comptime then we can't check the runtime version.
|
|
if (@inComptime()) return true;
|
|
|
|
return runtimeAtLeast(major, minor, micro);
|
|
}
|
|
|
|
/// Verifies that the GTK version at runtime is at least the given
|
|
/// version.
|
|
///
|
|
/// This function should be used in cases where the only the runtime
|
|
/// behavior is affected by the version check. For checks which would
|
|
/// affect code generation, use `atLeast`.
|
|
pub inline fn runtimeAtLeast(
|
|
comptime major: u16,
|
|
comptime minor: u16,
|
|
comptime micro: u16,
|
|
) bool {
|
|
// We use the functions instead of the constants such as
|
|
// c.GTK_MINOR_VERSION because the function gets the actual
|
|
// runtime version.
|
|
if (c.gtk_get_major_version() >= major) {
|
|
if (c.gtk_get_major_version() > major) return true;
|
|
if (c.gtk_get_minor_version() >= minor) {
|
|
if (c.gtk_get_minor_version() > minor) return true;
|
|
return c.gtk_get_micro_version() >= micro;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
test "atLeast" {
|
|
const std = @import("std");
|
|
const testing = std.testing;
|
|
|
|
const funs = &.{ atLeast, runtimeAtLeast };
|
|
inline for (funs) |fun| {
|
|
try testing.expect(fun(c.GTK_MAJOR_VERSION, c.GTK_MINOR_VERSION, c.GTK_MICRO_VERSION));
|
|
|
|
try testing.expect(!fun(c.GTK_MAJOR_VERSION, c.GTK_MINOR_VERSION, c.GTK_MICRO_VERSION + 1));
|
|
try testing.expect(!fun(c.GTK_MAJOR_VERSION, c.GTK_MINOR_VERSION + 1, c.GTK_MICRO_VERSION));
|
|
try testing.expect(!fun(c.GTK_MAJOR_VERSION + 1, c.GTK_MINOR_VERSION, c.GTK_MICRO_VERSION));
|
|
|
|
try testing.expect(fun(c.GTK_MAJOR_VERSION - 1, c.GTK_MINOR_VERSION, c.GTK_MICRO_VERSION));
|
|
try testing.expect(fun(c.GTK_MAJOR_VERSION - 1, c.GTK_MINOR_VERSION + 1, c.GTK_MICRO_VERSION));
|
|
try testing.expect(fun(c.GTK_MAJOR_VERSION - 1, c.GTK_MINOR_VERSION, c.GTK_MICRO_VERSION + 1));
|
|
|
|
try testing.expect(fun(c.GTK_MAJOR_VERSION, c.GTK_MINOR_VERSION - 1, c.GTK_MICRO_VERSION + 1));
|
|
}
|
|
}
|