From fbfa8ee8d65a5a62829368e78ecf7ddede81efac Mon Sep 17 00:00:00 2001 From: David Allemang Date: Thu, 27 Jun 2024 11:58:18 -0400 Subject: [PATCH] support drop event --- src/au.zig | 32 ++++++++++++++++---------------- src/au/Bus.zig | 40 +++++++++++++++++++++++++++++----------- src/main.zig | 22 ++++++++++++++-------- 3 files changed, 59 insertions(+), 35 deletions(-) diff --git a/src/au.zig b/src/au.zig index a21adc6..168926f 100644 --- a/src/au.zig +++ b/src/au.zig @@ -4,7 +4,7 @@ const builtin = @import("builtin"); const vk = @import("vk"); const c = @import("c.zig"); -const EventBus = @import("au/EventBus.zig"); +const Bus = @import("au/Bus.zig"); pub const use_debug_messenger = switch (builtin.mode) { .Debug, .ReleaseSafe => true, @@ -63,7 +63,7 @@ var _qp: QueueProxy = undefined; var _instance: vk.Instance = undefined; var _window: Window = undefined; -var _events: EventBus = undefined; +var _bus: Bus = undefined; var _device: vk.Device = undefined; var _dconfig: CandidateDeviceInfo = undefined; var _queue: vk.Queue = undefined; @@ -428,31 +428,31 @@ pub const Window = struct { } }; -pub fn wait_events() []const EventBus.Event { - _events.clear(); +pub fn wait_events() []const Bus.Event { + _bus.clear(); c.glfwWaitEvents(); - return _events.events.items; + return _bus.events.items; } -pub fn poll_events() []const EventBus.Event { - _events.clear(); +pub fn poll_events() []const Bus.Event { + _bus.clear(); c.glfwPollEvents(); - return _events.events.items; + return _bus.events.items; } -pub fn wait_events_timeout(seconds: f64) []const EventBus.Event { - _events.clear(); +pub fn wait_events_timeout(seconds: f64) []const Bus.Event { + _bus.clear(); c.glfwWaitEventsTimeout(seconds); - return _events.events.items; + return _bus.events.items; } fn init_event_bus(alloc: std.mem.Allocator) !void { - _events = EventBus.init(alloc); - errdefer _events.deinit(); - try _events.connect(&_window); + _bus = Bus.init(alloc); + errdefer _bus.deinit(); + try _bus.connect(&_window); } fn deinit_event_bus() void { - try _events.disconnect(&_window); - _events.deinit(); + try _bus.disconnect(&_window); + _bus.deinit(); } diff --git a/src/au/Bus.zig b/src/au/Bus.zig index 95f0f90..5bd55c3 100644 --- a/src/au/Bus.zig +++ b/src/au/Bus.zig @@ -4,17 +4,20 @@ const Window = @import("../au.zig").Window; const Self = @This(); alloc: std.mem.Allocator, -events: std.ArrayListUnmanaged(Event), // todo bounded array? +events: std.ArrayListUnmanaged(Event) = .{}, // todo bounded array? +drops: std.ArrayListUnmanaged([][]const u8) = .{}, // todo bounded array? pub fn init(alloc: std.mem.Allocator) Self { return .{ .alloc = alloc, - .events = .{}, }; } pub fn deinit(self: *Self) void { + self.clear(); + self.events.deinit(self.alloc); + self.drops.deinit(self.alloc); } pub fn connect(self: *Self, window: *Window) !void { @@ -35,7 +38,7 @@ pub fn connect(self: *Self, window: *Window) !void { _ = c.glfwSetScrollCallback(window.handle, onScroll); _ = c.glfwSetKeyCallback(window.handle, onKey); _ = c.glfwSetCharModsCallback(window.handle, onCharMods); - // _ = c.glfwSetDropCallback(window.handle, onDrop); + _ = c.glfwSetDropCallback(window.handle, onDrop); } pub fn disconnect(_: *Self, window: *Window) !void { @@ -56,10 +59,18 @@ pub fn disconnect(_: *Self, window: *Window) !void { _ = c.glfwSetScrollCallback(window.handle, null); _ = c.glfwSetKeyCallback(window.handle, null); _ = c.glfwSetCharModsCallback(window.handle, null); - // _ = c.glfwSetDropCallback(window.handle, null); + _ = c.glfwSetDropCallback(window.handle, null); } pub fn clear(self: *Self) void { + for (self.drops.items) |drop| { + for (drop) |path| { + self.alloc.free(path); + } + self.alloc.free(drop); + } + self.drops.clearAndFree(self.alloc); + self.events.clearRetainingCapacity(); } @@ -99,7 +110,7 @@ pub const Event = union(enum) { mods: c_int, // todo bitmask }; const Drop = struct { - paths: []const []const u8, // todo lifetime issues + paths: []const []const u8, }; windowPos: WindowPos, @@ -249,9 +260,16 @@ fn onCharMods(handle: ?*c.GLFWwindow, code: c_uint, mods: c_int) callconv(.C) vo }, }) catch unreachable; // todo circular queue; warn } -// fn onDrop(handle: ?*c.GLFWwindow, count: c_int, paths: [*c][*c]const u8) callconv(.C) void { -// const bus = getBus(handle); -// bus.events.append(bus.alloc, .{ -// .drop = .{}, -// }) catch unreachable; // todo circular queue; warn -// } +fn onDrop(handle: ?*c.GLFWwindow, count: c_int, paths: [*c][*c]const u8) callconv(.C) void { + const bus = getBus(handle); + + const drops = bus.alloc.alloc([]const u8, @intCast(count)) catch unreachable; // todo warn + for (drops, paths) |*dst, src| { + dst.* = bus.alloc.dupe(u8, std.mem.sliceTo(src, 0)) catch unreachable; // todo warn + } + bus.drops.append(bus.alloc, drops) catch unreachable; // todo warn + + bus.events.append(bus.alloc, .{ + .drop = .{ .paths = drops }, + }) catch unreachable; // todo circular queue; warn +} diff --git a/src/main.zig b/src/main.zig index 1481741..40fb247 100644 --- a/src/main.zig +++ b/src/main.zig @@ -93,18 +93,24 @@ fn render( pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; - defer _ = gpa.deinit(); - const ally = gpa.allocator(); + defer _ = gpa.detectLeaks(); + const alloc = gpa.allocator(); - try au.init(ally); + try au.init(alloc); defer au.deinit(); - // std.debug.print("Initialized!!\n", .{ }); - while (!au.W.should_close()) { - for (au.wait_events()) |event| switch (event) { - .charMods => |e| std.debug.print("{any}\n", .{e}), - .mouseButton => |e| std.debug.print("{any}\n", .{e}), + // todo switch mode depending on if window is focused + const events = au.wait_events_timeout(0.10); + + for (events) |u| switch (u) { + .cursorPos, + .windowPos, + .windowSize, + .framebufferSize, + .windowRefresh, + => {}, + else => |e| std.debug.print("{any}\n", .{e}), }; }