Xmonad ablakkezelő – ablakok beállítása

Xmonad
Xmonad

Xmonad ablakkezelő beállítása nem egyszerű, de nem is agysebészet. Most egy hasznos beállításról lesz szó: a megnyíló ablakok asztalhoz rendeléséről, a fókuszálásáról és a méretbeállításáról.
Jogos elvárás, hogy a megnyíló ablak ott és úgy jelenjen meg, ahogy azt előre beállítottad – ha így akarod. Nem feltétlen kell minden programhoz egy konkrét beállítást rendelni, a legtöbb esetben az aktív munkaasztalomon és az aktuális elrendezésnek megfelelően jelennek meg.

Itt is, mint a legtöbb esetben az Xmonad ablakkezelő alatt többféle megoldás lehetséges, és azokat is többféleképp lehet konfigurálni. Én az általam használt, számomra jól átlátható megoldást mutatom be.

Xmonad ablakkezelő program és asztal összerendelésének alapja

Az Xmonad ablakkezelő alapesetben kilenc asztalt használ, ami nálam az 1….9 elnevezést kapta. Bár lehet ikonokat, szövegeket is használni, én ezt kerülöm, mert a számokat egyszerűbb használni.
A hivatkozás jellemzően egyszerű egy asztalra: (myWorkspaces !! 1), a neveket ebből sejthetően a myWorkspaces változóban találod meg.

A programokat valamely tulajdonságuk alapján lehet meghatározni, ez lehet a title, resource, className vagy esetleg más, de ezek használjuk a legtöbbet. A className a jellemző, a legtöbb esetben ez teljesen megfelelő. Ezeket az xprop használatával kapod meg.

A hivatkozás formája kötött:

className =? “Pcmanfm”

Figyelj rá, mert egy elütés miatt nem fogja megtalálni, beazonosítani a programot!

Bár valószínűleg van ilyen blokk a konfigodban, de a teljesség kedvéért ide másolok egy részletet:

myManageHook = composeAll . concat $
[ [isDialog –> myDFloat]
, [className =? “feh” –> doCenterFloat]
, [className =? “Lxappearance” –> doCenterFloat doShift (myWorkspaces !! 1)]
, [className =? “Spacefm” –> doShift (myWorkspaces !! 0)]
, [className =? “Pcmanfm” –> doShift (myWorkspaces !! 3) viewShift (myWorkspaces !! 3) ]
, [className =? “Subl3” –> doShift (myWorkspaces !! 1) myDFloat ]
, [title =? “Megbízás” –> doIgnore]
, [resource =? “GtkFileChooserDialog” –> doCenterFloat ]
, [className =? “Xdg-desktop-portal-gtk” –> doCenterFloat]
]

Hogy kezelni is tudja az Xmonad ablakkezelő ezt a változót, meg kell neki mondani, hogy mi egy külön blokkban adjuk ezt meg. A main részben a
, manageHook = myManageHook
is szerepelnie kell. Figyelj rá, hogy ott lesz több bejegyzés és a karakterrel fűzheted hozzá. Ezzel nem lesz gond, mert sok konfigot nézegettem, de ez majdnem biztosan már alapból meg lett oldva.

Alapként három típust használunk:

, [className =? “feh” –> doCenterFloat]

Középre nyíljon meg a jelenlegi asztalon, lebegő módban.

, [resource =? “desktop_window” –> doIgnore]

Ezzel ne törődjön, ne kezelje. Olyan legyen, amilyennek a program akarja. Ez nem minden esetben lesz jó, de kezdésnek megfelel, ha a normál, a layout-nak megfelelő ablaktípusként megjelenő ablak nem az elképzelésednek megfelelő.

, [resource =? “Save As…” –> doFloat]

Lebegő ablakban nyissa meg, a jelenlegi asztalon.

Asztalra küldés az Xmonad ablakkezelő alatt

, [className =? “Spacefm” –> doShift (myWorkspaces !! 0)]

Ez sem nehézkesebb mint az alapművelet, megadod mit és melyik asztalra rakja ki. Így csoportosíthatod a programokat használat szerint. Ebben a megoldásban a layout-nak megfelelő elrendezésben kapod meg a programot. Nálam ez jellemzően a füles megoldás, ami nekem nagyon kényelmes.
Ekkor nem ugrik oda az Xmonad ablakkezelő, azaz nem kap fókuszt a program. Ez sokszor jó, de sok esetben azért nyitom meg a programot mert azt használni kell. Ha másik asztalon jelentettem meg, akkor arra az asztalra kell váltani, majd a programra. Ez kényelmetlen is lehet. Megszoktuk, hogy a megnyíló ablakot azonnal használni is tudjuk, és nem kell plusz akármilyen macerálást tenni. Nem azért használunk Xmonad ablakkezelőt, hogy lassabban, hanem azért mert gyorsabban akarunk elvégezni valamit.

Azonnal kapjon fókuszt a program!

, [className =? “Pcmanfm” –> doShift (myWorkspaces !! 3) viewShift (myWorkspaces !! 3) ]

