http://stackoverflow.com/questions/3645632/how-to-create-a-window-with-a-bit-depth-of-32
加入关于visual相关的操作后不能编译,因为用到了class关键词,最终换成testwindow.c文件gcc testwindow.c -o testwindow -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 -lXcomposite -lXdamage -lXfixes -lXrender编译成功
但运行报错
[root@localhost usb]# ./testwindow
open display ok
got the screen
succeeded geting VisualInfo
succeeded geting rgba visual
creating window
creating window ok
select events ok
XMapWindow ok
X Error of failed request: BadMatch (invalid parameter attributes)
Major opcode of failed request: 1 (X_CreateWindow)
Serial number of failed request: 10
Current serial number in output stream: 12
解决问题的办法
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;
}
据此修改出自己的代码testwindow05-31-2.c
#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;
Window w;//licl2012-05-31
XEvent e;//licl2012-05-31
int s;//licl2012-05-31
dpy = XOpenDisplay(NULL);
s = DefaultScreen(dpy);//licl2012-05-31
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;
w = XCreateWindow(dpy, parent, 10, 10, 150, 100, 0, depth, InputOutput,
visual, CWBackPixel | CWColormap | CWBorderPixel, &attrs);
XSync(dpy, True);
//licl2012-05-31
XSelectInput(dpy, w, ExposureMask | KeyPressMask);
printf(" select events ok\n");
/* map (show) the window */
XMapWindow(dpy, w);
printf(" XMapWindow ok\n");
while(1)
{
XNextEvent(dpy, &e);
/* draw or redraw the window */
if(e.type == Expose)
{
//XFillRectangle(dpy, w, DefaultGC(dpy, s), 10, 10, 100, 100);
}
/* exit on key press */
//licl2012-05-30if(e.type == KeyPress)
//licl2012-05-30 break;
}
/* close connection to server */
XCloseDisplay(dpy);
//
printf("No error\n");
return 0;
}
成功创建一个透明的窗口,窗口管理器识别,可切换
下一步希望给窗口整图像,做透明