# Dynamic window manager

Dynamic window manager (dwm) è un tiling window manager per X11 che mostra i principi del minimalismo. È un WM dinamico, leggero ed efficiente scritto in C e viene generalmente considerato il fratello più piccolo di wmii sebbene non implementi gran parte delle sue funzionalità. Esteticamente è simile a wmii, sebbene internamente funzioni in modo molto più semplice, infatti, una delle linee guida del progetto consiste nel non eccedere mai le 2000 SLOC e le opzioni considerate configurabili dall'utente sono contenute in un singolo file header. La distribuzione Linux Debian fornisce un pacchetto eseguibile che mostra le funzionalità di dwm senza consentire alcuna personalizzazione, dato che per applicare le patch occorre ricompilare.
Dwm utilizza un modello focus-follows-mouse e manca di qualsiasi decorazione delle finestre con l'eccezione dei bordi, utilizzati per mostrare il focus, e a differenza di wmii non è basato su nulla che abbia a che fare con Plan 9. Una volta compilato, dwm è composto da un singolo file binario di dimensione generalmente inferiore ai 30K.
A partire da marzo 2009 è stato avviato un progetto parallelo che si pone l'obiettivo di portare dwm su piattaforma win32.

## Caratteristiche

Le caratteristiche principali sono:
* il supporto per i tag; un meccanismo efficiente e molto più flessibile dei comuni desktop;
* la disposizione automatica dei client di X (finestre), in layout diversi da floating;
* l'estrema velocità e affidabilità grazie al meccanismo config.h, che lo rende anche molto sicuro;
* una barra di stato dinamica e aggiornabile a runtime;
* l'essere basato aggressivamente su combinazioni da tastiera (ma anche in buona parte sul mouse);
* l'estensibilità attraverso una significativa quantità di patch rese disponibili dalla comunità sul sito ufficiale del progetto;
* la portabilità del codice, resa possibile grazie alla filosofia Suckless.

## Tag

Dwm utilizza, al posto dei classici desktop, un concetto molto più flessibile ed efficiente chiamato tag. Nelle prime implementazioni questi erano gestiti tramite una lista di stringhe ognuna avente il nome di ogni tag (ad esempio www, work, dev). Successivamente è stato scelto di utilizzare un'apposita tagmask, un intero di 32 bit, in cui ogni bit rappresenta appunto un tag semplificando e rendendo molto più efficiente il sistema. A tutt'oggi resta questo il meccanismo di gestione dei tag in uso.

## Barra di stato

Qualora questa non sia stata disabilitata in fase di configurazione, dwm fornisce una barra (posta in alto di default) in cui vengono mostrate alcune informazioni tra cui:
* Nome del tag corrente
* Numero di client aperti nel tag corrente
* Layout in uso
* Nome e layout del client attivo
* Area di notifica
L'area di notifica rappresenta l'unica parte modificabile in fase di esecuzione in quanto queste le informazioni vengono lette a runtime. Nelle prime versioni queste erano lette direttamente dallo standard input; oggi sono ottenute attraverso il nome della finestra root di X il quale può essere modificato da un processo esterno. Cambiando tali dati la barra viene immediatamente aggiornata con le nuove informazioni, le quali possono essere generate come si preferisce (generalmente attraverso uno script o direttamente in uno dei file di inizializzazione di X11, come ~/.xinitrc). Spesso si utilizzano dati come l'ora, la data, il livello di carico medio e altre informazioni utili. La barra ha l'abilità di essere nascosta in fase di esecuzione attraverso una combinazione di tasti (di default meta-b, dove meta spesso corrisponde al tasto Alt) e allo stesso modo può essere ripristinata.
In genere la barra di stato è completata con dmenu, un'applicazione per l'esecuzione di comandi testuali sviluppata dallo stesso ideatore di dwm.

## Configurazione

La configurazione si effettua esclusivamente attraverso la modifica diretta del codice sorgente, cosa che lo rende molto più efficiente e sicuro. Un apposito file "di configurazione" chiamato config.h consente di personalizzare alcune caratteristiche come combinazioni di tasti, font, colori, tag e così via. Per questo motivo una qualsiasi personalizzazione richiede necessariamente la ricompilazione di dwm. Questo ed altri fattori fanno in modo che il WM, non avendo codice di supporto per file di configurazione a runtime, non ecceda i 30K di codice.

## Fork e patch

I concetti e le caratteristiche di dwm lo hanno reso un progetto molto influente, molti altri window manager sono basati sul codice di dwm o sono comunque da esso ispirati. Una lista estesa di fork e patch è reperibile sul sito ufficiale del progetto. Di seguito sono riportati alcuni esempi noti:
* xmonad: un clone di dwm riscritto in Haskell con alcune funzionalità aggiuntive
* awesome: estende il supporto FreeType, riconfigurabilità, e aggiunge più tipi di layout
* echinus: estende il supporto FreeType, EWMH, click-to-focus, riconfigurabilità e più tipi di layout
* dwm-gtx: un ramo di dwm che aggiunge il layout 'deck' ed un migliore supporto Xinerama
* scrotwm: prende un po' di codice da dwm con l'aggiunta del supporto Xinerama dinamico, riconfigurabilità ed è riavviabile senza perdere i dati
* bug.n e HashTWM sono applicazioni ispirate da dwm che portano il concetto di tiling window manager su sistemi Microsoft Windows

## Curiosità

* È il window manager personale di Anselm R. Garbe (sviluppatore di wmii e autore di dwm).