On Sat, May 29, 2010 at 08:31:40AM +0200, Uli Schlachter wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA256
>
> Am 29.05.2010 01:39, Perry Hargrave wrote:
> > tag.delete(t, fb):
> > If there are > 0 clients and only 1 tag, then don't delete the tag.
> >
> > Delete a tag 't' if there are no clients exclusively assigned to it.
> >
> > Signed-off-by: Perry Hargrave <[email protected]>
> > ---
> > lib/awful/tag.lua.in | 34 ++++++++++++++++++++++++++++++++++
> > 1 files changed, 34 insertions(+), 0 deletions(-)
> >
> > diff --git a/lib/awful/tag.lua.in b/lib/awful/tag.lua.in
> > index 9f229de..429a56d 100644
> > --- a/lib/awful/tag.lua.in
> > +++ b/lib/awful/tag.lua.in
> > @@ -48,6 +48,40 @@ function add(name, props)
> > return newtag
> > end
> >
> > +--- Delete a tag.
> > +-- @param target_tag Optional tag object to delete, [tag.selected()]
> > +-- @param fallback_tag Tag to assign stickied tags to. [screen[]:tags()[1]]
> > +-- If there are no clients exclusively on this tag then delete it.
> > +function delete(target_tag, fallback_tag)
> > + -- abort if no tag is passed or currently selected
> > + local target_tag = target_tag or selected()
> > + if target_tag == nil then return end
> > + local s_tags = capi.screen[target_tag.screen]:tags()
>
> It might be necessary to check that target_tag and fallback_tag are different.
> Also, if target_tag is the first tag on that screen and no fallback_tag is
> given, the code below might leave sticky clients attached to no tag.
> My proposal (see below for the first line):
I thought about checking that, but tbh I thought it was a little bit
hyper-vigilant.
Also if target_tag = s_tags[1], by the time the assignment to the
fallback tag for stickied clients is made, the target_tag.screen = nil
has already been done, so shouldn't s_tags[1] be gc'd and the values
reindexed?
>
> -- Find a suitable fallback tag for moving clients to
> local fallback_tag = fallback_tag
> if fallback_tag == target_tag then return end
>
> -- If no fallback tag is given, use the first suitable one
> if fallback_tag == nil then
> if target_tag ~= s_tags[1] then
> fallback_tag = s_tags[1]
> else
> fallback_tag = s_tags[2]
> end
> end
>
> It looks a lot more complicated, but I think it handles all corner cases.
>
> > +
> > + -- check the number and state of clients on this tag
> > + local clients = target_tag:clients()
> > + if #clients > 0 and #s_tags == 1 then
> > + return
> > + end
>
> I'd add a comment here:
>
> -- Move affected clients to the fallback_tag
> (or something like that)
>
> > + for _, c in pairs(clients) do
> > + local c_tags = c:tags()
> > + local i_tag = util.table.hasitem(c_tags, target_tag)
> > +
> > + if (not c.sticky) and (#c_tags == 1) then
> > + return
> > + elseif i_tag ~= nil then
> > + table.remove(c_tags, i_tag)
>
> It's nice to clean up properly, but AFAIK target_tag.screen = nil already
> removes all clients from the affected tag. I'm not sure if it's clearer to do
> it
> explicitly or not...
>
> > + if c.sticky then
> > + c:tags({fallback_tag} or {s_tags[1]})
>
> This won't work, you'll always get {fallback_tag} which just might be an
> empty
> table. You need { fallback_tag or s_tags[1] }. It might be easier to move that
> check to the beginning of the function:
>
> local fallback_tag = fallback_tag or s_tags[1]
>
facepalm... :D
--
perry
> > + end
> > + end
> > + end
> > +
> > + -- delete the tag
> > + target_tag.screen = nil
> > +end
> > +
> > --- Create a set of tags and attach it to a screen.
> > -- @param names The tag name, in a table
> > -- @param screen The tag screen, or 1 if not set.
>
>
> - --
> - - Buck, when, exactly, did you lose your mind?
> - - Three months ago. I woke up one morning married to a pineapple.
> An ugly pineapple... But I loved her!
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.10 (GNU/Linux)
>
> iQEcBAEBCAAGBQJMALTKAAoJECLkKOvLj8sGk1wIAITaU39ypMVx1XJraFTDs7ey
> 2gJzL1Gpd75Ymk0vaOqbNvIF8ikcL1trK4hGkPnw/l7QoLtAxIA/kQQAfBxJ2vbD
> k00ZjZ/n29U6hMVpp75A80ezp5ShMOq+A5kQvstpHATOz4Jl7GYiL0BpSYiTFJ+M
> ORoCXP/nBzgno5wDFZQz5xokuZl9mul+/Emw5X1aK2F3PVsNBOXAvrncUYm41NWR
> 4/jIvMO43QhTo0irX2NrtSL4XynzeMCcZOJ2/LPX5J1N7L3Lvt23fgiWv3aQXk5w
> vU+z8cwiLthuIEFuAl0FdN5zjrM88LJlqrdd3mbveQhiQxSFLmRyMPteHTFc9IE=
> =TOuG
> -----END PGP SIGNATURE-----
>
> --
> To unsubscribe, send mail to [email protected].
--
To unsubscribe, send mail to [email protected].