DWM: ¡Un Window Manager de apenas 2149 líneas!

  • 3 Respuestas
  • 897 Vistas

0 Usuarios y 2 Visitantes están viendo este tema.

Conectado DtxdF

  • *
  • Moderador Global
  • Mensajes: 687
  • Actividad:
    100%
  • Reputación 16
  • Eres un auto y tienes dos opciones: Parar o Seguir
    • Ver Perfil
    • Mi repositorio de Github donde encontraras herramientas para tu trabajo.
    • Email

DWM: ¡Un Window Manager de apenas 2149 líneas!

  • en: Abril 24, 2020, 04:51:58 am
Cuando hablamos de un Window Manager (Manejador de Ventanas, en español), no referimos de ese componente del sistema que proporciona al usuario una Interfaz gráfica de usuario (GUI, por sus siglas en Inglés). Pese a que la elección en su mayoría es el Entorno  de Escritorio, Un WM tiene muchas más ventajas en cuanto al ahorro de tiempo y recursos.


Fuente oficial: dwm.suckless.org

DWM (Dynamic Window Manager), es un administrador de ventanas dinámico para X, éste puede controlar la forma en que se expresan las ventanas en tiempo de ejecución de forma arbitraria según lo decida el mismo usuario. DWM, puede aplicar el diseño con los siguientes métodos:

  • Stacking (conocidos también como flotantes): Este gestor de ventanas representan un símil del escritorio tradicional del que venimos viendo en Sistemas Operativos como Windows y OS X. Éstos apilan cada ventana una delante de otra dando el aspecto a varias hojas de papel unidas.
  • Tiling (conocidos también como de tipo mosaico): Éstos no superponen las ventanas al contrario de su hermano anterior, además de que usan un catalogo extendidos de atajos en el teclado ahorrando más tiempo (e incluso recursos). Los gestores de ventanas tipo tiling se nota la exclusividad del uso del teclado, mientras que el ratón ya es opcional.
  • Dynamic: Es el caso de DWM que permite alternar entre tipo "Stacking" o "Tiling" a decisión del usuario.

Una vez aclarado los aspectos principales para adentrarnos más en estos mundos, pasemos a la práctica...

Descarga:

Antes que nada, debemos tener instalado 'git', 'gcc' y 'make' para poder clonar el repositorio e instalar todo parsimonioso:

Debian y derivados:


Código: Bash
  1. sudo apt-get install git build-essential

O en caso de no tener 'sudo' instalado

Código: Bash
  1. su
  2. apt-get install git build-essential

Archlinux y derivados:

Código: Bash
  1. sudo pacman -S git gcc make

O en caso de no tener 'sudo' instalado

Código: Bash
  1. su
  2. pacman -S git gcc make

Ahora clonamos el repositorio:

Código: Bash
  1. git clone http://git.suckless.org/dwm
  2. cd dwm

Tutorial:

Quiero aclarar que este tutorial está enfocado a los usuarios noveles, los que desean aprender más sobre estos mundillos tan hermosos y llenos de libertad. Pese a que tocaremos código en You are not allowed to view links. Register or Login, trataré de no hacer mención de qué significa cada cosa, en su lugar dejaré textos enlazados a los conceptos para no embotar el tema principal y dedicarme a la configuración y uso de DWM.


Una vez hemos descargado DWM, pasemos a la configuración, pero antes necesitaremos instalar un lanzador de aplicaciones. Tenemos dos opciones: dmenu ó rofi (mi preferido).

Instalación en Archlinux y derivados:

Código: Bash
  1. # dmenu
  2. sudo pacman -S dmenu
  3. # rofi
  4. sudo pacman -S rofi

Instalación en Debian y derivados:

Código: Bash
  1. # dmenu
  2. sudo apt-get install suckless-tools
  3. # rofi
  4. sudo apt-get install rofi

Esos programas nos van a permitir poder ejecutar aplicaciones (estilo un menú de un Entorno de Escritorio, pero será invocado cuando deseemos).

En el caso de Debian a mí me faltaron instalar algunas dependencias, pero para Arch no fue el caso. Instalación de las depencias en Debian:

