From a1378403c757df27b321c102389f7ea1e8d65454 Mon Sep 17 00:00:00 2001 From: Xinhao Yuan Date: Sat, 21 Mar 2020 16:49:20 -0400 Subject: [PATCH] change layout.create prototype --- README.md | 23 ++++++----------------- editor.lua | 8 +++++--- init.lua | 4 ++-- layout.lua | 47 +++++++++++++++++++++++++++++++---------------- 4 files changed, 44 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index ccbe39a..84b6ea0 100644 --- a/README.md +++ b/README.md @@ -40,16 +40,14 @@ You can change it after loading the module. ## Use the layout -Use `local layout = machi.layout.create(name, editor[, default_cmd])` to instantiate the layout with an editor object. +Use `local layout = machi.layout.create(args)` to instantiate the layout with an editor object. `args` is a table of arguments, where the followings can be used: -`name` can be a string or a function returning a string (see `init.lua` and "Advanced" below). -This is used for having different actual layout dependent on tags. + - `name`: the constant name of the layout + - `name_func`: a `function(t)` closure that returns a string for tag `t`. `name_func` overrides `name` + - `persistent`: whether to keep a history of the command for the layout. Default is `true` + - `default_cmd`: the command to use if there is no persistent history for this layout. -`editor` are used for editing and persisting the layouts. -You can use the exsiting `machi.default_editor`, or see below on creating editors. -You can create multiple layouts with different names and share the same editor. - -`default_cmd` is the initial command if no history command exists for the layout. +The function is compatible with the previous `machi.layout.create(name, editor, default_cmd)` calls. ## The layout editor and commands @@ -252,15 +250,6 @@ Calling `machi.switcher.start()` will create a switcher supporting the following So far, the key binding is not configurable. One has to modify the source code to change it. -## Advanced - -### `name` as a function in `machi.layout.create` - -When passed in as a function, `name` takes the tag `t` and returns (1) a string for the tag-dependent name of the layout, and (2) a boolean indicating the persistence of the layout. - -The default layout, `machi.default_layout`, uses the screen geometry and the tag name for name, thus allows the actual layout to be tag- and screen-dependent. -To differentiate tags with the same name, you may need a more advanced naming function. - ## Caveats 1. layout-machi handles `beautiful.useless_gap` slightly differently. diff --git a/editor.lua b/editor.lua index 2fc470a..ecc2161 100644 --- a/editor.lua +++ b/editor.lua @@ -839,7 +839,7 @@ function module.create(data) end if #open_areas == 0 then - current_info = current_info .. " (enter to save)" + current_info = current_info .. " (enter to apply)" end else if key == "Return" then @@ -858,7 +858,7 @@ function module.create(data) -- bring the current cmd to the front data.cmds[#data.cmds + 1] = current_cmd - local instance_name, persistent = layout.machi_get_instance_name(tag) + local instance_name, persistent = layout.machi_get_instance_info(tag) if persistent then data.last_cmd[instance_name] = current_cmd if data.history_file then @@ -877,9 +877,11 @@ function module.create(data) end file:close() end + current_info = "Saved!" + else + current_info = "Applied!" end - current_info = "Saved!" to_exit = true to_apply = true end diff --git a/init.lua b/init.lua index 69f5463..6c0c9c4 100644 --- a/init.lua +++ b/init.lua @@ -7,10 +7,10 @@ local function default_name(tag) tostring(tag.screen.geometry.width) .. "x" .. tostring(tag.screen.geometry.height) .. "+" .. tostring(tag.screen.geometry.x) .. "+" .. tostring(tag.screen.geometry.y) .. '+' .. tag.name end - return tag.machi_name_cache, true + return tag.machi_name_cache end local default_editor = editor.create() -local default_layout = layout.create(default_name, default_editor) +local default_layout = layout.create{ name_func = default_name, editor = default_editor } local gcolor = require("gears.color") local beautiful = require("beautiful") diff --git a/layout.lua b/layout.lua index 0613757..a88e38b 100644 --- a/layout.lua +++ b/layout.lua @@ -113,23 +113,38 @@ function module.set_geometry(c, region_lu, region_rd, useless_gap, border_width) end end -function module.create(name, editor, default_cmd) - local instances = {} +function module.create(args_or_name, editor, default_cmd) + local args + if type(args_or_name) == "string" then + args = { + name = args_or_name + } + elseif type(args_or_name) == "function" then + args = { + name_func = args_or_name + } + elseif type(args_or_name) == "table" then + args = args_or_name + else + return nil + end + args.editor = args.editor or editor + args.default_cmd = args.default_cmd or default_cmd or global_default_cmd + args.persistent = args.persistent == nil or args.persistent - local get_instance_name - if type(name) == "function" then - get_instance_name = name - else - get_instance_name = function () return name, true end - end + local instances = {} + + local function get_instance_info(tag) + return (args.name_func and args.name_func(tag) or args.name), args.persistent + end local function get_instance_(tag) - local name, persistent = get_instance_name(tag) - if instances[name] == nil then - instances[name] = { - cmd = persistent and editor.get_last_cmd(name) or nil, - regions_cache = {}, - } + local name, persistent = get_instance_info(tag) + if instances[name] == nil then + instances[name] = { + cmd = persistent and args.editor.get_last_cmd(name) or nil, + regions_cache = {}, + } if instances[name].cmd == nil then instances[name].cmd = default_cmd end @@ -144,7 +159,7 @@ function module.create(name, editor, default_cmd) local key = tostring(workarea.width) .. "x" .. tostring(workarea.height) .. "+" .. tostring(workarea.x) .. "+" .. tostring(workarea.y) if instance.regions_cache[key] == nil then - instance.regions_cache[key] = editor.run_cmd(workarea, cmd) + instance.regions_cache[key] = args.editor.run_cmd(workarea, cmd) end return instance.regions_cache[key], cmd:sub(1,1) == "d" end @@ -301,7 +316,7 @@ function module.create(name, editor, default_cmd) name = "machi", arrange = arrange, resize_handler = resize_handler, - machi_get_instance_name = get_instance_name, + machi_get_instance_info = get_instance_info, machi_set_cmd = set_cmd, machi_get_regions = get_regions, }