~ruther/dwl

a571ea465c545f662c4bc9899a31150e045074d0 — Guido Cella 4 years ago 39946e0
replace shouldfocusclients with checking old

And don't activate clients while an overlay is focused.
1 files changed, 24 insertions(+), 27 deletions(-)

M dwl.c
M dwl.c => dwl.c +24 -27
@@ 275,7 275,6 @@ static void setmfact(const Arg *arg);
static void setmon(Client *c, Monitor *m, unsigned int newtags);
static void setup(void);
static void sigchld(int unused);
static bool shouldfocusclients();
static void spawn(const Arg *arg);
static void tag(const Arg *arg);
static void tagmon(const Arg *arg);


@@ 1119,10 1118,16 @@ focusclient(Client *c, bool lift)

	struct wlr_surface *old = seat->keyboard_state.focused_surface;

	/* Nothing else to do? */
	if (c && WLR_SURFACE(c) == old)
		return;

	/* Put the new client atop the focus stack and select its monitor */
	if (c) {
		wl_list_remove(&c->flink);
		wl_list_insert(&fstack, &c->flink);
		selmon = c->mon;
	}

	/* Deactivate old client if focus is changing */
	if (old && (!c || WLR_SURFACE(c) != old)) {
		if (wlr_surface_is_xdg_surface(old))


@@ 1133,9 1138,23 @@ focusclient(Client *c, bool lift)
			wlr_xwayland_surface_activate(
					wlr_xwayland_surface_from_wlr_surface(old), false);
#endif
		/* If an overlay is focused, don't focus or activate the client,
		 * but only update its position in fstack to render its border with focuscolor
		 * and focus it after the overlay is closed.
		 * It's probably pointless to check if old is a layer surface
		 * since it can't be anything else at this point. */
		else if (wlr_surface_is_layer_surface(old)) {
			struct wlr_layer_surface_v1 *wlr_layer_surface =
				wlr_layer_surface_v1_from_wlr_surface(old);

			if (wlr_layer_surface->mapped && (
						wlr_layer_surface->current.layer == ZWLR_LAYER_SHELL_V1_LAYER_TOP ||
						wlr_layer_surface->current.layer == ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY
						))
				return;
		}
	}

	/* Update wlroots' keyboard focus */
	if (!c) {
		/* With no client, all we have left is to clear focus */
		wlr_seat_keyboard_notify_clear_focus(seat);


@@ 1144,14 1163,8 @@ focusclient(Client *c, bool lift)

	/* Have a client, so focus its top-level wlr_surface */
	struct wlr_keyboard *kb = wlr_seat_get_keyboard(seat);
	if (shouldfocusclients(c->mon))
		wlr_seat_keyboard_notify_enter(seat, WLR_SURFACE(c),
				kb->keycodes, kb->num_keycodes, &kb->modifiers);

	/* Put the new client atop the focus stack and select its monitor */
	wl_list_remove(&c->flink);
	wl_list_insert(&fstack, &c->flink);
	selmon = c->mon;
	wlr_seat_keyboard_notify_enter(seat, WLR_SURFACE(c),
			kb->keycodes, kb->num_keycodes, &kb->modifiers);

	/* Activate the new client */
#ifdef XWAYLAND


@@ 2167,22 2180,6 @@ sigchld(int unused)
		;
}

bool
shouldfocusclients(Monitor *m)
{
	LayerSurface *layersurface;
	uint32_t layers_above_shell[] = {
		ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY,
		ZWLR_LAYER_SHELL_V1_LAYER_TOP,
	};
	for (size_t i = 0; i < LENGTH(layers_above_shell); ++i)
		wl_list_for_each(layersurface, &m->layers[layers_above_shell[i]], link)
			if (layersurface->layer_surface->current.keyboard_interactive &&
					layersurface->layer_surface->mapped)
				return false;
	return true;
}

void
spawn(const Arg *arg)
{

Do not follow this link