ewmh: store NET_WM icon

Signed-off-by: Julien Danjou <julien@danjou.info>
This commit is contained in:
Julien Danjou 2008-08-11 23:10:02 +02:00
parent f9954cd6af
commit 1fbe4f0d5e
7 changed files with 31 additions and 21 deletions

View File

@ -399,6 +399,7 @@ client_manage(xcb_window_t w, xcb_get_geometry_reply_t *wgeom, int screen)
c->geometry.height = c->f_geometry.height = c->m_geometry.height = wgeom->height;
c->layer = c->oldlayer = LAYER_TILE;
client_setborder(c, wgeom->border_width);
c->icon = ewmh_window_icon_get(c->win);
/* update hints */
u_size_hints = client_updatesizehints(c);

View File

@ -538,6 +538,12 @@ event_handle_propertynotify(void *data __attribute__ ((unused)),
client_updatewmhints(c);
else if(ev->atom == WM_NAME || ev->atom == _NET_WM_NAME)
client_updatetitle(c);
else if(ev->atom == _NET_WM_ICON)
{
netwm_icon_delete(&c->icon);
c->icon = ewmh_window_icon_get(c->win);
widget_invalidate_cache(c->screen, WIDGET_CACHE_CLIENTS);
}
}
return 0;

2
ewmh.c
View File

@ -516,7 +516,7 @@ ewmh_check_client_hints(client_t *c)
* \return A netwm_icon_t structure which must be deleted after usage.
*/
netwm_icon_t *
ewmh_get_window_icon(xcb_window_t w)
ewmh_window_icon_get(xcb_window_t w)
{
double alpha;
netwm_icon_t *icon;

12
ewmh.h
View File

@ -24,18 +24,14 @@
#include "structs.h"
typedef struct
{
int height;
int width;
unsigned char *image;
} netwm_icon_t;
static inline void
netwm_icon_delete(netwm_icon_t **i)
{
if(*i)
{
p_delete(&(*i)->image);
p_delete(i);
}
}
void ewmh_init(int);
@ -48,7 +44,7 @@ int ewmh_process_client_message(xcb_client_message_event_t *);
void ewmh_update_net_client_list_stacking(int);
void ewmh_check_client_hints(client_t *);
void ewmh_update_workarea(int);
netwm_icon_t * ewmh_get_window_icon(xcb_window_t);
netwm_icon_t * ewmh_window_icon_get(xcb_window_t);
void ewmh_restart(void);
#endif

View File

@ -236,6 +236,14 @@ struct statusbar_t
statusbar_t *prev, *next;
};
/** Netwm icon */
typedef struct
{
int height;
int width;
unsigned char *image;
} netwm_icon_t;
/** client_t type */
struct client_t
{
@ -295,6 +303,8 @@ struct client_t
button_t *buttons;
/** Floating window placement algo */
floating_placement_t *floating_placement;
/** Icon */
netwm_icon_t *icon;
/** Next and previous clients */
client_t *prev, *next;
};

View File

@ -42,7 +42,6 @@ appicon_draw(draw_context_t *ctx, int screen __attribute__ ((unused)),
void *p, awesome_type_t type)
{
client_t *c = NULL;
netwm_icon_t *icon;
draw_image_t *image;
switch(type)
@ -68,10 +67,10 @@ appicon_draw(draw_context_t *ctx, int screen __attribute__ ((unused)),
w->area.y, ctx->height, image);
draw_image_delete(&image);
}
else if((icon = ewmh_get_window_icon(c->win)))
else if(c->icon)
{
w->area.width = ((double) ctx->height / (double) icon->height)
* icon->width;
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,
@ -79,9 +78,8 @@ appicon_draw(draw_context_t *ctx, int screen __attribute__ ((unused)),
draw_image_from_argb_data(ctx,
w->area.x,
w->area.y,
icon->width, icon->height,
ctx->height, icon->image);
netwm_icon_delete(&icon);
c->icon->width, c->icon->height,
ctx->height, c->icon->image);
}
}
else

View File

@ -118,7 +118,6 @@ tasklist_draw(draw_context_t *ctx, int screen,
tasklist_data_t *d = w->widget->data;
area_t area;
int i = 0, icon_width = 0, box_width_rest = 0;
netwm_icon_t *icon;
draw_image_t *image;
draw_parser_data_t pdata, *parser_data;
tasklist_object_data_t *odata;
@ -213,8 +212,9 @@ tasklist_draw(draw_context_t *ctx, int screen,
draw_image_delete(&image);
}
if(!icon_width && (icon = ewmh_get_window_icon(odata->client_labels.tab[i].client->win)))
if(!icon_width && odata->client_labels.tab[i].client->icon)
{
netwm_icon_t *icon = odata->client_labels.tab[i].client->icon;
icon_width = ((double) ctx->height / (double) icon->height)
* icon->width;
draw_image_from_argb_data(ctx,
@ -222,7 +222,6 @@ tasklist_draw(draw_context_t *ctx, int screen,
w->area.y,
icon->width, icon->height,
ctx->height, icon->image);
netwm_icon_delete(&icon);
}
}
else