Dwm (dynamic window manager) – instalacja i konfiguracja w Enterprise Linux 8

dwm (dynamic window manager) to, jak sama nazwa wskazuje, dynamiczny menedżer okien. Od wielu lat jest on wyborem geeków Linuksa. W tym artykule pokażemy, jak zainstalować i skonfigurować program dwm w systemie operacyjnym EuroLinux 8.

Dwm (dynamic window manager) to, jak sama nazwa wskazuje, dynamiczny menedżer okien. Od wielu lat jest on wyborem geeków Linuksa. W tym artykule pokażemy, jak zainstalować i skonfigurować program dwm w Enterprise Linux 8.

Dynamic window manager to program służący do dynamicznego zarządzania oknami – ich otwierania i organizacji. Jest tworzony przez społeczność programistów wolnego oprogramowania suckless.org. Fundamenty filozofii suckless.org to m.in. prostota, przejrzystość, oszczędność, użyteczność, minimalizm i rozszerzalność. Właśnie taki jest dwm.

Najistotniejsze cechy dwm:

  • okna mogą być prezentowane w jednym z 3 layoutów:
    • tiled (master and stack layout)
    • floated
    • monocle
  • każdemu z okien można przypisać wiele tagów (odpowiednik workspace)
  • monitor może wyświetlać jednocześnie okna przypisane do kilku tagów
  • każdy monitor ma oddzielny zestaw tagów. Nie można wyświetlać tego samego okna na wielu monitorach jednocześnie
  • każdy monitor zawiera minimalny status bar. Zawiera on tagi, layout symbol, tytuł aktywnego okna i tekst odczytany z root window name property
  • założeniem projektu jest kod źródłowy nieprzekraczający 2000 SLOC
  • dwm to pojedynczy plik binarny
  • konfiguracja odbywa się przez edycję kodu źródłowego config.h. Wymaga kompilacji i ponownego uruchomienia dwm. Kompilacja jest bardzo szybka.

Kiedy warto skorzystać z dwm?

To narzędzie jest szczególnie warte polecenia gdy:

  • mamy ograniczone zasoby pamięci lub CPU. dwm nie wykonuje żadnych „zbędnych” zadań poza zarządzaniem oknami. Oszczędnie dysponuje więc zasobami komputera
  • chcemy poznać narzędzia CLI do zarządzania systemem operacyjnym. Brak łatwo dostępnych narzędzi GUI w środowiskach graficznych tj. GNOME lub KDE niejako zmusza do poznania narzędzi CLI i oswajania się z terminalem.

Zagłębiając się w dwm lub w inne programy od suckless.org należy porzucić niektóre oczekiwania utrwalone latami używania MS Windows, KDE, GNOME lub innego złożonego środowiska graficznego. Osoby oczekujące, że kilkoma kliknięciami myszki można uruchomić przeglądarkę internetową, arkusz kalkulacyjny lub zmienić ustawienia systemu, prawdopodobnie się zawiodą. Z drugiej strony, minimalistyczny i przewidywalny dwm może być świetnym narzędziem umożliwiającym pełną kontrolę nad oknami za pomocą klawiatury. Niezaprzeczalnie mysz również jest bardzo użyteczna :)

Instalacja

UWAGA
Instalacja oprogramowania ze źródeł jest potencjalnie niebezpieczna. Warto przetestować ją w środowisku testowym lub samodzielnie przeanalizować kod.

Niniejszy artykuł dotyczy dwm na dystrybucji EuroLinux 8 po minimalnej instalacji. Polecenia dnf są specyficzne dla systemów z rodziny Enterprise Linux (Rocky Linux, Oracle, Linux, RHEL, AlmaLinux…). W przypadku korzystania z innej dystrybucji, instalacja wymaganych pakietów może się nieco różnić. Wówczas należy użyć odpowiedniego dla siebie package managera (np. apt lub pacman). Nazwy pakietów również mogą się różnić w zależności od dystrybucji. Większość informacji dotycząca instalacji i konfiguracji dwm będzie użyteczna niezależnie od wybranej dystrybucji.

