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].

Reply via email to