diff --git a/Makefile b/Makefile index 48a0aa7..0c2b78d 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) @@ -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 diff --git a/client.h b/client.h index 1796ef0..f27be2a 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 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.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 f4ce462..40ace0c 100644 --- a/dwl.c +++ b/dwl.c @@ -475,8 +475,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; } } @@ -516,7 +519,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) { @@ -615,6 +618,7 @@ closemon(Monitor *m) if (c->mon == m) setmon(c, selmon, c->tags); } + printstatus(); } void @@ -1013,10 +1017,22 @@ 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), - 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); @@ -2227,11 +2243,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 */ @@ -2402,9 +2418,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; } @@ -2420,5 +2438,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]); } 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