2010-09-05 4 views
6

J'essaie de créer une fenêtre X11 avec une profondeur de 32 bits pour pouvoir utiliser les couleurs ARGB. Voici ce que je fais:Comment créer une fenêtre avec une profondeur de bits de 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); 

Voici ce qui se passe:

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

Les pointeurs sur pourquoi il y a une erreur BadMatch?

Répondre

12

Le problème est ce code dans le serveur 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; 
    } 

-à-dire « si la profondeur est pas la même que la profondeur de parent, vous devez définir le pixel frontière ou pixmap »

Voici un ensemble exemple

#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

Lorsque je définis un pixel de bordure, j'obtiens toujours une erreur de correspondance incorrecte (Oui, je le fais dans le même appel XCreateWindow()). –

+1

Je suppose que mon programme de test a également défini la palette de couleurs. –

+1

Merci, on dirait qu'il faut un backpixel, colormap * et * borderpixel. –

Questions connexes