Diff
diff --git a/src/bar/bar.zig b/src/bar/bar.zig
index 8c036af..83db435 100644
--- a/src/bar/bar.zig
+++ b/src/bar/bar.zig
@@ -16,8 +16,8 @@ fn get_layout_symbol(layout_index: u32) []const u8 {
0 => conf.layout_tile_symbol,
1 => conf.layout_monocle_symbol,
2 => conf.layout_floating_symbol,
- 3 => "[S]",
- 4 => "[#]",
+ 3 => conf.layout_scrolling_symbol,
+ 4 => conf.layout_grid_symbol,
else => "[?]",
};
}
diff --git a/src/config/config.zig b/src/config/config.zig
index 3c5f573..d91c98a 100644
--- a/src/config/config.zig
+++ b/src/config/config.zig
@@ -115,6 +115,7 @@ pub const Config = struct {
terminal: []const u8 = "st",
font: []const u8 = "monospace:size=10",
tags: [9][]const u8 = .{ "1", "2", "3", "4", "5", "6", "7", "8", "9" },
+ tag_count: u8 = 9,
border_width: i32 = 2,
border_focused: u32 = 0x6dade3,
@@ -136,6 +137,7 @@ pub const Config = struct {
layout_monocle_symbol: []const u8 = "[M]",
layout_floating_symbol: []const u8 = "><>",
layout_scrolling_symbol: []const u8 = "[S]",
+ layout_grid_symbol: []const u8 = "[#]",
scheme_normal: ColorScheme = .{ .foreground = 0xbbbbbb, .background = 0x1a1b26, .border = 0x444444 },
scheme_selected: ColorScheme = .{ .foreground = 0x0db9d7, .background = 0x1a1b26, .border = 0xad8ee6 },
diff --git a/src/config/lua.zig b/src/config/lua.zig
index d935a35..4c937a4 100644
--- a/src/config/lua.zig
+++ b/src/config/lua.zig
@@ -1029,14 +1029,16 @@ fn lua_set_tags(state: ?*c.lua_State) callconv(.c) c_int {
if (c.lua_type(s, 1) != c.LUA_TTABLE) return 0;
const len = c.lua_rawlen(s, 1);
+ const count = @min(len, 9);
var i: usize = 0;
- while (i < len and i < 9) : (i += 1) {
+ while (i < count) : (i += 1) {
_ = c.lua_rawgeti(s, 1, @intCast(i + 1));
if (dupe_lua_string(s, -1)) |tag_str| {
cfg.tags[i] = tag_str;
}
c.lua_settop(s, -2);
}
+ cfg.tag_count = @intCast(count);
return 0;
}
@@ -1072,6 +1074,7 @@ fn lua_set_layout_symbol(state: ?*c.lua_State) callconv(.c) c_int {
.{ "monocle", &cfg.layout_monocle_symbol },
.{ "scrolling", &cfg.layout_scrolling_symbol },
.{ "scroll", &cfg.layout_scrolling_symbol },
+ .{ "grid", &cfg.layout_grid_symbol },
};
inline for (layout_map) |entry| {
diff --git a/src/main.zig b/src/main.zig
index 9b358e4..25be807 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -41,15 +41,6 @@ var net_client_list: xlib.Atom = 0;
var wm_check_window: xlib.Window = 0;
-var border_color_focused: c_ulong = 0x6dade3;
-var border_color_unfocused: c_ulong = 0x444444;
-var border_width: i32 = 2;
-var gap_outer_v: i32 = 5;
-var gap_outer_h: i32 = 5;
-var gap_inner_h: i32 = 5;
-var gap_inner_v: i32 = 5;
-
-var tags: [9][]const u8 = .{ "1", "2", "3", "4", "5", "6", "7", "8", "9" };
var cursor_normal: xlib.Cursor = 0;
var cursor_resize: xlib.Cursor = 0;
@@ -226,7 +217,6 @@ pub fn main() !void {
if (loaded) {
config_path_global = config_path;
std.debug.print("loaded config from {s}\n", .{config_path});
- apply_config_values();
} else {
std.debug.print("no config found, using defaults\n", .{});
initialize_default_config();
@@ -476,17 +466,6 @@ fn setup_monitors(display: *Display) void {
std.debug.print("monitor created: {d}x{d}\n", .{ mon.mon_w, mon.mon_h });
}
-fn apply_config_values() void {
- border_color_focused = config.border_focused;
- border_color_unfocused = config.border_unfocused;
- border_width = config.border_width;
- gap_inner_h = config.gap_inner_h;
- gap_inner_v = config.gap_inner_v;
- gap_outer_h = config.gap_outer_h;
- gap_outer_v = config.gap_outer_v;
- tags = config.tags;
-}
-
fn init_monitor_gaps(mon: *Monitor) void {
const any_gap_nonzero = config.gap_inner_h != 0 or config.gap_inner_v != 0 or
config.gap_outer_h != 0 or config.gap_outer_v != 0;
@@ -711,7 +690,7 @@ fn run_event_loop(display: *Display) void {
var current_bar = bar_mod.bars;
while (current_bar) |bar| {
bar.update_blocks();
- bar.draw(display.handle, &tags);
+ bar.draw(display.handle, config.tags[0..config.tag_count]);
current_bar = bar.next;
}
@@ -774,7 +753,7 @@ fn manage(display: *Display, win: xlib.Window, window_attrs: *xlib.XWindowAttrib
client.old_width = window_attrs.width;
client.old_height = window_attrs.height;
client.old_border_width = window_attrs.border_width;
- client.border_width = border_width;
+ client.border_width = config.border_width;
update_title(display, client);
@@ -802,7 +781,7 @@ fn manage(display: *Display, win: xlib.Window, window_attrs: *xlib.XWindowAttrib
client.y = @max(client.y, monitor.win_y);
_ = xlib.XSetWindowBorderWidth(display.handle, win, @intCast(client.border_width));
- _ = xlib.XSetWindowBorder(display.handle, win, border_color_unfocused);
+ _ = xlib.XSetWindowBorder(display.handle, win, config.border_unfocused);
tiling.send_configure(client);
update_window_type(display, client);
@@ -1084,7 +1063,6 @@ fn reload_config(display: *Display) void {
} else {
std.debug.print("reloaded config from ~/.config/oxwm/config.lua\n", .{});
}
- apply_config_values();
} else {
std.debug.print("reload failed, restoring defaults\n", .{});
initialize_default_config();
@@ -1276,10 +1254,10 @@ fn toggle_client_tag(display: *Display, tag_mask: u32) void {
fn toggle_gaps() void {
const monitor = monitor_mod.selected_monitor orelse return;
if (monitor.gap_inner_h == 0) {
- monitor.gap_inner_h = gap_inner_v;
- monitor.gap_inner_v = gap_inner_v;
- monitor.gap_outer_h = gap_outer_h;
- monitor.gap_outer_v = gap_outer_v;
+ monitor.gap_inner_h = config.gap_inner_h;
+ monitor.gap_inner_v = config.gap_inner_v;
+ monitor.gap_outer_h = config.gap_outer_h;
+ monitor.gap_outer_v = config.gap_outer_v;
} else {
monitor.gap_inner_h = 0;
monitor.gap_inner_v = 0;
@@ -1860,7 +1838,7 @@ fn handle_expose(display: *Display, event: *xlib.XExposeEvent) void {
if (bar_mod.window_to_bar(event.window)) |bar| {
bar.invalidate();
- bar.draw(display.handle, &tags);
+ bar.draw(display.handle, config.tags[0..config.tag_count]);
}
}
@@ -1891,7 +1869,7 @@ fn handle_button_press(display: *Display, event: *xlib.XButtonEvent) void {
}
if (bar_mod.window_to_bar(event.window)) |bar| {
- const clicked_tag = bar.handle_click(event.x, &tags);
+ const clicked_tag = bar.handle_click(event.x, config.tags[0..config.tag_count]);
if (clicked_tag) |tag_index| {
const tag_mask: u32 = @as(u32, 1) << @intCast(tag_index);
view(display, tag_mask);
@@ -2111,7 +2089,7 @@ fn handle_property_notify(display: *Display, event: *xlib.XPropertyEvent) void {
fn unfocus_client(display: *Display, client: ?*Client, reset_input_focus: bool) void {
const unfocus_target = client orelse return;
grabbuttons(display, unfocus_target, false);
- _ = xlib.XSetWindowBorder(display.handle, unfocus_target.window, border_color_unfocused);
+ _ = xlib.XSetWindowBorder(display.handle, unfocus_target.window, config.border_unfocused);
if (reset_input_focus) {
_ = xlib.XSetInputFocus(display.handle, display.root, xlib.RevertToPointerRoot, xlib.CurrentTime);
_ = xlib.XDeleteProperty(display.handle, display.root, net_active_window);
@@ -2208,7 +2186,7 @@ fn focus(display: *Display, target_client: ?*Client) void {
client_mod.detach_stack(client);
client_mod.attach_stack(client);
grabbuttons(display, client, true);
- _ = xlib.XSetWindowBorder(display.handle, client.window, border_color_focused);
+ _ = xlib.XSetWindowBorder(display.handle, client.window, config.border_focused);
if (!client.never_focus) {
_ = xlib.XSetInputFocus(display.handle, client.window, xlib.RevertToPointerRoot, xlib.CurrentTime);
_ = xlib.XChangeProperty(display.handle, display.root, net_active_window, xlib.XA_WINDOW, 32, xlib.PropModeReplace, @ptrCast(&client.window), 1);