suckless.org, la casa de dwm, es una pequeña joya de página;
We are the home of quality software such as dwm, dmenu, libixp, wmii and plenty of other tools, with a focus on simplicity, clarity and frugality. Our philosophy is about keeping things simple, minimal and usable
Hacía tiempo que le daba vueltas a la idea de cambiar de gestor de ventanas. He estado utilizando awesome durante bastante tiempo. Cuando lo conocí venía de Gnome, y me sentí entusiasmada ante el cambio radical que suponía en mi forma de trabajar. Me enamoré del concepto de tiling, y awesome y yo tuvimos nuestros más y nuestros menos con sus meneos de sintaxis y ese gran paso que fue la serie 3 con respecto a la 2.
Pero todo cambia, y a medida que el gestor se iba haciendo más complejo y completo, más flexible y poderoso, yo sentía que era "demasiado" para mí. Es decir. Yo no utilizo iconos, menús ni indicadores de batería y volumen. Tampoco necesito que la barra de tareas me muestre lo que estoy escuchando con mpd. Tenía la sensación de tener algo muy poderoso entre manos, del que sólo aprovechaba el 5 % de su capacidad... no necesitaba eso.
Estas últimas semanas me he dedicado a probar distintos gestores (siempre con funcionalidad tiling). Algunos eran viejos conocidos, como echinus y Xmonad, otros los conocí por recomendaciones, como i3 y musca (gracias, minaya ;)) y finalmente alguno se quedó en el tintero, scrotwm (gracias cnicolas :)). Pero al final he optado por dwm. He estado dudando entre escribir una entrada en mi blog o trabajar en un artículo para el wiki, pero creo que aún no conozco demasiado bien dwm como para ésto último. Otro día quizá.
dwm es "el hermano pequeño de wmii". Escrito en C, en menos de 2000 líneas de código y realmente sencillo de configurar.La última versión nos permite trabajar en tres modos: tiled, monocle y floating, pudiendo cambiar entre ellos de forma dinámica.
Para los que hayáis trabajado con algún gestor basado en dwm (awesome lo es), sus características os resultarán muy familiares: división del área de trabajo en áreas principal y secundarias en el modo tiling, aplicaciones maximizadas en modo monocle y libertad de movimiento y redimensionado en modo floating.
Encontramos también una barra de tareas, que puede cambiarse de sitio o hacerla desaparecer. Aparte de los consabidos tags y el layout activo en ese momento es posible, a pesar de lo austero del código, añadirle cosas como un reloj sencillo y el estado de carga de la batería.
Ahora bien, dwm tiene una pequeña particularidad. Su configuración se realiza mediante el (re)compliado del código fuente, así que no tiene demasiado sentido instalarlo desde los repositorios de la distribución que usemos, a la manera tradicional.
Para mí lo más fácil es ir a la página web del proyecto y descargar dwm desde allí. Puede ser buena idea crear una carpeta en nuestro home para trabajar con dwm cada vez que lo necesitemos.
Una vez desempaquetado el archivo con las fuentes de dwm, tenemos que buscar el fichero de cabecera config.default.h. Muy probablemente querremos crear uno a nuestro gusto, así que hacemos
# mv config.default.h config.h
config.h es bastante sencillo e intuitivo, incluso si no se sabe nada de C
/* See LICENSE file for copyright and license details. */
/* appearance */
static const char font[] = "-*-*-medium-*-*-*-14-*-*-*-*-*-*-*";
static const char normbordercolor[] = "#cccccc";
static const char normbgcolor[] = "#cccccc";
static const char normfgcolor[] = "#000000";
static const char selbordercolor[] = "#0066ff";
static const char selbgcolor[] = "#0066ff";
static const char selfgcolor[] = "#ffffff";
static const unsigned int borderpx = 1; /* border pixel of windows */
static const unsigned int snap = 32; /* snap pixel */
static const Bool showbar = True; /* False means no bar */
static const Bool topbar = True; /* False means bottom bar */
/* tagging */
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
static const Rule rules[] = {
/* class instance title tags mask isfloating monitor */
{ "Gimp", NULL, NULL, 0, True, -1 },
{ "Firefox", NULL, NULL, 1 << 8, False, -1 },
};
/* layout(s) */
static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
static const Bool resizehints = True; /* True means respect size hints in tiled resizals */
static const Layout layouts[] = {
/* symbol arrange function */
{ "[]=", tile }, /* first entry is default */
{ "><>", NULL }, /* no layout function means floating behavior */
{ "[M]", monocle },
};
/* key definitions */
#define MODKEY Mod1Mask
#define TAGKEYS(KEY,TAG) \
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
{ MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
{ MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
{ MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} },
/* helper for spawning shell commands in the pre dwm-5.0 fashion */
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
/* commands */
static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
static const char *termcmd[] = { "uxterm", NULL };
static Key keys[] = {
/* modifier key function argument */
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
{ MODKEY, XK_b, togglebar, {0} },
{ MODKEY, XK_j, focusstack, {.i = +1 } },
{ MODKEY, XK_k, focusstack, {.i = -1 } },
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
{ MODKEY, XK_Return, zoom, {0} },
{ MODKEY, XK_Tab, view, {0} },
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
{ MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
{ MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
{ MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
{ MODKEY, XK_space, setlayout, {0} },
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} },
{ MODKEY, XK_0, view, {.ui = ~0 } },
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
{ MODKEY, XK_comma, focusmon, {.i = -1 } },
{ MODKEY, XK_period, focusmon, {.i = +1 } },
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
TAGKEYS( XK_1, 0)
TAGKEYS( XK_2, 1)
TAGKEYS( XK_3, 2)
TAGKEYS( XK_4, 3)
TAGKEYS( XK_5, 4)
TAGKEYS( XK_6, 5)
TAGKEYS( XK_7, 6)
TAGKEYS( XK_8, 7)
TAGKEYS( XK_9, 8)
{ MODKEY|ShiftMask, XK_q, quit, {0} },
};
/* button definitions */
/* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
static Button buttons[] = {
/* click event mask button function argument */
{ ClkLtSymbol, 0, Button1, setlayout, {0} },
{ ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
{ ClkWinTitle, 0, Button2, zoom, {0} },
{ ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
{ ClkClientWin, MODKEY, Button2, togglefloating, {0} },
{ ClkClientWin, MODKEY, Button3, resizemouse, {0} },
{ ClkTagBar, 0, Button1, view, {0} },
{ ClkTagBar, 0, Button3, toggleview, {0} },
{ ClkTagBar, MODKEY, Button1, tag, {0} },
{ ClkTagBar, MODKEY, Button3, toggletag, {0} },
};
Lo único que tenemos que hacer es modificarle lo que queramos y compilar e instalar. Tenemos también un fichero README muy explicativo y completo.
# make clean install
Para saber más,
dwm

cuando me aburra de Icewm, que conociéndome me aburriré tarde o temprano, pasare a probar este , aunque eso de tener que compilar cada vez que quiera cambiar algo me da algo de miedo , jaja , soy un poco maniaco y ya me imagino cuando me de por tunear el escritorio xD.
cuando me aburra de Icewm, que conociéndome me aburriré tarde o temprano, pasare a probar este , aunque eso de tener que compilar cada vez que quiera cambiar algo me da algo de miedo , jaja , soy un poco maniaco y ya me imagino cuando me de por tunear el escritorio xD.
Yo estaba un poco reacia al principio por eso mismo, pero qué va. Se tarda dos segundos en recompilar, y tampoco es que el fichero de configuración de mucho mucho de sí xDDDD
Un manejador de ventanas que no conocía
Futuro candidato a pruebas. Muchas gracias Arctica está genial la entrada de Blog.
Saludos
Genial, tenía ganas de probar dwm de forma seria y acabas de darme el impulso necesario :P .
cuando me de por tunear el escritorio xD.
Bueno, en realidad no hay necesidad alguna de tunear nada, así que eso no es un problema ;) . El encanto de estos entornos es precisamente que son muy simples y elegantes tal y como vienen. En todo caso cambiarle la combinación de colores (el azul que viene por defecto te deja ciego como mínimo xD) y configurar lo que es el entorno en sí (tags, layouts, aplicaciones floating), etc. Aparte de que si te sales de esto te toca escribir código en C o añadir extras.
PD. Arctica, son 2000 líneas de código (que me siguen pareciendo muy pocas). En 200 líneas de C no te da ni para un hola mundo
.
Bueno, aqui otra persona que se anima a probarlo. Lo de compilar no me da ningun miedo, lo de modificar el codigo del config.h un poquito de respeto, de C sé lo basico, pero por lo que he visto por encima no parece demasiado dificil de modificar, eso si me creare un respaldo por si acaso.
PD. Arctica, son 2000 líneas de código (que me siguen pareciendo muy pocas). En 200 líneas de C no te da ni para un hola mundo
.
lo he editado, gracias. :)
Este le he usado yo en el pasado --increible el menú dinámico-- aunque yo usaba el paquete Debian. Puestos a compilarlo deberías usar checkinstall como mínimo.
No se si conoces este manual:
http://forums.debian.net/viewtopic.php?f=16&t=38976
También podrías crear scripts de desinstalación como hacen en Manualinux. El manual de gcc es imprescindible.
Seguire tus andanzas con este "tiling", awesome me daba mucha pereza (no tenía ganas de aprender Ruby.)
Pdta: para tu colección, puedes añadir stumpwm, que aunque no está acabado, da mucho juego porque está completamente programado en Lisp. (Si no te va emacs, no te gustará).
Gracias por compartir información sobre esta joyita, me encanta su simplicidad y que este escrito en C.
Este le he usado yo en el pasado --increible el menú dinámico-- aunque yo usaba el paquete Debian. Puestos a compilarlo deberías usar checkinstall como mínimo.
No se si conoces este manual:
http://forums.debian.net/viewtopic.php?f=16&t=38976
También podrías crear scripts de desinstalación como hacen en Manualinux. El manual de gcc es imprescindible.
Seguire tus andanzas con este "tiling", awesome me daba mucha pereza (no tenía ganas de aprender Ruby.)
Pdta: para tu colección, puedes añadir stumpwm, que aunque no está acabado, da mucho juego porque está completamente programado en Lisp. (Si no te va emacs, no te gustará).
Solo una aclaracion, para awesome3 el lenguaje es lua y no Ruby.
Seguro que sí, lo he puesto de memoria y... me he equivocado.