static unsigned long icon[ICON_WIDTH * ICON_HEIGHT + 2]; void xseticon(void) { Atom ret_type; XWMHints *wmh, *cwmh; int ret_format; unsigned long ret_nitems, ret_nleft; long offset = 0L; unsigned char *data; wmh = XGetWMHints(dpy, win); wmh->flags &= ~(IconPixmapHint | IconMaskHint); wmh->icon_pixmap = wmh->icon_mask = None; if (XGetWindowProperty(dpy, clients[sel]->win, wmatom[WMIcon], offset, LONG_MAX, False, XA_CARDINAL, &ret_type, &ret_format, &ret_nitems, &ret_nleft, &data) == Success && ret_type == XA_CARDINAL && ret_format == 32) { XChangeProperty(dpy, win, wmatom[WMIcon], XA_CARDINAL, 32, PropModeReplace, data, ret_nitems); } else if ((cwmh = XGetWMHints(dpy, clients[sel]->win)) && cwmh->flags & IconPixmapHint) { XDeleteProperty(dpy, win, wmatom[WMIcon]); wmh->flags |= IconPixmapHint; wmh->icon_pixmap = cwmh->icon_pixmap; if (cwmh->flags & IconMaskHint) { wmh->flags |= IconMaskHint; wmh->icon_mask = cwmh->icon_mask; } XFree(cwmh); } else { XChangeProperty(dpy, win, wmatom[WMIcon], XA_CARDINAL, 32, PropModeReplace, (unsigned char *) icon, ICON_WIDTH * ICON_HEIGHT + 2); } XSetWMHints(dpy, win, wmh); XFree(wmh); XFree(data); }