diff options
| author | Guido Cella <guido@guidocella.xyz> | 2020-12-20 15:19:34 +0100 | 
|---|---|---|
| committer | Guido Cella <guido@guidocella.xyz> | 2020-12-20 15:46:31 +0100 | 
| commit | a571ea465c545f662c4bc9899a31150e045074d0 (patch) | |
| tree | 873e58c14e86d075dd7b0707cf04cb6104106364 /dwl.c | |
| parent | 39946e07f2b2ac09cfa622668585f2223fc277d4 (diff) | |
replace shouldfocusclients with checking old
And don't activate clients while an overlay is focused.
Diffstat (limited to 'dwl.c')
| -rw-r--r-- | dwl.c | 51 | 
1 files changed, 24 insertions, 27 deletions
| @@ -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)  { | 
