aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sway/tree/view.h2
-rw-r--r--sway/desktop/transaction.c2
-rw-r--r--sway/desktop/xdg_shell.c4
-rw-r--r--sway/desktop/xwayland.c4
-rw-r--r--sway/tree/view.c27
5 files changed, 27 insertions, 12 deletions
diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h
index 80097dd3..3e5a9bfe 100644
--- a/include/sway/tree/view.h
+++ b/include/sway/tree/view.h
@@ -274,7 +274,7 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface,
void view_unmap(struct sway_view *view);
void view_update_size(struct sway_view *view);
-void view_center_surface(struct sway_view *view);
+void view_center_and_clip_surface(struct sway_view *view);
struct sway_view *view_from_wlr_xdg_surface(
struct wlr_xdg_surface *xdg_surface);
diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c
index 0755c8a0..980e839e 100644
--- a/sway/desktop/transaction.c
+++ b/sway/desktop/transaction.c
@@ -248,7 +248,7 @@ static void apply_container_state(struct sway_container *container,
// the container. This is important for fullscreen views which
// refuse to resize to the size of the output.
if (view->surface) {
- view_center_surface(view);
+ view_center_and_clip_surface(view);
}
}
}
diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c
index 48b7b4c7..7cdd97c8 100644
--- a/sway/desktop/xdg_shell.c
+++ b/sway/desktop/xdg_shell.c
@@ -306,9 +306,9 @@ static void handle_commit(struct wl_listener *listener, void *data) {
view->geometry.height);
}
transaction_commit_dirty_client();
- } else {
- view_center_surface(view);
}
+
+ view_center_and_clip_surface(view);
}
if (view->container->node.instruction) {
diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c
index e0c80c07..9f3f4d5f 100644
--- a/sway/desktop/xwayland.c
+++ b/sway/desktop/xwayland.c
@@ -436,9 +436,9 @@ static void handle_commit(struct wl_listener *listener, void *data) {
if (container_is_floating(view->container)) {
view_update_size(view);
transaction_commit_dirty_client();
- } else {
- view_center_surface(view);
}
+
+ view_center_and_clip_surface(view);
}
if (view->container->node.instruction) {
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) {