Fenêtre vide ou transparente avec Xlib montrant uniquement les lignes de bordure

Est-il possible de créer une fenêtre avec Xlib qui affiche uniquement les lignes de bordure, le titre, le bouton de fermeture et que vous pouvez déplacer avec la souris? Le contenu de la fenêtre doit être vide (ou “totalement transparent“, bien que “transparence” sonne plus comme un effet dont je n’ai pas besoin). Fondamentalement, la fenêtre devrait afficher la zone d’arrière-plan.

Je ne sais pas si c’est ce que vous voulez, mais le code suivant crée une fenêtre X avec un arrière-plan transparent tout en utilisant la décoration de fenêtre de votre gestionnaire de fenêtres.

Cela ne fonctionnera que si votre configuration matérielle graphique et graphique X11 prend en charge les visuels avec une profondeur de 32 bits.

#include  #include  int main(int argc, char* argv[]) { Display* display = XOpenDisplay(NULL); XVisualInfo vinfo; XMatchVisualInfo(display, DefaultScreen(display), 32, TrueColor, &vinfo); XSetWindowAtsortingbutes 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; }