sway

i3-compatible Wayland compositor
git clone https://git.awy.one/sway
Log | Files | Refs | README | LICENSE

commit 891e1148bee2575522312078f96eb4c41af49c6c
parent 21aedf15052df4e7f8ee72922fa0e214d690facc
Author: Drew DeVault <sir@cmpwn.com>
Date:   Wed,  4 Apr 2018 23:06:42 -0400

Merge pull request #1733 from acrisci/fix-focus-inactive

try to fix focus-inactive
Diffstat:
Msway/input/seat.c | 22+++++++++-------------
Msway/tree/container.c | 12+++++++++---
Msway/tree/layout.c | 10+++++-----
3 files changed, 23 insertions(+), 21 deletions(-)

diff --git a/sway/input/seat.c b/sway/input/seat.c @@ -126,7 +126,7 @@ static void handle_seat_container_destroy(struct wl_listener *listener, static struct sway_seat_container *seat_container_from_container( struct sway_seat *seat, struct sway_container *con) { - if (con->type < C_WORKSPACE) { + if (con->type == C_ROOT || con->type == C_OUTPUT) { // these don't get seat containers ever return NULL; } @@ -534,22 +534,18 @@ struct sway_container *sway_seat_get_focus(struct sway_seat *seat) { struct sway_container *seat_get_focus_by_type(struct sway_seat *seat, struct sway_container *container, enum sway_container_type type) { + if (container->type == C_VIEW || container->children->length == 0) { + return container; + } + struct sway_seat_container *current = NULL; - struct sway_container *parent = NULL; wl_list_for_each(current, &seat->focus_stack, link) { - parent = current->container->parent; - - if (current->container == container && - (type == C_TYPES || container->type == type)) { - return current->container; + if (current->container->type != type && type != C_TYPES) { + continue; } - while (parent) { - if (parent == container && (type == C_TYPES || - current->container->type == type)) { - return current->container; - } - parent = parent->parent; + if (container_has_child(container, current->container)) { + return current->container; } } diff --git a/sway/tree/container.c b/sway/tree/container.c @@ -53,10 +53,16 @@ const char *container_type_to_str(enum sway_container_type type) { void container_create_notify(struct sway_container *container) { // TODO send ipc event type based on the container type wl_signal_emit(&root_container.sway_root->events.new_container, container); - ipc_event_window(container, "new"); + + if (container->type == C_VIEW || container->type == C_CONTAINER) { + ipc_event_window(container, "new"); + } } static void container_close_notify(struct sway_container *container) { + if (container == NULL) { + return; + } // TODO send ipc event type based on the container type ipc_event_window(container, "close"); } @@ -506,8 +512,8 @@ static bool find_child_func(struct sway_container *con, void *data) { bool container_has_child(struct sway_container *con, struct sway_container *child) { - if (child == NULL || child->type == C_VIEW || - child->children->length == 0) { + if (con == NULL || con->type == C_VIEW || + con->children->length == 0) { return false; } return container_find(con, find_child_func, child); diff --git a/sway/tree/layout.c b/sway/tree/layout.c @@ -638,16 +638,16 @@ struct sway_container *container_get_in_direction( wrap_candidate = parent->children->items[0]; } if (config->force_focus_wrapping) { - return seat_get_focus_by_type(seat, - wrap_candidate, C_VIEW); + return wrap_candidate; } } } else { + struct sway_container *desired_con = parent->children->items[desired]; wlr_log(L_DEBUG, "cont %d-%p dir %i sibling %d: %p", idx, - container, dir, desired, parent->children->items[desired]); - return seat_get_focus_by_type(seat, - parent->children->items[desired], C_VIEW); + container, dir, desired, desired_con); + struct sway_container *next = seat_get_focus_by_type(seat, desired_con, C_VIEW); + return next; } }