Qt als OpenGL Overlay GUI (Linux)
-
Hallo,
ich versuche derzeit (unter Linux) einen QX11EmbedWidget auf eine OpenGL Textur zu rendern und diese als Overlay für Fullscreen-Anwendungen zu nutzen. Dies klappt bisher auch perfekt.
Mein Problem ist nun aber die Interaktion mit dem Nutzer. Wichtig ist mir hierbei, dass das Fenster, welches OpenGL nutzt, keine Eingaben vom Nutzer (zumindest Tastatur) empfängt. Ich möchte die Eingaben sozusagen abfangen und an die Qt Event Queue übergeben, ohne dass der Widget den eigentlichen Fokus erhält (der Widget ist versteckt). Ich habe bisher versucht mit XGrabKeyboard die Eingaben abzufangen und an den Widget weiterzugeben, aber bisher ohne Erfolg. QWidget::grabKeyboard() hatte auch keinen Effekt (welches anscheinend auch XGrabKeyboard nutzt).Hat sowas vielleicht schon jemand versucht, umsetzen können oder auch nur einen Lösungsansatz?
PS: Sollte es übrigends möglich sein, dies ohne ein verstecktes XWindow hinzubekommen, würde es mich auch noch interessieren ob man mit Qt auch einen Widget ohne Repräsentation im X Window System erzeugen kann, welcher dann ausschließlich zum Rendern in ein QPixmap/QImage genutzt wird.
Schöne Grüße,
Olli
-
Was ist denn eigentlich dein Ziel? Einfach nur ein Fullscreen-Fenster zu bekommen? Da gibts eigentlich einfachere Funktionen.
Denn das was du vorhast wirkt extrem dirty! Ein widget nur zu verwenden um in ein Pixmap zu rendern? sollte auch einfacher gehen.Wie zeigst du eigentlich dein OpenGL-Overlay an? Hoffentlich mit einem QGLWidget. Dieses sollte über mousePressEvent()/etc. verfügen, welche du implementierst und halt Koordinaten auf deine Textur mapst. Dann schickst du einfach dem Widget das Event mit sendEvent()/postEvent(). Ich find das nicht sonderlich schön.
Erklär aber besser erst mal was dein Ziel ist, damit man eine mögliche bessere Lösung findet.
-
Vielleicht kennt der ein oder andere ja Xfire. Ich arbeite für Gfire, sozusagen eine Linux Version davon. Deshalb ist mein Ziel hierbei, IM Chats in Spielen einzublenden.
Dabei geht es darum, dass eine Anwendung bereits Fullscreen mit OpenGL arbeitet. Ich hooke mich dann in glSwapBuffers rein und rendere dort mein Overlay. Nun hätte ich als Overlay aber gerne einen QWidget. Deshalb rendere ich diesen in ein QImage und erzeuge aus diesem eine OpenGL Textur, welche ich im 2D Mode in OpenGL rendere.
Soweit ich das bisher verstanden habe ist ein QGLWidget dafür da, Bereiche eines Fensters mit Hilfe von OpenGL Overlay Hardwareunterstützung zu rendern. Das ist aber nicht was ich will, da der OpenGL Kontext nicht mir gehört sondern dem gehookten Programm/Spiel.
Mein Hauptproblem ist nun wie gesagt, die Tastatureingaben des Nutzers für diesen Widget abzufangen und an ihn weiterzugeben, ohne dass die gehookte Anwendung davon Wind bekommt. Dafür muss ich schätzungsweise die XKeyboardEvents abfangen. Aber wie gesagt, "schätzungsweise".
Und sollte das ganze noch mit der Maus zu schaffen sein, wäre das perfektSchöne Grüße,
Oliver