MC's Journal

Fönsterhanteraren mcwm, del två

Jag skrev i ett tidigare inlägg att jag skrivit en egen fönsterhanterare. Jag började tidigt använda den som min vardagliga fönsterhanterare och har fortsatt med det. Därmed har jag också mer eller mindre tvingat mig själv att stoppa in vad jag tyckte saknades och, förstås, rättat buggar som har dykt upp.

Det jag saknade mest sist jag skrev var virtuella skärmar. Det stoppade jag in 30:e juni. Det visade sig faktiskt inte vara särskilt svårt, så själva arbetet för det gick på någon timme.

Eftersom jag hela tiden startade om mcwm medan jag utvecklade blev det ganska snart uppenbart att jag måste spara undan informationen om vilka fönster som hörde till vilka workspaces någonstans utanför själva fönsterhanteraren, som jag ju dödade hela tiden. Lyckligtvis har Extended Window Manager Hints redan en hint för detta, _NET_WM_DESKTOP. Stöd för det kunde jag plocka in ganska snabbt, även om jag kanske gjorde det på ett något naivt sätt. Det betyder alltså att även andra fönsterhanterare förstår var fönstren skall placeras om jag nu startar en annan wm eller om en annan wm satt fönstren på särskilda virtuella skärmar redan.

Tyvärr var det saker jag inte hade förstått. Exempel: Om du gjort en sökning i ett dokument med xpdf och sedan fortsatt läsa i filen så gör xpdf bara unmap på sökfönstret i stället för att förstöra det. Kanske sparar xpdf lite tid på det viset om du vill göra en sökning igen.

Om jag bytte workspace och bytte tillbaka så mappade min fönsterhanterare också sökfönstret, fast xpdf alltså inte ansåg att det var aktivt... Oops! Några andra program, till exempel Ghostscript-fronten gv, gjorde likadant.

Det tog lite tid att komma på ett bra sätt att hantera det. Rätt svar är troligen att hantera UnmapNotify-händelser i fönsterhanteraren och när vi får en sådan glömma bort fönstret helt och hållet, om det inte var vi själva som gjorde unmap för att vi håller på att byta workspace.

Det här innebar också att starten av fönsterhanteraren blev ändrad så att vi enbart hanterar fönster som faktiskt redan syns när vi startar. Förut hanterade den alla fönster som inte explicit sagt att de inte skall hanteras, alltså de med ”override redirect” satt.

En bieffekt av den ändringen är att jag nu låter mcwm dö på ett snyggare(?) sätt: Den mappar alla fönster den känner till och sätter om tangentbordsfokus till att automatiskt följa muspekaren (X:s default). Jag stoppade också in signalhanterare för att se till att mcwm dör på samma sätt ifall den skulle krascha.

De här ändringarna gör mycket riktigt att xpdf:s sökfönster och utskriftfönster inte längre mappas vid byte till dess workspace om de nu inte var aktiva. Om xpdf eller gv var igång och hade sådana subfönster när mcwm startade så kommer de inte heller att synas i onödan. Det fungerade!

Fokusbyte från tangentbordet stoppade jag in i samma veva som workspaces. Hittills är det bara en enkel fönsterring som gör att du kan gå runt mellan alla fönster som finns på skärmen. Det är kanske av begränsat värde jämfört med vad man skulle vilja ha, men det är en bit på väg.

Från början hade jag lite problem med hur jag skulle göra för fönster som är ”fixed”, alltså de som syns på alla workspaces. Hur skulle jag få in dem i fokusbytet? Jag löste det genom att sådana fönster alltid följer med in i den lista över fönster som finns på en workspace. När du byter workspace adderas alltså alla fönster som är ”fixed” till den workspace-listan också. De tas bort igen när du byter workspace.

mcwm kan nu också verkligen hantera att man vrider på sin skärm eller tar bort en skärm. Tidigare noterade den bara den nya skärmstorleken och lät dig flytta fönster lite längre. Nu hanterar den det lite snyggare.

Om du till exempel tar bort en skärm och det fanns fönster på den skärmen så flyttas de så att de blir synliga och får plats på den eller de skärmar som är kvar. Om du vrider på en skärm och en del fönster hamnat helt eller delvis utanför den nya geometrin så flyttas de in.

Jag är nästan feature-komplett och har nästan en miljö som ser ut och beter sig som min gamla fönstermiljö med evilwm och ctwm! Det som saknas är nog bättre fokus från tangentbordet (gå till fönster jag senast arbetade i snarare än en fönsterring) och ”snap to border”.

Nu kommer också de saker som gör mer än vad min gamla miljö kunde. Det jag framför allt tänker på är RandR-hantering för att ge mig en uppsättning workspaces per fysisk skärm.

Hur som helst så tror jag mcwm i sitt nuvarande skick inte längre är något enbart för självplågande utvecklare som jag själv. Det går faktiskt att använda den. Ta gärna ner och testa!

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