render: handle containers without output when rendering titles

In e0a94bee8d, it was believed that if the
container is being rendered, it must have an output.

This turned out not to be the case. When rendering a container, all its
children are rendered, even if the children is positioned off screen and
thus not having any output. This is the cause of the crash in #6061.

This commit introduces a null-check, which fixes #6061.
This commit is contained in:
Quantum 2021-02-24 15:15:22 -05:00 committed by Tudor Brindus
parent bb41b7b814
commit e01a3c85f6
2 changed files with 6 additions and 1 deletions

View File

@ -285,6 +285,7 @@ bool container_is_fullscreen_or_child(struct sway_container *container);
/**
* Return the output which will be used for scale purposes.
* This is the most recently entered output.
* If the container is not on any output, return NULL.
*/
struct sway_output *container_get_effective_output(struct sway_container *con);

View File

@ -519,7 +519,11 @@ static void render_titlebar(struct sway_output *output,
wlr_texture_get_size(title_texture,
&texture_box.width, &texture_box.height);
float title_scale = container_get_effective_output(con)->wlr_output->scale;
// The effective output may be NULL when con is not on any output.
// This can happen because we render all children of containers,
// even those that are out of the bounds of any output.
struct sway_output *effective = container_get_effective_output(con);
float title_scale = effective ? effective->wlr_output->scale : output_scale;
texture_box.width = texture_box.width * output_scale / title_scale;
texture_box.height = texture_box.height * output_scale / title_scale;
ob_title_width = texture_box.width;