From: Pekka Paalanen <pekka.paala...@collabora.co.uk>

The wl_output protocol interface exposes things like monitor make,
model, sub-pixel layout and physical dimensions. Obviously wl_output is
meant to represent a monitor.

The abstraction of a monitor is weston_head. Therefore move the wl_output
global and the bound resources list into weston_head.

When clone mode gets implemented in the future, this means that monitors
driven by the same CRTC will still be represented as separate wl_output
globals. This allows to accurately represent the hardware.

Clone mode that used separate, not frame-locked, CRTCs to drive two
monitors as clones would necessarily also be exposed as separate
wl_output since they have different timings.

v6:
- adapt to upstream changes in weston_output_set_transform()

Signed-off-by: Pekka Paalanen <pekka.paala...@collabora.co.uk>
v5 Reviewed-by: Derek Foreman <der...@osg.samsung.com>
---
 libweston/compositor.c | 41 +++++++++++++++++++++++++----------------
 libweston/compositor.h |  5 +++--
 2 files changed, 28 insertions(+), 18 deletions(-)

diff --git a/libweston/compositor.c b/libweston/compositor.c
index 95234c87..99a56269 100644
--- a/libweston/compositor.c
+++ b/libweston/compositor.c
@@ -81,6 +81,7 @@ static void weston_mode_switch_finish(struct weston_output 
*output,
                                      int scale_changed)
 {
        struct weston_seat *seat;
+       struct weston_head *head;
        struct wl_resource *resource;
        pixman_region32_t old_output_region;
        int version;
@@ -129,8 +130,10 @@ static void weston_mode_switch_finish(struct weston_output 
*output,
        if (!mode_changed && !scale_changed)
                return;
 
+       head = &output->head;
+
        /* notify clients of the changes */
-       wl_resource_for_each(resource, &output->resource_list) {
+       wl_resource_for_each(resource, &head->resource_list) {
                if (mode_changed) {
                        wl_output_send_mode(resource,
                                            output->current_mode->flags,
@@ -340,12 +343,14 @@ weston_presentation_feedback_present(
                uint32_t flags)
 {
        struct wl_client *client = wl_resource_get_client(feedback->resource);
+       struct weston_head *head;
        struct wl_resource *o;
        uint32_t tv_sec_hi;
        uint32_t tv_sec_lo;
        uint32_t tv_nsec;
 
-       wl_resource_for_each(o, &output->resource_list) {
+       head = &output->head;
+       wl_resource_for_each(o, &head->resource_list) {
                if (wl_resource_get_client(o) != client)
                        continue;
 
@@ -922,7 +927,7 @@ weston_view_damage_below(struct weston_view *view)
 /** Send wl_surface.enter/leave events
  *
  * \param surface The surface.
- * \param output The entered/left output.
+ * \param head A head of the entered/left output.
  * \param enter True if entered.
  * \param left True if left.
  *
@@ -931,7 +936,7 @@ weston_view_damage_below(struct weston_view *view)
  */
 static void
 weston_surface_send_enter_leave(struct weston_surface *surface,
-                               struct weston_output *output,
+                               struct weston_head *head,
                                bool enter,
                                bool leave)
 {
@@ -941,7 +946,7 @@ weston_surface_send_enter_leave(struct weston_surface 
*surface,
        assert(enter != leave);
 
        client = wl_resource_get_client(surface->resource);
-       wl_resource_for_each(wloutput, &output->resource_list) {
+       wl_resource_for_each(wloutput, &head->resource_list) {
                if (wl_resource_get_client(wloutput) != client)
                        continue;
 
@@ -981,7 +986,7 @@ weston_surface_update_output_mask(struct weston_surface 
*es, uint32_t mask)
                if (!(output_bit & different))
                        continue;
 
-               weston_surface_send_enter_leave(es, output,
+               weston_surface_send_enter_leave(es, &output->head,
                                                output_bit & entered,
                                                output_bit & left);
        }
@@ -4323,7 +4328,7 @@ bind_output(struct wl_client *client,
                return;
        }
 
-       wl_list_insert(&output->resource_list, wl_resource_get_link(resource));
+       wl_list_insert(&head->resource_list, wl_resource_get_link(resource));
        wl_resource_set_implementation(resource, &output_interface, data, 
unbind_resource);
 
        wl_output_send_geometry(resource,
@@ -4577,7 +4582,7 @@ weston_output_move(struct weston_output *output, int x, 
int y)
        wl_signal_emit(&output->compositor->output_moved_signal, output);
 
        /* Notify clients of the change for output position. */
-       wl_resource_for_each(resource, &output->resource_list) {
+       wl_resource_for_each(resource, &head->resource_list) {
                wl_output_send_geometry(resource,
                                        output->x,
                                        output->y,
@@ -4611,6 +4616,7 @@ weston_compositor_add_output(struct weston_compositor 
*compositor,
                              struct weston_output *output)
 {
        struct weston_view *view, *next;
+       struct weston_head *head;
 
        assert(!output->enabled);
 
@@ -4628,9 +4634,10 @@ weston_compositor_add_output(struct weston_compositor 
*compositor,
        wl_list_insert(compositor->output_list.prev, &output->link);
        output->enabled = true;
 
-       output->global = wl_global_create(compositor->wl_display,
-                                         &wl_output_interface, 3,
-                                         output, bind_output);
+       head = &output->head;
+       head->global = wl_global_create(compositor->wl_display,
+                                       &wl_output_interface, 3,
+                                       output, bind_output);
 
        wl_signal_emit(&compositor->output_created_signal, output);
 
@@ -4702,6 +4709,7 @@ weston_compositor_remove_output(struct weston_output 
*output)
        struct weston_compositor *compositor = output->compositor;
        struct wl_resource *resource;
        struct weston_view *view;
+       struct weston_head *head;
 
        assert(output->destroying);
        assert(output->enabled);
@@ -4722,9 +4730,10 @@ weston_compositor_remove_output(struct weston_output 
*output)
        wl_signal_emit(&compositor->output_destroyed_signal, output);
        wl_signal_emit(&output->destroy_signal, output);
 
-       wl_global_destroy(output->global);
-       output->global = NULL;
-       wl_resource_for_each(resource, &output->resource_list) {
+       head = &output->head;
+       wl_global_destroy(head->global);
+       head->global = NULL;
+       wl_resource_for_each(resource, &head->resource_list) {
                wl_resource_set_destructor(resource, NULL);
        }
 
@@ -4795,7 +4804,7 @@ weston_output_set_transform(struct weston_output *output,
        output->dirty = 1;
 
        /* Notify clients of the change for output transform. */
-       wl_resource_for_each(resource, &output->resource_list) {
+       wl_resource_for_each(resource, &head->resource_list) {
                wl_output_send_geometry(resource,
                                        output->x,
                                        output->y,
@@ -4969,7 +4978,7 @@ weston_output_enable(struct weston_output *output)
        wl_signal_init(&output->frame_signal);
        wl_signal_init(&output->destroy_signal);
        wl_list_init(&output->animation_list);
-       wl_list_init(&output->resource_list);
+       wl_list_init(&output->head.resource_list);
        wl_list_init(&output->feedback_list);
 
        /* Enable the output (set up the crtc or create a
diff --git a/libweston/compositor.h b/libweston/compositor.h
index 3be5660d..c2de761b 100644
--- a/libweston/compositor.h
+++ b/libweston/compositor.h
@@ -153,6 +153,9 @@ enum dpms_enum {
  * (windowed nested backends).
  */
 struct weston_head {
+       struct wl_list resource_list;   /**< wl_output protocol objects */
+       struct wl_global *global;       /**< wl_output global */
+
        int32_t mm_width;               /**< physical image width in mm */
        int32_t mm_height;              /**< physical image height in mm */
        char *make;                     /**< monitor manufacturer (PNP ID) */
@@ -169,8 +172,6 @@ struct weston_output {
        void *renderer_state;
 
        struct wl_list link;
-       struct wl_list resource_list;
-       struct wl_global *global;
        struct weston_compositor *compositor;
 
        /** From global to output buffer coordinates. */
-- 
2.13.6

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to