• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Gelöst] Xlib-Programmierung - Grundlegendes Lückenwissen

Salve,

ich möchte einfache Grafikprimitiven auf den Bildschirm zaubern. Dies soll mit der Xlib geschehen. Nun habe ich es mit wenigen Zeilen geschafft, zumindest mal ein leeres, weißes Fenster zu erzeugen. Doch gleich zu Beginn stellt sich mir die Frage, wie ich denn den kompletten Bildschirm ausfüllen kann, d.h. ohne Fensterleiste und ohne Programmleiste?

Ich habe bereits gelesen, daß der Window-Manager da wohl ziemlich hineinredet, so werden zum Beispiel auch meine Angaben zur Fensterposition in der Funktion XCreateSimpleWindow schlicht ignoriert und vom WM festgelegt.

Ich wühle mich natürlich hier weiter durch die Doku, aber ein schnelles Erfolgserlebnis zu Beginn würde das ganze ziemlich versüßen. ;) Also: Wie bekomme ich es hin, das mein Fenster keinen Rahmen hat und den ganzen Bildschirm füllt, also auch die Startleiste verschwindet?
 
Ok, ich bin nun zumindest so weit, die Fenster-Dekoration weglassen zu können. Dies geschieht durch Setzen des OverrideRedirect-Flags in der XSetWindowattributes-Struktur. Dadurch kann der Window-Manager nicht mehr einfach die Vorgaben ignorieren und sturheil seine Dekoration setzen.

Code:
 /* Voraussetzung ist eine erfolgreich geoeffnete X-Serversitzung (display)
und ein bereits erstelltes Fenster (win, z.B. durch XCreateSimpleWindow) */

XSetWindowAttributes  setwinattr;
unsignend long  valuemask;

setwinattr.override_redirect = 1;
valuemask = CWOverrideRedirect;

XChangeWindowAttributes(display, win, valuemask, &setwinattr);

Dummerweise übernimmt der Window-Manager auch das behandeln der Tastatur-Events, d.h. diese werden nun nicht mehr regulär abgefangen. Ich vermute, ich muss einen eigenen Event-Handler schreiben. Die Maus-Events werden interessanterweise noch behandelt. Ich melde mich nochmal, wenn ich weiter gekommen bin. ^^
 
Eigener Event-Handler ist Quatsch. Das ganze Problem war, dass das Fenster nicht den Fokus hatte. Das bedeutet, dass die Keyboard-Anschläge zwar registriert werden, allerdings von einem anderen Fenster. Und da meine Anwendung Fullscreen ist, hab' ich das einfach nicht gesehen. :D

Mit der Funktion XSetInputFocus kann man das ganz einfach richten. Ich trage in die Thread-Überschrift mal das [Gelöst]-Tag ein. Schade, dass mir niemand helfen konnte, aber das Thema ist vielleicht schon sehr speziell. ;) Aber ok, Doku wühlen gehört nun mal dazu :D. Ich glaube, die meißten programmieren eh' mit Toolkits und nicht direkt mit der xlib, kann das sein?

/edit: Ich verweise hier mal noch ganz dezent auf die Mailing-Liste von x.org, wo ich die gleiche Frage gestellt habe. Dort befindet sich dann auch die etwas optimalere Lösung: http://lists.freedesktop.org/archives/xorg/2006-September/017921.html
 
Oben