wayland/drm-lease: Update available connectors

When the list of connectors available for lease changes send
wp_drm_lease_device_v1.connector events for added connectors and
wp_drm_lease_connector_v1.withdrawn events for removed connectors,
followed by a wp_drm_lease_device_v1.done event.

Co-authored-by: José Expósito <jexposit@redhat.com>
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3746>
This commit is contained in:
Jonas Ådahl 2024-04-24 11:15:50 +02:00 committed by Marge Bot
parent fb08a597e1
commit a8a8404cdd

View File

@ -184,6 +184,20 @@ meta_wayland_drm_lease_connector_new (MetaWaylandDrmLeaseDevice *lease_device,
return lease_connector;
}
static void
meta_wayland_drm_lease_connector_send_withdrawn (MetaWaylandDrmLeaseConnector *lease_connector)
{
GList *l;
for (l = lease_connector->resources; l; l = l->next)
{
struct wl_resource *resource = l->data;
if (wl_resource_get_user_data (resource) == lease_connector)
wp_drm_lease_connector_v1_send_withdrawn (resource);
}
}
static void
drm_lease_connector_destroy (struct wl_client *client,
struct wl_resource *resource)
@ -364,6 +378,71 @@ meta_wayland_drm_lease_manager_add_device (MetaKmsDevice *kms_devic
g_steal_pointer (&lease_device));
}
static void
on_connector_added (MetaDrmLeaseManager *drm_lease_manager,
MetaKmsConnector *kms_connector,
gboolean is_last_connector_update,
MetaWaylandDrmLeaseManager *lease_manager)
{
MetaWaylandDrmLeaseConnector *lease_connector;
MetaWaylandDrmLeaseDevice *lease_device;
MetaKmsDevice *kms_device;
GList *l;
kms_device = meta_kms_connector_get_device (kms_connector);
lease_device = g_hash_table_lookup (lease_manager->devices, kms_device);
g_return_if_fail (lease_device != NULL);
meta_wayland_drm_lease_device_add_connector (kms_connector, lease_device);
lease_connector = g_hash_table_lookup (lease_device->connectors,
kms_connector);
g_return_if_fail (lease_connector != NULL);
for (l = lease_device->resources; l; l = l->next)
{
struct wl_resource *resource = l->data;
if (wl_resource_get_user_data (resource) == lease_device)
send_new_connector_resource (lease_device, resource, lease_connector);
}
if (is_last_connector_update)
{
g_list_foreach (lease_device->resources,
(GFunc) wp_drm_lease_device_v1_send_done,
NULL);
}
}
static void
on_connector_removed (MetaDrmLeaseManager *drm_lease_manager,
MetaKmsConnector *kms_connector,
gboolean is_last_connector_update,
MetaWaylandDrmLeaseManager *lease_manager)
{
MetaWaylandDrmLeaseConnector *lease_connector;
MetaWaylandDrmLeaseDevice *lease_device;
MetaKmsDevice *kms_device;
kms_device = meta_kms_connector_get_device (kms_connector);
lease_device = g_hash_table_lookup (lease_manager->devices, kms_device);
g_return_if_fail (lease_device != NULL);
lease_connector = g_hash_table_lookup (lease_device->connectors,
kms_connector);
g_return_if_fail (lease_connector != NULL);
meta_wayland_drm_lease_connector_send_withdrawn (lease_connector);
g_hash_table_remove (lease_device->connectors, kms_connector);
if (is_last_connector_update)
{
g_list_foreach (lease_device->resources,
(GFunc) wp_drm_lease_device_v1_send_done,
NULL);
}
}
static MetaWaylandDrmLeaseManager *
meta_wayland_drm_lease_manager_new (MetaWaylandCompositor *compositor)
{
@ -395,6 +474,13 @@ meta_wayland_drm_lease_manager_new (MetaWaylandCompositor *compositor)
(GFunc) meta_wayland_drm_lease_manager_add_device,
lease_manager);
g_signal_connect (lease_manager->drm_lease_manager, "connector-added",
G_CALLBACK (on_connector_added),
lease_manager);
g_signal_connect (lease_manager->drm_lease_manager, "connector-removed",
G_CALLBACK (on_connector_removed),
lease_manager);
return lease_manager;
}