diff --git a/include/container.h b/include/container.h index aadba5de..f684129a 100644 --- a/include/container.h +++ b/include/container.h @@ -56,6 +56,11 @@ struct sway_container { struct sway_container *focused; }; +enum view_visibility { + INVISIBLE = 1, + VISIBLE = 2 +}; + // Container Creation swayc_t *new_output(wlc_handle handle); @@ -106,4 +111,7 @@ void container_map(swayc_t *, void (*f)(swayc_t *, void *), void *); void set_view_visibility(swayc_t *view, void *data); void reset_gaps(swayc_t *view, void *data); + +void update_visibility(swayc_t *container); + #endif diff --git a/sway/container.c b/sway/container.c index d23cef8f..666d6a2c 100644 --- a/sway/container.c +++ b/sway/container.c @@ -520,16 +520,25 @@ void set_view_visibility(swayc_t *view, void *data) { if (!ASSERT_NONNULL(view)) { return; } - uint32_t *p = data; + uint32_t mask = *(uint32_t *)data; if (view->type == C_VIEW) { - wlc_view_set_mask(view->handle, *p); - if (*p == 2) { + wlc_view_set_mask(view->handle, mask); + if (mask & VISIBLE) { wlc_view_bring_to_front(view->handle); } else { wlc_view_send_to_back(view->handle); } } - view->visible = (*p == 2); + view->visible = mask & VISIBLE; + sway_log(L_DEBUG, "Container %p is now %s", view, view->visible ? "visible" : "invisible"); +} + +void update_visibility(swayc_t *container) { + swayc_t *ws = swayc_active_workspace_for(container); + bool visible = ws->parent->focused == container; + uint32_t mask = visible ? VISIBLE : INVISIBLE; + sway_log(L_DEBUG, "Setting visibility of container %p to %s", container, visible ? "visible" : "invisible"); + container_map(ws, set_view_visibility, &mask); } void reset_gaps(swayc_t *view, void *data) { diff --git a/sway/focus.c b/sway/focus.c index e369de30..823eefa2 100644 --- a/sway/focus.c +++ b/sway/focus.c @@ -28,12 +28,11 @@ static void update_focus(swayc_t *c) { if (parent->focused) { swayc_t *ws = parent->focused; // hide visibility of old workspace - uint32_t mask = 1; + uint32_t mask = INVISIBLE; container_map(ws, set_view_visibility, &mask); // set visibility of new workspace - mask = 2; + mask = VISIBLE; container_map(c, set_view_visibility, &mask); - wlc_output_set_mask(parent->handle, 2); destroy_workspace(ws); } break; @@ -45,8 +44,8 @@ static void update_focus(swayc_t *c) { // for example, stacked and tabbing change stuff. break; } + c->parent->focused = c; } - c->parent->focused = c; } bool move_focus(enum movement_direction direction) { diff --git a/sway/handlers.c b/sway/handlers.c index 3a4e31ae..8b3ae3c1 100644 --- a/sway/handlers.c +++ b/sway/handlers.c @@ -90,6 +90,9 @@ swayc_t *container_under_pointer(void) { static bool handle_output_created(wlc_handle output) { swayc_t *op = new_output(output); + // Visibilty mask to be able to make view invisible + wlc_output_set_mask(output, VISIBLE); + if (!op) { return false; }