dwm

Enviado por arctica el 17 Noviembre, 2009 - 02:59.

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

Imagen de tlacuacheoscuro
Enviado por tlacuacheoscuro el 17 Noviembre, 2009 - 04:19.

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.

Imagen de arctica
Enviado por arctica el 17 Noviembre, 2009 - 04:22.
tlacuacheoscuro escribió:

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

Imagen de xanderboy
Enviado por xanderboy el 17 Noviembre, 2009 - 04:41.

Un manejador de ventanas que no conocía tongue Futuro candidato a pruebas. Muchas gracias Arctica está genial la entrada de Blog.

Saludos first

Imagen de minaya
Enviado por minaya el 17 Noviembre, 2009 - 07:32.

Genial, tenía ganas de probar dwm de forma seria y acabas de darme el impulso necesario :P .

tlacuacheoscuro escribió:

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 meparto .

Imagen de cnicolas
Enviado por cnicolas el 17 Noviembre, 2009 - 08:12.

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.

Imagen de arctica
Enviado por arctica el 17 Noviembre, 2009 - 11:42.
minaya escribió:

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 meparto .

dumb meparto

lo he editado, gracias. :)

Imagen de antoine
Enviado por antoine el 17 Noviembre, 2009 - 12:30.

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á).

Imagen de godlanier
Enviado por godlanier el 17 Noviembre, 2009 - 13:31.

Gracias por compartir información sobre esta joyita, me encanta su simplicidad y que este escrito en C.

Imagen de cnicolas
Enviado por cnicolas el 17 Noviembre, 2009 - 14:29.
antoine escribió:

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.

Imagen de antoine
Enviado por antoine el 17 Noviembre, 2009 - 14:50.

Seguro que sí, lo he puesto de memoria y... me he equivocado.