Doing this before updating the output_ids is not a good idea as we compare the output id in the loop and the output id is unreliable.
Signed-off-by: Daniel Martin <consume.no...@gmail.com> --- hw/xfree86/drivers/modesetting/drmmode_display.c | 51 ++++++++++++++---------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c index a6f10ca91..e0c9f0e69 100644 --- a/hw/xfree86/drivers/modesetting/drmmode_display.c +++ b/hw/xfree86/drivers/modesetting/drmmode_display.c @@ -2355,28 +2355,6 @@ drmmode_handle_uevents(int fd, void *closure) goto out_free_res; } - /* figure out if we have gotten rid of any connectors - traverse old output list looking for outputs */ - for (i = 0; i < config->num_output; i++) { - xf86OutputPtr output = config->output[i]; - drmmode_output_private_ptr drmmode_output; - - drmmode_output = output->driver_private; - found = FALSE; - for (j = 0; j < mode_res->count_connectors; j++) { - if (mode_res->connectors[j] == drmmode_output->output_id) { - found = TRUE; - break; - } - } - if (found) - continue; - - drmmode_output->output_id = -1; - - changed = TRUE; - } - /* Re-evaluate the outputs, add new ones and update output ids. */ for (i = 0; i < mode_res->count_connectors; i++) { drmModePropertyBlobPtr path_blob; @@ -2416,6 +2394,35 @@ drmmode_handle_uevents(int fd, void *closure) drmModeFreeConnector(koutput); } + /* Figure out if we have gotten rid of any connectors. As we updated + * the output_ids above, we can use them for comparision. */ + for (i = 0; i < config->num_output; i++) { + xf86OutputPtr output = config->output[i]; + drmmode_output_private_ptr drmmode_output; + + drmmode_output = output->driver_private; + found = FALSE; + + if (drmmode_output->output_id == -1) + continue; + + for (j = 0; j < mode_res->count_connectors; j++) { + if (mode_res->connectors[j] == drmmode_output->output_id) { + found = TRUE; + break; + } + } + if (found) + continue; + + xf86DrvMsg(scrn->scrnIndex, X_DEBUG, + "hotplug event: output %s vanished\n", + output->name); + + drmmode_output->output_id = -1; + changed = TRUE; + } + if (changed) { RRSetChanged(xf86ScrnToScreen(scrn)); RRTellChanged(xf86ScrnToScreen(scrn)); -- 2.13.6 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel