ewmh: store netwm icon as draw_image_t

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2008-09-11 14:49:42 +02:00
parent 6ca4e58f3d
commit 2fad185fcf
6 changed files with 27 additions and 59 deletions

View File

@ -668,7 +668,7 @@ event_handle_propertynotify(void *data __attribute__ ((unused)),
else if(ev->atom == _NET_WM_ICON) else if(ev->atom == _NET_WM_ICON)
{ {
xcb_get_property_cookie_t icon_q = ewmh_window_icon_get_unchecked(c->win); xcb_get_property_cookie_t icon_q = ewmh_window_icon_get_unchecked(c->win);
netwm_icon_delete(&c->icon); draw_image_delete(&c->icon);
widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS); widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS);
c->icon = ewmh_window_icon_get_reply(icon_q); c->icon = ewmh_window_icon_get_reply(icon_q);
} }

12
ewmh.c
View File

@ -507,13 +507,13 @@ ewmh_window_icon_get_unchecked(xcb_window_t w)
/** Get NET_WM_ICON. /** Get NET_WM_ICON.
* \param cookie The cookie. * \param cookie The cookie.
* \return A netwm_icon_t structure which must be deleted after usage. * \return A draw_image_t structure which must be deleted after usage.
*/ */
netwm_icon_t * draw_image_t *
ewmh_window_icon_get_reply(xcb_get_property_cookie_t cookie) ewmh_window_icon_get_reply(xcb_get_property_cookie_t cookie)
{ {
double alpha; double alpha;
netwm_icon_t *icon; draw_image_t *icon;
int size, i; int size, i;
uint32_t *data; uint32_t *data;
unsigned char *imgdata; unsigned char *imgdata;
@ -527,7 +527,7 @@ ewmh_window_icon_get_reply(xcb_get_property_cookie_t cookie)
return NULL; return NULL;
} }
icon = p_new(netwm_icon_t, 1); icon = p_new(draw_image_t, 1);
icon->width = data[0]; icon->width = data[0];
icon->height = data[1]; icon->height = data[1];
@ -540,8 +540,8 @@ ewmh_window_icon_get_reply(xcb_get_property_cookie_t cookie)
return NULL; return NULL;
} }
icon->image = p_new(unsigned char, size * 4); icon->data = p_new(unsigned char, size * 4);
for(imgdata = icon->image, i = 2; i < size + 2; i++, imgdata += 4) for(imgdata = icon->data, i = 2; i < size + 2; i++, imgdata += 4)
{ {
imgdata[3] = (data[i] >> 24) & 0xff; /* A */ imgdata[3] = (data[i] >> 24) & 0xff; /* A */
alpha = imgdata[3] / 255.0; alpha = imgdata[3] / 255.0;

12
ewmh.h
View File

@ -24,16 +24,6 @@
#include "structs.h" #include "structs.h"
static inline void
netwm_icon_delete(netwm_icon_t **i)
{
if(*i)
{
p_delete(&(*i)->image);
p_delete(i);
}
}
void ewmh_init(int); void ewmh_init(int);
void ewmh_update_net_client_list(int); void ewmh_update_net_client_list(int);
void ewmh_update_net_numbers_of_desktop(int); void ewmh_update_net_numbers_of_desktop(int);
@ -46,7 +36,7 @@ void ewmh_check_client_hints(client_t *);
void ewmh_update_workarea(int); void ewmh_update_workarea(int);
void ewmh_client_strut_update(client_t *); void ewmh_client_strut_update(client_t *);
xcb_get_property_cookie_t ewmh_window_icon_get_unchecked(xcb_window_t); xcb_get_property_cookie_t ewmh_window_icon_get_unchecked(xcb_window_t);
netwm_icon_t *ewmh_window_icon_get_reply(xcb_get_property_cookie_t); draw_image_t *ewmh_window_icon_get_reply(xcb_get_property_cookie_t);
#endif #endif
// vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80 // vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80

View File

@ -253,14 +253,6 @@ struct statusbar_t
statusbar_t *prev, *next; statusbar_t *prev, *next;
}; };
/** Netwm icon */
typedef struct
{
int height;
int width;
unsigned char *image;
} netwm_icon_t;
/* Strut */ /* Strut */
typedef struct typedef struct
{ {
@ -337,7 +329,7 @@ struct client_t
/** Button bindings */ /** Button bindings */
button_array_t buttons; button_array_t buttons;
/** Icon */ /** Icon */
netwm_icon_t *icon; draw_image_t *icon;
/** Size hints */ /** Size hints */
xcb_size_hints_t size_hints; xcb_size_hints_t size_hints;
/** Next and previous clients */ /** Next and previous clients */

View File

@ -56,7 +56,10 @@ appicon_draw(draw_context_t *ctx, int screen __attribute__ ((unused)),
if(c) if(c)
{ {
if((image = draw_image_new(c->icon_path))) if(!(image = draw_image_new(c->icon_path)))
image = c->icon;
if(image)
{ {
w->area.width = ((double) ctx->height / (double) image->height) * image->width; w->area.width = ((double) ctx->height / (double) image->height) * image->width;
w->area.x = widget_calculate_offset(ctx->width, w->area.x = widget_calculate_offset(ctx->width,
@ -65,21 +68,8 @@ appicon_draw(draw_context_t *ctx, int screen __attribute__ ((unused)),
w->widget->align); w->widget->align);
draw_image(ctx, w->area.x, draw_image(ctx, w->area.x,
w->area.y, ctx->height, image); w->area.y, ctx->height, image);
draw_image_delete(&image); if(image != c->icon)
} draw_image_delete(&image);
else if(c->icon)
{
w->area.width = ((double) ctx->height / (double) c->icon->height)
* c->icon->width;
w->area.x = widget_calculate_offset(ctx->width,
w->area.width,
offset,
w->widget->align);
draw_image_from_argb_data(ctx,
w->area.x,
w->area.y,
c->icon->width, c->icon->height,
ctx->height, c->icon->image);
} }
} }
else else

View File

@ -142,24 +142,20 @@ tasklist_draw_item(draw_context_t *ctx,
else else
parser_data = NULL; parser_data = NULL;
if((image = draw_image_new(odata->client_labels.tab[i].client->icon_path))) /* use image from icon_path, otherwise netwm icon */
{ if(!(image = draw_image_new(odata->client_labels.tab[i].client->icon_path)))
icon_width = ((double) ctx->height / (double) image->height) * image->width; image = odata->client_labels.tab[i].client->icon;
draw_image(ctx, w->area.x + pos,
w->area.y, ctx->height, image);
draw_image_delete(&image);
}
if(!icon_width && odata->client_labels.tab[i].client->icon) if(image)
{ {
netwm_icon_t *icon = odata->client_labels.tab[i].client->icon;
icon_width = ((double) ctx->height / (double) icon->height) icon_width = ((double) ctx->height / (double) image->height) * image->width;
* icon->width; draw_image(ctx, w->area.x + odata->box_width * i,
draw_image_from_argb_data(ctx, w->area.y, ctx->height, image);
w->area.x + pos,
w->area.y, /* a bit hackish */
icon->width, icon->height, if(image != odata->client_labels.tab[i].client->icon)
ctx->height, icon->image); draw_image_delete(&image);
} }
} }
else else