Código: Bash
  1. sudo apt-get install libx11-dev libxinerama-dev

Importante: Si faltaron mencionar dependencias o en el caso de Arch, te faltaron dependencias, hazmelo saber para editar este documento y mencionarlas, todos te lo agradeceríamos.

Ahora viene la parte buena, la configuración.

Para configurar DWM necesitamos abrir el archivo config.def.h con nuestro editor de texto preferido, En mi caso usaré You are not allowed to view links. Register or Login:

Código: Bash
  1. vim config.def.h


Comandos que se ejecutarán por defecto

Entre la línea 59-60 estarán los comandos que serán ejecutados por DWM y en unos momentos los empezaremos a cambiar.


Combinaciones del teclado

Entre la línea 62-97 encontraremos un listado de combincaciones del teclado. Mientras que en la imagen se aprecia tres dialogos de texto con unas flechas rojas, esas flechas específican lo siguiente:

  • Las primeras combinaciones: Con las "Primeras Combinaciones" me estoy refiriendo a las primeras teclas que llamarán a la variable. En la imagen apreciamos una You are not allowed to view links. Register or Login llamada MODKEY, ésa será la tecla principal y por defecto es "ALT" (más tarde veremos como cambiarla).
  • Las segundas combinaciones: Son las segundas teclas que usaremos, por ejemplo, si en la primera combinación se tiene solamente "MODKEY" (ALT) y en la segunda "XK_p", entonces sería básicamente "ALT+p"
  • La variable: Será el nombre que le pusimos en la imagen uno, a los comandos.

Agrego: también notamos que hay una extraña combinación de las "Primeras Combinaciones" en la fila dos, usando el carácter "Barra vertical". Éso se llama You are not allowed to view links. Register or Login, pero vamos a verlo mejor como un carácter para combinar teclas.

Agregando programas y combinaciones de teclas:

En la sección anterior pudimos entender un poco DWM, pero en esta sección aprenderemos a agregar programas con sus respectivas combinaciones de teclas. Comencemos.

Volvemos a las líneas 59-60 y modificamos la línea 59 sólo sí se desea cambiar dmenu por rofi (como fue mi caso). Quedando así:



dmenu cambiado a rofi

Cabe notar que cada vez que agregamos un comando necesitamos seguir la siguiente sintaxis:

Código: C
  1. static const char *<nombre de la variable>[] = { "<programa>", NULL };
  2. // o
  3. static const char *<nombre de la variable>[] = { "<programa>", "<parámetro 3>", "<parámetro 2>", NULL };

Nota #1: Los signos '<' (menor qué) y '>' (mayor qué) no los usen, simplemente estoy indicando qué es lo que tienen que remplazar.
Nota #2: Los parámetros del programa pueden ser tantos como éste los requiera y deben ir separados por una ',' (coma) y entrecomillados.
Nota #3: Se debe colocar 'You are not allowed to view links. Register or Login' al final de la You are not allowed to view links. Register or Login para indicar la finalización del array de caracteres.

Otra cosa, es modificar la You are not allowed to view links. Register or Login a ejecutar, que en mi caso será "You are not allowed to view links. Register or Login":



URXVT

Compilamos:

Ahora para que nuestra configuración sea efectiva necesitamos copiar 'config.def.h' a 'config.h'. OJO, no es mover, sino copiar en la misma ruta:

Código: Bash
  1. cp -v config.def.h config.h

Antes de compilarlo, abrimos 'config.mk' y modificamos la última línea (la 38, para especificar). Cambiamos el valor de la You are not allowed to view links. Register or Login 'CC', de 'cc' a 'gcc':


CC a GCC

Estamos cambiando el You are not allowed to view links. Register or Login nativo a el You are not allowed to view links. Register or Login para evitar problemas, aunque no es necesariamente cierto lo que dije, ya que puede que compile perfectamente, pero para evitar incongruencias lo cambiamos. También puede que 'cc' sea un You are not allowed to view links. Register or Login a 'gcc', pero ya estas palabras se salen del tema.

Y por último, compilamos con las opciones que hemos hecho:


