sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

dwm-shif-tools-6.2.diff (7404B)


      1 From d57c8508c9f26be40667d402a2daaa2b27ae759f Mon Sep 17 00:00:00 2001
      2 From: explosion-mental <explosion0mental@gmail.com>
      3 Date: Wed, 11 Aug 2021 21:05:44 -0500
      4 Subject: [PATCH] shift-tools - shifttag, moves the current selected client to
      5  the adjacent tag - shifttagclients, moves the current selected client to the
      6  adjacent tag   that has at least one client else acts as shifttag -
      7  shiftview, view adjacent tag - shiftviewclients, view the closes tag that has
      8  a client. If none acts   as shiftview - shiftboth, shifttag and shiftview.
      9  Basically moves the window to the   next/prev tag and follows it. -
     10  shiftswaptags, its a shift implementation on the swaptags function   (see  
     11  https://github.com/moizifty/DWM-Build/blob/65379c62640788881486401a0d8c79333751b02f/config.h#L48
     12    for more details), which in short 'swaps tags' (swaps all clients with  
     13  the clients on the adjacent tag). A pretty useful example of this is  
     14  chosing a tag empty and sending all your clients to that tag. - swapfunction
     15  is the 'helper' function for the shiftswaptags. remember that these functions
     16  **shift**, which means you can go from tag 1 to 9 or 9 to 1. Also remember
     17  that the default argument is 1 and you   can change it.
     18 
     19 ---
     20  config.def.h  |   9 ++++
     21  shift-tools.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++
     22  2 files changed, 144 insertions(+)
     23  create mode 100644 shift-tools.c
     24 
     25 diff --git a/config.def.h b/config.def.h
     26 index 1c0b587..1390d17 100644
     27 --- a/config.def.h
     28 +++ b/config.def.h
     29 @@ -58,9 +58,14 @@ static const Layout layouts[] = {
     30  static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
     31  static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
     32  static const char *termcmd[]  = { "st", NULL };
     33 +#include "shift-tools.c"
     34  
     35  static Key keys[] = {
     36  	/* modifier                     key        function        argument */
     37 +	{ MODKEY,                       XK_o, shiftviewclients,    { .i = +1 } },
     38 +	{ MODKEY|ShiftMask,             XK_o,	shiftview,         { .i = +1 } },
     39 +	{ MODKEY|ShiftMask,             XK_i,	shiftview,         { .i = -1 } },
     40 +	{ MODKEY,	                XK_i, shiftviewclients,    { .i = -1 } },
     41  	{ MODKEY,                       XK_p,      spawn,          {.v = dmenucmd } },
     42  	{ MODKEY|ShiftMask,             XK_Return, spawn,          {.v = termcmd } },
     43  	{ MODKEY,                       XK_b,      togglebar,      {0} },
     44 @@ -69,6 +74,10 @@ static Key keys[] = {
     45  	{ MODKEY,                       XK_i,      incnmaster,     {.i = +1 } },
     46  	{ MODKEY,                       XK_d,      incnmaster,     {.i = -1 } },
     47  	{ MODKEY,                       XK_h,      setmfact,       {.f = -0.05} },
     48 +	{ MODKEY|ShiftMask,		XK_h,      shiftboth,      { .i = -1 }	},
     49 +	{ MODKEY|ControlMask,		XK_h,      shiftswaptags,  { .i = -1 }	},
     50 +	{ MODKEY|ControlMask,		XK_l,      shiftswaptags,  { .i = +1 }	},
     51 +	{ MODKEY|ShiftMask,             XK_l,      shiftboth,      { .i = +1 }	},
     52  	{ MODKEY,                       XK_l,      setmfact,       {.f = +0.05} },
     53  	{ MODKEY,                       XK_Return, zoom,           {0} },
     54  	{ MODKEY,                       XK_Tab,    view,           {0} },
     55 diff --git a/shift-tools.c b/shift-tools.c
     56 new file mode 100644
     57 index 0000000..cf130c8
     58 --- /dev/null
     59 +++ b/shift-tools.c
     60 @@ -0,0 +1,135 @@
     61 +/* Sends a window to the next/prev tag */
     62 +void
     63 +shifttag(const Arg *arg)
     64 +{
     65 +	Arg shifted;
     66 +	shifted.ui = selmon->tagset[selmon->seltags];
     67 +
     68 +
     69 +	if (arg->i > 0)	/* left circular shift */
     70 +		shifted.ui = ((shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i)));
     71 +	else		/* right circular shift */
     72 +		shifted.ui = (shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i));
     73 +	tag(&shifted);
     74 +}
     75 +/* Sends a window to the next/prev tag that has a client, else it moves it to the next/prev one. */
     76 +void
     77 +shifttagclients(const Arg *arg)
     78 +{
     79 +
     80 +	Arg shifted;
     81 +	Client *c;
     82 +	unsigned int tagmask = 0;
     83 +	shifted.ui = selmon->tagset[selmon->seltags];
     84 +
     85 +	for (c = selmon->clients; c; c = c->next)
     86 +		if (!(c->tags))
     87 +			tagmask = tagmask | c->tags;
     88 +
     89 +
     90 +	if (arg->i > 0)	/* left circular shift */
     91 +		do {
     92 +			shifted.ui = (shifted.ui << arg->i)
     93 +			   | (shifted.ui >> (LENGTH(tags) - arg->i));
     94 +		} while (tagmask && !(shifted.ui & tagmask));
     95 +	else		/* right circular shift */
     96 +		do {
     97 +			shifted.ui = (shifted.ui >> (- arg->i)
     98 +			   | shifted.ui << (LENGTH(tags) + arg->i));
     99 +		} while (tagmask && !(shifted.ui & tagmask));
    100 +	tag(&shifted);
    101 +}
    102 +/* Navigate to the next/prev tag */
    103 +void
    104 +shiftview(const Arg *arg)
    105 +{
    106 +	Arg shifted;
    107 +	shifted.ui = selmon->tagset[selmon->seltags];
    108 +
    109 +	if (arg->i > 0)	/* left circular shift */
    110 +		shifted.ui = (shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i));
    111 +	else		/* right circular shift */
    112 +		shifted.ui = (shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i));
    113 +	view(&shifted);
    114 +}
    115 +/* Navigate to the next/prev tag that has a client, else moves it to the next/prev tag */
    116 +void
    117 +shiftviewclients(const Arg *arg)
    118 +{
    119 +	Arg shifted;
    120 +	Client *c;
    121 +	unsigned int tagmask = 0;
    122 +	shifted.ui = selmon->tagset[selmon->seltags];
    123 +
    124 +	for (c = selmon->clients; c; c = c->next)
    125 +		if (!(c->tags))
    126 +			tagmask = tagmask | c->tags;
    127 +
    128 +
    129 +	if (arg->i > 0)	/* left circular shift */
    130 +		do {
    131 +			shifted.ui = (shifted.ui << arg->i)
    132 +			   | (shifted.ui >> (LENGTH(tags) - arg->i));
    133 +		} while (tagmask && !(shifted.ui & tagmask));
    134 +	else		/* right circular shift */
    135 +		do {
    136 +			shifted.ui = (shifted.ui >> (- arg->i)
    137 +			   | shifted.ui << (LENGTH(tags) + arg->i));
    138 +		} while (tagmask && !(shifted.ui & tagmask));
    139 +	view(&shifted);
    140 +}
    141 +/* move the current active window to the next/prev tag and view it. More like following the window */
    142 +void
    143 +shiftboth(const Arg *arg)
    144 +{
    145 +	Arg shifted;
    146 +	shifted.ui = selmon->tagset[selmon->seltags];
    147 +
    148 +	if (arg->i > 0)	/* left circular shift */
    149 +		shifted.ui = ((shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i)));
    150 +	else		/* right circular shift */
    151 +		shifted.ui = ((shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i)));
    152 +	tag(&shifted);
    153 +	view(&shifted);
    154 +}
    155 +//helper function for shiftswaptags.
    156 +//see: https://github.com/moizifty/DWM-Build/blob/65379c62640788881486401a0d8c79333751b02f/config.h#L48
    157 +void
    158 +swaptags(const Arg *arg)
    159 +{
    160 +	Client *c;
    161 +	unsigned int newtag = arg->ui & TAGMASK;
    162 +	unsigned int curtag = selmon->tagset[selmon->seltags];
    163 +
    164 +	if (newtag == curtag || !curtag || (curtag & (curtag-1)))
    165 +		return;
    166 +
    167 +	for (c = selmon->clients; c != NULL; c = c->next) {
    168 +		if ((c->tags & newtag) || (c->tags & curtag))
    169 +			c->tags ^= curtag ^ newtag;
    170 +
    171 +		if (!c->tags)
    172 +			c->tags = newtag;
    173 +	}
    174 +
    175 +	//move to the swaped tag
    176 +	//selmon->tagset[selmon->seltags] = newtag;
    177 +
    178 +	focus(NULL);
    179 +	arrange(selmon);
    180 +}
    181 +/* swaps "tags" (all the clients) with the next/prev tag. */
    182 +void
    183 +shiftswaptags(const Arg *arg)
    184 +{
    185 +	Arg shifted;
    186 +	shifted.ui = selmon->tagset[selmon->seltags];
    187 +
    188 +	if (arg->i > 0)	/* left circular shift */
    189 +		shifted.ui = ((shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i)));
    190 +	else		/* right circular shift */
    191 +		shifted.ui = ((shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i)));
    192 +	swaptags(&shifted);
    193 +	// uncomment if you also want to "go" (view) the tag where the the clients are going
    194 +	//view(&shifted);
    195 +}
    196 -- 
    197 2.32.0
    198