diff --git a/pkg/macos/animation.zig b/pkg/macos/animation.zig new file mode 100644 index 000000000..af7405cd1 --- /dev/null +++ b/pkg/macos/animation.zig @@ -0,0 +1,6 @@ +pub const c = @import("animation/c.zig"); +pub usingnamespace @import("animation/layer.zig"); + +test { + @import("std").testing.refAllDecls(@This()); +} diff --git a/pkg/macos/animation/c.zig b/pkg/macos/animation/c.zig new file mode 100644 index 000000000..7cdcaf9bd --- /dev/null +++ b/pkg/macos/animation/c.zig @@ -0,0 +1,3 @@ +pub usingnamespace @cImport({ + @cInclude("QuartzCore/CALayer.h"); +}); diff --git a/pkg/macos/animation/layer.zig b/pkg/macos/animation/layer.zig new file mode 100644 index 000000000..dde7a5b66 --- /dev/null +++ b/pkg/macos/animation/layer.zig @@ -0,0 +1,2 @@ +/// https://developer.apple.com/documentation/quartzcore/calayer/contents_gravity_values?language=objc +pub extern "c" const kCAGravityTopLeft: *anyopaque; diff --git a/pkg/macos/build.zig b/pkg/macos/build.zig index 1a43c8daf..a9e3f6913 100644 --- a/pkg/macos/build.zig +++ b/pkg/macos/build.zig @@ -32,6 +32,7 @@ pub fn build(b: *std.Build) !void { lib.linkFramework("CoreGraphics"); lib.linkFramework("CoreText"); lib.linkFramework("CoreVideo"); + lib.linkFramework("QuartzCore"); if (target.result.os.tag == .macos) { lib.linkFramework("Carbon"); module.linkFramework("Carbon", .{}); @@ -42,6 +43,7 @@ pub fn build(b: *std.Build) !void { module.linkFramework("CoreGraphics", .{}); module.linkFramework("CoreText", .{}); module.linkFramework("CoreVideo", .{}); + module.linkFramework("QuartzCore", .{}); if (!target.query.isNative()) { try apple_sdk.addPaths(b, &lib.root_module); diff --git a/pkg/macos/main.zig b/pkg/macos/main.zig index 46071d55b..2b05f11ae 100644 --- a/pkg/macos/main.zig +++ b/pkg/macos/main.zig @@ -1,4 +1,5 @@ pub const foundation = @import("foundation.zig"); +pub const animation = @import("animation.zig"); pub const graphics = @import("graphics.zig"); pub const os = @import("os.zig"); pub const text = @import("text.zig"); diff --git a/src/renderer/Metal.zig b/src/renderer/Metal.zig index a0fd8ea00..2f938dad8 100644 --- a/src/renderer/Metal.zig +++ b/src/renderer/Metal.zig @@ -327,6 +327,10 @@ pub fn init(alloc: Allocator, options: renderer.Options) !Metal { if (comptime builtin.os.tag == .macos) { info.view.setProperty("layer", layer.value); info.view.setProperty("wantsLayer", true); + + // The layer gravity is set to top-left so that when we resize + // the view, the contents aren't stretched before a redraw. + layer.setProperty("contentsGravity", macos.animation.kCAGravityTopLeft); } // Ensure that our metal layer has a content scale set to match the