aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
Diffstat (limited to 'sway')
-rw-r--r--sway/desktop/output.c19
-rw-r--r--sway/desktop/render.c37
-rw-r--r--sway/desktop/xdg_shell.c9
-rw-r--r--sway/desktop/xdg_shell_v6.c10
-rw-r--r--sway/input/cursor.c3
-rw-r--r--sway/tree/container.c134
-rw-r--r--sway/tree/view.c10
7 files changed, 46 insertions, 176 deletions
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index 66747a3f..31b53213 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -119,7 +119,7 @@ static void output_for_each_surface_iterator(struct wlr_surface *surface,
data->user_data);
}
-void output_surface_for_each_surface(struct sway_output *output,
+static void output_surface_for_each_surface(struct sway_output *output,
struct wlr_surface *surface, double ox, double oy,
sway_surface_iterator_func_t iterator, void *user_data) {
struct surface_iterator_data data = {
@@ -155,23 +155,6 @@ void output_view_for_each_surface(struct sway_output *output,
output_for_each_surface_iterator, &data);
}
-void output_view_for_each_popup(struct sway_output *output,
- struct sway_view *view, sway_surface_iterator_func_t iterator,
- void *user_data) {
- struct surface_iterator_data data = {
- .user_iterator = iterator,
- .user_data = user_data,
- .output = output,
- .ox = view->swayc->current.view_x - output->swayc->current.swayc_x,
- .oy = view->swayc->current.view_y - output->swayc->current.swayc_y,
- .width = view->swayc->current.view_width,
- .height = view->swayc->current.view_height,
- .rotation = 0, // TODO
- };
-
- view_for_each_popup(view, output_for_each_surface_iterator, &data);
-}
-
void output_layer_for_each_surface(struct sway_output *output,
struct wl_list *layer_surfaces, sway_surface_iterator_func_t iterator,
void *user_data) {
diff --git a/sway/desktop/render.c b/sway/desktop/render.c
index 1f374740..f0e47c95 100644
--- a/sway/desktop/render.c
+++ b/sway/desktop/render.c
@@ -186,36 +186,13 @@ static void premultiply_alpha(float color[4], float opacity) {
color[2] *= color[3];
}
-static void render_view_toplevels(struct sway_view *view,
+static void render_view_surfaces(struct sway_view *view,
struct sway_output *output, pixman_region32_t *damage, float alpha) {
struct render_data data = {
.damage = damage,
.alpha = alpha,
};
- // Render all toplevels without descending into popups
- output_surface_for_each_surface(output, view->surface,
- view->swayc->current.view_x, view->swayc->current.view_y,
- render_surface_iterator, &data);
-}
-
-static void render_popup_iterator(struct sway_output *output,
- struct wlr_surface *surface, struct wlr_box *box, float rotation,
- void *data) {
- // Render this popup's surface
- render_surface_iterator(output, surface, box, rotation, data);
-
- // Render this popup's child toplevels
- output_surface_for_each_surface(output, surface, box->x, box->y,
- render_surface_iterator, data);
-}
-
-static void render_view_popups(struct sway_view *view,
- struct sway_output *output, pixman_region32_t *damage, float alpha) {
- struct render_data data = {
- .damage = damage,
- .alpha = alpha,
- };
- output_view_for_each_popup(output, view, render_popup_iterator, &data);
+ output_view_for_each_surface(output, view, render_surface_iterator, &data);
}
static void render_saved_view(struct sway_view *view,
@@ -262,7 +239,7 @@ static void render_view(struct sway_output *output, pixman_region32_t *damage,
if (view->saved_buffer) {
render_saved_view(view, output, damage, view->swayc->alpha);
} else {
- render_view_toplevels(view, output, damage, view->swayc->alpha);
+ render_view_surfaces(view, output, damage, view->swayc->alpha);
}
if (view->using_csd) {
@@ -866,7 +843,7 @@ void output_render(struct sway_output *output, struct timespec *when,
render_saved_view(fullscreen_con->sway_view,
output, damage, 1.0f);
} else {
- render_view_toplevels(fullscreen_con->sway_view,
+ render_view_surfaces(fullscreen_con->sway_view,
output, damage, 1.0f);
}
} else {
@@ -902,12 +879,6 @@ void output_render(struct sway_output *output, struct timespec *when,
&output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]);
}
- struct sway_seat *seat = input_manager_current_seat(input_manager);
- struct sway_container *focus = seat_get_focus(seat);
- if (focus && focus->type == C_VIEW) {
- render_view_popups(focus->sway_view, output, damage, focus->alpha);
- }
-
render_overlay:
render_layer(output, damage,
&output->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY]);
diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c
index b364663d..9d6b27e5 100644
--- a/sway/desktop/xdg_shell.c
+++ b/sway/desktop/xdg_shell.c
@@ -179,14 +179,6 @@ static void for_each_surface(struct sway_view *view,
user_data);
}
-static void for_each_popup(struct sway_view *view,
- wlr_surface_iterator_func_t iterator, void *user_data) {
- if (xdg_shell_view_from_view(view) == NULL) {
- return;
- }
- wlr_xdg_surface_for_each_popup(view->wlr_xdg_surface, iterator, user_data);
-}
-
static void _close(struct sway_view *view) {
if (xdg_shell_view_from_view(view) == NULL) {
return;
@@ -227,7 +219,6 @@ static const struct sway_view_impl view_impl = {
.set_fullscreen = set_fullscreen,
.wants_floating = wants_floating,
.for_each_surface = for_each_surface,
- .for_each_popup = for_each_popup,
.close = _close,
.close_popups = close_popups,
.destroy = destroy,
diff --git a/sway/desktop/xdg_shell_v6.c b/sway/desktop/xdg_shell_v6.c
index ffea03ad..6e4aae62 100644
--- a/sway/desktop/xdg_shell_v6.c
+++ b/sway/desktop/xdg_shell_v6.c
@@ -175,15 +175,6 @@ static void for_each_surface(struct sway_view *view,
user_data);
}
-static void for_each_popup(struct sway_view *view,
- wlr_surface_iterator_func_t iterator, void *user_data) {
- if (xdg_shell_v6_view_from_view(view) == NULL) {
- return;
- }
- wlr_xdg_surface_v6_for_each_popup(view->wlr_xdg_surface_v6, iterator,
- user_data);
-}
-
static void _close(struct sway_view *view) {
if (xdg_shell_v6_view_from_view(view) == NULL) {
return;
@@ -224,7 +215,6 @@ static const struct sway_view_impl view_impl = {
.set_fullscreen = set_fullscreen,
.wants_floating = wants_floating,
.for_each_surface = for_each_surface,
- .for_each_popup = for_each_popup,
.close = _close,
.close_popups = close_popups,
.destroy = destroy,
diff --git a/sway/input/cursor.c b/sway/input/cursor.c
index 79f6ec46..d6fdc1da 100644
--- a/sway/input/cursor.c
+++ b/sway/input/cursor.c
@@ -109,6 +109,9 @@ static struct sway_container *container_at_coords(
}
struct sway_container *c;
+ if ((c = floating_container_at(lx, ly, surface, sx, sy))) {
+ return c;
+ }
if ((c = container_at(ws, lx, ly, surface, sx, sy))) {
return c;
}
diff --git a/sway/tree/container.c b/sway/tree/container.c
index b980c5e9..b6ff4d30 100644
--- a/sway/tree/container.c
+++ b/sway/tree/container.c
@@ -569,15 +569,10 @@ static struct sway_container *container_at_view(struct sway_container *swayc,
*sx = _sx;
*sy = _sy;
*surface = _surface;
- return swayc;
}
- return NULL;
+ return swayc;
}
-static struct sway_container *tiling_container_at(
- struct sway_container *con, double lx, double ly,
- struct wlr_surface **surface, double *sx, double *sy);
-
/**
* container_at for a container with layout L_TABBED.
*/
@@ -604,7 +599,7 @@ static struct sway_container *container_at_tabbed(struct sway_container *parent,
// Surfaces
struct sway_container *current = seat_get_active_child(seat, parent);
- return tiling_container_at(current, lx, ly, surface, sx, sy);
+ return container_at(current, lx, ly, surface, sx, sy);
}
/**
@@ -629,7 +624,7 @@ static struct sway_container *container_at_stacked(
// Surfaces
struct sway_container *current = seat_get_active_child(seat, parent);
- return tiling_container_at(current, lx, ly, surface, sx, sy);
+ return container_at(current, lx, ly, surface, sx, sy);
}
/**
@@ -647,13 +642,45 @@ static struct sway_container *container_at_linear(struct sway_container *parent,
.height = child->height,
};
if (wlr_box_contains_point(&box, lx, ly)) {
- return tiling_container_at(child, lx, ly, surface, sx, sy);
+ return container_at(child, lx, ly, surface, sx, sy);
}
}
return NULL;
}
-static struct sway_container *floating_container_at(double lx, double ly,
+struct sway_container *container_at(struct sway_container *parent,
+ double lx, double ly,
+ struct wlr_surface **surface, double *sx, double *sy) {
+ if (!sway_assert(parent->type >= C_WORKSPACE,
+ "Expected workspace or deeper")) {
+ return NULL;
+ }
+ if (parent->type == C_VIEW) {
+ return container_at_view(parent, lx, ly, surface, sx, sy);
+ }
+ if (!parent->children->length) {
+ return NULL;
+ }
+
+ switch (parent->layout) {
+ case L_HORIZ:
+ case L_VERT:
+ return container_at_linear(parent, lx, ly, surface, sx, sy);
+ case L_TABBED:
+ return container_at_tabbed(parent, lx, ly, surface, sx, sy);
+ case L_STACKED:
+ return container_at_stacked(parent, lx, ly, surface, sx, sy);
+ case L_FLOATING:
+ sway_assert(false, "Didn't expect to see floating here");
+ return NULL;
+ case L_NONE:
+ return NULL;
+ }
+
+ return NULL;
+}
+
+struct sway_container *floating_container_at(double lx, double ly,
struct wlr_surface **surface, double *sx, double *sy) {
for (int i = 0; i < root_container.children->length; ++i) {
struct sway_container *output = root_container.children->items[i];
@@ -675,8 +702,7 @@ static struct sway_container *floating_container_at(double lx, double ly,
.height = floater->height,
};
if (wlr_box_contains_point(&box, lx, ly)) {
- return tiling_container_at(floater, lx, ly,
- surface, sx, sy);
+ return container_at(floater, lx, ly, surface, sx, sy);
}
}
}
@@ -684,90 +710,6 @@ static struct sway_container *floating_container_at(double lx, double ly,
return NULL;
}
-static struct sway_container *tiling_container_at(
- struct sway_container *con, double lx, double ly,
- struct wlr_surface **surface, double *sx, double *sy) {
- if (con->type == C_VIEW) {
- return container_at_view(con, lx, ly, surface, sx, sy);
- }
- if (!con->children->length) {
- return NULL;
- }
-
- switch (con->layout) {
- case L_HORIZ:
- case L_VERT:
- return container_at_linear(con, lx, ly, surface, sx, sy);
- case L_TABBED:
- return container_at_tabbed(con, lx, ly, surface, sx, sy);
- case L_STACKED:
- return container_at_stacked(con, lx, ly, surface, sx, sy);
- case L_FLOATING:
- sway_assert(false, "Didn't expect to see floating here");
- return NULL;
- case L_NONE:
- return NULL;
- }
- return NULL;
-}
-
-static bool surface_is_popup(struct wlr_surface *surface) {
- if (wlr_surface_is_xdg_surface(surface)) {
- struct wlr_xdg_surface *xdg_surface =
- wlr_xdg_surface_from_wlr_surface(surface);
- while (xdg_surface) {
- if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
- return true;
- }
- xdg_surface = xdg_surface->toplevel->parent;
- }
- return false;
- }
-
- if (wlr_surface_is_xdg_surface_v6(surface)) {
- struct wlr_xdg_surface_v6 *xdg_surface_v6 =
- wlr_xdg_surface_v6_from_wlr_surface(surface);
- while (xdg_surface_v6) {
- if (xdg_surface_v6->role == WLR_XDG_SURFACE_V6_ROLE_POPUP) {
- return true;
- }
- xdg_surface_v6 = xdg_surface_v6->toplevel->parent;
- }
- return false;
- }
-
- return false;
-}
-
-struct sway_container *container_at(struct sway_container *workspace,
- double lx, double ly,
- struct wlr_surface **surface, double *sx, double *sy) {
- if (!sway_assert(workspace->type == C_WORKSPACE, "Expected a workspace")) {
- return NULL;
- }
- struct sway_container *c;
- // Focused view's popups
- struct sway_seat *seat = input_manager_current_seat(input_manager);
- struct sway_container *focus =
- seat_get_focus_inactive(seat, &root_container);
- if (focus && focus->type == C_VIEW) {
- container_at_view(focus, lx, ly, surface, sx, sy);
- if (*surface && surface_is_popup(*surface)) {
- return focus;
- }
- *surface = NULL;
- }
- // Floating
- if ((c = floating_container_at(lx, ly, surface, sx, sy))) {
- return c;
- }
- // Tiling
- if ((c = tiling_container_at(workspace, lx, ly, surface, sx, sy))) {
- return c;
- }
- return NULL;
-}
-
void container_for_each_descendant_dfs(struct sway_container *container,
void (*f)(struct sway_container *container, void *data),
void *data) {
diff --git a/sway/tree/view.c b/sway/tree/view.c
index 97318daa..27a6a8bd 100644
--- a/sway/tree/view.c
+++ b/sway/tree/view.c
@@ -339,16 +339,6 @@ void view_for_each_surface(struct sway_view *view,
}
}
-void view_for_each_popup(struct sway_view *view,
- wlr_surface_iterator_func_t iterator, void *user_data) {
- if (!view->surface) {
- return;
- }
- if (view->impl->for_each_popup) {
- view->impl->for_each_popup(view, iterator, user_data);
- }
-}
-
static void view_subsurface_create(struct sway_view *view,
struct wlr_subsurface *subsurface);