C 为什么我设置xlib窗口背景透明失败?;

C 为什么我设置xlib窗口背景透明失败?;,c,linux,window,transparent,xlib,C,Linux,Window,Transparent,Xlib,我使用下面的代码获得一个透明窗口,但它返回黑色。我怎么了?还有,谁能给我一个简单的例子来创建一个透明背景的窗口?谢谢 #include <X11/Xlib.h> #include <X11/Xutil.h> int main(int argc, char* argv[]) { Display* display = XOpenDisplay(NULL); XVisualInfo vinfo; XMatchVisualInfo(display, D

我使用下面的代码获得一个透明窗口,但它返回黑色。我怎么了?还有,谁能给我一个简单的例子来创建一个透明背景的窗口?谢谢

#include <X11/Xlib.h>
#include <X11/Xutil.h>

int main(int argc, char* argv[])
{
    Display* display = XOpenDisplay(NULL);

    XVisualInfo vinfo;
    XMatchVisualInfo(display, DefaultScreen(display), 32, TrueColor, &vinfo);

    XSetWindowAttributes attr;
    attr.colormap = XCreateColormap(display, DefaultRootWindow(display), vinfo.visual, AllocNone);
    attr.border_pixel = 0;
    attr.background_pixel = 0;

    Window win = XCreateWindow(display, DefaultRootWindow(display), 0, 0, 300, 200, 0, vinfo.depth, InputOutput, vinfo.visual, CWColormap | CWBorderPixel | CWBackPixel, &attr);
    XSelectInput(display, win, StructureNotifyMask);
    GC gc = XCreateGC(display, win, 0, 0);

    Atom wm_delete_window = XInternAtom(display, "WM_DELETE_WINDOW", 0);
    XSetWMProtocols(display, win, &wm_delete_window, 1);

    XMapWindow(display, win);

    int keep_running = 1;
    XEvent event;

    while (keep_running) {
        XNextEvent(display, &event);

        switch(event.type) {
            case ClientMessage:
                if (event.xclient.message_type == XInternAtom(display, "WM_PROTOCOLS", 1) && (Atom)event.xclient.data.l[0] == XInternAtom(display, "WM_DELETE_WINDOW", 1))
                    keep_running = 0;

                break;

            default:
                break;
        }
    }

    XDestroyWindow(display, win);
    XCloseDisplay(display);
    return 0;
}
#包括
#包括
int main(int argc,char*argv[])
{
Display*Display=XOpenDisplay(空);
十六苏阿林佛酒;
XMatchVisualInfo(显示、默认屏幕(显示)、32、TrueColor和vinfo);
xsetwindowatts attr;
attr.colormap=XCreateColormap(显示,DefaultRootWindow(显示),vinfo.visual,allocOne);
attr.border_像素=0;
attr.background_pixel=0;
Window win=XCreateWindow(显示,DefaultRootWindow(显示),0,0,300,200,0,vinfo.depth,InputOutput,vinfo.visual,CWColormap | CWBorderPixel | CWBackPixel,&attr);
XSelectInput(显示、win、StructureNotifyMask);
GC-GC=XCreateGC(显示,赢,0,0);
Atom wm_delete_window=XInternAtom(显示“wm_delete_window”,0);
XSetWMProtocols(显示、win和wm_删除_窗口,1);
XMapWindow(显示,赢);
int保持_运行=1;
XEvent事件;
while(保持运行){
XNextEvent(显示和事件);
开关(事件类型){
案例客户端消息:
if(event.xclient.message_type==XInternAtom(显示“WM_协议”,1)和&(Atom)event.xclient.data.l[0]==XInternAtom(显示“WM_删除窗口”,1))
保持_运行=0;
打破
违约:
打破
}
}
XDestroyWindow(显示,win);
XCloseDisplay(显示);
返回0;
}

您的代码对我来说很好:

kde:

openbox+xcompmgr:

很可能您没有运行CompositeManager。尝试启动
xcompmgr
命令

同时检查
\u NET\u WM\u CM\u S0
选择所有者-它应该


谢谢。你对回答我的问题太慷慨了。我已经运行了xcompmgr。您给出的代码打印为“复合管理器窗口:0”。是否正确?我下一步应该做什么?“复合管理器窗口:0”表示您没有运行复合管理器。当您检查选择所有者时,您确定它仍在运行吗?这就是我所拥有的:
laplace@laplace-薄荷~$xcompmgr&[1]6656laplace@laplace-Mint~$/cmowner复合管理器窗口:29360129
抱歉,我忘了运行xcompmgr。这里是:#xcompmgr&#/测试复合管理器窗口:16777217…但是我创建的窗口仍然不可见。您正在使用哪个wm?我只是尝试了icewm(黑色窗口,无透明度)和fwvm(透明窗口)。我的截图在kde/kwm下。如果wm reparents窗口用于添加标题/边框,而新的父窗口不透明,则无法获得透明窗口
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    Display* display = XOpenDisplay(NULL);

    Atom cmAtom = XInternAtom(display, "_NET_WM_CM_S0", 0);
    Window cmOwner = XGetSelectionOwner(display, cmAtom);

    printf("Composite manager window: %i\n", cmOwner);

    XCloseDisplay(display);
    return 0;
}
attr.border_pixel = 0;
attr.background_pixel = 0;
attr.override_redirect = 1; /* this line added */

Window win = XCreateWindow(display, DefaultRootWindow(display), 0, 0, 300, 200, 0, 
vinfo.depth, InputOutput, vinfo.visual, 
CWColormap | CWBorderPixel | CWBackPixel | CWOverrideRedirect /* and this one*/, &attr);