Hasznos kiegészítők: i3wm layoutok

i3wm és i3gaps
I3 ablakkezelő

Az i3wm egyik hátránya, hogy viszonylag kevés és egyszerű elrendezéssel érkezik. Bár ezek jól használhatóak, de aki esetleg másik, több ilyen layouttal rendelkező ablakkezelőről jött át hiányolhatja a megszokottakat. Ez nem jelent gondot, hiszen nem vagyunk egyedül, mások is szeretnék kibővíteni az I3wm lehetőségeit. Ez első gondolatra nem lehetséges, hiszen az I3wm egy monolitikus és nem moduláris felépítésű, mint az xmonad. Ennek ellenére van i3ipc interfész, ami közvetíti a gondolatainkat az I3wm felé.

Miért nincsenek ezek benne az I3wm rendszerben?

Logikus és nekem nagyon szimpatikus elve a készítőknek: csak az kerül bele natívan, ami nagyon kell, és atom stabil. Megadják az interfészt (i3ipc) amivel kapcsolódhat egy-egy elgondolás és vezérelheti a működést. Minden ilyen plusz funkciót le lehet programozni, akinek kell megteheti. Azaz nincs elzárva a bővítési lehetőség, de az nem veszélyezteti a stabil működést.

Itt kell kitérnem egy fontos dologra: mindig olvasd el mi az elvárt függősége a kiegészítőnek. Ezek nem az I3wm részei, így használhatnak olyan kis programokat is, melyek nem települtek fel.
Érdemes a kapott leírásokat megnézni, a példákat kipróbálni, mert bár egyazon feladatot végeznek el – layoutokat kezelnek – de a működésük, paraméterezésük nagyon eltérhet.
A tapasztalatom szerint a bemutatottak működnek, de semmi garancia nincs, hogy nálad is menni fog mindegyik. A hibakeresésnél a függőségekkel kezd, majd a python verzióra figyelj, ha pedig valami nem megy, akkor keress másikat.

Személyes kedvencem az awesome-i3-auto-layout

Bár soha nem használtam awesome ablakkezelőt, de aki ezt megírta igen. Neki nagyon megtetszett az itt használt layout, így megírta ezt a kis programot.

A gitlab oldala itt található.

Az installálása egyszerű: klónozd, töltsd le a három fájlt, majd tedd egy olyan könyvtárárba, ami benne van a PATH-ban. Általánosságban érdemes az ilyen kis kiegészítőket egy könyvtárba, annak alkönyvtáraiba rendezetten belerakni. Így ami nem kell az gyorsan törölhető, a többi pedig egyszerűen menthető egyben a könyvtár archiválásával. Nem kell egy újratelepítésnél összeguberálni az internetről.

A awesome-i3-auto-layout paranccsal indítva készíti el az osztott képernyőt: egy baloldali fél osztást elfoglaló ablak és a jobboldali félben a tabbed megoldással a többi. Szuper! Ideális olyan feladatoknál, ahol kétfelé osztott asztal kell, de kettőnél több ablakot szeretnél használni. A tabbed megoldás gyors lapozgatást ad a jobb panelben. A megszokott ablakváltó és mozgató kulcskötések működnek. Az eredeti layout váltás (ha másikat akarszh használni) is működik. Nem változtatja meg az I3wm alap működését, az ablakokat rendezi el.

Mivel egy különálló program indító kulcskötést érdemes létrehozni hozzá, amikor ilyen I3wm layout kell, akkor aktiválni.

bindsym $mod+a exec awesome-auto-layout

Ami nem I3wm layout, de hasznos

Sok esetben kell egy üres asztal, amin nincs semmi, és ott akarok nyitni meg valamit. Ehhez vagy egy megadott számú, üres asztalra ugrik az ember, vagy az alábbi összetettnek tűnő parancsot használja:

i3-msg workspace $(echo $(seq 1 10) $(i3-msg -t get_workspaces | sed 's/},{/\n/g' | awk -F, '{print $3}' | awk -F: '{print $2}' | sed "s/\"//g" | sort -n) | tr ' ' '\n' | sort -n | uniq -u | head -n 1)
A sed, awk, sort, uniq, head alap parancsok, így valószínűleg fenn lesznek a gépeden. Ha nem, akkor…

Ez azért előnyösebb, mert nem kell megnézni melyik asztal van nyitva, majd keresni egy nem használ számút, hanem automatikusan nyit egyet.

Legyen a legnagyobb ablak!

