From 4d52a0a8a65d544e71e654392960f0819fcd55ca Mon Sep 17 00:00:00 2001
From: tavo-wasd <gustavo@gustavocalvo.xyz>
Date: Thu, 2 May 2024 21:41:12 -0600
Subject: [PATCH] patched windowmap

---
 dwm-6.5-tavo.diff | 166 ++++++++++++++++++++++++++++++++--------------
 1 file changed, 116 insertions(+), 50 deletions(-)

diff --git a/dwm-6.5-tavo.diff b/dwm-6.5-tavo.diff
index 62849b7..029d5eb 100644
--- a/dwm-6.5-tavo.diff
+++ b/dwm-6.5-tavo.diff
@@ -8,10 +8,11 @@ dwm-movestack-20211115-a786211.diff
 dwm-fullgaps-6.4.diff
 dwm-attachbottom-6.3.diff
 dwm-alwayscenter-20200625-f04cac6.diff
+dwm-windowmap-20221026.diff
 ---
 diff '--color=auto' -Nu a/config.def.h b/config.def.h
 --- a/config.def.h	2024-03-19 05:24:52.000000000 -0600
-+++ b/config.def.h	2024-04-28 21:58:33.535704620 -0600
++++ b/config.def.h	2024-05-02 21:39:10.483748489 -0600
 @@ -2,7 +2,9 @@
  
  /* appearance */
@@ -74,18 +75,18 @@ diff '--color=auto' -Nu a/config.def.h b/config.def.h
  	{ ClkClientWin,         MODKEY,         Button2,        togglefloating, {0} },
 diff '--color=auto' -Nu a/config.h b/config.h
 --- a/config.h	1969-12-31 18:00:00.000000000 -0600
-+++ b/config.h	2024-04-28 22:01:48.845590861 -0600
-@@ -0,0 +1,172 @@
++++ b/config.h	2024-05-02 21:39:10.483748489 -0600
+@@ -0,0 +1,170 @@
 +/* See LICENSE file for copyright and license details. */
 +#include <X11/XF86keysym.h>
 +
 +/* appearance */
 +static const unsigned int borderpx  = 2;        /* border pixel of windows */
-+static const unsigned int gappx     = 5;        /* gaps between windows */
++static const unsigned int gappx     = 15;        /* gaps between windows */
 +static const unsigned int snap      = 5;       /* snap pixel */
 +static const int swallowfloating    = 0;        /* 1 means swallow floating windows by default */
 +static const int showbar            = 1;        /* 0 means no bar */
-+static const int topbar             = 1;        /* 0 means bottom bar */
++static const int topbar             = 0;        /* 0 means bottom bar */
 +static const char *fonts[]          = { "JetBrainsMono:bold:size=10" };
 +static const char dmenufont[]       = "JetBrainsMono:bold:size=10";
 +static const char col_gray1[]       = "#222222";
@@ -94,16 +95,14 @@ diff '--color=auto' -Nu a/config.h b/config.h
 +static const char col_gray4[]       = "#eeeeee";
 +static const char col_cyan[]        = "#005577";
 +/* custom colors */
-+static const char col_light[]       = "#689d6a";
++static const char col_light[]       = "#fabd2f";
 +static const char col_dark[]        = "#1d2021";
-+static const char col_main_light[]  = "#fabd2f";
-+static const char col_main_dark[]   = "#1d2021";
-+static const char col_main_contr[]  = "#012b27";
++static const char col_black[]       = "#000000";
 +static const char *colors[][3]      = {
 +/* --------------- */
 +	/*               fg         bg         border   */
-+	[SchemeNorm] = { col_light, col_main_contr, col_main_dark },
-+	[SchemeSel] =  { col_dark, col_main_light, col_main_light },
++	[SchemeNorm] = { col_dark, col_black, col_dark },
++	[SchemeSel] =  { col_dark, col_light, col_light },
 +};
 +
 +/* tagging */
@@ -114,14 +113,14 @@ diff '--color=auto' -Nu a/config.h b/config.h
 +	 *	WM_CLASS(STRING) = instance, class
 +	 *	WM_NAME(STRING) = title
 +	 */
-+	/* class     instance  title           tags mask  isfloating  isterminal  noswallow  monitor */
++	/* class             instance  title           tags mask  isfloating  isterminal  noswallow  monitor */
 +	{ "st",              NULL,     NULL,           0,         0,          1,           0,        -1 },
 +	{ "Display-im6.q16", NULL,     NULL,           0,         1,          1,           0,        -1 },
 +	{ NULL,              NULL,     "Event Tester", 0,         0,          0,           1,        -1 }, /* xev */
 +};
 +
 +/* layout(s) */
