From 95e0a5ee95f2d307879acea37fa7fd78ec128d1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 22 Mar 2023 20:41:21 +0800 Subject: [PATCH] DisplayServer: fix programming errors --- .../displayserver/displayserver_windows.c | 64 +++++++++++-------- 1 file changed, 36 insertions(+), 28 deletions(-) diff --git a/src/detection/displayserver/displayserver_windows.c b/src/detection/displayserver/displayserver_windows.c index df71bf694..34fe40f82 100644 --- a/src/detection/displayserver/displayserver_windows.c +++ b/src/detection/displayserver/displayserver_windows.c @@ -15,8 +15,8 @@ typedef struct static CALLBACK WINBOOL enumMonitorProc(HMONITOR hMonitor, FF_MAYBE_UNUSED HDC hDC, FF_MAYBE_UNUSED LPRECT rc, LPARAM lparam) { - MONITORINFOEXW mi = { .cbSize = sizeof(mi) }; DataBundle* data = (DataBundle*) lparam; + MONITORINFOEXW mi = { .cbSize = sizeof(mi) }; if(GetMonitorInfoW(hMonitor, (MONITORINFO *)&mi) && wcscmp(mi.szDevice, data->deviceName) == 0) { data->width = (uint32_t) (mi.rcMonitor.right - mi.rcMonitor.left); @@ -33,56 +33,64 @@ static void detectDisplays(FFDisplayServerResult* ds, bool detectName) DISPLAYCONFIG_MODE_INFO modes[256]; uint32_t modeCount = sizeof(modes) / sizeof(modes[0]); - if (SUCCEEDED(QueryDisplayConfig( - QDC_ONLY_ACTIVE_PATHS | QDC_VIRTUAL_MODE_AWARE | 0x00000040 /*QDC_VIRTUAL_REFRESH_RATE_AWARE*/, + if (QueryDisplayConfig( + QDC_ONLY_ACTIVE_PATHS, &pathCount, paths, &modeCount, modes, - NULL))) + NULL) == ERROR_SUCCESS) { - for (uint32_t i = 0; i < modeCount; ++i) + for (uint32_t i = 0; i < pathCount; ++i) { - DISPLAYCONFIG_MODE_INFO* mode = &modes[i]; - if(mode->infoType != DISPLAYCONFIG_MODE_INFO_TYPE_TARGET) - continue; + DISPLAYCONFIG_PATH_INFO* path = &paths[i]; + + DataBundle data = {}; DISPLAYCONFIG_SOURCE_DEVICE_NAME sourceName = { .header = { .type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME, .size = sizeof(sourceName), - .adapterId = mode->adapterId, - .id = mode->id, + .adapterId = path->sourceInfo.adapterId, + .id = path->sourceInfo.id, }, }; - - DataBundle data = {}; - if(SUCCEEDED(DisplayConfigGetDeviceInfo(&sourceName.header))) + if (DisplayConfigGetDeviceInfo(&sourceName.header) == ERROR_SUCCESS) { data.deviceName = sourceName.viewGdiDeviceName; EnumDisplayMonitors(NULL, NULL, enumMonitorProc, (LPARAM) &data); } - // Find the target (monitor) friendly name - DISPLAYCONFIG_TARGET_DEVICE_NAME targetName = { - .header = { - .type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME, - .size = sizeof(targetName), - .adapterId = mode->adapterId, - .id = mode->id, - }, - }; - FF_STRBUF_AUTO_DESTROY name; ffStrbufInit(&name); - if(detectName && SUCCEEDED(DisplayConfigGetDeviceInfo(&targetName.header)) && targetName.flags.friendlyNameFromEdid) - ffStrbufSetWS(&name, targetName.monitorFriendlyDeviceName); + if (detectName) + { + DISPLAYCONFIG_TARGET_DEVICE_NAME targetName = { + .header = { + .type = DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME, + .size = sizeof(targetName), + .adapterId = path->targetInfo.adapterId, + .id = path->targetInfo.id, + }, + }; + if(DisplayConfigGetDeviceInfo(&targetName.header) == ERROR_SUCCESS) + { + if (targetName.flags.friendlyNameFromEdid) + ffStrbufSetWS(&name, targetName.monitorFriendlyDeviceName); + else + { + ffStrbufSetWS(&name, targetName.monitorDevicePath); + ffStrbufSubstrAfterFirstC(&name, '#'); + ffStrbufSubstrBeforeFirstC(&name, '#'); + } + } + } ffdsAppendDisplay(ds, - mode->targetMode.targetVideoSignalInfo.totalSize.cx, - mode->targetMode.targetVideoSignalInfo.totalSize.cy, - mode->targetMode.targetVideoSignalInfo.vSyncFreq.Numerator / (double) mode->targetMode.targetVideoSignalInfo.vSyncFreq.Denominator, + modes[path->sourceInfo.modeInfoIdx].sourceMode.width, + modes[path->sourceInfo.modeInfoIdx].sourceMode.height, + path->targetInfo.refreshRate.Numerator / (double) path->targetInfo.refreshRate.Denominator, data.width, data.height, &name);