diff --git a/src/main.zig b/src/main.zig index 725171c..60e71af 100644 --- a/src/main.zig +++ b/src/main.zig @@ -8,6 +8,7 @@ const calendar = @import("modules/calendar.zig"); const display = @import("modules/display.zig"); const uptime = @import("modules/uptime.zig"); const volume = @import("modules/volume.zig"); +const memory = @import("modules/memory.zig"); const Module = @import("module.zig"); pub fn main() !void { @@ -23,6 +24,7 @@ pub fn main() !void { var modules = [_]Module{ uptime.init(arena.allocator()).module, + memory.init(arena.allocator()).module, volume.init(arena.allocator()).module, display.init(arena.allocator()).module, battery.init(arena.allocator()).module, diff --git a/src/modules/memory.zig b/src/modules/memory.zig new file mode 100644 index 0000000..18c40e7 --- /dev/null +++ b/src/modules/memory.zig @@ -0,0 +1,39 @@ +const std = @import("std"); +const Module = @import("../module.zig"); +const Self = @This(); + +module: Module, + +pub fn init(allocator: std.mem.Allocator) Self { + return .{ + .module = .{ + .allocator = allocator, + .getJsonFn = getJson, + }, + }; +} + +pub fn getJson(module: *const Module) !Module.JSON { + const self = @fieldParentPtr(Self, "module", module); + + var meminfo_file = try std.fs.openFileAbsolute("/proc/meminfo", .{}); + defer meminfo_file.close(); + + const meminfo_string = try meminfo_file.reader().readAllAlloc(self.module.allocator, 4096); + const mem_total_idx = std.mem.indexOf(u8, meminfo_string, "MemTotal:"); + const mem_available_idx = std.mem.indexOf(u8, meminfo_string, "MemAvailable:"); + const mem_total_newline = std.mem.indexOfScalarPos(u8, meminfo_string, mem_total_idx.?, '\n'); + const mem_available_newline = std.mem.indexOfScalarPos(u8, meminfo_string, mem_available_idx.?, '\n'); + var mem_total_split = std.mem.splitBackwardsScalar(u8, meminfo_string[mem_total_idx.?..mem_total_newline.?], ' '); + var mem_available_split = std.mem.splitBackwardsScalar(u8, meminfo_string[mem_available_idx.?..mem_available_newline.?], ' '); + _ = mem_total_split.next(); + _ = mem_available_split.next(); + + const mem_total: f32 = @floatFromInt(try std.fmt.parseInt(usize, mem_total_split.next().?, 10)); + const mem_available: f32 = @floatFromInt(try std.fmt.parseInt(usize, mem_available_split.next().?, 10)); + const mem = mem_total - mem_available; + + return .{ + .full_text = try std.fmt.allocPrint(self.module.allocator, "{d:.3}/{d:.0} GB", .{ mem / 1000 / 1000, mem_total / 1000 / 1000 }), + }; +} diff --git a/src/modules/uptime.zig b/src/modules/uptime.zig index 70260af..351cfef 100644 --- a/src/modules/uptime.zig +++ b/src/modules/uptime.zig @@ -23,13 +23,13 @@ pub fn getJson(module: *const Module) !Module.JSON { var uptime_split = std.mem.splitScalar(u8, uptime_string[0 .. uptime_string.len - 1], ' '); var uptime = try std.fmt.parseFloat(f32, uptime_split.first()); - const days = uptime / std.time.s_per_day; - uptime -= std.time.s_per_day * @floor(days); - const hours = uptime / std.time.s_per_hour; - uptime -= std.time.s_per_hour * @floor(hours); - const mins = uptime / std.time.s_per_min; + uptime /= 60; + const mins = @mod(uptime, 60); + uptime /= 60; + const hours = @mod(uptime, 24); + uptime /= 24; return .{ - .full_text = try std.fmt.allocPrint(self.module.allocator, "{d:0>1.0}d {d:0>1.0}h {d:.0}m", .{ days, hours, mins }), + .full_text = try std.fmt.allocPrint(self.module.allocator, "{d:0>1.0}d {d:0>1.0}h {d:.0}m", .{ uptime, hours, mins }), }; }