slock-passthrough-20240812-809d3c0.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       slock-passthrough-20240812-809d3c0.diff (2918B)
       ---
            1 From 809d3c01cfdc8c5bf7eb37e5d3ade59b0947cab3 Mon Sep 17 00:00:00 2001
            2 From: catboomer <catb00mer@proton.me>
            3 Date: Mon, 12 Aug 2024 17:55:30 -0500
            4 Subject: [PATCH] [PATCH] passthrough: adds table to config.h to permit certain
            5  keys to pass through slock
            6 
            7 ---
            8  config.def.h | 15 +++++++++++++++
            9  slock.c      | 28 +++++++++++++++++++++++++++-
           10  2 files changed, 42 insertions(+), 1 deletion(-)
           11 
           12 diff --git a/config.def.h b/config.def.h
           13 index 9855e21..5b2ff78 100644
           14 --- a/config.def.h
           15 +++ b/config.def.h
           16 @@ -10,3 +10,18 @@ static const char *colorname[NUMCOLS] = {
           17  
           18  /* treat a cleared input like a wrong password (color) */
           19  static const int failonclear = 1;
           20 +
           21 +#include <X11/XF86keysym.h>
           22 +
           23 +static const Passthrough passthroughs[] = {
           24 +        /* Modifier   Key */
           25 +        { 0,          XF86XK_AudioRaiseVolume },
           26 +        { 0,          XF86XK_AudioLowerVolume },
           27 +        { 0,          XF86XK_AudioMute },
           28 +        { 0,          XF86XK_AudioPause },
           29 +        { 0,          XF86XK_AudioStop },
           30 +        { 0,          XF86XK_AudioNext },
           31 +        { 0,          XF86XK_AudioPrev },
           32 +        { 0,          XF86XK_MonBrightnessUp },
           33 +        { 0,          XF86XK_MonBrightnessDown },
           34 +};
           35 diff --git a/slock.c b/slock.c
           36 index 5ae738c..522a226 100644
           37 --- a/slock.c
           38 +++ b/slock.c
           39 @@ -22,6 +22,11 @@
           40  #include "arg.h"
           41  #include "util.h"
           42  
           43 +#include <X11/XF86keysym.h>
           44 +#define LENGTH(X)       (sizeof X / sizeof X[0])
           45 +#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
           46 +
           47 +static unsigned int numlockmask = 0;
           48  char *argv0;
           49  
           50  enum {
           51 @@ -31,6 +36,11 @@ enum {
           52          NUMCOLS
           53  };
           54  
           55 +typedef struct {
           56 +        unsigned int mod;
           57 +        KeySym keysym;
           58 +} Passthrough;
           59 +
           60  struct lock {
           61          int screen;
           62          Window root, win;
           63 @@ -130,7 +140,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
           64  {
           65          XRRScreenChangeNotifyEvent *rre;
           66          char buf[32], passwd[256], *inputhash;
           67 -        int num, screen, running, failure, oldc;
           68 +        int num, screen, running, failure, oldc, i, passing;
           69          unsigned int len, color;
           70          KeySym ksym;
           71          XEvent ev;
           72 @@ -156,6 +166,20 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
           73                              IsPFKey(ksym) ||
           74                              IsPrivateKeypadKey(ksym))
           75                                  continue;
           76 +
           77 +                        passing = 0;
           78 +                        for (i = 0; i < LENGTH(passthroughs); i++) {
           79 +                                if (ksym == passthroughs[i].keysym &&
           80 +                                                CLEANMASK(passthroughs[i].mod) == CLEANMASK(ev.xkey.state)) {
           81 +                                        passing = 1;
           82 +                                        XSendEvent(dpy, DefaultRootWindow(dpy), True, KeyPressMask, &ev);
           83 +                                        break;
           84 +                                }
           85 +                        }
           86 +
           87 +                        if(passing)
           88 +                                continue;
           89 +
           90                          switch (ksym) {
           91                          case XK_Return:
           92                                  passwd[len] = '\0';
           93 @@ -184,6 +208,8 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
           94                                      (len + num < sizeof(passwd))) {
           95                                          memcpy(passwd + len, buf, num);
           96                                          len += num;
           97 +                                } else {
           98 +                                        continue; /* Don't trigger fail screen when pressing control characters */
           99                                  }
          100                                  break;
          101                          }
          102 -- 
          103 2.46.0
          104