Files
fastfetch/src/modules/brightness/brightness.c
T
Carter Li e0c239729b L10n: adds cs id tr uk vi
Assisted-By: LLM
2026-08-21 10:19:06 +08:00

234 lines
9.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "common/percent.h"
#include "common/printing.h"
#include "common/jsonconfig.h"
#include "common/strutil.h"
#include "detection/brightness/brightness.h"
#include "modules/brightness/brightness.h"
bool ffPrintBrightness(FFBrightnessOptions* options) {
FF_LIST_AUTO_DESTROY result = ffListCreate();
const char* error = ffDetectBrightness(options, &result);
if (error) {
ffPrintError(FF_MODULE_GET_DISPLAY_NAME(Brightness), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "%s", error);
return false;
}
if (result.length == 0) {
ffPrintError(FF_MODULE_GET_DISPLAY_NAME(Brightness), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "No result is detected.");
return false;
}
FFPercentageTypeFlags percentType = options->percent.type == 0 ? instance.config.display.percentType : options->percent.type;
if (options->compact) {
FF_STRBUF_AUTO_DESTROY str = ffStrbufCreate();
FF_LIST_FOR_EACH (FFBrightnessResult, item, result) {
if (str.length > 0) {
ffStrbufAppendC(&str, ' ');
}
const double percent = (item->current - item->min) / (item->max - item->min) * 100;
ffPercentAppendNum(&str, percent, options->percent, false, &options->moduleArgs);
}
ffPrintLogoAndKey(FF_MODULE_GET_DISPLAY_NAME(Brightness), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT);
ffStrbufPutTo(&str, stdout);
return true;
}
FF_STRBUF_AUTO_DESTROY key = ffStrbufCreate();
uint32_t index = 0;
FF_LIST_FOR_EACH (FFBrightnessResult, item, result) {
if (options->moduleArgs.key.length == 0) {
ffStrbufAppendF(&key, "%s (%s)", FF_MODULE_GET_DISPLAY_NAME(Brightness), item->name.chars);
} else {
uint32_t moduleIndex = result.length == 1 ? 0 : index + 1;
FF_PARSE_FORMAT_STRING_CHECKED(&key, &options->moduleArgs.key, ((FFformatarg[]) {
FF_ARG(moduleIndex, "index"),
FF_ARG(item->name, "name"),
FF_ARG(options->moduleArgs.keyIcon, "icon"),
}));
}
const double percent = (item->current - item->min) / (item->max - item->min) * 100;
if (options->moduleArgs.outputFormat.length == 0) {
FF_STRBUF_AUTO_DESTROY str = ffStrbufCreate();
ffPrintLogoAndKey(key.chars, 0, &options->moduleArgs, FF_PRINT_TYPE_NO_CUSTOM_KEY);
if (percentType & FF_PERCENTAGE_TYPE_BAR_BIT) {
ffPercentAppendBar(&str, percent, options->percent, &options->moduleArgs);
}
if (percentType & FF_PERCENTAGE_TYPE_NUM_BIT) {
if (str.length > 0) {
ffStrbufAppendC(&str, ' ');
}
ffPercentAppendNum(&str, percent, options->percent, str.length > 0, &options->moduleArgs);
}
ffStrbufAppendS(&str, item->builtin ? " [Built-in]" : " [External]");
ffStrbufPutTo(&str, stdout);
} else {
FF_STRBUF_AUTO_DESTROY valueNum = ffStrbufCreate();
if (percentType & FF_PERCENTAGE_TYPE_NUM_BIT) {
ffPercentAppendNum(&valueNum, percent, options->percent, false, &options->moduleArgs);
}
FF_STRBUF_AUTO_DESTROY valueBar = ffStrbufCreate();
if (percentType & FF_PERCENTAGE_TYPE_BAR_BIT) {
ffPercentAppendBar(&valueBar, percent, options->percent, &options->moduleArgs);
}
FF_PRINT_FORMAT_CHECKED(key.chars, 0, &options->moduleArgs, FF_PRINT_TYPE_NO_CUSTOM_KEY, ((FFformatarg[]) {
FF_ARG(valueNum, "percentage"),
FF_ARG(item->name, "name"),
FF_ARG(item->max, "max"),
FF_ARG(item->min, "min"),
FF_ARG(item->current, "current"),
FF_ARG(valueBar, "percentage-bar"),
FF_ARG(item->builtin, "is-builtin"),
}));
}
ffStrbufClear(&key);
ffStrbufDestroy(&item->name);
++index;
}
return true;
}
void ffParseBrightnessJsonObject(FFBrightnessOptions* options, yyjson_val* module) {
yyjson_val *key, *val;
size_t idx, max;
yyjson_obj_foreach (module, idx, max, key, val) {
if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) {
continue;
}
if (unsafe_yyjson_equals_str(key, "ddcciSleep")) {
if (yyjson_is_null(val)) {
options->ddcciSleep = FF_BRIGHTNESS_DDCCI_SLEEP_SKIP;
} else {
options->ddcciSleep = (uint32_t) yyjson_get_uint(val);
}
continue;
}
if (unsafe_yyjson_equals_str(key, "compact")) {
options->compact = (uint32_t) yyjson_get_bool(val);
continue;
}
if (ffPercentParseJsonObject(key, val, &options->percent)) {
continue;
}
ffPrintError(FF_MODULE_GET_DISPLAY_NAME(Brightness), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key));
}
}
void ffGenerateBrightnessJsonConfig(FFBrightnessOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs);
if (options->ddcciSleep == FF_BRIGHTNESS_DDCCI_SLEEP_SKIP) {
yyjson_mut_obj_add_null(doc, module, "ddcciSleep");
} else {
yyjson_mut_obj_add_uint(doc, module, "ddcciSleep", options->ddcciSleep);
}
ffPercentGenerateJsonConfig(doc, module, options->percent);
yyjson_mut_obj_add_bool(doc, module, "compact", options->compact);
}
bool ffGenerateBrightnessJsonResult([[maybe_unused]] FFBrightnessOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
FF_LIST_AUTO_DESTROY result = ffListCreate();
const char* error = ffDetectBrightness(options, &result);
if (error) {
yyjson_mut_obj_add_str(doc, module, "error", error);
return false;
}
yyjson_mut_val* arr = yyjson_mut_arr(doc);
yyjson_mut_obj_add_val(doc, module, "result", arr);
FF_LIST_FOR_EACH (FFBrightnessResult, item, result) {
yyjson_mut_val* obj = yyjson_mut_arr_add_obj(doc, arr);
yyjson_mut_obj_add_strbuf(doc, obj, "name", &item->name);
yyjson_mut_obj_add_real(doc, obj, "max", item->max);
yyjson_mut_obj_add_real(doc, obj, "min", item->min);
yyjson_mut_obj_add_real(doc, obj, "current", item->current);
yyjson_mut_obj_add_bool(doc, obj, "builtin", item->builtin);
}
FF_LIST_FOR_EACH (FFBrightnessResult, item, result) {
ffStrbufDestroy(&item->name);
}
return true;
}
void ffInitBrightnessOptions(FFBrightnessOptions* options) {
ffOptionInitModuleArg(&options->moduleArgs, "󰯪");
options->ddcciSleep = 10;
options->percent = (FFPercentageModuleConfig) { 100, 100, 0 };
options->compact = false;
}
void ffDestroyBrightnessOptions(FFBrightnessOptions* options) {
ffOptionDestroyModuleArg(&options->moduleArgs);
}
FFModuleBaseInfo ffBrightnessModuleInfo = {
.name = "Brightness",
.description = "Print the current brightness level of your monitors",
.displayName = {
.en = "Brightness",
.ar = "السطوع",
.cs = "Jas",
.de = "Helligkeit",
.es = "Brillo",
.fr = "Luminosité",
.gl = "Brillo",
.he = "בהירות",
.id = "Kecerahan",
.it = "Luminosità",
.ja = "明るさ",
.ko = "밝기",
.pl = "Jasność",
.pt = "Brilho",
.ru = "Яркость",
.tr = "Parlaklık",
.uk = "Яскравість",
.vi = "Độ sáng",
.zh_CN = "亮度",
.zh_TW = "亮度",
},
.initOptions = (void*) ffInitBrightnessOptions,
.destroyOptions = (void*) ffDestroyBrightnessOptions,
.parseJsonObject = (void*) ffParseBrightnessJsonObject,
.printModule = (void*) ffPrintBrightness,
.generateJsonResult = (void*) ffGenerateBrightnessJsonResult,
.generateJsonConfig = (void*) ffGenerateBrightnessJsonConfig,
.formatArgs = FF_FORMAT_ARG_LIST(((FFModuleFormatArg[]) {
{ "Screen brightness (percentage num)", "percentage" },
{ "Screen name", "name" },
{ "Maximum brightness value", "max" },
{ "Minimum brightness value", "min" },
{ "Current brightness value", "current" },
{ "Screen brightness (percentage bar)", "percentage-bar" },
{ "Is built-in screen", "is-builtin" },
})),
.defaultOrder = 18,
};