diff --git a/src/Core.zig b/src/Core.zig index e275ceb0..391277a7 100644 --- a/src/Core.zig +++ b/src/Core.zig @@ -87,6 +87,10 @@ pub fn setMouseCursor(core: *Core, cursor: enums.MouseCursor) !void { try core.internal.setMouseCursor(cursor); } +pub fn setCursorMode(core: *Core, mode: enums.CursorMode) !void { + try core.internal.setCursorMode(mode); +} + pub fn hasEvent(core: *Core) bool { return core.internal.hasEvent(); } diff --git a/src/enums.zig b/src/enums.zig index dfa3f316..668dc026 100644 --- a/src/enums.zig +++ b/src/enums.zig @@ -33,6 +33,19 @@ pub const MouseCursor = enum { not_allowed, }; +pub const CursorMode = enum { + /// Makes the cursor visible and behaving normally. + normal, + + /// Makes the cursor invisible when it is over the content area of the window but does not + /// restrict it from leaving. + hidden, + + /// Hides and grabs the cursor, providing virtual and unlimited cursor movement. This is useful + /// for implementing for example 3D camera controls. + disabled, +}; + pub const MouseButton = enum { left, right, diff --git a/src/platform.zig b/src/platform.zig index 8d242ffb..d3cc3ccb 100644 --- a/src/platform.zig +++ b/src/platform.zig @@ -20,6 +20,7 @@ fn Interface(comptime T: type) type { assertHasDecl(T.Platform, "getFramebufferSize"); assertHasDecl(T.Platform, "getWindowSize"); assertHasDecl(T.Platform, "setMouseCursor"); + assertHasDecl(T.Platform, "setCursorMode"); assertHasDecl(T.Platform, "hasEvent"); assertHasDecl(T.Platform, "pollEvent"); assertHasDecl(T.BackingTimer, "start"); diff --git a/src/platform/native.zig b/src/platform/native.zig index 7918d310..6d67abe7 100644 --- a/src/platform/native.zig +++ b/src/platform/native.zig @@ -374,6 +374,15 @@ pub const Platform = struct { } } + pub fn setCursorMode(platform: *Platform, mode: enums.CursorMode) !void { + const glfw_mode: glfw.Window.InputModeCursor = switch (mode) { + .normal => .normal, + .hidden => .hidden, + .disabled => .disabled, + }; + try platform.window.setInputModeCursor(glfw_mode); + } + pub fn hasEvent(platform: *Platform) bool { return platform.events.first != null; } diff --git a/src/platform/wasm.zig b/src/platform/wasm.zig index 4d515fc4..a03c357a 100644 --- a/src/platform/wasm.zig +++ b/src/platform/wasm.zig @@ -123,6 +123,10 @@ pub const Platform = struct { js.machSetMouseCursor(cursor_name.ptr, cursor_name.len); } + pub fn setCursorMode(_: *Platform, _: enums.CursorMode) !void { + @panic("TODO: Implement setCursorMode for wasm"); + } + fn pollChanges(platform: *Platform) void { const change_type = js.machChangeShift();