如何在XLib中创建半透明白色窗口

我想在XLib中创建一个半透明的白色窗口,但窗口不是半透明的,它仍然是完全不透明的。 我使用compton合成器,系统中有透明窗口,所以问题在于代码:

#include  #include  #include  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 = 0x80ffffff; 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; } 

X11需要预乘的颜色,即真正的不透明颜色需要乘以alpha值(并相应地缩放,即当通道宽度为8位时除以256)。 当您需要组合多个级别时,此格式更易于使用。 见这里的公式。 当一切都预乘时,计算量就会减少。

因此,您需要将每个R,G和B通道乘以alpha值(0x80)并除以256。

将背景设置为0x80808080会得到所需的结果:

注意结果与@patthoyts建议的结果不同:这里只有适当的窗口是半透明的,WM装饰保持不透明; 在那里,窗户本身和装饰都由WM透明(并且WM进行必要的颜色混合)。

您需要设置_NET_WM_WINDOW_OPACITY。 在映射窗口之前,这是一个要添加的代码段:

 double alpha = 0.8; unsigned long opacity = (unsigned long)(0xFFFFFFFFul * alpha); Atom XA_NET_WM_WINDOW_OPACITY = XInternAtom(display, "_NET_WM_WINDOW_OPACITY", False); XChangeProperty(display, win, XA_NET_WM_WINDOW_OPACITY, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&opacity, 1L); 

请注意,您应该添加#include 以获取XA_CARDINAL的声明。

我不完全确定这个界面有多稳定。 这似乎是扩展窗口管理器提示规范的建议扩展,但没有从我所看到的任何最终修订。 我知道这就是Tk在unix上实现透明度支持的方式 。

结果如下:

透明的X11窗口超过编辑器