X11/GLX - Vollbild-Modus?
Ich versuche zum erstellen einer Linux-Anwendung - ein screensaver, in diesem Fall - und es erweist sich als bemerkenswert schwierig, Informationen zu finden auf die einfache Aufgabe, ein Fenster full-screen. Auch der code der vorhandenen screensavers macht keine Erwähnung von, wie Sie es schaffen, und ich habe noch zu sehen, keine offensichtlichen Funktion wie XRemoveDecoration()
.
Nach viel Fummelei, ich habe es geschafft, ein Fenster zu erstellen, die die gleiche Größe wie der desktop, mit diesem:
Window win = DefaultRootWindow(disp);
XWindowAttributes getWinAttr;
XGetWindowAttributes(disp, win, &getWinAttr);
win = XCreateWindow(disp, win, 0, 0, getWinAttr.width, getWinAttr.height, 0, vInfo->depth, InputOutput, vInfo->visual, CWBorderPixel|CWColormap|CWEventMask|CWOverrideRedirect, &winAttr );
Aber das tut nichts, um loszuwerden, der Titelleiste und Rahmen. Ich weiß, es ist ein Weg, klar, aber ich habe noch zu finden, was auch nur in diese Richtung verweisen, die sich nicht auf einige andere riesige Bibliothek, die sich zurzeit auf der Oberseite (die vorhandenen Bildschirmschoner sind definitiv nicht verwenden).
EDIT: Bitte entfernen Sie nicht die Informationen aus meinen Beiträgen. Es gibt einen sehr guten Grund, warum ich explizit darauf hingewiesen, dass die vorhandenen Bildschirmschoner sind nicht mit optionalen Bibliotheken, und das ist, da ich die Analyse von source-code für die meisten des letzten Tages.
Habe ich gewählt, die Antwort, dass die meisten direkt die Frage beantwortet, und das gilt auch für Anwendungen im Allgemeinen.
Wenn Sie gefunden haben, diese Frage zu erforschen xscreensavers... das gleiche gilt noch immer. Ja, xscreensaver hat seine eigene API, die ist kompliziert, und eigentlich ist das schreiben mehr code-Zeilen (ja, im ernst). Wenn Sie möchten, OpenGL in Ihren Bildschirmschoner, die Sie brauchen, um durch anderen API (xlockmore, ein konkurrierendes system) und eine Kompatibilität Schicht, übersetzt es in xscreensaver.
Jedoch xscreensaver ist in der Lage mit alle Programm, das die Nutzung von virtuellen root-Fenster (Blick in vroot.h) wie ein Bildschirmschoner. Also mein Rat ist, genau das zu tun - Sie haben mehr Kontrolle, keine Begrenzung der API und höhere Portabilität. (Ein Beispiel, das ich sah sogar kompilieren für Linux oder Windows, mit der gleichen Datei!)
- +1 für offensichtlich haben einige der Forschung getan.
- bitte überprüfen Sie stackoverflow.com/questions/10897503/..., die Antwort ist die beste und nur für mich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine Möglichkeit ist die bypass-window-manager:
Den Informationen, die Sie fehlt, ist, dass die Bildschirmschoner sind nicht verantwortlich für das Vollbild. Der screensaver daemon verwaltet die Bildschirmschoner-Fenster, setzen Sie es in den entsprechenden Bildschirmschoner-Fenster layer und machen es Vollbild.
Also für das schreiben ein Bildschirmschoner, der dir im klaren bist. Wenn Sie waren über das schreiben einer Vollbild-Spiel, Sie haben, um die Override-Redirect-Attribut, um zu verhindern, dass das Fenster immer geschafft von der WM, und machen Sie bedecken den gesamten Bildschirm.
Beste und einfacher Weg, dies zu erreichen, ist die Verwendung der ICCCM-Spezifikation
atom
die Arbeit für die neuesten Window-Manager. Einfach den folgenden code verwenden:Ihre Fenster kann transparent sein, wenn dem so ist, verwenden Sie einfach
XSetBackground()
- Funktion, wo Sie es brauchen und es ist getan.Fand ich freeglut fullscreen funktioniert gut, auch wenn hosting-shader-based opengl-Anwendung im inneren. Hier der interne code, die aufgerufen werden, (X11 Zweig...). HTH
Versuchen Sie dies für ein Beispiel:
Really Slick Screensavers-Port GLX
http://rss-glx.sourceforge.net/
Blick auf die createWindow () - Funktion im Treiber.c.
Es ist absolut nicht schwer. Sie müssen nur fügen Sie den rechts-atom auf der rechten Liste wie beschrieben hier.