staging.inyokaproject.org

Window Manager "programmieren"?

Status: Ungelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

BastelKlug

Anmeldungsdatum:
7. Dezember 2019

Beiträge: Zähle...

Hallo Linux User!

Ich hatte seit langer Zeit vor, eine eigene Linux Distribution zu erstellen (nicht viel erwarten bitte, windows 3.0 Style ☺ ). Eigentlich könnte ich als Window Manager openbox oder was ähnliches verwenden, nur lerne ich dabei wenig. Soweit ich verstanden habe, benutzen diese window manager xorg. Bei einem überschauberen Window Manager (tinywm) konnte ich auch feststellen, dass dieser X11/Xlib.h benutzt. Nur frage ich mich, wie ich in C einen einfachen Window Manager wie Tinywm programmieren kann? Kennt ihr vielleicht Dokumentationen oder sogar Tutorials, die ein verwenden der xlib.h in Verbindung mit window managern zeigt? Und wie funktioniert das ganze?

Danke an alle :=)

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Ich kann da im Detail nicht helfen. Aber, wenn Du bereits ein übersichtliches Beispiel gefunden hast, gibt das vielleicht etwas her. Möglicherweise findet sich in der Entwickler-Doku ja auch ein Hinweis auf genutzte Dokumentation.

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Hab’ das vor ein paar Jahren mal gemacht. Blogpost mit Erfahrungsbericht dazu (kein Tutorial). Benutze ich auch heute alles noch, hat sich also für mich gelohnt. Und es hat sehr viel Spaß gemacht. ☺

TinyWM ist ein ganz okay-er Einstieg, aber da fehlt natürlich viel.

In meiner Wahrnehmung war ein großes Problem, dass es eben keine „Tutorials“ oder „Erklärungen“ gibt. Das beste, was du noch finden kannst, ist ICCCM (Kapitel 4 ist für einen WM das wichtigste). Wenn du dich daran orientierst, bekommst du schonmal einen gut funktionieren WM hin. Ist aber eben eine Spec und kein Tutorial. Ob und inwieweit du die EWMH-Specs implementierst, hängt von dir ab – vieles wird krumm aussehen, wenn du manches weglässt, aber ich persönlich habe zum Beispiel explizit mit manchem gebrochen, weil es mir einfach nicht zusagte: Ich will nicht auf physischem Monitor A den virtuellen Workspace wechseln und dann ändert sich auch der Workspace auf physischem Monitor B.

Ich würde wärmstens empfehlen, im ersten Schritt keinen Reparenting-WM zu schreiben, weil das komplizierter ist. Das kannst du machen, sobald du mit der Materie vertrauter bist. (Erstrecht willst du am Anfang keinen Compositor bauen.)

Es hilft auch ungemein, wenn man schon eine Zeit lang sowas wie dwm benutzt hat: Einen WM, der keinerlei Konfigurationsdateien bietet und den man nur durch Editieren des Quellcodes anpassen kann. Dadurch lernst du zwangsläufig schonmal einiges. Und selbst, wenn du ihn nicht wirklich im Alltag benutzen willst, kannst du dir hier und da was abgucken. Aber Vorsicht: dwm implementiert längst nicht alle Specs knallhart. Im Zweifel immer in ICCCM oder EWMH nachschauen, wie es „richtig“ geht.

Zum Allgemeinen Verständnis hilft bestimmt auch das: https://venam.nixers.net/blog/unix/2018/05/10/reparenting-redirecting-composition-rendering.html

Manchmal googlet man sich ja selbst hinterher und so bin ich mal auf die Bachelorarbeit von Max van Deurzen gestoßen (wo mein WM erwähnt wird). Ich hab’ die jetzt nicht im Detail reviewed, aber sieht so aus, als würdest du da nochmal viele zeitgemäße Erklärungen finden. Könnte sich lohnen, da ab und zu mal reinzuschauen.

Was dir bei der Entwicklung noch helfen wird, ist Xephyr. Und früher oder später willst du das X11-Protokoll inspizieren, also sehen, welche Nachrichten da zwischen den Programmen geschickt werden. Der Autor von i3 hatte sich dafür damals x11vis geschrieben (was ich aufgrund der vielen Perl-Abhängigkeiten aber nie benutzt habe) – es geht aber auch mit SSH-X11-Forwarding und Wireshark.

