diff --git a/CMakeLists.txt b/CMakeLists.txt index 426a07cab..76992f71e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -432,7 +432,7 @@ elseif(BSD) src/detection/bios/bios_bsd.c src/detection/bluetooth/bluetooth_linux.c src/detection/board/board_bsd.c - src/detection/brightness/brightness_nosupport.c + src/detection/brightness/brightness_bsd.c src/detection/chassis/chassis_bsd.c src/detection/cpu/cpu_bsd.c src/detection/cpuusage/cpuusage_bsd.c diff --git a/src/detection/brightness/brightness_bsd.c b/src/detection/brightness/brightness_bsd.c new file mode 100644 index 000000000..8c6a89e2f --- /dev/null +++ b/src/detection/brightness/brightness_bsd.c @@ -0,0 +1,47 @@ +#include "brightness.h" + +#if __has_include() + +#include "common/io/io.h" + +#include +#include +#include +#include + +const char* ffDetectBrightness(FFlist* result) +{ + // https://man.freebsd.org/cgi/man.cgi?query=backlight&sektion=9 + char path[] = "/dev/backlight/backlight0"; + + for (char i = '0'; i <= '9'; ++i) + { + path[sizeof(path) - 2] = i; + + FF_AUTO_CLOSE_FD int blfd = open(path, O_RDONLY); + if (blfd < 0) + continue; + + struct backlight_props status; + if(ioctl(blfd, BACKLIGHTGETSTATUS, &status) < 0) + continue; + + FFBrightnessResult* display = (FFBrightnessResult*) ffListAdd(result); + ffStrbufInit(&display->name); + display->value = (float) status.brightness / BACKLIGHTMAXLEVELS; + + struct backlight_info info; + if(ioctl(blfd, BACKLIGHTGETINFO, &info) < 0) + ffStrbufAppendS(&display->name, info.name); + } + return NULL; +} + +#else + +const char* ffDetectBrightness(FF_MAYBE_UNUSED FFlist* result) +{ + return "Backlight is supported only on FreeBSD 13 and newer"; +} + +#endif \ No newline at end of file