frontend: Add support for tracking parent/mirror changes

If the DRM native output is changed propagate the changes
to the mirror as well.

Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
This commit is contained in:
Marius Vlad 2024-06-27 18:38:43 +03:00 committed by Derek Foreman
parent bd39f7edc1
commit 197c5e0084
1 changed files with 37 additions and 0 deletions

View File

@ -88,6 +88,8 @@ struct wet_layoutput;
struct wet_head_tracker {
struct wl_listener head_destroy_listener;
struct wl_listener resized_listener;
struct wet_compositor *wet;
};
/** User data for each weston_output */
@ -1905,6 +1907,9 @@ static void
wet_head_tracker_destroy(struct wet_head_tracker *track)
{
wl_list_remove(&track->head_destroy_listener.link);
if (track->resized_listener.notify)
wl_list_remove(&track->resized_listener.link);
free(track);
}
@ -2567,6 +2572,31 @@ wet_output_overlap_post_enable(struct weston_head *head,
weston_output_mode_set_native(head->output, &mode, scale);
}
static void
simple_heads_output_sharing_resize(struct wl_listener *listener, void *data)
{
struct weston_head *head = data;
struct weston_head *head_to_mirror = NULL;
struct weston_output *output;
struct wet_head_tracker *head_track =
container_of(listener, struct wet_head_tracker, resized_listener);
struct wet_compositor *wet = head_track->wet;
struct weston_mode mode;
int scale = 1;
output = weston_head_get_output(head);
head_to_mirror = wet_config_find_head_to_mirror(output, wet);
if (!head_to_mirror)
return;
weston_output_set_position(head_to_mirror->output, output->pos);
wet_output_compute_output_from_mirror(head->output,
head_to_mirror->output,
&mode, &scale);
weston_output_mode_set_native(head_to_mirror->output, &mode, scale);
}
static void
wet_output_handle_create(struct wl_listener *listener, void *data)
{
@ -2576,6 +2606,7 @@ wet_output_handle_create(struct wl_listener *listener, void *data)
struct weston_head *head = NULL;
struct weston_head *head_to_mirror =
weston_output_get_first_head(output);
struct wet_head_tracker *head_track;
struct wet_backend *wb;
@ -2601,6 +2632,12 @@ wet_output_handle_create(struct wl_listener *listener, void *data)
wet_output_overlap_post_enable);
weston_head_reset_device_changed(head);
head_track = wet_head_tracker_from_head(head);
head_track->wet = wet;
head_track->resized_listener.notify = simple_heads_output_sharing_resize;
wl_signal_add(&wet->compositor->output_resized_signal,
&head_track->resized_listener);
}
static struct wet_output *