aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/container.h8
-rw-r--r--sway/container.c17
-rw-r--r--sway/focus.c7
-rw-r--r--sway/handlers.c3
4 files changed, 27 insertions, 8 deletions
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;
}