-+static const float mfact     = 0.55; /* factor of master area size [0.05..0.95] */
++static const float mfact     = 0.50; /* factor of master area size [0.05..0.95] */
 +static const int nmaster     = 1;    /* number of clients in master area */
 +static const int resizehints = 1;    /* 1 means respect size hints in tiled resizals */
 +static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
@@ -250,7 +249,7 @@ diff '--color=auto' -Nu a/config.h b/config.h
 +
 diff '--color=auto' -Nu a/config.mk b/config.mk
 --- a/config.mk	2024-03-19 05:24:52.000000000 -0600
-+++ b/config.mk	2024-04-28 21:58:33.535704620 -0600
++++ b/config.mk	2024-05-02 21:39:10.483748489 -0600
 @@ -20,10 +20,11 @@
  # OpenBSD (uncomment)
  #FREETYPEINC = ${X11INC}/freetype2
@@ -266,7 +265,7 @@ diff '--color=auto' -Nu a/config.mk b/config.mk
  CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
 diff '--color=auto' -Nu a/dwm.c b/dwm.c
 --- a/dwm.c	2024-03-19 05:24:52.000000000 -0600
-+++ b/dwm.c	2024-04-28 21:58:33.535704620 -0600
++++ b/dwm.c	2024-05-02 21:39:10.487748219 -0600
 @@ -40,6 +40,12 @@
  #include <X11/extensions/Xinerama.h>
  #endif /* XINERAMA */
@@ -375,15 +374,18 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  static void toggletag(const Arg *arg);
  static void toggleview(const Arg *arg);
  static void unfocus(Client *c, int setfocus);
-@@ -227,6 +244,7 @@
+@@ -227,6 +244,10 @@
  static void updatewindowtype(Client *c);
  static void updatewmhints(Client *c);
  static void view(const Arg *arg);
 +static void warp(const Client *c);
++static void window_set_state(Display *dpy, Window win, long state);
++static void window_map(Display *dpy, Client *c, int deiconify);
++static void window_unmap(Display *dpy, Window win, Window root, int iconify);
  static Client *wintoclient(Window w);
  static Monitor *wintomon(Window w);
  static int xerror(Display *dpy, XErrorEvent *ee);
-@@ -234,6 +252,12 @@
+@@ -234,6 +255,12 @@
  static int xerrorstart(Display *dpy, XErrorEvent *ee);
  static void zoom(const Arg *arg);
  
@@ -396,7 +398,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  /* variables */
  static const char broken[] = "broken";
  static char stext[256];
-@@ -268,9 +292,20 @@
+@@ -268,9 +295,20 @@
  static Monitor *mons, *selmon;
  static Window root, wmcheckwin;
  
@@ -417,7 +419,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  /* compile-time check if all tags fit into an unsigned int bit array. */
  struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
  
-@@ -297,6 +332,8 @@
+@@ -297,6 +335,8 @@
  		&& (!r->class || strstr(class, r->class))
  		&& (!r->instance || strstr(instance, r->instance)))
  		{
@@ -426,7 +428,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  			c->isfloating = r->isfloating;
  			c->tags |= r->tags;
  			for (m = mons; m && m->num != r->monitor; m = m->next);
-@@ -409,6 +446,15 @@
+@@ -409,6 +449,15 @@
  }
  
  void
@@ -442,7 +444,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  attachstack(Client *c)
  {
  	c->snext = c->mon->stack;
-@@ -416,6 +462,53 @@
+@@ -416,6 +465,53 @@
  }
  
  void
@@ -496,7 +498,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  buttonpress(XEvent *e)
  {
  	unsigned int i, x, click;
-@@ -441,10 +534,8 @@
+@@ -441,10 +537,8 @@
  			arg.ui = 1 << i;
  		} else if (ev->x < x + TEXTW(selmon->ltsymbol))
  			click = ClkLtSymbol;
@@ -508,7 +510,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  	} else if ((c = wintoclient(ev->window))) {
  		focus(c);
  		restack(selmon);
-@@ -525,6 +616,10 @@
+@@ -525,6 +619,10 @@
  		|| cme->data.l[2] == netatom[NetWMFullscreen])
  			setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD    */
  				|| (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen)));
