Hui, das ist selten: Ich habe dieses Wochenende mal wieder in die Tastatur gehauen und richtig programmiert und gebastelt.
Auslöser ist, dass ich auf der Arbeit seit einiger Zeit meinen Laptop neben den Monitor stelle und mich am Zwei-Schirm-Betrieb erfreue. Nach erstaunlich wenig Bastelei habe ich das auch hier zu Hause unter Linux hinbekommen (alte xorg.conf weggeschmissen und mit xrandr gespielt) - allerdings mit dem Nachteil, dass heutzutage ja nur noch Xinerama benutzt wird, also beide Monitore als ein gemeinsamer großer Bildschirm verwaltet werden. Mein Windowmanager ist dwm mit einem Haufen Patches - der kann kein Xinerama. Er verteilt die Fenster ziemlich stumpf so über beide Bildschirme, dass man nicht mehr damit arbeiten kann...
Donnerstag nachmittag kam mir der Gedanke, dass es doch eigentlich ganz einfach sein müsste, alle Variablen für die Layouts und die Fenster in ein Array zu packen und einfach dwm die ganze Arbeit des Fensterverteilens mehrfach machen zu lassen - einmal für jeden Bildschirm. Noch am selben Abend stand der erste Prototyp - der hat brav die Fenster nur auf einen Screen eingesperrt, aber auf dem zweiten schon mal die Statusleiste gedoppelt. Das war zwar nicht toll, aber im Unterschied zu vorher sogar benutzbar.
Dann ging es langsam weiter: Erstmal nur schwebende Fenster auch auf den zweiten Bildschirm schieben, dann parallel ein zweites Layout auf den Zusatzschirm und dann kamen eigentlich schon die Detailarbeiten und Fehlersuche. Nach einigem Basteln (den genauen Verlauf gibt's zusammen mit dem Quellcode zum Selber-Angucken im
git-Repository) kann ich Stand Sonntag Nachmittag nun sagen: klappt, funktioniert, tut, fertig!
Das ganze habe ich mir schlimmer und vor allem umfangreicher vorgestellt. Dabei mache ich doch äußerst selten was in C und erst recht nie was mit Xlib. Schön, wenn das Ergebnis jetzt "anfassbar" über den Bildschirm flimmert.
Neugierig wäre ich ja mal, wie sich dwm-mitch auf mehr als zwei Bildschirmen verhält. Der Code sollte theoretisch auf beliebig vielen Schirmen funktionieren, aber ich habe hier keine passende Hardware, um das mal auszuprobieren...
Ein Release gibt es aber erst, wenn ich das jetzt mindestens eine Woche lang beobachtet habe. Vielleicht zeigen sich ja doch noch ein fieser Bug oder andere Komplikationen.
Gab einiges zu lernen:
Lessen 0: Xinerama und die Konfiguration über xrandr sind echt einfach, wenn man das Prinzip erstmal verstanden hat.
Lesson 1: Der Patch, um dwm im laufenden Betrieb und ohne Verlust der Session das Binary neu einlesen zu lassen, ist Gold wert.
Lesson 2: Windowmanager-Basteilein sind nervig, wenn das Ding abstürzt. Dann sollte man tunlichst auf der Console editieren und compilieren, sonst hackt man sich ständig den Ast unterm Arsch weg, auf dem man gerade sitzt.
Lesson 3: Wenn man kein Regelwerk definieren kann, wie man das nun steuern will (welche Applikation wandert wann auf welchen Bildschirm? wie verschiebt man Fenster? wohin soll die Tab-Taste beim Durchschalten springen?), dann probiert man es einfach aus und beobachtet sich selbst. Wenn einen nichts irritiert und man das ganze ohne Nachdenken bedienen kann, ist es richtig (so habe ich auch früher schon meine Tastaturkürzel optimiert und genau das war auch der ursprüngliche Grund für meinen eigenen dwm-Fork: ich bin mit dem Tag-Konzept des
originalen dwm (ach hui, der kann jetzt auch Xinerama!) nicht klargekommen).
Lessen 4: Zweischirm ist geil, ich will das nicht mehr missen! Warum nicht schon früher so?
Ach ja: Ich weiß, ich setze da auf einer Uralt-Version von dwm auf (dwm 4.7, um Weihnachten 2007 - aktuell ist wohl dwm 5.7 ). Aber meinen ganzen Patch-Stapel bekommt man so schnell nicht auf den aktuellen dwm portiert - da haben bereits mehrere Leute in diversen Anläufen entnervt aufgegeben. Und warum auch? Das Ding funktioniert in der bis letzte Woche aktuellen Version rock-solid, trotz täglichem Gebrauch keine Fehler oder gar Abstürze. Aus meiner Sicht ist dwm-mitch feature-complete.
Ab jetzt jedenfalls.
Bis auf die Unschönheit mit Popups, die den Stack im Maximize-Modus durcheinanderbringen.
Na ja. Aber sonst eben!