Kod źródłowy

Jeżeli nie mamy zainstalowanego gita, należy to zrobić:

sudo dnf install git

Następnie możemy pobrać kod źródłowy dwm za pomocą gita:

git clone git://git.suckless.org/dwm

Wchodzimy do katalogu z kodem źródłowym, który możemy przejrzeć:

cd dwm
cat README *.h *.c *.mk Makefile

Kompilacja

Instalujemy pakiety niezbędne do kompilacji dwm:

sudo dnf install make gcc libX11-devel libXft-devel libXinerama-devel

Aby sprawdzić, czy kompilacja przebiega pomyślnie, należy użyć polecenia:

make all clean

 

compilation error
Przykładowy błąd kompilacji. Brakuje biblioteki libXinerama. Instalacja brakującej biblioteki.

 

compilation success
Kompilacja zakończona pomyślnie.

Minimalna instalacja X server

Instalujemy pakiety niezbędne do uruchomienia dwm:

sudo dnf install xorg-x11-server-Xorg xorg-x11-xinit

Możemy potrzebować dodatkowych sterowników np. xorg-x11-drv-intel lub xorg-x11-drivers. Jeżeli tak – należy je zainstalować.

Instalacja

Aby zainstalować dwm globalnie, należy użyć:

sudo make clean install

W ten sposób zainstalujemy dwm w /usr/local/bin/ i dodamy man page do /usr/local/share/man. Możemy to zmienić w pliku config.mk w sekcji # paths. Przykładowo ustawmy zmienną PREFIX=$HOME/.local. Teraz możliwa jest instalacja jako zwykły user (bez sudo).

make clean install

Katalog $HOME/.local/bin domyślnie powinien być dodany do zmiennej środowiskowej $PATH. Możemy to sprawdzić, wywołując echo $PATH. Jeżeli nie jest – należy go dodać.

Następnie tworzymy plik .xinitrc w katalogu domowym. Uwaga. Poniższe polecenie nadpisze plik .xinitrc, jeśli ten już istnieje.

echo dwm > $HOME/.xinitrc

Pierwsze uruchomienie dwm

Poniższym poleceniem uruchomimy server X, który uruchomi dwm:

startx

dwm0

W obecnym stanie najprawdopodobniej możliwe jest tylko ruszanie kursorem po ekranie lub przełączanie tagów. Możemy to robić za pomocą skrótów klawiaturowych:

[Atl]+[4]
[Alt]+[7]
[Ctrl]+[Alt]+[2]
[Ctrl]+[Alt]+[5]
[Ctrl]+[Alt]+[2]
[Alt]+[0]
[Ctrl]+[Alt]+[3]
[Alt]+[1].

Tagi można przełączać również myszką.

[Alt]+[Shift]+[q] zamyka dwm i wraca do tty.

Podstawowe skróty klawiaturowe

Skróty klawiaturowe można zawsze podejrzeć w manualu man dwm. Mod1 domyślnie oznacza Alt. Poniżej pokażemy, jak zmienić Alt na Super lub Windows key. Kod definiujący skróty klawiaturowe znajduje się w pliku config.h.

Podstawy

[Shift]+[Mod]+[Enter]   - launch terminal

[Mod]+[b]               - show/hide bar
[Mod]+[p]               - dmenu for running programs like the x-www-browser
[Mod]+[Enter]           - push acive window from stack to master, or pulls last used window from stack onto master.

[Mod] + [j / k]         - focus on next/previous window in current tag
[Mod] + [h / l]         - increases / decreases master size

Nawigacja

[Mod]+[2]               - moves your focus to tag 2
[Shift]+[Mod]+[2]       - move active window to the 2 tag

[Mod] + [i / d]         - increases / decreases number of windows on master
[Mod] + [, / .]         - move focus between screens (multi monitor setup)
[Shift]+[Mod]+[, / .]   - move active window to different screen