Hoffe, das hilft dir erstmal ein bisschen … ☺

BastelKlug

(Themenstarter)

Anmeldungsdatum:
7. Dezember 2019

Beiträge: 5

Danke Vain für die ganzen nützlichen Links ☺ Schade, mir scheint das System hinter xorg zu schwer. Vielleicht wäre es für mich auch sinnvoll, erst dwm für meine Bedürfnisse zu verändern und dann vielleicht einen von 0 auf geschriebenen Window Manager zu schreiben. Ich habe im Neuland auch Wayland gefunden, soll einfacher sein. Mal schauen was sich denn da so alles ergibt.

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

BastelKlug schrieb:

Ich habe im Neuland auch Wayland gefunden, soll einfacher sein. Mal schauen was sich denn da so alles ergibt.

Dazu kann ich noch nicht fundiert etwas sagen, außer vielleicht:

Bei Wayland hast du nicht mehr „den Wayland Server“ und dann „einen Window Manager“ oben drauf. Das ist jetzt eine Komponente namens „Wayland Compositor“, die beides machen soll: Physische Geräte und Ein-/Ausgabe verwalten und Fenster hin- und herschieben. Das macht aus gewisser Perspektive manche Dinge einfacher, aber dein Vorhaben, nur einen WM schreiben zu wollen, macht’s schwieriger. Du willst da definitiv nicht bei Null anfangen, sondern mindestens wlroots unten drunter benutzen. Aber auch dann musst du viel mehr Code schreiben als für einen X11-WM, siehe auch TinyWL von wlroots.

Du müsstest dir dann vielleicht eher anschauen, ob es einen Wayland Compositor gibt, der es dir erlaubt, die Routinen für die Fensterverwaltung selbst zu schreiben. Ich meine mich zu erinnern, dass in diesem Talk erwähnt wurde, es gäbe bei Weston ein Pluginsystem genau dafür. So weit bin ich aber noch nicht vorgedrungen.

(Idealerweise würde ich mir in der Wayland-Welt sowas wie awesomewm wünschen: Mach’ den lästigen Kram für mich, erlaube mir aber, auf sehr einfache Weise meine eigenen Layout-Routinen zu schreiben. Das wäre super flexibel und mächtig.)

BastelKlug

(Themenstarter)

Anmeldungsdatum:
7. Dezember 2019

Beiträge: 5

Dann schlag ich mich mit xorg rum ☺ Soweit ich verstanden habe ist ein wm nichts anderes als ein Programm, welches intern andere Anwendungen startet und es verschiebbar usw. macht.

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

BastelKlug schrieb:

Soweit ich verstanden habe ist ein wm nichts anderes als ein Programm, welches intern andere Anwendungen startet und es verschiebbar usw. macht.

Üblicherweise: Ein WM ist der eine X11-Client, der sich für die „SubstructureRedirectMask“ des root-Windows registriert hat. Dadurch bekommt er Events über Fenster-Erstellung und -Zerstörung mit und darf Positionen bestimmen. Fenster mit dem Attribut „override_redirect“ ignoriert er (das sind üblicherweise Popups).

https://www.oreilly.com/library/view/xlib-programming-manual/9780596806187/ch16s02.html (Das Buch kostet dank offenbar mikroskopischer Nachfrage derzeit etwa 172€ bei Amazon.)

Ob der WM irgendwas startet oder dir überhaupt irgendeine Interaktion erlaubt, hängt ganz vom WM ab. ☺

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

DWM ist auch einen Blick wert!

MisterIgo

Anmeldungsdatum:
23. April 2009

Beiträge: 947

Das ist jetzt alles ein paar Ebenen höher (und wahrscheinlich für BastelKlug auch viel zu fertig), aber KWin lässt sich relativ umfangreich über Javascript anpassen. Ich muss sagen, dass ich mir das auf technischer Ebene auch noch nie angeschaut habe, aber das KwinTiling-Script verwende, dass Kwin zu einem Full-Featured-Tiling-WM macht, also im Umkehrschluss über die Scripting-API aussagt, dass man sowas wie Layouting dort anpassen/überschreiben kann.

Antworten |