diff --git a/gfx/display_servers/dispserv_x11.c b/gfx/display_servers/dispserv_x11.c index 125e2ea7e4..fb0834693c 100644 --- a/gfx/display_servers/dispserv_x11.c +++ b/gfx/display_servers/dispserv_x11.c @@ -579,6 +579,29 @@ static void x11_display_server_destroy(void *data) } XRRFreeOutputInfo(outputs); } + for (m = 0; m < resources->nmode; m++) + { + for (j = 0; j < res->noutput; j++) + { + for (i = 1 ; i <= dispserv->crt_name_id; i++ ) + { + XRROutputInfo *outputs = XRRGetOutputInfo(dpy, res, res->outputs[j]); + if (outputs->connection == RR_Connected) + { + snprintf(dispserv->old_mode, sizeof(dispserv->old_mode), + "CRT%d", i); + if (string_is_equal(resources->modes[m].name, + dispserv->old_mode)) + { + swoldmode = &resources->modes[m]; + XRRDeleteOutputMode(dpy, res->outputs[j], swoldmode->id); + XRRDestroyMode(dpy, swoldmode->id); + XSync(dpy, False); + } + } + } + } + } } else { @@ -611,15 +634,13 @@ static void x11_display_server_destroy(void *data) XRRFreeCrtcInfo(crtc); } XRRFreeOutputInfo(outputs); - } - for (m = 0; m < resources->nmode; m++) - { - for (j = 0; j < res->noutput; j++) + for (m = 0; m < resources->nmode; m++) { + for (i = 1 ; i <= dispserv->crt_name_id; i++ ) { - XRROutputInfo *outputs = XRRGetOutputInfo(dpy, res, res->outputs[j]); + XRROutputInfo *outputs = XRRGetOutputInfo(dpy, res, res->outputs[dispserv->monitor_index]); if (outputs->connection == RR_Connected) { snprintf(dispserv->old_mode, sizeof(dispserv->old_mode), @@ -628,14 +649,17 @@ static void x11_display_server_destroy(void *data) dispserv->old_mode)) { swoldmode = &resources->modes[m]; - XRRDeleteOutputMode(dpy, res->outputs[j], swoldmode->id); + XRRDeleteOutputMode(dpy, res->outputs[dispserv->monitor_index], swoldmode->id); XRRDestroyMode(dpy, swoldmode->id); XSync(dpy, False); } } } + + } } + XRRFreeScreenResources(resources); XRRFreeScreenResources(res); XCloseDisplay(dpy);