MC's journal

Pungenday, the 27 day of Confusion in the YOLD 3176

mcwm

Jag har skrivit en fönsterhanterare. Jag kallar den i brist på bättre namn ”mcwm”. Namnförslag är välkomna.

Officiell websida här:

https://hack.org/mc/hacks/mcwm/

Här är en screenshot, där det visserligen inte syns något av fönsterhanteraren eftersom den inte ens ritat ramarna runt fönstren (den har dock satt färg och tjocklek på dem):

mcwm-small.png

Det började lite som ett skämt. 'Alla' har ju skrivit en fönsterhanterare, så varför inte jag också?

Jag har länge använt gamla CTWM och till och med bidragit med några patchar. Jag har ändå länge funderat på att byta. Nu senast blev det aktuellt eftersom jag fick problem när jag bytte till UTF-8 på mitt system.

CTWM:s kod är ganska gammal och fylld med saker som väldigt få (någon?) längre förstår. Koden är tungrodd, smått ogenomtränglig och alldeles för stor för det som CTWM kan göra.

Tidigare har jag i perioder flörtat lite med åtminstone (i omvänd tidsordning) evilwm, ratpoison, wm2, fvwm och 9wm. Jag har använt samtliga länge nog för att bli skapligt nöjd med min konfiguration och/eller patchat mig till det (evilwm och 9wm).

Jag har förstås testat många andra fönsterhanterare också, inklusive tiling-modellen à la larswm. Hittills har jag varit alltför beroende av att fönster stannar kvar på samma ställe på skärmen för att vara nöjd med tiling. Jag tycker det är lite förvirrande.

När CTWM började krångla var mitt förstaval i stället evilwm. Jag använde den i några veckor tills jag började reta mig på en del saker som verkade kräva ganska stora ingrepp i koden.

Eftersom jag nyligen hört talas om XCB och funderat på att lära mig lite mer om det började jag i stället skriva lite testprogram för XCB. Man kanske kan säga att mina testprogram växte lite över förväntan…

XCB är en mer direkt mappning av X-protokollet jämfört med libX11. En speciellt intressant sak med det är att det grundar sig i en formell beskrivning av protokollet och att koden för att generera X-anropen är automatgenererad från den beskrivningen!

Det som är automatgenerat är alltså bara koden för själva X-protokollet. Naturligtvis är hjälpfunktionerna och -biblioteken i XCB skrivna för hand.

Vanliga libX11 är sedan en tid omskriven för att använda XCB, så det verkar som om XCB är framtiden för X-protokollet oavsett om man använder det direkt eller inte. Alla program som länkar mot libX11 använder alltså redan nu XCB, om än indirekt.

Jag hittade tyvärr inte så mycket dokumentation för XCB, men tack och lov finns själva X-protokollet beskrivet i form av Scheiflers X Window System Protocol. I fysisk form har jag dessutom ett dumpstrat ex av Adrian Nyes Xlib Programming Manual från O'Reillys serie om X Window System, som var rätt hjälpsam.

Inter-Client Communication Conventions Manual finns också fritt tillgänglig, men den har jag inte orkat ta mig igenom ännu. Dito för Extended Window Manager Hints. Nu stöder min lilla fönsterhanterare än så länge knappt några hints alls, men det är troligt att det blir stöd för åtminstone några fler när jag orkar läsa igenom och försöka förstå ovanstående.

I övrigt läste jag källkod från bland annat CTWM, evilwm och tinywm. Den senare är smått otroliga 56 rader kod!

När jag hade börjat hacka på min XCB-baserade wm hittade jag faktiskt också en annan fönsterhanterare som använt XCB från början: i3. Awesome har också nyligen portats från Xlib till XCB. Jag har dock inte provat någon av dem ännu. i3 har en dependency på ett JSON-lib som i sin tur kräver hela Ruby för att alls bygga! Awesome är beroende av massor av libraries.

För att utmana mig själv att göra min fönsterhanterare mer komplett började jag redan samma kväll använda den som min huvudsakliga fönsterhanterare: ”an itch to scratch”. Det fungerade! Dagarna efter hackade jag in nästan allting som jag tycker jag behöver i en fönsterhanterare.

Den är inte feature-komplett ännu (se WISHLIST och TODO i distributionen). Det som saknas mest är virtuella skärmar och att kunna byta fokus från tangentbordet. Det går dock alldeles utmärkt att använda den. Jag har använt den hela tiden sedan förra tisdagen då jag alltså började utveckla den.

En kul sak som jag inte sett hos någon annan fönsterhanterare är att jag utan att använda någon extension kunde få reda på om användaren hade kopplat in eller ur en skärm. Det visar sig att rootfönstret skickar en ConfigureNotify och talar om den nya storleken! Rätt naturligt, faktiskt, men jag tror inte många traditionella fönsterhanterare någonsin prenumerade på denna event, för vem trodde att root-fönstret någonsin skulle förändras? Så icke i dessa tider med RANDR.

I nuvarande skick fungerar min fönsterhanterare faktiskt med alla program jag normalt startar men det finns naturligtvis massor av buggar, nästan ingen felkontroll och en hel del fula antaganden kvar i koden. Var försiktiga om ni provar. Jag rekommenderar inte alls att testa den på en äldre maskin som inte är TrueColor.

Observera att den för att vara användbar kräver att du vet vilken tangent på ditt tangentbord som generar Mod1 (vanligen Alt, men det går inte att veta) och vilken som generar Mod2. Om du inte har koll och mappat ditt tangenbord själv vill du kanske kolla med xev(1) innan du försöker starta mcwm.

Min utvecklingsplattform är FreeBSD. För att bygga krävs följande paket:

men så vitt jag vet ingår de alla ändå om du alls har X installerat.

Igår kväll meddelade vännen Dennis att mcwm gick att kompilera under Ubuntu GNU/Linux. Jag har alltså inte själv testat den under Linux ännu men det verkar lovande. Återkommer om det.

Hackandet fortsätter.

Happy hacking,
MC


Written by MC using Emacs and friends.