Gibt es eine Möglichkeit, ein Fenster mit Xlib zu erstellen, in dem nur die Umrandungslinien, Titel, Schließen-Schaltfläche angezeigt werden und die Sie mit der Maus verschieben können? Der Inhalt des Fensters muss leer sein (oder "total transparent", obwohl "Transparenz" eher wie ein Effekt klingt, den ich nicht brauche). Grundsätzlich sollte das Fenster den Hintergrundbereich zeigen.Leeres oder transparentes Fenster mit Xlib, das nur die Umrandung zeigt
5
A
Antwort
11
Ich bin nicht sicher, ob es das ist, was Sie wollen, aber der folgende Code erstellt ein X-Fenster mit transparentem Hintergrund, aber immer noch mit der Fensterdekoration Ihres Fenstermanagers.
Es funktioniert jedoch nur, wenn Ihre X11- und Grafikhardwarekonfiguration Visuals mit einer Tiefe von 32 Bit unterstützt.
#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;
}