static-httpd

Sitio web estático (HTML + CSS) que sostiene el blog del autor
Log | Files | Refs

index.html (21315B)


      1 <!DOCTYPE html>
      2 <html>
      3 <head>
      4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      5 <meta name="viewport" content="width=device-width, initial-scale=1" />
      6 <title>Configuración propia del bloqueador de pantalla slock</title>
      7 <link rel="icon" type="image/png" href="/favicon.png" />
      8 <link rel="stylesheet" type="text/css" href="../article.css" />
      9 </head>
     10 <body>
     11 <header>
     12 <p class="title">Configuración propia del bloqueador de pantalla slock</p>
     13 <p class="date">22 de junio de 2026 • fjbalon</p>
     14 </header>
     15 <p>Un software que me gusta bastante de la caja de herramientas de suckless es slock, un bloqueador de pantalla minimalista; tan minimalista que yo creo que es el bloqueador de pantalla x más sencillo que existe. Una vez ejecutado, bloquea la sesión y solo se desbloquea al introducir la contraseña del usuario. No es un programa innovador ni de nicho: el concepto de bloqueador de pantalla existe prácticamente desde los inicios de X11.</p>
     16 <p>Puede encontrar mi propia versión del código en mi servidor de git: <a href="https://templier.es/git/slock/">/git/slock/</a>.</p>
     17 <p>En términos generales, slock crea una ventana fullscreen que cubre todos los monitores, toma el teclado y el ratón (<emb>XGrabKeyboard</emb> + <emb>XGrabPointer</emb>) y entra en bucle donde lee la entrada del teclado. Compara la contraseña introducida (usando <emb>crypt()</emb> o <emb>PAM/shadow</emb>) contra la del usuario. Si coincide, suelta el grab y cierra la ventana.</p>
     18 <p>Por su funcionamiento, radicalmente mínimo y unido al sistema operativo, podemos verlo como un sistema muy seguro. Eso sí, cuenta con las limitaciones propias de todos los bloqueadores de pantalla de X11, como que el usuario puede cambiar a otra tty, otro usuario o sesión podría matar X y cosas así. No son errores, ni si quiera problemas de seguridad, pues la sesión se mantendría protegida aun matándola o cambiando de tty; pero son limitaciones que el usuario debe conocer, desde luego.</p>
     19 <p>La estética inicial es tan sobria como un par de colores que indican si el usuario ha empezado a escribir la contraseña (azul), si ha fallado al introducirla (rojo) o si ha accedido (no hay color, entra en la sesión con normalidad). Si bien esta forma visual es extremadamente vaga, para mi gusto.</p>
     20 <p>Por lo tanto, lo que más estético me ha parecido es aplicar el llamado parche <i>Blured or pixelated screenshot</i>:</p>
     21 
     22 <pre><code class="diff"><span class="info">diff --git a/config.mk b/config.mk</span>
     23 <span class="info">index 74429ae..987819e 100644</span>
     24 <span class="info">--- a/config.mk</span>
     25 <span class="info">+++ b/config.mk</span>
     26 <span class="hunk">@@ -12,7 +12,7 @@ X11LIB = /usr/X11R6/lib</span>
     27  
     28  # includes and libs
     29  INCS = -I. -I/usr/include -I${X11INC}
     30 <span class="del">-LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr</span>
     31 <span class="add">+LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lImlib2</span>
     32  
     33  # flags
     34  CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H
     35 <span class="info">diff --git a/slock.c b/slock.c</span>
     36 <span class="info">index 5ae738c..7c63f34 100644</span>
     37 <span class="info">--- a/slock.c</span>
     38 <span class="info">+++ b/slock.c</span>
     39 <span class="hunk">@@ -18,6 +18,7 @@</span>
     40  #include &lt;X11/keysym.h&gt;
     41  #include &lt;X11/Xlib.h&gt;
     42  #include &lt;X11/Xutil.h&gt;
     43 <span class="add">+#include &lt;Imlib2.h&gt;</span>
     44  
     45  #include "arg.h"
     46  #include "util.h"
     47 <span class="hunk">@@ -35,6 +36,7 @@ struct lock {</span>
     48      int screen;
     49      Window root, win;
     50      Pixmap pmap;
     51 <span class="add">+    Pixmap bgmap;</span>
     52      unsigned long colors[NUMCOLS];
     53  };
     54  
     55 <span class="hunk">@@ -46,6 +48,8 @@ struct xrandr {</span>
     56  
     57  #include "config.h"
     58  
     59 <span class="add">+Imlib_Image image;</span>
     60 <span class="add">+</span>
     61  static void
     62  die(const char *errstr, ...)
     63  {
     64 <span class="hunk">@@ -190,9 +194,10 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,</span>
     65              color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT);
     66              if (running &amp;&amp; oldc != color) {
     67                  for (screen = 0; screen &lt; nscreens; screen++) {
     68 <span class="del">-                    XSetWindowBackground(dpy,</span>
     69 <span class="del">-                                         locks[screen]-&gt;win,</span>
     70 <span class="del">-                                         locks[screen]-&gt;colors[color]);</span>
     71 <span class="add">+                    if(locks[screen]-&gt;bgmap)</span>
     72 <span class="add">+                        XSetWindowBackgroundPixmap(dpy, locks[screen]-&gt;win, locks[screen]-&gt;bgmap);</span>
     73 <span class="add">+                    else</span>
     74 <span class="add">+                        XSetWindowBackground(dpy, locks[screen]-&gt;win, locks[screen]-&gt;colors[0]);</span>
     75                      XClearWindow(dpy, locks[screen]-&gt;win);
     76                  }
     77                  oldc = color;
     78 <span class="hunk">@@ -235,6 +240,17 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)</span>
     79      lock-&gt;screen = screen;
     80      lock-&gt;root = RootWindow(dpy, lock-&gt;screen);
     81  
     82 <span class="add">+    if(image) </span>
     83 <span class="add">+    {</span>
     84 <span class="add">+        lock-&gt;bgmap = XCreatePixmap(dpy, lock-&gt;root, DisplayWidth(dpy, lock-&gt;screen), DisplayHeight(dpy, lock-&gt;screen), DefaultDepth(dpy, lock-&gt;screen));</span>
     85 <span class="add">+        imlib_context_set_image(image);</span>
     86 <span class="add">+        imlib_context_set_display(dpy);</span>
     87 <span class="add">+        imlib_context_set_visual(DefaultVisual(dpy, lock-&gt;screen));</span>
     88 <span class="add">+        imlib_context_set_colormap(DefaultColormap(dpy, lock-&gt;screen));</span>
     89 <span class="add">+        imlib_context_set_drawable(lock-&gt;bgmap);</span>
     90 <span class="add">+        imlib_render_image_on_drawable(0, 0);</span>
     91 <span class="add">+        imlib_free_image();</span>
     92 <span class="add">+    }</span>
     93      for (i = 0; i &lt; NUMCOLS; i++) {
     94          XAllocNamedColor(dpy, DefaultColormap(dpy, lock-&gt;screen),
     95                           colorname[i], &amp;color, &amp;dummy);
     96 <span class="hunk">@@ -251,6 +267,8 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)</span>
     97                                CopyFromParent,
     98                                DefaultVisual(dpy, lock-&gt;screen),
     99                                CWOverrideRedirect | CWBackPixel, &amp;wa);
    100 <span class="add">+    if(lock-&gt;bgmap)</span>
    101 <span class="add">+        XSetWindowBackgroundPixmap(dpy, lock-&gt;win, lock-&gt;bgmap);</span>
    102      lock-&gt;pmap = XCreateBitmapFromData(dpy, lock-&gt;win, curs, 8, 8);
    103      invisible = XCreatePixmapCursor(dpy, lock-&gt;pmap, lock-&gt;pmap,
    104                                      &amp;color, &amp;color, 0, 0);
    105 <span class="hunk">@@ -354,7 +372,16 @@ main(int argc, char **argv) {</span>
    106          die("slock: setgid: %s\n", strerror(errno));
    107      if (setuid(duid) &lt; 0)
    108          die("slock: setuid: %s\n", strerror(errno));
    109 <span class="del">-</span>
    110 <span class="add">+        </span>
    111 <span class="add">+    /*Create screenshot Image*/</span>
    112 <span class="add">+    Screen *scr = ScreenOfDisplay(dpy, DefaultScreen(dpy));</span>
    113 <span class="add">+    image = imlib_create_image(scr-&gt;width,scr-&gt;height);</span>
    114 <span class="add">+    imlib_context_set_image(image);</span>
    115 <span class="add">+    imlib_context_set_display(dpy);</span>
    116 <span class="add">+    imlib_context_set_visual(DefaultVisual(dpy,0));</span>
    117 <span class="add">+    imlib_context_set_drawable(RootWindow(dpy,XScreenNumberOfScreen(scr)));    </span>
    118 <span class="add">+    imlib_copy_drawable_to_image(0,0,0,scr-&gt;width,scr-&gt;height,0,0,1);</span>
    119 <span class="add">+    </span>
    120      /* check for Xrandr support */
    121      rr.active = XRRQueryExtension(dpy, &amp;rr.evbase, &amp;rr.errbase);</code></pre>
    122 
    123 <pre><code class="diff"><span class="info">diff --git a/config.h b/config.h</span>
    124 <span class="info">index c8e52d6..fcc1b39 100644</span>
    125 <span class="info">--- a/config.h</span>
    126 <span class="info">+++ b/config.h</span>
    127 <span class="hunk">@@ -10,3 +10,6 @@ static const char *colorname[NUMCOLS] = {</span>
    128  
    129  /* treat a cleared input like a wrong password (color) */
    130  static const int failonclear = 1;
    131 <span class="add">+</span>
    132 <span class="add">+/*Set Blur radius*/</span>
    133 <span class="add">+static const int blurRadius=5;</span>
    134 \ No newline at end of file
    135 <span class="info">diff --git a/slock.c b/slock.c</span>
    136 <span class="info">index 7c63f34..0f24cd7 100644</span>
    137 <span class="info">--- a/slock.c</span>
    138 <span class="info">+++ b/slock.c</span>
    139 <span class="hunk">@@ -372,7 +372,7 @@ main(int argc, char **argv) {</span>
    140          die("slock: setgid: %s\n", strerror(errno));
    141      if (setuid(duid) &lt; 0)
    142          die("slock: setuid: %s\n", strerror(errno));
    143 <span class="del">-        </span>
    144 <span class="add">+</span>
    145      /*Create screenshot Image*/
    146      Screen *scr = ScreenOfDisplay(dpy, DefaultScreen(dpy));
    147      image = imlib_create_image(scr-&gt;width,scr-&gt;height);
    148 <span class="hunk">@@ -381,6 +381,7 @@ main(int argc, char **argv) {</span>
    149      imlib_context_set_visual(DefaultVisual(dpy,0));
    150      imlib_context_set_drawable(RootWindow(dpy,XScreenNumberOfScreen(scr)));    
    151      imlib_copy_drawable_to_image(0,0,0,scr-&gt;width,scr-&gt;height,0,0,1);
    152 <span class="add">+    imlib_image_blur(blurRadius);</span>
    153      
    154      /* check for Xrandr support */
    155      rr.active = XRRQueryExtension(dpy, &amp;rr.evbase, &amp;rr.errbase);</code></pre>
    156 
    157 <pre><code class="diff"><span class="info">diff --git a/config.h b/config.h</span>
    158 <span class="info">index fcc1b39..1c1aef3 100644</span>
    159 <span class="info">--- a/config.h</span>
    160 <span class="info">+++ b/config.h</span>
    161 <span class="hunk">@@ -12,4 +12,5 @@ static const char *colorname[NUMCOLS] = {</span>
    162  static const int failonclear = 1;
    163  
    164  /*Set Blur radius*/
    165 <span class="del">-static const int blurRadius=5;</span>
    166 \ No newline at end of file
    167 <span class="add">+static const int blurRadius=0;</span>
    168 <span class="add">+static const int pixelSize=5;</span>
    169 <span class="info">diff --git a/slock.c b/slock.c</span>
    170 <span class="info">index 0f24cd7..33ca569 100644</span>
    171 <span class="info">--- a/slock.c</span>
    172 <span class="info">+++ b/slock.c</span>
    173 <span class="hunk">@@ -381,7 +381,49 @@ main(int argc, char **argv) {</span>
    174      imlib_context_set_visual(DefaultVisual(dpy,0));
    175      imlib_context_set_drawable(RootWindow(dpy,XScreenNumberOfScreen(scr)));    
    176      imlib_copy_drawable_to_image(0,0,0,scr-&gt;width,scr-&gt;height,0,0,1);
    177 <span class="add">+    </span>
    178 <span class="add">+    /*Blur function*/</span>
    179      imlib_image_blur(blurRadius);
    180 <span class="add">+</span>
    181 <span class="add">+</span>
    182 <span class="add">+    /*Pixelation*/</span>
    183 <span class="add">+    int width = scr-&gt;width;</span>
    184 <span class="add">+    int height = scr-&gt;height;</span>
    185 <span class="add">+    </span>
    186 <span class="add">+    for(int y = 0; y &lt; height; y += pixelSize)</span>
    187 <span class="add">+    {</span>
    188 <span class="add">+        for(int x = 0; x &lt; width; x += pixelSize)</span>
    189 <span class="add">+        {</span>
    190 <span class="add">+            int red = 0;</span>
    191 <span class="add">+            int green = 0;</span>
    192 <span class="add">+            int blue = 0;</span>
    193 <span class="add">+</span>
    194 <span class="add">+            Imlib_Color pixel; </span>
    195 <span class="add">+            Imlib_Color* pp;</span>
    196 <span class="add">+            pp = &amp;pixel;</span>
    197 <span class="add">+            for(int j = 0; j &lt; pixelSize &amp;&amp; j &lt; height; j++)</span>
    198 <span class="add">+            {</span>
    199 <span class="add">+                for(int i = 0; i &lt; pixelSize &amp;&amp; i &lt; width; i++)</span>
    200 <span class="add">+                {</span>
    201 <span class="add">+                    imlib_image_query_pixel(x+i,y+j,pp);</span>
    202 <span class="add">+                    red += pixel.red;</span>
    203 <span class="add">+                    green += pixel.green;</span>
    204 <span class="add">+                    blue += pixel.blue;</span>
    205 <span class="add">+                }</span>
    206 <span class="add">+            }</span>
    207 <span class="add">+            red /= (pixelSize*pixelSize);</span>
    208 <span class="add">+            green /= (pixelSize*pixelSize);</span>
    209 <span class="add">+            blue /= (pixelSize*pixelSize);</span>
    210 <span class="add">+            printf("R/G/B: %i/%i/%i\n",red,green,blue);</span>
    211 <span class="add">+            imlib_context_set_color(red,green,blue,pixel.alpha);</span>
    212 <span class="add">+            imlib_image_fill_rectangle(x,y,pixelSize,pixelSize);</span>
    213 <span class="add">+            red = 0;</span>
    214 <span class="add">+            green = 0;</span>
    215 <span class="add">+            blue = 0;</span>
    216 <span class="add">+        }</span>
    217 <span class="add">+    }</span>
    218 <span class="add">+    </span>
    219 <span class="add">+    </span>
    220      
    221      /* check for Xrandr support */
    222      rr.active = XRRQueryExtension(dpy, &amp;rr.evbase, &amp;rr.errbase);</code></pre>
    223 
    224 <pre><code class="diff"><span class="info">diff --git a/slock.c b/slock.c</span>
    225 <span class="info">index 33ca569..f54c459 100644</span>
    226 <span class="info">--- a/slock.c</span>
    227 <span class="info">+++ b/slock.c</span>
    228 <span class="hunk">@@ -414,7 +414,6 @@ main(int argc, char **argv) {</span>
    229              red /= (pixelSize*pixelSize);
    230              green /= (pixelSize*pixelSize);
    231              blue /= (pixelSize*pixelSize);
    232 <span class="del">-            printf("R/G/B: %i/%i/%i\n",red,green,blue);</span>
    233              imlib_context_set_color(red,green,blue,pixel.alpha);
    234              imlib_image_fill_rectangle(x,y,pixelSize,pixelSize);
    235              red = 0;</code></pre>
    236 
    237 <pre><code class="diff"><span class="info">diff --git a/config.mk b/config.mk</span>
    238 <span class="info">index 987819e..d0c2f01 100644</span>
    239 <span class="info">--- a/config.mk</span>
    240 <span class="info">+++ b/config.mk</span>
    241 <span class="hunk">@@ -16,7 +16,7 @@ LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr -lImlib2</span>
    242  
    243  # flags
    244  CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H
    245 <span class="del">-CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}</span>
    246 <span class="add">+CFLAGS = -std=c99 -pedantic -Wall -Ofast ${INCS} ${CPPFLAGS}</span>
    247  LDFLAGS = -s ${LIBS}
    248  COMPATSRC = explicit_bzero.c</code></pre>
    249 
    250 <pre><code class="diff"><span class="info">diff --git a/config.h b/config.h</span>
    251 <span class="info">index 1c1aef3..5407953 100644</span>
    252 <span class="info">--- a/config.h</span>
    253 <span class="info">+++ b/config.h</span>
    254 <span class="hunk">@@ -11,6 +11,11 @@ static const char *colorname[NUMCOLS] = {</span>
    255  /* treat a cleared input like a wrong password (color) */
    256  static const int failonclear = 1;
    257  
    258 <span class="del">-/*Set Blur radius*/</span>
    259 <span class="del">-static const int blurRadius=0;</span>
    260 <span class="del">-static const int pixelSize=5;</span>
    261 <span class="add">+/*Enable blur*/</span>
    262 <span class="add">+#define BLUR</span>
    263 <span class="add">+/*Set blur radius*/</span>
    264 <span class="add">+static const int blurRadius=5;</span>
    265 <span class="add">+/*Enable Pixelation*/</span>
    266 <span class="add">+//#define PIXELATION</span>
    267 <span class="add">+/*Set pixelation radius*/</span>
    268 <span class="add">+static const int pixelSize=0;</span>
    269 <span class="info">diff --git a/slock.c b/slock.c</span>
    270 <span class="info">index f54c459..1a4d6e3 100644</span>
    271 <span class="info">--- a/slock.c</span>
    272 <span class="info">+++ b/slock.c</span>
    273 <span class="hunk">@@ -381,11 +381,14 @@ main(int argc, char **argv) {</span>
    274      imlib_context_set_visual(DefaultVisual(dpy,0));
    275      imlib_context_set_drawable(RootWindow(dpy,XScreenNumberOfScreen(scr)));    
    276      imlib_copy_drawable_to_image(0,0,0,scr-&gt;width,scr-&gt;height,0,0,1);
    277 <span class="del">-    </span>
    278 <span class="add">+</span>
    279 <span class="add">+#ifdef BLUR</span>
    280 <span class="add">+</span>
    281      /*Blur function*/
    282      imlib_image_blur(blurRadius);
    283 <span class="add">+#endif // BLUR    </span>
    284  
    285 <span class="del">-</span>
    286 <span class="add">+#ifdef PIXELATION</span>
    287      /*Pixelation*/
    288      int width = scr-&gt;width;
    289      int height = scr-&gt;height;
    290 <span class="hunk">@@ -423,7 +426,7 @@ main(int argc, char **argv) {</span>
    291      }
    292      
    293      
    294 <span class="del">-    </span>
    295 <span class="add">+#endif</span>
    296      /* check for Xrandr support */
    297      rr.active = XRRQueryExtension(dpy, &amp;rr.evbase, &amp;rr.errbase);</code></pre>
    298 <p>De tal forma que, una vez aplicados los cambios de software, al ser ejecutado captura la pantalla completa usando <emb>imlib2</emb> (<emb>imlib_copy_drawable_to_image</emb> desde <emb>RootWindow</emb>), aplica desenfoque directamente sobre es imagen en memoria con <emb>imlib_image_blur(blurRadius)</emb> y la convierte en un Pixmap, que pone como fondo de ventana de bloqueo con <emb>XSetWindowBackgroundPixmap</emb>.</p>
    299 <p>Quedando un fondo como el siguiente ejemplo:</p>
    300 <img src="slock-blur.gif" />
    301 <p>Una vez instalado el programa y siendo posible invocarlo desde cualquier terminal o dmenu, el siguiente es, para mí, crearle un acceso directo de teclas para, desde el gestor de ventanas que utilizo (dwm) poder invocarlo más rápidamente cuando quiera bloquear la pantalla manualmente. Esto lo he hecho sencillamente modificando el <emb>config.h</emb>, y añadiendo:</p>
    302 <pre><code class="diff"><span class="info">diff --git a/config.h b/config.h</span>
    303 <span class="hunk">@@ -62,11 +62,13 @@ static const Layout layouts[] = {</span>
    304  static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
    305  static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
    306  static const char *termcmd[]  = { "xterm", NULL };
    307 <span class="add">+static const char *slockcmd[]  = { "slock", NULL };</span>
    308  
    309  static const Key keys[] = {
    310      /* modifier                     key        function        argument */
    311      { MODKEY,                       XK_r,      spawn,          {.v = dmenucmd } },
    312      { MODKEY,            XK_Return, spawn,          {.v = termcmd } },
    313 <span class="add">+    { MODKEY|ShiftMask,             XK_l,      spawn,       {    .v = slockcmd} },</span>
    314      { MODKEY,                       XK_b,      togglebar,      {0} },
    315      { MODKEY,                       XK_j,      focusstack,     {.i = +1 } },
    316      { MODKEY,                       XK_k,      focusstack,     {.i = -1 } },</code></pre>
    317 <p>De tal forma que, con la pulsación de teclas <kbd>Mod4</kbd>+<kbd>Shift</kbd>+<kbd>l</kbd> se ejecuta slock y se bloquea la pantalla.</p>
    318 <p>Cuando cierro la tapa del portátil, el equipo se suspende. Esto provoca el equipo apague casi todos los componentes físicos, pero mantenga una leve alimentación a la memoria RAM, la cual contiene todo el contenido tal cual estaba. De tal forma, al despertar (o abrir la tapa) el equipo alimenta todos los componentes de nuevo, e inicia rápidamente, casi instantáneamente, pues la información ya estaba en RAM. Por lo que cuando voy a desplazarme, cierro y abro la tapa manteniendo la sesión íntegra.</p>
    319 <p>Sin embargo, si no he ejecutado slock antes, al abrir la sesión no estará protegida. Esto es un riesgo de seguridad, pues un tercero podría hacerse con la máquina suspendida, despertarla y tener acceso a toda la sesión sin protección de ningún tipo. Por lo tanto, es interesante añadir una ejecución de slock automática al suspender el equipo.</p>
    320 <p>Eso sí, a menudo tengo el equipo conectado por HDMI a algún monitor o TV, siendo que me interesa cerrar la tapa directamente y mantener el equipo en funcionamiento en otro monitor, por lo que hacerlo automático al cerrar la tapa no sería útil; sino, en concreto, suspender el equipo. La forma, pues, más limpia y fiable será usar, con <emb>elogind</emb>, los hooks de <emb>system-sleep</emb>. Estos son los scripts que se ejecutan automáticamente antes y después de cualquier suspensión o hibernación, independientemente si se activa por cerrar la tapa o por cualquier otro motivo programado. <emb>elogind</emb> es un módulo de systemd que gestiona el login de usuarios, sesiones gráficas y el manejo de energía, pero separada y sin depender de todo systemd, claro (si no, no sería software nativo en Slackware 15).</p>
    321 <p>Lo que he hecho es crear un script en <emb>/lib64/elogind/system-sleep</emb> como el siguiente:</p>
    322 <pre><code>#!/bin/sh
    323 #/lib64/elogind/system-sleep/lock-slock
    324 
    325 USER="javier"
    326 USERHOME="/home/$USER"
    327 DISPLAY=:0
    328 XAUTHORITY="$USERHOME/.Xauthority"
    329 
    330 case "$1" in
    331     pre)
    332         export DISPLAY XAUTHORITY
    333         su - "$USER" -c "slock" &
    334         sleep 1.5 
    335         ;;
    336     post)
    337         ;;
    338 esac</code></pre>
    339 <p>Evidentemente con sus privilegios necesarios y el reinicio del demonio <emb>elogind</emb>. También podemos ejecutar el último comando para corroborar que, efectivamente, se bloquea la pantalla:</p>
    340 <pre><code>chmod +x /lib64/elogind/system-sleep/lock-slock
    341 /etc/rc.d/rc.elogind restart
    342 /lib64/elogind/system-sleep/lock-slock pre suspend</code></pre>
    343 <p>De tal forma, el equipo se bloqueará usando slock justo antes de ser suspendido, garantizando la seguridad de la máquina una vez despierta.</p>
    344 </body>
    345 </html>