@@ -519,7 +521,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  	} else if (cme->message_type == netatom[NetActiveWindow]) {
  		if (c != selmon->sel && !c->isurgent)
  			seturgent(c, 1);
-@@ -634,6 +729,7 @@
+@@ -634,6 +732,7 @@
  createmon(void)
  {
  	Monitor *m;
@@ -527,7 +529,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  
  	m = ecalloc(1, sizeof(Monitor));
  	m->tagset[0] = m->tagset[1] = 1;
-@@ -641,9 +737,24 @@
+@@ -641,9 +740,24 @@
  	m->nmaster = nmaster;
  	m->showbar = showbar;
  	m->topbar = topbar;
@@ -552,7 +554,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  	return m;
  }
  
-@@ -655,6 +766,9 @@
+@@ -655,6 +769,9 @@
  
  	if ((c = wintoclient(ev->window)))
  		unmanage(c, 1);
@@ -562,7 +564,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  }
  
  void
-@@ -735,15 +849,8 @@
+@@ -735,15 +852,8 @@
  	x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
  
  	if ((w = m->ww - tw - x) > bh) {
@@ -578,7 +580,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  	}
  	drw_map(drw, m->barwin, 0, 0, m->ww, bh);
  }
-@@ -833,6 +940,7 @@
+@@ -833,6 +943,7 @@
  	unfocus(selmon->sel, 0);
  	selmon = m;
  	focus(NULL);
@@ -586,7 +588,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  }
  
  void
-@@ -980,7 +1088,7 @@
+@@ -980,7 +1091,7 @@
  void
  incnmaster(const Arg *arg)
  {
@@ -595,7 +597,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  	arrange(selmon);
  }
  
-@@ -1031,12 +1139,13 @@
+@@ -1031,12 +1142,13 @@
  void
  manage(Window w, XWindowAttributes *wa)
  {
@@ -610,7 +612,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  	/* geometry */
  	c->x = c->oldx = wa->x;
  	c->y = c->oldy = wa->y;
-@@ -1051,6 +1160,7 @@
+@@ -1051,6 +1163,7 @@
  	} else {
  		c->mon = selmon;
  		applyrules(c);
@@ -618,7 +620,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  	}
  
  	if (c->x + WIDTH(c) > c->mon->wx + c->mon->ww)
-@@ -1068,13 +1178,15 @@
+@@ -1068,13 +1181,15 @@
  	updatewindowtype(c);
  	updatesizehints(c);
  	updatewmhints(c);
@@ -635,7 +637,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  	attachstack(c);
  	XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
  		(unsigned char *) &(c->win), 1);
-@@ -1085,6 +1197,8 @@
+@@ -1085,6 +1200,8 @@
  	c->mon->sel = c;
  	arrange(c->mon);
  	XMapWindow(dpy, c->win);
@@ -644,7 +646,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  	focus(NULL);
  }
  
-@@ -1245,11 +1359,8 @@
+@@ -1245,11 +1362,8 @@
  			drawbars();
  			break;
  		}
@@ -657,7 +659,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  		if (ev->atom == netatom[NetWMWindowType])
  			updatewindowtype(c);
  	}
-@@ -1375,6 +1486,8 @@
+@@ -1375,6 +1489,8 @@
  				wc.sibling = c->win;
  			}
  	}
@@ -666,7 +668,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  	XSync(dpy, False);
  	while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
  }
-@@ -1427,7 +1540,7 @@
+@@ -1427,7 +1543,7 @@
  	detachstack(c);
  	c->mon = m;
  	c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
@@ -675,7 +677,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  	attachstack(c);
  	focus(NULL);
  	arrange(NULL);
-@@ -1508,12 +1621,39 @@
+@@ -1508,12 +1624,39 @@
  }
  
  void
@@ -717,7 +719,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  	strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
  	if (selmon->sel)
  		arrange(selmon);
-@@ -1532,7 +1672,7 @@
+@@ -1532,7 +1675,7 @@
  	f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
  	if (f < 0.05 || f > 0.95)
  		return;
@@ -726,7 +728,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  	arrange(selmon);
  }
  
-@@ -1576,6 +1716,7 @@
+@@ -1576,6 +1719,7 @@
  	netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False);
  	netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False);
  	netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
@@ -734,7 +736,24 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  	netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False);
  	netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False);
  	netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False);
-@@ -1697,25 +1838,25 @@
+@@ -1633,14 +1777,12 @@
+ 		return;
+ 	if (ISVISIBLE(c)) {
+ 		/* show clients top down */
+-		XMoveWindow(dpy, c->win, c->x, c->y);
+-		if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen)
+-			resize(c, c->x, c->y, c->w, c->h, 0);
++		window_map(dpy, c, 1);
+ 		showhide(c->snext);
+ 	} else {
+ 		/* hide clients bottom up */
+ 		showhide(c->snext);
+-		XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y);
++		window_unmap(dpy, c->win, root, 1);
+ 	}
+ }
+ 
+@@ -1697,25 +1839,25 @@
  	if (n > m->nmaster)
  		mw = m->nmaster ? m->ww * m->mfact : 0;
  	else
