2010-09-05 7 views
6

Sto cercando di creare una finestra X11 con una profondità di 32 bit in modo da poter utilizzare i colori ARGB. Ecco quello che faccio:Come creare una finestra con una profondità di 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); 

Ecco cosa succede:

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

Eventuali indicazioni su cui v'è un errore di BadMatch?

risposta

12

Il problema è questo codice nel server 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; 
    } 

vale a dire "se la profondità non è uguale profondità genitore è necessario impostare il pixel frontiera o pixmap"

Qui è un intero esempio

#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

Quando ho creato un pixel di confine, ho ancora un errore di partita male (sì, sto facendo questo nella chiamata stessa XCreateWindow()). –

+1

Suppongo che il mio programma di test abbia impostato anche la mappa colori. –

+1

Grazie, sembra che ci sia bisogno di un backpixel, colormap * e * borderpixel. –