Fix dynamic output based scaling for menu and SSD

wlr_scene_buffers need an additional wlr_scene_buffer_set_source_box()
to be scaled correctly by wlroots based on the output scale.

With this commit the buffers are now scaled correctly but, especially
on higher scale factors, may be a bit blurry.

In the future we likely want a dynamic font label generator based
on the maximal scale of all the outputs the specific buffer is currently on.

Some inspiration for that could be
https://github.com/Nefsen402/sway/blob/scene-graph/sway/sway_text_buffer.c

Fixes #348
This commit is contained in:
Consolatis 2022-05-29 18:34:25 +02:00
parent 78dc2ea7fe
commit e87aa19066
3 changed files with 31 additions and 7 deletions

View file

@ -40,7 +40,11 @@ add_scene_buffer(struct wl_list *list, enum ssd_part_type type,
int x, int y)
{
struct ssd_part *part = add_scene_part(list, type);
part->node = &wlr_scene_buffer_create(parent, buffer)->node;
struct wlr_scene_buffer *scene_buffer =
wlr_scene_buffer_create(parent, buffer);
part->node = &scene_buffer->node;
struct wlr_fbox source_box = { 0, 0, buffer->width, buffer->height };
wlr_scene_buffer_set_source_box(scene_buffer, &source_box);
wlr_scene_node_set_position(part->node, x, y);
return part;
}

View file

@ -221,6 +221,7 @@ ssd_update_title(struct view *view)
struct ssd_part *parent_part;
struct ssd_sub_tree *subtree;
struct ssd_state_title_width *dstate;
struct wlr_scene_buffer *scene_buffer;
FOR_EACH_STATE(view, subtree) {
parent_part = ssd_get_part(&subtree->parts, LAB_SSD_PART_TITLEBAR);
assert(parent_part);
@ -259,11 +260,19 @@ ssd_update_title(struct view *view)
wlr_log(WLR_ERROR, "Failed to create title buffer");
}
scene_buffer = wlr_scene_buffer_from_node(part->node);
/* (Re)set the buffer */
wlr_scene_buffer_set_buffer(
wlr_scene_buffer_from_node(part->node),
wlr_scene_buffer_set_buffer(scene_buffer,
part->buffer ? &part->buffer->base : NULL);
/* Make sure output scaling works correctly */
if (part->buffer) {
struct wlr_fbox source_box = {0, 0,
part->buffer->base.width, part->buffer->base.height };
wlr_scene_buffer_set_source_box(scene_buffer, &source_box);
}
/* And finally update the cache */
dstate->width = part->buffer ? part->buffer->base.width : 0;
dstate->truncated = rect->width <= dstate->width;