[Mod]+[0]               - view all windows on screen
[Shift]+[Mod]+[0]       - make focused window appear on all tags
[Shift]+[Mod]+[c]       - kill active window
[Shift]+[Mod]+[q]       - quit dwm cleanly

Layout

[Mod]+[t]               - tiled mode. []=
[Mod]+[f]               - floating mode. ><>
[Mod]+[m]               - monocle mode. [M] single window fullscreen

Floating

[Mod]+[R M B]           - to resize the floating window
[Mod]+[L M B]           - to move the floating window around
[Mod]+[Space]           - toggles to the previous layout mode
[Mod]+[Shift]+[Space]   - to make an individual window float
[Mod]+[M M B]           - to make an individual window un-float

Podstawowa konfiguracja

Konfiguracja dwm polega na edycji pliku config.h i ponownej kompilacji make clean install (z sudo lub bez).

Mod: zmiana alt na super/windows

Należy zmienić zmienną MODKEY:

#define MODKEY Mod4Mask

Terminal

Domyślnym terminalem dwm jest st. Można go zainstalować w sposób analogiczny do dwm. Oczywiście nic nie stoi na przeszkodzie, żeby zintegrować inny terminal np. emulator terminator.

Aby zainstalować terminator, należy użyć:

sudo dnf install terminator

Zintegrujmy teraz terminator z dwm. Zamieńmy linię w pliku config.h w sekcji /* commands */:

static const char *termcmd[] = { "terminator", NULL };

Następnie należy skompilować i zainstalować dwm ponownie make clean install. Po ponownym uruchomieniu (startx) możemy otworzyć kilka okien terminala (Mod+Shift+Enter). Warto poeksperymentować z nawigowaniem między oknami.

dwm terminator

Application Launcher

Domyślnym launcherem aplikacji jest dmenu. Konfiguracja dmenu jest zdefiniowana w pliku config.h w liniach:

static const char dmenufont[]       = "monospace:size=10";
static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
	{ MODKEY,                       XK_p,      spawn,          {.v = dmenucmd } },

W naszym przypadku program dmenu nie jest zainstalowany oraz nie ma go w repozytoriach EuroLinux. Dlatego skrót Mod+p go nie wywołuje. Alternatywą może być wywoływanie aplikacji z terminala. Instalacja dmenu znajduje się poniżej.

launch from terminal

firefox

Firefox domyślnie otwiera się w tagu nr 9 (definicja w config.h).

Instalacja dmenu

Instalacja dmenu przebiega analogicznie do dwm:

cd # powrót do katalogu użtkownika
git clone git://git.suckless.org/dmenu
cd dmenu 
sudo make clean install

Mod+p otwiera dmenu.

dmenu

Multi-monitor

Aby skonfigurować multi-monitor, należy użyć zewnętrznego narzędzia, np. xrandr. Oto przykład konfiguracji trzech monitorów.

Przegląd dostępnych monitorów:

xrandr

Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 16384 x 16384
eDP-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 309mm x 173mm
   1920x1080     60.00*+  59.97    59.96    59.93    48.00  
   1680x1050     59.95    59.88  
   1400x1050     59.98  
   1600x900      59.99    59.94    59.95    59.82  
   1280x1024     60.02  
   1400x900      59.96    59.88  
   1280x960      60.00  
   1440x810      60.00    59.97  
   1368x768      59.88    59.85  
   1280x800      59.99    59.97    59.81    59.91  
   1280x720      60.00    59.99    59.86    59.74  
   1024x768      60.04    60.00  
   960x720       60.00  
   928x696       60.05  
   896x672       60.01  
   1024x576      59.95    59.96    59.90    59.82  
   960x600       59.93    60.00  
   960x540       59.96    59.99    59.63    59.82  
   800x600       60.00    60.32    56.25  
   840x525       60.01    59.88  
   864x486       59.92    59.57  
   700x525       59.98  
   800x450       59.95    59.82  
   640x512       60.02  
   700x450       59.96    59.88  
   640x480       60.00    59.94  
   720x405       59.51    58.99  
   684x384       59.88    59.85  
   640x400       59.88    59.98  
   640x360       59.86    59.83    59.84    59.32  
   512x384       60.00  
   512x288       60.00    59.92  
   480x270       59.63    59.82  
   400x300       60.32    56.34  
   432x243       59.92    59.57  
   320x240       60.05  
   360x202       59.51    59.13  
   320x180       59.84    59.32  
