diff --git a/build.zig b/build.zig index 8542261..6ac8a4e 100644 --- a/build.zig +++ b/build.zig @@ -1,13 +1,13 @@ const std = @import("std"); -const ly_version = std.SemanticVersion{ .major = 1, .minor = 0, .patch = 0 }; +const ly_version = std.SemanticVersion{ .major = 1, .minor = 0, .patch = 0, .build = "dev" }; pub fn build(b: *std.Build) void { const data_directory = b.option([]const u8, "data_directory", "Specify a default data directory (default is /etc/ly)"); const build_options = b.addOptions(); build_options.addOption([]const u8, "data_directory", data_directory orelse "/etc/ly"); - const version_str = b.fmt("{d}.{d}.{d}", .{ ly_version.major, ly_version.minor, ly_version.patch }); + const version_str = b.fmt("{d}.{d}.{d}-{s}", .{ ly_version.major, ly_version.minor, ly_version.patch, ly_version.build.? }); build_options.addOption([]const u8, "version", version_str); diff --git a/src/config/Save.zig b/src/config/Save.zig index b9c7ae0..972c2b7 100644 --- a/src/config/Save.zig +++ b/src/config/Save.zig @@ -1,4 +1,2 @@ -const Save = @This(); - user: ?[]const u8 = null, session_index: ?u64 = null, diff --git a/src/config/migrator.zig b/src/config/migrator.zig new file mode 100644 index 0000000..9ce5673 --- /dev/null +++ b/src/config/migrator.zig @@ -0,0 +1,30 @@ +const std = @import("std"); +const ini = @import("zigini"); +const Save = @import("Save.zig"); + +const Allocator = std.mem.Allocator; + +pub fn tryMigrateSaveFile(allocator: Allocator, path: []const u8) Save { + var file = std.fs.openFileAbsolute(path, .{ .mode = .read_write }) catch return .{}; + defer file.close(); + + const reader = file.reader(); + const user_length = reader.readIntLittle(u64) catch return .{}; + + const user_buffer = allocator.alloc(u8, user_length) catch return .{}; + defer allocator.free(user_buffer); + + const read_user_length = reader.read(user_buffer) catch return .{}; + if (read_user_length != user_length) return .{}; + + const session_index = reader.readIntLittle(u64) catch return .{}; + + const save = .{ + .user = user_buffer, + .session_index = session_index, + }; + + ini.writeFromStruct(save, file.writer(), null) catch return save; + + return save; +} diff --git a/src/main.zig b/src/main.zig index 6d08563..b82f1c0 100644 --- a/src/main.zig +++ b/src/main.zig @@ -2,6 +2,7 @@ const std = @import("std"); const build_options = @import("build_options"); const builtin = @import("builtin"); const clap = @import("clap"); +const ini = @import("zigini"); const auth = @import("auth.zig"); const bigclock = @import("bigclock.zig"); const interop = @import("interop.zig"); @@ -12,9 +13,9 @@ const Desktop = @import("tui/components/Desktop.zig"); const Text = @import("tui/components/Text.zig"); const InfoLine = @import("tui/components/InfoLine.zig"); const Config = @import("config/Config.zig"); -const ini = @import("zigini"); const Lang = @import("config/Lang.zig"); const Save = @import("config/Save.zig"); +const migrator = @import("config/migrator.zig"); const ViMode = @import("enums.zig").ViMode; const SharedError = @import("SharedError.zig"); const utils = @import("tui/utils.zig"); @@ -66,6 +67,7 @@ pub fn main() !void { // Load configuration file var config_ini = Ini(Config).init(allocator); defer config_ini.deinit(); + var lang_ini = Ini(Lang).init(allocator); defer lang_ini.deinit(); @@ -127,7 +129,7 @@ pub fn main() !void { _ = termbox.tb_select_output_mode(termbox.TB_OUTPUT_NORMAL); termbox.tb_clear(); - // we need this to reset it after auth. + // Needed to reset termbox after auth const tb_termios = try std.os.tcgetattr(std.os.STDIN_FILENO); // Initialize terminal buffer @@ -164,7 +166,10 @@ pub fn main() !void { if (config.load) { var save_ini = Ini(Save).init(allocator); defer save_ini.deinit(); - const save = save_ini.readToStruct(config.save_file) catch Save{}; + + // If it fails, we try to migrate the potentially old save file. And if we can't do that, we just create + // a new save file + const save = save_ini.readToStruct(config.save_file) catch migrator.tryMigrateSaveFile(allocator, config.save_file); if (save.user) |user| { try login.text.appendSlice(user); diff --git a/src/tui/components/Desktop.zig b/src/tui/components/Desktop.zig index c6808b9..80e7666 100644 --- a/src/tui/components/Desktop.zig +++ b/src/tui/components/Desktop.zig @@ -71,7 +71,7 @@ pub fn addEnvironment(self: *Desktop, name: []const u8, cmd: []const u8, display try self.environments.append(.{ .entry_ini = null, .name = name, - .xdg_name = name, // TODO + .xdg_name = getXdgName(name), .cmd = cmd, .specifier = switch (display_server) { .wayland => self.lang.wayland, @@ -88,7 +88,7 @@ pub fn addEnvironmentWithIni(self: *Desktop, entry_ini: Ini(Entry), name: []cons try self.environments.append(.{ .entry_ini = entry_ini, .name = name, - .xdg_name = name, // TODO + .xdg_name = getXdgName(name), .cmd = cmd, .specifier = switch (display_server) { .wayland => self.lang.wayland, @@ -102,7 +102,7 @@ pub fn addEnvironmentWithIni(self: *Desktop, entry_ini: Ini(Entry), name: []cons } pub fn crawl(self: *Desktop, path: []const u8, display_server: DisplayServer) !void { - var iterable_directory = try std.fs.openIterableDirAbsolute(path, .{}); + var iterable_directory = std.fs.openIterableDirAbsolute(path, .{}) catch return; defer iterable_directory.close(); var iterator = iterable_directory.iterate(); @@ -173,3 +173,8 @@ fn goRight(self: *Desktop) void { self.current += 1; } + +fn getXdgName(name: []const u8) []const u8 { + // TODO + return name; +}