diff --git a/src/lib/ecore_drm2/ecore_drm2_outputs.c b/src/lib/ecore_drm2/ecore_drm2_outputs.c index c5f0d6b995..7c460c0c7f 100644 --- a/src/lib/ecore_drm2/ecore_drm2_outputs.c +++ b/src/lib/ecore_drm2/ecore_drm2_outputs.c @@ -771,7 +771,6 @@ _output_create(Ecore_Drm2_Device *dev, const drmModeRes *res, const drmModeConne output->enabled = EINA_FALSE; } - dev->alloc.conn |= (1 << output->conn_id); dev->outputs = eina_list_append(dev->outputs, output); _output_debug(output, conn); @@ -784,17 +783,38 @@ _output_create(Ecore_Drm2_Device *dev, const drmModeRes *res, const drmModeConne return EINA_TRUE; } +static Ecore_Drm2_Output * +_output_find_by_con(Ecore_Drm2_Device *dev, uint32_t id) +{ + Ecore_Drm2_Output *output; + Eina_List *l; + + EINA_LIST_FOREACH(dev->outputs, l, output) + if (output->conn_id == id) return output; + + return NULL; +} + static void _outputs_update(Ecore_Drm2_Device *dev) { + Ecore_Drm2_Output *output; + Eina_List *l, *ll; drmModeRes *res; drmModeConnector *conn; - uint32_t connected = 0, disconnected = 0; + uint32_t *connected; int i = 0, x = 0, y = 0; res = sym_drmModeGetResources(dev->fd); if (!res) return; + connected = calloc(res->count_connectors, sizeof(uint32_t)); + if (!connected) + { + sym_drmModeFreeResources(res); + return; + } + for (i = 0; i < res->count_connectors; i++) { conn = sym_drmModeGetConnector(dev->fd, res->connectors[i]); @@ -802,9 +822,8 @@ _outputs_update(Ecore_Drm2_Device *dev) if (conn->connection != DRM_MODE_CONNECTED) goto next; - connected |= (1 << res->connectors[i]); - - if (!(dev->alloc.conn & (1 << res->connectors[i]))) + connected[i] = res->connectors[i]; + if (!_output_find_by_con(dev, res->connectors[i])) { if (dev->outputs) { @@ -827,41 +846,31 @@ next: sym_drmModeFreeResources(res); - disconnected = (dev->alloc.conn & ~connected); - if (disconnected) + EINA_LIST_FOREACH_SAFE(dev->outputs, l, ll, output) { - Ecore_Drm2_Output *output; - Eina_List *l; + Eina_Bool disconnected = EINA_TRUE; - EINA_LIST_FOREACH(dev->outputs, l, output) + for (i = 0; i < res->count_connectors; i++) + if (connected[i] == output->conn_id) + { + disconnected = EINA_FALSE; + break; + } + + if (disconnected) { - if (disconnected & (1 << output->conn_id)) - { - disconnected &= ~(1 << output->conn_id); - output->connected = EINA_FALSE; - output->enabled = EINA_FALSE; - _output_event_send(output); - } - } - } - - connected = (dev->alloc.conn & connected); - if (connected) - { - Ecore_Drm2_Output *output; - Eina_List *l; - - EINA_LIST_FOREACH(dev->outputs, l, output) - { - if (connected & (1 << output->conn_id)) - { - connected &= ~(1 << output->conn_id); - output->connected = EINA_TRUE; - output->enabled = EINA_TRUE; - _output_event_send(output); - } + output->connected = EINA_FALSE; + output->enabled = EINA_FALSE; + _output_event_send(output); + } + else + { + output->connected = EINA_TRUE; + output->enabled = EINA_TRUE; + _output_event_send(output); } } + free(connected); } static void @@ -874,7 +883,7 @@ _cb_output_event(const char *device EINA_UNUSED, Eeze_Udev_Event event EINA_UNUS } static void -_output_destroy(Ecore_Drm2_Device *dev, Ecore_Drm2_Output *output) +_output_destroy(Ecore_Drm2_Device *dev EINA_UNUSED, Ecore_Drm2_Output *output) { Ecore_Drm2_Output_Mode *mode; Ecore_Drm2_Plane *plane; @@ -905,8 +914,6 @@ _output_destroy(Ecore_Drm2_Device *dev, Ecore_Drm2_Output *output) free(mode); } - dev->alloc.conn &= ~(1 << output->conn_id); - eina_stringshare_del(output->backlight.path); eina_stringshare_del(output->name); eina_stringshare_del(output->make); diff --git a/src/lib/ecore_drm2/ecore_drm2_private.h b/src/lib/ecore_drm2/ecore_drm2_private.h index e48449ead6..3c1040d57b 100644 --- a/src/lib/ecore_drm2/ecore_drm2_private.h +++ b/src/lib/ecore_drm2/ecore_drm2_private.h @@ -274,11 +274,6 @@ struct _Ecore_Drm2_Device int num_crtcs; uint32_t *crtcs; - struct - { - uint32_t conn; - } alloc; - struct { uint32_t width, height;