PálcikaWM V. : Spectrwm

enlightened Ez az oldal a közösségért készül. heart Kövess minket máshol is:  Linux Mint Magyar Közösség a Mastodon-on  Telegram csatorna – csak hírek  Beszélgessünk a Telegram – Linux csevegő csoport  Hírek olvasása RSS segítségével  Linux Mint Hivatalos Magyar Közösség a Facebook-on      Linux Mint Baráti Kör a Facebook-on
wink Ha hasznosnak találod, és szeretnéd, hogy folytatódjon, támogasd a munkát Ko-fi vagy Paypal segítségével. laugh

A mai versenyzőnk a Spectrwm egy könnyűsúlyú pálcikawm, amely minimalizmust, hatékonyságot és testreszabhatóságot kínál. Alapvetően billentyűzet-centrikus, így tökéletes azoknak, akik szeretik a tiszta, rendes munkafelületet anélkül, hogy felesleges GUI elemekkel küzdenének. ;)

Autotiling rendszer, tehát az ablakokat automatikusan helyezi el a beállított elrendezés szerint, természetesen kezeli a lebegő ablakokat is. Saját panellel rendelkezik, ezt külön szkriptben konfiguráljuk (baraction.sh), ill. az automatikusan induló programokat is külön hívjuk meg (autostart.sh).

Maga a Spectrwm is egyszerű szöveges konfigurációs állományból vezérelhető, nézzük is az enyémet (~/.config/spectrwm/spectrwm.conf):

#
# Spectrwm Berus Konfigurációs Fájl
#

# --- Alapvető Ablakkezelő Beállítások ---
workspace_limit   = 5          # Az elérhető virtuális asztalok száma (1-9)
focus_mode        = default    # Alapértelmezett fókuszálási mód (követi az egeret)
focus_close       = previous   # Ha bezársz egy ablakot, a fókusz az előzőleg használtra ugrik
focus_close_wrap  = 1          # Ha nincs előző ablak, a lista végére ugrik
focus_default     = first      # Az új ablakok az első helyre kerülnek a struktúrában
spawn_position    = next       # Az új ablakok az aktuális mellé/mögé nyílnak meg
warp_focus        = 1          # Ha ablakot váltasz billentyűvel, a fókusz azonnal oda ugrik
warp_pointer      = 1          # Az egérmutatót is az aktív ablak közepére ugrik

# A látható asztalok bevétele a váltásba a ws next/prev (következő/előző asztal) parancsoknál.
cycle_visible        = 1

# Az elrendezések (layouts) körforgásának sorrendje a MOD+Space megnyomásakor.
layout_order        = vertical,horizontal,max,floating

# --- Ablakdekoráció és Kinézet ---
border_width             = 2             # Az ablakok keretének vastagsága pixelben
color_focus              = rgb:cb/a6/f7  # mauve (aktív ablak kerete)
color_focus_maximized    = rgb:fa/b3/87  # peach (maximalizált aktív ablak)
color_unfocus            = rgb:45/47/5a  # surface0 (inaktív ablak kerete)
color_urgent             = rgb:f3/8b/a8  # red (sürgős ablak kerete)

# Gaps (Ablakok közötti távolságok) 
region_padding  = 8          # Távolság a képernyő széle és az ablakok között
tile_gap        = 8          # Távolság az ablakok között

# Ablakkeret automatikus eltávolítása, ha az állapotsáv ki van kapcsolva és csak 1 ablak van fent
disable_border        = 1

# --- Állapotsáv (Bar) Beállításai ---
bar_enabled        = 1                                        # 1 = Bekapcsolva, 0 = Kikapcsolva
bar_border_width   = 1                                        # Az állapotsáv keretvastagsága
bar_border[1]      = rgb:1e/1e/2e                             # Az állapotsáv keretszíne
bar_color[1]       = rgb:1e/1e/2e                             # Az állapotsáv háttérszíne 
bar_font_color[1]  = rgb:cd/d6/f4, rgb:f5/e0/dc, rgb:8a/2b/e2 # Színpaletta a sáv szövegeinek
bar_font           = Inconsolata:size=12:antialias=true       # Betűtípus (ikon támogatással)

# Külső script integrálása az órának és egyéb infóknak
bar_action        = ~/.config/spectrwm/baraction.sh
bar_action_expand = 0          # Engedélyezi a script kimenetének dinamikus formázását
bar_justify       = left       # Balra igazított szövegek

# Állapotsáv formázása: +L = Asztalok listája, +S = Elrendezés ikonja, +A = Külső script, +W aktív ablak
bar_format = +S +<+L +|C+W +|R+A
workspace_indicator    = listcurrent,listactive,markcurrent,printnames

# Asztalok jelölései az állapotsávon
workspace_mark_current = '*'     # Az aktuális asztal jelölése
workspace_mark_active  = '^'     # Azon asztalok jelölése, ahol van megnyitott ablak
workspace_mark_empty   = '-'     # Az üres asztalok jelölése

