Multi monitor fix. (#12260)

This fix allows for the use of multi monitor when using CRTSwitchres. It fixes a bug that causes a crash.
Delete function will no longer try to delete resolutions from outputs that have not had resolutions added.
This commit is contained in:
alphanu1 2021-04-12 05:55:33 -07:00 committed by GitHub
parent 7f3b9e8a89
commit 5658ea7047
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -579,6 +579,29 @@ static void x11_display_server_destroy(void *data)
} }
XRRFreeOutputInfo(outputs); 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 else
{ {
@ -611,15 +634,13 @@ static void x11_display_server_destroy(void *data)
XRRFreeCrtcInfo(crtc); XRRFreeCrtcInfo(crtc);
} }
XRRFreeOutputInfo(outputs); XRRFreeOutputInfo(outputs);
}
for (m = 0; m < resources->nmode; m++) for (m = 0; m < resources->nmode; m++)
{
for (j = 0; j < res->noutput; j++)
{ {
for (i = 1 ; i <= dispserv->crt_name_id; i++ ) 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) if (outputs->connection == RR_Connected)
{ {
snprintf(dispserv->old_mode, sizeof(dispserv->old_mode), snprintf(dispserv->old_mode, sizeof(dispserv->old_mode),
@ -628,14 +649,17 @@ static void x11_display_server_destroy(void *data)
dispserv->old_mode)) dispserv->old_mode))
{ {
swoldmode = &resources->modes[m]; swoldmode = &resources->modes[m];
XRRDeleteOutputMode(dpy, res->outputs[j], swoldmode->id); XRRDeleteOutputMode(dpy, res->outputs[dispserv->monitor_index], swoldmode->id);
XRRDestroyMode(dpy, swoldmode->id); XRRDestroyMode(dpy, swoldmode->id);
XSync(dpy, False); XSync(dpy, False);
} }
} }
} }
} }
} }
XRRFreeScreenResources(resources); XRRFreeScreenResources(resources);
XRRFreeScreenResources(res); XRRFreeScreenResources(res);
XCloseDisplay(dpy); XCloseDisplay(dpy);