From 0c522bdc10a201d3b3838350607d1ece871d8c86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 28 Nov 2023 07:59:28 +0000 Subject: [PATCH] Display (Linux): don't report disabled displays when using DRM Ref: #634 --- .../displayserver/linux/displayserver_linux.c | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/detection/displayserver/linux/displayserver_linux.c b/src/detection/displayserver/linux/displayserver_linux.c index 7f1167520..9de55e94b 100644 --- a/src/detection/displayserver/linux/displayserver_linux.c +++ b/src/detection/displayserver/linux/displayserver_linux.c @@ -9,7 +9,7 @@ static void parseDRM(FFDisplayServerResult* result) { const char* drmDirPath = "/sys/class/drm/"; - DIR* dirp = opendir(drmDirPath); + FF_AUTO_CLOSE_DIR DIR* dirp = opendir(drmDirPath); if(dirp == NULL) return; @@ -25,10 +25,22 @@ static void parseDRM(FFDisplayServerResult* result) continue; ffStrbufAppendS(&drmDir, entry->d_name); + uint32_t drmDirWithDnameLength = drmDir.length; + + ffStrbufAppendS(&drmDir, "/enabled"); + char enabled = 'd'; // disabled + ffReadFileData(drmDir.chars, sizeof(enabled), &enabled); + if (enabled != 'e') // enabled + { + ffStrbufSubstrBefore(&drmDir, drmDirLength); + continue; + } + + ffStrbufSubstrBefore(&drmDir, drmDirWithDnameLength); ffStrbufAppendS(&drmDir, "/modes"); - FILE* modeFile = fopen(drmDir.chars, "r"); - if(modeFile == NULL) + char modes[32]; + if (ffReadFileData(drmDir.chars, sizeof(modes), modes) < 3) { ffStrbufSubstrBefore(&drmDir, drmDirLength); continue; @@ -36,7 +48,7 @@ static void parseDRM(FFDisplayServerResult* result) uint32_t width = 0, height = 0; - int scanned = fscanf(modeFile, "%ux%u", &width, &height); + int scanned = sscanf(modes, "%ux%u", &width, &height); if(scanned == 2 && width > 0 && height > 0) { ffStrbufSubstrBefore(&drmDir, drmDirLength); @@ -71,11 +83,8 @@ static void parseDRM(FFDisplayServerResult* result) ); } - fclose(modeFile); ffStrbufSubstrBefore(&drmDir, drmDirLength); } - - closedir(dirp); } void ffConnectDisplayServerImpl(FFDisplayServerResult* ds)