diff options
| author | Grace Yoder <grace_yoder@outlook.com> | 2026-06-24 17:48:16 -0600 |
|---|---|---|
| committer | Grace Yoder <grace_yoder@outlook.com> | 2026-06-25 16:42:38 -0600 |
| commit | d7feea3f86358bea2fc3c2c15875706183530d58 (patch) | |
| tree | ff7df8cc72dc42abdd67bd1ede3de07d89031b1e /src/main.zig | |
| parent | bcf298696b1a6b691cf15fc8023ac9c4a15bfe85 (diff) | |
refactor: split OSC52 off into different interface
Diffstat (limited to 'src/main.zig')
| -rw-r--r-- | src/main.zig | 54 |
1 files changed, 7 insertions, 47 deletions
diff --git a/src/main.zig b/src/main.zig index cd716ab..5c1a339 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,5 +1,6 @@ const std = @import("std"); const File = std.Io.File; +const Clip = @import("Clip.zig"); pub fn main(init: std.process.Init) !void { const io = init.io; @@ -14,67 +15,26 @@ pub fn main(init: std.process.Init) !void { // We want to avoid doing as many allocations as possible so having raw // pages with it being larger should be totally fine - const alloc = std.heap.page_allocator; + var clip = try Clip.OSC52.init(std.heap.page_allocator, init.io, std.heap.pageSize()); var buf: [4096]u8 = undefined; - var copy_index: u8 = 0; - - var encoded_buffer = try std.ArrayList(u8).initCapacity(alloc, std.heap.pageSize()); - var encoder = std.base64.Base64Encoder.init(std.base64.standard_alphabet_chars, null); - while (true) { // Read as much of stdin there is - const bytes = File.stdin().readStreaming(io, &.{buf[copy_index..]}) catch |err| { + const bytes = File.stdin().readStreaming(io, &.{&buf}) catch |err| { if (err == File.ReadStreamingError.EndOfStream) { break; } else { return err; } }; - const length = copy_index + bytes; - // Passthrough to stdout - _ = try File.stdout().writeStreamingAll(io, buf[copy_index..length]); - - // Base64 encode - const chunkable_length = length - (length % 3); - var chunker = std.mem.window(u8, buf[0..chunkable_length], 3, 3); - while (chunker.next()) |chunk| { - var temp: [5]u8 = undefined; - const s = encoder.encode(&temp, chunk); - try encoded_buffer.appendSlice(alloc, s); - } + _ = try File.stdout().writeStreamingAll(io, buf[0..bytes]); - // Move left over bits to the start of the array - copy_index = @intCast(length - chunkable_length); - if (copy_index != 0) { - @memmove(buf[0..copy_index], buf[chunkable_length..length]); - } + // Write to clip + try clip.writeCopyBuffer(buf[0..bytes]); } - // Encode last bytes - var temp: [5]u8 = undefined; - const s = encoder.encode(&temp, buf[0..copy_index]); - try encoded_buffer.appendSlice(alloc, s); - // OSC 52 Copying — written as one contiguous buffer so the terminal - // receives the complete sequence in a single write. - // https://ghostty.org/docs/vt/osc/52 - const osc_header = &[_]u8{ - 0x1b, // ESC - 0x5d, // ']' - 0x35, 0x32, // Code 52 - 0x3b, // ';' - // 0x70, // 'p' Primary Clipboard - 0x63, // 'c' Standard Clipboard - 0x3b, // ';' - }; - const osc_footer = &[_]u8{ - 0x1b, // ESC - 0x5c, // '\' - }; + try clip.writePasteboard(); - _ = try File.stdout().writeStreamingAll(io, osc_header); - _ = try File.stdout().writeStreamingAll(io, encoded_buffer.items); - _ = try File.stdout().writeStreamingAll(io, osc_footer); std.debug.print("\x1b[0;32mCopied To Pasteboard!\x1b[0m\n", .{}); } |
