diff options
| author | Can Celik <ogulcancelik@gmail.com> | 2026-09-10 21:51:57 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-09-10 21:51:57 +0300 |
| commit | 425c86179791cd32e2d4ce0ae7f269940b4b0663 (patch) | |
| tree | e52c4383a6d69216cbe2a32638bf90841d7e2189 /vendor/libghostty-vt/src/os/args.zig | |
| parent | 90e947a6e26e02f10ec7f1694c4eb5b78a86406b (diff) | |
chore: upgrade libghostty and preserve terminal behavior (#3906)
Diffstat (limited to 'vendor/libghostty-vt/src/os/args.zig')
| -rw-r--r-- | vendor/libghostty-vt/src/os/args.zig | 130 |
1 files changed, 0 insertions, 130 deletions
diff --git a/vendor/libghostty-vt/src/os/args.zig b/vendor/libghostty-vt/src/os/args.zig deleted file mode 100644 index 9ef5bba4..00000000 --- a/vendor/libghostty-vt/src/os/args.zig +++ /dev/null @@ -1,130 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const Allocator = std.mem.Allocator; -const objc = @import("objc"); -const macos = @import("macos"); - -/// Returns an iterator over the command line arguments. This may or may -/// not allocate depending on the platform. -/// -/// For Zig-aware readers: this is the same as std.process.argsWithAllocator -/// but handles macOS using NSProcessInfo instead of libc argc/argv. -pub fn iterator(allocator: Allocator) ArgIterator.InitError!ArgIterator { - //if (true) return try std.process.argsWithAllocator(allocator); - return .initWithAllocator(allocator); -} - -/// Duck-typed to std.process.ArgIterator -pub const ArgIterator = switch (builtin.os.tag) { - .macos => IteratorMacOS, - else => std.process.ArgIterator, -}; - -/// This is an ArgIterator (duck-typed for std.process.ArgIterator) for -/// NSApplicationMain-based applications on macOS. It uses NSProcessInfo to -/// get the command line arguments since libc argc/argv pointers are not -/// valid. -/// -/// I believe this should work for all macOS applications even if -/// NSApplicationMain is not used, but I haven't tested that so I'm not -/// sure. If/when libghostty is ever used outside of NSApplicationMain -/// then we can revisit this. -const IteratorMacOS = struct { - alloc: Allocator, - index: usize, - count: usize, - buf: [:0]u8, - args: objc.Object, - - pub const InitError = Allocator.Error; - - pub fn initWithAllocator(alloc: Allocator) InitError!IteratorMacOS { - const NSProcessInfo = objc.getClass("NSProcessInfo").?; - const info = NSProcessInfo.msgSend(objc.Object, objc.sel("processInfo"), .{}); - const args = info.getProperty(objc.Object, "arguments"); - errdefer args.release(); - - // Determine our maximum length so we can allocate the buffer to - // fit all values. - var max: usize = 0; - const count: usize = @intCast(args.getProperty(c_ulong, "count")); - for (0..count) |i| { - const nsstr = args.msgSend( - objc.Object, - objc.sel("objectAtIndex:"), - .{@as(c_ulong, @intCast(i))}, - ); - - const maxlen: usize = @intCast(nsstr.msgSend( - c_ulong, - objc.sel("maximumLengthOfBytesUsingEncoding:"), - .{@as(c_ulong, 4)}, - )); - - max = @max(max, maxlen); - } - - // Allocate our buffer. We add 1 for the null terminator. - const buf = try alloc.allocSentinel(u8, max, 0); - errdefer alloc.free(buf); - - return .{ - .alloc = alloc, - .index = 0, - .count = count, - .buf = buf, - .args = args, - }; - } - - pub fn deinit(self: *IteratorMacOS) void { - self.alloc.free(self.buf); - - // Note: we don't release self.args because it is a pointer copy - // not a retained object. - } - - pub fn next(self: *IteratorMacOS) ?[:0]const u8 { - if (self.index == self.count) return null; - - // NSString. No release because not a copy. - const nsstr = self.args.msgSend( - objc.Object, - objc.sel("objectAtIndex:"), - .{@as(c_ulong, @intCast(self.index))}, - ); - self.index += 1; - - // Convert to string using getCString. Our buffer should always - // be big enough because we precomputed the maximum length. - if (!nsstr.msgSend( - bool, - objc.sel("getCString:maxLength:encoding:"), - .{ - @as([*]u8, @ptrCast(self.buf.ptr)), - @as(c_ulong, @intCast(self.buf.len)), - @as(c_ulong, 4), // NSUTF8StringEncoding - }, - )) { - // This should never happen... if it does, we just return empty. - return ""; - } - - return std.mem.sliceTo(self.buf, 0); - } - - pub fn skip(self: *IteratorMacOS) bool { - if (self.index == self.count) return false; - self.index += 1; - return true; - } -}; - -test "args" { - const testing = std.testing; - const alloc = testing.allocator; - - var iter = try iterator(alloc); - defer iter.deinit(); - try testing.expect(iter.next().?.len > 0); -} |
