aboutsummaryrefslogtreecommitdiff
path: root/sway/tree
diff options
context:
space:
mode:
authorAlexander Orzechowski <alex@ozal.ski>2023-11-22 15:11:12 -0500
committerKirill Primak <vyivel@eclair.cafe>2024-01-18 18:36:54 +0300
commit9da295c11f90dcfbf254ccf23b9124c87ccd8ddf (patch)
tree328cf15feeccd8bdc90f1205542857ab34afeaa2 /sway/tree
parent09e11dabb203513c038b723e50de2fd836e7edb3 (diff)
scene_graph: Implement toplevel clipping
Diffstat (limited to 'sway/tree')
-rw-r--r--sway/tree/view.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/sway/tree/view.c b/sway/tree/view.c
index 3bc0855b..d6984178 100644
--- a/sway/tree/view.c
+++ b/sway/tree/view.c
@@ -893,14 +893,29 @@ void view_update_size(struct sway_view *view) {
container_set_geometry_from_content(con);
}
-void view_center_surface(struct sway_view *view) {
+void view_center_and_clip_surface(struct sway_view *view) {
struct sway_container *con = view->container;
- // We always center the current coordinates rather than the next, as the
- // geometry immediately affects the currently active rendering.
- int x = (int) fmax(0, (con->current.content_width - view->geometry.width) / 2);
- int y = (int) fmax(0, (con->current.content_height - view->geometry.height) / 2);
- wlr_scene_node_set_position(&view->content_tree->node, x, y);
+ if (container_is_floating(con)) {
+ // We always center the current coordinates rather than the next, as the
+ // geometry immediately affects the currently active rendering.
+ int x = (int) fmax(0, (con->current.content_width - view->geometry.width) / 2);
+ int y = (int) fmax(0, (con->current.content_height - view->geometry.height) / 2);
+
+ wlr_scene_node_set_position(&view->content_tree->node, x, y);
+ } else {
+ wlr_scene_node_set_position(&view->content_tree->node, 0, 0);
+ }
+
+ // only make sure to clip the content if there is content to clip
+ if (!wl_list_empty(&con->view->content_tree->children)) {
+ wlr_scene_subsurface_tree_set_clip(&con->view->content_tree->node, &(struct wlr_box){
+ .x = con->view->geometry.x,
+ .y = con->view->geometry.y,
+ .width = con->current.content_width,
+ .height = con->current.content_height,
+ });
+ }
}
struct sway_view *view_from_wlr_surface(struct wlr_surface *wlr_surface) {