Código: Bash
  1. sudo make clean install


DWM compilado con éxto

Si no tenemos errores, tenemos compilado y listo para ser usado. Pero ahora falta un proceso más para poder usar DWM. Vamos a denominarlos: Método fácil y Método difícil.

Sobre el método fácil vamos a crear un archivo llamado "You are not allowed to view links. Register or Login" en "$HOME" (nuestra carpeta de usuario) en el cual vamos a insertar el siguiente código:


Código: Bash
  1. exec dwm

Luego de hacer lo anterior, iniciamos las You are not allowed to view links. Register or Logins e iniciando DWM ejecutando:

Código: Bash
  1. startx


Mi DWM con modificaciones :-)

Quiero aclarar que cuando hagan todo esto por primera vez, no verán ningún fondo de pantalla, todo estará en negro, pero daré la explicación de cómo cambiar el fondo de pantalla en la sección 'avanzado'. Y por cierto, también verán una barra que indica los 'tags' de DWM.

Sobre el método "difícil", ya depende de nuestro gestor de sesiones, por suerte la mayoría de gestores los aceptaran (hablo del estándar de freedesktop.org), que en mi caso será You are not allowed to view links. Register or Login. Lo único que debemos hacer es crear un "You are not allowed to view links. Register or Login" que irá ubicado en '/usr/share/xsessions':


Código: Text
  1. [Desktop Entry]
  2. Encoding=UTF-8
  3. Name=Dwm
  4. Comment=Dynamic Window Manager
  5. Exec=dwm-personalized
  6. Icon=dwm.png
  7. Type=XSession

Nota #1: El icono que nos trae el repositorio descargado llamado 'dwm.png'  lo copiamos a '/usr/share/pixmaps'
Nota #2: dwm-personalized es un script que crearemos a continuación.

Antes de iniciar DWM quizá queramos iniciar otras cosas, veamos mi archivo 'dwm-personalized':


Código: Bash
  1. #!/usr/bin/env sh
  2.  
  3. # No quiero la tecnología dpms (Display Power Management System)
  4. xset -dpms
  5. xset s off
  6. xset s noblank
  7.  
  8. # Defino mi fondo de escritorio
  9. nitrogen --set-centered /home/dtxdf/Pictures/BG-Desktop/bonito.jpg
  10.  
  11. # Remplazo el proceso actual por dwm
  12. exec dwm

Yo lo tengo en '/usr/local/bin' que me parece ideal para este tipo de archivos:

Código: Bash
  1. sudo install --mode 755 dwm-personalized /usr/local/bin

Luego de hacer todo eso, al iniciar LightDM podremos cambiar la sesión a DWM para poder iniciarlo.

Combinaciones por defecto:

En esta sección les indicaré algunas combinaciones de teclas por defecto que quizá les sea de utilidad:

  • ALT+j y ALT+k: Desplazarse entre ventanas de izquierda o derecha
  • ALT+h y ALT+l: Aumentar/Disminuir el tamaño de las ventanas. El efecto se puede apreciar entre dos o más ventanas y se le aplica sólo a la ventana master.
  • ALT+SHIFT+q: Salir de DWM
  • ALT+p: Ejecutar dmenu o rofi
  • ALT+b: Mostrar u ocultar la barra de estado de DWM
  • ALT+[1-9]: Moverse entre tags (con [1-9] me refiero a un rango)
  • ALT+SHIFT+[1-9]: Mover la ventana a un tag específico
  • ALT+m: Modo monocle; coloca la ventana actual o master en pantalla completa
  • ALT+t: Modo mosaico
  • ALT+f: Modo flotante; Las vetanas nuevas se superponen como Windows, OS X o un Entorno de Escritorio
  • ALT+[Botón izquierdo del ratón]: Mantener presionado para que haga efecto; mover una ventana con el mouse, ésto coloca el orden en flotante
  • ALT+[Botón derecho del ratón]: Mantener presionado para que haga efecto; redimensionar una ventana
  • ALT+SHIFT+SPACE: Alternará al modo flotante de la ventana actual
  • ALT+SHIFT+c: Cerrar una ventana
  • ALT+SHIFT+d y ALT+SHIFT+i: Mover una ventana a master o stack
  • ALT+TAB: Desplazarse entre últimos tags que se haya indexado
  • ALT+ENTER: Alterna entre master o stack

