aboutsummaryrefslogtreecommitdiff
path: root/sway/tree
diff options
context:
space:
mode:
authorRyan Dwyer <ryandwyer1@gmail.com>2018-07-16 22:18:12 +1000
committerRyan Dwyer <ryandwyer1@gmail.com>2018-07-16 22:18:12 +1000
commitfc2484095a71206fe82f5042c0d127458a8da3bc (patch)
treec1d10d53e34eac84a7083db3591de17c5fdcf16e /sway/tree
parenta588b326c24c65a691596bc9eb72ce9080d9de91 (diff)
Implement no_focus command
Diffstat (limited to 'sway/tree')
-rw-r--r--sway/tree/view.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/sway/tree/view.c b/sway/tree/view.c
index bf380d98..bc66a701 100644
--- a/sway/tree/view.c
+++ b/sway/tree/view.c
@@ -518,6 +518,26 @@ void view_execute_criteria(struct sway_view *view) {
seat_set_focus(seat, prior_focus);
}
+static bool should_focus(struct sway_view *view) {
+ // If the view is the only one in the focused workspace, it'll get focus
+ // regardless of any no_focus criteria.
+ struct sway_container *parent = view->swayc->parent;
+ struct sway_seat *seat = input_manager_current_seat(input_manager);
+ if (parent->type == C_WORKSPACE && seat_get_focus(seat) == parent) {
+ size_t num_children = parent->children->length +
+ parent->sway_workspace->floating->children->length;
+ if (num_children == 1) {
+ return true;
+ }
+ }
+
+ // Check no_focus criteria
+ list_t *criterias = criteria_for_view(view, CT_NO_FOCUS);
+ size_t len = criterias->length;
+ list_free(criterias);
+ return len == 0;
+}
+
void view_map(struct sway_view *view, struct wlr_surface *wlr_surface) {
if (!sway_assert(view->surface == NULL, "cannot map mapped view")) {
return;
@@ -571,9 +591,11 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface) {
view_set_tiled(view, true);
}
- input_manager_set_focus(input_manager, cont);
- if (workspace) {
- workspace_switch(workspace);
+ if (should_focus(view)) {
+ input_manager_set_focus(input_manager, cont);
+ if (workspace) {
+ workspace_switch(workspace);
+ }
}
view_update_title(view, false);