From 9cb22b96eb4466d940cd9fb768ba205a81ee3de9 Mon Sep 17 00:00:00 2001 From: Julien Danjou Date: Thu, 7 Aug 2008 16:37:58 +0200 Subject: [PATCH] lua: exports client.tags and tags.clients Signed-off-by: Julien Danjou --- client.c | 74 +++++++++++++++++-------------------------- common/tokenize.gperf | 1 + lib/awful.lua.in | 33 +++++++------------ tag.c | 26 +++++++++++++++ 4 files changed, 68 insertions(+), 66 deletions(-) diff --git a/client.c b/client.c index 3412f4ac7..b594977ae 100644 --- a/client.c +++ b/client.c @@ -947,48 +947,6 @@ client_setborder(client_t *c, int width) globalconf.screens[c->screen].need_arrange = true; } -/** Tag a client with a specified tag. - * \param L The Lua VM state. - * \luastack - * \lvalue A client. - * \lparam A tag object. - * \lparam A boolean value: true to add this tag to clients, false to remove. - */ -static int -luaA_client_tag(lua_State *L) -{ - client_t **c = luaA_checkudata(L, 1, "client"); - tag_t **tag = luaA_checkudata(L, 2, "tag"); - bool tag_the_client = luaA_checkboolean(L, 3); - - if((*tag)->screen != (*c)->screen) - luaL_error(L, "tag and client are on different screens"); - - if(tag_the_client) - tag_client(*c, *tag); - else - untag_client(*c, *tag); - - return 0; -} - -/** Check if a client is tagged with the specified tag. - * \param L The Lua VM state. - * \luastack - * \lvalue A client. - * \lparam A tag object. - * \lreturn A boolean value, true if the client is tagged with this tag, false - * otherwise. - */ -static int -luaA_client_istagged(lua_State *L) -{ - client_t **c = luaA_checkudata(L, 1, "client"); - tag_t **tag = luaA_checkudata(L, 2, "tag"); - lua_pushboolean(L, is_client_tagged(*c, *tag)); - return 1; -} - /** Kill a client. * \param L The Lua VM state. * @@ -1106,6 +1064,8 @@ luaA_client_newindex(lua_State *L) double d; int i; titlebar_t **t = NULL; + tag_array_t *tags; + tag_t **tag; if((*c)->invalid) luaL_error(L, "client is invalid\n"); @@ -1200,7 +1160,19 @@ luaA_client_newindex(lua_State *L) titlebar_ref(t); titlebar_init(*c); } - + break; + case A_TK_TAGS: + luaA_checktable(L, 3); + tags = &globalconf.screens[(*c)->screen].tags; + for(i = 0; i < tags->len; i++) + untag_client(*c, tags->tab[i]); + lua_pushnil(L); + while(lua_next(L, 3)) + { + tag = luaA_checkudata(L, -1, "tag"); + tag_client(*c, *tag); + lua_pop(L, 1); + } break; default: return 0; @@ -1228,6 +1200,7 @@ luaA_client_newindex(lua_State *L) * \lfield coords The client coordinates. * \lfield titlebar The client titlebar. * \lfield urgent The client urgent state. + * \lfield tags The clients tags. */ static int luaA_client_index(lua_State *L) @@ -1239,6 +1212,8 @@ luaA_client_index(lua_State *L) xutil_class_hint_t hint; xcb_get_property_cookie_t prop_c; xcb_get_property_reply_t *prop_r = NULL; + tag_array_t *tags; + int i; if((*c)->invalid) luaL_error(L, "client is invalid\n"); @@ -1316,6 +1291,17 @@ luaA_client_index(lua_State *L) case A_TK_URGENT: lua_pushboolean(L, (*c)->isurgent); break; + case A_TK_TAGS: + tags = &globalconf.screens[(*c)->screen].tags; + luaA_otable_new(L); + for(i = 0; i < tags->len; i++) + if(is_client_tagged(*c, tags->tab[i])) + { + luaA_tag_userdata_new(L, tags->tab[i]); + luaA_tag_userdata_new(L, tags->tab[i]); + lua_rawset(L, -3); + } + break; default: return 0; } @@ -1332,8 +1318,6 @@ const struct luaL_reg awesome_client_methods[] = }; const struct luaL_reg awesome_client_meta[] = { - { "tag", luaA_client_tag }, - { "istagged", luaA_client_istagged }, { "kill", luaA_client_kill }, { "swap", luaA_client_swap }, { "focus_set", luaA_client_focus_set }, diff --git a/common/tokenize.gperf b/common/tokenize.gperf index 8c3c32da4..41c9f0024 100644 --- a/common/tokenize.gperf +++ b/common/tokenize.gperf @@ -13,6 +13,7 @@ bottomleft bottomright center class +clients color coords fg diff --git a/lib/awful.lua.in b/lib/awful.lua.in index 64cac9f42..03143cb90 100644 --- a/lib/awful.lua.in +++ b/lib/awful.lua.in @@ -489,11 +489,8 @@ function client.movetotag(target, c) local sel = c or capi.client.focus_get(); -- Check that tag and client screen are identical if sel.screen ~= target.screen then return end - local tags = capi.tag.get(sel.screen) - for k, t in pairs(tags) do - sel:tag(t, false) - end - sel:tag(target, true) + local tags = { target } + sel.tags = tags end --- Toggle a tag on a client. @@ -502,20 +499,14 @@ end function client.toggletag(target, c) local sel = c or capi.client.focus_get(); -- Check that tag and client screen are identical - local toggle = false - if sel then - if sel.screen ~= target.screen then return end - -- Count how many tags has the client - -- an only toggle tag if the client has at least one tag other than target - for k, v in pairs(capi.tag.get(sel.screen)) do - if target ~= v and sel:istagged(v) then - toggle = true - break - end - end - if toggle then - sel:tag(target, not sel:istagged(target)) + if sel and sel.screen == target.screen then + local tags = client.tags + if tags[target] then + tags[target] = nil + else + tags[target] = target end + sel.tags = tags end end @@ -1057,11 +1048,11 @@ function widget.taglist.label.all(t, args) bg_color = bg_focus fg_color = fg_focus end - if sel and sel:istagged(t) then + if sel and sel.tags[t] then background = "resize=\"true\" image=\"@AWESOME_ICON_PATH@/taglist/squarefw.png\"" elseif bg_urgent and fg_urgent then for k, c in pairs(capi.client.get()) do - if c:istagged(t) then + if c.tags[t] then background = "resize=\"true\" image=\"@AWESOME_ICON_PATH@/taglist/squarew.png\"" if c.urgent then bg_color = bg_urgent @@ -1148,7 +1139,7 @@ function widget.tasklist.label.currenttags(c, screen, args) -- Only print client on the same screen as this widget if c.screen ~= screen then return end for k, t in pairs(capi.tag.get(screen)) do - if t.selected and c:istagged(t) then + if t.selected and c.tags[t] then return widget_tasklist_label_common(c, args) end end diff --git a/tag.c b/tag.c index 60238d331..e0436c467 100644 --- a/tag.c +++ b/tag.c @@ -318,6 +318,7 @@ luaA_tag_new(lua_State *L) * \lfield mwfact Master width factor. * \lfield nmaster Number of master windows. * \lfield ncol Number of column for slave windows. + * \lfield clients The clients that has this tag set. */ static int luaA_tag_index(lua_State *L) @@ -325,6 +326,8 @@ luaA_tag_index(lua_State *L) size_t len; tag_t **tag = luaA_checkudata(L, 1, "tag"); const char *attr; + client_array_t *clients; + int i; if(luaA_usemetatable(L, 1, 2)) return 1; @@ -356,6 +359,16 @@ luaA_tag_index(lua_State *L) case A_TK_NCOL: lua_pushnumber(L, (*tag)->ncol); break; + case A_TK_CLIENTS: + clients = &(*tag)->clients; + luaA_otable_new(L); + for(i = 0; i < clients->len; i++) + { + luaA_client_userdata_new(L, clients->tab[i]); + luaA_client_userdata_new(L, clients->tab[i]); + lua_rawset(L, -3); + } + break; default: return 0; } @@ -376,6 +389,7 @@ luaA_tag_newindex(lua_State *L) double d; int i; layout_t *l; + client_t **c; switch(a_tokenize(attr, len)) { @@ -443,6 +457,18 @@ luaA_tag_newindex(lua_State *L) else luaL_error(L, "bad value, must be greater than 1"); break; + case A_TK_CLIENTS: + luaA_checktable(L, 3); + for(i = 0; i < (*tag)->clients.len; i++) + untag_client((*tag)->clients.tab[i], *tag); + lua_pushnil(L); + while(lua_next(L, 3)) + { + c = luaA_checkudata(L, -1, "client"); + tag_client(*c, *tag); + lua_pop(L, 1); + } + break; default: return 0; }