Skip to content

Commit

Permalink
scene_graph: Implement toplevel clipping
Browse files Browse the repository at this point in the history
  • Loading branch information
Nefsen402 authored and vyivel committed Jan 18, 2024
1 parent 09e11da commit 9da295c
Show file tree
Hide file tree
Showing 5 changed files with 27 additions and 12 deletions.
2 changes: 1 addition & 1 deletion include/sway/tree/view.h
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion sway/desktop/transaction.c
Expand Up @@ -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);
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions sway/desktop/xdg_shell.c
Expand Up @@ -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) {
Expand Down
4 changes: 2 additions & 2 deletions sway/desktop/xwayland.c
Expand Up @@ -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) {
Expand Down
27 changes: 21 additions & 6 deletions sway/tree/view.c
Expand Up @@ -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) {
Expand Down

0 comments on commit 9da295c

Please sign in to comment.