diff --git a/build.zig b/build.zig index bc7da3d..fc5ee9f 100644 --- a/build.zig +++ b/build.zig @@ -30,19 +30,21 @@ pub fn build(b: *Build) !void { } else { try buildNative(b, target, optimize, dep_sokol, dep_cimgui); } + + try buildTui(b, target, optimize); } fn buildNative(b: *Build, target: ResolvedTarget, optimize: OptimizeMode, dep_sokol: *Dependency, dep_cimgui: *Dependency) !void { const demo = b.addExecutable(.{ .name = "demo", - .root_source_file = b.path("src/main.zig"), + .root_source_file = b.path("src/gui/main.zig"), .target = target, .optimize = optimize, }); demo.root_module.addImport("sokol", dep_sokol.module("sokol")); demo.root_module.addImport("cimgui", dep_cimgui.module("cimgui")); b.installArtifact(demo); - b.step("run", "Run demo").dependOn(&b.addRunArtifact(demo).step); + b.step("run-gui", "Run demo").dependOn(&b.addRunArtifact(demo).step); } fn buildWasm(b: *Build, target: ResolvedTarget, optimize: OptimizeMode, dep_sokol: *Dependency, dep_cimgui: *Dependency) !void { @@ -50,7 +52,7 @@ fn buildWasm(b: *Build, target: ResolvedTarget, optimize: OptimizeMode, dep_soko // needs to be linked in a separate build step with the Emscripten linker const demo = b.addStaticLibrary(.{ .name = "demo", - .root_source_file = b.path("src/main.zig"), + .root_source_file = b.path("src/gui/main.zig"), .target = target, .optimize = optimize, }); @@ -86,5 +88,20 @@ fn buildWasm(b: *Build, target: ResolvedTarget, optimize: OptimizeMode, dep_soko // ...and a special run step to start the web build output via 'emrun' const run = sokol.emRunStep(b, .{ .name = "demo", .emsdk = dep_emsdk }); run.step.dependOn(&link_step.step); - b.step("run", "Run demo").dependOn(&run.step); + b.step("run-gui", "Run demo").dependOn(&run.step); +} + +fn buildTui(b: *Build, target: ResolvedTarget, optimize: OptimizeMode) !void { + const tui = b.addExecutable(.{ + .name = "demo", + .root_source_file = b.path("src/tui/main.zig"), + .target = target, + .optimize = optimize, + }); + + tui.linkLibC(); + tui.linkSystemLibrary("notcurses"); + + b.installArtifact(tui); + b.step("run-tui", "Run TUI").dependOn(&b.addRunArtifact(tui).step); } diff --git a/flake.nix b/flake.nix index dae3e4a..4b66ee7 100644 --- a/flake.nix +++ b/flake.nix @@ -12,8 +12,10 @@ zls ]; buildInputs = [ - alsa-lib lldb + + # GUI + alsa-lib xorg.libX11 xorg.libXcursor xorg.libXi @@ -22,6 +24,9 @@ xorg.libXinerama libGL libGLU + + # TUI + notcurses ]; }; }; diff --git a/justfile b/justfile index 112626b..6e63522 100644 --- a/justfile +++ b/justfile @@ -2,6 +2,8 @@ alias b := build build: zig build -alias r := run -run: - zig build run +gui: + zig build run-gui + +tui: + zig build run-tui diff --git a/src/main.zig b/src/gui/main.zig similarity index 100% rename from src/main.zig rename to src/gui/main.zig diff --git a/src/tui/main.zig b/src/tui/main.zig new file mode 100644 index 0000000..519ee97 --- /dev/null +++ b/src/tui/main.zig @@ -0,0 +1,21 @@ +const std = @import("std"); +const nc = @cImport({ + @cInclude("notcurses/notcurses.h"); +}); + +pub fn main() !void { + const stdout = std.io.getStdOut().writer(); + try stdout.print("Hello, {s}!\n", .{"world"}); + + var nc_opts = nc.notcurses_options{ + .termtype = null, + .loglevel = nc.NCLOGLEVEL_SILENT, + .margin_t = 0, + .margin_r = 0, + .margin_b = 0, + .margin_l = 0, + .flags = 0, + }; + const ncs: *nc.notcurses = (nc.notcurses_core_init(&nc_opts, null) orelse @panic("notcurses_core_init() failed")); + defer _ = nc.notcurses_stop(ncs); +}