summaryrefslogtreecommitdiff
path: root/x.c
diff options
context:
space:
mode:
Diffstat (limited to 'x.c')
-rw-r--r--x.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/x.c b/x.c
index 4965a52..282e916 100644
--- a/x.c
+++ b/x.c
@@ -99,7 +99,7 @@ typedef struct {
Window win;
Drawable buf;
GlyphFontSpec *specbuf; /* font spec buffer used for rendering */
- Atom xembed, wmdeletewin, netwmname, netwmiconname, netwmpid;
+ Atom xembed, wmdeletewin, netwmname, netwmicon, netwmiconname, netwmpid;
struct {
XIM xim;
XIC xic;
@@ -1373,6 +1373,41 @@ xinit(int cols, int rows)
xw.netwmiconname = XInternAtom(xw.dpy, "_NET_WM_ICON_NAME", False);
XSetWMProtocols(xw.dpy, xw.win, &xw.wmdeletewin, 1);
+ /* use a png-image to set _NET_WM_ICON */
+ FILE* file = fopen(ICON, "r");
+ if (file) {
+ /* load image in rgba-format */
+ const gdImagePtr icon_rgba = gdImageCreateFromPng(file);
+ fclose(file);
+ /* declare icon-variable which will store the image in argb-format */
+ const int width = gdImageSX(icon_rgba);
+ const int height = gdImageSY(icon_rgba);
+ const int icon_n = width * height + 2;
+ long icon_argb[icon_n];
+ /* set width and height of the icon */
+ int i = 0;
+ icon_argb[i++] = width;
+ icon_argb[i++] = height;
+ /* rgba -> argb */
+ for (int y = 0; y < height; y++) {
+ for (int x = 0; x < width; x++) {
+ const int pixel_rgba = gdImageGetPixel(icon_rgba, x, y);
+ unsigned char *pixel_argb = (unsigned char *) &icon_argb[i++];
+ pixel_argb[0] = gdImageBlue(icon_rgba, pixel_rgba);
+ pixel_argb[1] = gdImageGreen(icon_rgba, pixel_rgba);
+ pixel_argb[2] = gdImageRed(icon_rgba, pixel_rgba);
+ /* scale alpha from 0-127 to 0-255 */
+ const unsigned char alpha = 127 - gdImageAlpha(icon_rgba, pixel_rgba);
+ pixel_argb[3] = alpha == 127 ? 255 : alpha * 2;
+ }
+ }
+ gdImageDestroy(icon_rgba);
+ /* set _NET_WM_ICON */
+ xw.netwmicon = XInternAtom(xw.dpy, "_NET_WM_ICON", False);
+ XChangeProperty(xw.dpy, xw.win, xw.netwmicon, XA_CARDINAL, 32,
+ PropModeReplace, (uchar *) icon_argb, icon_n);
+ }
+
xw.netwmpid = XInternAtom(xw.dpy, "_NET_WM_PID", False);
XChangeProperty(xw.dpy, xw.win, xw.netwmpid, XA_CARDINAL, 32,
PropModeReplace, (uchar *)&thispid, 1);