diff options
Diffstat (limited to 'x.c')
-rw-r--r-- | x.c | 37 |
1 files changed, 36 insertions, 1 deletions
@@ -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); |