Azaz a karakterlánccal hozzáfűzzük azt a kívánságunkat is, hogy “ugorj már oda és tedd azonnal az orrom elé a használható programot”!
Logikus, de leírom: akkor lesz ez rendeltetésszerű, ha a myWorkspaces értéke ugyanaz. Megteheted, hogy a 3-as asztalra rakod a programot, de a 5-re ugrasz, de ez nem túl praktikus.

Ez az a pont, ameddig minden konfiguráció ad mintát a megoldásra. Ami ezután jön, már ritkábban fordul elő. Közel három tucat jobb, rosszabb konfigurációt átnéztem tippekért, de egyikben sem találkoztam a következő logikus és hasznossal. Majd egy teljesen más kérdés kapcsán leltem rá erre.

Ablakok pozicionálása Xmonad ablakkezelő alatt

Bár szintén logikus, de leírom: Xmonad ablakkezelő alatt előre meghatározott helyen és méretben a lebegő ablaktípust használhatjuk.
Hasonló megoldást használunk, amikor a Xmonad.Util.NamedScratchpad modult aktiváljuk. De itt nem drop-down, hanem sima ablakot kapunk. Ez azzal a különbséggel jár, hogy nem kell feltétlen a billentyűkombinációval indítani a programot, hanem bármilyen mód (terminál, más program stb.) indítva is megkapja a tulajdonságokat: azon az asztalon, fókusszal, vagy anélkül és az adott méretben, helyen jelenjen meg.

Itt a doRectFloat (W.RationalRect (1/6) (1/6) (5/10) (5/10)) megoldást használjuk. A számok csak példák, bármi lehet. Az első kettő a érték a megjelenítés helyét. a felső bal saroktól egyhatodnyi monitorfelbontásra jelenjen meg az ablak, az ablak magassága és szélessége pedig a fel legyen a monitornak. Praktikus, mert így nem pixelben, hanem arányszámban adjuk meg és egy felbontásváltáskor sem változik a kinéze. Használhatsz tizedeseket is: 0.6 stb.

Itt két út van, bár megoldható másképp is, de szerintem ez a kettő az átláthatóbb.

A feladat: a subl3-as szerkesztő a kettes asztalomon jelenjen meg, kapjon fókuszt és egy (a fenti) helyen és méretben legyen.

Első lépésben megadjuk az asztalt:

[className =? “Subl3” –> doShift (myWorkspaces !! 2) ]

Második lépésben kiegészítjük a kapjon fókuszt résszel:

[className =? “Subl3” –> doShift (myWorkspaces !! 2) viewShift (myWorkspaces !! 2) ]

Majd:

, [className =? “Subl3” –> doShift (myWorkspaces !! 2) viewShift (myWorkspaces !! 2) doRectFloat (W.RationalRect (1/6) (1/6) (5/10) (5/10)) ]

Azaz hozzáfűzzük a helyet is és a méretet is. Így egy szép hosszú sort kapunk, ami első olvasatban nagyon összetettnek és átláthatatlannak tűnik. Ha egynél, az első ilyen programbeállításnál lépenként végigvisszük a beállogatást, akkor már nem lesz olyan bonyolult.

A másik megoldási lehetőség már jobban átláthatóbb. Létrehozunk egy változót, ami a az adott pozíciót és méretet definiálja. Ennek csak akkor van értelme, ha az adott helyet és méretet többször is használni akarjuk.

Az első lépés a

myDFloat = doRectFloat (W.RationalRect (1/6) (1/6) (5/10) (5/10))

sor elkészítése, amit érdemes a myManageHook elé közvetlen berakni, hogy ne kelljen keresgélni, ha több is van.

Majd logikusan:

[className =? “Subl3” –> doShift (myWorkspaces !! 2) viewShift (myWorkspaces !! 2) myDFloat ]

Így nem a teljes, hosszú sor kerül ide, csak az utalás, hogy a myDFloat változóban meghatározottakat illessze be ide, fűzze hozzá.

Mindegyik módszer jó, használható és működik. Azt használd, ami neked átláthatóbb.

Egyértelmű, de leírom: mindhárom parancs (asztal, fókuszt kap, pozíció) külön is használható. Sok egyébbel együtt, de azok már messze meghaladják ennek a cikknek a témáját.

Sok munka?

Többször előforduló ellenérv, hogy ez bizony komoly és sok meló. Alapvető tévedés!

Ha kell az ilyen megjelenítés – jól el lehet enélkül is lenni! – akkor menet közben összeírod melyik programot akarod így kezelni, és milyen módon. Majd egy sablont hozol létre, azaz egyet beállítasz ahogy akarod. Azt másolgatva gyorsan ki lehet alakítani a rendszert ezen a téren. Nem kell az összes programot, pár pixel eltéréssel és eltérő mérettel indítani, elég pár sablon helyet használni.

Az is egyértelmű, de ki kell hangsúlyozni: ezek a lebegő ablakok sima lebegő ablakok. Miután megjelennek, pontosan úgy kezelhető mint egy sima lebegő ablak: mozgatható, méretezhető és akár a layout-ba is berakható.

Related Posts