From b86fcf6504e7b6aafcace2e099d2de822c25fbf3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?=
 <leohdz172@protonmail.com>
Date: Sun, 10 Apr 2022 21:38:48 -0500
Subject: [PATCH 1/9] add missing return in client_is_floating_type()

This causes all Xwayland clients to be treated as floating
---
 client.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/client.h b/client.h
index 41c9b9a..2ea0d22 100644
--- a/client.h
+++ b/client.h
@@ -113,6 +113,8 @@ client_is_float_type(Client *c)
 				&& (size_hints->max_width == size_hints->min_width ||
 				size_hints->max_height == size_hints->min_height))
 			return 1;
+
+		return 0;
 	}
 #endif
 

From a48ce99e6a3c0dda331781942995a85ba8e438a0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?=
 <leohdz172@protonmail.com>
Date: Fri, 15 Apr 2022 17:40:02 -0500
Subject: [PATCH 2/9] use pointer math in xytonode()

---
 dwl.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/dwl.c b/dwl.c
index b09fc6f..88043d8 100644
--- a/dwl.c
+++ b/dwl.c
@@ -2344,11 +2344,11 @@ xytonode(double x, double y, struct wlr_surface **psurface,
 	struct wlr_surface *surface = NULL;
 	Client *c = NULL;
 	LayerSurface *l = NULL;
-	int i;
+	const int *layer;
 	int focus_order[] = { LyrOverlay, LyrTop, LyrFloat, LyrTile, LyrBottom, LyrBg };
 
-	for (i = 0; i < LENGTH(focus_order); i++) {
-		if ((node = wlr_scene_node_at(layers[focus_order[i]], x, y, nx, ny))) {
+	for (layer = focus_order; layer < END(focus_order); layer++) {
+		if ((node = wlr_scene_node_at(layers[*layer], x, y, nx, ny))) {
 			if (node->type == WLR_SCENE_NODE_SURFACE)
 				surface = wlr_scene_surface_from_node(node)->surface;
 			/* Walk the tree to find a node that knows the client */

From d071a899f3b302f3fbaa85c378d0854b7fa39e8e Mon Sep 17 00:00:00 2001
From: Ben Jargowsky <benjar63@gmail.com>
Date: Mon, 25 Apr 2022 13:48:41 -0700
Subject: [PATCH 3/9] Run printstatus() when a monitor is removed

---
 dwl.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/dwl.c b/dwl.c
index 88043d8..0628bfb 100644
--- a/dwl.c
+++ b/dwl.c
@@ -740,6 +740,7 @@ closemon(Monitor *m)
 		if (c->mon == m)
 			setmon(c, selmon, c->tags);
 	}
+	printstatus();
 }
 
 void

From 3a4b7d104ff8bfc14862b7e41bcacb35677306a4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?=
 <leohdz172@protonmail.com>
Date: Sun, 3 Apr 2022 17:18:05 -0500
Subject: [PATCH 4/9] restack xwayland surface on focusclient()

---
 dwl.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/dwl.c b/dwl.c
index 0628bfb..b675b67 100644
--- a/dwl.c
+++ b/dwl.c
@@ -1135,6 +1135,15 @@ focusclient(Client *c, int lift)
 		return;
 	}
 
+#ifdef XWAYLAND
+	/* This resolves an issue where the last spawned xwayland client
+	 * receives all pointer activity.
+	 */
+	if (c->type == X11Managed)
+		wlr_xwayland_surface_restack(c->surface.xwayland, NULL,
+				XCB_STACK_MODE_ABOVE);
+#endif
+
 	/* Have a client, so focus its top-level wlr_surface */
 	kb = wlr_seat_get_keyboard(seat);
 	wlr_seat_keyboard_notify_enter(seat, client_surface(c),

From e0d310fd84eb4fa34527f6695c998ce9f5eb56d6 Mon Sep 17 00:00:00 2001
From: Ben Jargowsky <benjar63@gmail.com>
Date: Tue, 5 Apr 2022 23:22:15 -0700
Subject: [PATCH 5/9] Handle 'wlr_seat_get_keyboard' possibly returning null.

---
 dwl.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/dwl.c b/dwl.c
index b675b67..74b11a8 100644
--- a/dwl.c
+++ b/dwl.c
@@ -600,8 +600,11 @@ arrangelayers(Monitor *m)
 					layersurface->layer_surface->mapped) {
 				/* Deactivate the focused client. */
 				focusclient(NULL, 0);
-				wlr_seat_keyboard_notify_enter(seat, layersurface->layer_surface->surface,
-						kb->keycodes, kb->num_keycodes, &kb->modifiers);
+				if (kb) 
+					wlr_seat_keyboard_notify_enter(seat, layersurface->layer_surface->surface,
+							kb->keycodes, kb->num_keycodes, &kb->modifiers);
+				else 
+					wlr_seat_keyboard_notify_enter(seat, layersurface->layer_surface->surface, NULL, 0, NULL);
 				return;
 			}
 		}
@@ -641,7 +644,7 @@ buttonpress(struct wl_listener *listener, void *data)
 			focusclient(c, 1);
 
 		keyboard = wlr_seat_get_keyboard(seat);
-		mods = wlr_keyboard_get_modifiers(keyboard);
+		mods = keyboard ? wlr_keyboard_get_modifiers(keyboard) : 0;
 		for (b = buttons; b < END(buttons); b++) {
 			if (CLEANMASK(mods) == CLEANMASK(b->mod) &&
 					event->button == b->button && b->func) {
@@ -1146,8 +1149,11 @@ focusclient(Client *c, int lift)
 
 	/* Have a client, so focus its top-level wlr_surface */
 	kb = wlr_seat_get_keyboard(seat);
-	wlr_seat_keyboard_notify_enter(seat, client_surface(c),
-			kb->keycodes, kb->num_keycodes, &kb->modifiers);
+	if (kb) 
+		wlr_seat_keyboard_notify_enter(seat, client_surface(c),
+				kb->keycodes, kb->num_keycodes, &kb->modifiers);
+	else 
+		wlr_seat_keyboard_notify_enter(seat, client_surface(c), NULL, 0, NULL);
 
 	/* Activate the new client */
 	client_activate_surface(client_surface(c), 1);

From 5d8084daa7812931b53d65312b2cebf9a8453e49 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?=
 <leohdz172@protonmail.com>
Date: Mon, 9 May 2022 14:52:03 -0500
Subject: [PATCH 6/9] add flag to print version and exit

---
 Makefile            |  2 +-
 config.mk           |  3 +++
 dwl.c               |  4 +++-
 generate-version.sh | 13 +++++++++++++
 4 files changed, 20 insertions(+), 2 deletions(-)
 create mode 100755 generate-version.sh

diff --git a/Makefile b/Makefile
index 48a0aa7..c235633 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 include config.mk
 
-CFLAGS += -I. -DWLR_USE_UNSTABLE -std=c99 -pedantic
+CFLAGS += -I. -DWLR_USE_UNSTABLE -std=c99 -pedantic -DVERSION=\"$(VERSION)\"
 
 WAYLAND_PROTOCOLS=$(shell pkg-config --variable=pkgdatadir wayland-protocols)
 WAYLAND_SCANNER=$(shell pkg-config --variable=wayland_scanner wayland-scanner)
diff --git a/config.mk b/config.mk
index 960fc8a..37b4114 100644
--- a/config.mk
+++ b/config.mk
@@ -1,3 +1,6 @@
+_VERSION = 0.3.1
+VERSION = $(shell ./generate-version.sh $(_VERSION))
+
 # paths
 PREFIX = /usr/local
 MANDIR = $(PREFIX)/share/man
diff --git a/dwl.c b/dwl.c
index 74b11a8..48eb1a3 100644
--- a/dwl.c
+++ b/dwl.c
@@ -2516,9 +2516,11 @@ main(int argc, char *argv[])
 	char *startup_cmd = NULL;
 	int c;
 
-	while ((c = getopt(argc, argv, "s:h")) != -1) {
+	while ((c = getopt(argc, argv, "s:hv")) != -1) {
 		if (c == 's')
 			startup_cmd = optarg;
+		else if (c == 'v')
+			die("dwl " VERSION);
 		else
 			goto usage;
 	}
diff --git a/generate-version.sh b/generate-version.sh
new file mode 100755
index 0000000..cf408e1
--- /dev/null
+++ b/generate-version.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+if git tag --contains HEAD | grep -q $1; then
+	echo $1
+else
+	branch="$(git rev-parse --abbrev-ref HEAD)"
+	commit="$(git rev-parse --short HEAD)"
+	if [ "${branch}" != "main" ]; then
+		echo $1-$branch-$commit
+	else
+		echo $1-$commit
+	fi
+fi

From d5a741c9b47f744428e75a76b9f5f6410acfbcf3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?=
 <leohdz172@protonmail.com>
Date: Mon, 9 May 2022 15:20:37 -0500
Subject: [PATCH 7/9] add dist target

---
 Makefile | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index c235633..0c2b78d 100644
--- a/Makefile
+++ b/Makefile
@@ -14,6 +14,15 @@ all: dwl
 clean:
 	rm -f dwl *.o *-protocol.h *-protocol.c
 
+dist: clean
+	mkdir -p dwl-$(VERSION)
+	cp -R LICENSE* Makefile README.md generate-version.sh client.h\
+		config.def.h config.mk protocols dwl.1 dwl.c util.c util.h\
+		dwl-$(VERSION)
+	echo "echo $(VERSION)" > dwl-$(VERSION)/generate-version.sh
+	tar -caf dwl-$(VERSION).tar.gz dwl-$(VERSION)
+	rm -rf dwl-$(VERSION)
+
 install: dwl
 	install -Dm755 dwl $(DESTDIR)$(PREFIX)/bin/dwl
 	install -Dm644 dwl.1 $(DESTDIR)$(MANDIR)/man1/dwl.1
@@ -21,7 +30,7 @@ install: dwl
 uninstall:
 	rm -f $(DESTDIR)$(PREFIX)/bin/dwl $(DESTDIR)$(MANDIR)/man1/dwl.1
 
-.PHONY: all clean install uninstall
+.PHONY: all clean dist install uninstall
 
 # wayland-scanner is a tool which generates C headers and rigging for Wayland
 # protocols, which are specified in XML. wlroots requires you to rig these up

From 063736f8981c5f71b816f4e8ab2ab54618c3ee8d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?=
 <leohdz172@protonmail.com>
Date: Tue, 10 May 2022 11:39:33 -0500
Subject: [PATCH 8/9] add `-v` flag to the manpage

Thanks @Humm42
---
 dwl.1 | 7 +++++++
 dwl.c | 2 +-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/dwl.1 b/dwl.1
index eea0f70..f50602c 100644
--- a/dwl.1
+++ b/dwl.1
@@ -6,6 +6,7 @@
 .Nd dwm for Wayland
 .Sh SYNOPSIS
 .Nm
+.Op Fl v
 .Op Fl s Ar command
 .Sh DESCRIPTION
 .Nm
@@ -15,6 +16,12 @@ It is intended to fill the same space in the Wayland world that
 does for X11.
 .Pp
 When given the
+.Fl v
+option,
+.Nm
+writes its name and version to standard error and exits unsuccessfully.
+.Pp
+When given the
 .Fl s
 option,
 .Nm
diff --git a/dwl.c b/dwl.c
index 48eb1a3..3ebe37a 100644
--- a/dwl.c
+++ b/dwl.c
@@ -2536,5 +2536,5 @@ main(int argc, char *argv[])
 	return EXIT_SUCCESS;
 
 usage:
-	die("Usage: %s [-s startup command]", argv[0]);
+	die("Usage: %s [-v] [-s startup command]", argv[0]);
 }

From 22bd75226bc897a3b2ad90f36883ff489d435eb4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?=
 <leohdz172@protonmail.com>
Date: Tue, 10 May 2022 11:42:40 -0500
Subject: [PATCH 9/9] remove trailing whitespaces

---
 dwl.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/dwl.c b/dwl.c
index 3ebe37a..8088d9f 100644
--- a/dwl.c
+++ b/dwl.c
@@ -600,10 +600,10 @@ arrangelayers(Monitor *m)
 					layersurface->layer_surface->mapped) {
 				/* Deactivate the focused client. */
 				focusclient(NULL, 0);
-				if (kb) 
+				if (kb)
 					wlr_seat_keyboard_notify_enter(seat, layersurface->layer_surface->surface,
 							kb->keycodes, kb->num_keycodes, &kb->modifiers);
-				else 
+				else
 					wlr_seat_keyboard_notify_enter(seat, layersurface->layer_surface->surface, NULL, 0, NULL);
 				return;
 			}
@@ -1149,10 +1149,10 @@ focusclient(Client *c, int lift)
 
 	/* Have a client, so focus its top-level wlr_surface */
 	kb = wlr_seat_get_keyboard(seat);
-	if (kb) 
+	if (kb)
 		wlr_seat_keyboard_notify_enter(seat, client_surface(c),
 				kb->keycodes, kb->num_keycodes, &kb->modifiers);
-	else 
+	else
 		wlr_seat_keyboard_notify_enter(seat, client_surface(c), NULL, 0, NULL);
 
 	/* Activate the new client */