[taglist] Honors style; use pointers instead of hard copies

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2008-04-28 16:34:54 +02:00
parent 5397e10a0f
commit c9f8d4e859

View file

@ -81,6 +81,17 @@ tag_isurgent(tag_t *t)
return false;
}
static style_t *
taglist_style_get(tag_t *tag, VirtScreen *vs)
{
if(tag->selected)
return &vs->styles.focus;
else if(tag_isurgent(tag))
return &vs->styles.urgent;
return &vs->styles.normal;
}
static char *
taglist_text_get(tag_t *tag, taglist_data_t *data)
{
@ -101,27 +112,28 @@ taglist_draw(widget_t *widget,
tag_t *tag;
taglist_data_t *data = widget->data;
client_t *sel = globalconf.focus->client;
VirtScreen vscreen = globalconf.screens[widget->statusbar->screen];
VirtScreen *vscreen = &globalconf.screens[widget->statusbar->screen];
int i = 0;
style_t style = vscreen.styles.normal;
style_t **styles;
area_t *area, rectangle = { 0, 0, 0, 0, NULL, NULL };
char **text;
rectangle.width = rectangle.height = (style.font->height + 2) / 3;
widget->area.width = 0;
area_list_wipe(&data->draw_area);
text = p_new(char *, 1);
for(tag = vscreen.tags; tag; tag = tag->next, i++)
styles = p_new(style_t *, 1);
for(tag = vscreen->tags; tag; tag = tag->next, i++)
{
area = p_new(area_t, 1);
p_realloc(&text, i + 1);
p_realloc(&styles, i + 1);
styles[i] = taglist_style_get(tag, vscreen);
area = p_new(area_t, 1);
text[i] = taglist_text_get(tag, data);
text[i] = tag_markup_parse(tag, text[i], a_strlen(text[i]));
*area = draw_text_extents(ctx->connection, ctx->default_screen,
style.font, text[i]);
styles[i]->font, text[i]);
area->x = widget->area.width;
area->height = widget->statusbar->height;
area_list_append(&data->draw_area, area);
@ -137,21 +149,26 @@ taglist_draw(widget_t *widget,
if(!widget->user_supplied_y)
widget->area.y = 0;
for(area = data->draw_area, tag = vscreen.tags, i = 0;
for(area = data->draw_area, tag = vscreen->tags, i = 0;
tag && area;
tag = tag->next, area = area->next, i++)
{
draw_text(ctx, *area, text[i], style);
draw_text(ctx, *area, text[i], *styles[i]);
p_delete(&text[i]);
if(tag_isoccupied(tag))
{
rectangle.width = rectangle.height = (styles[i]->font->height + 2) / 3;
rectangle.x = area->x;
rectangle.y = area->y;
draw_rectangle(ctx, rectangle, 1.0,
sel && is_client_tagged(sel, tag), style.fg);
sel && is_client_tagged(sel, tag), styles[i]->fg);
}
}
p_delete(&text);
p_delete(&styles);
widget->area.height = widget->statusbar->height;
return widget->area.width;
}
@ -159,7 +176,7 @@ taglist_draw(widget_t *widget,
static void
taglist_button_press(widget_t *widget, xcb_button_press_event_t *ev)
{
VirtScreen vscreen = globalconf.screens[widget->statusbar->screen];
VirtScreen *vscreen = &globalconf.screens[widget->statusbar->screen];
Button *b;
tag_t *tag;
char buf[4];
@ -172,7 +189,7 @@ taglist_button_press(widget_t *widget, xcb_button_press_event_t *ev)
switch(widget->statusbar->position)
{
default:
for(tag = vscreen.tags; tag; tag = tag->next, i++, area = area->next)
for(tag = vscreen->tags; tag; tag = tag->next, i++, area = area->next)
if(ev->event_x >= AREA_LEFT(*area)
&& ev->event_x < AREA_RIGHT(*area))
{
@ -182,7 +199,7 @@ taglist_button_press(widget_t *widget, xcb_button_press_event_t *ev)
}
break;
case Right:
for(tag = vscreen.tags; tag; tag = tag->next, i++, area = area->next)
for(tag = vscreen->tags; tag; tag = tag->next, i++, area = area->next)
if(ev->event_y >= AREA_LEFT(*area)
&& ev->event_y < AREA_RIGHT(*area))
{
@ -192,7 +209,7 @@ taglist_button_press(widget_t *widget, xcb_button_press_event_t *ev)
}
break;
case Left:
for(tag = vscreen.tags; tag; tag = tag->next, i++, area = area->next)
for(tag = vscreen->tags; tag; tag = tag->next, i++, area = area->next)
if(widget->statusbar->width - ev->event_y >= AREA_LEFT(*area)
&& widget->statusbar->width - ev->event_y < AREA_RIGHT(*area))
{