summaryrefslogtreecommitdiffstats
path: root/src/options/general.c
diff options
context:
space:
mode:
authorsumuel <samuel@yakubos.org>2026-08-17 20:44:55 +0000
committersumuel <samuel@yakubos.org>2026-08-17 20:44:55 +0000
commit76424950e373d3b04ac3dd13019151bfba3e8423 (patch)
tree4c3cfdbda039e592b9186be3e28f8d7cfd439e8a /src/options/general.c
Add the files
Diffstat (limited to 'src/options/general.c')
-rw-r--r--src/options/general.c134
1 files changed, 134 insertions, 0 deletions
diff --git a/src/options/general.c b/src/options/general.c
new file mode 100644
index 0000000..6257a0f
--- /dev/null
+++ b/src/options/general.c
@@ -0,0 +1,134 @@
+#include "fastfetch.h"
+#include "common/jsonconfig.h"
+#include "common/processing.h"
+#include "common/strutil.h"
+#include "options/general.h"
+
+#include <unistd.h>
+
+const char* ffOptionsParseGeneralJsonConfig(FFOptionsGeneral* options, yyjson_val* root) {
+ yyjson_val* object = yyjson_obj_get(root, "general");
+ if (!object) {
+ return NULL;
+ }
+ if (!yyjson_is_obj(object)) {
+ return "Property 'general' must be an object";
+ }
+
+ yyjson_val *key, *val;
+ size_t idx, max;
+ yyjson_obj_foreach (object, idx, max, key, val) {
+ if (unsafe_yyjson_equals_str(key, "thread")) {
+ options->multithreading = yyjson_get_bool(val);
+ } else if (unsafe_yyjson_equals_str(key, "processingTimeout")) {
+ options->processingTimeout = (int32_t) yyjson_get_int(val);
+ } else if (unsafe_yyjson_equals_str(key, "preRun")) {
+ if (!yyjson_is_str(val)) {
+ return "general.preRun must be a string";
+ }
+ if (system(unsafe_yyjson_get_str(val)) < 0) {
+ return "Failed to execute preRun command";
+ }
+ } else if (unsafe_yyjson_equals_str(key, "detectVersion")) {
+ options->detectVersion = yyjson_get_bool(val);
+ } else if (unsafe_yyjson_equals_str(key, "playerName")) {
+ ffStrbufSetJsonVal(&options->playerName, val);
+ }
+#if defined(__linux__) || defined(__FreeBSD__) || defined(__sun) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) || defined(__GNU__)
+ else if (unsafe_yyjson_equals_str(key, "dsForceDrm")) {
+ if (yyjson_is_str(val)) {
+ int value;
+ const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) {
+ { "sysfs-only", FF_DS_FORCE_DRM_TYPE_SYSFS_ONLY },
+ { "false", FF_DS_FORCE_DRM_TYPE_FALSE },
+ { "true", FF_DS_FORCE_DRM_TYPE_TRUE },
+ {},
+ });
+ if (error) {
+ return "Invalid enum value of `dsForceDrm`";
+ } else {
+ options->dsForceDrm = (FFDsForceDrmType) value;
+ }
+ } else {
+ options->dsForceDrm = yyjson_get_bool(val) ? FF_DS_FORCE_DRM_TYPE_TRUE : FF_DS_FORCE_DRM_TYPE_FALSE;
+ }
+ }
+#endif
+ else {
+ return "Unknown general property";
+ }
+ }
+
+ return NULL;
+}
+
+bool ffOptionsParseGeneralCommandLine(FFOptionsGeneral* options, const char* key, const char* value) {
+ if (ffStrEqualsIgnCase(key, "--thread") || ffStrEqualsIgnCase(key, "--multithreading")) {
+ options->multithreading = ffOptionParseBoolean(value);
+ } else if (ffStrEqualsIgnCase(key, "--processing-timeout")) {
+ options->processingTimeout = ffOptionParseInt32(key, value);
+ } else if (ffStrEqualsIgnCase(key, "--detect-version")) {
+ options->detectVersion = ffOptionParseBoolean(value);
+ } else if (ffStrEqualsIgnCase(key, "--player-name")) {
+ ffOptionParseString(key, value, &options->playerName);
+ }
+#if defined(__linux__) || defined(__FreeBSD__) || defined(__sun) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) || defined(__GNU__)
+ else if (ffStrEqualsIgnCase(key, "--ds-force-drm")) {
+ if (ffOptionParseBoolean(value)) {
+ options->dsForceDrm = FF_DS_FORCE_DRM_TYPE_TRUE;
+ } else if (ffStrEqualsIgnCase(value, "sysfs-only")) {
+ options->dsForceDrm = FF_DS_FORCE_DRM_TYPE_SYSFS_ONLY;
+ } else {
+ options->dsForceDrm = FF_DS_FORCE_DRM_TYPE_FALSE;
+ }
+ }
+#endif
+ else {
+ return false;
+ }
+
+ return true;
+}
+
+void ffOptionsInitGeneral(FFOptionsGeneral* options) {
+ options->processingTimeout = 5000;
+ options->multithreading = true;
+ options->detectVersion = true;
+ ffStrbufInit(&options->playerName);
+
+#if defined(__linux__) || defined(__FreeBSD__) || defined(__sun) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) || defined(__GNU__)
+ options->dsForceDrm = FF_DS_FORCE_DRM_TYPE_FALSE;
+#endif
+}
+
+void ffOptionsDestroyGeneral(FFOptionsGeneral* options) {
+ ffStrbufDestroy(&options->playerName);
+}
+
+void ffOptionsGenerateGeneralJsonConfig(FFdata* data, FFOptionsGeneral* options) {
+ yyjson_mut_doc* doc = data->resultDoc;
+ yyjson_mut_val* obj = yyjson_mut_obj_add_obj(doc, doc->root, "general");
+
+ yyjson_mut_obj_add_bool(doc, obj, "thread", options->multithreading);
+
+ yyjson_mut_obj_add_int(doc, obj, "processingTimeout", options->processingTimeout);
+
+ yyjson_mut_obj_add_bool(doc, obj, "detectVersion", options->detectVersion);
+
+ yyjson_mut_obj_add_strbuf(doc, obj, "playerName", &options->playerName);
+
+#if defined(__linux__) || defined(__FreeBSD__) || defined(__sun) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) || defined(__GNU__)
+
+ switch (options->dsForceDrm) {
+ case FF_DS_FORCE_DRM_TYPE_FALSE:
+ yyjson_mut_obj_add_bool(doc, obj, "dsForceDrm", false);
+ break;
+ case FF_DS_FORCE_DRM_TYPE_SYSFS_ONLY:
+ yyjson_mut_obj_add_str(doc, obj, "dsForceDrm", "sysfs-only");
+ break;
+ case FF_DS_FORCE_DRM_TYPE_TRUE:
+ yyjson_mut_obj_add_bool(doc, obj, "dsForceDrm", true);
+ break;
+ }
+#endif
+}