Hay muchas combinaciones y pueden agregarle muchas más...

Trucos:

xev es una pequeña utilidad para imprimir los eventos de las X. Este programa nos ayudará a saber qué constante asignar a DWM. Manos a la obra:


xev en ejecución

Como se puede apreciar, en el apartado de 'state' podremos ver el código asignado a esa tecla, además de su constante, que en el último caso era 'Alt_L'.

Con este programa podremos saber qué clave asignar sin tener que buscar en los lugares más recónditos de la web o leer una documentación específica del mismo. Aunque una alternativa más rápida es:

Código: Bash
  1. xmodmap -pke



Mis tags

Podremos modificar los nombres de los tags (en la línea 25) a nuestro gusto (como es mi caso), no obstante si no se desea mover con los números del teclado, es mejor modificar el apartado de combinaciones de teclas.

Avanzado:

En esta sección les comparto unos scripts que uso con frecuencia para poder hacer mi vida más fácil, pero antes tengo que compartirles mi archivo de configuración para que puedan entender qué hace qué cosa:

Código: Text
  1. /* See LICENSE file for copyright and license details. */
  2.  
  3. /* appearance */
  4. static const unsigned int borderpx  = 0;        /* border pixel of windows */
  5. static const unsigned int snap      = 32;       /* snap pixel */
  6. static const int showbar            = 0;        /* 0 means no bar */
  7. static const int topbar             = 0;        /* 0 means bottom bar */
  8. static const char *fonts[]          = { "Liberation Mono:size=10" };
  9.  
  10. static const char dmenufont[]       = "Liberation Mono:size=10";
  11.  
  12. static const char col_gray1[]       = "#222222";
  13. static const char col_gray2[]       = "#444444";
  14. static const char col_gray3[]       = "#bbbbbb";
  15. static const char col_gray4[]       = "#eeeeee";
  16. static const char col_cyan[]        = "#005577";
  17.  
  18. static const char *colors[][3]      = {
  19.    /*               fg         bg         border   */
  20.    [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
  21.    [SchemeSel]  = { col_gray4, col_cyan,  col_cyan  },
  22. };
  23.  
  24. /* tagging */
  25. static const char *tags[] = { "UXVT", "Firefox", "Documentación" };
  26.  
  27. static const Rule rules[] = {
  28.    /* xprop(1):
  29.     *   WM_CLASS(STRING) = instance, class
  30.     *   WM_NAME(STRING) = title
  31.     */
  32.    /* class      instance    title       tags mask     isfloating   monitor */
  33.    { NULL,     NULL,       NULL,       0,            0,           -1 }
  34. };
  35.  
  36. /* layout(s) */
  37. static const float mfact     = 0.55; /* factor of master area size [0.05..0.95] */
  38. static const int nmaster     = 1;    /* number of clients in master area */
  39. static const int resizehints = 1;    /* 1 means respect size hints in tiled resizals */
  40.  
  41. static const Layout layouts[] = {
  42.    /* symbol     arrange function */
  43.    { "[]=",      tile },    /* first entry is default */
  44.    { "><>",      NULL },    /* no layout function means floating behavior */
  45.    { "[M]",      monocle },
  46. };
  47.  
  48. /* key definitions */
  49. #define MODKEY Mod1Mask
  50. #define TAGKEYS(KEY,TAG) \
  51.    { MODKEY,                       KEY,      view,           {.ui = 1 << TAG} }, \
  52.    { MODKEY|ControlMask,           KEY,      toggleview,     {.ui = 1 << TAG} }, \
  53.    { MODKEY|ShiftMask,             KEY,      tag,            {.ui = 1 << TAG} }, \
  54.    { MODKEY|ControlMask|ShiftMask, KEY,      toggletag,      {.ui = 1 << TAG} },
  55.  
  56. /* helper for spawning shell commands in the pre dwm-5.0 fashion */
  57. #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
  58.  
  59. /* commands */
  60. static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
  61. //static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
  62. static const char *dmenucmd[] = { "rofi", "-show", "run", NULL };
  63. static const char *termcmd[]  = { "urxvt", NULL };
  64. static const char *firefox[] = { "firefox", NULL };
  65. static const char *shutdown[] = { "power-script", "1", NULL }; // APAGAR
  66. static const char *reboot[] = { "power-script", "2", NULL }; // REINICIAR
  67. static const char *cancel[] = { "power-script", "3", NULL }; // CANCELAR
  68. static const char *sessions[] = { "select-session", NULL }; // SELECCIONAR UNA SESIÓN DE TMUX
  69. static const char *bam_connect[] = { "bam-connect", NULL }; // Para conectar el bam
  70. static const char *bam_disconnect[] = { "bam-disconnect", NULL }; // Para desconectar el bam
  71. static const char *screenshot[] = { "scrot-script", "mtpaint", NULL }; // Tomar una captura de pantalla
  72.  
  73. static Key keys[] = {
  74.    /* modifier                     key        function        argument */
  75.    { MODKEY,                       XK_Print,         spawn,          {.v = screenshot} },
  76.    { MODKEY,                       XK_p,      spawn,          {.v = dmenucmd} },
  77.    { MODKEY|ShiftMask,             XK_t,      spawn,          {.v = termcmd} },
  78.    { MODKEY,                      XK_F1,     spawn,          {.v = firefox} },
  79.    { MODKEY|ShiftMask,             XK_s,      spawn,          {.v = shutdown} },
  80.    { MODKEY|ShiftMask,             XK_r,      spawn,          {.v = reboot} },
  81.    { MODKEY|ShiftMask,             XK_k,      spawn,          {.v = cancel} },
  82.    { MODKEY,                       XK_s,      spawn,          {.v = sessions} },
  83.    { MODKEY,                       XK_q,      spawn,          {.v = bam_connect} },
  84.    { MODKEY,                       XK_w,      spawn,          {.v = bam_disconnect} },
  85.    { MODKEY,                       XK_b,      togglebar,      {0} },
  86.    { MODKEY,                       XK_j,      focusstack,     {.i = +1 } },
  87.    { MODKEY,                       XK_k,      focusstack,     {.i = -1 } },
  88.    { MODKEY,                       XK_i,      incnmaster,     {.i = +1 } },
  89.    { MODKEY,                       XK_d,      incnmaster,     {.i = -1 } },
  90.    { MODKEY,                       XK_h,      setmfact,       {.f = -0.05} },
  91.    { MODKEY,                       XK_l,      setmfact,       {.f = +0.05} },
  92.    { MODKEY,                       XK_Return, zoom,           {0} },
  93.    { MODKEY,                       XK_Tab,    view,           {0} },
  94.    { MODKEY|ShiftMask,             XK_c,      killclient,     {0} },
  95.    { MODKEY,                       XK_t,      setlayout,      {.v = &layouts[0]} },
  96.    { MODKEY,                       XK_f,      setlayout,      {.v = &layouts[1]} },
  97.    { MODKEY,                       XK_m,      setlayout,      {.v = &layouts[2]} },
  98.    { MODKEY,                       XK_space,  setlayout,      {0} },
  99.    { MODKEY|ShiftMask,             XK_space,  togglefloating, {0} },
  100.    { MODKEY,                       XK_0,      view,           {.ui = ~0 } },
  101.    { MODKEY|ShiftMask,             XK_0,      tag,            {.ui = ~0 } },
  102.    { MODKEY,                       XK_comma,  focusmon,       {.i = -1 } },
  103.    { MODKEY,                       XK_period, focusmon,       {.i = +1 } },
  104.    { MODKEY|ShiftMask,             XK_comma,  tagmon,         {.i = -1 } },
  105.    { MODKEY|ShiftMask,             XK_period, tagmon,         {.i = +1 } },
  106.    TAGKEYS(                        XK_1,                      0)
  107.    TAGKEYS(                        XK_2,                      1)
  108.    TAGKEYS(                        XK_3,                      2)
  109.    TAGKEYS(                        XK_4,                      3)
  110.    TAGKEYS(                        XK_5,                      4)
  111.    TAGKEYS(                        XK_6,                      5)
  112.    TAGKEYS(                        XK_7,                      6)
  113.    TAGKEYS(                        XK_8,                      7)
  114.    TAGKEYS(                        XK_9,                      <img src="https://underc0de.org/foro/Smileys/default/cool.gif" alt="8&#41;" title="Cool" class="smiley" />
  115.    { MODKEY|ShiftMask,             XK_q,      quit,           {0} },
  116. };
  117.  
  118. /* button definitions */
  119. /* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
  120. static Button buttons[] = {
  121.    /* click                event mask      button          function        argument */
  122.    { ClkLtSymbol,          0,              Button1,        setlayout,      {0} },
  123.    { ClkLtSymbol,          0,              Button3,        setlayout,      {.v = &layouts[2]} },
  124.    { ClkWinTitle,          0,              Button2,        zoom,           {0} },
  125.    { ClkStatusText,        0,              Button2,        spawn,          {.v = termcmd } },
  126.    { ClkClientWin,         MODKEY,         Button1,        movemouse,      {0} },
  127.    { ClkClientWin,         MODKEY,         Button2,        togglefloating, {0} },
  128.    { ClkClientWin,         MODKEY,         Button3,        resizemouse,    {0} },
  129.    { ClkTagBar,            0,              Button1,        view,           {0} },
  130.    { ClkTagBar,            0,              Button3,        toggleview,     {0} },
  131.    { ClkTagBar,            MODKEY,         Button1,        tag,            {0} },
  132.    { ClkTagBar,            MODKEY,         Button3,        toggletag,      {0} },
  133. };

scrot-script

Dependencias: scrot zenity <programa extra para abrir la imagen> (en mi caso mtpaint)
Descripción: Tomar una captura de pantalla

Código: Bash
  1. #!/usr/bin/env sh
  2.  
  3. declare PROGRAM=$1
  4. declare FILE_NAME=/tmp/scrot.png
  5.  
  6. if [ ${#*} -lt 1 ];then
  7.     zenity --error --text="Debes seleccionar un programa para que interactúe con la captura de pantalla." --no-wrap
  8.     exit 1
  9.  
  10. fi
  11.  
  12. if [ -z "$(which $PROGRAM)" ];then
  13.     zenity --error --text="Ha ocurrido un error, \"$PROGRAM\" no existe" --no-wrap
  14.     exit 2
  15.  
  16. fi
  17.  
  18. rm -f "$FILE_NAME";scrot -s "$FILE_NAME" && command "$PROGRAM" "$FILE_NAME"

bam-connect

Dependencias: wvdial
Descripción: Conectar a Internet utilizando el bam

Código: Bash
  1. #!/usr/bin/env sh
  2.  
  3. sudo wvdial

bam-disconnect

Dependencias: wvdial
Descripción: Enviar una señal SIGTERM a wvdial para apagar la conexión con el bam

Código: Bash
  1. #!/usr/bin/env sh
  2.  
  3. sudo killall wvdial

select-session

Dependencias: tmux zenity urxvt
Descripción: Permite seleccionar una sesión de tmux que esté oculta y en ejecución.

Código: Bash
  1. #!/usr/bin/env bash
  2.  
  3. declare -x aux
  4. declare -x aux_sessions
  5. declare -x session_name
  6. declare -x session_info
  7. declare -x execute
  8. declare -x val
  9. let n=0
  10.  
  11. IFS_BAK=$IFS
  12. IFS="
  13. "
  14.  
  15. show_sessions() {
  16.    for i in $(tmux ls);do
  17.       echo -n "$i;"
  18.  
  19.    done
  20.  
  21. }
  22.  
  23. tmux ls > /dev/null 2> /dev/null
  24.  
  25. if [ $? -eq 1 ];then
  26.    zenity --text="Por ahora no tiene sesiones en tmux Sr. DtxdF :3" --no-wrap --info
  27.    exit 1
  28.  
  29. fi
  30.  
  31. aux_sessions=$(show_sessions)
  32. execute='zenity --list --column="Session" --column="Information" --title="Seleccione una sesión Sr. DtxdF"'
  33.  
  34. while [ true ];do
  35.    let n+=1
  36.  
  37.    aux=$(echo $aux_sessions | cut -d ";" -f $n)
  38.  
  39.    if [ -z "$aux" ];then
  40.       break
  41.  
  42.    fi
  43.  
  44.    session_name=$(echo $aux | cut -d ":" -f 1)
  45.    session_info=$(echo $aux | cut -d ":" -f 2 | sed "s/^ //")
  46.    
  47.    execute="$execute \"$session_name\" \"$session_info\""
  48.  
  49. done
  50.  
  51. IFS=$IFS_BAK
  52. val=$(sh -c "$execute")
  53.  
  54. if [ $? -eq 0 ];then
  55.    urxvt -e sh -c "tmux attach -t \"$val\""
  56.  
  57. fi

power-script

Dependencias: zenity
Descripción: Permite apagar, reiniciar el equipo, aunque también podría cancelar las operaciones antes mencionadas.

Código: Bash
  1. #!/usr/bin/env bash
  2.  
  3. let option=$1 2> /dev/null
  4. let timeout=10
  5. let timetoshut=10
  6. declare -x cancelfile="/tmp/noshut"
  7.  
  8. write_error_msg() {
  9.    zenity --text="$1" --error --no-wrap
  10.  
  11. }
  12.  
  13. check_noshut() {
  14.    if [ -f "$cancelfile" ];then
  15.       rm -f "$cancelfile"
  16.       exit 0
  17.  
  18.    fi
  19.  
  20. }
  21.  
  22. if [ "$option" -eq 0 ];then
  23.    write_error_msg "¡Debes escribir una opción!"
  24.    exit 1
  25.  
  26. fi
  27.  
  28. if [ "$option" -eq 1 ];then
  29.    zenity --warning --text="Su equipo se apagará dentro de $timetoshut segundo(s) Sr. DtxdF, por favor sea paciente" --timeout=$timeout --no-wrap
  30.    sleep $timetoshut
  31.    check_noshut
  32.    poweroff
  33.  
  34. elif [ "$option" -eq 2 ];then
  35.    zenity --warning --text="Su equipo se reiniciará dentro de $timetoshut segundo(s) Sr. DtxdF, por favor sea paciente" --timeout=$timeout --no-wrap
  36.    sleep $timetoshut
  37.    check_noshut
  38.    reboot
  39.  
  40. elif [ "$option" -eq 3 ];then
  41.    touch $cancelfile
  42.    zenity --info --text="El equipo no se apagará Sr. DtxdF, no se preocupe ;-)" --timeout=$timeout --no-wrap
  43.  
  44. else
  45.    write_error_msg "¡Opción no encontrada!"
  46.    exit 3
  47.  
  48.  
  49. fi
  50.  
  51. exit 0

simple-nmap-script

Dependencias: nmap zenity
Descripción: Escanea la red en busca de objetivos vivos
Estado: Próximamente...

wifi-scan-script

Estado: Próximamente...

Notas:

Para cambiar el tema por defecto de 'rofi', tendremos que ejecutar:

Código: Bash
  1. rofi-theme-selector

Se nos abrirá una ventana:


rofi-theme-selector

Presionamos ENTER para seleccionar un tema; ALT+A para ajustarlo como predeterminado; con ESC salimos y hasta podemos hacer una búsqueda de un tema por su nombre.


Si eres como yo y utiliza un Bam para comunicarse con el mundo exterior te recuerdo que hay un You are not allowed to view links. Register or Login para usar como alternativa a wvdial. Otra cosa, es que necesitamos agregar lo siguiente a el fichero sudoers para que no sea necesario requerir contraseña al conectarse al Modem USB:

Código: Text
  1. Host_Alias SRV_DTXDF = localhost, dtxdf # Nombre del host de la máquina
  2.  
  3. User_Alias USR_DTXDF = dtxdf # Nombre de usuario, en mi caso es 'dtxdf'
  4.  
  5. Cmnd_Alias WVDIAL       = /usr/bin/wvdial
  6. Cmnd_Alias KILL_WVDIAL  = /usr/bin/killall wvdial
  7.  
  8. # Permitimos que se ejecute sudo sin contraseña a wvidlal y 'killall wvdial'
  9. USR_DTXDF SRV_DTXDF = NOPASSWD:WVDIAL
  10. USR_DTXDF SRV_DTXDF = NOPASSWD:KILL_WVDIAL


Si se desea cambiar la "clave modificadora" (ALT, por defecto) en DWM, se tiene que modificar 'config.def.h' (que luego será pasado a config.h), tendremos que irnos a la línea 47 y cambiar la constante simbólica 'MODKEY' con su valor 'Mod1Mask' por 'Mod4Mask', por ejemplo, sería asignar la tecla de Windows.

Podemos hacerlo con tantas teclas nos permita en 'xmodmap':


Código: Bash
  1. xmodmap



La razón por la que tengamos que copiar 'config.def.h' a 'config.h' es porque la comunidad de DWM realiza parches para mejorar mucho más la experiencia de éste, entonces si se modifica 'config.def.h' en vez de 'config.h', no estaríamos sobreescribiendo la configuración que le hayamos hecho.


En LightDM tuve que configurar algún par de cosas para que funcionara perfectamente, lo comentaré aquí por si a alguien le pasa:

En la sección de LightDM '[Seat:*]', descomentaremos 'session-wrapper' para que cargue el archivo Xsession; en la sección '[LightDM]' descomentaremos y nos aseguraremos de que las rutas que se colocan ahí sean correctas y existan, ya que permitirá leer los Archivos de Entrada de Escritorio.

Espero que a alguien le sirva ;)


Si se desean más temas para rofi, pueden ir al siguiente repositorio: You are not allowed to view links. Register or Login


Conclusión:


~ DtxdF
« Última modificación: Abril 24, 2020, 01:15:38 pm por DtxdF »
Los seres humanos son robots, cuyo combustible es el afanado dinero.

Conectado Kirari

  • *
  • Colaborador
  • *
  • Mensajes: 144
  • Actividad:
    100%
  • Country: 00
  • Reputación 9
  • No dejes que el mundo te corrompa
    • Ver Perfil
    • Baúl para el público

Re:DWM: ¡Un Window Manager de apenas 2149 líneas!

  • en: Abril 24, 2020, 02:21:33 pm
Excelente post amigo  ;D

Muy interesante el WM  :D :D

Saludos!
-Kirari
« Última modificación: Abril 24, 2020, 02:49:05 pm por Kirari »
Jamás te contarán la verdadera versión, siempre te dirán la suya... Por eso... Si quieres saber la verdad, debes buscarla tú mismo...

Desconectado MSTR-KR

  • *
  • Underc0der
  • Mensajes: 8
  • Actividad:
    23.33%
  • Country: 00
  • Reputación 0
    • Ver Perfil

Re:DWM: ¡Un Window Manager de apenas 2149 líneas!

  • en: Abril 28, 2020, 10:25:38 pm
Excelente post, parce gracias por compartir su conocimiento, estare esperando mas tutos de arch jejejejejejeje

Me sirvio artisimo que viva arch!
« Última modificación: Abril 28, 2020, 10:36:17 pm por MSTR-KR »

Conectado DtxdF

  • *
  • Moderador Global
  • Mensajes: 687
  • Actividad:
    100%
  • Reputación 16
  • Eres un auto y tienes dos opciones: Parar o Seguir
    • Ver Perfil
    • Mi repositorio de Github donde encontraras herramientas para tu trabajo.
    • Email

Re:DWM: ¡Un Window Manager de apenas 2149 líneas!

  • en: Abril 28, 2020, 11:08:03 pm
Un placer @MSTR-KR , con gusto vendrán más  ;)

~ DtxdF
Los seres humanos son robots, cuyo combustible es el afanado dinero.