@@ -772,7 +791,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  	updatebarpos(selmon);
  	XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
  	arrange(selmon);
-@@ -1736,6 +1877,15 @@
+@@ -1736,6 +1878,15 @@
  }
  
  void
@@ -788,7 +807,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  toggletag(const Arg *arg)
  {
  	unsigned int newtags;
-@@ -1754,9 +1904,33 @@
+@@ -1754,9 +1905,33 @@
  toggleview(const Arg *arg)
  {
  	unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
@@ -822,7 +841,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  		focus(NULL);
  		arrange(selmon);
  	}
-@@ -1781,6 +1955,20 @@
+@@ -1781,6 +1956,20 @@
  	Monitor *m = c->mon;
  	XWindowChanges wc;
  
@@ -843,7 +862,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  	detach(c);
  	detachstack(c);
  	if (!destroyed) {
-@@ -1796,9 +1984,12 @@
+@@ -1796,9 +1985,12 @@
  		XUngrabServer(dpy);
  	}
  	free(c);
@@ -859,7 +878,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  }
  
  void
-@@ -1916,6 +2107,7 @@
+@@ -1916,6 +2108,7 @@
  				detachstack(c);
  				c->mon = mons;
  				attach(c);
@@ -867,7 +886,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  				attachstack(c);
  			}
  			if (m == selmon)
-@@ -2025,10 +2217,13 @@
+@@ -2025,10 +2218,13 @@
  	Atom state = getatomprop(c, netatom[NetWMState]);
  	Atom wtype = getatomprop(c, netatom[NetWMWindowType]);
  
@@ -885,8 +904,55 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  }
  
  void
-@@ -2053,15 +2248,193 @@
+@@ -2051,17 +2247,240 @@
+ }
+ 
  void
++window_set_state(Display *dpy, Window win, long state)
++{
++	long data[] = { state, None };
++
++	XChangeProperty(dpy, win, wmatom[WMState], wmatom[WMState], 32,
++		PropModeReplace, (unsigned char*)data, 2);
++}
++
++void
++window_map(Display *dpy, Client *c, int deiconify)
++{
++	Window win = c->win;
++
++	if (deiconify)
++		window_set_state(dpy, win, NormalState);
++
++	XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
++	XSetInputFocus(dpy, win, RevertToPointerRoot, CurrentTime);
++	XMapWindow(dpy, win);
++}
++
++void
++window_unmap(Display *dpy, Window win, Window root, int iconify)
++{
++	static XWindowAttributes ca, ra;
++
++	XGrabServer(dpy);
++	XGetWindowAttributes(dpy, root, &ra);
++	XGetWindowAttributes(dpy, win, &ca);
++
++	/* Prevent UnmapNotify events */
++	XSelectInput(dpy, root, ra.your_event_mask & ~SubstructureNotifyMask);
++	XSelectInput(dpy, win, ca.your_event_mask & ~StructureNotifyMask);
++
++	XUnmapWindow(dpy, win);
++
++	if (iconify)
++		window_set_state(dpy, win, IconicState);
++
++	XSelectInput(dpy, root, ra.your_event_mask);
++	XSelectInput(dpy, win, ca.your_event_mask);
++	XUngrabServer(dpy);
++}
++
++void
  view(const Arg *arg)
  {
 +	int i;
@@ -1080,7 +1146,7 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  Client *
  wintoclient(Window w)
  {
-@@ -2151,10 +2524,12 @@
+@@ -2151,10 +2570,12 @@
  		fputs("warning: no locale support\n", stderr);
  	if (!(dpy = XOpenDisplay(NULL)))
  		die("dwm: cannot open display");
@@ -1094,14 +1160,14 @@ diff '--color=auto' -Nu a/dwm.c b/dwm.c
  		die("pledge");
  #endif /* __OpenBSD__ */
  	scan();
-@@ -2163,3 +2538,4 @@
+@@ -2163,3 +2584,4 @@
  	XCloseDisplay(dpy);
  	return EXIT_SUCCESS;
  }
 +
 diff '--color=auto' -Nu a/movestack.c b/movestack.c
 --- a/movestack.c	1969-12-31 18:00:00.000000000 -0600
-+++ b/movestack.c	2024-04-28 21:58:33.535704620 -0600
++++ b/movestack.c	2024-05-02 21:39:10.487748219 -0600
 @@ -0,0 +1,48 @@
 +void
 +movestack(const Arg *arg) {