Ha van egy olyan elrendezésed, mint a későbbiekben bemutatott (pld. vstack), ahol van egy nagyobb ablak és több kisebb, akkor érdemes ezt a mini szkriptet használni.
Bármely ablakban indítva az ablakot felcseréli a legnagyobbal. Így nagyon kényelmesen dolgozhatsz, nem vagy megkötve ezen a téren sem. Amikor egy kisebb ablakot akarunk átmozgatni a nagyobb helyére, akkor azt enélkül csak több lépésben tehetjük meg. De ezzel bármely „stack” ablakból „master” lehet! A szkript bekerül a szeptemberi Magyarch I3wm verzióba is, ahogy lesz pár újítás is ezen a vonalon.

A kód:

#!/usr/bin/env python3
#
# Promotes the focused window by swapping it with the largest window.

from i3ipc import Connection, Event

def find_biggest_window (container):
    max_leaf = None
    max_area = 0
    for leaf in container.leaves():
        rect = leaf.rect
        area = rect.width * rect.height
        if not leaf.focused and area > max_area:
            max_area = area
            max_leaf = leaf
    return max_leaf

i3 = Connection()

for reply in i3.get_workspaces():
    if reply.focused:
        workspace = i3.get_tree().find_by_id(reply.ipc_data["id"])
        master = find_biggest_window(workspace)
        i3.command("swap container with con_id %s" % master.id)

Érdemes egy kötést tenni hozzá:

bindsym $mod+p exec --no-startup-id ~/.config/i3/promote-window

Az elérési út és a név az legyen, amit Te használsz…

I3wm fekete öves layout kollekció

Ez már nagyon komolyan belenyúl az I3wm lelkivilágába, gyakorlatilag megadja azokat a lehetőségeket, melyek nem kerülnek bele az I3wm rendszerébe. Itt találhatod meg a leírását, így csak az alapokat mutatom be. A telepítése egyszerű:

pip install --user i3-layouts

Azaz nem a saját Linux disztribúciódban megszokott mód, hanem a python módszerrel kell telepíteni. Ha mégis lenne saját csomag a tárolóban, akkor előbb azt próbáld ki, ha nincs, akkor a pip felteszi neked. Sok I3wm kiegészítő készül pythonban így nem lesz idegen ez a módszer sem. Az első lépés a

exec i3-layouts

sor elhelyezése a I3wm konfigurációba és a konfiguráció újraolvastatása. Ha újraolvastatás után sem müködik valami, akkor egy újraindítás kell, hogy beolvassa amit kell. De ne szaladjunk előre! Ez sokkal összetettebb mint az eddigi megoldások, így előbb próbáld ki: kell-e ez neked?
A terminálból indított

i3-layouts

paranccsal pont azt éred el, amit a konfigurációs fájlból indítottal. Így előbb ezt tedd meg, majd kicsit próbálgasd. Ezt a terminált ne zárd be.

Hat layoutot tud, ami nagyon kényelmes és mindegyik jól használható.

A layoutok kipróbálásához egy külön munkaasztalon nyiss meg négy programot, amiből egy legyen terminál. Ebben futtasd a az alábbi parancsokat, sorban.

i3l vstack

i3l hstack

i3l spiral

i3l 2columns

i3l 2columns

i3l companion

i3l autosplit

A képek önmagukért beszélnek, egyértelmű az elrendezés. Párszor próbálgasd, mert az egyéb beállításoktól is függ az eredmény. Nálam a 2columns és 3columns nem így nyílt meg, ha az alapértelmezett workspace_layout tabbed volt. Ami jól mutatja, hogy összetett a dolog, kell egy bizonyos próbálkozás hozzá. Illetve azt is, hogy ha nagyon belemerülünk elég szépen testre szabható még így az alaphasználatnál is.
Amelyik elrendezés tetszik, ahhoz egy

bindsym $mod+s exec i3l vstack

vagy hasonló megoldást tehetünk. Ekkor, a kötés a gyorsbillentyű lenyomásával már a kivánt elrendezést kapjuk.
Amit fontos tudni: abban a konténerben, munkaasztalon, ahol ezt a módszert használjuk az elrendezéshez a „régi” (pld. bindsym $mod+Shift+s layout stacked) nem müködik. Ami nem vészes, mert a bindsym $mod+Shift+s i3l stacked parancs már igen. Így érdemes megadni mindegyiket, ha használni akarjuk a i3-layouts megoldásait. Azaz valami ilyen párosítás nagyon megfelelő lehet:

bindsym $mod+Shift+s layout stacked
bindsym $mod+s i3l stacked

