diff --git a/src/main.zig b/src/main.zig index f45bc5d..9b9bc18 100644 --- a/src/main.zig +++ b/src/main.zig @@ -46,6 +46,8 @@ pub fn log( nosuspend stderr.print(prefix ++ format, args) catch return; } +const default_bar_config = "cpu|mem|weather(London)"; + pub fn main() !void { std.log.info("Starting Bar.", .{}); var allocator: *std.mem.Allocator = undefined; @@ -66,15 +68,64 @@ pub fn main() !void { var bar = barImpl.initBar(allocator); var br = Bar.init(&bar); - const widgets = [_]*Widget{ - //&Widget.init(&networkWidget.New(allocator, &br)), // 24.01KiB - &Widget.init(&cpuWidget.New(&br)), // 4.08KiB - &Widget.init(&memoryWidget.New(&br)), // 4.08KiB - &Widget.init(&weatherWidget.New(allocator, &br, @import("build_options").weather_location)), // 16.16KiB - &Widget.init(&batteryWidget.New(allocator, &br)), // 12.11KiB - &Widget.init(&timeWidget.New(allocator, &br)), // 32.46KiB - }; - bar.widgets = widgets[0..]; + var argIter = std.process.args(); + allocator.free(try argIter.next(allocator).?); + + var config: []const u8 = undefined; + if (argIter.next(allocator)) |conf| { + config = try conf; + } else { + config = try allocator.dupe(u8, default_bar_config); + } + defer allocator.free(config); + + std.debug.print("Config: {s}\n", .{config}); + + var widgets = std.ArrayList(*Widget).init(allocator); + defer widgets.deinit(); + + var configIter = std.mem.split(config, "|"); + while (configIter.next()) |barItemInfo| { + var barItemIter = std.mem.tokenize(barItemInfo, "()"); + var widgetName = barItemIter.next().?; + var widgetConfig: ?[]const u8 = null; + if (barItemIter.next()) |wC| { + // i just assume that this will last the lifespan of everything + // TODO: check for leaks and stuff + widgetConfig = wC; + } + + var widget: ?*Widget = null; + if (std.mem.eql(u8, widgetName, "cpu")) { + widget = &Widget.init(&cpuWidget.New(&br)); + } else if (std.mem.eql(u8, widgetName, "mem")) { + widget = &Widget.init(&memoryWidget.New(&br)); + } else if (std.mem.eql(u8, widgetName, "net")) { + widget = &Widget.init(&networkWidget.New(allocator, &br)); + } else if (std.mem.eql(u8, widgetName, "bat")) { + widget = &Widget.init(&batteryWidget.New(allocator, &br)); + } else if (std.mem.eql(u8, widgetName, "weather")) { + widget = &Widget.init(&weatherWidget.New(allocator, &br, widgetConfig.?)); + } else if (std.mem.eql(u8, widgetName, "time")) { + widget = &Widget.init(&timeWidget.New(allocator, &br)); + } + + if (widget) |w| { + try widgets.append(w); + } else { + std.debug.print("Widget does not exist: {s}\n", .{widgetName}); + @panic("Widget does not exist."); + } + } + //const widgets = [_]*Widget{ + // &Widget.init(&networkWidget.New(allocator, &br)), // 24.01KiB + // &Widget.init(&cpuWidget.New(&br)), // 4.08KiB + // &Widget.init(&memoryWidget.New(&br)), // 4.08KiB + // &Widget.init(&weatherWidget.New(allocator, &br, @import("build_options").weather_location)), // 16.16KiB + // &Widget.init(&batteryWidget.New(allocator, &br)), // 12.11KiB + // &Widget.init(&timeWidget.New(allocator, &br)), // 32.46KiB + //}; + bar.widgets = widgets.items; try br.start(); if (debug_allocator) { std.debug.print("Finished cleanup, last allocation info.\n", .{}); diff --git a/src/widgets/battery/battery.zig b/src/widgets/battery/battery.zig index 1a8e7dc..d43a01f 100644 --- a/src/widgets/battery/battery.zig +++ b/src/widgets/battery/battery.zig @@ -120,13 +120,13 @@ pub const BatteryWidget = struct { } if (std.mem.eql(u8, status, "Charging")) { - descriptor = comptimeColour("green", "(C)"); + descriptor = comptimeColour("green", " (C)"); sign = "+"; } else if (std.mem.eql(u8, status, "Discharging")) { - descriptor = comptimeColour("red", "(D)"); + descriptor = comptimeColour("red", " (D)"); sign = "-"; } else if (std.mem.eql(u8, status, "Unknown")) { - descriptor = comptimeColour("yellow", "(U)"); + descriptor = comptimeColour("yellow", " (U)"); sign = "?"; } @@ -162,7 +162,7 @@ pub const BatteryWidget = struct { self.allocator.free(capInfo); defer self.allocator.free(colourCapInfo); - var bat_info = try std.fmt.allocPrint(self.allocator, "{s} {s} {s}{s}{s}", .{ + var bat_info = try std.fmt.allocPrint(self.allocator, "{s}{s} {s}{s}{s}", .{ comptimeColour("accentlight", "bat"), descriptor, colourCapInfo, diff --git a/src/widgets/network/network.zig b/src/widgets/network/network.zig index 3be0101..623b50c 100644 --- a/src/widgets/network/network.zig +++ b/src/widgets/network/network.zig @@ -49,6 +49,7 @@ pub const NetworkInfo = struct { network_status: NetworkStatus = .Connected, network_info: []const u8, }; + fn freeString(allocator: *std.mem.Allocator, string: []const u8) callconv(.Inline) void { allocator.free(string); } @@ -62,7 +63,7 @@ pub const NetworkWidget = struct { network_infos: std.ArrayList(NetworkInfo), num_interfaces: u8 = 0, current_interface: u8 = 0, - update_mutex: std.Thread.Mutex = std.Mutex{}, + update_mutex: std.Thread.Mutex = std.Thread.Mutex{}, pub fn name(self: *NetworkWidget) []const u8 { return "network"; @@ -85,14 +86,14 @@ pub const NetworkWidget = struct { } } self.update_bar() catch |err| { - std.log.err(.network, "Error! {}\n", .{err}); + std.log.err("Error! {any}\n", .{err}); }; } pub fn update_network_infos(self: *NetworkWidget) anyerror!void { const lock = self.update_mutex.acquire(); defer lock.release(); - std.log.debug(.network, "Updating network info.\n", .{}); + std.log.debug("Updating network info.\n", .{}); for (self.network_infos.items) |info| { freeString(self.allocator, info.network_info); } @@ -137,7 +138,7 @@ pub const NetworkWidget = struct { for (self.network_infos.items) |info, i| { if (i != self.current_interface) continue; //std.log.debug(.network, "item! {} {}\n", .{ info, i }); - const inner_text = try std.fmt.allocPrint(allocator, "{} {}", .{ @tagName(info.network_type), info.network_info }); + const inner_text = try std.fmt.allocPrint(allocator, "{s} {s}", .{ @tagName(info.network_type), info.network_info }); const full_text = try colour(allocator, networkStatusToColour(info.network_status), inner_text); defer allocator.free(full_text); allocator.free(inner_text); diff --git a/src/widgets/weather/weather.zig b/src/widgets/weather/weather.zig index beed6f6..62122b4 100644 --- a/src/widgets/weather/weather.zig +++ b/src/widgets/weather/weather.zig @@ -21,7 +21,7 @@ pub const WeatherWidget = struct { allocator: *std.mem.Allocator, bar: *Bar, name: []const u8, - weather_api_url: []const u8, + location: []const u8, pub fn name(self: *WeatherWidget) []const u8 { return self.name; @@ -43,7 +43,11 @@ pub const WeatherWidget = struct { var read_buffer: [512 * 512]u8 = undefined; var client = hzzp.BaseClient.create(&read_buffer, &file.reader(), &file.writer()); - try client.writeHead("GET", self.weather_api_url); + var weather_api_path = try std.fmt.allocPrint(allocator, "/data/2.5/weather?q={s}&appid=dcea3595afe693d1c17846141f58ea10&units=metric", .{ + self.location + }); + defer allocator.free(weather_api_path); + try client.writeHead("GET", weather_api_path); try client.writeHeader("Host", "api.openweathermap.org"); try client.writeHeader("User-Agent", "uwu/1.2"); try client.writeHeader("Connection", "close"); @@ -208,14 +212,11 @@ pub const WeatherWidget = struct { } } }; -pub fn New(allocator: *std.mem.Allocator, bar: *Bar, comptime location: []const u8) callconv(.Inline) WeatherWidget { +pub fn New(allocator: *std.mem.Allocator, bar: *Bar, location: []const u8) callconv(.Inline) WeatherWidget { return WeatherWidget{ .allocator = allocator, .bar = bar, - .name = "weather " ++ location, - // Yeah I know I'm leaking a token here. - // So what? It ain't my token. - // It was the first result on github code search for "openweathermap appid" - .weather_api_url = "/data/2.5/weather?q=" ++ location ++ "&appid=dcea3595afe693d1c17846141f58ea10&units=metric", + .name = "weather", + .location = location, }; }