From 12c7e2852f48a0af634c528caac37213ec96fa4a Mon Sep 17 00:00:00 2001 From: Uli Schlachter Date: Tue, 18 Jan 2011 14:21:37 +0100 Subject: [PATCH] Tag clients more intelligently (FS#700) Before this commit, c:tags(tags) and t:clients(clients) first removed all tags/clients and then added the new one. This is now changed into only removing the tags/clients that have to be removed and leaving the others in place. Hopefully, this avoids all kinds of weird issues which we had. Signed-off-by: Uli Schlachter --- client.c | 21 ++++++++++++++++++++- tag.c | 21 ++++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/client.c b/client.c index 6af6253e..d6852f85 100644 --- a/client.c +++ b/client.c @@ -1551,7 +1551,26 @@ luaA_client_tags(lua_State *L) { luaA_checktable(L, 2); for(int i = 0; i < tags->len; i++) - untag_client(c, tags->tab[i]); + { + /* Only untag if we aren't going to add this tag again */ + bool found = false; + lua_pushnil(L); + while(lua_next(L, 2)) + { + tag_t *t = lua_touserdata(L, -1); + /* Pop the value from lua_next */ + lua_pop(L, 1); + if (t != tags->tab[i]) + continue; + + /* Pop the key from lua_next */ + lua_pop(L, 1); + found = true; + break; + } + if(!found) + untag_client(c, tags->tab[i]); + } lua_pushnil(L); while(lua_next(L, 2)) tag_client(c); diff --git a/tag.c b/tag.c index b1de268a..e8a98f93 100644 --- a/tag.c +++ b/tag.c @@ -363,7 +363,26 @@ luaA_tag_clients(lua_State *L) { luaA_checktable(L, 2); foreach(c, tag->clients) - untag_client(*c, tag); + { + /* Only untag if we aren't going to add this tag again */ + bool found = false; + lua_pushnil(L); + while(lua_next(L, 2)) + { + client_t *tc = luaA_checkudata(L, -1, &client_class); + /* Pop the value from lua_next */ + lua_pop(L, 1); + if (tc != *c) + continue; + + /* Pop the key from lua_next */ + lua_pop(L, 1); + found = true; + break; + } + if(!found) + untag_client(*c, tag); + } lua_pushnil(L); while(lua_next(L, 2)) {