From 62d5711a7e025b0f8310946ee2a852fc46840a4a Mon Sep 17 00:00:00 2001 From: Julien Danjou Date: Thu, 3 Jan 2008 19:02:23 +0100 Subject: [PATCH] move NetWMIcon get to ewmh.c --- ewmh.c | 51 +++++++++++++++++++++++++++++++++++++++++ ewmh.h | 8 +++++++ widgets/netwmicon.c | 56 +++++++++------------------------------------ 3 files changed, 70 insertions(+), 45 deletions(-) diff --git a/ewmh.c b/ewmh.c index 4b4964c6..767a5740 100644 --- a/ewmh.c +++ b/ewmh.c @@ -325,4 +325,55 @@ ewmh_check_client_hints(Client *c) } } +NetWMIcon * +ewmh_get_window_icon(Window w) +{ + NetWMIcon *icon; + Atom type; + int format, size, i; + unsigned long items, rest, *data, pixel; + unsigned char *imgdata, *wdata; + + if(XGetWindowProperty(globalconf.display, w, + net_wm_icon, 0L, LONG_MAX, False, XA_CARDINAL, &type, &format, + &items, &rest, &wdata) != Success + || !wdata) + return NULL; + + if(type != XA_CARDINAL || format != 32 || items < 2) + { + XFree(wdata); + return NULL; + } + + icon = p_new(NetWMIcon, 1); + + data = (unsigned long *) wdata; + + icon->width = data[0]; + icon->height = data[1]; + size = icon->width * icon->height; + + if(!size) + { + p_delete(&icon); + XFree(wdata); + return NULL; + } + + icon->image = p_new(unsigned char, size * 4); + for(imgdata = icon->image, i = 2; i < size + 2; i++, imgdata += 4) + { + pixel = data[i]; + imgdata[3] = (pixel >> 24) & 0xff; /* A */ + imgdata[0] = (pixel >> 16) & 0xff; /* R */ + imgdata[1] = (pixel >> 8) & 0xff; /* G */ + imgdata[2] = pixel & 0xff; /* B */ + } + + XFree(wdata); + + return icon; +} + // vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80 diff --git a/ewmh.h b/ewmh.h index 89f1f9a6..0beda962 100644 --- a/ewmh.h +++ b/ewmh.h @@ -24,6 +24,13 @@ #include "config.h" +typedef struct +{ + int height; + int width; + unsigned char *image; +} NetWMIcon; + void ewmh_init_atoms(void); void ewmh_set_supported_hints(int); void ewmh_update_net_client_list(int); @@ -33,6 +40,7 @@ void ewmh_update_net_desktop_names(int); void ewmh_update_net_active_window(int); void ewmh_process_client_message(XClientMessageEvent *); void ewmh_check_client_hints(Client *); +NetWMIcon * ewmh_get_window_icon(Window); #endif // vim: filetype=c:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=80 diff --git a/widgets/netwmicon.c b/widgets/netwmicon.c index ee8b15c3..2b80fd6c 100644 --- a/widgets/netwmicon.c +++ b/widgets/netwmicon.c @@ -26,6 +26,7 @@ #include "tag.h" #include "widget.h" #include "rules.h" +#include "ewmh.h" extern AwesomeConf globalconf; @@ -33,15 +34,10 @@ static int netwmicon_draw(Widget *widget, DrawCtx *ctx, int offset, int used __attribute__ ((unused))) { - unsigned long *data, pixel; - unsigned char *wdata; - Atom type; - int format, width, height, size, i; Area area; - unsigned long items, rest; - unsigned char *image, *imgdata; Rule* r; Client *sel = focus_get_current_client(widget->statusbar->screen); + NetWMIcon *icon; if(!sel) return 0; @@ -60,53 +56,23 @@ netwmicon_draw(Widget *widget, DrawCtx *ctx, int offset, return widget->width; } - if(XGetWindowProperty(globalconf.display, sel->win, - XInternAtom(globalconf.display, "_NET_WM_ICON", False), - 0L, LONG_MAX, False, XA_CARDINAL, &type, &format, - &items, &rest, &wdata) != Success - || !wdata) + + if(!(icon = ewmh_get_window_icon(sel->win))) return 0; - if(type != XA_CARDINAL || format != 32 || items < 2) - { - XFree(wdata); - return 0; - } - - data = (unsigned long *) wdata; - - width = data[0]; - height = data[1]; - size = width * height; - - if(!size) - { - XFree(wdata); - return 0; - } - - image = p_new(unsigned char, size * 4); - for(imgdata = image, i = 2; i < size + 2; i++, imgdata += 4) - { - pixel = data[i]; - imgdata[3] = (pixel >> 24) & 0xff; /* A */ - imgdata[0] = (pixel >> 16) & 0xff; /* R */ - imgdata[1] = (pixel >> 8) & 0xff; /* G */ - imgdata[2] = pixel & 0xff; /* B */ - } + widget->width = ((double) widget->statusbar->height / (double) icon->height) * icon->width; widget->location = widget_calculate_offset(widget->statusbar->width, - width, + widget->width, offset, widget->alignment); - draw_image_from_argb_data(ctx, widget->location, 0, width, height, widget->statusbar->height, image); + draw_image_from_argb_data(ctx, + widget->location, 0, + icon->width, icon->height, + widget->statusbar->height, icon->image); + p_delete(&icon); - p_delete(&image); - - XFree(wdata); - - widget->width = widget->statusbar->height; return widget->width; }