+void server_init_visual()
+{
+ // inspired by freedesktops fdclock ;)
+ XVisualInfo *xvi;
+ XVisualInfo templ = { .screen=server.screen, .depth=32, .class=TrueColor };
+ int nvi;
+ xvi = XGetVisualInfo(server.dsp, VisualScreenMask|VisualDepthMask|VisualClassMask, &templ, &nvi);
+
+ Visual *visual = 0;
+ if (xvi) {
+ int i;
+ XRenderPictFormat *format;
+ for (i = 0; i < nvi; i++) {
+ format = XRenderFindVisualFormat(server.dsp, xvi[i].visual);
+ if (format->type == PictTypeDirect && format->direct.alphaMask) {
+ visual = xvi[i].visual;
+ break;
+ }
+ }
+ }
+ XFree (xvi);
+
+ // check composite manager
+ server.composite_manager = XGetSelectionOwner(server.dsp, server.atom._NET_WM_CM_S0);
+ if (server.colormap)
+ XFreeColormap(server.dsp, server.colormap);
+ if (server.colormap32)
+ XFreeColormap(server.dsp, server.colormap32);
+
+ if (visual) {
+ server.visual32 = visual;
+ server.colormap32 = XCreateColormap(server.dsp, server.root_win, visual, AllocNone);
+ }
+
+ if (visual && server.composite_manager != None && snapshot_path == 0) {
+ XSetWindowAttributes attrs;
+ attrs.event_mask = StructureNotifyMask;
+ XChangeWindowAttributes (server.dsp, server.composite_manager, CWEventMask, &attrs);
+
+ server.real_transparency = 1;
+ server.depth = 32;
+ printf("real transparency on... depth: %d\n", server.depth);
+ server.colormap = XCreateColormap(server.dsp, server.root_win, visual, AllocNone);
+ server.visual = visual;
+ }
+ else {
+ // no composite manager or snapshot mode => fake transparency
+ server.real_transparency = 0;
+ server.depth = DefaultDepth(server.dsp, server.screen);
+ printf("real transparency off.... depth: %d\n", server.depth);
+ server.colormap = DefaultColormap(server.dsp, server.screen);
+ server.visual = DefaultVisual(server.dsp, server.screen);
+ }
+}