Brightness (Linux): fix compatibility for ddcutil 2.0

This commit is contained in:
李通洲
2023-10-15 11:37:39 +08:00
committed by Carter Li
parent ea85f40682
commit 27cfec68ed
+12 -4
View File
@@ -90,8 +90,15 @@ static const char* detectWithBacklight(FFlist* result)
#include "common/library.h"
#include "util/mallocHelper.h"
#include <ddcutil_status_codes.h>
#include <ddcutil_macros.h>
#include <ddcutil_c_api.h>
// Try to be compatible with ddcutil 2.0
#if DDCUTIL_VMAJOR >= 2
double ddca_set_default_sleep_multiplier(double multiplier); // ddcutil 1.4
#endif
static const char* detectWithDdcci(FFBrightnessOptions* options, FFlist* result)
{
FF_LIBRARY_LOAD(libddcutil, &instance.config.libDdcutil, "dlopen ddcutil failed", "libddcutil" FF_LIBRARY_EXTENSION, 5);
@@ -100,11 +107,14 @@ static const char* detectWithDdcci(FFBrightnessOptions* options, FFlist* result)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(libddcutil, ddca_get_any_vcp_value_using_explicit_type)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(libddcutil, ddca_free_any_vcp_value)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(libddcutil, ddca_close_display)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(libddcutil, ddca_set_sleep_multiplier)
libddcutil = NULL; // Don't dlclose libddcutil. See https://github.com/rockowitz/ddcutil/issues/330
__typeof__(&ddca_set_default_sleep_multiplier) ffddca_set_default_sleep_multiplier = dlsym(libddcutil, "ddca_set_default_sleep_multiplier");
if (ffddca_set_default_sleep_multiplier)
ffddca_set_default_sleep_multiplier(options->ddcciSleep / 40.0);
FF_AUTO_FREE DDCA_Display_Info_List* infoList = NULL;
if (__builtin_expect(ffddca_get_display_info_list2(false, &infoList) < 0, 0))
if (ffddca_get_display_info_list2(false, &infoList) < 0)
return "ddca_get_display_info_list2(false, &infoList) failed";
if (infoList->ct == 0)
@@ -117,8 +127,6 @@ static const char* detectWithDdcci(FFBrightnessOptions* options, FFlist* result)
DDCA_Display_Handle handle;
if (ffddca_open_display2(display->dref, false, &handle) >= 0)
{
ffddca_set_sleep_multiplier(options->ddcciSleep / 40.0); // As of ddcutil 1.5, it sets the sleep multiplier for open display on the current thread
DDCA_Any_Vcp_Value* vcpValue = NULL;
if (ffddca_get_any_vcp_value_using_explicit_type(handle, 0x10 /*brightness*/, DDCA_NON_TABLE_VCP_VALUE, &vcpValue) >= 0)
{