Azonos betű, csak mod gombok mások. Illetve használhatjuk a i3l none parancsot is, ami feloldja az alakzatot és azután már a hagyományos kombinációk is mennek. Ha sokat használod a i3-layouts megoldást érdemes minden layout parancsot átírni amit lehet, mert egy több ablakos 3columns  használata után meglepően tudja kiosztani a none kapcsoló az ablakokat…A i3l none után három konténer lesz, abban a jobb, bal és a középső ablakrész ablakai. Ha a i3l tabbed parancsot használom, akkor egy konténerben lesznek.

Két extra paraméterezés a i3-layoutsban

Az egyik nagyon kellemes megoldás, hogy egy munkaasztalhoz előre rendelhetünk layoutot. Így amikor azt az asztalt használjuk, akkor nem kell megadni az elosztást, automatikusan azzal indul, nem az alapértelmezettel. Kényelmes.
A példánál maradva:

set $ws1 1
set $i3l vstack to workspace $ws1

Beállítjuk az egyes asztalhoz a $ws1 változót, majd hivatkozunk rá és hozzárendeljük a vstack módszert. Így az első asztalom automatikusan ez lesz az alapbeállítás. Ezt az i3wm konfigurációjába kell megtenni, érdemes az összes munkaasztalhoz egy alapbeállítást rendelni. Így nem lesznek felesleges meglepetések.
Ha az eredeti leírást követjük, itt más további értékeket is látunk az

hstack 0.6 up

i3wm layout neve mögött. Ezek teszik még hasznosabbá a programot. Nem csak az alapértelmezett osztási arányokat használhatjuk, hanem a leírásban megadott módon saját osztást is tehetünk.
Például hstack 0.6 up már az osztást nem 50-50% arányban teszi meg, hanem 60-40% arányban és a mester ablak up, azaz felül lesz. Így akár több azonos layout típust, de eltérő arányú ablakokkal definiálhatunk. Ezzel már teljesen testre szabhatjuk az i3wm ablakkezelését.

Mozgatás beállítása

Itt már nem a megszokott szabvány mozgatást végezzük el, így előfordulhat, hogy a megszokott, eddig használt beállítások nem jól működnek. Érdemes a i3l-nek átadni ennek az irányítását is. Azaz a bindsym $mod+j exec i3l move left formát használni a bindsym $mod+j move left helyett. Így az elrendezésnek megfelelő logika szerint mozognak az ablakok.
Ahogy láthattuk az i3wm alatt is lehet megfelelő konfigurálás után normális, praktikus kinézetet adni az ablakoknak. Kis munka kell hozzá, de megéri, ha keveselljük a lehetőséget. Itt sem más a módszer, mint az xmonadnál: követni kell a leírásokat, kitapasztalni mi felel meg nekünk.
A következő szkript már egy más célt szolgál, és nem feltétlen érdekes mindenkinek.

Ablak elnyelés i3wm alatt

Ezt mindenki ismeri, bár szerintem a neve nem ugrik be elsőre: ablak elnyelés azaz Window Swallowing. Ha van egy nyitott terminálod és abban indítasz el egy programot, akkor a beállítástól függően nyit egy másik ablakot. Ami nem feltétlen jó, hiszen ideális lenne, ha ugyanabban az ablakban nyílna meg. Így nagyobb területű lehetne az induló program.
Erre is van megoldás, többféle. Amit most mutatok az nekem bevált, és elég kellemesnek találom.
A szkript nem teszt mást, mint a terminál ablakban induló programot tabbed, azaz fülecskés elrendezéssel indítja el. Így a teljes, a terminál ablaknak megfelelő méretet kap. A terminálhoz is hozzáférünk, hiszen a tabbed layout i3wm alatt jól működik. Én pont azért szerettem meg ezt, mert így mindegyiket használni tudom.
Logikusan gondolkodva erre az i3wm szkriptre csak akkor van szükséged, ha nem alapértelmezett, és az állandóan használt beállításod a tabbed! Azaz csak osztott elrendezéseknél van értelme.
A szkript és a leírás itt van.
Használata egyszerű. Az eddig a terminálból indított program (pld. CinGG) indítása a CinGG, akkor most i3-tabbed CinGG lesz a megoldás. Ezt nem mindig kényelmes, hiszen plusz karaktereket kell begépelni, de erre kitalálták az alias-okat: alias CinGG=”i3-tabbed CinGG”. Ne csak grafikus programban gondolkodj! Egy terminálos programnál is hasznos lehet, ha az nem kívánt módon másik ablakot akar nyitni.

Remélem hasznos volt.