Brightness (Linux): allow specifying busno for ddcutil

Ref: #580
This commit is contained in:
李通洲
2023-10-14 01:38:02 +08:00
parent 839ff311de
commit 42e87b498c
3 changed files with 97 additions and 26 deletions
+69 -26
View File
@@ -92,18 +92,80 @@ static const char* detectWithBacklight(FFlist* result)
#include <ddcutil_c_api.h>
typedef struct DdcutilData
{
FF_LIBRARY_SYMBOL(ddca_open_display2)
FF_LIBRARY_SYMBOL(ddca_get_any_vcp_value_using_explicit_type)
FF_LIBRARY_SYMBOL(ddca_free_any_vcp_value)
FF_LIBRARY_SYMBOL(ddca_close_display)
} DdcutilData;
static void detectWithDdcciImpl(DdcutilData* data, FFlist* result, DDCA_Display_Info* dinfo)
{
DDCA_Display_Handle handle;
if (data->ffddca_open_display2(dinfo->dref, false, &handle) >= 0)
{
DDCA_Any_Vcp_Value* vcpValue = NULL;
if (data->ffddca_get_any_vcp_value_using_explicit_type(handle, 0x10 /*brightness*/, DDCA_NON_TABLE_VCP_VALUE, &vcpValue) >= 0)
{
assert(vcpValue->value_type == DDCA_NON_TABLE_VCP_VALUE);
int current = VALREC_CUR_VAL(vcpValue), max = VALREC_MAX_VAL(vcpValue);
data->ffddca_free_any_vcp_value(vcpValue);
FFBrightnessResult* brightness = (FFBrightnessResult*) ffListAdd(result);
brightness->max = max;
brightness->min = 0;
brightness->current = current;
ffStrbufInitS(&brightness->name, dinfo->model_name);
}
data->ffddca_close_display(handle);
}
}
static const char* detectWithDdcci(FFlist* result)
{
FF_LIBRARY_LOAD(libddcutil, &instance.config.libDdcutil, "dlopen ddcutil failed", "libddcutil" FF_LIBRARY_EXTENSION, 5);
FF_LIBRARY_LOAD(libddcutil, &instance.config.libDdcutil, "dlopen ddcutil failed", "libddcutil" FF_LIBRARY_EXTENSION, 5)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(libddcutil, ddca_get_display_info_list2)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(libddcutil, ddca_open_display2)
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_get_display_info)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(libddcutil, ddca_create_busno_display_identifier)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(libddcutil, ddca_create_display_ref)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(libddcutil, ddca_free_display_identifier)
FF_LIBRARY_LOAD_SYMBOL_MESSAGE(libddcutil, ddca_free_display_ref)
DdcutilData ddcutilData;
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libddcutil, ddcutilData, ddca_open_display2)
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libddcutil, ddcutilData, ddca_get_any_vcp_value_using_explicit_type)
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libddcutil, ddcutilData, ddca_free_any_vcp_value)
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(libddcutil, ddcutilData, ddca_close_display)
libddcutil = NULL; // Don't dlclose libddcutil. See https://github.com/rockowitz/ddcutil/issues/330
if (instance.config.brightness.busNos.length)
{
FF_SUPPRESS_IO();
FF_LIST_FOR_EACH(int, busno, instance.config.brightness.busNos)
{
DDCA_Display_Identifier did;
if (ffddca_create_busno_display_identifier(*busno, &did) >= 0)
{
DDCA_Display_Ref dref;
if (ffddca_create_display_ref(did, &dref) >= 0)
{
FF_AUTO_FREE DDCA_Display_Info* dinfo = NULL;
if (ffddca_get_display_info(dref, &dinfo) >= 0)
detectWithDdcciImpl(&ddcutilData, result, dinfo);
ffddca_free_display_ref(dref);
}
ffddca_free_display_identifier(did);
}
}
return NULL;
}
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)
@@ -111,26 +173,7 @@ static const char* detectWithDdcci(FFlist* result)
for (int index = 0; index < infoList->ct; ++index)
{
const DDCA_Display_Info* display = &infoList->info[index];
DDCA_Display_Handle handle;
if (ffddca_open_display2(display->dref, false, &handle) >= 0)
{
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)
{
assert(vcpValue->value_type == DDCA_NON_TABLE_VCP_VALUE);
int current = VALREC_CUR_VAL(vcpValue), max = VALREC_MAX_VAL(vcpValue);
ffddca_free_any_vcp_value(vcpValue);
FFBrightnessResult* brightness = (FFBrightnessResult*) ffListAdd(result);
brightness->max = max;
brightness->min = 0;
brightness->current = current;
ffStrbufInitS(&brightness->name, display->model_name);
}
ffddca_close_display(handle);
}
detectWithDdcciImpl(&ddcutilData, result, &infoList->info[index]);
}
return NULL;