tree/container: introduce container_toplevel_ancestor helper

This allows us to not have to explicitly write the same while loop
everywhere.
This commit is contained in:
Tudor Brindus 2020-06-04 14:28:43 -04:00 committed by Simon Ser
parent d7900c6e5e
commit 53dc83fb68
3 changed files with 19 additions and 17 deletions

View file

@ -272,6 +272,13 @@ void container_set_fullscreen(struct sway_container *con,
*/ */
void container_fullscreen_disable(struct sway_container *con); void container_fullscreen_disable(struct sway_container *con);
/**
* Walk up the container tree branch starting at the given container, and return
* its earliest ancestor.
*/
struct sway_container *container_toplevel_ancestor(
struct sway_container *container);
/** /**
* Return true if the container is floating, or a child of a floating split * Return true if the container is floating, or a child of a floating split
* container. * container.

View file

@ -338,10 +338,7 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec,
if (button == btn_move && (mod_pressed || on_titlebar)) { if (button == btn_move && (mod_pressed || on_titlebar)) {
seat_set_focus_container(seat, seat_set_focus_container(seat,
seat_get_focus_inactive_view(seat, &cont->node)); seat_get_focus_inactive_view(seat, &cont->node));
while (cont->parent) { seatop_begin_move_floating(seat, container_toplevel_ancestor(cont));
cont = cont->parent;
}
seatop_begin_move_floating(seat, cont);
return; return;
} }
} }
@ -359,10 +356,7 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec,
uint32_t btn_resize = config->floating_mod_inverse ? uint32_t btn_resize = config->floating_mod_inverse ?
BTN_LEFT : BTN_RIGHT; BTN_LEFT : BTN_RIGHT;
if (mod_pressed && button == btn_resize) { if (mod_pressed && button == btn_resize) {
struct sway_container *floater = cont; struct sway_container *floater = container_toplevel_ancestor(cont);
while (floater->parent) {
floater = floater->parent;
}
edge = 0; edge = 0;
edge |= cursor->cursor->x > floater->x + floater->width / 2 ? edge |= cursor->cursor->x > floater->x + floater->width / 2 ?
WLR_EDGE_RIGHT : WLR_EDGE_LEFT; WLR_EDGE_RIGHT : WLR_EDGE_LEFT;

View file

@ -1108,11 +1108,17 @@ void container_set_fullscreen(struct sway_container *con,
} }
} }
bool container_is_floating_or_child(struct sway_container *container) { struct sway_container *container_toplevel_ancestor(
struct sway_container *container) {
while (container->parent) { while (container->parent) {
container = container->parent; container = container->parent;
} }
return container_is_floating(container);
return container;
}
bool container_is_floating_or_child(struct sway_container *container) {
return container_is_floating(container_toplevel_ancestor(container));
} }
bool container_is_fullscreen_or_child(struct sway_container *container) { bool container_is_fullscreen_or_child(struct sway_container *container) {
@ -1537,10 +1543,7 @@ void container_update_marks_textures(struct sway_container *con) {
void container_raise_floating(struct sway_container *con) { void container_raise_floating(struct sway_container *con) {
// Bring container to front by putting it at the end of the floating list. // Bring container to front by putting it at the end of the floating list.
struct sway_container *floater = con; struct sway_container *floater = container_toplevel_ancestor(con);
while (floater->parent) {
floater = floater->parent;
}
if (container_is_floating(floater) && floater->workspace) { if (container_is_floating(floater) && floater->workspace) {
list_move_to_end(floater->workspace->floating, floater); list_move_to_end(floater->workspace->floating, floater);
node_set_dirty(&floater->workspace->node); node_set_dirty(&floater->workspace->node);
@ -1552,8 +1555,6 @@ bool container_is_scratchpad_hidden(struct sway_container *con) {
} }
bool container_is_scratchpad_hidden_or_child(struct sway_container *con) { bool container_is_scratchpad_hidden_or_child(struct sway_container *con) {
while (con->parent) { con = container_toplevel_ancestor(con);
con = con->parent;
}
return con->scratchpad && !con->workspace; return con->scratchpad && !con->workspace;
} }