Hi, I am using libX11/Xlib C bindings to write a routine that, given two arbitrary pixmaps (one of them is a bitmap mask), creates an icon window with the pixmap as background pixmap and Xshape'd with the bitmap as shape bounding.
First, I was using XCreateWindow(3) with a CWBackPixmap attribute. However, I got BadMatch error from the CreateWindow request. That is probably because of window's and pixmap's unmatching depths. Then, I tried to create the icon window using the pixmap's depth, but a BadMatch error still occurs. That is probably because the default visual does not support the given depth. If that is the case, I do not know how to get a proper visual. Here is my current (broken) solution in C99: Display *display; Pixmap icon, mask; Window win; unsigned int width, height, depth; char const **xpmdata; if (icon == None) { /* fallback to default icon; that works */ XpmAttributes xpmattr = { 0 }; int status; status = XpmCreatePixmapFromData( display, DefaultRootWindow(display), xpmdata, &icon, &mask, &xpmattr ); if (status != XpmSuccess || icon == None) return None; width = xpmattr.width; height = xpmattr.height; depth = xpmattr.depth; } else { Status success; success = XGetGeometry( display, icon, &(Window){0}, &(int){0}, &width, &height, &(unsigned){0}, &depth ); if (!success) return None; } win = XCreateWindow( display, root, 0, 0, width, height, 0, depth, InputOutput, CopyFromParent, CWBackPixmap | CWOverrideRedirect, &(XSetWindowAttributes){ .background_pixmap = icon, .override_redirect = True, } ); XShapeCombineMask(display, win, ShapeBounding, 0, 0, mask, ShapeSet); XFreePixmap(display, icon); XFreePixmap(display, mask); return win; What is the proper solution? I checked how a few iconifying window managers deal with clients providing icon pixmap and mask on XWMHints(3). But as far as I could understand, fvwm and twm ignores pixmaps with non-default depths; and windowmaker creates an XImage from the pixmap and then creates a default-depth pixmap back from it. Is the latter approach the most correct (or only) one? -- Lucas de Sena