When using the clone mode, the order of detection of outputs shouldn’t
matter for them to be included in a virtual_output or not, this fixes
this issue from the previous patch.

Signed-off-by: Emmanuel Gil Peyrot <emmanuel.pey...@collabora.com>
---
 src/compositor-drm.c | 34 +++++++++++++++++++++++++++++-----
 1 file changed, 29 insertions(+), 5 deletions(-)

diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index a0ed45f..ed72817 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -2426,7 +2426,7 @@ create_output_for_connector(struct drm_backend *b,
                        }
                }
                if (logical_output == NULL)
-                       return -1;
+                       return -2;
                is_clone = true;
        } else {
                logical_output = zalloc(sizeof *logical_output);
@@ -2704,7 +2704,8 @@ create_outputs(struct drm_backend *b, uint32_t 
option_connector,
 {
        drmModeConnector *connector;
        drmModeRes *resources;
-       int i;
+       struct wl_array clones;
+       int i, ret, *clone;
        int x = 0, y = 0;
 
        resources = drmModeGetResources(b->drm.fd);
@@ -2727,6 +2728,8 @@ create_outputs(struct drm_backend *b, uint32_t 
option_connector,
        b->num_crtcs = resources->count_crtcs;
        memcpy(b->crtcs, resources->crtcs, sizeof(uint32_t) * b->num_crtcs);
 
+       wl_array_init(&clones);
+
        for (i = 0; i < resources->count_connectors; i++) {
                connector = drmModeGetConnector(b->drm.fd,
                                                resources->connectors[i]);
@@ -2736,9 +2739,14 @@ create_outputs(struct drm_backend *b, uint32_t 
option_connector,
                if (connector->connection == DRM_MODE_CONNECTED &&
                    (option_connector == 0 ||
                     connector->connector_id == option_connector)) {
-                       if (create_output_for_connector(b, resources,
-                                                       connector, x, y,
-                                                       drm_device) < 0) {
+                       ret = create_output_for_connector(b, resources,
+                                                         connector, x, y,
+                                                         drm_device);
+                       if (ret == -2) {
+                               clone = wl_array_add(&clones, sizeof(int));
+                               *clone = i;
+                       }
+                       if (ret < 0) {
                                drmModeFreeConnector(connector);
                                continue;
                        }
@@ -2750,6 +2758,22 @@ create_outputs(struct drm_backend *b, uint32_t 
option_connector,
 
                drmModeFreeConnector(connector);
        }
+       wl_array_for_each(clone, &clones) {
+               i = *clone;
+               connector = drmModeGetConnector(b->drm.fd,
+                                               resources->connectors[i]);
+               if (create_output_for_connector(b, resources,
+                                               connector, x, y,
+                                               drm_device) < 0) {
+                       drmModeFreeConnector(connector);
+                       continue;
+               }
+               x += container_of(b->compositor->output_list.prev,
+                                 struct weston_output,
+                                 link)->width;
+               drmModeFreeConnector(connector);
+       }
+       wl_array_release(&clones);
 
        if (wl_list_empty(&b->compositor->output_list)) {
                weston_log("No currently active connector found.\n");
-- 
2.8.2

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

Reply via email to