bar_at_bottom          = 0       # 0 = Képernyő tetején legyen a sáv, 1 = Képernyő alján

# --- Elrendezések Jelölései (Stack Marks) ---
stack_mark_horizontal = '[-]'       # Horizontális elrendezés ikonja
stack_mark_vertical   = '[|]'       # Vertikális elrendezés ikonja
stack_mark_max        = '[X]'       # Teljes képernyős (Max) mód ikonja
stack_mark_floating   = '[~]'       # Lebegő ablakos mód ikonja

# --- Virtuális Asztalok Nevei Indításkor ---
# name            = ws[1]:TERM      # 1-es asztal: Termináloknak
# name            = ws[2]:WEB       # 2-es asztal: Böngészőnek
# name            = ws[3]:CODE      # 3-as asztal: Programozásnak
# name            = ws[4]:CHAT      # 4-es asztal: Kommunikációnak
# name            = ws[5]:MEDIA     # 5-ös asztal: Zene/Videó

# --- FŐ MÓDOSÍTÓ GOMB (Mod Key) ---
# Mod1 = Alt billentyű, Mod4 = Windows (Super) billentyű.
modkey = Mod4

# --- PROGRAMOK DEFINIÁLÁSA ---
program[term]        = kitty             # Alapértelmezett terminál
program[menu]        = rofi -show drun   # Indító

# --- BILLENTYŰKOMBINÁCIÓK ---
bind[term]        = MOD+Return        # Terminál megnyitása
bind[menu]        = MOD+d             # Alkalmazáskereső/indító menü
bind[quit]        = MOD+Shift+e       # Kilépés a spectrwm-ből
bind[restart]     = MOD+Shift+r       # Konfiguráció azonnali újratöltése frissítéskor

# Ablakkezelés, navigáció és fókusz váltás
bind[wind_kill]     = MOD+q             # Aktív ablak bezárása
bind[focus_next]    = MOD+j             # Fókusz a következő ablakra (Lefelé / Jobbra)
bind[focus_prev]    = MOD+k             # Fókusz az előző ablakra (Felfelé / Balra)
bind[swap_next]     = MOD+Shift+j       # Ablak felcserélése a következővel
bind[swap_prev]     = MOD+Shift+k       # Ablak felcserélése az előzővel

# Elrendezések (Layouts) és ablakméretek módosítása
bind[cycle_layout]  = MOD+space         # Váltás a vertikális/horizontális/max elrendezések között
bind[master_grow]   = MOD+l             # Fő (Master) ablak méretének növelése
bind[master_shrink] = MOD+h             # Fő ablak méretének csökkentése
bind[float_toggle]  = MOD+t             # Ablak lebegővé (floating) tétele vagy rácsba kényszerítése

# Navigáció az asztalok között
bind[ws_1]        = MOD+1
bind[ws_2]        = MOD+2
bind[ws_3]        = MOD+3
bind[ws_4]        = MOD+4
bind[ws_5]        = MOD+5

# Ablak áthelyezése másik asztalra
bind[mvws_1]        = MOD+Shift+1
bind[mvws_2]        = MOD+Shift+2
bind[mvws_3]        = MOD+Shift+3
bind[mvws_4]        = MOD+Shift+4
bind[mvws_5]        = MOD+Shift+5

# Hangerőszabályzás (Pulseadio)
#program[volup]   = pactl set-sink-volume @DEFAULT_SINK@ +5%
#program[voldown] = pactl set-sink-volume @DEFAULT_SINK@ -5%
#program[mute]    = pactl set-sink-mute @DEFAULT_SINK@ toggle

# Hangerőszabályzás (PipeWire / WirePlumber)
program[volup]   = wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+
program[voldown] = wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
program[mute]    = wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle

bind[volup]   = MOD+KP_Add       # Számbillentyűzet + - * használata
bind[voldown] = MOD+KP_Subtract
bind[mute]    = MOD+KP_Multiply

# --- ABLAKSZABÁLYOK ---
# Itt adhatod meg, mely programok NE igazodjanak a rácsba, hanem pl. lebegjenek (FLOAT)
quirk[.*:.*:.*:splash,dialog]       = FLOAT # Minden felugró ablak és üdvözlőképernyő lebegjen
quirk[.*:.*:.*:notification]        = FLOAT + ANYWHERE + MINIMALBORDER + NOFOCUSONMAP

# Konkrét alkalmazások szabályai (Az osztályneveket az 'xprop' paranccsal ellenőrizheted)
# quirk[Vlc:vlc]                = FLOAT             # A VLC médialeátszó mindig lebegjen
# quirk[Gimp:gimp]              = FLOAT + ANYWHERE  # A Gimp képszerkesztő ablakai szabadon mozoghassanak
# quirk[KeePassXC:keepassxc]    = FLOAT             # A jelszókezelő mindig lebegő ablak legyen

# Automatikus indítás 
autorun = ws[1]:/home/berus/.config/spectrwm/autostart.sh

Szokásomhoz híven, magyarázatokkal elláttam, csak néhány megjegyzés...
focus_mode - Lehetőségek: default (követi az egeret), follow ("szigorúan" követi az egeret), sloppy (fókusz az egérrel érintett ablakra ugrik).
focus_close - Lehetőségek: previous (előző ablak), next (következő ablak).
spawn_position - Lehetőségek: next (az aktuális ablak mellé), master (fő ablak), last (utolsó hely).

Ablakszabályok (quirk):
 - FLOAT: Lebegő ablak.
 - ANYWHERE: Az ablak bármely pozícióban lehet.
 - MINIMALBORDER: Minimális keret.
 - NOFOCUSONMAP: Az ablak nem kap fókuszt automatikusan megnyitáskor.
 - 1-9: Az ablak melyik asztalon nyíljon meg.

Én nem használom, de neked lehet hogy érdekes lesz:
 workspace[1] = "1:2:3" --> Az 1-es asztalon a 1:2:3 arányú elrendezés lesz az ablakok között.
 bind[ws_next] = MOD+Button4
 bind[ws_prev] = MOD+Button5 --> Egérgörgővel való váltás a következő/előző asztalra.

Akkor most nézzük a panel konfigurációját (~/.config/spectrwm/baraction.sh):

#!/bin/bash
# ==============================================================================
# Berus Spectrwm Állapotsáv (baraction.sh) 
# ==============================================================================

SLEEP_TIME=2

# Színkódok (Ha a spectrwm.conf-ban be vannak állítva a bar_font_color színei)
COLOR_RESET=""
COLOR_LABEL=""   # A feliratok színe (pl. CPU, RAM, VOL)
COLOR_ALERT=""   # Figyelmeztetések színe

# --- CPU ---
get_cpu() {
    local cpu_util=$(vmstat 1 2 | tail -n 1 | awk '{print 100 - $15}')
    echo -e "${COLOR_LABEL}CPU:${COLOR_RESET} ${cpu_util}%"
}

# --- RAM ---
get_mem() {
    local mem_info=$(free -m | awk '/Mem:/ {printf "%.1fG/%.1fG", $3/1024, $2/1024}')
    echo -e "${COLOR_LABEL}RAM:${COLOR_RESET} ${mem_info}"
}

# ------------------------------------------------------------------------------
# Hangerő lekérdezése (PulseAudio)
# ------------------------------------------------------------------------------
get_vol() {

    if command -v pactl >/dev/null 2>&1; then

        if pactl get-sink-mute @DEFAULT_SINK@ | grep -q "yes"; then

            echo "VOL MUTE"

        else

            pactl get-sink-volume @DEFAULT_SINK@ \
                | awk '/Volume:/ {print "VOL " $5; exit}'
        fi

    elif command -v amixer >/dev/null 2>&1; then

        amixer sget Master 2>/dev/null |
            awk -F'[][]' '
            /Left:/ {
                print "VOL " $2
                exit
            }'
    fi
}

# --- Dátum és Idő ---
get_date() {
    local datetime=$(date "+%Y-%m-%d %H:%M")
    echo -e "${datetime}"
}

# ==============================================================================
# FŐ CIKLUS
# ==============================================================================
while true; do
    # Adatok lekérése (csak ha a függvények léteznek a scriptben)
    CPU=$(get_cpu)
    MEM=$(get_mem)
    VOL=$(get_vol)
    DATE=$(get_date)

    # Összefűzés
    OUTPUT="| $CPU | $MEM | $VOL | $DATE |"

    # Sima echo helyett printf-et használunk újsor karakterrel (\n),
    # így a spectrwm nem tudja hozzácsapni a futó folyamatneveket.
    printf "%s\n" "$OUTPUT"

    # A sleep-et elküldjük a háttérbe, hogy ne zavarja a státuszbárt
    sleep "$SLEEP_TIME" & wait $!
done

Szerintem elég egyértelmű, tehát jöhetnek az automatikusan induló programok (~/.config/spectrwm/autostart.sh):

#!/bin/sh

numlockx on

~/.fehbg &
gammastep &
picom -b

setxkbmap hu

Ugye a numlockx és a setxkbmap egyszerű beállítások, nem kell a háttérbe küldeni őket (ezt sokan tévesztik)...

Meg is volnánk, a Spectrwm képében ismét egy jópofa, tényleg minimális erőforrást fogyasztó, rendkívül hatékony pálcikawm-et ismerhettünk meg! 
Bár a sima szöveges konfiguráció miatt szokás úgy hirdetni, hogy egyszerűen használható, ezt azért én nem mondanám, aki csak kísérletezni akar, hogy milyen érzés a pácikawm világ, az inkább mondjuk az i3-felől közelítsen, de az elszántabbak, vagy ténylegesen gyengébb vasra valami használhatót varázsolni akarók bátran ugorjanak neki!
Ja, és barátunk a man!

Berus