fyne-io/fyne · critical
XCreateColormap failed\n
Error message
XCreateColormap failed\n
What it means
After resolving the visual, x11.c creates a colormap for it before creating the window. XCreateColormap returning NULL means the X server refused the allocation: usually resource limits on the server or an exotic visual (DirectColor, unusual depth) rather than TrueColor, for which colormaps are essentially free. The process prints 'XCreateColormap failed' and exits(1).
Solutions
- Run the X server at 24-bit TrueColor depth where colormap allocation cannot fail: xvfb-run -a -s '-screen 0 1024x768x24' ./yourapp
- Close leaking X clients or restart the X server / Xvfb instance
- Check server limits with xdpyinfo | grep -i 'number of' before launching
- Update the graphics stack if the failure persists on a normal desktop server
Example fix
# before: Xvfb at 8-bit depth, colormap allocation fails Xvfb :99 -screen 0 1024x768x8 & DISPLAY=:99 ./yourapp # after: TrueColor 24-bit server, colormap allocation succeeds Xvfb :99 -screen 0 1024x768x24 & DISPLAY=:99 ./yourapp
Defensive patterns
Strategy: validation
Validate before calling
func xResourcePreflight() error {
out, err := exec.Command("sh", "-c", "xdpyinfo | grep -i 'number of clients'").CombinedOutput()
if err != nil {
return fmt.Errorf("cannot query X server: %w", err)
}
_ = out // server reachable; restart it if colormap resources are exhausted
return nil
} Prevention
- Use 24-bit TrueColor servers where colormaps are trivially allocated
- Restart long-lived Xvfb instances in CI between heavy jobs
- Avoid 8-bit or pseudocolor depths for OpenGL apps
When it happens
Trigger: Creating a colormap for visInfo->visual fails on a server at its resource limit, or for a visual class that requires real colormap cells on an 8-bit/pseudocolor or otherwise non-TrueColor server.
Common situations: Long-running or leaky X servers (many clients allocated colormaps/cells); Xvfb started at low depth (8/16-bit); embedded or minimal X servers with tight resource pools.
Related errors
- XGetVisualInfo failed\n
- eglChooseConfig failed\n
- eglCreateWindowSurface failed\n
- eglGetConfigAttrib failed\n
- eglGetDisplay failed\n
AI-assisted analysis of fyne-io/fyne@8860ee95c3 (2026-08-15).
Data as JSON: /api/errors/03aa90d9649d3f42.
Report an issue: GitHub.
Appendix: source
Thrown at internal/driver/mobile/app/x11.c:56
fprintf(stderr, "eglGetConfigAttrib failed\n");
exit(1);
}
XVisualInfo visTemplate;
visTemplate.visualid = vid;
int num_visuals;
XVisualInfo *visInfo = XGetVisualInfo(x_dpy, VisualIDMask, &visTemplate, &num_visuals);
if (!visInfo) {
fprintf(stderr, "XGetVisualInfo failed\n");
exit(1);
}
Window root = RootWindow(x_dpy, DefaultScreen(x_dpy));
XSetWindowAttributes attr;
attr.colormap = XCreateColormap(x_dpy, root, visInfo->visual, AllocNone);
if (!attr.colormap) {
fprintf(stderr, "XCreateColormap failed\n");
exit(1);
}
attr.event_mask = StructureNotifyMask | ExposureMask |
ButtonPressMask | ButtonReleaseMask | ButtonMotionMask;
Window win = XCreateWindow(
x_dpy, root, 0, 0, w, h, 0, visInfo->depth, InputOutput,
visInfo->visual, CWColormap | CWEventMask, &attr);
XFree(visInfo);
XSizeHints sizehints;
sizehints.width = w;
sizehints.height = h;
sizehints.flags = USSize;
XSetNormalHints(x_dpy, win, &sizehints);
XSetStandardProperties(x_dpy, win, "App", "App", None, (char **)NULL, 0, &sizehints);
static const EGLint ctx_attribs[] = {View on GitHub (pinned to 8860ee95c3)