I'm trying to create a X11 window with a bit depth of 32 so that I can use ARGB colors. Here's what I do:
XVisualInfo vinfo; int depth = 32; XMatchVisualInfo(dpy, XDefaultScreen(dpy), depth, TrueColor, &vinfo); XCreateWindow(dpy, XDefaultRootWindow(dpy), 0, 0, 150, 100, 0, depth, InputOutput, vinfo.visual, 0, NULL);
Here's what happens:
X Error of failed request: BadMatch (invalid parameter attributes) Major opcode of failed request: 1 (X_CreateWindow) Serial number of failed request: 7 Current serial number in output stream: 7
Any pointers on why there is a BadMatch error?
Click Start, and then click Control Panel. In the Control Panel window, click Appearance and Themes, and then click Display. In the Display Properties window, click the Settings tab. Click to select the color depth you want from the drop-down menu under Colors.
Bit depth refers to the color information stored in an image. The higher the bit depth of an image, the more colors it can store. The simplest image, a 1 bit image, can only show two colors, black and white. That is because the 1 bit can only store one of two values, 0 (white) and 1 (black).
The problem is this code in the X server http://cgit.freedesktop.org/xorg/xserver/tree/dix/window.c#n615
if (((vmask & (CWBorderPixmap | CWBorderPixel)) == 0) &&
(class != InputOnly) &&
(depth != pParent->drawable.depth))
{
*error = BadMatch;
return NullWindow;
}
i.e. "if depth isn't same as parent depth you have to set the border pixel or pixmap"
Here is a whole example
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/extensions/Xcomposite.h>
#include <stdio.h>
int main(int argc, char **argv)
{
Display *dpy;
XVisualInfo vinfo;
int depth;
XVisualInfo *visual_list;
XVisualInfo visual_template;
int nxvisuals;
int i;
XSetWindowAttributes attrs;
Window parent;
Visual *visual;
dpy = XOpenDisplay(NULL);
nxvisuals = 0;
visual_template.screen = DefaultScreen(dpy);
visual_list = XGetVisualInfo (dpy, VisualScreenMask, &visual_template, &nxvisuals);
for (i = 0; i < nxvisuals; ++i)
{
printf(" %3d: visual 0x%lx class %d (%s) depth %d\n",
i,
visual_list[i].visualid,
visual_list[i].class,
visual_list[i].class == TrueColor ? "TrueColor" : "unknown",
visual_list[i].depth);
}
if (!XMatchVisualInfo(dpy, XDefaultScreen(dpy), 32, TrueColor, &vinfo))
{
fprintf(stderr, "no such visual\n");
return 1;
}
printf("Matched visual 0x%lx class %d (%s) depth %d\n",
vinfo.visualid,
vinfo.class,
vinfo.class == TrueColor ? "TrueColor" : "unknown",
vinfo.depth);
parent = XDefaultRootWindow(dpy);
XSync(dpy, True);
printf("creating RGBA child\n");
visual = vinfo.visual;
depth = vinfo.depth;
attrs.colormap = XCreateColormap(dpy, XDefaultRootWindow(dpy), visual, AllocNone);
attrs.background_pixel = 0;
attrs.border_pixel = 0;
XCreateWindow(dpy, parent, 10, 10, 150, 100, 0, depth, InputOutput,
visual, CWBackPixel | CWColormap | CWBorderPixel, &attrs);
XSync(dpy, True);
printf("No error\n");
return 0;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With