sites

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

dwm-multimon-6-swap_focus-6.4.patch (6495B)


      1 From de73c72af0250f56f9ac30a5c3f4520da250282a Mon Sep 17 00:00:00 2001
      2 From: "Gary B. Genett" <me@garybgenett.net>
      3 Date: Sun, 19 Feb 2023 09:40:00 -0800
      4 Subject: patches/swapfocus: dwm-swapfocus-20160731-56a31dc.diff
      5 MIME-Version: 1.0
      6 Content-Type: multipart/mixed; boundary="------------2.37.4"
      7 
      8 This is a multi-part message in MIME format.
      9 --------------2.37.4
     10 Content-Type: text/plain; charset=UTF-8; format=fixed
     11 Content-Transfer-Encoding: 8bit
     12 
     13 
     14 	modified from sites: 38b351cf3689ff3fa4845d35ce9894fd9253dbb8
     15 ---
     16  config.def.h |  1 +
     17  dwm.c        | 19 ++++++++++++++++++-
     18  2 files changed, 19 insertions(+), 1 deletion(-)
     19 
     20 
     21 --------------2.37.4
     22 Content-Type: text/x-patch; name="0006-patches-swapfocus-dwm-swapfocus-20160731-56a31dc.dif.patch"
     23 Content-Transfer-Encoding: 8bit
     24 Content-Disposition: attachment; filename="0006-patches-swapfocus-dwm-swapfocus-20160731-56a31dc.dif.patch"
     25 
     26 diff --git a/config.def.h b/config.def.h
     27 index fd00f7080db9271912d0e4352434739d3c08e1b3..9a1118791c3a2f875b58bf3979db5074416b8634 100644
     28 --- a/config.def.h
     29 +++ b/config.def.h
     30 @@ -79,20 +79,21 @@ static const Key keys[] = {
     31  	{ MODKEY,                       XK_j,      focusstack,     {.i = +1 } },
     32  	{ MODKEY,                       XK_k,      focusstack,     {.i = -1 } },
     33  	{ MODKEY|ShiftMask,             XK_j,      pushdown,       {0} },
     34  	{ MODKEY|ShiftMask,             XK_k,      pushup,         {0} },
     35  	{ MODKEY,                       XK_i,      incnmaster,     {.i = +1 } },
     36  	{ MODKEY,                       XK_d,      incnmaster,     {.i = -1 } },
     37  	{ MODKEY,                       XK_h,      setmfact,       {.f = -0.05} },
     38  	{ MODKEY,                       XK_l,      setmfact,       {.f = +0.05} },
     39  	{ MODKEY,                       XK_Return, zoom,           {0} },
     40  	{ MODKEY,                       XK_Tab,    view,           {0} },
     41 +	{ MODKEY|ShiftMask,             XK_Tab,    swapfocus,      {0} },
     42  	{ MODKEY|ShiftMask,             XK_c,      killclient,     {0} },
     43  	{ MODKEY,                       XK_t,      setlayout,      {.v = &layouts[0]} },
     44  	{ MODKEY,                       XK_f,      setlayout,      {.v = &layouts[1]} },
     45  	{ MODKEY,                       XK_m,      setlayout,      {.v = &layouts[2]} },
     46  	{ MODKEY,                       XK_space,  setlayout,      {0} },
     47  	{ MODKEY|ShiftMask,             XK_space,  togglefloating, {0} },
     48  	{ MODKEY,                       XK_0,      view,           {.ui = ~0 } },
     49  	{ MODKEY|ShiftMask,             XK_0,      tag,            {.ui = ~0 } },
     50  	{ MODKEY,                       XK_comma,  focusmon,       {.i = -1 } },
     51  	{ MODKEY,                       XK_period, focusmon,       {.i = +1 } },
     52 diff --git a/dwm.c b/dwm.c
     53 index 5aa229611a27b8aa943308314b494c10e2364137..ac52b8c25991a073db15b55fae774e9c47a05708 100644
     54 --- a/dwm.c
     55 +++ b/dwm.c
     56 @@ -203,20 +203,21 @@ static int sendevent(Client *c, Atom proto);
     57  static void sendmon(Client *c, Monitor *m);
     58  static void setclientstate(Client *c, long state);
     59  static void setfocus(Client *c);
     60  static void setfullscreen(Client *c, int fullscreen);
     61  static void setlayout(const Arg *arg);
     62  static void setmfact(const Arg *arg);
     63  static void setup(void);
     64  static void seturgent(Client *c, int urg);
     65  static void showhide(Client *c);
     66  static void spawn(const Arg *arg);
     67 +static void swapfocus(const Arg *arg);
     68  static void tag(const Arg *arg);
     69  static void tagmon(const Arg *arg);
     70  static void tile(Monitor *m);
     71  static void togglebar(const Arg *arg);
     72  static void togglefloating(const Arg *arg);
     73  static void toggletag(const Arg *arg);
     74  static void ntoggleview(const Arg *arg);
     75  static void toggleview(const Arg *arg);
     76  static void unfocus(Client *c, int setfocus);
     77  static void unmanage(Client *c, int destroyed);
     78 @@ -235,20 +236,21 @@ static void nview(const Arg *arg);
     79  static void view(const Arg *arg);
     80  static Client *wintoclient(Window w);
     81  static Monitor *wintomon(Window w);
     82  static int xerror(Display *dpy, XErrorEvent *ee);
     83  static int xerrordummy(Display *dpy, XErrorEvent *ee);
     84  static int xerrorstart(Display *dpy, XErrorEvent *ee);
     85  static void zoom(const Arg *arg);
     86  static void reset_view(const Arg *arg);
     87  
     88  /* variables */
     89 +static Client *prevclient = NULL;
     90  static const char broken[] = "broken";
     91  static char stext[256];
     92  static int screen;
     93  static int sw, sh;           /* X display screen geometry width, height */
     94  static int bh;               /* bar height */
     95  static int lrpad;            /* sum of left and right padding for text */
     96  static int (*xerrorxlib)(Display *, XErrorEvent *);
     97  static unsigned int numlockmask = 0;
     98  static void (*handler[LASTEvent]) (XEvent *) = {
     99  	[ButtonPress] = buttonpress,
    100 @@ -1721,20 +1723,32 @@ spawn(const Arg *arg)
    101  		dmenumon[0] = '0' + selmon->num;
    102  	if (fork() == 0) {
    103  		if (dpy)
    104  			close(ConnectionNumber(dpy));
    105  		setsid();
    106  		execvp(((char **)arg->v)[0], (char **)arg->v);
    107  		die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]);
    108  	}
    109  }
    110  
    111 +void
    112 +swapfocus(const Arg *arg)
    113 +{
    114 +	Client *c;
    115 +
    116 +	for(c = selmon->clients; c && c != prevclient; c = c->next) ;
    117 +	if(c == prevclient) {
    118 +		focus(prevclient);
    119 +		restack(prevclient->mon);
    120 +	}
    121 +}
    122 +
    123  void
    124  tag(const Arg *arg)
    125  {
    126  	if (selmon->sel && arg->ui & TAGMASK) {
    127  		selmon->sel->tags = arg->ui & TAGMASK;
    128  		focus(NULL);
    129  		arrange(selmon);
    130  	}
    131  }
    132  
    133 @@ -1834,20 +1848,21 @@ toggleview(const Arg *arg)
    134  		focus(NULL);
    135  		arrange(selmon);
    136  	}
    137  }
    138  
    139  void
    140  unfocus(Client *c, int setfocus)
    141  {
    142  	if (!c)
    143  		return;
    144 +	prevclient = c;
    145  	grabbuttons(c, 0);
    146  	XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel);
    147  	if (setfocus) {
    148  		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
    149  		XDeleteProperty(dpy, root, netatom[NetActiveWindow]);
    150  	}
    151  }
    152  
    153  void
    154  unmanage(Client *c, int destroyed)
    155 @@ -2213,25 +2228,27 @@ int
    156  xerrorstart(Display *dpy, XErrorEvent *ee)
    157  {
    158  	die("dwm: another window manager is already running");
    159  	return -1;
    160  }
    161  
    162  void
    163  zoom(const Arg *arg)
    164  {
    165  	Client *c = selmon->sel;
    166 +	prevclient = nexttiled(selmon->clients);
    167  
    168  	if (!selmon->lt[selmon->sellt]->arrange || !c || c->isfloating)
    169  		return;
    170  	if (c == nexttiled(selmon->clients) && !(c = nexttiled(c->next)))
    171 -		return;
    172 +		if (!c || !(c = prevclient = nexttiled(c->next)))
    173 +			return;
    174  	pop(c);
    175  }
    176  
    177  void
    178  reset_view(const Arg *arg) {
    179  	const int mon = selmon->num;
    180  	Arg n = {.i = +1};	// focusmon(next monitor)
    181  	Arg m = {.f = 0};	// mfact -> facts[]
    182  	Arg i = {.i = 0};	// nmaster -> masters[]
    183  	Arg v = {.ui = 0};	// nviews -> views[]
    184 
    185 --------------2.37.4--
    186 
    187