diff --git a/src/Config.zig b/src/Config.zig index 09893fd..43c636d 100644 --- a/src/Config.zig +++ b/src/Config.zig @@ -313,15 +313,6 @@ fn loadKeybindsChildBlock(config: *Config, parser: *kdl.Parser) !void { const split_exec = try utils.tokenizeToOwnedSlices(exec_str, ' '); break :sw .{ .spawn = split_exec }; }, - .focus_next => { - break :sw .focus_next; - }, - .focus_prev => { - break :sw .focus_prev; - }, - .zoom => { - break :sw .zoom; - }, .change_ratio => { const diff_str = utils.stripQuotes(node.arg(parser, 2) orelse { logWarnMissingNodeArg(name, "diff"); @@ -333,11 +324,13 @@ fn loadKeybindsChildBlock(config: *Config, parser: *kdl.Parser) !void { }; break :sw .{ .change_ratio = diff }; }, - .toggle_fullscreen => { - break :sw .toggle_fullscreen; - }, - .close_window => { - break :sw .close_window; + inline .focus_next, .focus_prev, .zoom, .reload_config, .toggle_fullscreen, .close_window => |cmd| { + // None of these have arguments, just create the union and give it back + break :sw @unionInit( + XkbBindings.Command, + @tagName(cmd), + {}, + ); }, inline .set_output_tags, .set_window_tags, .toggle_output_tags, .toggle_window_tags => |cmd| { const tags_str = utils.stripQuotes(node.arg(parser, 2) orelse { @@ -348,7 +341,11 @@ fn loadKeybindsChildBlock(config: *Config, parser: *kdl.Parser) !void { logWarnInvalidNodeArg(name, tags_str); continue; }; - break :sw @unionInit(XkbBindings.Command, @tagName(cmd), tags); + break :sw @unionInit( + XkbBindings.Command, + @tagName(cmd), + tags, + ); }, }; diff --git a/src/XkbBindings.zig b/src/XkbBindings.zig index 5b8428c..34bedfd 100644 --- a/src/XkbBindings.zig +++ b/src/XkbBindings.zig @@ -10,10 +10,9 @@ pub const Command = union(enum) { focus_prev, zoom, change_ratio: f32, - // reload_config, // TODO + reload_config, toggle_fullscreen, close_window, - // exit, // TODO: Delete? // Tag management set_output_tags: u32, set_window_tags: u32, @@ -128,10 +127,26 @@ const XkbBinding = struct { current_focus.link.swapWith(&first_window.link); }, .change_ratio => |diff| { - const new_ratio = context.wm.primary_ratio + diff; - if (new_ratio >= 0.10 and new_ratio <= 0.90) { - context.wm.pending_manage.primary_ratio = context.wm.primary_ratio + diff; + context.wm.pending_manage.primary_ratio = std.math.clamp(context.wm.primary_ratio + diff, 0.10, 0.90); + }, + .reload_config => { + // Try create new config + const new_config = Config.create() catch { + // We do this so that, if the Config fails to reload, the + // user still has *some* config. + log.err("Failed to reload Config. Not deleting old one", .{}); + return; + }; + // Clean up old one + var it = context.xkb_bindings.bindings.safeIterator(.forward); + while (it.next()) |binding| { + binding.link.remove(); + binding.destroy(); } + context.config.destroy(); + // Replace the old one + context.config = new_config; + context.initialized = false; }, .toggle_fullscreen => { const seat = context.wm.seats.first() orelse return; @@ -241,6 +256,7 @@ const xkbcommon = @import("xkbcommon"); const utils = @import("utils.zig"); const Context = @import("Context.zig"); +const Config = @import("Config.zig"); const Seat = @import("Seat.zig"); const Window = @import("Window.zig");