aboutsummaryrefslogtreecommitdiffstats
path: root/sway/input/seat.c
diff options
context:
space:
mode:
authorLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-07-26 22:58:42 +1000
committerLibravatar Ryan Dwyer <ryandwyer1@gmail.com>2018-07-28 22:41:04 +1000
commitda2a87f6c71bfe90a4d77542bfc7ed22899f67be (patch)
tree76cb0dcdd9006bbec11321645e096ea47cd79e82 /sway/input/seat.c
parentOperate on floating split container when a child is focused (diff)
downloadsway-da2a87f6c71bfe90a4d77542bfc7ed22899f67be.tar.gz
sway-da2a87f6c71bfe90a4d77542bfc7ed22899f67be.tar.zst
sway-da2a87f6c71bfe90a4d77542bfc7ed22899f67be.zip
When unfloating, return container to previously focused tiled container
This introduces seat_get_focus_inactive_tiling and updates `focus mode_toggle` to use it instead, because the previous method wasn't guaranteed to return a tiling view.
Diffstat (limited to 'sway/input/seat.c')
-rw-r--r--sway/input/seat.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/sway/input/seat.c b/sway/input/seat.c
index 877a93c6..18d5591d 100644
--- a/sway/input/seat.c
+++ b/sway/input/seat.c
@@ -124,12 +124,14 @@ static void seat_send_focus(struct sway_container *con,
124} 124}
125 125
126static struct sway_container *seat_get_focus_by_type(struct sway_seat *seat, 126static struct sway_container *seat_get_focus_by_type(struct sway_seat *seat,
127 struct sway_container *container, enum sway_container_type type) { 127 struct sway_container *container, enum sway_container_type type,
128 bool only_tiling) {
128 if (container->type == C_VIEW) { 129 if (container->type == C_VIEW) {
129 return container; 130 return container;
130 } 131 }
131 132
132 struct sway_container *floating = container->type == C_WORKSPACE ? 133 struct sway_container *floating =
134 container->type == C_WORKSPACE && !only_tiling ?
133 container->sway_workspace->floating : NULL; 135 container->sway_workspace->floating : NULL;
134 if (container->children->length == 0 && 136 if (container->children->length == 0 &&
135 (!floating || floating->children->length == 0)) { 137 (!floating || floating->children->length == 0)) {
@@ -143,6 +145,10 @@ static struct sway_container *seat_get_focus_by_type(struct sway_seat *seat,
143 } 145 }
144 146
145 if (container_has_child(container, current->container)) { 147 if (container_has_child(container, current->container)) {
148 if (only_tiling &&
149 container_is_floating_or_child(current->container)) {
150 continue;
151 }
146 return current->container; 152 return current->container;
147 } 153 }
148 if (floating && container_has_child(floating, current->container)) { 154 if (floating && container_has_child(floating, current->container)) {
@@ -169,7 +175,7 @@ void seat_focus_inactive_children_for_each(struct sway_seat *seat,
169 175
170struct sway_container *seat_get_focus_inactive_view(struct sway_seat *seat, 176struct sway_container *seat_get_focus_inactive_view(struct sway_seat *seat,
171 struct sway_container *container) { 177 struct sway_container *container) {
172 return seat_get_focus_by_type(seat, container, C_VIEW); 178 return seat_get_focus_by_type(seat, container, C_VIEW, false);
173} 179}
174 180
175static void handle_seat_container_destroy(struct wl_listener *listener, 181static void handle_seat_container_destroy(struct wl_listener *listener,
@@ -191,7 +197,7 @@ static void handle_seat_container_destroy(struct wl_listener *listener,
191 if (set_focus) { 197 if (set_focus) {
192 struct sway_container *next_focus = NULL; 198 struct sway_container *next_focus = NULL;
193 while (next_focus == NULL) { 199 while (next_focus == NULL) {
194 next_focus = seat_get_focus_by_type(seat, parent, C_VIEW); 200 next_focus = seat_get_focus_by_type(seat, parent, C_VIEW, false);
195 201
196 if (next_focus == NULL && parent->type == C_WORKSPACE) { 202 if (next_focus == NULL && parent->type == C_WORKSPACE) {
197 next_focus = parent; 203 next_focus = parent;
@@ -648,7 +654,7 @@ void seat_set_focus_warp(struct sway_seat *seat,
648 struct sway_container *new_output_last_ws = NULL; 654 struct sway_container *new_output_last_ws = NULL;
649 if (last_output && new_output && last_output != new_output) { 655 if (last_output && new_output && last_output != new_output) {
650 new_output_last_ws = 656 new_output_last_ws =
651 seat_get_focus_by_type(seat, new_output, C_WORKSPACE); 657 seat_get_focus_by_type(seat, new_output, C_WORKSPACE, false);
652 } 658 }
653 659
654 if (container && container->parent) { 660 if (container && container->parent) {
@@ -853,7 +859,12 @@ void seat_set_exclusive_client(struct sway_seat *seat,
853 859
854struct sway_container *seat_get_focus_inactive(struct sway_seat *seat, 860struct sway_container *seat_get_focus_inactive(struct sway_seat *seat,
855 struct sway_container *container) { 861 struct sway_container *container) {
856 return seat_get_focus_by_type(seat, container, C_TYPES); 862 return seat_get_focus_by_type(seat, container, C_TYPES, false);
863}
864
865struct sway_container *seat_get_focus_inactive_tiling(struct sway_seat *seat,
866 struct sway_container *container) {
867 return seat_get_focus_by_type(seat, container, C_TYPES, true);
857} 868}
858 869
859struct sway_container *seat_get_active_child(struct sway_seat *seat, 870struct sway_container *seat_get_active_child(struct sway_seat *seat,