dwm

my dwm build
Log | Files | Refs | LICENSE

dwm-holdbar-modkey-6.2.diff (4866B)


      1 From 1004b9406e4b89448cf9d3b18955dbd0d55a571d Mon Sep 17 00:00:00 2001
      2 From: bakkeby <bakkeby@gmail.com>
      3 Date: Wed, 1 Jul 2020 08:05:35 +0200
      4 Subject: [PATCH] holdbar: variant of the patch where holdbar is only active
      5  when the bar is toggled off
      6 
      7 Additionally this allows the use of the primary MOD key to be used as the holdbar key while
      8 still allowing the bar to be toggled on and off using MOD+b. This gives a more intuitive and
      9 flexible feel when using this functionality.
     10 
     11 Use xev to find the keysym for the key that you want to use and add/update the HOLDKEY
     12 definition in config.h.
     13 
     14 E.g. using Alt_L as the HOLDKEY
     15 ---
     16  config.def.h |  2 ++
     17  dwm.c        | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++-
     18  2 files changed, 52 insertions(+), 1 deletion(-)
     19 
     20 diff --git a/config.def.h b/config.def.h
     21 index 1c0b587..8611189 100644
     22 --- a/config.def.h
     23 +++ b/config.def.h
     24 @@ -50,6 +50,7 @@ static const Layout layouts[] = {
     25  	{ MODKEY|ControlMask,           KEY,      toggleview,     {.ui = 1 << TAG} }, \
     26  	{ MODKEY|ShiftMask,             KEY,      tag,            {.ui = 1 << TAG} }, \
     27  	{ MODKEY|ControlMask|ShiftMask, KEY,      toggletag,      {.ui = 1 << TAG} },
     28 +#define HOLDKEY 0 // replace 0 with the keysym to activate holdbar
     29  
     30  /* helper for spawning shell commands in the pre dwm-5.0 fashion */
     31  #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
     32 @@ -94,6 +95,7 @@ static Key keys[] = {
     33  	TAGKEYS(                        XK_8,                      7)
     34  	TAGKEYS(                        XK_9,                      8)
     35  	{ MODKEY|ShiftMask,             XK_q,      quit,           {0} },
     36 +	{ 0,                            HOLDKEY,   holdbar,        {0} },
     37  };
     38  
     39  /* button definitions */
     40 diff --git a/dwm.c b/dwm.c
     41 index 4465af1..def5f66 100644
     42 --- a/dwm.c
     43 +++ b/dwm.c
     44 @@ -176,6 +176,7 @@ static void grabbuttons(Client *c, int focused);
     45  static void grabkeys(void);
     46  static void incnmaster(const Arg *arg);
     47  static void keypress(XEvent *e);
     48 +static void keyrelease(XEvent *e);
     49  static void killclient(const Arg *arg);
     50  static void manage(Window w, XWindowAttributes *wa);
     51  static void mappingnotify(XEvent *e);
     52 @@ -210,6 +211,7 @@ static void tag(const Arg *arg);
     53  static void tagmon(const Arg *arg);
     54  static void tile(Monitor *);
     55  static void togglebar(const Arg *arg);
     56 +static void holdbar(const Arg *arg);
     57  static void togglefloating(const Arg *arg);
     58  static void toggletag(const Arg *arg);
     59  static void toggleview(const Arg *arg);
     60 @@ -217,6 +219,7 @@ static void unfocus(Client *c, int setfocus);
     61  static void unmanage(Client *c, int destroyed);
     62  static void unmapnotify(XEvent *e);
     63  static void updatebarpos(Monitor *m);
     64 +static void updateholdbarpos(Monitor *m);
     65  static void updatebars(void);
     66  static void updateclientlist(void);
     67  static int updategeom(void);
     68 @@ -245,6 +248,7 @@ static int (*xerrorxlib)(Display *, XErrorEvent *);
     69  static unsigned int numlockmask = 0;
     70  static void (*handler[LASTEvent]) (XEvent *) = {
     71  	[ButtonPress] = buttonpress,
     72 +	[ButtonRelease] = keyrelease,
     73  	[ClientMessage] = clientmessage,
     74  	[ConfigureRequest] = configurerequest,
     75  	[ConfigureNotify] = configurenotify,
     76 @@ -252,6 +256,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
     77  	[EnterNotify] = enternotify,
     78  	[Expose] = expose,
     79  	[FocusIn] = focusin,
     80 +	[KeyRelease] = keyrelease,
     81  	[KeyPress] = keypress,
     82  	[MappingNotify] = mappingnotify,
     83  	[MapRequest] = maprequest,
     84 @@ -275,6 +280,50 @@ static Window root, wmcheckwin;
     85  struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
     86  
     87  /* function implementations */
     88 +void
     89 +holdbar(const Arg *arg)
     90 +{
     91 +	if (selmon->showbar)
     92 +		return;
     93 +	selmon->showbar = 2;
     94 +	updateholdbarpos(selmon);
     95 +	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
     96 +}
     97 +
     98 +void
     99 +keyrelease(XEvent *e)
    100 +{
    101 +	if (XEventsQueued(dpy, QueuedAfterReading)) {
    102 +		XEvent ne;
    103 +		XPeekEvent(dpy, &ne);
    104 +
    105 +		if (ne.type == KeyPress && ne.xkey.time == e->xkey.time &&
    106 +				ne.xkey.keycode == e->xkey.keycode) {
    107 +			XNextEvent(dpy, &ne);
    108 +			return;
    109 +		}
    110 +	}
    111 +	if (e->xkey.keycode == XKeysymToKeycode(dpy, HOLDKEY) && selmon->showbar == 2) {
    112 +		selmon->showbar = 0;
    113 +		updateholdbarpos(selmon);
    114 +		XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
    115 +		arrange(selmon);
    116 +	}
    117 +}
    118 +
    119 +void
    120 +updateholdbarpos(Monitor *m)
    121 +{
    122 +	m->wy = m->my;
    123 +	m->wh = m->mh;
    124 +	if (m->showbar) {
    125 +		m->by = m->topbar ? m->wy : m->wy + m->wh - bh;
    126 +		m->wy = m->topbar ? m->wy - bh + bh : m->wy;
    127 +	} else {
    128 +		m->by = -bh;
    129 +	}
    130 +}
    131 +
    132  void
    133  applyrules(Client *c)
    134  {
    135 @@ -1699,7 +1748,7 @@ tile(Monitor *m)
    136  void
    137  togglebar(const Arg *arg)
    138  {
    139 -	selmon->showbar = !selmon->showbar;
    140 +	selmon->showbar = (selmon->showbar == 2 ? 1 : !selmon->showbar);
    141  	updatebarpos(selmon);
    142  	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
    143  	arrange(selmon);
    144 -- 
    145 2.19.1
    146