diff --git a/awesomerc.lua.in b/awesomerc.lua.in
index 1b8f19ce3..2a2f5d5a0 100644
--- a/awesomerc.lua.in
+++ b/awesomerc.lua.in
@@ -84,7 +84,15 @@ mytaglist:mouse_add(mouse({}, 3, function (object, tag) tag.selected = not tag.s
mytaglist:mouse_add(mouse({ modkey }, 3, function (object, tag) awful.client.toggletag(tag) end))
mytaglist:mouse_add(mouse({ }, 4, awful.tag.viewnext))
mytaglist:mouse_add(mouse({ }, 5, awful.tag.viewprev))
-mytaglist.text_focus = " "
+function mytaglist.label(t)
+ local text = ""
+ if t.selected then
+ text = " "..t.name.." "
+ else
+ text = " "..t.name.." "
+ end
+ return text
+end
-- Create a tasklist widget
mytasklist = widget({ type = "tasklist", name = "mytasklist" })
@@ -94,7 +102,7 @@ mytasklist:mouse_add(mouse({ }, 5, function () awful.client.focus(-1) end))
function mytasklist.label(c)
local text = ""
if c.floating then
- text = text .. ""
+ text = ""
end
if client.focus_get() == c then
text = text .. " "..c.name.." "
diff --git a/widgets/taglist.c b/widgets/taglist.c
index 832d533d5..784d16d7b 100644
--- a/widgets/taglist.c
+++ b/widgets/taglist.c
@@ -23,7 +23,6 @@
#include "widget.h"
#include "tag.h"
#include "lua.h"
-#include "common/markup.h"
#include "common/tokenize.h"
extern awesome_t globalconf;
@@ -54,56 +53,11 @@ DO_SLIST(taglist_drawn_area_t, taglist_drawn_area, taglist_drawn_area_delete);
/** Taglist widget private data */
typedef struct
{
- char *text_normal, *text_focus, *text_urgent;
bool show_empty;
taglist_drawn_area_t *drawn_area;
+ luaA_function label;
} taglist_data_t;
-
-/** Called when a markup element is encountered.
- * \param p The parser data.
- * \param elem The element.
- * \param names The element attributes names.
- * \param values The element attributes values.
- */
-static void
-tag_markup_on_elem(markup_parser_data_t *p, const char *elem,
- const char **names, const char **values)
-{
- assert(!a_strcmp(elem, "title"));
- buffer_add_xmlescaped(&p->text, NONULL(p->priv));
-}
-
-/** Parse a markup string.
- * \param t The tag we're parsing for.
- * \param str The string we're parsing.
- * \param len The string length.
- * \return The parsed string.
- */
-static char *
-tag_markup_parse(tag_t *t, const char *str, ssize_t len)
-{
- static char const * const elements[] = { "title", NULL };
- markup_parser_data_t p =
- {
- .elements = elements,
- .on_element = &tag_markup_on_elem,
- .priv = t->name,
- };
- char *ret;
-
- markup_parser_data_init(&p);
-
- if(markup_parse(&p, str, len))
- ret = buffer_detach(&p.text);
- else
- ret = a_strdup(str);
-
- markup_parser_data_wipe(&p);
-
- return ret;
-}
-
/** Check if at least one client is tagged with tag number t.
* \param t The tag to check.
* \return True if the tag has a client, false otherwise.
@@ -120,37 +74,6 @@ tag_isoccupied(tag_t *t)
return false;
}
-/** Check if a tag has at least one client with urgency hint.
- * \param t The tag.
- * \return True if the tag has a client with urgency set, false otherwise.
- */
-static bool
-tag_isurgent(tag_t *t)
-{
- client_t *c;
-
- for(c = globalconf.clients; c; c = c->next)
- if(c->isurgent && is_client_tagged(c, t))
- return true;
-
- return false;
-}
-
-/** Get the string to use for drawing the tag.
- * \param tag The tag.
- * \param data The taglist private data.
- * \return The string to use.
- */
-static char *
-taglist_text_get(tag_t *tag, taglist_data_t *data)
-{
- if(tag->selected)
- return data->text_focus;
- else if(tag_isurgent(tag))
- return data->text_urgent;
- return data->text_normal;
-}
-
/** Draw a taglist.
* \param ctx The draw context.
* \param screen The screen we're drawing for.
@@ -167,13 +90,12 @@ taglist_draw(draw_context_t *ctx, int screen, widget_node_t *w,
void *object)
{
taglist_data_t *data = w->widget->data;
- client_t *sel = globalconf.focus->client;
- area_t area, rectangle = { 0, 0, 0, 0 };
+ area_t area;
taglist_drawn_area_t *tda;
int prev_width = 0;
tag_array_t *tags = &globalconf.screens[screen].tags;
- char **text = p_alloca(char *, tags->len);
+ const char **text = p_alloca(const char *, tags->len);
draw_parser_data_t *pdata = p_alloca(draw_parser_data_t, tags->len);
w->area.width = w->area.y = 0;
@@ -198,11 +120,17 @@ taglist_draw(draw_context_t *ctx, int screen, widget_node_t *w,
{
tag_t *tag = tags->tab[i];
- text[i] = taglist_text_get(tag, data);
- text[i] = tag_markup_parse(tag, text[i], a_strlen(text[i]));
+ luaA_tag_userdata_new(globalconf.L, tag);
+ luaA_dofunction(globalconf.L, data->label, 1, 1);
+
+ if(lua_isstring(globalconf.L, -1))
+ text[i] = lua_tostring(globalconf.L, -1);
+
+ lua_pop(globalconf.L, 1);
+
draw_parser_data_init(&pdata[i]);
area = draw_text_extents(ctx->connection, ctx->phys_screen,
- globalconf.font, text[i], &pdata[i]);
+ globalconf.font, text[i], &pdata[i]);
if(pdata[i].bg_image)
area.width = MAX(area.width, pdata[i].bg_resize ? w->area.height : pdata[i].bg_image->width);
@@ -224,7 +152,6 @@ taglist_draw(draw_context_t *ctx, int screen, widget_node_t *w,
if(!data->show_empty && !tag->selected && !tag_isoccupied(tag))
{
- p_delete(&text[i]);
draw_parser_data_wipe(&pdata[i]);
continue;
}
@@ -233,16 +160,6 @@ taglist_draw(draw_context_t *ctx, int screen, widget_node_t *w,
prev_width += r->width;
draw_text(ctx, globalconf.font, *r, text[i], &pdata[i]);
draw_parser_data_wipe(&pdata[i]);
- p_delete(&text[i]);
-
- if(tag_isoccupied(tag))
- {
- rectangle.width = rectangle.height = (globalconf.font->height + 2) / 3;
- rectangle.x = r->x;
- rectangle.y = r->y;
- draw_rectangle(ctx, rectangle, 1.0,
- sel && is_client_tagged(sel, tag), &ctx->fg);
- }
}
w->area.height = ctx->height;
@@ -302,18 +219,12 @@ luaA_taglist_index(lua_State *L, awesome_token_t token)
switch(token)
{
- case A_TK_TEXT_NORMAL:
- lua_pushstring(L, d->text_normal);
- return 1;
- case A_TK_TEXT_FOCUS:
- lua_pushstring(L, d->text_focus);
- return 1;
- case A_TK_TEXT_URGENT:
- lua_pushstring(L, d->text_urgent);
- return 1;
case A_TK_SHOW_EMPTY:
lua_pushboolean(L, d->show_empty);
return 1;
+ case A_TK_LABEL:
+ lua_rawgeti(L, LUA_REGISTRYINDEX, d->label);
+ return 1;
default:
return 0;
}
@@ -328,35 +239,16 @@ static int
luaA_taglist_newindex(lua_State *L, awesome_token_t token)
{
widget_t **widget = luaA_checkudata(L, 1, "widget");
- const char *buf;
taglist_data_t *d = (*widget)->data;
switch(token)
{
- case A_TK_TEXT_NORMAL:
- if((buf = luaL_checkstring(L, 3)))
- {
- p_delete(&d->text_normal);
- d->text_normal = a_strdup(buf);
- }
- break;
- case A_TK_TEXT_FOCUS:
- if((buf = luaL_checkstring(L, 3)))
- {
- p_delete(&d->text_focus);
- d->text_focus = a_strdup(buf);
- }
- break;
- case A_TK_TEXT_URGENT:
- if((buf = luaL_checkstring(L, 3)))
- {
- p_delete(&d->text_urgent);
- d->text_urgent = a_strdup(buf);
- }
- break;
case A_TK_SHOW_EMPTY:
d->show_empty = luaA_checkboolean(L, 3);
break;
+ case A_TK_LABEL:
+ luaA_registerfct(L, &d->label);
+ break;
default:
return 0;
}
@@ -374,9 +266,6 @@ taglist_destructor(widget_t *widget)
{
taglist_data_t *d = widget->data;
- p_delete(&d->text_normal);
- p_delete(&d->text_focus);
- p_delete(&d->text_urgent);
taglist_drawn_area_list_wipe(&d->drawn_area);
p_delete(&d);
}
@@ -401,10 +290,8 @@ taglist_new(alignment_t align)
w->destructor = taglist_destructor;
w->data = d = p_new(taglist_data_t, 1);
- d->text_normal = a_strdup(" ");
- d->text_focus = a_strdup(" ");
- d->text_urgent = a_strdup(" ");
d->show_empty = true;
+ d->label = LUA_REFNIL;
/* Set cache property */
w->cache_flags = WIDGET_CACHE_TAGS | WIDGET_CACHE_CLIENTS;