]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
drm: Implement handle_change_event
authorHans de Goede <hdegoede@redhat.com>
Wed, 16 Jan 2019 08:41:42 +0000 (09:41 +0100)
committerHans de Goede <hdegoede@redhat.com>
Wed, 16 Jan 2019 16:58:33 +0000 (17:58 +0100)
Now that we can call create_heads_for_active_connectors multiple times
we can implement handle_change_event.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
src/plugins/renderers/drm/plugin.c

index 0963a84ac062e61343f088855aa1a0bc4001d359..b190737e10164233dd58db9d40140d5d0fa2a7c8 100644 (file)
@@ -1304,7 +1304,7 @@ remove_output (ply_renderer_backend_t *backend, ply_output_t *output)
  * Returns true if any heads were modified.
  */
 static bool
-create_heads_for_active_connectors (ply_renderer_backend_t *backend)
+create_heads_for_active_connectors (ply_renderer_backend_t *backend, bool change)
 {
         int i, j, number_of_setup_outputs, outputs_len;
         ply_output_t output, *outputs;
@@ -1380,8 +1380,12 @@ create_heads_for_active_connectors (ply_renderer_backend_t *backend)
                 outputs = setup_outputs (backend, outputs, outputs_len);
                 number_of_setup_outputs = count_setup_controllers (outputs, outputs_len);
         }
-        if (number_of_setup_outputs != backend->connected_count) {
-                /* Second try, re-assing controller for all outputs */
+        /* Try again if necessary, re-assing controllers for all outputs.
+         * Note this is skipped when processing change events, as we don't
+         * want to mess with the controller assignment of already lit monitors
+         * in that case.
+         */
+        if (!change && number_of_setup_outputs != backend->connected_count) {
                 ply_trace ("Some outputs still don't have controllers, re-assigning controllers for all outputs");
                 for (i = 0; i < outputs_len; i++)
                         outputs[i].controller_id = 0;
@@ -1484,7 +1488,7 @@ query_device (ply_renderer_backend_t *backend)
                 return false;
         }
 
-        if (!create_heads_for_active_connectors (backend)) {
+        if (!create_heads_for_active_connectors (backend, false)) {
                 ply_trace ("Could not initialize heads");
                 ret = false;
         } else if (!has_32bpp_support (backend)) {
@@ -1498,6 +1502,25 @@ query_device (ply_renderer_backend_t *backend)
         return ret;
 }
 
+static bool
+handle_change_event (ply_renderer_backend_t *backend)
+{
+        bool ret = true;
+
+        backend->resources = drmModeGetResources (backend->device_fd);
+        if (backend->resources == NULL) {
+                ply_trace ("Could not get card resources for change event");
+                return false;
+        }
+
+        ret = create_heads_for_active_connectors (backend, true);
+
+        drmModeFreeResources (backend->resources);
+        backend->resources = NULL;
+
+        return ret;
+}
+
 static bool
 map_to_device (ply_renderer_backend_t *backend)
 {
@@ -1776,6 +1799,7 @@ ply_renderer_backend_get_interface (void)
                 .open_device                  = open_device,
                 .close_device                 = close_device,
                 .query_device                 = query_device,
+                .handle_change_event          = handle_change_event,
                 .map_to_device                = map_to_device,
                 .unmap_from_device            = unmap_from_device,
                 .activate                     = activate,