Split UI code into ly-ui library

Signed-off-by: AnErrupTion <anerruption@disroot.org>
This commit is contained in:
AnErrupTion committed 2026-03-17 21:44:33 +01:00
1 parent 93696a6b30
commit 64539f4342
34 files changed
+159 -97

No files matched your search

+2 -20
View File
@@ -72,36 +72,18 @@ pub fn build(b: *std.Build) !void {
.use_llvm = true,
});
const ly_core = b.dependency("ly_core", .{ .target = target, .optimize = optimize });
exe.root_module.addImport("ly-core", ly_core.module("ly-core"));
const zigini = b.dependency("zigini", .{ .target = target, .optimize = optimize });
exe.root_module.addImport("zigini", zigini.module("zigini"));
const ly_ui = b.dependency("ly_ui", .{ .target = target, .optimize = optimize });
exe.root_module.addImport("ly-ui", ly_ui.module("ly-ui"));
exe.root_module.addOptions("build_options", build_options);
const clap = b.dependency("clap", .{ .target = target, .optimize = optimize });
exe.root_module.addImport("clap", clap.module("clap"));
const termbox_dep = b.dependency("termbox2", .{
.target = target,
.optimize = optimize,
});
exe.linkSystemLibrary("pam");
if (enable_x11_support) exe.linkSystemLibrary("xcb");
exe.linkLibC();
const translate_c = b.addTranslateC(.{
.root_source_file = termbox_dep.path("termbox2.h"),
.target = target,
.optimize = optimize,
});
translate_c.defineCMacroRaw("TB_IMPL");
translate_c.defineCMacro("TB_OPT_ATTR_W", "32"); // Enable 24-bit color support + styling (32-bit)
const termbox2 = translate_c.addModule("termbox2");
exe.root_module.addImport("termbox2", termbox2);
b.installArtifact(exe);
const run_cmd = b.addRunArtifact(exe);
+2 -10
View File
@@ -4,21 +4,13 @@
.fingerprint = 0xa148ffcc5dc2cb59,
.minimum_zig_version = "0.15.0",
.dependencies = .{
.ly_core = .{
.path = "ly-core",
.ly_ui = .{
.path = "ly-ui",
},
.clap = .{
.url = "git+https://github.com/Hejsil/zig-clap#5289e0753cd274d65344bef1c114284c633536ea",
.hash = "clap-0.11.0-oBajB-HnAQDPCKYzwF7rO3qDFwRcD39Q0DALlTSz5H7e",
},
.zigini = .{
.url = "git+https://github.com/AnErrupTion/zigini?ref=zig-0.15.0#9281f47702b57779e831d7618e158abb8eb4d4a2",
.hash = "zigini-0.3.3-36M0FRJJAADZVq5HPm-hYKMpFFTr0OgjbEYcK2ijKZ5n",
},
.termbox2 = .{
.url = "git+https://github.com/AnErrupTion/termbox2?ref=master#496730697c662893eec43192f48ff616c2539da6",
.hash = "N-V-__8AAOEWBQDt5tNdIzIFY6n8DdZsCP-6MyLoNS20wgpA",
},
},
.paths = .{""},
}
File renamed without changes.
File renamed without changes.
+7
View File
@@ -0,0 +1,7 @@
pub const DisplayServer = enum {
wayland,
shell,
xinitrc,
x11,
custom,
};
+5 -1
View File
@@ -1,10 +1,14 @@
const std = @import("std");
const ini = @import("zigini");
pub const ini = @import("zigini");
pub const interop = @import("interop.zig");
pub const UidRange = @import("UidRange.zig");
pub const LogFile = @import("LogFile.zig");
pub const SharedError = @import("SharedError.zig");
pub const SavedUsers = @import("SavedUsers.zig");
pub const Environment = @import("Environment.zig");
pub const DisplayServer = @import("enums.zig").DisplayServer;
pub fn IniParser(comptime Struct: type) type {
return struct {
+37
View File
@@ -0,0 +1,37 @@
const std = @import("std");
pub fn build(b: *std.Build) void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const mod = b.addModule("ly-ui", .{
.root_source_file = b.path("src/root.zig"),
.target = target,
.optimize = optimize,
});
const ly_core = b.dependency("ly_core", .{ .target = target, .optimize = optimize });
mod.addImport("ly-core", ly_core.module("ly-core"));
const termbox_dep = b.dependency("termbox2", .{
.target = target,
.optimize = optimize,
});
const translate_c = b.addTranslateC(.{
.root_source_file = termbox_dep.path("termbox2.h"),
.target = target,
.optimize = optimize,
});
translate_c.defineCMacroRaw("TB_IMPL");
translate_c.defineCMacro("TB_OPT_ATTR_W", "32"); // Enable 24-bit color support + styling (32-bit)
const termbox2 = translate_c.addModule("termbox2");
mod.addImport("termbox2", termbox2);
const mod_tests = b.addTest(.{
.root_module = mod,
});
const run_mod_tests = b.addRunArtifact(mod_tests);
const test_step = b.step("test", "Run tests");
test_step.dependOn(&run_mod_tests.step);
}
+20
View File
@@ -0,0 +1,20 @@
.{
.name = .ly_ui,
.version = "1.0.0",
.fingerprint = 0x8d11bf85a74ec803,
.minimum_zig_version = "0.15.0",
.dependencies = .{
.ly_core = .{
.path = "../ly-core",
},
.termbox2 = .{
.url = "git+https://github.com/AnErrupTion/termbox2?ref=master#496730697c662893eec43192f48ff616c2539da6",
.hash = "N-V-__8AAOEWBQDt5tNdIzIFY6n8DdZsCP-6MyLoNS20wgpA",
},
},
.paths = .{
"build.zig",
"build.zig.zon",
"src",
},
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -1,7 +1,9 @@
const std = @import("std");
const Allocator = std.mem.Allocator;
const Environment = @import("../../Environment.zig");
const ly_core = @import("ly-core");
const Environment = ly_core.Environment;
const keyboard = @import("../keyboard.zig");
const TerminalBuffer = @import("../TerminalBuffer.zig");
const Widget = @import("../Widget.zig");
@@ -9,6 +11,7 @@ const generic = @import("generic.zig");
const UserList = @import("UserList.zig");
const Env = struct {
// TODO: Remove dependency on Environment
environment: Environment,
index: usize,
};
File renamed without changes.
@@ -1,7 +1,9 @@
const std = @import("std");
const Allocator = std.mem.Allocator;
const SavedUsers = @import("../../config/SavedUsers.zig");
const ly_core = @import("ly-core");
const SavedUsers = ly_core.SavedUsers;
const keyboard = @import("../keyboard.zig");
const TerminalBuffer = @import("../TerminalBuffer.zig");
const Widget = @import("../Widget.zig");
File renamed without changes.
File renamed without changes.
+16
View File
@@ -0,0 +1,16 @@
pub const ly_core = @import("ly-core");
pub const Cell = @import("Cell.zig");
pub const keyboard = @import("keyboard.zig");
pub const Position = @import("Position.zig");
pub const TerminalBuffer = @import("TerminalBuffer.zig");
pub const Widget = @import("Widget.zig");
pub const BigLabel = @import("components/BigLabel.zig");
pub const CenteredBox = @import("components/CenteredBox.zig");
pub const CyclableLabel = @import("components/generic.zig").CyclableLabel;
pub const InfoLine = @import("components/InfoLine.zig");
pub const Label = @import("components/Label.zig");
pub const Session = @import("components/Session.zig");
pub const Text = @import("components/Text.zig");
pub const UserList = @import("components/UserList.zig");
+4 -3
View File
@@ -1,9 +1,10 @@
const std = @import("std");
const math = std.math;
const Cell = @import("../tui/Cell.zig");
const TerminalBuffer = @import("../tui/TerminalBuffer.zig");
const Widget = @import("../tui/Widget.zig");
const ly_ui = @import("ly-ui");
const Cell = ly_ui.Cell;
const TerminalBuffer = ly_ui.TerminalBuffer;
const Widget = ly_ui.Widget;
const Cascade = @This();
+6 -5
View File
@@ -1,14 +1,15 @@
const std = @import("std");
const math = std.math;
const ly_core = @import("ly-core");
const ly_ui = @import("ly-ui");
const Cell = ly_ui.Cell;
const TerminalBuffer = ly_ui.TerminalBuffer;
const Widget = ly_ui.Widget;
const ly_core = ly_ui.ly_core;
const interop = ly_core.interop;
const TimeOfDay = interop.TimeOfDay;
const Cell = @import("../tui/Cell.zig");
const TerminalBuffer = @import("../tui/TerminalBuffer.zig");
const Widget = @import("../tui/Widget.zig");
const ColorMix = @This();
const Vec2 = @Vector(2, f32);
+6 -5
View File
@@ -1,14 +1,15 @@
const std = @import("std");
const Allocator = std.mem.Allocator;
const ly_core = @import("ly-core");
const ly_ui = @import("ly-ui");
const Cell = ly_ui.Cell;
const TerminalBuffer = ly_ui.TerminalBuffer;
const Widget = ly_ui.Widget;
const ly_core = ly_ui.ly_core;
const interop = ly_core.interop;
const TimeOfDay = interop.TimeOfDay;
const Cell = @import("../tui/Cell.zig");
const TerminalBuffer = @import("../tui/TerminalBuffer.zig");
const Widget = @import("../tui/Widget.zig");
const Doom = @This();
pub const STEPS = 12;
+8 -6
View File
@@ -4,18 +4,20 @@ const Json = std.json;
const eql = std.mem.eql;
const flate = std.compress.flate;
const ly_core = @import("ly-core");
const ly_ui = @import("ly-ui");
const Cell = ly_ui.Cell;
const TerminalBuffer = ly_ui.TerminalBuffer;
const Color = TerminalBuffer.Color;
const Styling = TerminalBuffer.Styling;
const Widget = ly_ui.Widget;
const ly_core = ly_ui.ly_core;
const interop = ly_core.interop;
const TimeOfDay = interop.TimeOfDay;
const LogFile = ly_core.LogFile;
const enums = @import("../enums.zig");
const DurOffsetAlignment = enums.DurOffsetAlignment;
const Cell = @import("../tui/Cell.zig");
const TerminalBuffer = @import("../tui/TerminalBuffer.zig");
const Color = TerminalBuffer.Color;
const Styling = TerminalBuffer.Styling;
const Widget = @import("../tui/Widget.zig");
fn read_decompress_file(allocator: Allocator, file_path: []const u8) ![]u8 {
const file_buffer = std.fs.cwd().openFile(file_path, .{}) catch {
+6 -5
View File
@@ -1,14 +1,15 @@
const std = @import("std");
const Allocator = std.mem.Allocator;
const ly_core = @import("ly-core");
const ly_ui = @import("ly-ui");
const Cell = ly_ui.Cell;
const TerminalBuffer = ly_ui.TerminalBuffer;
const Widget = ly_ui.Widget;
const ly_core = ly_ui.ly_core;
const interop = ly_core.interop;
const TimeOfDay = interop.TimeOfDay;
const Cell = @import("../tui/Cell.zig");
const TerminalBuffer = @import("../tui/TerminalBuffer.zig");
const Widget = @import("../tui/Widget.zig");
const GameOfLife = @This();
// Visual styles - using block characters like other animations
+6 -5
View File
@@ -2,14 +2,15 @@ const std = @import("std");
const Allocator = std.mem.Allocator;
const Random = std.Random;
const ly_core = @import("ly-core");
const ly_ui = @import("ly-ui");
const Cell = ly_ui.Cell;
const TerminalBuffer = ly_ui.TerminalBuffer;
const Widget = ly_ui.Widget;
const ly_core = ly_ui.ly_core;
const interop = ly_core.interop;
const TimeOfDay = interop.TimeOfDay;
const Cell = @import("../tui/Cell.zig");
const TerminalBuffer = @import("../tui/TerminalBuffer.zig");
const Widget = @import("../tui/Widget.zig");
pub const FRAME_DELAY: usize = 8;
// Characters change mid-scroll
+2 -3
View File
@@ -3,15 +3,14 @@ const Md5 = std.crypto.hash.Md5;
const builtin = @import("builtin");
const build_options = @import("build_options");
const ly_core = @import("ly-core");
const ly_core = @import("ly-ui").ly_core;
const interop = ly_core.interop;
const SharedError = ly_core.SharedError;
const LogFile = ly_core.LogFile;
const Environment = ly_core.Environment;
const utmp = interop.utmp;
const Utmp = utmp.utmpx;
const Environment = @import("Environment.zig");
pub const AuthOptions = struct {
tty: u8,
service_name: [:0]const u8,
+7 -6
View File
@@ -5,16 +5,17 @@
const std = @import("std");
var temporary_allocator = std.heap.page_allocator;
const ini = @import("zigini");
const ly_core = @import("ly-core");
const IniParser = ly_core.IniParser;
const TerminalBuffer = @import("../tui/TerminalBuffer.zig");
const ly_ui = @import("ly-ui");
const TerminalBuffer = ly_ui.TerminalBuffer;
const Color = TerminalBuffer.Color;
const Styling = TerminalBuffer.Styling;
const ly_core = ly_ui.ly_core;
const IniParser = ly_core.IniParser;
const SavedUsers = ly_core.SavedUsers;
const ini = ly_core.ini;
const Config = @import("Config.zig");
const OldSave = @import("OldSave.zig");
const SavedUsers = @import("SavedUsers.zig");
const color_properties = [_][]const u8{
"bg",
-8
View File
@@ -9,14 +9,6 @@ pub const Animation = enum {
dur_file,
};
pub const DisplayServer = enum {
wayland,
shell,
xinitrc,
x11,
custom,
};
pub const Input = enum {
info_line,
session,
+18 -18
View File
@@ -6,14 +6,29 @@ const builtin = @import("builtin");
const build_options = @import("build_options");
const clap = @import("clap");
const ini = @import("zigini");
const Ini = ini.Ini;
const ly_core = @import("ly-core");
const ly_ui = @import("ly-ui");
const Position = ly_ui.Position;
const BigLabel = ly_ui.BigLabel;
const CenteredBox = ly_ui.CenteredBox;
const InfoLine = ly_ui.InfoLine;
const Label = ly_ui.Label;
const Session = ly_ui.Session;
const Text = ly_ui.Text;
const UserList = ly_ui.UserList;
const TerminalBuffer = ly_ui.TerminalBuffer;
const Widget = ly_ui.Widget;
const ly_core = ly_ui.ly_core;
const interop = ly_core.interop;
const UidRange = ly_core.UidRange;
const LogFile = ly_core.LogFile;
const SharedError = ly_core.SharedError;
const IniParser = ly_core.IniParser;
const SavedUsers = ly_core.SavedUsers;
const DisplayServer = ly_core.DisplayServer;
const Environment = ly_core.Environment;
const Entry = Environment.Entry;
const ini = ly_core.ini;
const Ini = ini.Ini;
const Cascade = @import("animations/Cascade.zig");
const ColorMix = @import("animations/ColorMix.zig");
@@ -26,21 +41,6 @@ const Config = @import("config/Config.zig");
const Lang = @import("config/Lang.zig");
const migrator = @import("config/migrator.zig");
const OldSave = @import("config/OldSave.zig");
const SavedUsers = @import("config/SavedUsers.zig");
const enums = @import("enums.zig");
const DisplayServer = enums.DisplayServer;
const Environment = @import("Environment.zig");
const Entry = Environment.Entry;
const Position = @import("tui/Position.zig");
const BigLabel = @import("tui/components/BigLabel.zig");
const CenteredBox = @import("tui/components/CenteredBox.zig");
const InfoLine = @import("tui/components/InfoLine.zig");
const Label = @import("tui/components/Label.zig");
const Session = @import("tui/components/Session.zig");
const Text = @import("tui/components/Text.zig");
const UserList = @import("tui/components/UserList.zig");
const TerminalBuffer = @import("tui/TerminalBuffer.zig");
const Widget = @import("tui/Widget.zig");
const ly_version_str = "Ly version " ++ build_options.version;