sites

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

dwm-inplacerotate-6.2.diff (3768B)


      1 From 75012a6ab9cc1b6c319af7f4ae7d682b16a66ce3 Mon Sep 17 00:00:00 2001
      2 From: Miles Alan <m@milesalan.com>
      3 Date: Sun, 26 Apr 2020 16:05:43 -0500
      4 Subject: [PATCH] Add inplacerotate fn to rotate all, master, or stacks clients
      5  inplace
      6 
      7 CW (+2) or CCW (-2) Rotates all windows.
      8 CW (+1) or CCW (-1) Rotates master xor stack windows (depending on focus).
      9 
     10 Focus position stays 'in-place' so the area of the screen you are focused
     11 on remains unchanged.
     12 ---
     13  config.def.h |  4 ++++
     14  dwm.c        | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++
     15  2 files changed, 63 insertions(+)
     16 
     17 diff --git a/config.def.h b/config.def.h
     18 index 1c0b587..9bcb792 100644
     19 --- a/config.def.h
     20 +++ b/config.def.h
     21 @@ -66,6 +66,10 @@ static Key keys[] = {
     22  	{ MODKEY,                       XK_b,      togglebar,      {0} },
     23  	{ MODKEY,                       XK_j,      focusstack,     {.i = +1 } },
     24  	{ MODKEY,                       XK_k,      focusstack,     {.i = -1 } },
     25 +	{ MODKEY|ShiftMask,             XK_j,      inplacerotate,  {.i = +1} },
     26 +	{ MODKEY|ShiftMask,             XK_k,      inplacerotate,  {.i = -1} },
     27 +	{ MODKEY|ShiftMask,             XK_h,      inplacerotate,  {.i = +2} },
     28 +	{ MODKEY|ShiftMask,             XK_l,      inplacerotate,  {.i = -2} },
     29  	{ MODKEY,                       XK_i,      incnmaster,     {.i = +1 } },
     30  	{ MODKEY,                       XK_d,      incnmaster,     {.i = -1 } },
     31  	{ MODKEY,                       XK_h,      setmfact,       {.f = -0.05} },
     32 diff --git a/dwm.c b/dwm.c
     33 index 4465af1..3930680 100644
     34 --- a/dwm.c
     35 +++ b/dwm.c
     36 @@ -175,6 +175,7 @@ static int gettextprop(Window w, Atom atom, char *text, unsigned int size);
     37  static void grabbuttons(Client *c, int focused);
     38  static void grabkeys(void);
     39  static void incnmaster(const Arg *arg);
     40 +static void inplacerotate(const Arg *arg);
     41  static void keypress(XEvent *e);
     42  static void killclient(const Arg *arg);
     43  static void manage(Window w, XWindowAttributes *wa);
     44 @@ -2147,3 +2148,61 @@ main(int argc, char *argv[])
     45  	XCloseDisplay(dpy);
     46  	return EXIT_SUCCESS;
     47  }
     48 +
     49 +void
     50 +insertclient(Client *item, Client *insertItem, int after) {
     51 +	Client *c;
     52 +	if (item == NULL || insertItem == NULL || item == insertItem) return;
     53 +	detach(insertItem);
     54 +	if (!after && selmon->clients == item) {
     55 +		attach(insertItem);
     56 +		return;
     57 +	}
     58 +	if (after) {
     59 +		c = item;
     60 +	} else {
     61 +		for (c = selmon->clients; c; c = c->next) { if (c->next == item) break; }
     62 +	}
     63 +	insertItem->next = c->next;
     64 +	c->next = insertItem;
     65 +}
     66 +
     67 +void
     68 +inplacerotate(const Arg *arg)
     69 +{
     70 +	if(!selmon->sel || (selmon->sel->isfloating && !arg->f)) return;
     71 +
     72 +	unsigned int selidx = 0, i = 0;
     73 +	Client *c = NULL, *stail = NULL, *mhead = NULL, *mtail = NULL, *shead = NULL;
     74 +
     75 +	// Determine positionings for insertclient
     76 +	for (c = selmon->clients; c; c = c->next) {
     77 +		if (ISVISIBLE(c) && !(c->isfloating)) {
     78 +		if (selmon->sel == c) { selidx = i; }
     79 +		if (i == selmon->nmaster - 1) { mtail = c; }
     80 +		if (i == selmon->nmaster) { shead = c; }
     81 +		if (mhead == NULL) { mhead = c; }
     82 +		stail = c;
     83 +		i++;
     84 +		}
     85 +	}
     86 +
     87 +	// All clients rotate
     88 +	if (arg->i == 2) insertclient(selmon->clients, stail, 0);
     89 +	if (arg->i == -2) insertclient(stail, selmon->clients, 1);
     90 +	// Stack xor master rotate
     91 +	if (arg->i == -1 && selidx >= selmon->nmaster) insertclient(stail, shead, 1);
     92 +	if (arg->i == 1 && selidx >= selmon->nmaster) insertclient(shead, stail, 0);
     93 +	if (arg->i == -1 && selidx < selmon->nmaster)  insertclient(mtail, mhead, 1);
     94 +	if (arg->i == 1 && selidx < selmon->nmaster)  insertclient(mhead, mtail, 0);
     95 +
     96 +	// Restore focus position
     97 +	i = 0;
     98 +	for (c = selmon->clients; c; c = c->next) {
     99 +		if (!ISVISIBLE(c) || (c->isfloating)) continue;
    100 +		if (i == selidx) { focus(c); break; }
    101 +		i++;
    102 +	}
    103 +	arrange(selmon);
    104 +	focus(c);
    105 +}
    106 -- 
    107 2.23.1
    108