dwm-holdbar-6.2.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwm-holdbar-6.2.diff (4087B)
       ---
            1 From 58507fca3c3c334f540700c5ed81815d9335138e Mon Sep 17 00:00:00 2001
            2 From: Nihal Jere <noocsharp@gmail.com>
            3 Date: Thu, 12 Mar 2020 10:16:48 -0500
            4 Subject: [PATCH] holdbar: fixed bar flickering caused by repeated key events
            5 
            6 ---
            7  config.def.h |  2 ++
            8  dwm.c        | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
            9  2 files changed, 52 insertions(+)
           10 
           11 diff --git a/config.def.h b/config.def.h
           12 index 1c0b587..0e19b5d 100644
           13 --- a/config.def.h
           14 +++ b/config.def.h
           15 @@ -50,6 +50,7 @@ static const Layout layouts[] = {
           16          { MODKEY|ControlMask,           KEY,      toggleview,     {.ui = 1 << TAG} }, \
           17          { MODKEY|ShiftMask,             KEY,      tag,            {.ui = 1 << TAG} }, \
           18          { MODKEY|ControlMask|ShiftMask, KEY,      toggletag,      {.ui = 1 << TAG} },
           19 +#define HOLDKEY 0 // replace 0 with the keysym to activate holdbar
           20  
           21  /* helper for spawning shell commands in the pre dwm-5.0 fashion */
           22  #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
           23 @@ -94,6 +95,7 @@ static Key keys[] = {
           24          TAGKEYS(                        XK_8,                      7)
           25          TAGKEYS(                        XK_9,                      8)
           26          { MODKEY|ShiftMask,             XK_q,      quit,           {0} },
           27 +        { 0,             HOLDKEY,      holdbar,           {0} },
           28  };
           29  
           30  /* button definitions */
           31 diff --git a/dwm.c b/dwm.c
           32 index 4465af1..9437707 100644
           33 --- a/dwm.c
           34 +++ b/dwm.c
           35 @@ -176,6 +176,7 @@ static void grabbuttons(Client *c, int focused);
           36  static void grabkeys(void);
           37  static void incnmaster(const Arg *arg);
           38  static void keypress(XEvent *e);
           39 +static void keyrelease(XEvent *e);
           40  static void killclient(const Arg *arg);
           41  static void manage(Window w, XWindowAttributes *wa);
           42  static void mappingnotify(XEvent *e);
           43 @@ -210,6 +211,7 @@ static void tag(const Arg *arg);
           44  static void tagmon(const Arg *arg);
           45  static void tile(Monitor *);
           46  static void togglebar(const Arg *arg);
           47 +static void holdbar(const Arg *arg);
           48  static void togglefloating(const Arg *arg);
           49  static void toggletag(const Arg *arg);
           50  static void toggleview(const Arg *arg);
           51 @@ -217,6 +219,7 @@ static void unfocus(Client *c, int setfocus);
           52  static void unmanage(Client *c, int destroyed);
           53  static void unmapnotify(XEvent *e);
           54  static void updatebarpos(Monitor *m);
           55 +static void updateholdbarpos(Monitor *m);
           56  static void updatebars(void);
           57  static void updateclientlist(void);
           58  static int updategeom(void);
           59 @@ -245,6 +248,7 @@ static int (*xerrorxlib)(Display *, XErrorEvent *);
           60  static unsigned int numlockmask = 0;
           61  static void (*handler[LASTEvent]) (XEvent *) = {
           62          [ButtonPress] = buttonpress,
           63 +        [ButtonRelease] = keyrelease,
           64          [ClientMessage] = clientmessage,
           65          [ConfigureRequest] = configurerequest,
           66          [ConfigureNotify] = configurenotify,
           67 @@ -252,6 +256,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
           68          [EnterNotify] = enternotify,
           69          [Expose] = expose,
           70          [FocusIn] = focusin,
           71 +        [KeyRelease] = keyrelease,
           72          [KeyPress] = keypress,
           73          [MappingNotify] = mappingnotify,
           74          [MapRequest] = maprequest,
           75 @@ -275,6 +280,51 @@ static Window root, wmcheckwin;
           76  struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
           77  
           78  /* function implementations */
           79 +
           80 +
           81 +void
           82 +holdbar(const Arg *arg)
           83 +{
           84 +        selmon->showbar = 1;
           85 +        updateholdbarpos(selmon);
           86 +        XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
           87 +}
           88 +
           89 +
           90 +void
           91 +keyrelease(XEvent *e)
           92 +{
           93 +        if (XEventsQueued(dpy, QueuedAfterReading)) {
           94 +                XEvent ne;
           95 +                XPeekEvent(dpy, &ne);
           96 +
           97 +                if (ne.type == KeyPress && ne.xkey.time == e->xkey.time &&
           98 +                                ne.xkey.keycode == e->xkey.keycode) {
           99 +                        XNextEvent(dpy, &ne);
          100 +                        return;
          101 +                }
          102 +        }
          103 +        if (e->xkey.keycode == XKeysymToKeycode(dpy, HOLDKEY)) {
          104 +                selmon->showbar = 0;
          105 +                updateholdbarpos(selmon);
          106 +                XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
          107 +                arrange(selmon);
          108 +        }
          109 +}
          110 +
          111 +void
          112 +updateholdbarpos(Monitor *m)
          113 +{
          114 +        m->wy = m->my;
          115 +        m->wh = m->mh;
          116 +        if (m->showbar) {
          117 +                m->by = m->topbar ? m->wy : m->wy + m->wh - bh;
          118 +                m->wy = m->topbar ? m->wy - bh + bh : m->wy;
          119 +        } else {
          120 +                m->by = -bh;
          121 +        }
          122 +}
          123 +
          124  void
          125  applyrules(Client *c)
          126  {
          127 -- 
          128 2.25.1
          129