diff --git a/glfw/src/Window.zig b/glfw/src/Window.zig index a1879afb..2b212390 100644 --- a/glfw/src/Window.zig +++ b/glfw/src/Window.zig @@ -430,6 +430,37 @@ pub inline fn setSizeLimits(self: Window, min: Size, max: Size) Error!void { try getError(); } +/// Sets the aspect ratio of the specified window. +/// +/// This function sets the required aspect ratio of the content area of the specified window. If +/// the window is full screen, the aspect ratio only takes effect once it is made windowed. If the +/// window is not resizable, this function does nothing. +/// +/// The aspect ratio is specified as a numerator and a denominator and both values must be greater +/// than zero. For example, the common 16:9 aspect ratio is specified as 16 and 9, respectively. +/// +/// If the numerator AND denominator is set to `glfw.dont_care` then the aspect ratio limit is +/// disabled. +/// +/// The aspect ratio is applied immediately to a windowed mode window and may cause it to be +/// resized. +/// +/// Possible errors include glfw.Error.NotInitialized, glfw.Error.InvalidValue and +/// glfw.Error.PlatformError. +/// +/// If you set size limits and an aspect ratio that conflict, the results are undefined. +/// +/// wayland: The aspect ratio will not be applied until the window is actually resized, either by +/// the user or by the compositor. +/// +/// @thread_safety This function must only be called from the main thread. +/// +/// see also: window_sizelimits, glfw.Window.setSizeLimits +pub inline fn setAspectRatio(self: Window, numerator: usize, denominator: usize) Error!void { + c.glfwSetWindowAspectRatio(self.handle, @intCast(c_int, numerator), @intCast(c_int, denominator)); + try getError(); +} + test "defaultHints" { const glfw = @import("main.zig"); try glfw.init(); @@ -599,3 +630,19 @@ test "setSizeLimits" { .{ .width = 1080, .height = 1920 }, ); } + +test "setAspectRatio" { + const glfw = @import("main.zig"); + try glfw.init(); + defer glfw.terminate(); + + const window = glfw.Window.create(640, 480, "Hello, Zig!", null, null) catch |err| { + // return without fail, because most of our CI environments are headless / we cannot open + // windows on them. + std.debug.print("note: failed to create window: {}\n", .{err}); + return; + }; + defer window.destroy(); + + try window.setAspectRatio(4, 3); +}