From 25efa963b7b8c5780033880f6264078cb59bcb0c Mon Sep 17 00:00:00 2001 From: ihsandeniz <132747884+ihsandeniz@users.noreply.github.com> Date: Fri, 25 Sep 2026 16:36:27 +0300 Subject: [PATCH] Brightness (Linux): fixes random built-in flag and stdout leak in DDC/CI detection DDC/CI results never set `builtin`, and FF_LIST_ADD does not zero the new element, so external monitors were reported as built-in or external at random. Set it to false, as the BSD DDC/CI backend does. FF_SUPPRESS_IO() was declared inside the `if (ffddca_init)` block, so its cleanup restored stdout before display detection ran and libddcutil trace lines could reach the output, ahead of `--format json` too. Declare it at function scope so it covers the whole detection, including the FF_DISABLE_DLOPEN build. Closes #2615 --- CHANGELOG.md | 1 + src/detection/brightness/brightness_linux.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f9cbe6bb9..7b5b3e735e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,7 @@ Features: Bugfixes: * Fixed Snapdragon X2 series model detection on Linux. (#2611, CPU / Linux) +* Fixed external monitors detected via DDC/CI being randomly reported as built-in, and libddcutil trace messages occasionally leaking into the output and breaking `--format json`. (#2615, Brightness / Linux) * Fixed image logo caching, padding, and positioning issues, including an iTerm display bug. (Logo) * Fixed several Windows issues, including Windows Terminal font detection, redirected `--gen-config` output, and gamepad battery reporting for DualShock 4 and Switch controllers. (#2573, TerminalFont; Gamepad; General) * Fixed formatting and display issues, including ANSI-aware truncation, date/time formatting, and bright key/title colors. (Format / DateTime / Display) diff --git a/src/detection/brightness/brightness_linux.c b/src/detection/brightness/brightness_linux.c index ab82ac0b5c..515eb19592 100644 --- a/src/detection/brightness/brightness_linux.c +++ b/src/detection/brightness/brightness_linux.c @@ -98,10 +98,12 @@ static const char* detectWithDdcci([[maybe_unused]] FFBrightnessOptions* options FF_LIBRARY_LOAD_SYMBOL_MESSAGE(libddcutil, ddca_free_any_vcp_value) FF_LIBRARY_LOAD_SYMBOL_MESSAGE(libddcutil, ddca_close_display) + // libddcutil may print trace messages to stdout during display detection, not only in ddca_init + FF_SUPPRESS_IO(); + #ifndef FF_DISABLE_DLOPEN FF_LIBRARY_LOAD_SYMBOL_LAZY(libddcutil, ddca_init) if (ffddca_init) { - FF_SUPPRESS_IO(); // Ref: https://github.com/rockowitz/ddcutil/issues/344 if (ffddca_init(nullptr, -1 /*DDCA_SYSLOG_NOT_SET*/, 1 /*DDCA_INIT_OPTIONS_DISABLE_CONFIG_FILE*/) < 0) { return "ddca_init() failed"; @@ -148,6 +150,7 @@ static const char* detectWithDdcci([[maybe_unused]] FFBrightnessOptions* options brightness->max = max; brightness->min = 0; brightness->current = current; + brightness->builtin = false; ffStrbufInitS(&brightness->name, display->model_name); } ffddca_close_display(handle);