From ab51c72484163c9c0ff3071351669e6e2d0b6cbc Mon Sep 17 00:00:00 2001 From: Emmanuel Lepage Vallee Date: Sun, 28 Sep 2014 23:26:34 -0400 Subject: [PATCH] Add `tag` client property and avoid keeping volatile tags in memory --- README.md | 10 +++++++++- extra/request.lua | 18 +++++++++--------- init.lua | 9 ++++++--- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 58f8c0d..cf88407 100644 --- a/README.md +++ b/README.md @@ -248,6 +248,7 @@ Then edit this section to fit your needs. | **fallback** | Use this tag for unmatched clients | boolean | | **locked** | Do not add any more clients to this tag | boolean | | **max_clients** | Maximum number of clients before creating a new tag | number or func | +| **onetimer** | Once deleted, this tag cannot be created again | boolean | ★Takes precedence over class @@ -273,6 +274,8 @@ Then edit this section to fit your needs. | **master** | Open a client as master (bigger) | boolean | | **slave** | Open a client as slave (smaller) | boolean | | **no_autofocus** | Do not focus a new instance | boolean | +| **tag** | Asign to a pre-existing tag object | tag/func/array | +| **new_tag** | Do not focus a new instance | boolean or array | *Need default rc.lua modifications in the "client.connect_signal('focus')" section @@ -333,7 +336,7 @@ will allow the client into that tag. This function switch between `tile` and `magnifier`: ```lua - local function five_layout(c,tag) + local function aero_or_magnifier(c,tag) local count = #match:clients() + 1 --The client is not there yet if count == 2 then awful.layout.set(awful.layout.suit.tile,tag) @@ -366,6 +369,11 @@ Here are some example: -- Spawn in the current tag, floating and on top awful.util.spawn(terminal,{intrusive=true, floating=true, ontop=true}) + + -- Spawn in an existing tag (assume `my_tag` exist) + -- Note that `tag` can also be an array of tags or a function returning + -- an array of tags + awful.util.spawn(terminal,{tag=my_tag}) ``` For Awesome 3.5.6+, it is possible to replace the default mod4+r keybinding with diff --git a/extra/request.lua b/extra/request.lua index 20adefc..dba7165 100644 --- a/extra/request.lua +++ b/extra/request.lua @@ -25,15 +25,15 @@ end) capi.client.disconnect_signal("request::tag", ewmh.tag) capi.client.connect_signal("request::tag", function(c) - if capi.awesome.startup then - --TODO create a tag on that screen - else - --TODO block invalid requests, let Tyrannical do its job - local tags = c:tags() - if #tags == 0 then - --TODO cannot happen - end - end +-- if capi.awesome.startup then +-- --TODO create a tag on that screen +-- else +-- --TODO block invalid requests, let Tyrannical do its job +-- local tags = c:tags() +-- if #tags == 0 then +-- --TODO cannot happen +-- end +-- end end) diff --git a/init.lua b/init.lua index 237c09c..dfc6a3c 100755 --- a/init.lua +++ b/init.lua @@ -15,7 +15,7 @@ local signals,module,c_rules,tags_hash,settings,sn_callback,fallbacks,prop = { "exclusive" , "init" , "volatile" , "focus_new" , "instances" , "locked" , "class" , "instance" , "spawn" , "position" , "force_screen" , "max_clients" , "exec_once" , "clone_on" , "clone_of" , "no_focus_stealing", - "fallback" , "no_focus_stealing_out","no_focus_stealing_in" + "fallback" , "no_focus_stealing_out" ,"no_focus_stealing_in" },{},{class={},instance={}},{},{},awful.spawn and awful.spawn.snid_buffer or {},{},awful.tag.getproperty for _,sig in ipairs(signals) do @@ -115,6 +115,8 @@ local function apply_properties(c,override,normal) end if props.new_tag then ret = c:tags({awful.tag.add(type(props.new_tag)=="table" and props.new_tag.name or c.class,type(props.new_tag)=="table" and props.new_tag or {})}) + elseif props.tag then + ret = c:tags(type(props.tag) == "function" and props.tag(c) or (type(props.tag) == "table" and props.tag or { props.tag })) --Add to the current tag if the client is intrusive, ignore exclusive elseif props.intrusive == true or (settings.force_odd_as_intrusive and c.type ~= "normal") then local tag = awful.tag.selected(c.screen) or awful.tag.viewonly(awful.tag.gettags(c.screen)[1]) or awful.tag.selected(c.screen) @@ -128,7 +130,6 @@ end --Match client local function match_client(c, startup) if not c then return end - local startup = startup == nil and capi.awesome.startup or startup local props = c.startup_id and sn_callback[tostring(c.startup_id)] or {} @@ -185,7 +186,7 @@ local function match_client(c, startup) end --Last resort, create a new tag c_rules.class[low_c] = c_rules.class[low_c] or {tags={},properties={}} - local tmp,tag = c_rules.class[low_c],awful.tag.add(get_class(c),{name=get_class(c),volatile=true,exclusive=true,screen=(c.screen <= capi.screen.count()) + local tmp,tag = c_rules.class[low_c],awful.tag.add(get_class(c),{name=get_class(c),onetimer=true,volatile=true,exclusive=true,screen=(c.screen <= capi.screen.count()) and c.screen or 1,layout=settings.default_layout or awful.layout.suit.max}) tmp.tags[#tmp.tags+1] = {name=get_class(c),instances = setmetatable({[c.screen]=tag}, { __mode = 'v' }),volatile=true,screen=c.screen,exclusive=true} c:tags({tag}) @@ -197,9 +198,11 @@ capi.client.connect_signal("manage", match_client) capi.client.connect_signal("untagged", function (c, t) if prop(t,"volatile") == true and #t:clients() == 0 then local rules = c_rules.class[string.lower(get_class(c))] + c_rules.class[string.lower(get_class(c))] = (prop(t,"onetimer") ~= true or c.class == nil) and rules or nil --Prevent "last resort tags" from persisting for j=1,#(rules and rules.tags or {}) do rules.tags[j].instances[c.screen] = rules.tags[j].instances[c.screen] ~= t and rules.tags[j].instances[c.screen] or nil end + awful.tag.history.restore(awful.tag.getscreen(t) or 1) --Explicitly return to the last tag awful.tag.delete(t) end end)