2010-09-05 18 views
6

Próbuję utworzyć okno X11 o głębi bitowej równej 32, dzięki czemu będę mógł używać kolorów ARGB. Oto, co zrobić:Jak utworzyć okno o głębokości bitowej 32

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); 

Oto co się dzieje:

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

Wszelkie wskazówki na temat, dlaczego nie jest to błąd BadMatch?

Odpowiedz

12

Problemem jest to kod na serwerze X 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; 
    } 

czyli „jeśli głębokość nie jest taka sama jak głębokość dominującej trzeba ustawić piksel granicy lub pixmapę”

Oto cała przykład

#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; 
} 
+1

Po ustawieniu piksela na obramowanie nadal pojawia się błędny błąd dopasowania (tak, robię to w tym samym wywołaniu XCreateWindow()). –

+1

Domyślam się, że mój program testowy również ustawi mapę kolorów. –

+1

Dzięki, wydaje się, że potrzebny jest backpixel, colormap * i * borderpixel. –

Powiązane problemy