[PATCH weston RFC] compositor: Move all views to a new primary output
Armin Krezović
krezovic.armin at gmail.com
Fri Jul 8 19:32:50 UTC 2016
On 05.07.2016 13:42, Pekka Paalanen wrote:
> On Thu, 30 Jun 2016 06:29:48 +0200
> Armin Krezović <krezovic.armin at gmail.com> wrote:
>
>> When primary output gets disconnected and there
>> were views created, they won't get assigned a
>> new output when a new primary output gets plugged
>> in. This will lead to crashes when weston tries
>> to use an already destroyed output.
>
> Hi Armin,
>
> I wonder if we could avoid keeping stale output pointers in the first
> place. The *_assing_output() machinery would already set them to NULL
> if it just got called.
>
> Maybe removing an output should cause all views to be marked dirty?
>
> Removing or adding outputs can cause shells to move views too.
> We want to avoid calling assign_outputs in the middle of a sequence of
> reorganizing views, so that clients don't receive unnecessary
> wl_surface.enter/leave events, which may cause redrawing.
>
>> This fixes the problems by force-moving all views
>> to the newly attached output if there were no
>> outputs present.
>>
>> Signed-off-by: Armin Krezović <krezovic.armin at gmail.com>
>> ---
>> libweston/compositor.c | 10 ++++++++++
>> 1 file changed, 10 insertions(+)
>>
>> diff --git a/libweston/compositor.c b/libweston/compositor.c
>> index eb9e8d9..62687cf 100644
>> --- a/libweston/compositor.c
>> +++ b/libweston/compositor.c
>> @@ -4313,8 +4313,18 @@ WL_EXPORT void
>> weston_compositor_add_output(struct weston_compositor *compositor,
>> struct weston_output *output)
>> {
>> + struct weston_view *view;
>> + int reassign_outputs = 0;
>> +
>> + if (wl_list_empty(&compositor->output_list))
>> + reassign_outputs = 1;
>> +
>> wl_list_insert(compositor->output_list.prev, &output->link);
>> wl_signal_emit(&compositor->output_created_signal, output);
>> +
>> + if (reassign_outputs)
>> + wl_list_for_each(view, &compositor->view_list, link)
>> + weston_view_assign_output(view);
>> }
>>
>> WL_EXPORT void
>
> How about we do this every time an output get plugged in or out, not
> just when the first output gets plugged in?
>
> That way the output assignments get automatically updated if e.g. a
> view is hanging off the edge of one output and into the region where
> the new output will be.
>
> And instead of calling weston_view_assign_output() directly, call
> weston_view_geometry_dirty()?
>
> Then *_assign_output() would get called as part of the repaint next
> time via weston_view_update_transform(), and it would coalesce any view
> manipulations done by the shell.
>
> When outputs are removed, it is possible that a view from that output
> will no longer be on any output. That's not a problem if at least one
> output remains, because weston_output_repaint() will end up calling
> update_transform and assign_output. But when the very last output gets
> unplugged, there is no repaint to call those anymore. In that case we
> should probably call weston_view_assign_output() directly. It cannot
> cause glitching output assignments either, because even if the shell
> did move the view, it cannot get an output assigned anyway.
>
> Or would it make better sense for weston_{surface,view} to also
> subscribe to the destruction of the assigned output, or even maintain a
> per-output list of assigned views and surfaces. I wonder...
>
>
> Thanks,
> pq
>
Hi, setting transform.dirty to 1 makes sense. When an output is destroyed,
all views from that output are moved to another output. We can modify
the following snippet to set transform.dirty to 1 for a view if output
list is empty. That would make the patch even simpler.
wl_list_for_each(view, &output->compositor->view_list, link) {
if (view->output_mask & (1u << output->id))
weston_view_assign_output(view);
}
Thanks, Armin.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 855 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20160708/99b36aa3/attachment-0001.sig>
More information about the wayland-devel
mailing list