Por el principio, puede decirse que, gestores de ventanas, hay muchos.
Gestores tiling (o mosaico) hay otros tantos. Y algunos destacan por particularidades propias, como es el caso de éste. Dwm parte de una premisa bastante curiosa: Hay que compilarlo sí, o sí.
Es, si no el WM más ligero, el siguiente, y su peso es absurdo, por lo reducido: 2.000 SLOC. Sus creadores, los chicos de Suckless son extremadamente cuidadosos con no añadir código “porque sí” y eso hace que, por un lado, tenga un rendimiento increíble, y por el otro, que en ocasiones se les vaya – un poco – la pinza, y eliminen funcionalidades que algunos sí usamos, por considerarlas “bloat”.
Como por ejemplo, las fuentes ttf. Además de eso, parte de una distribución de ventanas muy esquemática, con un Máster, ocupando la mitad izquierda de la pantalla, y todo el resto de ventanas se apilan en la derecha.
Si queremos que una de las ventanas secundarias pase a ser el máster, simplemente nos desplazaremos mediante Alt+j/Alt+k (atajos por defecto) le haremos zoom (Alt+Enter) y con eso la lanzaremos a la izquierda, en grande. Dispone de 2 modos más: Flotante, y monóculo. En modo flotante las ventanas pueden desplazarse mediante el ratón (¡Herejía!), y en el modo monóculo, todas las ventanas son en pantalla completa y rotaremos entre ellas según necesitemos.
Nota: No quiero profundizar mucho en esto, pero Dwm no usa escritorios, sino que agrupa las aplicaciones en “tags”, así que podemos tener una aplicación en todos los escritorios a la vez, sin necesidad de clonarla. Útil si estamos viendo una película a la vez que hacemos otras cosas y necesitamos saltar de escritorio a escritorio, por ejemplo, todo este tutorial va a ir dirigido a dwm 6.1, el cual dispone de soporte para ttf, y un montón de parches a su disposición. Asimismo, partiré del supuesto de una instalación mínima desde netinstall bajo Debian/Devuan (Que es lo que yo uso), con este gestor como único manejador de ventanas. No afecta a los que ya tienen un DE/WM en funcionamiento, pero sí es importante para los que hacen instalación limpia. Al final del tutorial añadiré todos los enlaces, y ejemplos, para no marear demasiado. Así que, ¡Empecemos!
1. DESCARGA
Para ello, se puede hacer directamente desde la página de suckless.org. Necesita que esté activo el respositorio de fuentes main (hablo de sistemas basados en Debian) así que descomentamos la entrada en el sources.list y actualizamos. Debe de quedar así (cuidado con las versiones…):
deb-src http://deb.devuan.org/merged ascii main
Actualizamos:
sudo apt update
Y descargamos:
wget https://dl.suckless.org/dwm/dwm-6.1.tar.gz
En el caso de Debian Stretch y Devuan Ascii:
apt source dwm
En cualquiera de ambos casos, luego tendremos que bajar las dependencias:
sudo apt build-dep dwm
2. COMPILACIÓN
Descomprimimos el archivo, entramos dentro de la carpeta, copiamos el archivo config.def.h como config.h, y compilamos:
tar xvzf dwm-6.1.tar.gz
cd dwm-6.1
cp config.def.h config.h
sudo make clean install
Vale. Esto es lo más básico, y desde ahí podemos empezar. Lo que hemos hecho es descomprimir, hacer una copia para modificar, y compilar. No hay más problema si luego queremos modificarlo (que lo haremos) porque es tan simple como recompilar y se hace en un segundo.
3. AÑADIRLO COMO WM
Sí. La mayoría de los WM no tienen esta peculiaridad y crean una entrada en x-window-manager según necesitan. Curiosamente, y si mal no recuerdo, si ya tenemos instalado un WM previo (por ejemplo, Openbox) sí se hace automáticamente, pero llevo mucho tiempo instalándolo como única opción, así que no puedo asegurarlo. Por suerte, es tan sencillo como hacer:
sudo update-alternatives --config x-window-manager
Si no nos aparece ninguna opción, o no aparece Dwm, tendremos que crearlo. Afortunadamente, es bastante fácil y basta con crear un lanzador (he puesto dwm-start por tradición, no porque sea obligatorio) y si se usa un manejador de sesiones (Slim, LightDM, etc.) un archivo .desktop.
nano dwm-start dwm.desktop
¿Qué metemos dentro de esos archivos?. En el caso de dwm-start, el lanzador de dwm y todo lo que queramos que entre al inicio de sesión, y el otro es simplemente para que el DM de turno lo reconozca y pueda arrancarlo.
3.1 DWM-START
#!/bin/bash xset +fp /usr/share/fonts/local xset fp rehash
Cualquier manejador de papel tapiz, nitrogen, feh, whatever, va aquí.
dwmstatus &
Cualquier añadido al panel, conky-cli, xsetroot, acá.
exec dwm
3.2 DWM.DESKTOP
[Desktop Entry] Encoding=UTF-8 Name=Dwm Comment=Dwm Exec=dwm-start Type=XSession
Acto seguido le damos permisos de ejecución a dwm-start y los copiamos a donde tienen que estar:
chmod +x dwm-start
sudo mv dwm-start /usr/bin/
sudo mkdir /usr/share/xsessions
sudo mv dwm.desktop /usr/share/xsessions/
Y ahora pasamos a añadirlo al update-alternatives, caso de que no nos aparezca:
sudo update-alternatives --install /usr/bin/x-window-manager x-window-manager /usr/bin/dwm-start 90
A partir de aquí ya depende mucho de cada instalación. Si usamos xinit, basta con arrancar mediante startx. Si usamos un DM, nos aparecerá como opción para arrancar. Eso queda ya a gusto de cada usuario. En cualquier caso, dado que es un WM, caso de tener un DE o WM instalado previamente no afecta en lo más mínimo y pueden coexistir sin más inconveniente.
4. CONFIGURARLO
Empieza el auténtico festival. Nada más arrancar, lo que veremos es una pantalla en negro, y un panel con la versión de dwm, el “escritorio” y… poco más. Bien. Lo primero que haremos es abrir una terminal mediante Alt+Shift+Enter, y abrir el archivo $HOME/dwm-6.1/config.h para poder modificarlo a nuestro gusto. Todo lo que hagamos no tendrá validez alguna hasta que recompilemos y reiniciemos la sesión. Recordemos que antes hemos copiado config.def.h. Ese no lo tocaremos más, y todas las configuraciones las realizaremos en config.h. La estructura es bastante sencilla, e iré un poco a lo básico. Que cada cual se lo monte como quiera, que esto es lo bonito. Dado que lo habitual es que la letra modificadora sea Windows (O Meta4) será lo primero que cambiemos:
#define MODKEY Mod1Mask --> #define MODKEY Mod4Mask
Si queremos añadir funciones propias como atajo de teclado (Por ejemplo, el navegador de archivos, el navegador web, o lo que sea) tendremos que crear el comando y añadirle una acción asociada, cada una de las líneas en su sección correspondiente. Por ejemplo, con htop:
static const char *htop[] = { "xterm", "-e", "htop", NULL };{ MODKEY|ShiftMask, XK_h, spawn, {.v = htop } },
De la misma manera, se puede ajustar al gusto tanto el número de “escritorios”, como en qué escritorio queremos que arranque tal o cual aplicación, o si queremos que sea flotante desde el inicio. La fuente, como apunte, se puede introducir tanto de las xfonts (mediante xfontsel) o ttf, siempre que sea dwm 6.1. La estructura será “fuente:size=X:style=X”. Abajo dejaré el mío, por si alguien quiere tomar ideas. En todo caso, una vez hayamos acabado, tendremos que recompilar y salir de la sesión para que los cambios se efectúen.
cd dwm-6.1 && sudo make clean install
5. PERSONALIZARLO
Una vez compilado y funcional, con los atajos de teclado que usamos (cada uno tiene los suyos propios) toca darle un poco de glamour a la apariencia.
5.1 WALLPAPER
El papel tapiz, se puede colocar de muchos modos. El más simple, nitrogen. Si optamos por algo más sencillo y KISS, feh. En el caso de nitrogen, es un momento. Instalar, lanzar, asignar la carpeta donde tenemos las imágenes, aplicar, y hacer que /usr/bin/dwm-start lo lance al inicio. Para ello, añadiremos esta línea:
nitrogen --restore &
En el caso de feh, es igual de simple. Desde terminal, seleccionaremos la imagen con este otro comando:
feh --bg-fill ruta-de-la-imagen.jpg
Ésto creará un pequeño script ejecutable en nuestro /home, que añadiremos a /usr/bin/dwm-start:
~/.fehbg &
5.2 PANEL
Hay varios modos para modificarlo. Solo voy a tratar 2, que es, mediante conky-cli o mediante xsetroot (Disponible en x11-utils). EL uso mediante conky-cli es largo de explicar y no viene al caso, el mío usaba casi todo scripts, y necesitaría otro ladrillo como este. El método de lanzamiento, una vez tengamos un conkyrc a nuestro gusto, sería añadiéndolo, una vez más, a dwm-start:
conky -c ~/.conkyrc | while read -r; do xsetroot -name “$REPLY”; done &
Xsetroot es otro cantar. Si en una terminal ponemos, por ejemplo:
xsetroot -name “hola”
Veremos que eso es lo que sale en el panel. Así pues, dejo abajo mi script para xsetroot, por si alguien quiere tomar ideas, y la forma de añadirlo, aún más fácil que con conky, otra vez en dwm-start:
sh “ruta al script”/xsetroot.sh &
Recordad darle permisos de ejecución con chmod +x.
5.3 EL LANZADOR DE APLICACIONES
Por defecto, Dwm viene pelado. Si puedes abrir una terminal, ya ¿No?. Bueno, es cómodo las primeras 10 veces, luego ya te hartas, y ahí es donde entra esta sección. Hablaré de 3 opciones (hay tropecientas más) que son las que comparten estilo, y son las que más he usado, aunque solo me detendré un poco en una. Dmenu, j4-dmenu-desktop y rofi. Recordemos que, sea lo que sea que uses, puedes añadirlo al config.h y darle un atajo de teclado.
5.3.1 DMENU
También desarrollado por los mismos devs de dwm, dmenu es un lanzador bastante sencillo de aplicaciones, situado por defecto en la combinación Alt+p. Si bien dmenu viene integrado en el propio archivo config.h, es posible cambiarlo un poco y sobre todo, eliminar gran parte de la paja innecesaria que trae, ya que aglutina todo lo que hay en /usr/bin, y muchas de esas aplicaciones son para consola. Una forma rápida en la que se puede hacer, es mediante pipes y archivos de texto. Por poner un ejemplo rápido, si yo creo un archivo de texto llamado “menudmenu” tal que así: firefox-esr pcmanfm mirage.
Puedo usarlo como lanzador, simplemente “pipeándolo”:
less menudmenu | dmenu
Para instalaciones minimalistas, puede ser muy cómodo. Permite el control del usuario, scripts, y casi todo lo que le eches, a la vez que mantienes la sencillez de dmenu. Así es como lo uso yo, de paso, de ahí que lo mencione.
5.3.2 J4-DMENU-DESKTOP Y ROFI
Si todo lo anterior no convence, existe j4-dmenu-desktop. El cual es, básicamente, una versión de dmenu que lee los archivos desktop de /usr/share/applications. Útil para cuando dwm coexiste con instalaciones ya funcionales de DE/WM y no quieres perder tiempo buscando las aplicaciones, o creando un archivo. Rofi es otro cantar. Lo he usado durante un par de años, porque permite, no solo el acceso a archivos .desktop, sino a /usr/bin (separado por secciones), ver que ventanas están abiertas y en qué escritorio, y mil etcs. Recomiendo echarle un ojo, abajo dejo la página (2).
5.4 PARCHES
Ante todo, un apunte: Si bien muchos funcionan correctamente, acumular parches no deja de ser meter código uno encima de otro. Esto quiere decir que el orden, importa, y puede dar problemas si se meten sin cuidado. En mi caso, lo uso al original, pero sí que he usado uno que separa un poco las ventanas unas de otras. Es útil al inicio, cuando se pasa a un entorno en mosaico, porque elimina un poco la asfixia de ver todo el paquetón de ventanas, cubriéndolo todo. Se llama uselessgaps, y su instalación (y esto para todos los parches) es muy sencilla. Primero, descargamos de la propia página de suckless:
wget https://dwm.suckless.org/patches/uselessgap/dwm-uselessgap-6.1.diff
Lo copiamos a la carpeta:
mv dwm-uselessgap.diff $HOME/dwm-6.1/
Entramos a la carpeta y lo añadimos al código:
cd dwm-6.1
patch -p1 < dwm-uselessgap.diff
Editamos config.h para añadir esta línea en el apartado de apariencia (grosor a nuestra elección):
static const unsigned int gappx = 6;
Y compilamos:
sudo make clean install
La siguiente vez que entremos en la sesión, veremos un bonito espacio entre ventanas, cuando hay más de una.
6. NOTAS FINALES
He intentado hacer el tutorial lo más simple posible, y me he dejado muchas cosas en el tintero. Por ejemplo, las opciones de compilación, si se usa o no xinerama, y mil etcs y scripts. Para empezar con Dwm, creo que sobra. Y realmente, lo complicado no es en si instalarlo, sino configurar el archivo config.h, y adaptar las aplicaciones. Eso, a gusto de cada cual. Añadiré abajo, tanto mi propio archivo config.h, como el script xsetroot.sh y el dwm-start (aunque se notará que uso más scripts que no pongo por no liar). Que cada cual lo use como mejor le parezca, o lo ignore, que por algo esto es libertad.
- (1) https://dl.suckless.org
- (2) https://github.com/davatorium/rofi
- (3) https://pastebin.com/raw/qfGtrsyd
PD: Si alguien quiere ayudarme con xsetroot.sh, se agradece. Me tocó buscar en algunos casos, y toda ayuda o consejo será bien recibido.
DWM ejecutando GIMP
DWM en Void Linux
Fuente: maslinux