DP-1 connected (normal left inverted right x axis y axis)
   1920x1080     60.00 +  59.94  
   1680x1050     59.95  
   1280x1024     60.02  
   1440x900      59.89  
   1280x960      60.00  
   1280x720      60.00    59.94  
   1024x768      60.00  
   800x600       60.32  
   640x480       60.00    59.94  
   720x400       70.08  
HDMI-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
HDMI-2 connected (normal left inverted right x axis y axis)
   1920x1080     60.00 +
   1600x900      60.00  
   1280x1024     75.02    60.02  
   1152x864      75.00  
   1024x768      75.03    60.00  
   800x600       75.00    60.32  
   640x480       75.00    59.94  
   720x400       70.08  

Jak widać, trzy monitory są podłączone do portów eDP-1, DP-1 i HDMI-2. Preferowany layout prezentuje się następująco:

multi monitor

Możemy go ustawić go poleceniem:

xrandr --output DP-1 --auto --rotate left --left-of eDP-1 --output HDMI-2 --auto --left-of DP-1

Status tekst i .xinitrc

Tekst znajdujący się w prawym górnym rogu można zastąpić dowolnym innym tekstem za pomocą polecenia:

setxkbmap pl # użyć, w przypadku, gdy layout klawiatury nie jest polski
xsetroot -name "Jesteś świetny!!"

dwm

 

Zmienna -name może przyjąć dowolny tekst. Wypróbujmy przykładowy skrypt pokazujący datę i godzinę.

#!/bin/bash

while true
do
	xsetroot -name "$(date)"
	sleep 1
done

Należy zapisać taki skrypt w pliku za pomocą edytora tekstu, np. vi ~/.local/bin/status.sh i nadać mu prawa do wykonywania chmod 755 ~./local/bin/status.sh. Następnie należy dodać linię status.sh & do pliku ~/.xinitrc przed dwm.

cat ~/.xinitrc
status.sh &
dwm

Warto zwrócić uwagę na znak &. startx wykonuje polecenia z xinitrc sekwencyjnie. status.sh zawiera nieskończoną pętlę. Bez & dwm nigdy by się nie wykonał. Jeżeli chcemy ustawić domyślny layout klawiatury na polski, możemy dodać na początku pliku .xinitrc polecenie setxkbmap pl.

cat ~/.xinitrc
setxkbmap pl
status.sh &
dwm

Uruchamiamy ponownie dwm: [Mod]+[Shift]+[q] i startx.

dwm status

Skrypt status.sh może być rozszerzany o dowolne komendy dające output tekstowy. Przykłady:

cat /sys/class/power_supply/BAT0/capacity – stan naładowania baterii
cat /sys/class/power_supply/BAT0/status – status ładowania.

Podsumowanie

Wierzymy, że po wykonaniu poleceń z tego artykułu każdy będzie w stanie zbudować użyteczny window manager. Możliwości rozszerzania funkcjonalności wydają się nieograniczone. Zbiór patchy dostępny jest na stronie suckless. Zachęcamy do poznania wartości promowanych przez społeczność suckless.org. Niektórzy wierzą, że tak powinien być rozwijany software. Pozostali mają inne priorytety :)

blank Autorzy

Artykuły na blogu są pisane przez osoby z zespołu EuroLinux. 80% treści zawdzięczamy naszym developerom, pozostałą część przygotowuje dział sprzedaży lub marketingu. Dokładamy starań, żeby treści były jak najlepsze merytorycznie i językowo, ale nie jesteśmy nieomylni. Jeśli zauważysz coś wartego poprawienia lub wyjaśnienia, będziemy wdzięczni za wiadomość.