From e093c8aa72d2869d9a29bb8ae95fee3738fefc42 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Thu, 31 Jul 2025 14:34:18 +0800 Subject: [PATCH 01/83] Packaging: update debian stuff [ci skip] --- debian/changelog | 6 ++++++ debian/files | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 331be609b..0d9c31f5a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +fastfetch (2.49.0) jammy; urgency=medium + + * Update to 2.49.0 + + -- Carter Li Thu, 31 Jul 2025 14:32:59 +0800 + fastfetch (2.48.0) jammy; urgency=medium * Update to 2.48.0 diff --git a/debian/files b/debian/files index 9c35d4bb2..0f3b30800 100644 --- a/debian/files +++ b/debian/files @@ -1 +1 @@ -fastfetch_2.48.0_source.buildinfo universe/utils optional +fastfetch_2.49.0_source.buildinfo universe/utils optional From 559905da6039857457f17d0e5600508409ffef6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 31 Jul 2025 14:54:33 +0800 Subject: [PATCH 02/83] Changelog: fix typo [ci skip] --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c9cd1bd1..241f34200 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,8 +26,8 @@ Features: * Add `--{duration,percent,size,freq,temp}-space-before-unit [always|never]` options to add a space before the unit when printing duration, percent, size, frequency and temperature values * Add `--duration-abbreviation` to abbreviate duration values in custom format * For example: `1 day, 2 hours, 3 mins` will be displayed as `1d 2h 3m` -* Add `--percent-with` to pad the percent value with spaces to a fixed width - * For example: `--percent-with 3` will display ` 50%` instead of `50%`; useful for aligning percent values in custom format +* Add `--percent-width` to pad the percent value with spaces to a fixed width + * For example: `--percent-width 3` will display ` 50%` instead of `50%`; useful for aligning percent values in custom format Bugfixes: * Improve accuracy of Flatpak count detection (#1856, Packages, Linux) From 78fb55c35c5e1dfc6cf57cb969346e0d7d752181 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 31 Jul 2025 18:58:36 +0800 Subject: [PATCH 03/83] Chore: remove sensitive data [ci skip] --- src/detection/wifi/wifi_apple.m | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/detection/wifi/wifi_apple.m b/src/detection/wifi/wifi_apple.m index 1792bb851..23e97566c 100644 --- a/src/detection/wifi/wifi_apple.m +++ b/src/detection/wifi/wifi_apple.m @@ -66,8 +66,6 @@ static const char* detectByWdutil(FFlist* result) }) == NULL; if (!ok) return "Failed to run wdutil info command"; - // ffStrbufSetS(&wdutil, "————————————————————————————————————————————————————————————————————\nNETWORK\n————————————————————————————————————————————————————————————————————\n Primary IPv4 : en0 (Wi-Fi / 37C2D473-40B7-4AFB-93D2-49C588580986)\n : 192.168.48.96\n Primary IPv6 : en0 (Wi-Fi / 37C2D473-40B7-4AFB-93D2-49C588580986)\n : 240a:42a3:5200:1092:18c7:87a2:c8df:ad5a\n : 240a:42a3:5200:1092:5837:b618:deb0:b60c\n DNS Addresses : 240a:42a3:5200:1092::1b\n : 192.168.48.210\n Apple : Reachable\n————————————————————————————————————————————————————————————————————\nWIFI\n————————————————————————————————————————————————————————————————————\n MAC Address : 9e:c4:0a:4b:fe:ab (hw=f4:d4:88:70:f3:39)\n Interface Name : en0\n Power : On [On]\n Op Mode : STA\n SSID : iQOO 13\n BSSID : 92:ad:bb:24:51:bb\n RSSI : -24 dBm\n CCA : 36 %\n Noise : -83 dBm\n Tx Rate : 229.0 Mbps\n Security : WPA2 Personal\n PHY Mode : 11ax\n MCS Index : 9\n Guard Interval : 800\n NSS : 2\n Channel : 2g6/20\n Country Code : CN\n Scan Cache Count : 37\n NetworkServiceID : 37C2D473-40B7-4AFB-93D2-49C588580986\n IPv4 Config Method : DHCP\n IPv4 Address : 192.168.48.96\n IPv4 Router : 192.168.48.210\n IPv6 Config Method : Automatic\n IPv6 Address : 240a:42a3:5200:1092:18c7:87a2:c8df:ad5a\n : 240a:42a3:5200:1092:5837:b618:deb0:b60c\n IPv6 Router : fe80::90ad:bbff:fe24:51bb\n DNS : 192.168.48.210\n : 240a:42a3:5200:1092::1b\n BTC Mode : Off\n Desense :\n Chain Ack : []\n BTC Profile 2.4GHz : Disabled\n BTC Profile 5GHz : Disabled\n Sniffer Supported : YES\n Supports 6e : No\n Supported Channels : 2g1/20,2g2/20,2g3/20,2g4/20,2g5/20,2g6/20,2g7/20,2g8/20,2g9/20,2g10/20,2g11/20,2g12/20,2g13/20,5g36/20,5g40/20,5g44/20,5g48/20,5g52/20,5g56/20,5g60/20,5g64/20,5g149/20,5g153/20,5g157/20,5g161/20,5g165/20,5g36/40,5g40/40,5g44/40,5g48/40,5g52/40,5g56/40,5g60/40,5g64/40,5g149/40,5g153/40,5g157/40,5g161/40,5g36/80,5g40/80,5g44/80,5g48/80,5g52/80,5g56/80,5g60/80,5g64/80,5g149/80,5g153/80,5g157/80,5g161/80\n————————————————————————————————————————————————————————————————————\nBLUETOOTH\n————————————————————————————————————————————————————————————————————\n Power : On\n Address : f4:d4:88:78:91:4a\n Discoverable : No\n Connectable : Yes\n Scanning : No\n Devices : 12 (paired=5 cloud=1 connected=0)\n\n iQOO Wireless Active\n Address : 20:18:5b:3a:fe:93\n Paired : Yes\n CloudPaired : No\n Connected : No\n\n ERAZER N500\n Address : c1:35:45:fb:16:ac\n Paired : No\n CloudPaired : No\n Connected : No\n\n M585/M590\n Address : c9:7a:ff:82:3b:fe\n Paired : No\n CloudPaired : No\n Connected : No\n\n Xiaomi Earphones Explore\n Address : e0:08:71:78:75:0d\n Paired : Yes\n CloudPaired : No\n Connected : No\n\n WH-1000XM5\n Address : 88:c9:e8:61:fa:76\n Paired : Yes\n CloudPaired : No\n Connected : No\n\n ERAZER G501\n Address : d1:00:0f:08:ae:42\n Paired : No\n CloudPaired : No\n Connected : No\n\n MSI BluetoothMouse\n Address : e0:10:9c:40:73:c5\n Paired : No\n CloudPaired : No\n Connected : No\n\n Bluetooth Mouse M336/M337/M535\n Address : 34:88:5d:8f:c0:fe\n Paired : Yes\n CloudPaired : No\n Connected : No\n\n MacBook Pro\n Address : 3c:15:c2:e5:00:b7\n Paired : No\n CloudPaired : Yes\n Connected : No\n\n\n Address : e4:57:68:8e:bb:28\n Paired : No\n CloudPaired : No\n Connected : No\n\n ERAZER N500\n Address : c1:35:45:fb:16:aa\n Paired : No\n CloudPaired : No\n Connected : No\n\n Pro Controller\n Address : 5c:52:1e:88:7e:70\n Paired : Yes\n CloudPaired : No\n Connected : No\n\n————————————————————————————————————————————————————————————————————\nAWDL\n————————————————————————————————————————————————————————————————————\n MAC Address : 46:3a:d9:c1:b0:2e (hw=46:3a:d9:c1:b0:2e)\n AirDrop Disc Mode : Everyone\n AWDL Enabled : No\n Interface Name : awdl0\n Power : On\n IPv6 Address : fe80::443a:d9ff:fec1:b02e\n Schedule State : n/a\n Channel Sequence : n/a\n Op Mode : n/a\n Real Time Mode : No\n Sync State : n/a\n Sync Params : n/a\n Master Channel : n/a\n Election Params : n/a\n————————————————————————————————————————————————————————————————————\nPOWER\n————————————————————————————————————————————————————————————————————\n Power Source : AC\n Battery Warning Level: None\n System Caps : FullWake:cpu disk net aud vid\n————————————————————————————————————————————————————————————————————\nWIFI FAULTS LAST HOUR\n————————————————————————————————————————————————————————————————————\n None\n————————————————————————————————————————————————————————————————————\nWIFI RECOVERIES LAST HOUR\n————————————————————————————————————————————————————————————————————\n None\n————————————————————————————————————————————————————————————————————\nWIFI LINK TESTS LAST HOUR\n————————————————————————————————————————————————————————————————————\n None"); - // ... // ———————————————————————————————————————————————————————————————————— // WIFI From 671b11157ee16328c2d8e6b00273ba0efd367c91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 1 Aug 2025 08:54:16 +0800 Subject: [PATCH 04/83] Wifi (macOS): disable using of `ipconfig` on 15.6 too Ref: #1874 --- src/detection/wifi/wifi_apple.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/detection/wifi/wifi_apple.m b/src/detection/wifi/wifi_apple.m index 23e97566c..4451eb6b8 100644 --- a/src/detection/wifi/wifi_apple.m +++ b/src/detection/wifi/wifi_apple.m @@ -11,9 +11,9 @@ static inline double rssiToSignalQuality(int rssi) static bool queryIpconfig(const char* ifName, FFstrbuf* result) { - if (@available(macOS 26.0, *)) + if (@available(macOS 15.6, *)) { - // ipconfig no longer work in Tahoe + // ipconfig reports too return false; } @@ -385,7 +385,7 @@ static const char* detectByCoreWlan(FFlist* result) const char* ffDetectWifi(FFlist* result) { - if (@available(macOS 26.0, *)) + if (@available(macOS 15.6, *)) { if (detectByWdutil(result) == NULL) return NULL; From afe2c85047d58bf9140eabc394cd4f73cda2fdd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 1 Aug 2025 10:51:26 +0800 Subject: [PATCH 05/83] Bar: add configurable elapsed bar borders for percent bars Fix #1875 --- doc/json_schema.json | 10 ++++++++++ src/common/percent.c | 24 +++++++++++++++++++----- src/data/help.json | 16 ++++++++++++++++ src/options/display.c | 14 ++++++++++++++ src/options/display.h | 2 ++ 5 files changed, 61 insertions(+), 5 deletions(-) diff --git a/doc/json_schema.json b/doc/json_schema.json index 3805a71fe..5e580d434 100644 --- a/doc/json_schema.json +++ b/doc/json_schema.json @@ -1017,6 +1017,16 @@ "description": "Set the string to use at right border", "default": " ]" }, + "borderLeftElapsed": { + "type": "string", + "description": "If both borderLeftElapsed and borderRightElapsed are set, the border will be used as parts of bar content", + "default": "" + }, + "borderRightElapsed": { + "type": "string", + "description": "If both borderLeftElapsed and borderRightElapsed are set, the border will be used as parts of bar content", + "default": "" + }, "width": { "type": "integer", "description": "Set the width of the bar, in number of characters", diff --git a/src/common/percent.c b/src/common/percent.c index 746556183..947925174 100644 --- a/src/common/percent.c +++ b/src/common/percent.c @@ -60,10 +60,12 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf const FFOptionsDisplay* options = &instance.config.display; + const bool borderAsValue = options->barBorderLeftElapsed.length && options->barBorderRightElapsed.length; + uint32_t blocksPercent = (uint32_t) (percent / 100.0 * options->barWidth + 0.5); assert(blocksPercent <= options->barWidth); - if(options->barBorderLeft.length) + if(!borderAsValue && options->barBorderLeft.length) { if(!options->pipe) ffStrbufAppendS(buffer, "\e[" FF_COLOR_FG_LIGHT_WHITE "m"); @@ -76,7 +78,11 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf ffStrbufAppendS(buffer, "\e[" FF_COLOR_FG_LIGHT_BLACK "m"); for (uint32_t i = 0; i < options->barWidth; ++i) - ffStrbufAppend(buffer, &options->barCharElapsed); + ffStrbufAppend(buffer, borderAsValue && i == 0 + ? &options->barBorderLeft + : borderAsValue && i == options->barWidth - 1 + ? &options->barBorderRight + : &options->barCharTotal); } else { @@ -120,7 +126,11 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf ffStrbufAppendF(buffer, "\e[%sm", (green <= yellow ? colorGreen : colorRed)); } } - ffStrbufAppend(buffer, &options->barCharElapsed); + ffStrbufAppend(buffer, borderAsValue && i == 0 + ? &options->barBorderLeftElapsed + : borderAsValue && i == options->barWidth - 1 + ? &options->barBorderRightElapsed + : &options->barCharElapsed); } if (blocksPercent < options->barWidth) @@ -128,11 +138,15 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf if(!options->pipe) ffStrbufAppendS(buffer, "\e[" FF_COLOR_FG_LIGHT_WHITE "m"); for (uint32_t i = blocksPercent; i < options->barWidth; ++i) - ffStrbufAppend(buffer, &options->barCharTotal); + ffStrbufAppend(buffer, borderAsValue && i == 0 + ? &options->barBorderLeft + : borderAsValue && i == options->barWidth - 1 + ? &options->barBorderRight + : &options->barCharTotal); } } - if(options->barBorderRight.length) + if(!borderAsValue && options->barBorderRight.length) { if(!options->pipe) ffStrbufAppendS(buffer, "\e[" FF_COLOR_FG_LIGHT_WHITE "m"); diff --git a/src/data/help.json b/src/data/help.json index 59f16be66..c36ab4a96 100644 --- a/src/data/help.json +++ b/src/data/help.json @@ -699,6 +699,22 @@ "default": " ]" } }, + { + "long": "bar-border-left-elapsed", + "desc": "If both bar-border-left-elapsed and bar-border-right-elapsed are set, the border will be used as parts of bar content", + "arg": { + "type": "string", + "default": "" + } + }, + { + "long": "bar-border-right-elapsed", + "desc": "If both bar-border-left-elapsed and bar-border-right-elapsed are set, the border will be used as parts of bar content", + "arg": { + "type": "string", + "default": "" + } + }, { "long": "bar-width", "desc": "Set the width of percentage bars in characters", diff --git a/src/options/display.c b/src/options/display.c index eae73b1c9..767ec825e 100644 --- a/src/options/display.c +++ b/src/options/display.c @@ -281,6 +281,14 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va if (borderRight) ffStrbufSetS(&options->barBorderRight, yyjson_get_str(borderRight)); + yyjson_val* borderLeftElapsed = yyjson_obj_get(val, "borderLeftElapsed"); + if (borderLeftElapsed) + ffStrbufSetS(&options->barBorderLeftElapsed, yyjson_get_str(borderLeftElapsed)); + + yyjson_val* borderRightElapsed = yyjson_obj_get(val, "borderRightElapsed"); + if (borderRightElapsed) + ffStrbufSetS(&options->barBorderRightElapsed, yyjson_get_str(borderRightElapsed)); + yyjson_val* width = yyjson_obj_get(val, "width"); if (width) options->barWidth = (uint8_t) yyjson_get_uint(width); @@ -623,6 +631,10 @@ bool ffOptionsParseDisplayCommandLine(FFOptionsDisplay* options, const char* key ffOptionParseString(key, value, &options->barBorderLeft); else if(ffStrEqualsIgnCase(subkey, "border-right")) ffOptionParseString(key, value, &options->barBorderRight); + else if(ffStrEqualsIgnCase(subkey, "border-left-elapsed")) + ffOptionParseString(key, value, &options->barBorderLeftElapsed); + else if(ffStrEqualsIgnCase(subkey, "border-right-elapsed")) + ffOptionParseString(key, value, &options->barBorderRightElapsed); else return false; } @@ -691,6 +703,8 @@ void ffOptionsInitDisplay(FFOptionsDisplay* options) ffStrbufInitStatic(&options->barCharTotal, "-"); ffStrbufInitStatic(&options->barBorderLeft, "[ "); ffStrbufInitStatic(&options->barBorderRight, " ]"); + ffStrbufInit(&options->barBorderLeftElapsed); + ffStrbufInit(&options->barBorderRightElapsed); options->barWidth = 10; options->durationAbbreviation = false; options->durationSpaceBeforeUnit = FF_SPACE_BEFORE_UNIT_DEFAULT; diff --git a/src/options/display.h b/src/options/display.h index 6a50b848c..90d4da316 100644 --- a/src/options/display.h +++ b/src/options/display.h @@ -60,6 +60,8 @@ typedef struct FFOptionsDisplay FFstrbuf barCharTotal; FFstrbuf barBorderLeft; FFstrbuf barBorderRight; + FFstrbuf barBorderLeftElapsed; + FFstrbuf barBorderRightElapsed; uint8_t barWidth; FFPercentageTypeFlags percentType; uint8_t percentNdigits; From c6675f82f02f75f63ab528256c9032853019aef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 1 Aug 2025 13:50:02 +0800 Subject: [PATCH 06/83] Bar: add customizable bar color options for percentage bars --- doc/json_schema.json | 14 ++++++++++++++ src/common/percent.c | 16 +++++++++++----- src/data/help.json | 25 +++++++++++++++++++++++++ src/options/display.c | 19 +++++++++++++++++++ src/options/display.h | 3 +++ 5 files changed, 72 insertions(+), 5 deletions(-) diff --git a/doc/json_schema.json b/doc/json_schema.json index 5e580d434..b4c82c33e 100644 --- a/doc/json_schema.json +++ b/doc/json_schema.json @@ -1027,6 +1027,20 @@ "description": "If both borderLeftElapsed and borderRightElapsed are set, the border will be used as parts of bar content", "default": "" }, + "colorElapsed": { + "description": "Color to use in the elapsed part of percentage bars", + "$ref": "#/$defs/colors" + }, + "colorTotal": { + "description": "Color to use in the total part of percentage bars", + "$ref": "#/$defs/colors", + "default": "light_white" + }, + "colorBorder": { + "description": "Color to use in the borders of percentage bars", + "$ref": "#/$defs/colors", + "default": "light_white" + }, "width": { "type": "integer", "description": "Set the width of the bar, in number of characters", diff --git a/src/common/percent.c b/src/common/percent.c index 947925174..1d164db47 100644 --- a/src/common/percent.c +++ b/src/common/percent.c @@ -68,7 +68,7 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf if(!borderAsValue && options->barBorderLeft.length) { if(!options->pipe) - ffStrbufAppendS(buffer, "\e[" FF_COLOR_FG_LIGHT_WHITE "m"); + ffStrbufAppendF(buffer, "\e[%sm", options->barColorBorder.chars); ffStrbufAppend(buffer, &options->barBorderLeft); } @@ -78,11 +78,13 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf ffStrbufAppendS(buffer, "\e[" FF_COLOR_FG_LIGHT_BLACK "m"); for (uint32_t i = 0; i < options->barWidth; ++i) + { ffStrbufAppend(buffer, borderAsValue && i == 0 ? &options->barBorderLeft : borderAsValue && i == options->barWidth - 1 ? &options->barBorderRight : &options->barCharTotal); + } } else { @@ -91,7 +93,7 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf const char* colorRed = options->percentColorRed.chars; FFPercentageTypeFlags percentType = config.type == 0 ? options->percentType : config.type; - bool monochrome = !!(percentType & FF_PERCENTAGE_TYPE_BAR_MONOCHROME_BIT); + bool monochrome = !!(percentType & FF_PERCENTAGE_TYPE_BAR_MONOCHROME_BIT) || options->barColorElapsed.length; for (uint32_t i = 0; i < blocksPercent; ++i) { @@ -100,7 +102,9 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf if (monochrome) { const char* color = NULL; - if (green <= yellow) + if (options->barColorElapsed.length) + color = options->barColorElapsed.chars; + else if (green <= yellow) { if (percent < green) color = colorGreen; else if (percent < yellow) color = colorYellow; @@ -136,20 +140,22 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf if (blocksPercent < options->barWidth) { if(!options->pipe) - ffStrbufAppendS(buffer, "\e[" FF_COLOR_FG_LIGHT_WHITE "m"); + ffStrbufAppendF(buffer, "\e[%sm", options->barColorTotal.chars); for (uint32_t i = blocksPercent; i < options->barWidth; ++i) + { ffStrbufAppend(buffer, borderAsValue && i == 0 ? &options->barBorderLeft : borderAsValue && i == options->barWidth - 1 ? &options->barBorderRight : &options->barCharTotal); + } } } if(!borderAsValue && options->barBorderRight.length) { if(!options->pipe) - ffStrbufAppendS(buffer, "\e[" FF_COLOR_FG_LIGHT_WHITE "m"); + ffStrbufAppendF(buffer, "\e[%sm", options->barColorBorder.chars); ffStrbufAppend(buffer, &options->barBorderRight); } diff --git a/src/data/help.json b/src/data/help.json index c36ab4a96..7a5ba4ec1 100644 --- a/src/data/help.json +++ b/src/data/help.json @@ -715,6 +715,31 @@ "default": "" } }, + { + "long": "bar-color-elapsed", + "desc": "Set the color to use in the elapsed part of percentage bars", + "remark": "By default, auto selected by percent-color-{green,yellow,red}", + "arg": { + "type": "color", + "default": "" + } + }, + { + "long": "bar-color-total", + "desc": "Set the color to use in the total part of percentage bars", + "arg": { + "type": "color", + "default": "light_white" + } + }, + { + "long": "bar-color-border", + "desc": "Set the color to use in the borders of percentage bars", + "arg": { + "type": "color", + "default": "light_white" + } + }, { "long": "bar-width", "desc": "Set the width of percentage bars in characters", diff --git a/src/options/display.c b/src/options/display.c index 767ec825e..99adbf61c 100644 --- a/src/options/display.c +++ b/src/options/display.c @@ -289,6 +289,15 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va if (borderRightElapsed) ffStrbufSetS(&options->barBorderRightElapsed, yyjson_get_str(borderRightElapsed)); + yyjson_val* colorElapsed = yyjson_obj_get(val, "colorElapsed"); + if (colorElapsed) ffOptionParseColor(yyjson_get_str(colorElapsed), &options->barColorElapsed); + + yyjson_val* colorTotal = yyjson_obj_get(val, "colorTotal"); + if (colorTotal) ffOptionParseColor(yyjson_get_str(colorTotal), &options->barColorTotal); + + yyjson_val* colorBorder = yyjson_obj_get(val, "colorBorder"); + if (colorBorder) ffOptionParseColor(yyjson_get_str(colorBorder), &options->barColorBorder); + yyjson_val* width = yyjson_obj_get(val, "width"); if (width) options->barWidth = (uint8_t) yyjson_get_uint(width); @@ -635,6 +644,12 @@ bool ffOptionsParseDisplayCommandLine(FFOptionsDisplay* options, const char* key ffOptionParseString(key, value, &options->barBorderLeftElapsed); else if(ffStrEqualsIgnCase(subkey, "border-right-elapsed")) ffOptionParseString(key, value, &options->barBorderRightElapsed); + else if(ffStrEqualsIgnCase(subkey, "color-elapsed")) + ffOptionParseColor(value, &options->barColorElapsed); + else if(ffStrEqualsIgnCase(subkey, "color-total")) + ffOptionParseColor(value, &options->barColorTotal); + else if(ffStrEqualsIgnCase(subkey, "color-border")) + ffOptionParseColor(value, &options->barColorBorder); else return false; } @@ -705,7 +720,11 @@ void ffOptionsInitDisplay(FFOptionsDisplay* options) ffStrbufInitStatic(&options->barBorderRight, " ]"); ffStrbufInit(&options->barBorderLeftElapsed); ffStrbufInit(&options->barBorderRightElapsed); + ffStrbufInit(&options->barColorElapsed); + ffStrbufInitStatic(&options->barColorTotal, instance.state.terminalLightTheme ? FF_COLOR_FG_WHITE : FF_COLOR_FG_LIGHT_WHITE); + ffStrbufInitStatic(&options->barColorBorder, instance.state.terminalLightTheme ? FF_COLOR_FG_WHITE : FF_COLOR_FG_LIGHT_WHITE); options->barWidth = 10; + options->durationAbbreviation = false; options->durationSpaceBeforeUnit = FF_SPACE_BEFORE_UNIT_DEFAULT; options->percentType = 9; diff --git a/src/options/display.h b/src/options/display.h index 90d4da316..c1255f468 100644 --- a/src/options/display.h +++ b/src/options/display.h @@ -62,6 +62,9 @@ typedef struct FFOptionsDisplay FFstrbuf barBorderRight; FFstrbuf barBorderLeftElapsed; FFstrbuf barBorderRightElapsed; + FFstrbuf barColorElapsed; + FFstrbuf barColorTotal; + FFstrbuf barColorBorder; uint8_t barWidth; FFPercentageTypeFlags percentType; uint8_t percentNdigits; From 54c5bc511039de0d23c12e19c04ec353a2ff1b5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 1 Aug 2025 15:12:30 +0800 Subject: [PATCH 07/83] Bar: refactor config to use nested objects and deprecates old fields --- doc/json_schema.json | 114 +++++++++++++++++++++++++++++++----------- src/common/option.c | 2 + src/common/percent.c | 20 ++++---- src/options/display.c | 109 ++++++++++++++++++++++++++++++---------- src/options/display.h | 6 +-- 5 files changed, 184 insertions(+), 67 deletions(-) diff --git a/doc/json_schema.json b/doc/json_schema.json index b4c82c33e..3c6e5d5a7 100644 --- a/doc/json_schema.json +++ b/doc/json_schema.json @@ -997,50 +997,108 @@ "additionalProperties": false, "description": "Set the bar configuration", "properties": { + "char": { + "type": "object", + "additionalProperties": false, + "description": "Set the characters used in the bar", + "properties": { + "elapsed": { + "type": "string", + "description": "Set the character to use in elapsed part", + "default": "■" + }, + "total": { + "type": "string", + "description": "Set the character to use in total part", + "default": "-" + } + } + }, + "border": { + "oneOf": [ + { + "type": "null", + "description": "Disable bar borders" + }, + { + "type": "object", + "additionalProperties": false, + "description": "Set the string to use of borders of percentage bars", + "properties": { + "left": { + "type": "string", + "description": "Set the string to use at left border", + "default": "[ " + }, + "right": { + "type": "string", + "description": "Set the string to use at right border", + "default": " ]" + }, + "leftElapsed": { + "type": "string", + "description": "If both leftElapsed and rightElapsed are set, the border will be used as parts of bar content", + "default": "" + }, + "rightElapsed": { + "type": "string", + "description": "If both leftElapsed and rightElapsed are set, the border will be used as parts of bar content", + "default": "" + } + } + } + ] + }, + "color": { + "oneOf": [ + { + "type": "null", + "description": "Disable color in percentage bars" + }, + { + "type": "object", + "additionalProperties": false, + "description": "Set the color to use of percentage bars", + "properties": { + "elapsed": { + "description": "Color to use in the elapsed part of percentage bars\nBy default, auto selected by percent.color.{green,yellow,red}", + "$ref": "#/$defs/colors", + "default": "auto" + }, + "total": { + "description": "Color to use in the total part of percentage bars", + "$ref": "#/$defs/colors", + "default": "light_white" + }, + "border": { + "description": "Color to use in the borders of percentage bars", + "$ref": "#/$defs/colors", + "default": "light_white" + } + } + } + ] + }, "charElapsed": { "type": "string", - "description": "Set the character to use in elapsed part", + "description": "Set the character to use in elapsed part. Deprecated in v2.50.0", "default": "■" }, "charTotal": { "type": "string", - "description": "Set the character to use in total part", + "description": "Set the character to use in total part. Deprecated in v2.50.0", "default": "-" }, "borderLeft": { "type": "string", - "description": "Set the string to use at left border", + "description": "Set the string to use at left border. Deprecated in v2.50.0", "default": "[ " }, "borderRight": { "type": "string", - "description": "Set the string to use at right border", + "description": "Set the string to use at right border. Deprecated in v2.50.0", "default": " ]" }, - "borderLeftElapsed": { - "type": "string", - "description": "If both borderLeftElapsed and borderRightElapsed are set, the border will be used as parts of bar content", - "default": "" - }, - "borderRightElapsed": { - "type": "string", - "description": "If both borderLeftElapsed and borderRightElapsed are set, the border will be used as parts of bar content", - "default": "" - }, - "colorElapsed": { - "description": "Color to use in the elapsed part of percentage bars", - "$ref": "#/$defs/colors" - }, - "colorTotal": { - "description": "Color to use in the total part of percentage bars", - "$ref": "#/$defs/colors", - "default": "light_white" - }, - "colorBorder": { - "description": "Color to use in the borders of percentage bars", - "$ref": "#/$defs/colors", - "default": "light_white" - }, "width": { "type": "integer", "description": "Set the width of the bar, in number of characters", diff --git a/src/common/option.c b/src/common/option.c index f1af4b48b..f5e929e34 100644 --- a/src/common/option.c +++ b/src/common/option.c @@ -157,6 +157,8 @@ bool ffOptionParseBoolean(const char* str) void ffOptionParseColorNoClear(const char* value, FFstrbuf* buffer) { + if (value[0] == '\0') return; + // If value is already an ANSI escape code, use it if (value[0] == '\e' && value[1] == '[') { diff --git a/src/common/percent.c b/src/common/percent.c index 1d164db47..98c5acc64 100644 --- a/src/common/percent.c +++ b/src/common/percent.c @@ -67,14 +67,15 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf if(!borderAsValue && options->barBorderLeft.length) { - if(!options->pipe) + if(!options->pipe && options->barColorBorder.length > 0) ffStrbufAppendF(buffer, "\e[%sm", options->barColorBorder.chars); ffStrbufAppend(buffer, &options->barBorderLeft); } if (percent != percent) { - if(!options->pipe) + // No color config for NaN, use total color for simplification + if(!options->pipe && options->barColorTotal.length > 0) ffStrbufAppendS(buffer, "\e[" FF_COLOR_FG_LIGHT_BLACK "m"); for (uint32_t i = 0; i < options->barWidth; ++i) @@ -93,16 +94,17 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf const char* colorRed = options->percentColorRed.chars; FFPercentageTypeFlags percentType = config.type == 0 ? options->percentType : config.type; - bool monochrome = !!(percentType & FF_PERCENTAGE_TYPE_BAR_MONOCHROME_BIT) || options->barColorElapsed.length; + + bool autoColorElapsed = ffStrbufIgnCaseEqualS(&options->barColorElapsed, "auto"); for (uint32_t i = 0; i < blocksPercent; ++i) { - if(!options->pipe) + if(!options->pipe && options->barColorElapsed.length > 0) { - if (monochrome) + if ((percentType & FF_PERCENTAGE_TYPE_BAR_MONOCHROME_BIT) || !autoColorElapsed) { const char* color = NULL; - if (options->barColorElapsed.length) + if (!autoColorElapsed) color = options->barColorElapsed.chars; else if (green <= yellow) { @@ -139,7 +141,7 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf if (blocksPercent < options->barWidth) { - if(!options->pipe) + if(!options->pipe && options->barColorTotal.length > 0) ffStrbufAppendF(buffer, "\e[%sm", options->barColorTotal.chars); for (uint32_t i = blocksPercent; i < options->barWidth; ++i) { @@ -154,12 +156,12 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf if(!borderAsValue && options->barBorderRight.length) { - if(!options->pipe) + if(!options->pipe && options->barColorBorder.length > 0) ffStrbufAppendF(buffer, "\e[%sm", options->barColorBorder.chars); ffStrbufAppend(buffer, &options->barBorderRight); } - if(!options->pipe) + if(!options->pipe && (options->barColorElapsed.length > 0 || options->barColorTotal.length > 0 || options->barColorBorder.length > 0)) { ffStrbufAppendS(buffer, FASTFETCH_TEXT_MODIFIER_RESET); appendOutputColor(buffer, module); diff --git a/src/options/display.c b/src/options/display.c index 99adbf61c..8f21f1429 100644 --- a/src/options/display.c +++ b/src/options/display.c @@ -76,8 +76,6 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va } else if (ffStrEqualsIgnCase(key, "brightColor")) options->brightColor = yyjson_get_bool(val); - else if (ffStrEqualsIgnCase(key, "binaryPrefix")) - return "`display.binaryPrefix` has been renamed to `display.size.binaryPrefix`. Sorry for another break change."; else if (ffStrEqualsIgnCase(key, "duration")) { if (!yyjson_is_obj(val)) @@ -265,38 +263,95 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va { if (yyjson_is_obj(val)) { - const char* charElapsed = yyjson_get_str(yyjson_obj_get(val, "charElapsed")); - if (charElapsed) - ffStrbufSetS(&options->barCharElapsed, charElapsed); + yyjson_val* char_ = yyjson_obj_get(val, "char"); + if (char_) + { + if (!yyjson_is_obj(char_)) return "display.bar.char must be an object"; - const char* charTotal = yyjson_get_str(yyjson_obj_get(val, "charTotal")); - if (charTotal) - ffStrbufSetS(&options->barCharTotal, charTotal); + const char* charElapsed = yyjson_get_str(yyjson_obj_get(char_, "elapsed")); + if (charElapsed) + ffStrbufSetS(&options->barCharElapsed, charElapsed); - yyjson_val* borderLeft = yyjson_obj_get(val, "borderLeft"); - if (borderLeft) - ffStrbufSetS(&options->barBorderLeft, yyjson_get_str(borderLeft)); + const char* charTotal = yyjson_get_str(yyjson_obj_get(char_, "total")); + if (charTotal) + ffStrbufSetS(&options->barCharTotal, charTotal); + } + else + { + const char* charElapsed = yyjson_get_str(yyjson_obj_get(val, "charElapsed")); + if (charElapsed) + return "display.bar.charElapsed has been renamed to display.bar.char.elapsed."; - yyjson_val* borderRight = yyjson_obj_get(val, "borderRight"); - if (borderRight) - ffStrbufSetS(&options->barBorderRight, yyjson_get_str(borderRight)); + const char* charTotal = yyjson_get_str(yyjson_obj_get(val, "charTotal")); + if (charTotal) + return "display.bar.charTotal has been renamed to display.bar.char.total."; + } - yyjson_val* borderLeftElapsed = yyjson_obj_get(val, "borderLeftElapsed"); - if (borderLeftElapsed) - ffStrbufSetS(&options->barBorderLeftElapsed, yyjson_get_str(borderLeftElapsed)); + yyjson_val* border = yyjson_obj_get(val, "border"); + if (border) + { + if (yyjson_is_null(border)) + { + ffStrbufClear(&options->barBorderLeft); + ffStrbufClear(&options->barBorderRight); + ffStrbufClear(&options->barBorderLeftElapsed); + ffStrbufClear(&options->barBorderRightElapsed); + } + else + { + if (!yyjson_is_obj(border)) return "display.bar.border must be an object"; - yyjson_val* borderRightElapsed = yyjson_obj_get(val, "borderRightElapsed"); - if (borderRightElapsed) - ffStrbufSetS(&options->barBorderRightElapsed, yyjson_get_str(borderRightElapsed)); + yyjson_val* borderLeft = yyjson_obj_get(border, "left"); + if (borderLeft) + ffStrbufSetS(&options->barBorderLeft, yyjson_get_str(borderLeft)); - yyjson_val* colorElapsed = yyjson_obj_get(val, "colorElapsed"); - if (colorElapsed) ffOptionParseColor(yyjson_get_str(colorElapsed), &options->barColorElapsed); + yyjson_val* borderRight = yyjson_obj_get(border, "right"); + if (borderRight) + ffStrbufSetS(&options->barBorderRight, yyjson_get_str(borderRight)); - yyjson_val* colorTotal = yyjson_obj_get(val, "colorTotal"); - if (colorTotal) ffOptionParseColor(yyjson_get_str(colorTotal), &options->barColorTotal); + yyjson_val* borderLeftElapsed = yyjson_obj_get(border, "leftElapsed"); + if (borderLeftElapsed) + ffStrbufSetS(&options->barBorderLeftElapsed, yyjson_get_str(borderLeftElapsed)); - yyjson_val* colorBorder = yyjson_obj_get(val, "colorBorder"); - if (colorBorder) ffOptionParseColor(yyjson_get_str(colorBorder), &options->barColorBorder); + yyjson_val* borderRightElapsed = yyjson_obj_get(border, "rightElapsed"); + if (borderRightElapsed) + ffStrbufSetS(&options->barBorderRightElapsed, yyjson_get_str(borderRightElapsed)); + } + } + else + { + yyjson_val* borderLeft = yyjson_obj_get(val, "borderLeft"); + if (borderLeft) + return "display.bar.borderLeft has been renamed to display.bar.border.left."; + + yyjson_val* borderRight = yyjson_obj_get(val, "borderRight"); + if (borderRight) + return "display.bar.borderRight has been renamed to display.bar.border.right."; + } + + yyjson_val* color = yyjson_obj_get(val, "color"); + if (color) + { + if (yyjson_is_null(color)) + { + ffStrbufClear(&options->barColorElapsed); + ffStrbufClear(&options->barColorTotal); + ffStrbufClear(&options->barColorBorder); + } + else + { + if (!yyjson_is_obj(color)) return "display.bar.color must be an object"; + + yyjson_val* colorElapsed = yyjson_obj_get(color, "elapsed"); + if (colorElapsed) ffOptionParseColor(yyjson_get_str(colorElapsed), &options->barColorElapsed); + + yyjson_val* colorTotal = yyjson_obj_get(color, "total"); + if (colorTotal) ffOptionParseColor(yyjson_get_str(colorTotal), &options->barColorTotal); + + yyjson_val* colorBorder = yyjson_obj_get(color, "border"); + if (colorBorder) ffOptionParseColor(yyjson_get_str(colorBorder), &options->barColorBorder); + } + } yyjson_val* width = yyjson_obj_get(val, "width"); if (width) @@ -720,7 +775,7 @@ void ffOptionsInitDisplay(FFOptionsDisplay* options) ffStrbufInitStatic(&options->barBorderRight, " ]"); ffStrbufInit(&options->barBorderLeftElapsed); ffStrbufInit(&options->barBorderRightElapsed); - ffStrbufInit(&options->barColorElapsed); + ffStrbufInitStatic(&options->barColorElapsed, "auto"); ffStrbufInitStatic(&options->barColorTotal, instance.state.terminalLightTheme ? FF_COLOR_FG_WHITE : FF_COLOR_FG_LIGHT_WHITE); ffStrbufInitStatic(&options->barColorBorder, instance.state.terminalLightTheme ? FF_COLOR_FG_WHITE : FF_COLOR_FG_LIGHT_WHITE); options->barWidth = 10; diff --git a/src/options/display.h b/src/options/display.h index c1255f468..9fbe33d14 100644 --- a/src/options/display.h +++ b/src/options/display.h @@ -62,9 +62,9 @@ typedef struct FFOptionsDisplay FFstrbuf barBorderRight; FFstrbuf barBorderLeftElapsed; FFstrbuf barBorderRightElapsed; - FFstrbuf barColorElapsed; - FFstrbuf barColorTotal; - FFstrbuf barColorBorder; + FFstrbuf barColorElapsed; // "auto" for auto selection from percent config; empty for no custom color (inherits) + FFstrbuf barColorTotal; // empty for no custom color (inherits) + FFstrbuf barColorBorder; // empty for no custom color (inherits) uint8_t barWidth; FFPercentageTypeFlags percentType; uint8_t percentNdigits; From 4f8d8de749d4873b6daf9021ca0014d04017e171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 1 Aug 2025 15:37:02 +0800 Subject: [PATCH 08/83] Doc: update changelog [ci skip] --- CHANGELOG.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 241f34200..42574af22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +# 2.50.0 (expected release date: 2025-08-14) + +Changes: +* Percent bar config `display.bar.*` options have been replaced with a more organized, nested object structure. + * `display.bar.charElapsed` has been renamed to `display.bar.char.elapsed`. + * `display.bar.charTotal` has been renamed to `display.bar.char.total`. + * `display.bar.borderLeft` has been renamed to `display.bar.border.left`. + * `display.bar.borderRight` has been renamed to `display.bar.border.right`. + +Features: +* Add `display.bar.border.{leftElapsed,rightElapsed}` for using border as parts of bar content. (#1875) + * `display.bar.border: null` has been added as a shortand to disable bar borders. +* Add `display.bar.color.{elapsed,total,border}` to customize the color of the elapsed, total and border sections of the percent bar. + * `display.bar.color: null` has been added as a shorthand to disable bar colors. + # 2.49.0 Deprecation Notice: From ba3e26f2b47807e7a22ce817deb8103b3ad50555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 1 Aug 2025 16:05:18 +0800 Subject: [PATCH 09/83] Option: fix a possible null reference segfault --- src/common/option.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/option.c b/src/common/option.c index f5e929e34..76775980a 100644 --- a/src/common/option.c +++ b/src/common/option.c @@ -157,7 +157,7 @@ bool ffOptionParseBoolean(const char* str) void ffOptionParseColorNoClear(const char* value, FFstrbuf* buffer) { - if (value[0] == '\0') return; + if (!value || value[0] == '\0') return; // If value is already an ANSI escape code, use it if (value[0] == '\e' && value[1] == '[') From fb267acac3fa7af3be1c4d991584014bcc78cd81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 1 Aug 2025 16:05:53 +0800 Subject: [PATCH 10/83] Presets: add new config; fix old config --- presets/examples/20.jsonc | 9 +++--- presets/examples/28.jsonc | 63 +++++++++++++++++++++++++++++++++++++++ presets/examples/9.jsonc | 6 ++-- 3 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 presets/examples/28.jsonc diff --git a/presets/examples/20.jsonc b/presets/examples/20.jsonc index 4bdbe5faf..7f16be91f 100644 --- a/presets/examples/20.jsonc +++ b/presets/examples/20.jsonc @@ -12,10 +12,11 @@ "type": ["bar", "hide-others"] }, "bar": { - "borderLeft": "", - "borderRight": "", - "charElapsed": "█", - "charTotal": "░", + "border": null, + "char": { + "elapsed": "█", + "total": "░" + }, "width": 40 }, "constants": [ diff --git a/presets/examples/28.jsonc b/presets/examples/28.jsonc new file mode 100644 index 000000000..f49c2ca95 --- /dev/null +++ b/presets/examples/28.jsonc @@ -0,0 +1,63 @@ +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json", + "logo": { + "type": "small" + }, + "display": { + "separator": " ", + "key": { + "type": "both" + }, + "bar": { + "border": { + "left": "\uee00", + "leftElapsed": "\uee03", + "right": "\uee02", + "rightElapsed": "\uee05" + }, + "char": { + "total": "\uee01", + "elapsed": "\uee04" + }, + "color": { + "total": null + } + }, + "percent": { + "type": [ + "bar", + "bar-monochrome" + ] + } + }, + "modules": [ + "title", + "separator", + { + "type": "memory", + "key": "MEM" + }, + { + "type": "swap", + "key": "SWP" + }, + { + "type": "disk", + "folders": "/", + "key": "DSK" + }, + { + "type": "battery", + "key": "BAT" + }, + { + "type": "brightness", + "key": "BGT" + }, + { + "type": "colors", + "paddingLeft": 6, + "symbol": "circle" + } + ] +} diff --git a/presets/examples/9.jsonc b/presets/examples/9.jsonc index eda3d0eff..2fc1da3c8 100644 --- a/presets/examples/9.jsonc +++ b/presets/examples/9.jsonc @@ -8,8 +8,10 @@ "width": 11 }, "bar": { - "charElapsed": "=", - "charTotal": "-", + "char": { + "elapsed": "=", + "total": "-" + }, "width": 13 }, "percent": { From 6d868136474588dd7a9e5f39b108351eb1d67f61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 1 Aug 2025 16:11:12 +0800 Subject: [PATCH 11/83] Doc: update changelog; fix typo --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42574af22..56ca8e334 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# 2.50.0 (expected release date: 2025-08-14) +# WIP Changes: * Percent bar config `display.bar.*` options have been replaced with a more organized, nested object structure. @@ -9,7 +9,7 @@ Changes: Features: * Add `display.bar.border.{leftElapsed,rightElapsed}` for using border as parts of bar content. (#1875) - * `display.bar.border: null` has been added as a shortand to disable bar borders. + * `display.bar.border: null` has been added as a shorthand to disable bar borders. * Add `display.bar.color.{elapsed,total,border}` to customize the color of the elapsed, total and border sections of the percent bar. * `display.bar.color: null` has been added as a shorthand to disable bar colors. From 3cef51ec4ad6e450d87bff6dfae6f39f92e55b37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sat, 2 Aug 2025 17:41:19 +0800 Subject: [PATCH 12/83] JsonConfig: refactor string buffer JSON handling for robustness --- src/common/jsonconfig.c | 6 +-- src/detection/camera/camera_android.c | 2 +- src/detection/packages/packages_windows.c | 4 +- src/detection/publicip/publicip.c | 2 +- .../terminalfont/terminalfont_windows.c | 6 +-- src/detection/wifi/wifi_android.c | 8 ++-- src/modules/command/command.c | 6 +-- src/modules/disk/disk.c | 6 +-- src/modules/diskio/diskio.c | 2 +- src/modules/localip/localip.c | 2 +- src/modules/netio/netio.c | 2 +- src/modules/packages/packages.c | 7 +++- src/modules/physicaldisk/physicaldisk.c | 2 +- src/modules/publicip/publicip.c | 2 +- src/modules/separator/separator.c | 2 +- src/modules/weather/weather.c | 4 +- src/options/display.c | 40 +++++++++---------- src/options/general.c | 8 ++-- src/options/logo.c | 7 ++-- src/util/FFstrbuf.c | 6 --- src/util/FFstrbuf.h | 30 +++++++++++++- 21 files changed, 90 insertions(+), 64 deletions(-) diff --git a/src/common/jsonconfig.c b/src/common/jsonconfig.c index 4170d6c66..e8bdc5ca9 100644 --- a/src/common/jsonconfig.c +++ b/src/common/jsonconfig.c @@ -16,12 +16,12 @@ bool ffJsonConfigParseModuleArgs(const char* key, yyjson_val* val, FFModuleArgs* { if(ffStrEqualsIgnCase(key, "key")) { - ffStrbufSetNS(&moduleArgs->key, (uint32_t) yyjson_get_len(val), yyjson_get_str(val)); + ffStrbufSetJsonVal(&moduleArgs->key, val); return true; } else if(ffStrEqualsIgnCase(key, "format")) { - ffStrbufSetNS(&moduleArgs->outputFormat, (uint32_t) yyjson_get_len(val), yyjson_get_str(val)); + ffStrbufSetJsonVal(&moduleArgs->outputFormat, val); return true; } else if(ffStrEqualsIgnCase(key, "outputColor")) @@ -41,7 +41,7 @@ bool ffJsonConfigParseModuleArgs(const char* key, yyjson_val* val, FFModuleArgs* } else if(ffStrEqualsIgnCase(key, "keyIcon")) { - ffStrbufSetS(&moduleArgs->keyIcon, yyjson_get_str(val)); + ffStrbufSetJsonVal(&moduleArgs->keyIcon, val); return true; } return false; diff --git a/src/detection/camera/camera_android.c b/src/detection/camera/camera_android.c index 623bb93ae..7f5f24447 100644 --- a/src/detection/camera/camera_android.c +++ b/src/detection/camera/camera_android.c @@ -45,7 +45,7 @@ const char* ffDetectCamera(FF_MAYBE_UNUSED FFlist* result) ffStrbufInitStatic(&camera->name, "Unknown"); } ffStrbufInit(&camera->vendor); - ffStrbufInitS(&camera->id, yyjson_get_str(yyjson_obj_get(device, "id"))); + ffStrbufInitJsonVal(&camera->id, yyjson_obj_get(device, "id")); yyjson_val* sizes = yyjson_arr_get_first(yyjson_obj_get(device, "jpeg_output_sizes")); if (yyjson_is_obj(sizes)) { diff --git a/src/detection/packages/packages_windows.c b/src/detection/packages/packages_windows.c index f4a497dd4..019b7629d 100644 --- a/src/detection/packages/packages_windows.c +++ b/src/detection/packages/packages_windows.c @@ -59,7 +59,7 @@ static void detectScoop(FFPackagesResult* result) { ffStrbufClear(&scoopPath); if (root) - ffStrbufSetS(&scoopPath, yyjson_get_str(yyjson_obj_get(root, "root_path"))); + ffStrbufSetJsonVal(&scoopPath, yyjson_obj_get(root, "root_path")); if (scoopPath.length == 0) { ffStrbufSet(&scoopPath, &instance.state.platform.homeDir); @@ -72,7 +72,7 @@ static void detectScoop(FFPackagesResult* result) { ffStrbufClear(&scoopPath); if (root) - ffStrbufSetS(&scoopPath, yyjson_get_str(yyjson_obj_get(root, "global_path"))); + ffStrbufSetJsonVal(&scoopPath, yyjson_obj_get(root, "global_path")); if (scoopPath.length == 0) { ffStrbufSetS(&scoopPath, getenv("ProgramData")); diff --git a/src/detection/publicip/publicip.c b/src/detection/publicip/publicip.c index a568f5d70..a76a550ae 100644 --- a/src/detection/publicip/publicip.c +++ b/src/detection/publicip/publicip.c @@ -84,7 +84,7 @@ const char* ffDetectPublicIp(FFPublicIpOptions* options, FFPublicIpResult* resul if (doc) { yyjson_val* root = yyjson_doc_get_root(doc); - ffStrbufAppendS(&result->ip, yyjson_get_str(yyjson_obj_get(root, "ip"))); + ffStrbufAppendJsonVal(&result->ip, yyjson_obj_get(root, "ip")); ffStrbufDestroy(&result->location); ffStrbufInitF(&result->location, "%s, %s", yyjson_get_str(yyjson_obj_get(root, "city")), yyjson_get_str(yyjson_obj_get(root, "country"))); return NULL; diff --git a/src/detection/terminalfont/terminalfont_windows.c b/src/detection/terminalfont/terminalfont_windows.c index 3aebf79dc..b6866a7b4 100644 --- a/src/detection/terminalfont/terminalfont_windows.c +++ b/src/detection/terminalfont/terminalfont_windows.c @@ -23,16 +23,14 @@ static const char* detectWTProfile(yyjson_val* profile, FFstrbuf* name, double* if (name->length == 0) { - yyjson_val* pface = yyjson_obj_get(font, "face"); - if(yyjson_is_str(pface)) - ffStrbufAppendS(name, unsafe_yyjson_get_str(pface)); + ffStrbufAppendJsonVal(name, yyjson_obj_get(font, "face")); } if (*size < 0) { yyjson_val* psize = yyjson_obj_get(font, "size"); if (yyjson_is_num(psize)) - *size = yyjson_get_num(psize); + *size = unsafe_yyjson_get_num(psize); } return NULL; } diff --git a/src/detection/wifi/wifi_android.c b/src/detection/wifi/wifi_android.c index 2c0360cba..92510afc2 100644 --- a/src/detection/wifi/wifi_android.c +++ b/src/detection/wifi/wifi_android.c @@ -46,7 +46,7 @@ const char* ffDetectWifi(FFlist* result) item->conn.channel = 0; item->conn.frequency = 0; - ffStrbufAppendS(&item->inf.status, yyjson_get_str(yyjson_obj_get(root, "supplicant_state"))); + ffStrbufAppendJsonVal(&item->inf.status, yyjson_obj_get(root, "supplicant_state")); if(!item->inf.status.length) { ffStrbufAppendS(&item->inf.status, "Unknown"); @@ -59,9 +59,9 @@ const char* ffDetectWifi(FFlist* result) double rssi = yyjson_get_num(yyjson_obj_get(root, "rssi")); item->conn.signalQuality = rssi >= -50 ? 100 : rssi <= -100 ? 0 : (rssi + 100) * 2; - ffStrbufAppendS(&item->inf.description, yyjson_get_str(yyjson_obj_get(root, "ip"))); - ffStrbufAppendS(&item->conn.bssid, yyjson_get_str(yyjson_obj_get(root, "bssid"))); - ffStrbufAppendS(&item->conn.ssid, yyjson_get_str(yyjson_obj_get(root, "ssid"))); + ffStrbufAppendJsonVal(&item->inf.description, yyjson_obj_get(root, "ip")); + ffStrbufAppendJsonVal(&item->conn.bssid, yyjson_obj_get(root, "bssid")); + ffStrbufAppendJsonVal(&item->conn.ssid, yyjson_obj_get(root, "ssid")); item->conn.frequency = (uint16_t) yyjson_get_int(yyjson_obj_get(root, "frequency_mhz")); item->conn.txRate = yyjson_get_num(yyjson_obj_get(root, "link_speed_mbps")); item->conn.channel = ffWifiFreqToChannel(item->conn.frequency); diff --git a/src/modules/command/command.c b/src/modules/command/command.c index a6d38ab15..971a2a77c 100644 --- a/src/modules/command/command.c +++ b/src/modules/command/command.c @@ -86,19 +86,19 @@ void ffParseCommandJsonObject(FFCommandOptions* options, yyjson_val* module) if (ffStrEqualsIgnCase(key, "shell")) { - ffStrbufSetS(&options->shell, yyjson_get_str(val)); + ffStrbufSetJsonVal(&options->shell, val); continue; } if (ffStrEqualsIgnCase(key, "param")) { - ffStrbufSetS(&options->param, yyjson_get_str(val)); + ffStrbufSetJsonVal(&options->param, val); continue; } if (ffStrEqualsIgnCase(key, "text")) { - ffStrbufSetS(&options->text, yyjson_get_str(val)); + ffStrbufSetJsonVal(&options->text, val); continue; } diff --git a/src/modules/disk/disk.c b/src/modules/disk/disk.c index 1596b3861..3d308babf 100644 --- a/src/modules/disk/disk.c +++ b/src/modules/disk/disk.c @@ -312,19 +312,19 @@ void ffParseDiskJsonObject(FFDiskOptions* options, yyjson_val* module) if (ffStrEqualsIgnCase(key, "folders")) { - ffStrbufSetS(&options->folders, yyjson_get_str(val)); + ffStrbufSetJsonVal(&options->folders, val); continue; } if (ffStrEqualsIgnCase(key, "hideFolders")) { - ffStrbufSetS(&options->hideFolders, yyjson_get_str(val)); + ffStrbufSetJsonVal(&options->hideFolders, val); continue; } if (ffStrEqualsIgnCase(key, "hideFS")) { - ffStrbufSetS(&options->hideFS, yyjson_get_str(val)); + ffStrbufSetJsonVal(&options->hideFS, val); continue; } diff --git a/src/modules/diskio/diskio.c b/src/modules/diskio/diskio.c index 19af8eb3c..f80bbfc28 100644 --- a/src/modules/diskio/diskio.c +++ b/src/modules/diskio/diskio.c @@ -138,7 +138,7 @@ void ffParseDiskIOJsonObject(FFDiskIOOptions* options, yyjson_val* module) if (ffStrEqualsIgnCase(key, "namePrefix")) { - ffStrbufSetS(&options->namePrefix, yyjson_get_str(val)); + ffStrbufSetJsonVal(&options->namePrefix, val); continue; } diff --git a/src/modules/localip/localip.c b/src/modules/localip/localip.c index 4c98b1d6f..308991367 100644 --- a/src/modules/localip/localip.c +++ b/src/modules/localip/localip.c @@ -407,7 +407,7 @@ void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module) if (ffStrEqualsIgnCase(key, "namePrefix")) { - ffStrbufSetS(&options->namePrefix, yyjson_get_str(val)); + ffStrbufSetJsonVal(&options->namePrefix, val); continue; } diff --git a/src/modules/netio/netio.c b/src/modules/netio/netio.c index 5b0fb4bbb..f2182c84a 100644 --- a/src/modules/netio/netio.c +++ b/src/modules/netio/netio.c @@ -152,7 +152,7 @@ void ffParseNetIOJsonObject(FFNetIOOptions* options, yyjson_val* module) if (ffStrEqualsIgnCase(key, "namePrefix")) { - ffStrbufSetS(&options->namePrefix, yyjson_get_str(val)); + ffStrbufSetJsonVal(&options->namePrefix, val); continue; } diff --git a/src/modules/packages/packages.c b/src/modules/packages/packages.c index 06c1817a3..9bccb292b 100644 --- a/src/modules/packages/packages.c +++ b/src/modules/packages/packages.c @@ -345,7 +345,12 @@ void ffParsePackagesJsonObject(FFPackagesOptions* options, yyjson_val* module) size_t flagIdx, flagMax; yyjson_arr_foreach(val, flagIdx, flagMax, flagObj) { - const char* flag = yyjson_get_str(flagObj); + if (!yyjson_is_str(flagObj)) + { + ffPrintError(FF_PACKAGES_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid JSON value for %s", key); + continue; + } + const char* flag = unsafe_yyjson_get_str(flagObj); #define FF_TEST_PACKAGE_NAME(name) else if (ffStrEqualsIgnCase(flag, #name)) { options->disabled |= FF_PACKAGES_FLAG_ ## name ## _BIT; } switch (toupper(flag[0])) diff --git a/src/modules/physicaldisk/physicaldisk.c b/src/modules/physicaldisk/physicaldisk.c index f68770697..9479ccba4 100644 --- a/src/modules/physicaldisk/physicaldisk.c +++ b/src/modules/physicaldisk/physicaldisk.c @@ -167,7 +167,7 @@ void ffParsePhysicalDiskJsonObject(FFPhysicalDiskOptions* options, yyjson_val* m if (ffStrEqualsIgnCase(key, "namePrefix")) { - ffStrbufSetS(&options->namePrefix, yyjson_get_str(val)); + ffStrbufSetJsonVal(&options->namePrefix, val); continue; } diff --git a/src/modules/publicip/publicip.c b/src/modules/publicip/publicip.c index d712ba1be..dd75fed09 100644 --- a/src/modules/publicip/publicip.c +++ b/src/modules/publicip/publicip.c @@ -82,7 +82,7 @@ void ffParsePublicIpJsonObject(FFPublicIpOptions* options, yyjson_val* module) if (ffStrEqualsIgnCase(key, "url")) { - ffStrbufSetS(&options->url, yyjson_get_str(val)); + ffStrbufSetJsonVal(&options->url, val); continue; } diff --git a/src/modules/separator/separator.c b/src/modules/separator/separator.c index aa3e3d58a..c48eaaf46 100644 --- a/src/modules/separator/separator.c +++ b/src/modules/separator/separator.c @@ -152,7 +152,7 @@ void ffParseSeparatorJsonObject(FFSeparatorOptions* options, yyjson_val* module) if (ffStrEqualsIgnCase(key, "string")) { - ffStrbufSetS(&options->string, yyjson_get_str(val)); + ffStrbufSetJsonVal(&options->string, val); continue; } diff --git a/src/modules/weather/weather.c b/src/modules/weather/weather.c index 78570d0ef..9d37ed0e7 100644 --- a/src/modules/weather/weather.c +++ b/src/modules/weather/weather.c @@ -72,13 +72,13 @@ void ffParseWeatherJsonObject(FFWeatherOptions* options, yyjson_val* module) if (ffStrEqualsIgnCase(key, "location")) { - ffStrbufSetS(&options->location, yyjson_get_str(val)); + ffStrbufSetJsonVal(&options->location, val); continue; } if (ffStrEqualsIgnCase(key, "outputFormat")) { - ffStrbufSetS(&options->outputFormat, yyjson_get_str(val)); + ffStrbufSetJsonVal(&options->outputFormat, val); continue; } diff --git a/src/options/display.c b/src/options/display.c index 8f21f1429..defbb89a9 100644 --- a/src/options/display.c +++ b/src/options/display.c @@ -48,7 +48,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va else if (ffStrEqualsIgnCase(key, "hideCursor")) options->hideCursor = yyjson_get_bool(val); else if (ffStrEqualsIgnCase(key, "separator")) - ffStrbufSetS(&options->keyValueSeparator, yyjson_get_str(val)); + ffStrbufSetJsonVal(&options->keyValueSeparator, val); else if (ffStrEqualsIgnCase(key, "color")) { if (yyjson_is_str(val)) @@ -58,18 +58,18 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va } else if (yyjson_is_obj(val)) { - const char* colorKeys = yyjson_get_str(yyjson_obj_get(val, "keys")); + yyjson_val* colorKeys = yyjson_obj_get(val, "keys"); if (colorKeys) - ffOptionParseColor(colorKeys, &options->colorKeys); - const char* colorTitle = yyjson_get_str(yyjson_obj_get(val, "title")); + ffOptionParseColor(yyjson_get_str(colorKeys), &options->colorKeys); + yyjson_val* colorTitle = yyjson_obj_get(val, "title"); if (colorTitle) - ffOptionParseColor(colorTitle, &options->colorTitle); - const char* colorOutput = yyjson_get_str(yyjson_obj_get(val, "output")); + ffOptionParseColor(yyjson_get_str(colorTitle), &options->colorTitle); + yyjson_val* colorOutput = yyjson_obj_get(val, "output"); if (colorOutput) - ffOptionParseColor(colorOutput, &options->colorOutput); - const char* colorSeparator = yyjson_get_str(yyjson_obj_get(val, "separator")); + ffOptionParseColor(yyjson_get_str(colorOutput), &options->colorOutput); + yyjson_val* colorSeparator = yyjson_obj_get(val, "separator"); if (colorSeparator) - ffOptionParseColor(colorSeparator, &options->colorSeparator); + ffOptionParseColor(yyjson_get_str(colorSeparator), &options->colorSeparator); } else return "display.color must be either a string or an object"; @@ -268,21 +268,21 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va { if (!yyjson_is_obj(char_)) return "display.bar.char must be an object"; - const char* charElapsed = yyjson_get_str(yyjson_obj_get(char_, "elapsed")); + yyjson_val* charElapsed = yyjson_obj_get(char_, "elapsed"); if (charElapsed) - ffStrbufSetS(&options->barCharElapsed, charElapsed); + ffStrbufSetJsonVal(&options->barCharElapsed, charElapsed); - const char* charTotal = yyjson_get_str(yyjson_obj_get(char_, "total")); + yyjson_val* charTotal = yyjson_obj_get(char_, "total"); if (charTotal) - ffStrbufSetS(&options->barCharTotal, charTotal); + ffStrbufSetJsonVal(&options->barCharTotal, charTotal); } else { - const char* charElapsed = yyjson_get_str(yyjson_obj_get(val, "charElapsed")); + yyjson_val* charElapsed = yyjson_obj_get(val, "charElapsed"); if (charElapsed) return "display.bar.charElapsed has been renamed to display.bar.char.elapsed."; - const char* charTotal = yyjson_get_str(yyjson_obj_get(val, "charTotal")); + yyjson_val* charTotal = yyjson_obj_get(val, "charTotal"); if (charTotal) return "display.bar.charTotal has been renamed to display.bar.char.total."; } @@ -303,19 +303,19 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va yyjson_val* borderLeft = yyjson_obj_get(border, "left"); if (borderLeft) - ffStrbufSetS(&options->barBorderLeft, yyjson_get_str(borderLeft)); + ffStrbufSetJsonVal(&options->barBorderLeft, borderLeft); yyjson_val* borderRight = yyjson_obj_get(border, "right"); if (borderRight) - ffStrbufSetS(&options->barBorderRight, yyjson_get_str(borderRight)); + ffStrbufSetJsonVal(&options->barBorderRight, borderRight); yyjson_val* borderLeftElapsed = yyjson_obj_get(border, "leftElapsed"); if (borderLeftElapsed) - ffStrbufSetS(&options->barBorderLeftElapsed, yyjson_get_str(borderLeftElapsed)); + ffStrbufSetJsonVal(&options->barBorderLeftElapsed, borderLeftElapsed); yyjson_val* borderRightElapsed = yyjson_obj_get(border, "rightElapsed"); if (borderRightElapsed) - ffStrbufSetS(&options->barBorderRightElapsed, yyjson_get_str(borderRightElapsed)); + ffStrbufSetJsonVal(&options->barBorderRightElapsed, borderRightElapsed); } } else @@ -418,7 +418,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va yyjson_val* item; size_t idx, max; yyjson_arr_foreach(val, idx, max, item) - ffStrbufInitS(ffListAdd(&options->constants), yyjson_get_str(item)); + ffStrbufInitJsonVal(ffListAdd(&options->constants), item); } else if (ffStrEqualsIgnCase(key, "freq")) { diff --git a/src/options/general.c b/src/options/general.c index eb09b127e..e90355335 100644 --- a/src/options/general.c +++ b/src/options/general.c @@ -18,13 +18,15 @@ const char* ffOptionsParseGeneralJsonConfig(FFOptionsGeneral* options, yyjson_va { const char* key = yyjson_get_str(key_); - if (ffStrEqualsIgnCase(key, "thread") || ffStrEqualsIgnCase(key, "multithreading")) + if (ffStrEqualsIgnCase(key, "thread")) options->multithreading = yyjson_get_bool(val); else if (ffStrEqualsIgnCase(key, "processingTimeout")) options->processingTimeout = (int32_t) yyjson_get_int(val); else if (ffStrEqualsIgnCase(key, "preRun")) { - if (system(yyjson_get_str(val)) < 0) + 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 (ffStrEqualsIgnCase(key, "detectVersion")) @@ -32,7 +34,7 @@ const char* ffOptionsParseGeneralJsonConfig(FFOptionsGeneral* options, yyjson_va #if defined(__linux__) || defined(__FreeBSD__) || defined(__sun) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) else if (ffStrEqualsIgnCase(key, "playerName")) - ffStrbufSetS(&options->playerName, yyjson_get_str(val)); + ffStrbufSetJsonVal(&options->playerName, val); else if (ffStrEqualsIgnCase(key, "dsForceDrm")) { if (yyjson_is_str(val)) diff --git a/src/options/logo.c b/src/options/logo.c index 5b3aed829..1b6240d2e 100644 --- a/src/options/logo.c +++ b/src/options/logo.c @@ -263,8 +263,7 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo if (yyjson_is_str(object)) { - const char* value = yyjson_get_str(object); - ffStrbufSetS(&options->source, value); + ffStrbufSetJsonVal(&options->source, object); return NULL; } @@ -305,7 +304,7 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo } else if (ffStrEqualsIgnCase(key, "source")) { - ffStrbufSetS(&options->source, yyjson_get_str(val)); + ffStrbufSetJsonVal(&options->source, val); continue; } else if (ffStrEqualsIgnCase(key, "color")) @@ -403,7 +402,7 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo yyjson_val* symbols = yyjson_obj_get(val, "symbols"); if (symbols) - ffStrbufSetS(&options->chafaSymbols, yyjson_get_str(symbols)); + ffStrbufSetJsonVal(&options->chafaSymbols, symbols); yyjson_val* canvasMode = yyjson_obj_get(val, "canvasMode"); if (canvasMode) diff --git a/src/util/FFstrbuf.c b/src/util/FFstrbuf.c index 6fe0b151c..8a462aac6 100644 --- a/src/util/FFstrbuf.c +++ b/src/util/FFstrbuf.c @@ -219,12 +219,6 @@ void ffStrbufPrependC(FFstrbuf* strbuf, char c) strbuf->length += 1; } -void ffStrbufSetNS(FFstrbuf* strbuf, uint32_t length, const char* value) -{ - ffStrbufClear(strbuf); - ffStrbufAppendNS(strbuf, length, value); -} - void ffStrbufTrimLeft(FFstrbuf* strbuf, char c) { if(strbuf->length == 0) diff --git a/src/util/FFstrbuf.h b/src/util/FFstrbuf.h index 7e9692722..a91ea8ee7 100644 --- a/src/util/FFstrbuf.h +++ b/src/util/FFstrbuf.h @@ -9,6 +9,7 @@ #include #include #include +#include "3rdparty/yyjson/yyjson.h" #ifdef _WIN32 // #include @@ -48,7 +49,6 @@ void ffStrbufPrependC(FFstrbuf* strbuf, char c); void ffStrbufInsertNC(FFstrbuf* strbuf, uint32_t index, uint32_t num, char c); -void ffStrbufSetNS(FFstrbuf* strbuf, uint32_t length, const char* value); FF_C_PRINTF(2, 3) void ffStrbufSetF(FFstrbuf* strbuf, const char* format, ...); void ffStrbufTrimLeft(FFstrbuf* strbuf, char c); @@ -211,6 +211,16 @@ static inline void ffStrbufAppendS(FFstrbuf* strbuf, const char* value) ffStrbufAppendNS(strbuf, (uint32_t) strlen(value), value); } +static inline bool ffStrbufAppendJsonVal(FFstrbuf* strbuf, yyjson_val* jsonVal) +{ + if (yyjson_is_str(jsonVal)) + { + ffStrbufAppendNS(strbuf, (uint32_t) unsafe_yyjson_get_len(jsonVal), unsafe_yyjson_get_str(jsonVal)); + return true; + } + return false; +} + static inline void ffStrbufSetS(FFstrbuf* strbuf, const char* value) { ffStrbufClear(strbuf); @@ -219,6 +229,12 @@ static inline void ffStrbufSetS(FFstrbuf* strbuf, const char* value) ffStrbufAppendNS(strbuf, (uint32_t) strlen(value), value); } +static inline void ffStrbufSetNS(FFstrbuf* strbuf, uint32_t length, const char* value) +{ + ffStrbufClear(strbuf); + ffStrbufAppendNS(strbuf, length, value); +} + static inline void ffStrbufSet(FFstrbuf* strbuf, const FFstrbuf* value) { assert(value && value != strbuf); @@ -230,6 +246,12 @@ static inline void ffStrbufSet(FFstrbuf* strbuf, const FFstrbuf* value) ffStrbufSetNS(strbuf, value->length, value->chars); } +static inline bool ffStrbufSetJsonVal(FFstrbuf* strbuf, yyjson_val* jsonVal) +{ + ffStrbufClear(strbuf); + return ffStrbufAppendJsonVal(strbuf, jsonVal); +} + static inline void ffStrbufInit(FFstrbuf* strbuf) { extern char* CHAR_NULL_PTR; @@ -284,6 +306,12 @@ FF_C_NODISCARD static inline FFstrbuf ffStrbufCreateNS(uint32_t length, const ch return strbuf; } +static inline bool ffStrbufInitJsonVal(FFstrbuf* strbuf, yyjson_val* jsonVal) +{ + ffStrbufInit(strbuf); + return ffStrbufAppendJsonVal(strbuf, jsonVal); +} + static inline void ffStrbufInitS(FFstrbuf* strbuf, const char* str) { ffStrbufInit(strbuf); From 0b02543ef2d83aed1f5e9dc8e2b376dc5295cc83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sat, 2 Aug 2025 18:51:03 +0800 Subject: [PATCH 13/83] JsonConfig: refactor JSON key handling to improve safety and consistency Also make keys case-sensitive --- src/common/jsonconfig.c | 17 ++++++----- src/common/jsonconfig.h | 2 +- src/common/percent.c | 6 ++-- src/common/percent.h | 2 +- src/common/temps.c | 6 ++-- src/common/temps.h | 2 +- src/modules/battery/battery.c | 12 +++----- src/modules/bios/bios.c | 10 ++---- src/modules/bluetooth/bluetooth.c | 12 +++----- src/modules/bluetoothradio/bluetoothradio.c | 10 ++---- src/modules/board/board.c | 10 ++---- src/modules/bootmgr/bootmgr.c | 10 ++---- src/modules/break/break.c | 9 ++++++ src/modules/brightness/brightness.c | 14 +++------ src/modules/btrfs/btrfs.c | 10 ++---- src/modules/camera/camera.c | 10 ++---- src/modules/chassis/chassis.c | 10 ++---- src/modules/colors/colors.c | 26 +++++++--------- src/modules/command/command.c | 16 ++++------ src/modules/cpu/cpu.c | 14 +++------ src/modules/cpucache/cpucache.c | 12 +++----- src/modules/cpuusage/cpuusage.c | 14 +++------ src/modules/cursor/cursor.c | 10 ++---- src/modules/custom/custom.c | 10 ++---- src/modules/datetime/datetime.c | 10 ++---- src/modules/de/de.c | 12 +++----- src/modules/disk/disk.c | 28 ++++++++--------- src/modules/diskio/diskio.c | 16 ++++------ src/modules/display/display.c | 20 +++++------- src/modules/dns/dns.c | 14 +++------ src/modules/editor/editor.c | 10 ++---- src/modules/font/font.c | 10 ++---- src/modules/gamepad/gamepad.c | 10 ++---- src/modules/gpu/gpu.c | 20 +++++------- src/modules/host/host.c | 10 ++---- src/modules/icons/icons.c | 10 ++---- src/modules/initsystem/initsystem.c | 10 ++---- src/modules/kernel/kernel.c | 10 ++---- src/modules/keyboard/keyboard.c | 10 ++---- src/modules/lm/lm.c | 10 ++---- src/modules/loadavg/loadavg.c | 14 +++------ src/modules/locale/locale.c | 10 ++---- src/modules/localip/localip.c | 34 +++++++++------------ src/modules/media/media.c | 10 ++---- src/modules/memory/memory.c | 10 ++---- src/modules/monitor/monitor.c | 10 ++---- src/modules/mouse/mouse.c | 10 ++---- src/modules/netio/netio.c | 18 +++++------ src/modules/opencl/opencl.c | 10 ++---- src/modules/opengl/opengl.c | 14 +++------ src/modules/os/os.c | 10 ++---- src/modules/packages/packages.c | 18 +++++------ src/modules/physicaldisk/physicaldisk.c | 12 +++----- src/modules/physicalmemory/physicalmemory.c | 10 ++---- src/modules/player/player.c | 10 ++---- src/modules/poweradapter/poweradapter.c | 10 ++---- src/modules/processes/processes.c | 10 ++---- src/modules/publicip/publicip.c | 16 ++++------ src/modules/separator/separator.c | 15 +++++---- src/modules/shell/shell.c | 10 ++---- src/modules/sound/sound.c | 14 +++------ src/modules/swap/swap.c | 12 +++----- src/modules/terminal/terminal.c | 10 ++---- src/modules/terminalfont/terminalfont.c | 10 ++---- src/modules/terminalsize/terminalsize.c | 10 ++---- src/modules/terminaltheme/terminaltheme.c | 10 ++---- src/modules/theme/theme.c | 10 ++---- src/modules/title/title.c | 14 +++------ src/modules/tpm/tpm.c | 10 ++---- src/modules/uptime/uptime.c | 10 ++---- src/modules/users/users.c | 13 ++++---- src/modules/version/version.c | 10 ++---- src/modules/vulkan/vulkan.c | 10 ++---- src/modules/wallpaper/wallpaper.c | 10 ++---- src/modules/weather/weather.c | 16 ++++------ src/modules/wifi/wifi.c | 10 ++---- src/modules/wm/wm.c | 12 +++----- src/modules/wmtheme/wmtheme.c | 10 ++---- src/modules/zpool/zpool.c | 10 ++---- 79 files changed, 333 insertions(+), 603 deletions(-) diff --git a/src/common/jsonconfig.c b/src/common/jsonconfig.c index e8bdc5ca9..2434ddad0 100644 --- a/src/common/jsonconfig.c +++ b/src/common/jsonconfig.c @@ -12,34 +12,37 @@ #include #include -bool ffJsonConfigParseModuleArgs(const char* key, yyjson_val* val, FFModuleArgs* moduleArgs) +bool ffJsonConfigParseModuleArgs(yyjson_val* key, yyjson_val* val, FFModuleArgs* moduleArgs) { - if(ffStrEqualsIgnCase(key, "key")) + if (unsafe_yyjson_equals_str(key, "type") || unsafe_yyjson_equals_str(key, "condition")) + return true; + + if (unsafe_yyjson_equals_str(key, "key")) { ffStrbufSetJsonVal(&moduleArgs->key, val); return true; } - else if(ffStrEqualsIgnCase(key, "format")) + else if (unsafe_yyjson_equals_str(key, "format")) { ffStrbufSetJsonVal(&moduleArgs->outputFormat, val); return true; } - else if(ffStrEqualsIgnCase(key, "outputColor")) + else if (unsafe_yyjson_equals_str(key, "outputColor")) { ffOptionParseColor(yyjson_get_str(val), &moduleArgs->outputColor); return true; } - else if(ffStrEqualsIgnCase(key, "keyColor")) + else if (unsafe_yyjson_equals_str(key, "keyColor")) { ffOptionParseColor(yyjson_get_str(val), &moduleArgs->keyColor); return true; } - else if(ffStrEqualsIgnCase(key, "keyWidth")) + else if (unsafe_yyjson_equals_str(key, "keyWidth")) { moduleArgs->keyWidth = (uint32_t) yyjson_get_uint(val); return true; } - else if(ffStrEqualsIgnCase(key, "keyIcon")) + else if (unsafe_yyjson_equals_str(key, "keyIcon")) { ffStrbufSetJsonVal(&moduleArgs->keyIcon, val); return true; diff --git a/src/common/jsonconfig.h b/src/common/jsonconfig.h index 12182855a..90df7262b 100644 --- a/src/common/jsonconfig.h +++ b/src/common/jsonconfig.h @@ -2,7 +2,7 @@ #include "fastfetch.h" -bool ffJsonConfigParseModuleArgs(const char* key, yyjson_val* val, FFModuleArgs* moduleArgs); +bool ffJsonConfigParseModuleArgs(yyjson_val* key, yyjson_val* val, FFModuleArgs* moduleArgs); const char* ffJsonConfigParseEnum(yyjson_val* val, int* result, FFKeyValuePair pairs[]); void ffPrintJsonConfig(bool prepare, yyjson_mut_doc* jsonDoc); void ffJsonConfigGenerateModuleArgsConfig(yyjson_mut_doc* doc, yyjson_mut_val* module, FFModuleArgs* defaultModuleArgs, FFModuleArgs* moduleArgs); diff --git a/src/common/percent.c b/src/common/percent.c index 98c5acc64..98e3ff218 100644 --- a/src/common/percent.c +++ b/src/common/percent.c @@ -261,14 +261,14 @@ bool ffPercentParseCommandOptions(const char* key, const char* subkey, const cha return false; } -bool ffPercentParseJsonObject(const char* key, yyjson_val* value, FFPercentageModuleConfig* config) +bool ffPercentParseJsonObject(yyjson_val* key, yyjson_val* value, FFPercentageModuleConfig* config) { - if (!ffStrEqualsIgnCase(key, "percent")) + if (!unsafe_yyjson_equals_str(key, "percent")) return false; if (!yyjson_is_obj(value)) { - fprintf(stderr, "Error: usage: %s must be an object\n", key); + fprintf(stderr, "Error: usage: %s must be an object\n", unsafe_yyjson_get_str(key)); exit(480); } diff --git a/src/common/percent.h b/src/common/percent.h index 7341b7ba0..b1b1bdc7e 100644 --- a/src/common/percent.h +++ b/src/common/percent.h @@ -40,6 +40,6 @@ typedef struct yyjson_val yyjson_val; typedef struct yyjson_mut_doc yyjson_mut_doc; typedef struct yyjson_mut_val yyjson_mut_val; bool ffPercentParseCommandOptions(const char* key, const char* subkey, const char* value, FFPercentageModuleConfig* config); -bool ffPercentParseJsonObject(const char* key, yyjson_val* value, FFPercentageModuleConfig* config); +bool ffPercentParseJsonObject(yyjson_val* key, yyjson_val* value, FFPercentageModuleConfig* config); void ffPercentGenerateJsonConfig(yyjson_mut_doc* doc, yyjson_mut_val* module, FFPercentageModuleConfig defaultConfig, FFPercentageModuleConfig config); const char* ffPercentParseTypeJsonConfig(yyjson_val* value, FFPercentageTypeFlags* result); diff --git a/src/common/temps.c b/src/common/temps.c index 3e1e59c54..c07a2aed0 100644 --- a/src/common/temps.c +++ b/src/common/temps.c @@ -107,9 +107,9 @@ bool ffTempsParseCommandOptions(const char* key, const char* subkey, const char* return false; } -bool ffTempsParseJsonObject(const char* key, yyjson_val* value, bool* useTemp, FFColorRangeConfig* config) +bool ffTempsParseJsonObject(yyjson_val* key, yyjson_val* value, bool* useTemp, FFColorRangeConfig* config) { - if (!ffStrEqualsIgnCase(key, "temp")) + if (!unsafe_yyjson_equals_str(key, "temp")) return false; if (yyjson_is_bool(value)) @@ -126,7 +126,7 @@ bool ffTempsParseJsonObject(const char* key, yyjson_val* value, bool* useTemp, F if (!yyjson_is_obj(value)) { - fprintf(stderr, "Error: usage: %s must be an object or a boolean\n", key); + fprintf(stderr, "Error: usage: %s must be an object or a boolean\n", unsafe_yyjson_get_str(key)); exit(480); } diff --git a/src/common/temps.h b/src/common/temps.h index 2236713d2..5aa8f6bf3 100644 --- a/src/common/temps.h +++ b/src/common/temps.h @@ -5,5 +5,5 @@ void ffTempsAppendNum(double celsius, FFstrbuf* buffer, FFColorRangeConfig config, const FFModuleArgs* module); bool ffTempsParseCommandOptions(const char* key, const char* subkey, const char* value, bool* useTemp, FFColorRangeConfig* config); -bool ffTempsParseJsonObject(const char* key, yyjson_val* value, bool* useTemp, FFColorRangeConfig* config); +bool ffTempsParseJsonObject(yyjson_val* key, yyjson_val* value, bool* useTemp, FFColorRangeConfig* config); void ffTempsGenerateJsonConfig(yyjson_mut_doc* doc, yyjson_mut_val* module, FF_MAYBE_UNUSED bool defaultTemp, FFColorRangeConfig defaultConfig, bool temp, FFColorRangeConfig config); diff --git a/src/modules/battery/battery.c b/src/modules/battery/battery.c index f1afddbb1..ae8be7486 100644 --- a/src/modules/battery/battery.c +++ b/src/modules/battery/battery.c @@ -185,19 +185,15 @@ bool ffParseBatteryCommandOptions(FFBatteryOptions* options, const char* key, co void ffParseBatteryJsonObject(FFBatteryOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; #ifdef _WIN32 - if (ffStrEqualsIgnCase(key, "useSetupApi")) + if (unsafe_yyjson_equals_str(key, "useSetupApi")) { options->useSetupApi = yyjson_get_bool(val); continue; @@ -210,7 +206,7 @@ void ffParseBatteryJsonObject(FFBatteryOptions* options, yyjson_val* module) if (ffPercentParseJsonObject(key, val, &options->percent)) continue; - ffPrintError(FF_BATTERY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_BATTERY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/bios/bios.c b/src/modules/bios/bios.c index b8a3b0cc3..f07a441f8 100644 --- a/src/modules/bios/bios.c +++ b/src/modules/bios/bios.c @@ -87,18 +87,14 @@ bool ffParseBiosCommandOptions(FFBiosOptions* options, const char* key, const ch void ffParseBiosJsonObject(FFBiosOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_BIOS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_BIOS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/bluetooth/bluetooth.c b/src/modules/bluetooth/bluetooth.c index b93178556..3433c3ef6 100644 --- a/src/modules/bluetooth/bluetooth.c +++ b/src/modules/bluetooth/bluetooth.c @@ -118,18 +118,14 @@ bool ffParseBluetoothCommandOptions(FFBluetoothOptions* options, const char* key void ffParseBluetoothJsonObject(FFBluetoothOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "showDisconnected")) + if (unsafe_yyjson_equals_str(key, "showDisconnected")) { options->showDisconnected = yyjson_get_bool(val); continue; @@ -138,7 +134,7 @@ void ffParseBluetoothJsonObject(FFBluetoothOptions* options, yyjson_val* module) if (ffPercentParseJsonObject(key, val, &options->percent)) continue; - ffPrintError(FF_BLUETOOTH_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_BLUETOOTH_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/bluetoothradio/bluetoothradio.c b/src/modules/bluetoothradio/bluetoothradio.c index 771296bde..93e52f686 100644 --- a/src/modules/bluetoothradio/bluetoothradio.c +++ b/src/modules/bluetoothradio/bluetoothradio.c @@ -117,18 +117,14 @@ bool ffParseBluetoothRadioCommandOptions(FFBluetoothRadioOptions* options, const void ffParseBluetoothRadioJsonObject(FFBluetoothRadioOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_BLUETOOTHRADIO_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_BLUETOOTHRADIO_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/board/board.c b/src/modules/board/board.c index a539aa9bf..0f226e2d8 100644 --- a/src/modules/board/board.c +++ b/src/modules/board/board.c @@ -62,18 +62,14 @@ bool ffParseBoardCommandOptions(FFBoardOptions* options, const char* key, const void ffParseBoardJsonObject(FFBoardOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_BOARD_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_BOARD_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/bootmgr/bootmgr.c b/src/modules/bootmgr/bootmgr.c index 601420bc5..01a2279d6 100644 --- a/src/modules/bootmgr/bootmgr.c +++ b/src/modules/bootmgr/bootmgr.c @@ -62,18 +62,14 @@ bool ffParseBootmgrCommandOptions(FFBootmgrOptions* options, const char* key, co void ffParseBootmgrJsonObject(FFBootmgrOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_BOOTMGR_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_BOOTMGR_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/break/break.c b/src/modules/break/break.c index 6e3379ee0..39a47c0d4 100644 --- a/src/modules/break/break.c +++ b/src/modules/break/break.c @@ -15,6 +15,15 @@ bool ffParseBreakCommandOptions(FF_MAYBE_UNUSED FFBreakOptions* options, FF_MAYB void ffParseBreakJsonObject(FF_MAYBE_UNUSED FFBreakOptions* options, FF_MAYBE_UNUSED yyjson_val* module) { + yyjson_val *key, *val; + size_t idx, max; + yyjson_obj_foreach(module, idx, max, key, val) + { + if (unsafe_yyjson_equals_str(key, "type") || unsafe_yyjson_equals_str(key, "condition")) + continue; + + ffPrintError(FF_BREAK_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); + } } static FFModuleBaseInfo ffModuleInfo = { diff --git a/src/modules/brightness/brightness.c b/src/modules/brightness/brightness.c index bcbd81364..cd73a4dee 100644 --- a/src/modules/brightness/brightness.c +++ b/src/modules/brightness/brightness.c @@ -139,24 +139,20 @@ bool ffParseBrightnessCommandOptions(FFBrightnessOptions* options, const char* k void ffParseBrightnessJsonObject(FFBrightnessOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "ddcciSleep")) + if (unsafe_yyjson_equals_str(key, "ddcciSleep")) { options->ddcciSleep = (uint32_t) yyjson_get_uint(val); continue; } - if (ffStrEqualsIgnCase(key, "compact")) + if (unsafe_yyjson_equals_str(key, "compact")) { options->compact = (uint32_t) yyjson_get_bool(val); continue; @@ -165,7 +161,7 @@ void ffParseBrightnessJsonObject(FFBrightnessOptions* options, yyjson_val* modul if (ffPercentParseJsonObject(key, val, &options->percent)) continue; - ffPrintError(FF_BRIGHTNESS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_BRIGHTNESS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/btrfs/btrfs.c b/src/modules/btrfs/btrfs.c index 31b58e1f3..2eb78e12a 100644 --- a/src/modules/btrfs/btrfs.c +++ b/src/modules/btrfs/btrfs.c @@ -145,21 +145,17 @@ bool ffParseBtrfsCommandOptions(FFBtrfsOptions* options, const char* key, const void ffParseBtrfsJsonObject(FFBtrfsOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; if (ffPercentParseJsonObject(key, val, &options->percent)) continue; - ffPrintError(FF_BTRFS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_BTRFS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/camera/camera.c b/src/modules/camera/camera.c index 48d450f49..515df46c8 100644 --- a/src/modules/camera/camera.c +++ b/src/modules/camera/camera.c @@ -79,18 +79,14 @@ bool ffParseCameraCommandOptions(FFCameraOptions* options, const char* key, cons void ffParseCameraJsonObject(FFCameraOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_CAMERA_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_CAMERA_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/chassis/chassis.c b/src/modules/chassis/chassis.c index 5d7ef9239..e9c4056ad 100644 --- a/src/modules/chassis/chassis.c +++ b/src/modules/chassis/chassis.c @@ -63,18 +63,14 @@ bool ffParseChassisCommandOptions(FFChassisOptions* options, const char* key, co void ffParseChassisJsonObject(FFChassisOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_CHASSIS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_CHASSIS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/colors/colors.c b/src/modules/colors/colors.c index 7d4367b39..bad4666da 100644 --- a/src/modules/colors/colors.c +++ b/src/modules/colors/colors.c @@ -176,18 +176,14 @@ bool ffParseColorsCommandOptions(FFColorsOptions* options, const char* key, cons void ffParseColorsJsonObject(FFColorsOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "symbol")) + if (unsafe_yyjson_equals_str(key, "symbol")) { int value; const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { @@ -201,22 +197,22 @@ void ffParseColorsJsonObject(FFColorsOptions* options, yyjson_val* module) {}, }); if (error) - ffPrintError(FF_COLORS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Invalid %s value: %s", key, error); + ffPrintError(FF_COLORS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Invalid %s value: %s", unsafe_yyjson_get_str(key), error); else options->symbol = (FFColorsSymbol) value; continue; } - if (ffStrEqualsIgnCase(key, "paddingLeft")) + if (unsafe_yyjson_equals_str(key, "paddingLeft")) { options->paddingLeft = (uint32_t) yyjson_get_uint(val); continue; } - if (ffStrEqualsIgnCase(key, "block")) + if (unsafe_yyjson_equals_str(key, "block")) { if (!yyjson_is_obj(val)) - ffPrintError(FF_COLORS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Invalid %s value: must be an object", key); + ffPrintError(FF_COLORS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Invalid %s value: must be an object", unsafe_yyjson_get_str(key)); else { yyjson_val* width = yyjson_obj_get(val, "width"); @@ -227,15 +223,15 @@ void ffParseColorsJsonObject(FFColorsOptions* options, yyjson_val* module) if (range) { if (!yyjson_is_arr(range) || yyjson_arr_size(range) != 2) - ffPrintError(FF_COLORS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Invalid %s.range value: must be an array of 2 elements", key); + ffPrintError(FF_COLORS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Invalid %s.range value: must be an array of 2 elements", unsafe_yyjson_get_str(key)); else { uint8_t start = (uint8_t) yyjson_get_uint(yyjson_arr_get(range, 0)); uint8_t end = (uint8_t) yyjson_get_uint(yyjson_arr_get(range, 1)); if (start > end) - ffPrintError(FF_COLORS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Invalid %s.range value: range[0] > range[1]", key); + ffPrintError(FF_COLORS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Invalid %s.range value: range[0] > range[1]", unsafe_yyjson_get_str(key)); else if (end > 15) - ffPrintError(FF_COLORS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Invalid %s.range value: range[1] > 15", key); + ffPrintError(FF_COLORS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Invalid %s.range value: range[1] > 15", unsafe_yyjson_get_str(key)); else { options->block.range[0] = start; @@ -247,7 +243,7 @@ void ffParseColorsJsonObject(FFColorsOptions* options, yyjson_val* module) continue; } - ffPrintError(FF_COLORS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Unknown JSON key %s", key); + ffPrintError(FF_COLORS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/command/command.c b/src/modules/command/command.c index 971a2a77c..99ade943c 100644 --- a/src/modules/command/command.c +++ b/src/modules/command/command.c @@ -73,36 +73,32 @@ bool ffParseCommandCommandOptions(FFCommandOptions* options, const char* key, co void ffParseCommandJsonObject(FFCommandOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "shell")) + if (unsafe_yyjson_equals_str(key, "shell")) { ffStrbufSetJsonVal(&options->shell, val); continue; } - if (ffStrEqualsIgnCase(key, "param")) + if (unsafe_yyjson_equals_str(key, "param")) { ffStrbufSetJsonVal(&options->param, val); continue; } - if (ffStrEqualsIgnCase(key, "text")) + if (unsafe_yyjson_equals_str(key, "text")) { ffStrbufSetJsonVal(&options->text, val); continue; } - ffPrintError(FF_COMMAND_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_COMMAND_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/cpu/cpu.c b/src/modules/cpu/cpu.c index 2511a6b04..3d44657c3 100644 --- a/src/modules/cpu/cpu.c +++ b/src/modules/cpu/cpu.c @@ -138,33 +138,29 @@ bool ffParseCPUCommandOptions(FFCPUOptions* options, const char* key, const char void ffParseCPUJsonObject(FFCPUOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; if (ffTempsParseJsonObject(key, val, &options->temp, &options->tempConfig)) continue; - if (ffStrEqualsIgnCase(key, "freqNdigits")) + if (unsafe_yyjson_equals_str(key, "freqNdigits")) { ffPrintError(FF_CPU_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "modules.CPU.freqNdigits has been moved to display.freq.ndigits"); continue; } - if (ffStrEqualsIgnCase(key, "showPeCoreCount")) + if (unsafe_yyjson_equals_str(key, "showPeCoreCount")) { options->showPeCoreCount = yyjson_get_bool(val); continue; } - ffPrintError(FF_CPU_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_CPU_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/cpucache/cpucache.c b/src/modules/cpucache/cpucache.c index 64eaa0612..71bf5b465 100644 --- a/src/modules/cpucache/cpucache.c +++ b/src/modules/cpucache/cpucache.c @@ -150,24 +150,20 @@ bool ffParseCPUCacheCommandOptions(FFCPUCacheOptions* options, const char* key, void ffParseCPUCacheJsonObject(FFCPUCacheOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "compact")) + if (unsafe_yyjson_equals_str(key, "compact")) { options->compact = yyjson_get_bool(val); continue; } - ffPrintError(FF_CPUCACHE_DISPLAY_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_CPUCACHE_DISPLAY_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/cpuusage/cpuusage.c b/src/modules/cpuusage/cpuusage.c index 6d15261eb..ab78e456f 100644 --- a/src/modules/cpuusage/cpuusage.c +++ b/src/modules/cpuusage/cpuusage.c @@ -143,24 +143,20 @@ bool ffParseCPUUsageCommandOptions(FFCPUUsageOptions* options, const char* key, void ffParseCPUUsageJsonObject(FFCPUUsageOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "separate")) + if (unsafe_yyjson_equals_str(key, "separate")) { options->separate = yyjson_get_bool(val); continue; } - if (ffStrEqualsIgnCase(key, "waitTime")) + if (unsafe_yyjson_equals_str(key, "waitTime")) { options->waitTime = (uint32_t) yyjson_get_uint(val); continue; @@ -169,7 +165,7 @@ void ffParseCPUUsageJsonObject(FFCPUUsageOptions* options, yyjson_val* module) if (ffPercentParseJsonObject(key, val, &options->percent)) continue; - ffPrintError(FF_CPUUSAGE_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_CPUUSAGE_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/cursor/cursor.c b/src/modules/cursor/cursor.c index 9652398b5..80f101f11 100644 --- a/src/modules/cursor/cursor.c +++ b/src/modules/cursor/cursor.c @@ -60,18 +60,14 @@ bool ffParseCursorCommandOptions(FFCursorOptions* options, const char* key, cons void ffParseCursorJsonObject(FFCursorOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_CURSOR_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_CURSOR_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/custom/custom.c b/src/modules/custom/custom.c index b0f317574..70c67e76d 100644 --- a/src/modules/custom/custom.c +++ b/src/modules/custom/custom.c @@ -29,18 +29,14 @@ void ffGenerateCustomJsonConfig(FFCustomOptions* options, yyjson_mut_doc* doc, y void ffParseCustomJsonObject(FFCustomOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_CUSTOM_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_CUSTOM_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/datetime/datetime.c b/src/modules/datetime/datetime.c index 06bca8d60..9d7ca2651 100644 --- a/src/modules/datetime/datetime.c +++ b/src/modules/datetime/datetime.c @@ -129,18 +129,14 @@ bool ffParseDateTimeCommandOptions(FFDateTimeOptions* options, const char* key, void ffParseDateTimeJsonObject(FFDateTimeOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_DATETIME_DISPLAY_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_DATETIME_DISPLAY_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/de/de.c b/src/modules/de/de.c index 341e03e2c..d0e290090 100644 --- a/src/modules/de/de.c +++ b/src/modules/de/de.c @@ -60,24 +60,20 @@ bool ffParseDECommandOptions(FFDEOptions* options, const char* key, const char* void ffParseDEJsonObject(FFDEOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "slowVersionDetection")) + if (unsafe_yyjson_equals_str(key, "slowVersionDetection")) { options->slowVersionDetection = yyjson_get_bool(val); continue; } - ffPrintError(FF_DE_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_DE_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/disk/disk.c b/src/modules/disk/disk.c index 3d308babf..14b4754ec 100644 --- a/src/modules/disk/disk.c +++ b/src/modules/disk/disk.c @@ -299,36 +299,32 @@ bool ffParseDiskCommandOptions(FFDiskOptions* options, const char* key, const ch void ffParseDiskJsonObject(FFDiskOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "folders")) + if (unsafe_yyjson_equals_str(key, "folders")) { ffStrbufSetJsonVal(&options->folders, val); continue; } - if (ffStrEqualsIgnCase(key, "hideFolders")) + if (unsafe_yyjson_equals_str(key, "hideFolders")) { ffStrbufSetJsonVal(&options->hideFolders, val); continue; } - if (ffStrEqualsIgnCase(key, "hideFS")) + if (unsafe_yyjson_equals_str(key, "hideFS")) { ffStrbufSetJsonVal(&options->hideFS, val); continue; } - if (ffStrEqualsIgnCase(key, "showExternal")) + if (unsafe_yyjson_equals_str(key, "showExternal")) { if (yyjson_get_bool(val)) options->showTypes |= FF_DISK_VOLUME_TYPE_EXTERNAL_BIT; @@ -337,7 +333,7 @@ void ffParseDiskJsonObject(FFDiskOptions* options, yyjson_val* module) continue; } - if (ffStrEqualsIgnCase(key, "showHidden")) + if (unsafe_yyjson_equals_str(key, "showHidden")) { if (yyjson_get_bool(val)) options->showTypes |= FF_DISK_VOLUME_TYPE_HIDDEN_BIT; @@ -346,7 +342,7 @@ void ffParseDiskJsonObject(FFDiskOptions* options, yyjson_val* module) continue; } - if (ffStrEqualsIgnCase(key, "showSubvolumes")) + if (unsafe_yyjson_equals_str(key, "showSubvolumes")) { if (yyjson_get_bool(val)) options->showTypes |= FF_DISK_VOLUME_TYPE_SUBVOLUME_BIT; @@ -355,7 +351,7 @@ void ffParseDiskJsonObject(FFDiskOptions* options, yyjson_val* module) continue; } - if (ffStrEqualsIgnCase(key, "showReadOnly")) + if (unsafe_yyjson_equals_str(key, "showReadOnly")) { if (yyjson_get_bool(val)) options->showTypes |= FF_DISK_VOLUME_TYPE_READONLY_BIT; @@ -364,7 +360,7 @@ void ffParseDiskJsonObject(FFDiskOptions* options, yyjson_val* module) continue; } - if (ffStrEqualsIgnCase(key, "showUnknown")) + if (unsafe_yyjson_equals_str(key, "showUnknown")) { if (yyjson_get_bool(val)) options->showTypes |= FF_DISK_VOLUME_TYPE_UNKNOWN_BIT; @@ -373,7 +369,7 @@ void ffParseDiskJsonObject(FFDiskOptions* options, yyjson_val* module) continue; } - if (ffStrEqualsIgnCase(key, "useAvailable")) + if (unsafe_yyjson_equals_str(key, "useAvailable")) { if (yyjson_get_bool(val)) options->calcType = FF_DISK_CALC_TYPE_AVAILABLE; @@ -385,7 +381,7 @@ void ffParseDiskJsonObject(FFDiskOptions* options, yyjson_val* module) if (ffPercentParseJsonObject(key, val, &options->percent)) continue; - ffPrintError(FF_DISK_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_DISK_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/diskio/diskio.c b/src/modules/diskio/diskio.c index f80bbfc28..f5f805d0e 100644 --- a/src/modules/diskio/diskio.c +++ b/src/modules/diskio/diskio.c @@ -125,36 +125,32 @@ bool ffParseDiskIOCommandOptions(FFDiskIOOptions* options, const char* key, cons void ffParseDiskIOJsonObject(FFDiskIOOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "namePrefix")) + if (unsafe_yyjson_equals_str(key, "namePrefix")) { ffStrbufSetJsonVal(&options->namePrefix, val); continue; } - if (ffStrEqualsIgnCase(key, "detectTotal")) + if (unsafe_yyjson_equals_str(key, "detectTotal")) { options->detectTotal = yyjson_get_bool(val); continue; } - if (ffStrEqualsIgnCase(key, "waitTime")) + if (unsafe_yyjson_equals_str(key, "waitTime")) { options->waitTime = (uint32_t) yyjson_get_uint(val); continue; } - ffPrintError(FF_DISKIO_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_DISKIO_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/display/display.c b/src/modules/display/display.c index 437bc79f6..914af6ca6 100644 --- a/src/modules/display/display.c +++ b/src/modules/display/display.c @@ -259,18 +259,14 @@ bool ffParseDisplayCommandOptions(FFDisplayOptions* options, const char* key, co void ffParseDisplayJsonObject(FFDisplayOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "compactType")) + if (unsafe_yyjson_equals_str(key, "compactType")) { int value; const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { @@ -282,19 +278,19 @@ void ffParseDisplayJsonObject(FFDisplayOptions* options, yyjson_val* module) {}, }); if (error) - ffPrintError(FF_DISPLAY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", key, error); + ffPrintError(FF_DISPLAY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", unsafe_yyjson_get_str(key), error); else options->compactType = (FFDisplayCompactType) value; continue; } - if (ffStrEqualsIgnCase(key, "preciseRefreshRate")) + if (unsafe_yyjson_equals_str(key, "preciseRefreshRate")) { options->preciseRefreshRate = yyjson_get_bool(val); continue; } - if (ffStrEqualsIgnCase(key, "order")) + if (unsafe_yyjson_equals_str(key, "order")) { int value; const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { @@ -304,13 +300,13 @@ void ffParseDisplayJsonObject(FFDisplayOptions* options, yyjson_val* module) {}, }); if (error) - ffPrintError(FF_DISPLAY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", key, error); + ffPrintError(FF_DISPLAY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", unsafe_yyjson_get_str(key), error); else options->order = (FFDisplayOrder) value; continue; } - ffPrintError(FF_DISPLAY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_DISPLAY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/dns/dns.c b/src/modules/dns/dns.c index fc330a2f3..246006eab 100644 --- a/src/modules/dns/dns.c +++ b/src/modules/dns/dns.c @@ -80,18 +80,14 @@ bool ffParseDNSCommandOptions(FFDNSOptions* options, const char* key, const char void ffParseDNSJsonObject(FFDNSOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "showType")) + if (unsafe_yyjson_equals_str(key, "showType")) { int value; const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { @@ -101,13 +97,13 @@ void ffParseDNSJsonObject(FFDNSOptions* options, yyjson_val* module) {}, }); if (error) - ffPrintError(FF_DNS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Invalid %s value: %s", key, error); + ffPrintError(FF_DNS_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Invalid %s value: %s", unsafe_yyjson_get_str(key), error); else options->showType = (FFDNSShowType) value; continue; } - ffPrintError(FF_DNS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_DNS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/editor/editor.c b/src/modules/editor/editor.c index 42ff06a5e..4baa02352 100644 --- a/src/modules/editor/editor.c +++ b/src/modules/editor/editor.c @@ -66,18 +66,14 @@ bool ffParseEditorCommandOptions(FFEditorOptions* options, const char* key, cons void ffParseEditorJsonObject(FFEditorOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_EDITOR_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_EDITOR_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/font/font.c b/src/modules/font/font.c index 8efd244ca..3829901e2 100644 --- a/src/modules/font/font.c +++ b/src/modules/font/font.c @@ -53,18 +53,14 @@ bool ffParseFontCommandOptions(FFFontOptions* options, const char* key, const ch void ffParseFontJsonObject(FFFontOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_FONT_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_FONT_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/gamepad/gamepad.c b/src/modules/gamepad/gamepad.c index 3bcc4f6f9..f3f9b37ae 100644 --- a/src/modules/gamepad/gamepad.c +++ b/src/modules/gamepad/gamepad.c @@ -92,21 +92,17 @@ bool ffParseGamepadCommandOptions(FFGamepadOptions* options, const char* key, co void ffParseGamepadJsonObject(FFGamepadOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; if (ffPercentParseJsonObject(key, val, &options->percent)) continue; - ffPrintError(FF_GAMEPAD_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_GAMEPAD_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/gpu/gpu.c b/src/modules/gpu/gpu.c index f2f5806c7..06098e9e5 100644 --- a/src/modules/gpu/gpu.c +++ b/src/modules/gpu/gpu.c @@ -251,27 +251,23 @@ bool ffParseGPUCommandOptions(FFGPUOptions* options, const char* key, const char void ffParseGPUJsonObject(FFGPUOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; if (ffTempsParseJsonObject(key, val, &options->temp, &options->tempConfig)) continue; - if (ffStrEqualsIgnCase(key, "driverSpecific")) + if (unsafe_yyjson_equals_str(key, "driverSpecific")) { options->driverSpecific = yyjson_get_bool(val); continue; } - if (ffStrEqualsIgnCase(key, "detectionMethod")) + if (unsafe_yyjson_equals_str(key, "detectionMethod")) { int value; const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { @@ -283,13 +279,13 @@ void ffParseGPUJsonObject(FFGPUOptions* options, yyjson_val* module) {}, }); if (error) - ffPrintError(FF_GPU_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", key, error); + ffPrintError(FF_GPU_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", unsafe_yyjson_get_str(key), error); else options->detectionMethod = (FFGPUDetectionMethod) value; continue; } - if (ffStrEqualsIgnCase(key, "hideType")) + if (unsafe_yyjson_equals_str(key, "hideType")) { int value; const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { @@ -300,7 +296,7 @@ void ffParseGPUJsonObject(FFGPUOptions* options, yyjson_val* module) {}, }); if (error) - ffPrintError(FF_GPU_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", key, error); + ffPrintError(FF_GPU_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", unsafe_yyjson_get_str(key), error); else options->hideType = (FFGPUType) value; continue; @@ -309,7 +305,7 @@ void ffParseGPUJsonObject(FFGPUOptions* options, yyjson_val* module) if (ffPercentParseJsonObject(key, val, &options->percent)) continue; - ffPrintError(FF_GPU_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_GPU_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/host/host.c b/src/modules/host/host.c index 609521f77..7d9a68f62 100644 --- a/src/modules/host/host.c +++ b/src/modules/host/host.c @@ -79,18 +79,14 @@ bool ffParseHostCommandOptions(FFHostOptions* options, const char* key, const ch void ffParseHostJsonObject(FFHostOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_HOST_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_HOST_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/icons/icons.c b/src/modules/icons/icons.c index 3c0dd98db..a708e6c2c 100644 --- a/src/modules/icons/icons.c +++ b/src/modules/icons/icons.c @@ -55,18 +55,14 @@ bool ffParseIconsCommandOptions(FFIconsOptions* options, const char* key, const void ffParseIconsJsonObject(FFIconsOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_ICONS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_ICONS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/initsystem/initsystem.c b/src/modules/initsystem/initsystem.c index 38b8ece01..99669aaab 100644 --- a/src/modules/initsystem/initsystem.c +++ b/src/modules/initsystem/initsystem.c @@ -60,18 +60,14 @@ bool ffParseInitSystemCommandOptions(FFInitSystemOptions* options, const char* k void ffParseInitSystemJsonObject(FFInitSystemOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_INITSYSTEM_DISPLAY_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_INITSYSTEM_DISPLAY_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/kernel/kernel.c b/src/modules/kernel/kernel.c index d747e6752..421ebab03 100644 --- a/src/modules/kernel/kernel.c +++ b/src/modules/kernel/kernel.c @@ -44,18 +44,14 @@ bool ffParseKernelCommandOptions(FFKernelOptions* options, const char* key, cons void ffParseKernelJsonObject(FFKernelOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_KERNEL_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_KERNEL_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/keyboard/keyboard.c b/src/modules/keyboard/keyboard.c index e48e533df..35b4f5d86 100644 --- a/src/modules/keyboard/keyboard.c +++ b/src/modules/keyboard/keyboard.c @@ -60,18 +60,14 @@ bool ffParseKeyboardCommandOptions(FFKeyboardOptions* options, const char* key, void ffParseKeyboardJsonObject(FFKeyboardOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_KEYBOARD_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_KEYBOARD_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/lm/lm.c b/src/modules/lm/lm.c index 5dc29dd3b..4cdb42a70 100644 --- a/src/modules/lm/lm.c +++ b/src/modules/lm/lm.c @@ -59,18 +59,14 @@ bool ffParseLMCommandOptions(FFLMOptions* options, const char* key, const char* void ffParseLMJsonObject(FFLMOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_LM_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_LM_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/loadavg/loadavg.c b/src/modules/loadavg/loadavg.c index 2a02f935a..afd443cfd 100644 --- a/src/modules/loadavg/loadavg.c +++ b/src/modules/loadavg/loadavg.c @@ -117,24 +117,20 @@ bool ffParseLoadavgCommandOptions(FFLoadavgOptions* options, const char* key, co void ffParseLoadavgJsonObject(FFLoadavgOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "ndigits")) + if (unsafe_yyjson_equals_str(key, "ndigits")) { options->ndigits = (uint8_t) yyjson_get_uint(val); continue; } - if (ffStrEqualsIgnCase(key, "compact")) + if (unsafe_yyjson_equals_str(key, "compact")) { options->compact = yyjson_get_bool(val); continue; @@ -143,7 +139,7 @@ void ffParseLoadavgJsonObject(FFLoadavgOptions* options, yyjson_val* module) if (ffPercentParseJsonObject(key, val, &options->percent)) continue; - ffPrintError(FF_LOADAVG_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_LOADAVG_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/locale/locale.c b/src/modules/locale/locale.c index ba82b3235..04e7d9159 100644 --- a/src/modules/locale/locale.c +++ b/src/modules/locale/locale.c @@ -40,18 +40,14 @@ bool ffParseLocaleCommandOptions(FFLocaleOptions* options, const char* key, cons void ffParseLocaleJsonObject(FFLocaleOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_LOCALE_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_LOCALE_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/localip/localip.c b/src/modules/localip/localip.c index 308991367..16680c690 100644 --- a/src/modules/localip/localip.c +++ b/src/modules/localip/localip.c @@ -295,18 +295,14 @@ bool ffParseLocalIpCommandOptions(FFLocalIpOptions* options, const char* key, co void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "showIpv4")) + if (unsafe_yyjson_equals_str(key, "showIpv4")) { if (yyjson_get_bool(val)) options->showType |= FF_LOCALIP_TYPE_IPV4_BIT; @@ -315,7 +311,7 @@ void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module) continue; } - if (ffStrEqualsIgnCase(key, "showIpv6")) + if (unsafe_yyjson_equals_str(key, "showIpv6")) { if (yyjson_get_bool(val)) options->showType |= FF_LOCALIP_TYPE_IPV6_BIT; @@ -324,7 +320,7 @@ void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module) continue; } - if (ffStrEqualsIgnCase(key, "showMac")) + if (unsafe_yyjson_equals_str(key, "showMac")) { if (yyjson_get_bool(val)) options->showType |= FF_LOCALIP_TYPE_MAC_BIT; @@ -333,7 +329,7 @@ void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module) continue; } - if (ffStrEqualsIgnCase(key, "showLoop")) + if (unsafe_yyjson_equals_str(key, "showLoop")) { if (yyjson_get_bool(val)) options->showType |= FF_LOCALIP_TYPE_LOOP_BIT; @@ -342,7 +338,7 @@ void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module) continue; } - if (ffStrEqualsIgnCase(key, "showPrefixLen")) + if (unsafe_yyjson_equals_str(key, "showPrefixLen")) { if (yyjson_get_bool(val)) options->showType |= FF_LOCALIP_TYPE_PREFIX_LEN_BIT; @@ -351,7 +347,7 @@ void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module) continue; } - if (ffStrEqualsIgnCase(key, "showMtu")) + if (unsafe_yyjson_equals_str(key, "showMtu")) { if (yyjson_get_bool(val)) options->showType |= FF_LOCALIP_TYPE_MTU_BIT; @@ -360,7 +356,7 @@ void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module) continue; } - if (ffStrEqualsIgnCase(key, "showSpeed")) + if (unsafe_yyjson_equals_str(key, "showSpeed")) { if (yyjson_get_bool(val)) options->showType |= FF_LOCALIP_TYPE_SPEED_BIT; @@ -369,7 +365,7 @@ void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module) continue; } - if (ffStrEqualsIgnCase(key, "showFlags")) + if (unsafe_yyjson_equals_str(key, "showFlags")) { if (yyjson_get_bool(val)) options->showType |= FF_LOCALIP_TYPE_FLAGS_BIT; @@ -378,7 +374,7 @@ void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module) continue; } - if (ffStrEqualsIgnCase(key, "compact")) + if (unsafe_yyjson_equals_str(key, "compact")) { if (yyjson_get_bool(val)) options->showType |= FF_LOCALIP_TYPE_COMPACT_BIT; @@ -387,7 +383,7 @@ void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module) continue; } - if (ffStrEqualsIgnCase(key, "defaultRouteOnly")) + if (unsafe_yyjson_equals_str(key, "defaultRouteOnly")) { if (yyjson_get_bool(val)) options->showType |= FF_LOCALIP_TYPE_DEFAULT_ROUTE_ONLY_BIT; @@ -396,7 +392,7 @@ void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module) continue; } - if (ffStrEqualsIgnCase(key, "showAllIps")) + if (unsafe_yyjson_equals_str(key, "showAllIps")) { if (yyjson_get_bool(val)) options->showType |= FF_LOCALIP_TYPE_ALL_IPS_BIT; @@ -405,13 +401,13 @@ void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module) continue; } - if (ffStrEqualsIgnCase(key, "namePrefix")) + if (unsafe_yyjson_equals_str(key, "namePrefix")) { ffStrbufSetJsonVal(&options->namePrefix, val); continue; } - ffPrintError(FF_LOCALIP_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_LOCALIP_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/media/media.c b/src/modules/media/media.c index 08e446e54..d52a9f3c8 100644 --- a/src/modules/media/media.c +++ b/src/modules/media/media.c @@ -118,18 +118,14 @@ bool ffParseMediaCommandOptions(FFMediaOptions* options, const char* key, const void ffParseMediaJsonObject(FFMediaOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_MEDIA_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_MEDIA_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/memory/memory.c b/src/modules/memory/memory.c index deac7ef91..711fbae0d 100644 --- a/src/modules/memory/memory.c +++ b/src/modules/memory/memory.c @@ -86,21 +86,17 @@ bool ffParseMemoryCommandOptions(FFMemoryOptions* options, const char* key, cons void ffParseMemoryJsonObject(FFMemoryOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; if (ffPercentParseJsonObject(key, val, &options->percent)) continue; - ffPrintError(FF_MEMORY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_MEMORY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/monitor/monitor.c b/src/modules/monitor/monitor.c index afaab6a27..526bde08c 100644 --- a/src/modules/monitor/monitor.c +++ b/src/modules/monitor/monitor.c @@ -98,18 +98,14 @@ bool ffParseMonitorCommandOptions(FFMonitorOptions* options, const char* key, co void ffParseMonitorJsonObject(FFMonitorOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_MONITOR_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_MONITOR_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/mouse/mouse.c b/src/modules/mouse/mouse.c index 58a7cfcf0..e7207bcfe 100644 --- a/src/modules/mouse/mouse.c +++ b/src/modules/mouse/mouse.c @@ -60,18 +60,14 @@ bool ffParseMouseCommandOptions(FFMouseOptions* options, const char* key, const void ffParseMouseJsonObject(FFMouseOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_MOUSE_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_MOUSE_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/netio/netio.c b/src/modules/netio/netio.c index f2182c84a..6980f8bd0 100644 --- a/src/modules/netio/netio.c +++ b/src/modules/netio/netio.c @@ -139,42 +139,38 @@ bool ffParseNetIOCommandOptions(FFNetIOOptions* options, const char* key, const void ffParseNetIOJsonObject(FFNetIOOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "namePrefix")) + if (unsafe_yyjson_equals_str(key, "namePrefix")) { ffStrbufSetJsonVal(&options->namePrefix, val); continue; } - if (ffStrEqualsIgnCase(key, "defaultRouteOnly")) + if (unsafe_yyjson_equals_str(key, "defaultRouteOnly")) { options->defaultRouteOnly = yyjson_get_bool(val); continue; } - if (ffStrEqualsIgnCase(key, "detectTotal")) + if (unsafe_yyjson_equals_str(key, "detectTotal")) { options->detectTotal = yyjson_get_bool(val); continue; } - if (ffStrEqualsIgnCase(key, "waitTime")) + if (unsafe_yyjson_equals_str(key, "waitTime")) { options->waitTime = (uint32_t) yyjson_get_uint(val); continue; } - ffPrintError(FF_NETIO_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_NETIO_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/opencl/opencl.c b/src/modules/opencl/opencl.c index dd32e9c4a..8a5cd5879 100644 --- a/src/modules/opencl/opencl.c +++ b/src/modules/opencl/opencl.c @@ -42,18 +42,14 @@ bool ffParseOpenCLCommandOptions(FFOpenCLOptions* options, const char* key, cons void ffParseOpenCLJsonObject(FFOpenCLOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_OPENCL_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_OPENCL_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/opengl/opengl.c b/src/modules/opengl/opengl.c index 4dcebcdba..a83e8d9c0 100644 --- a/src/modules/opengl/opengl.c +++ b/src/modules/opengl/opengl.c @@ -66,18 +66,14 @@ bool ffParseOpenGLCommandOptions(FFOpenGLOptions* options, const char* key, cons void ffParseOpenGLJsonObject(FFOpenGLOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "library")) + if (unsafe_yyjson_equals_str(key, "library")) { int value; const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { @@ -87,13 +83,13 @@ void ffParseOpenGLJsonObject(FFOpenGLOptions* options, yyjson_val* module) {}, }); if (error) - ffPrintError(FF_OPENGL_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", key, error); + ffPrintError(FF_OPENGL_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", unsafe_yyjson_get_str(key), error); else options->library = (FFOpenGLLibrary) value; continue; } - ffPrintError(FF_OPENGL_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_OPENGL_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/os/os.c b/src/modules/os/os.c index 566af9414..c2e17e837 100644 --- a/src/modules/os/os.c +++ b/src/modules/os/os.c @@ -127,18 +127,14 @@ bool ffParseOSCommandOptions(FFOSOptions* options, const char* key, const char* void ffParseOSJsonObject(FFOSOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_OS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_OS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/packages/packages.c b/src/modules/packages/packages.c index 9bccb292b..917aea944 100644 --- a/src/modules/packages/packages.c +++ b/src/modules/packages/packages.c @@ -318,22 +318,18 @@ bool ffParsePackagesCommandOptions(FFPackagesOptions* options, const char* key, void ffParsePackagesJsonObject(FFPackagesOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if (ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "disabled")) + if (unsafe_yyjson_equals_str(key, "disabled")) { if (!yyjson_is_null(val) && !yyjson_is_arr(val)) { - ffPrintError(FF_PACKAGES_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid JSON value for %s", key); + ffPrintError(FF_PACKAGES_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid JSON value for %s", unsafe_yyjson_get_str(key)); continue; } @@ -347,7 +343,7 @@ void ffParsePackagesJsonObject(FFPackagesOptions* options, yyjson_val* module) { if (!yyjson_is_str(flagObj)) { - ffPrintError(FF_PACKAGES_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid JSON value for %s", key); + ffPrintError(FF_PACKAGES_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid JSON value for %s", unsafe_yyjson_get_str(key)); continue; } const char* flag = unsafe_yyjson_get_str(flagObj); @@ -427,13 +423,13 @@ void ffParsePackagesJsonObject(FFPackagesOptions* options, yyjson_val* module) } } - if (ffStrEqualsIgnCase(key, "combined")) + if (unsafe_yyjson_equals_str(key, "combined")) { options->combined = yyjson_get_bool(val); continue; } - ffPrintError(FF_PACKAGES_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_PACKAGES_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/physicaldisk/physicaldisk.c b/src/modules/physicaldisk/physicaldisk.c index 9479ccba4..53ca43a27 100644 --- a/src/modules/physicaldisk/physicaldisk.c +++ b/src/modules/physicaldisk/physicaldisk.c @@ -154,18 +154,14 @@ bool ffParsePhysicalDiskCommandOptions(FFPhysicalDiskOptions* options, const cha void ffParsePhysicalDiskJsonObject(FFPhysicalDiskOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "namePrefix")) + if (unsafe_yyjson_equals_str(key, "namePrefix")) { ffStrbufSetJsonVal(&options->namePrefix, val); continue; @@ -174,7 +170,7 @@ void ffParsePhysicalDiskJsonObject(FFPhysicalDiskOptions* options, yyjson_val* m if (ffTempsParseJsonObject(key, val, &options->temp, &options->tempConfig)) continue; - ffPrintError(FF_PHYSICALDISK_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_PHYSICALDISK_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/physicalmemory/physicalmemory.c b/src/modules/physicalmemory/physicalmemory.c index 4bfe28ef4..340bc551e 100644 --- a/src/modules/physicalmemory/physicalmemory.c +++ b/src/modules/physicalmemory/physicalmemory.c @@ -92,18 +92,14 @@ bool ffParsePhysicalMemoryCommandOptions(FFPhysicalMemoryOptions* options, const void ffParsePhysicalMemoryJsonObject(FFPhysicalMemoryOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_PHYSICALMEMORY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_PHYSICALMEMORY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/player/player.c b/src/modules/player/player.c index cf9a1b314..6d6dea813 100644 --- a/src/modules/player/player.c +++ b/src/modules/player/player.c @@ -93,18 +93,14 @@ bool ffParsePlayerCommandOptions(FFPlayerOptions* options, const char* key, cons void ffParsePlayerJsonObject(FFPlayerOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_PLAYER_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_PLAYER_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/poweradapter/poweradapter.c b/src/modules/poweradapter/poweradapter.c index ee8a61342..de2a36e39 100644 --- a/src/modules/poweradapter/poweradapter.c +++ b/src/modules/poweradapter/poweradapter.c @@ -76,18 +76,14 @@ void ffGeneratePowerAdapterJsonConfig(FFPowerAdapterOptions* options, yyjson_mut void ffParsePowerAdapterJsonObject(FFPowerAdapterOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_POWERADAPTER_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_POWERADAPTER_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/processes/processes.c b/src/modules/processes/processes.c index 6839642ee..bf272e97d 100644 --- a/src/modules/processes/processes.c +++ b/src/modules/processes/processes.c @@ -41,18 +41,14 @@ bool ffParseProcessesCommandOptions(FFProcessesOptions* options, const char* key void ffParseProcessesJsonObject(FFProcessesOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_PROCESSES_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_PROCESSES_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/publicip/publicip.c b/src/modules/publicip/publicip.c index dd75fed09..16bdfd6ac 100644 --- a/src/modules/publicip/publicip.c +++ b/src/modules/publicip/publicip.c @@ -69,36 +69,32 @@ bool ffParsePublicIpCommandOptions(FFPublicIpOptions* options, const char* key, void ffParsePublicIpJsonObject(FFPublicIpOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "url")) + if (unsafe_yyjson_equals_str(key, "url")) { ffStrbufSetJsonVal(&options->url, val); continue; } - if (ffStrEqualsIgnCase(key, "timeout")) + if (unsafe_yyjson_equals_str(key, "timeout")) { options->timeout = (uint32_t) yyjson_get_uint(val); continue; } - if (ffStrEqualsIgnCase(key, "ipv6")) + if (unsafe_yyjson_equals_str(key, "ipv6")) { options->ipv6 = yyjson_get_bool(val); continue; } - ffPrintError(FF_PUBLICIP_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_PUBLICIP_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/separator/separator.c b/src/modules/separator/separator.c index c48eaaf46..16171ac50 100644 --- a/src/modules/separator/separator.c +++ b/src/modules/separator/separator.c @@ -142,33 +142,32 @@ bool ffParseSeparatorCommandOptions(FFSeparatorOptions* options, const char* key void ffParseSeparatorJsonObject(FFSeparatorOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) + if (unsafe_yyjson_equals_str(key, "type") || unsafe_yyjson_equals_str(key, "condition")) continue; - if (ffStrEqualsIgnCase(key, "string")) + if (unsafe_yyjson_equals_str(key, "string")) { ffStrbufSetJsonVal(&options->string, val); continue; } - if (ffStrEndsWithIgnCase(key, "outputColor")) + if (unsafe_yyjson_equals_str(key, "outputColor")) { ffOptionParseColor(yyjson_get_str(val), &options->outputColor); continue; } - if (ffStrEndsWithIgnCase(key, "length")) + if (unsafe_yyjson_equals_str(key, "length")) { options->length = (uint32_t) yyjson_get_uint(val); continue; } - ffPrintError(FF_SEPARATOR_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Unknown JSON key %s", key); + ffPrintError(FF_SEPARATOR_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/shell/shell.c b/src/modules/shell/shell.c index f68cb399d..58853696e 100644 --- a/src/modules/shell/shell.c +++ b/src/modules/shell/shell.c @@ -54,18 +54,14 @@ bool ffParseShellCommandOptions(FFShellOptions* options, const char* key, const void ffParseShellJsonObject(FFShellOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_SHELL_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_SHELL_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/sound/sound.c b/src/modules/sound/sound.c index f57ebb091..008671d1a 100644 --- a/src/modules/sound/sound.c +++ b/src/modules/sound/sound.c @@ -138,18 +138,14 @@ bool ffParseSoundCommandOptions(FFSoundOptions* options, const char* key, const void ffParseSoundJsonObject(FFSoundOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "soundType")) + if (unsafe_yyjson_equals_str(key, "soundType")) { int value; const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { @@ -159,7 +155,7 @@ void ffParseSoundJsonObject(FFSoundOptions* options, yyjson_val* module) {}, }); if (error) - ffPrintError(FF_SOUND_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", key, error); + ffPrintError(FF_SOUND_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", unsafe_yyjson_get_str(key), error); else options->soundType = (FFSoundType) value; continue; @@ -168,7 +164,7 @@ void ffParseSoundJsonObject(FFSoundOptions* options, yyjson_val* module) if (ffPercentParseJsonObject(key, val, &options->percent)) continue; - ffPrintError(FF_SOUND_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_SOUND_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/swap/swap.c b/src/modules/swap/swap.c index fb3072f44..45aa00683 100644 --- a/src/modules/swap/swap.c +++ b/src/modules/swap/swap.c @@ -152,27 +152,23 @@ bool ffParseSwapCommandOptions(FFSwapOptions* options, const char* key, const ch void ffParseSwapJsonObject(FFSwapOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; if (ffPercentParseJsonObject(key, val, &options->percent)) continue; - if (ffStrEqualsIgnCase(key, "separate")) + if (unsafe_yyjson_equals_str(key, "separate")) { options->separate = yyjson_get_bool(val); continue; } - ffPrintError(FF_SWAP_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_SWAP_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/terminal/terminal.c b/src/modules/terminal/terminal.c index dc01af2db..852fe43e3 100644 --- a/src/modules/terminal/terminal.c +++ b/src/modules/terminal/terminal.c @@ -50,18 +50,14 @@ bool ffParseTerminalCommandOptions(FFTerminalOptions* options, const char* key, void ffParseTerminalJsonObject(FFTerminalOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_TERMINAL_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_TERMINAL_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/terminalfont/terminalfont.c b/src/modules/terminalfont/terminalfont.c index 219b8fa72..9949ab533 100644 --- a/src/modules/terminalfont/terminalfont.c +++ b/src/modules/terminalfont/terminalfont.c @@ -58,18 +58,14 @@ bool ffParseTerminalFontCommandOptions(FFTerminalFontOptions* options, const cha void ffParseTerminalFontJsonObject(FFTerminalFontOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_TERMINALFONT_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_TERMINALFONT_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/terminalsize/terminalsize.c b/src/modules/terminalsize/terminalsize.c index 389f4d6f0..e89155b42 100644 --- a/src/modules/terminalsize/terminalsize.c +++ b/src/modules/terminalsize/terminalsize.c @@ -50,18 +50,14 @@ bool ffParseTerminalSizeCommandOptions(FFTerminalSizeOptions* options, const cha void ffParseTerminalSizeJsonObject(FFTerminalSizeOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_TERMINALSIZE_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_TERMINALSIZE_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/terminaltheme/terminaltheme.c b/src/modules/terminaltheme/terminaltheme.c index 25834d66e..a0f561fa1 100644 --- a/src/modules/terminaltheme/terminaltheme.c +++ b/src/modules/terminaltheme/terminaltheme.c @@ -55,18 +55,14 @@ bool ffParseTerminalThemeCommandOptions(FFTerminalThemeOptions* options, const c void ffParseTerminalThemeJsonObject(FFTerminalThemeOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_TERMINALTHEME_DISPLAY_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_TERMINALTHEME_DISPLAY_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/theme/theme.c b/src/modules/theme/theme.c index e99a21779..48975e5c9 100644 --- a/src/modules/theme/theme.c +++ b/src/modules/theme/theme.c @@ -55,18 +55,14 @@ bool ffParseThemeCommandOptions(FFThemeOptions* options, const char* key, const void ffParseThemeJsonObject(FFThemeOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_THEME_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_THEME_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/title/title.c b/src/modules/title/title.c index 02afec2ce..3f033d856 100644 --- a/src/modules/title/title.c +++ b/src/modules/title/title.c @@ -104,24 +104,20 @@ bool ffParseTitleCommandOptions(FFTitleOptions* options, const char* key, const void ffParseTitleJsonObject(FFTitleOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "fqdn")) + if (unsafe_yyjson_equals_str(key, "fqdn")) { options->fqdn = yyjson_get_bool(val); continue; } - if (ffStrEqualsIgnCase(key, "color")) + if (unsafe_yyjson_equals_str(key, "color")) { if (!yyjson_is_obj(val)) continue; @@ -138,7 +134,7 @@ void ffParseTitleJsonObject(FFTitleOptions* options, yyjson_val* module) continue; } - ffPrintError(FF_TITLE_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Unknown JSON key %s", key); + ffPrintError(FF_TITLE_MODULE_NAME, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/tpm/tpm.c b/src/modules/tpm/tpm.c index 9d849671a..64df1ff66 100644 --- a/src/modules/tpm/tpm.c +++ b/src/modules/tpm/tpm.c @@ -50,18 +50,14 @@ bool ffParseTPMCommandOptions(FFTPMOptions* options, const char* key, const char void ffParseTPMJsonObject(FFTPMOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_TPM_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_TPM_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/uptime/uptime.c b/src/modules/uptime/uptime.c index 74d985f85..224725ed7 100644 --- a/src/modules/uptime/uptime.c +++ b/src/modules/uptime/uptime.c @@ -68,18 +68,14 @@ bool ffParseUptimeCommandOptions(FFUptimeOptions* options, const char* key, cons void ffParseUptimeJsonObject(FFUptimeOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_UPTIME_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_UPTIME_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/users/users.c b/src/modules/users/users.c index 9ba72977b..435c35ac1 100644 --- a/src/modules/users/users.c +++ b/src/modules/users/users.c @@ -131,30 +131,29 @@ bool ffParseUsersCommandOptions(FFUsersOptions* options, const char* key, const void ffParseUsersJsonObject(FFUsersOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if (ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) + if (unsafe_yyjson_equals_str(key, "type") || unsafe_yyjson_equals_str(key, "condition")) continue; if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "compact")) + if (unsafe_yyjson_equals_str(key, "compact")) { options->compact = yyjson_get_bool(val); continue; } - if (ffStrEqualsIgnCase(key, "myselfOnly")) + if (unsafe_yyjson_equals_str(key, "myselfOnly")) { options->myselfOnly = yyjson_get_bool(val); continue; } - ffPrintError(FF_USERS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_USERS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/version/version.c b/src/modules/version/version.c index 426cbc3d2..d7db250b5 100644 --- a/src/modules/version/version.c +++ b/src/modules/version/version.c @@ -56,18 +56,14 @@ bool ffParseVersionCommandOptions(FFVersionOptions* options, const char* key, co void ffParseVersionJsonObject(FFVersionOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_VERSION_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_VERSION_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/vulkan/vulkan.c b/src/modules/vulkan/vulkan.c index d67ca9e70..f74c15c34 100644 --- a/src/modules/vulkan/vulkan.c +++ b/src/modules/vulkan/vulkan.c @@ -62,18 +62,14 @@ bool ffParseVulkanCommandOptions(FFVulkanOptions* options, const char* key, cons void ffParseVulkanJsonObject(FFVulkanOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_VULKAN_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_VULKAN_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/wallpaper/wallpaper.c b/src/modules/wallpaper/wallpaper.c index bd95a4d0e..997c2473a 100644 --- a/src/modules/wallpaper/wallpaper.c +++ b/src/modules/wallpaper/wallpaper.c @@ -52,18 +52,14 @@ bool ffParseWallpaperCommandOptions(FFWallpaperOptions* options, const char* key void ffParseWallpaperJsonObject(FFWallpaperOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_WALLPAPER_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_WALLPAPER_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/weather/weather.c b/src/modules/weather/weather.c index 9d37ed0e7..03761d391 100644 --- a/src/modules/weather/weather.c +++ b/src/modules/weather/weather.c @@ -59,36 +59,32 @@ bool ffParseWeatherCommandOptions(FFWeatherOptions* options, const char* key, co void ffParseWeatherJsonObject(FFWeatherOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "location")) + if (unsafe_yyjson_equals_str(key, "location")) { ffStrbufSetJsonVal(&options->location, val); continue; } - if (ffStrEqualsIgnCase(key, "outputFormat")) + if (unsafe_yyjson_equals_str(key, "outputFormat")) { ffStrbufSetJsonVal(&options->outputFormat, val); continue; } - if (ffStrEqualsIgnCase(key, "timeout")) + if (unsafe_yyjson_equals_str(key, "timeout")) { options->timeout = (uint32_t) yyjson_get_uint(val); continue; } - ffPrintError(FF_WEATHER_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_WEATHER_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/wifi/wifi.c b/src/modules/wifi/wifi.c index c7038a0fc..6f52c0271 100644 --- a/src/modules/wifi/wifi.c +++ b/src/modules/wifi/wifi.c @@ -151,21 +151,17 @@ bool ffParseWifiCommandOptions(FFWifiOptions* options, const char* key, const ch void ffParseWifiJsonObject(FFWifiOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; if (ffPercentParseJsonObject(key, val, &options->percent)) continue; - ffPrintError(FF_WIFI_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_WIFI_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/wm/wm.c b/src/modules/wm/wm.c index 5dc413563..cb3a64232 100644 --- a/src/modules/wm/wm.c +++ b/src/modules/wm/wm.c @@ -81,24 +81,20 @@ bool ffParseWMCommandOptions(FFWMOptions* options, const char* key, const char* void ffParseWMJsonObject(FFWMOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - if (ffStrEqualsIgnCase(key, "detectPlugin")) + if (unsafe_yyjson_equals_str(key, "detectPlugin")) { options->detectPlugin = yyjson_get_bool(val); continue; } - ffPrintError(FF_WM_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_WM_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/wmtheme/wmtheme.c b/src/modules/wmtheme/wmtheme.c index 6659d88e1..a3830dace 100644 --- a/src/modules/wmtheme/wmtheme.c +++ b/src/modules/wmtheme/wmtheme.c @@ -41,18 +41,14 @@ bool ffParseWMThemeCommandOptions(FFWMThemeOptions* options, const char* key, co void ffParseWMThemeJsonObject(FFWMThemeOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; - ffPrintError(FF_WMTHEME_DISPLAY_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_WMTHEME_DISPLAY_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } diff --git a/src/modules/zpool/zpool.c b/src/modules/zpool/zpool.c index 151836f0b..ba110a607 100644 --- a/src/modules/zpool/zpool.c +++ b/src/modules/zpool/zpool.c @@ -122,21 +122,17 @@ bool ffParseZpoolCommandOptions(FFZpoolOptions* options, const char* key, const void ffParseZpoolJsonObject(FFZpoolOptions* options, yyjson_val* module) { - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(module, idx, max, key_, val) + yyjson_obj_foreach(module, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - if(ffStrEqualsIgnCase(key, "type") || ffStrEqualsIgnCase(key, "condition")) - continue; - if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) continue; if (ffPercentParseJsonObject(key, val, &options->percent)) continue; - ffPrintError(FF_ZPOOL_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); + ffPrintError(FF_ZPOOL_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key)); } } From 59289bef6cae6bac56509e51452629715c8ee785 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Sat, 2 Aug 2025 19:03:42 +0800 Subject: [PATCH 14/83] Percent: silense compiler warnings --- src/common/percent.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/percent.c b/src/common/percent.c index 98e3ff218..6779d1ef0 100644 --- a/src/common/percent.c +++ b/src/common/percent.c @@ -62,7 +62,7 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf const bool borderAsValue = options->barBorderLeftElapsed.length && options->barBorderRightElapsed.length; - uint32_t blocksPercent = (uint32_t) (percent / 100.0 * options->barWidth + 0.5); + uint8_t blocksPercent = (uint8_t) (percent / 100.0 * options->barWidth + 0.5); assert(blocksPercent <= options->barWidth); if(!borderAsValue && options->barBorderLeft.length) @@ -78,7 +78,7 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf if(!options->pipe && options->barColorTotal.length > 0) ffStrbufAppendS(buffer, "\e[" FF_COLOR_FG_LIGHT_BLACK "m"); - for (uint32_t i = 0; i < options->barWidth; ++i) + for (uint8_t i = 0; i < options->barWidth; ++i) { ffStrbufAppend(buffer, borderAsValue && i == 0 ? &options->barBorderLeft @@ -97,7 +97,7 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf bool autoColorElapsed = ffStrbufIgnCaseEqualS(&options->barColorElapsed, "auto"); - for (uint32_t i = 0; i < blocksPercent; ++i) + for (uint8_t i = 0; i < blocksPercent; ++i) { if(!options->pipe && options->barColorElapsed.length > 0) { @@ -143,7 +143,7 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf { if(!options->pipe && options->barColorTotal.length > 0) ffStrbufAppendF(buffer, "\e[%sm", options->barColorTotal.chars); - for (uint32_t i = blocksPercent; i < options->barWidth; ++i) + for (uint8_t i = blocksPercent; i < options->barWidth; ++i) { ffStrbufAppend(buffer, borderAsValue && i == 0 ? &options->barBorderLeft From 4a141c3f5772bc4ee1e2277efdc78d8b31ae3d78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 3 Aug 2025 09:10:17 +0800 Subject: [PATCH 15/83] Disk: add missing JSON config options --- doc/json_schema.json | 5 +++++ src/modules/disk/disk.c | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/doc/json_schema.json b/doc/json_schema.json index 3c6e5d5a7..b742f0afb 100644 --- a/doc/json_schema.json +++ b/doc/json_schema.json @@ -2100,6 +2100,11 @@ "type": "string", "description": "A colon separated file systems to hide from the disk output" }, + "showRegular": { + "type": "boolean", + "description": "Set if regular volume should be printed", + "default": true + }, "showExternal": { "type": "boolean", "description": "Set if external volume should be printed", diff --git a/src/modules/disk/disk.c b/src/modules/disk/disk.c index 14b4754ec..9f71ec786 100644 --- a/src/modules/disk/disk.c +++ b/src/modules/disk/disk.c @@ -324,6 +324,15 @@ void ffParseDiskJsonObject(FFDiskOptions* options, yyjson_val* module) continue; } + if (unsafe_yyjson_equals_str(key, "showRegular")) + { + if (yyjson_get_bool(val)) + options->showTypes |= FF_DISK_VOLUME_TYPE_REGULAR_BIT; + else + options->showTypes &= ~FF_DISK_VOLUME_TYPE_REGULAR_BIT; + continue; + } + if (unsafe_yyjson_equals_str(key, "showExternal")) { if (yyjson_get_bool(val)) @@ -394,6 +403,9 @@ void ffGenerateDiskJsonConfig(FFDiskOptions* options, yyjson_mut_doc* doc, yyjso if (defaultOptions.showTypes != options->showTypes) { + if (options->showTypes & FF_DISK_VOLUME_TYPE_REGULAR_BIT) + yyjson_mut_obj_add_bool(doc, module, "showRegular", true); + if (options->showTypes & FF_DISK_VOLUME_TYPE_EXTERNAL_BIT) yyjson_mut_obj_add_bool(doc, module, "showExternal", true); From 980e552eba2a622fafb771c34296dbbb67375779 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 3 Aug 2025 09:22:47 +0800 Subject: [PATCH 16/83] Display: allow `"compactType": null`; improve json schema --- doc/json_schema.json | 35 +++++++++++++++++++++++++++-------- src/modules/display/display.c | 5 +++++ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/doc/json_schema.json b/doc/json_schema.json index b742f0afb..45c4ef283 100644 --- a/doc/json_schema.json +++ b/doc/json_schema.json @@ -2031,15 +2031,34 @@ "const": "display" }, "compactType": { - "enum": [ - "none", - "original", - "scaled", - "original-with-refresh-rate", - "scaled-with-refresh-rate" - ], "description": "Set if all displays should be printed in one line", - "default": "none" + "oneOf": [ + { + "const": null, + "description": "Disable compact mode" + }, + { + "const": "none", + "description": "Disable compact mode (kept for compatibility)" + }, + { + "const": "original", + "description": "Print original resolutions" + }, + { + "const": "scaled", + "description": "Print scaled resolutions" + }, + { + "const": "original-with-refresh-rate", + "description": "Print original resolutions with refresh rates" + }, + { + "const": "scaled-with-refresh-rate", + "description": "Print scaled resolutions with refresh rates" + } + ], + "default": null }, "preciseRefreshRate": { "description": "Set if decimal refresh rates should not be rounded into integers when printing", diff --git a/src/modules/display/display.c b/src/modules/display/display.c index 914af6ca6..e6ffca361 100644 --- a/src/modules/display/display.c +++ b/src/modules/display/display.c @@ -267,6 +267,10 @@ void ffParseDisplayJsonObject(FFDisplayOptions* options, yyjson_val* module) continue; if (unsafe_yyjson_equals_str(key, "compactType")) + { + if (yyjson_is_null(val)) + options->compactType = FF_DISPLAY_COMPACT_TYPE_NONE; + else { int value; const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { @@ -281,6 +285,7 @@ void ffParseDisplayJsonObject(FFDisplayOptions* options, yyjson_val* module) ffPrintError(FF_DISPLAY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", unsafe_yyjson_get_str(key), error); else options->compactType = (FFDisplayCompactType) value; + } continue; } From 22bfaf3c69d79e41475158d3496a1cf889ebb4df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 3 Aug 2025 09:24:03 +0800 Subject: [PATCH 17/83] JsonSchema: small improvements --- doc/json_schema.json | 85 ++++++++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/doc/json_schema.json b/doc/json_schema.json index 45c4ef283..d89acd532 100644 --- a/doc/json_schema.json +++ b/doc/json_schema.json @@ -2151,7 +2151,7 @@ }, "useAvailable": { "type": "boolean", - "description": "Use f_bavail (lpFreeBytesAvailableToCaller for Windows) instead of f_bfree to calculate used bytes", + "description": "Use f_bavail (lpFreeBytesAvailableToCaller for Windows) instead of f_bfree to calculate used bytes\nMay be required for macOS to display correct results", "default": false }, "percent": { @@ -3126,44 +3126,51 @@ "description": "List installed package managers and count of installed packages" }, "disabled": { - "description": "List of package managers to be disabled when detecting", - "type": "array", - "items": { - "type": "string", - "enum": [ - "am", - "apk", - "brew", - "choco", - "dpkg", - "emerge", - "eopkg", - "flatpak", - "guix", - "hpkg", - "linglong", - "lpkg", - "lpkgbuild", - "macports", - "mport", - "nix", - "opkg", - "pacman", - "pacstall", - "paludis", - "pisi", - "pkg", - "pkgtool", - "qi", - "rpm", - "scoop", - "snap", - "sorcery", - "winget", - "xbps" - ], - "uniqueItems": true - }, + "oneOf": [ + { + "description": "List of package managers to be disabled when detecting\nWarning: Some detection methods can be very slow.", + "type": "array", + "items": { + "type": "string", + "enum": [ + "am", + "apk", + "brew", + "choco", + "dpkg", + "emerge", + "eopkg", + "flatpak", + "guix", + "hpkg", + "linglong", + "lpkg", + "lpkgbuild", + "macports", + "mport", + "nix", + "opkg", + "pacman", + "pacstall", + "paludis", + "pisi", + "pkg", + "pkgtool", + "rpm", + "scoop", + "snap", + "sorcery", + "winget", + "xbps" + ], + "uniqueItems": true + } + }, + { + "description": "Enable all package managers", + "type": "null" + } + ], "default": ["winget"] }, "combined": { From 094d736d38ca699b9ad192d7d3e602ccada44031 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 3 Aug 2025 09:26:17 +0800 Subject: [PATCH 18/83] Modules: remove all `parseCommandOptions` and related stuff --- src/common/commandoption.c | 12 -- src/common/commandoption.h | 1 - src/common/option.h | 1 - src/fastfetch.c | 3 +- src/modules/battery/battery.c | 25 ----- src/modules/bios/bios.c | 11 -- src/modules/bluetooth/bluetooth.c | 20 ---- src/modules/bluetoothradio/bluetoothradio.c | 11 -- src/modules/board/board.c | 11 -- src/modules/bootmgr/bootmgr.c | 11 -- src/modules/break/break.c | 6 - src/modules/brightness/brightness.c | 26 ----- src/modules/btrfs/btrfs.c | 14 --- src/modules/camera/camera.c | 11 -- src/modules/chassis/chassis.c | 11 -- src/modules/colors/colors.c | 50 --------- src/modules/command/command.c | 29 ----- src/modules/cpu/cpu.c | 20 ---- src/modules/cpucache/cpucache.c | 17 --- src/modules/cpuusage/cpuusage.c | 26 ----- src/modules/cursor/cursor.c | 11 -- src/modules/custom/custom.c | 11 -- src/modules/datetime/datetime.c | 11 -- src/modules/de/de.c | 17 --- src/modules/disk/disk.c | 95 ---------------- src/modules/diskio/diskio.c | 29 ----- src/modules/display/display.c | 69 +++--------- src/modules/dns/dns.c | 22 ---- src/modules/editor/editor.c | 11 -- src/modules/font/font.c | 11 -- src/modules/gamepad/gamepad.c | 14 --- src/modules/gpu/gpu.c | 48 -------- src/modules/host/host.c | 11 -- src/modules/icons/icons.c | 11 -- src/modules/initsystem/initsystem.c | 11 -- src/modules/kernel/kernel.c | 11 -- src/modules/keyboard/keyboard.c | 11 -- src/modules/lm/lm.c | 11 -- src/modules/loadavg/loadavg.c | 26 ----- src/modules/locale/locale.c | 11 -- src/modules/localip/localip.c | 116 -------------------- src/modules/media/media.c | 11 -- src/modules/memory/memory.c | 14 --- src/modules/monitor/monitor.c | 11 -- src/modules/mouse/mouse.c | 11 -- src/modules/netio/netio.c | 35 ------ src/modules/opencl/opencl.c | 11 -- src/modules/opengl/opengl.c | 22 ---- src/modules/os/os.c | 11 -- src/modules/packages/packages.c | 112 ------------------- src/modules/physicaldisk/physicaldisk.c | 20 ---- src/modules/physicalmemory/physicalmemory.c | 11 -- src/modules/player/player.c | 11 -- src/modules/poweradapter/poweradapter.c | 11 -- src/modules/processes/processes.c | 11 -- src/modules/publicip/publicip.c | 29 ----- src/modules/separator/separator.c | 27 ----- src/modules/shell/shell.c | 11 -- src/modules/sound/sound.c | 25 ----- src/modules/swap/swap.c | 20 ---- src/modules/terminal/terminal.c | 11 -- src/modules/terminalfont/terminalfont.c | 11 -- src/modules/terminalsize/terminalsize.c | 11 -- src/modules/terminaltheme/terminaltheme.c | 11 -- src/modules/theme/theme.c | 11 -- src/modules/title/title.c | 35 ------ src/modules/tpm/tpm.c | 11 -- src/modules/uptime/uptime.c | 11 -- src/modules/users/users.c | 23 ---- src/modules/version/version.c | 11 -- src/modules/vulkan/vulkan.c | 11 -- src/modules/wallpaper/wallpaper.c | 11 -- src/modules/weather/weather.c | 29 ----- src/modules/wifi/wifi.c | 14 --- src/modules/wm/wm.c | 17 --- src/modules/wmtheme/wmtheme.c | 11 -- src/modules/zpool/zpool.c | 14 --- 77 files changed, 15 insertions(+), 1536 deletions(-) diff --git a/src/common/commandoption.c b/src/common/commandoption.c index d91072928..004f81044 100644 --- a/src/common/commandoption.c +++ b/src/common/commandoption.c @@ -10,18 +10,6 @@ #include #include -bool ffParseModuleOptions(const char* key, const char* value) -{ - if (!ffStrStartsWith(key, "--") || !ffCharIsEnglishAlphabet(key[2])) return false; - - for (FFModuleBaseInfo** modules = ffModuleInfos[toupper(key[2]) - 'A']; *modules; ++modules) - { - FFModuleBaseInfo* baseInfo = *modules; - if (baseInfo->parseCommandOptions(baseInfo, key, value)) return true; - } - return false; -} - void ffPrepareCommandOption(FFdata* data) { FFOptionsModules* const options = &instance.config.modules; diff --git a/src/common/commandoption.h b/src/common/commandoption.h index f8cf12044..98472a13a 100644 --- a/src/common/commandoption.h +++ b/src/common/commandoption.h @@ -9,7 +9,6 @@ typedef struct FFdata bool configLoaded; } FFdata; -bool ffParseModuleOptions(const char* key, const char* value); void ffPrepareCommandOption(FFdata* data); void ffPrintCommandOption(FFdata* data, yyjson_mut_doc* jsonDoc); void ffMigrateCommandOptionToJsonc(FFdata* data, yyjson_mut_doc* jsonDoc); diff --git a/src/common/option.h b/src/common/option.h index 689881a0a..0e68ec4e1 100644 --- a/src/common/option.h +++ b/src/common/option.h @@ -29,7 +29,6 @@ typedef struct FFModuleBaseInfo // This is UB, because `void*` is not compatible with `FF*Options*`. // However we can't do it better unless we move to C++, so that `option` becomes a `this` pointer // https://stackoverflow.com/questions/559581/casting-a-function-pointer-to-another-type - bool (*parseCommandOptions)(void* options, const char* key, const char* value); void (*parseJsonObject)(void* options, struct yyjson_val *module); void (*printModule)(void* options); void (*generateJsonResult)(void* options, struct yyjson_mut_doc* doc, struct yyjson_mut_val* module); diff --git a/src/fastfetch.c b/src/fastfetch.c index 9a278619c..43cfd911d 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -644,8 +644,7 @@ static void parseOption(FFdata* data, const char* key, const char* value) else if( ffOptionsParseGeneralCommandLine(&instance.config.general, key, value) || ffOptionsParseLogoCommandLine(&instance.config.logo, key, value) || - ffOptionsParseDisplayCommandLine(&instance.config.display, key, value) || - ffParseModuleOptions(key, value) + ffOptionsParseDisplayCommandLine(&instance.config.display, key, value) ) {} else diff --git a/src/modules/battery/battery.c b/src/modules/battery/battery.c index ae8be7486..90f211760 100644 --- a/src/modules/battery/battery.c +++ b/src/modules/battery/battery.c @@ -159,30 +159,6 @@ void ffPrintBattery(FFBatteryOptions* options) } } -bool ffParseBatteryCommandOptions(FFBatteryOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_BATTERY_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffTempsParseCommandOptions(key, subKey, value, &options->temp, &options->tempConfig)) - return true; - - #ifdef _WIN32 - if (ffStrEqualsIgnCase(subKey, "use-setup-api")) - { - options->useSetupApi = ffOptionParseBoolean(value); - return true; - } - #endif - - if (ffPercentParseCommandOptions(key, subKey, value, &options->percent)) - return true; - - return false; -} - void ffParseBatteryJsonObject(FFBatteryOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -272,7 +248,6 @@ void ffGenerateBatteryJsonResult(FFBatteryOptions* options, yyjson_mut_doc* doc, static FFModuleBaseInfo ffModuleInfo = { .name = FF_BATTERY_MODULE_NAME, .description = "Print battery capacity, status, etc", - .parseCommandOptions = (void*) ffParseBatteryCommandOptions, .parseJsonObject = (void*) ffParseBatteryJsonObject, .printModule = (void*) ffPrintBattery, .generateJsonResult = (void*) ffGenerateBatteryJsonResult, diff --git a/src/modules/bios/bios.c b/src/modules/bios/bios.c index f07a441f8..c9e758e59 100644 --- a/src/modules/bios/bios.c +++ b/src/modules/bios/bios.c @@ -75,16 +75,6 @@ exit: ffStrbufDestroy(&bios.type); } -bool ffParseBiosCommandOptions(FFBiosOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_BIOS_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseBiosJsonObject(FFBiosOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -141,7 +131,6 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_BIOS_MODULE_NAME, .description = "Print information of 1st-stage bootloader (name, version, release date, etc)", - .parseCommandOptions = (void*) ffParseBiosCommandOptions, .parseJsonObject = (void*) ffParseBiosJsonObject, .printModule = (void*) ffPrintBios, .generateJsonResult = (void*) ffGenerateBiosJsonResult, diff --git a/src/modules/bluetooth/bluetooth.c b/src/modules/bluetooth/bluetooth.c index 3433c3ef6..6274e8c4a 100644 --- a/src/modules/bluetooth/bluetooth.c +++ b/src/modules/bluetooth/bluetooth.c @@ -97,25 +97,6 @@ void ffPrintBluetooth(FFBluetoothOptions* options) } } -bool ffParseBluetoothCommandOptions(FFBluetoothOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_BLUETOOTH_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "show-disconnected")) - { - options->showDisconnected = ffOptionParseBoolean(value); - return true; - } - - if (ffPercentParseCommandOptions(key, subKey, value, &options->percent)) - return true; - - return false; -} - void ffParseBluetoothJsonObject(FFBluetoothOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -185,7 +166,6 @@ void ffGenerateBluetoothJsonResult(FFBluetoothOptions* options, yyjson_mut_doc* static FFModuleBaseInfo ffModuleInfo = { .name = FF_BLUETOOTH_MODULE_NAME, .description = "List (connected) bluetooth devices", - .parseCommandOptions = (void*) ffParseBluetoothCommandOptions, .parseJsonObject = (void*) ffParseBluetoothJsonObject, .printModule = (void*) ffPrintBluetooth, .generateJsonResult = (void*) ffGenerateBluetoothJsonResult, diff --git a/src/modules/bluetoothradio/bluetoothradio.c b/src/modules/bluetoothradio/bluetoothradio.c index 93e52f686..2432ab633 100644 --- a/src/modules/bluetoothradio/bluetoothradio.c +++ b/src/modules/bluetoothradio/bluetoothradio.c @@ -105,16 +105,6 @@ void ffPrintBluetoothRadio(FFBluetoothRadioOptions* options) } } -bool ffParseBluetoothRadioCommandOptions(FFBluetoothRadioOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_BLUETOOTHRADIO_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseBluetoothRadioJsonObject(FFBluetoothRadioOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -179,7 +169,6 @@ void ffGenerateBluetoothRadioJsonResult(FF_MAYBE_UNUSED FFBluetoothRadioOptions* static FFModuleBaseInfo ffModuleInfo = { .name = FF_BLUETOOTHRADIO_MODULE_NAME, .description = "List bluetooth radios width supported version and vendor", - .parseCommandOptions = (void*) ffParseBluetoothRadioCommandOptions, .parseJsonObject = (void*) ffParseBluetoothRadioJsonObject, .printModule = (void*) ffPrintBluetoothRadio, .generateJsonResult = (void*) ffGenerateBluetoothRadioJsonResult, diff --git a/src/modules/board/board.c b/src/modules/board/board.c index 0f226e2d8..3c5c29873 100644 --- a/src/modules/board/board.c +++ b/src/modules/board/board.c @@ -50,16 +50,6 @@ exit: ffStrbufDestroy(&result.serial); } -bool ffParseBoardCommandOptions(FFBoardOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_BOARD_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseBoardJsonObject(FFBoardOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -119,7 +109,6 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_BOARD_MODULE_NAME, .description = "Print motherboard name and other info", - .parseCommandOptions = (void*) ffParseBoardCommandOptions, .parseJsonObject = (void*) ffParseBoardJsonObject, .printModule = (void*) ffPrintBoard, .generateJsonResult = (void*) ffGenerateBoardJsonResult, diff --git a/src/modules/bootmgr/bootmgr.c b/src/modules/bootmgr/bootmgr.c index 01a2279d6..e5084e318 100644 --- a/src/modules/bootmgr/bootmgr.c +++ b/src/modules/bootmgr/bootmgr.c @@ -50,16 +50,6 @@ void ffPrintBootmgr(FFBootmgrOptions* options) ffStrbufDestroy(&bootmgr.firmware); } -bool ffParseBootmgrCommandOptions(FFBootmgrOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_BOOTMGR_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseBootmgrJsonObject(FFBootmgrOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -110,7 +100,6 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_BOOTMGR_MODULE_NAME, .description = "Print information of 2nd-stage bootloader (name, firmware, etc)", - .parseCommandOptions = (void*) ffParseBootmgrCommandOptions, .parseJsonObject = (void*) ffParseBootmgrJsonObject, .printModule = (void*) ffPrintBootmgr, .generateJsonResult = (void*) ffGenerateBootmgrJsonResult, diff --git a/src/modules/break/break.c b/src/modules/break/break.c index 39a47c0d4..fbb88b637 100644 --- a/src/modules/break/break.c +++ b/src/modules/break/break.c @@ -8,11 +8,6 @@ void ffPrintBreak(FF_MAYBE_UNUSED FFBreakOptions* options) putchar('\n'); } -bool ffParseBreakCommandOptions(FF_MAYBE_UNUSED FFBreakOptions* options, FF_MAYBE_UNUSED const char* key, FF_MAYBE_UNUSED const char* value) -{ - return false; -} - void ffParseBreakJsonObject(FF_MAYBE_UNUSED FFBreakOptions* options, FF_MAYBE_UNUSED yyjson_val* module) { yyjson_val *key, *val; @@ -29,7 +24,6 @@ void ffParseBreakJsonObject(FF_MAYBE_UNUSED FFBreakOptions* options, FF_MAYBE_UN static FFModuleBaseInfo ffModuleInfo = { .name = FF_BREAK_MODULE_NAME, .description = "Print a empty line", - .parseCommandOptions = (void*) ffParseBreakCommandOptions, .parseJsonObject = (void*) ffParseBreakJsonObject, .printModule = (void*) ffPrintBreak, }; diff --git a/src/modules/brightness/brightness.c b/src/modules/brightness/brightness.c index cd73a4dee..8b5a43d6a 100644 --- a/src/modules/brightness/brightness.c +++ b/src/modules/brightness/brightness.c @@ -112,31 +112,6 @@ void ffPrintBrightness(FFBrightnessOptions* options) } } -bool ffParseBrightnessCommandOptions(FFBrightnessOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_BRIGHTNESS_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "ddcci-sleep")) - { - options->ddcciSleep = ffOptionParseUInt32(key, value); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "compact")) - { - options->compact = ffOptionParseBoolean(value); - return true; - } - - if (ffPercentParseCommandOptions(key, subKey, value, &options->percent)) - return true; - - return false; -} - void ffParseBrightnessJsonObject(FFBrightnessOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -215,7 +190,6 @@ void ffGenerateBrightnessJsonResult(FF_MAYBE_UNUSED FFBrightnessOptions* options static FFModuleBaseInfo ffModuleInfo = { .name = FF_BRIGHTNESS_MODULE_NAME, .description = "Print current brightness level of your monitors", - .parseCommandOptions = (void*) ffParseBrightnessCommandOptions, .parseJsonObject = (void*) ffParseBrightnessJsonObject, .printModule = (void*) ffPrintBrightness, .generateJsonResult = (void*) ffGenerateBrightnessJsonResult, diff --git a/src/modules/btrfs/btrfs.c b/src/modules/btrfs/btrfs.c index 2eb78e12a..22db04bca 100644 --- a/src/modules/btrfs/btrfs.c +++ b/src/modules/btrfs/btrfs.c @@ -130,19 +130,6 @@ void ffPrintBtrfs(FFBtrfsOptions* options) } } -bool ffParseBtrfsCommandOptions(FFBtrfsOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_BTRFS_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffPercentParseCommandOptions(key, subKey, value, &options->percent)) - return true; - - return false; -} - void ffParseBtrfsJsonObject(FFBtrfsOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -216,7 +203,6 @@ void ffGenerateBtrfsJsonResult(FF_MAYBE_UNUSED FFBtrfsOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_BTRFS_MODULE_NAME, .description = "Print Linux BTRFS volumes", - .parseCommandOptions = (void*) ffParseBtrfsCommandOptions, .parseJsonObject = (void*) ffParseBtrfsJsonObject, .printModule = (void*) ffPrintBtrfs, .generateJsonResult = (void*) ffGenerateBtrfsJsonResult, diff --git a/src/modules/camera/camera.c b/src/modules/camera/camera.c index 515df46c8..78215dd5c 100644 --- a/src/modules/camera/camera.c +++ b/src/modules/camera/camera.c @@ -67,16 +67,6 @@ void ffPrintCamera(FFCameraOptions* options) } } -bool ffParseCameraCommandOptions(FFCameraOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_CAMERA_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseCameraJsonObject(FFCameraOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -133,7 +123,6 @@ void ffGenerateCameraJsonResult(FF_MAYBE_UNUSED FFCameraOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_CAMERA_MODULE_NAME, .description = "Print available cameras", - .parseCommandOptions = (void*) ffParseCameraCommandOptions, .parseJsonObject = (void*) ffParseCameraJsonObject, .printModule = (void*) ffPrintCamera, .generateJsonResult = (void*) ffGenerateCameraJsonResult, diff --git a/src/modules/chassis/chassis.c b/src/modules/chassis/chassis.c index e9c4056ad..867c0201b 100644 --- a/src/modules/chassis/chassis.c +++ b/src/modules/chassis/chassis.c @@ -51,16 +51,6 @@ exit: ffStrbufDestroy(&result.serial); } -bool ffParseChassisCommandOptions(FFChassisOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_CHASSIS_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseChassisJsonObject(FFChassisOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -120,7 +110,6 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_CHASSIS_MODULE_NAME, .description = "Print chassis type (desktop, laptop, etc)", - .parseCommandOptions = (void*) ffParseChassisCommandOptions, .parseJsonObject = (void*) ffParseChassisJsonObject, .printModule = (void*) ffPrintChassis, .generateJsonResult = (void*) ffGenerateChassisJsonResult, diff --git a/src/modules/colors/colors.c b/src/modules/colors/colors.c index bad4666da..59946166d 100644 --- a/src/modules/colors/colors.c +++ b/src/modules/colors/colors.c @@ -125,55 +125,6 @@ void ffPrintColors(FFColorsOptions* options) } } -bool ffParseColorsCommandOptions(FFColorsOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_COLORS_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "symbol")) - { - options->symbol = (FFColorsSymbol) ffOptionParseEnum(key, value, (FFKeyValuePair[]) { - { "block", FF_COLORS_SYMBOL_BLOCK }, - { "background", FF_COLORS_SYMBOL_BACKGROUND }, - { "circle", FF_COLORS_SYMBOL_CIRCLE }, - { "diamond", FF_COLORS_SYMBOL_DIAMOND }, - { "triangle", FF_COLORS_SYMBOL_TRIANGLE }, - { "square", FF_COLORS_SYMBOL_SQUARE }, - { "star", FF_COLORS_SYMBOL_STAR }, - {}, - }); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "padding-left")) - { - options->paddingLeft = ffOptionParseUInt32(key, value); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "block-width")) - { - options->block.width = (uint8_t) ffOptionParseUInt32(key, value); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "block-range-start")) - { - options->block.range[0] = min((uint8_t) ffOptionParseUInt32(key, value), 15); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "block-range-end")) - { - options->block.range[1] = min((uint8_t) ffOptionParseUInt32(key, value), 15); - return true; - } - - return false; -} - void ffParseColorsJsonObject(FFColorsOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -291,7 +242,6 @@ void ffGenerateColorsJsonConfig(FFColorsOptions* options, yyjson_mut_doc* doc, y static FFModuleBaseInfo ffModuleInfo = { .name = FF_COLORS_MODULE_NAME, .description = "Print some colored blocks", - .parseCommandOptions = (void*) ffParseColorsCommandOptions, .parseJsonObject = (void*) ffParseColorsJsonObject, .printModule = (void*) ffPrintColors, .generateJsonConfig = (void*) ffGenerateColorsJsonConfig, diff --git a/src/modules/command/command.c b/src/modules/command/command.c index 99ade943c..0e05d6f77 100644 --- a/src/modules/command/command.c +++ b/src/modules/command/command.c @@ -43,34 +43,6 @@ void ffPrintCommand(FFCommandOptions* options) } } -bool ffParseCommandCommandOptions(FFCommandOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_COMMAND_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if(ffStrEqualsIgnCase(subKey, "shell")) - { - ffOptionParseString(key, value, &options->shell); - return true; - } - - if(ffStrEqualsIgnCase(subKey, "param")) - { - ffOptionParseString(key, value, &options->param); - return true; - } - - if(ffStrEqualsIgnCase(subKey, "text")) - { - ffOptionParseString(key, value, &options->text); - return true; - } - - return false; -} - void ffParseCommandJsonObject(FFCommandOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -151,7 +123,6 @@ void ffGenerateCommandJsonResult(FF_MAYBE_UNUSED FFCommandOptions* options, yyjs static FFModuleBaseInfo ffModuleInfo = { .name = FF_COMMAND_MODULE_NAME, .description = "Run custom shell scripts", - .parseCommandOptions = (void*) ffParseCommandCommandOptions, .parseJsonObject = (void*) ffParseCommandJsonObject, .printModule = (void*) ffPrintCommand, .generateJsonResult = (void*) ffGenerateCommandJsonResult, diff --git a/src/modules/cpu/cpu.c b/src/modules/cpu/cpu.c index 3d44657c3..49c5a59a8 100644 --- a/src/modules/cpu/cpu.c +++ b/src/modules/cpu/cpu.c @@ -117,25 +117,6 @@ void ffPrintCPU(FFCPUOptions* options) ffStrbufDestroy(&cpu.vendor); } -bool ffParseCPUCommandOptions(FFCPUOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_CPU_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffTempsParseCommandOptions(key, subKey, value, &options->temp, &options->tempConfig)) - return true; - - if (ffStrEqualsIgnCase(subKey, "show-pe-core-count")) - { - options->showPeCoreCount = ffOptionParseBoolean(value); - return true; - } - - return false; -} - void ffParseCPUJsonObject(FFCPUOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -234,7 +215,6 @@ void ffGenerateCPUJsonResult(FFCPUOptions* options, yyjson_mut_doc* doc, yyjson_ static FFModuleBaseInfo ffModuleInfo = { .name = FF_CPU_MODULE_NAME, .description = "Print CPU name, frequency, etc", - .parseCommandOptions = (void*) ffParseCPUCommandOptions, .parseJsonObject = (void*) ffParseCPUJsonObject, .printModule = (void*) ffPrintCPU, .generateJsonResult = (void*) ffGenerateCPUJsonResult, diff --git a/src/modules/cpucache/cpucache.c b/src/modules/cpucache/cpucache.c index 71bf5b465..7a509fda6 100644 --- a/src/modules/cpucache/cpucache.c +++ b/src/modules/cpucache/cpucache.c @@ -132,22 +132,6 @@ exit: ffListDestroy(&result.caches[3]); } -bool ffParseCPUCacheCommandOptions(FFCPUCacheOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_CPUCACHE_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "compact")) - { - options->compact = ffOptionParseBoolean(value); - return true; - } - - return false; -} - void ffParseCPUCacheJsonObject(FFCPUCacheOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -227,7 +211,6 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_CPUCACHE_MODULE_NAME, .description = "Print CPU cache sizes", - .parseCommandOptions = (void*) ffParseCPUCacheCommandOptions, .parseJsonObject = (void*) ffParseCPUCacheJsonObject, .printModule = (void*) ffPrintCPUCache, .generateJsonResult = (void*) ffGenerateCPUCacheJsonResult, diff --git a/src/modules/cpuusage/cpuusage.c b/src/modules/cpuusage/cpuusage.c index ab78e456f..4f3b244d5 100644 --- a/src/modules/cpuusage/cpuusage.c +++ b/src/modules/cpuusage/cpuusage.c @@ -116,31 +116,6 @@ void ffPrintCPUUsage(FFCPUUsageOptions* options) } } -bool ffParseCPUUsageCommandOptions(FFCPUUsageOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_CPUUSAGE_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "separate")) - { - options->separate = ffOptionParseBoolean(value); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "wait-time")) - { - options->waitTime = ffOptionParseUInt32(key, value); - return true; - } - - if (ffPercentParseCommandOptions(key, subKey, value, &options->percent)) - return true; - - return false; -} - void ffParseCPUUsageJsonObject(FFCPUUsageOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -202,7 +177,6 @@ void ffGenerateCPUUsageJsonResult(FFCPUUsageOptions* options, yyjson_mut_doc* do static FFModuleBaseInfo ffModuleInfo = { .name = FF_CPUUSAGE_MODULE_NAME, .description = "Print CPU usage. Costs some time to collect data", - .parseCommandOptions = (void*) ffParseCPUUsageCommandOptions, .parseJsonObject = (void*) ffParseCPUUsageJsonObject, .printModule = (void*) ffPrintCPUUsage, .generateJsonResult = (void*) ffGenerateCPUUsageJsonResult, diff --git a/src/modules/cursor/cursor.c b/src/modules/cursor/cursor.c index 80f101f11..573eca95f 100644 --- a/src/modules/cursor/cursor.c +++ b/src/modules/cursor/cursor.c @@ -48,16 +48,6 @@ void ffPrintCursor(FFCursorOptions* options) ffStrbufDestroy(&result.size); } -bool ffParseCursorCommandOptions(FFCursorOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_CURSOR_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseCursorJsonObject(FFCursorOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -107,7 +97,6 @@ void ffGenerateCursorJsonResult(FF_MAYBE_UNUSED FFCursorOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_CURSOR_MODULE_NAME, .description = "Print cursor style name", - .parseCommandOptions = (void*) ffParseCursorCommandOptions, .parseJsonObject = (void*) ffParseCursorJsonObject, .printModule = (void*) ffPrintCursor, .generateJsonResult = (void*) ffGenerateCursorJsonResult, diff --git a/src/modules/custom/custom.c b/src/modules/custom/custom.c index 70c67e76d..5831430c5 100644 --- a/src/modules/custom/custom.c +++ b/src/modules/custom/custom.c @@ -9,16 +9,6 @@ void ffPrintCustom(FFCustomOptions* options) ffPrintFormat(FF_CUSTOM_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, 0, ((FFformatarg[]) {})); } -bool ffParseCustomCommandOptions(FFCustomOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_CUSTOM_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffGenerateCustomJsonConfig(FFCustomOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { __attribute__((__cleanup__(ffDestroyCustomOptions))) FFCustomOptions defaultOptions; @@ -43,7 +33,6 @@ void ffParseCustomJsonObject(FFCustomOptions* options, yyjson_val* module) static FFModuleBaseInfo ffModuleInfo = { .name = FF_CUSTOM_MODULE_NAME, .description = "Print a custom string, with or without key", - .parseCommandOptions = (void*) ffParseCustomCommandOptions, .parseJsonObject = (void*) ffParseCustomJsonObject, .printModule = (void*) ffPrintCustom, .generateJsonConfig = (void*) ffGenerateCustomJsonConfig, diff --git a/src/modules/datetime/datetime.c b/src/modules/datetime/datetime.c index 9d7ca2651..dd82937f0 100644 --- a/src/modules/datetime/datetime.c +++ b/src/modules/datetime/datetime.c @@ -117,16 +117,6 @@ void ffPrintDateTime(FFDateTimeOptions* options) puts(buffer); } -bool ffParseDateTimeCommandOptions(FFDateTimeOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_DATETIME_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseDateTimeJsonObject(FFDateTimeOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -156,7 +146,6 @@ void ffGenerateDateTimeJsonResult(FF_MAYBE_UNUSED FFDateTimeOptions* options, yy static FFModuleBaseInfo ffModuleInfo = { .name = FF_DATETIME_MODULE_NAME, .description = "Print current date and time", - .parseCommandOptions = (void*) ffParseDateTimeCommandOptions, .parseJsonObject = (void*) ffParseDateTimeJsonObject, .printModule = (void*) ffPrintDateTime, .generateJsonResult = (void*) ffGenerateDateTimeJsonResult, diff --git a/src/modules/de/de.c b/src/modules/de/de.c index d0e290090..7f0020b11 100644 --- a/src/modules/de/de.c +++ b/src/modules/de/de.c @@ -42,22 +42,6 @@ void ffPrintDE(FFDEOptions* options) } } -bool ffParseDECommandOptions(FFDEOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_DE_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "slow-version-detection")) - { - options->slowVersionDetection = ffOptionParseBoolean(value); - return true; - } - - return false; -} - void ffParseDEJsonObject(FFDEOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -110,7 +94,6 @@ void ffGenerateDEJsonResult(FF_MAYBE_UNUSED FFDEOptions* options, yyjson_mut_doc static FFModuleBaseInfo ffModuleInfo = { .name = FF_DE_MODULE_NAME, .description = "Print desktop environment name", - .parseCommandOptions = (void*) ffParseDECommandOptions, .parseJsonObject = (void*) ffParseDEJsonObject, .printModule = (void*) ffPrintDE, .generateJsonResult = (void*) ffGenerateDEJsonResult, diff --git a/src/modules/disk/disk.c b/src/modules/disk/disk.c index 9f71ec786..a6ac53a72 100644 --- a/src/modules/disk/disk.c +++ b/src/modules/disk/disk.c @@ -203,100 +203,6 @@ void ffPrintDisk(FFDiskOptions* options) } } -bool ffParseDiskCommandOptions(FFDiskOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_DISK_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "folders")) - { - ffOptionParseString(key, value, &options->folders); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "hide-folders")) - { - ffOptionParseString(key, value, &options->hideFolders); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "hide-fs")) - { - ffOptionParseString(key, value, &options->hideFS); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "show-regular")) - { - if (ffOptionParseBoolean(value)) - options->showTypes |= FF_DISK_VOLUME_TYPE_REGULAR_BIT; - else - options->showTypes &= ~FF_DISK_VOLUME_TYPE_REGULAR_BIT; - return true; - } - - if (ffStrEqualsIgnCase(subKey, "show-external")) - { - if (ffOptionParseBoolean(value)) - options->showTypes |= FF_DISK_VOLUME_TYPE_EXTERNAL_BIT; - else - options->showTypes &= ~FF_DISK_VOLUME_TYPE_EXTERNAL_BIT; - return true; - } - - if (ffStrEqualsIgnCase(subKey, "show-hidden")) - { - if (ffOptionParseBoolean(value)) - options->showTypes |= FF_DISK_VOLUME_TYPE_HIDDEN_BIT; - else - options->showTypes &= ~FF_DISK_VOLUME_TYPE_HIDDEN_BIT; - return true; - } - - if (ffStrEqualsIgnCase(subKey, "show-subvolumes")) - { - if (ffOptionParseBoolean(value)) - options->showTypes |= FF_DISK_VOLUME_TYPE_SUBVOLUME_BIT; - else - options->showTypes &= ~FF_DISK_VOLUME_TYPE_SUBVOLUME_BIT; - return true; - } - - if (ffStrEqualsIgnCase(subKey, "show-readonly")) - { - if (ffOptionParseBoolean(value)) - options->showTypes |= FF_DISK_VOLUME_TYPE_READONLY_BIT; - else - options->showTypes &= ~FF_DISK_VOLUME_TYPE_READONLY_BIT; - return true; - } - - if (ffStrEqualsIgnCase(subKey, "show-unknown")) - { - if (ffOptionParseBoolean(value)) - options->showTypes |= FF_DISK_VOLUME_TYPE_UNKNOWN_BIT; - else - options->showTypes &= ~FF_DISK_VOLUME_TYPE_UNKNOWN_BIT; - return true; - } - - if (ffStrEqualsIgnCase(subKey, "use-available")) - { - if (ffOptionParseBoolean(value)) - options->calcType = FF_DISK_CALC_TYPE_AVAILABLE; - else - options->calcType = FF_DISK_CALC_TYPE_FREE; - return true; - } - - if (ffPercentParseCommandOptions(key, subKey, value, &options->percent)) - return true; - - return false; -} - void ffParseDiskJsonObject(FFDiskOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -509,7 +415,6 @@ void ffGenerateDiskJsonResult(FFDiskOptions* options, yyjson_mut_doc* doc, yyjso static FFModuleBaseInfo ffModuleInfo = { .name = FF_DISK_MODULE_NAME, .description = "Print partitions, space usage, file system, etc", - .parseCommandOptions = (void*) ffParseDiskCommandOptions, .parseJsonObject = (void*) ffParseDiskJsonObject, .printModule = (void*) ffPrintDisk, .generateJsonResult = (void*) ffGenerateDiskJsonResult, diff --git a/src/modules/diskio/diskio.c b/src/modules/diskio/diskio.c index f5f805d0e..6c73f3e21 100644 --- a/src/modules/diskio/diskio.c +++ b/src/modules/diskio/diskio.c @@ -95,34 +95,6 @@ void ffPrintDiskIO(FFDiskIOOptions* options) } } -bool ffParseDiskIOCommandOptions(FFDiskIOOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_DISKIO_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "name-prefix")) - { - ffOptionParseString(key, value, &options->namePrefix); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "detect-total")) - { - options->detectTotal = ffOptionParseBoolean(value); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "wait-time")) - { - options->waitTime = ffOptionParseUInt32(key, value); - return true; - } - - return false; -} - void ffParseDiskIOJsonObject(FFDiskIOOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -201,7 +173,6 @@ void ffGenerateDiskIOJsonResult(FFDiskIOOptions* options, yyjson_mut_doc* doc, y static FFModuleBaseInfo ffModuleInfo = { .name = FF_DISKIO_MODULE_NAME, .description = "Print physical disk I/O throughput", - .parseCommandOptions = (void*) ffParseDiskIOCommandOptions, .parseJsonObject = (void*) ffParseDiskIOJsonObject, .printModule = (void*) ffPrintDiskIO, .generateJsonResult = (void*) ffGenerateDiskIOJsonResult, diff --git a/src/modules/display/display.c b/src/modules/display/display.c index e6ffca361..d60876572 100644 --- a/src/modules/display/display.c +++ b/src/modules/display/display.c @@ -217,46 +217,6 @@ void ffPrintDisplay(FFDisplayOptions* options) } } -bool ffParseDisplayCommandOptions(FFDisplayOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_DISPLAY_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "compact-type")) - { - options->compactType = (FFDisplayCompactType) ffOptionParseEnum(key, value, (FFKeyValuePair[]) { - { "none", FF_DISPLAY_COMPACT_TYPE_NONE }, - { "original", FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT }, - { "scaled", FF_DISPLAY_COMPACT_TYPE_SCALED_BIT }, - { "original-with-refresh-rate", FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT | FF_DISPLAY_COMPACT_TYPE_REFRESH_RATE_BIT }, - { "scaled-with-refresh-rate", FF_DISPLAY_COMPACT_TYPE_SCALED_BIT | FF_DISPLAY_COMPACT_TYPE_REFRESH_RATE_BIT }, - {}, - }); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "precise-refresh-rate")) - { - options->preciseRefreshRate = ffOptionParseBoolean(value); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "order")) - { - options->order = (FFDisplayOrder) ffOptionParseEnum(key, value, (FFKeyValuePair[]) { - { "asc", FF_DISPLAY_ORDER_ASC }, - { "desc", FF_DISPLAY_ORDER_DESC }, - { "none", FF_DISPLAY_ORDER_NONE }, - {}, - }); - return true; - } - - return false; -} - void ffParseDisplayJsonObject(FFDisplayOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -271,20 +231,20 @@ void ffParseDisplayJsonObject(FFDisplayOptions* options, yyjson_val* module) if (yyjson_is_null(val)) options->compactType = FF_DISPLAY_COMPACT_TYPE_NONE; else - { - int value; - const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { - { "none", FF_DISPLAY_COMPACT_TYPE_NONE }, - { "original", FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT }, - { "scaled", FF_DISPLAY_COMPACT_TYPE_SCALED_BIT }, - { "original-with-refresh-rate", FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT | FF_DISPLAY_COMPACT_TYPE_REFRESH_RATE_BIT }, - { "scaled-with-refresh-rate", FF_DISPLAY_COMPACT_TYPE_SCALED_BIT | FF_DISPLAY_COMPACT_TYPE_REFRESH_RATE_BIT }, - {}, - }); - if (error) - ffPrintError(FF_DISPLAY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", unsafe_yyjson_get_str(key), error); - else - options->compactType = (FFDisplayCompactType) value; + { + int value; + const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { + { "none", FF_DISPLAY_COMPACT_TYPE_NONE }, + { "original", FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT }, + { "scaled", FF_DISPLAY_COMPACT_TYPE_SCALED_BIT }, + { "original-with-refresh-rate", FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT | FF_DISPLAY_COMPACT_TYPE_REFRESH_RATE_BIT }, + { "scaled-with-refresh-rate", FF_DISPLAY_COMPACT_TYPE_SCALED_BIT | FF_DISPLAY_COMPACT_TYPE_REFRESH_RATE_BIT }, + {}, + }); + if (error) + ffPrintError(FF_DISPLAY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", unsafe_yyjson_get_str(key), error); + else + options->compactType = (FFDisplayCompactType) value; } continue; } @@ -440,7 +400,6 @@ void ffGenerateDisplayJsonResult(FF_MAYBE_UNUSED FFDisplayOptions* options, yyjs static FFModuleBaseInfo ffModuleInfo = { .name = FF_DISPLAY_MODULE_NAME, .description = "Print resolutions, refresh rates, etc", - .parseCommandOptions = (void*) ffParseDisplayCommandOptions, .parseJsonObject = (void*) ffParseDisplayJsonObject, .printModule = (void*) ffPrintDisplay, .generateJsonResult = (void*) ffGenerateDisplayJsonResult, diff --git a/src/modules/dns/dns.c b/src/modules/dns/dns.c index 246006eab..815865ff6 100644 --- a/src/modules/dns/dns.c +++ b/src/modules/dns/dns.c @@ -57,27 +57,6 @@ void ffPrintDNS(FFDNSOptions* options) } } -bool ffParseDNSCommandOptions(FFDNSOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_DNS_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "show-type")) - { - options->showType = (FFDNSShowType) ffOptionParseEnum(key, value, (FFKeyValuePair[]) { - { "both", FF_DNS_TYPE_BOTH }, - { "ipv4", FF_DNS_TYPE_IPV4_BIT }, - { "ipv6", FF_DNS_TYPE_IPV6_BIT }, - {}, - }); - return true; - } - - return false; -} - void ffParseDNSJsonObject(FFDNSOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -163,7 +142,6 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_DNS_MODULE_NAME, .description = "Print configured DNS servers", - .parseCommandOptions = (void*) ffParseDNSCommandOptions, .parseJsonObject = (void*) ffParseDNSJsonObject, .printModule = (void*) ffPrintDNS, .generateJsonResult = (void*) ffGenerateDNSJsonResult, diff --git a/src/modules/editor/editor.c b/src/modules/editor/editor.c index 4baa02352..67223bb50 100644 --- a/src/modules/editor/editor.c +++ b/src/modules/editor/editor.c @@ -54,16 +54,6 @@ void ffPrintEditor(FFEditorOptions* options) ffStrbufDestroy(&result.version); } -bool ffParseEditorCommandOptions(FFEditorOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_EDITOR_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseEditorJsonObject(FFEditorOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -117,7 +107,6 @@ void ffGenerateEditorJsonResult(FF_MAYBE_UNUSED FFEditorOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_EDITOR_MODULE_NAME, .description = "Print information of the default editor ($VISUAL or $EDITOR)", - .parseCommandOptions = (void*) ffParseEditorCommandOptions, .parseJsonObject = (void*) ffParseEditorJsonObject, .printModule = (void*) ffPrintEditor, .generateJsonResult = (void*) ffGenerateEditorJsonResult, diff --git a/src/modules/font/font.c b/src/modules/font/font.c index 3829901e2..bf0fc2459 100644 --- a/src/modules/font/font.c +++ b/src/modules/font/font.c @@ -41,16 +41,6 @@ void ffPrintFont(FFFontOptions* options) ffStrbufDestroy(&font.fonts[i]); } -bool ffParseFontCommandOptions(FFFontOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_FONT_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseFontJsonObject(FFFontOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -101,7 +91,6 @@ void ffGenerateFontJsonResult(FF_MAYBE_UNUSED FFFontOptions* options, yyjson_mut static FFModuleBaseInfo ffModuleInfo = { .name = FF_FONT_MODULE_NAME, .description = "Print system font names", - .parseCommandOptions = (void*) ffParseFontCommandOptions, .parseJsonObject = (void*) ffParseFontJsonObject, .printModule = (void*) ffPrintFont, .generateJsonResult = (void*) ffGenerateFontJsonResult, diff --git a/src/modules/gamepad/gamepad.c b/src/modules/gamepad/gamepad.c index f3f9b37ae..5e6e394d3 100644 --- a/src/modules/gamepad/gamepad.c +++ b/src/modules/gamepad/gamepad.c @@ -77,19 +77,6 @@ void ffPrintGamepad(FFGamepadOptions* options) } } -bool ffParseGamepadCommandOptions(FFGamepadOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_GAMEPAD_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffPercentParseCommandOptions(key, subKey, value, &options->percent)) - return true; - - return false; -} - void ffParseGamepadJsonObject(FFGamepadOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -146,7 +133,6 @@ void ffGenerateGamepadJsonResult(FF_MAYBE_UNUSED FFGamepadOptions* options, yyjs static FFModuleBaseInfo ffModuleInfo = { .name = FF_GAMEPAD_MODULE_NAME, .description = "List (connected) gamepads", - .parseCommandOptions = (void*) ffParseGamepadCommandOptions, .parseJsonObject = (void*) ffParseGamepadJsonObject, .printModule = (void*) ffPrintGamepad, .generateJsonResult = (void*) ffGenerateGamepadJsonResult, diff --git a/src/modules/gpu/gpu.c b/src/modules/gpu/gpu.c index 06098e9e5..b608dc300 100644 --- a/src/modules/gpu/gpu.c +++ b/src/modules/gpu/gpu.c @@ -202,53 +202,6 @@ void ffPrintGPU(FFGPUOptions* options) } } -bool ffParseGPUCommandOptions(FFGPUOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_GPU_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "driver-specific")) - { - options->driverSpecific = ffOptionParseBoolean(value); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "detection-method")) - { - options->detectionMethod = (FFGPUDetectionMethod) ffOptionParseEnum(key, value, (FFKeyValuePair[]) { - { "auto", FF_GPU_DETECTION_METHOD_AUTO }, - { "pci", FF_GPU_DETECTION_METHOD_PCI }, - { "vulkan", FF_GPU_DETECTION_METHOD_VULKAN }, - { "opencl", FF_GPU_DETECTION_METHOD_OPENCL }, - { "opengl", FF_GPU_DETECTION_METHOD_OPENGL }, - {}, - }); - return true; - } - - if (ffTempsParseCommandOptions(key, subKey, value, &options->temp, &options->tempConfig)) - return true; - - if (ffStrEqualsIgnCase(subKey, "hide-type")) - { - options->hideType = (FFGPUType) ffOptionParseEnum(key, value, (FFKeyValuePair[]) { - { "none", FF_GPU_TYPE_NONE }, - { "unknown", FF_GPU_TYPE_UNKNOWN }, - { "integrated", FF_GPU_TYPE_INTEGRATED }, - { "discrete", FF_GPU_TYPE_DISCRETE }, - {}, - }); - return true; - } - - if (ffPercentParseCommandOptions(key, subKey, value, &options->percent)) - return true; - - return false; -} - void ffParseGPUJsonObject(FFGPUOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -459,7 +412,6 @@ void ffGenerateGPUJsonResult(FFGPUOptions* options, yyjson_mut_doc* doc, yyjson_ static FFModuleBaseInfo ffModuleInfo = { .name = FF_GPU_MODULE_NAME, .description = "Print GPU names, graphic memory size, type, etc", - .parseCommandOptions = (void*) ffParseGPUCommandOptions, .parseJsonObject = (void*) ffParseGPUJsonObject, .printModule = (void*) ffPrintGPU, .generateJsonResult = (void*) ffGenerateGPUJsonResult, diff --git a/src/modules/host/host.c b/src/modules/host/host.c index 7d9a68f62..3d4fd3942 100644 --- a/src/modules/host/host.c +++ b/src/modules/host/host.c @@ -67,16 +67,6 @@ exit: ffStrbufDestroy(&host.vendor); } -bool ffParseHostCommandOptions(FFHostOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_HOST_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseHostJsonObject(FFHostOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -144,7 +134,6 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_HOST_MODULE_NAME, .description = "Print product name of your computer", - .parseCommandOptions = (void*) ffParseHostCommandOptions, .parseJsonObject = (void*) ffParseHostJsonObject, .printModule = (void*) ffPrintHost, .generateJsonResult = (void*) ffGenerateHostJsonResult, diff --git a/src/modules/icons/icons.c b/src/modules/icons/icons.c index a708e6c2c..ae2ad783b 100644 --- a/src/modules/icons/icons.c +++ b/src/modules/icons/icons.c @@ -43,16 +43,6 @@ void ffPrintIcons(FFIconsOptions* options) ffStrbufDestroy(&result.icons2); } -bool ffParseIconsCommandOptions(FFIconsOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_ICONS_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseIconsJsonObject(FFIconsOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -99,7 +89,6 @@ void ffGenerateIconsJsonResult(FF_MAYBE_UNUSED FFIconsOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_ICONS_MODULE_NAME, .description = "Print icon style name", - .parseCommandOptions = (void*) ffParseIconsCommandOptions, .parseJsonObject = (void*) ffParseIconsJsonObject, .printModule = (void*) ffPrintIcons, .generateJsonResult = (void*) ffGenerateIconsJsonResult, diff --git a/src/modules/initsystem/initsystem.c b/src/modules/initsystem/initsystem.c index 99669aaab..591a78e0a 100644 --- a/src/modules/initsystem/initsystem.c +++ b/src/modules/initsystem/initsystem.c @@ -48,16 +48,6 @@ exit: ffStrbufDestroy(&result.version); } -bool ffParseInitSystemCommandOptions(FFInitSystemOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_INITSYSTEM_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseInitSystemJsonObject(FFInitSystemOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -111,7 +101,6 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_INITSYSTEM_MODULE_NAME, .description = "Print init system (pid 1) name and version", - .parseCommandOptions = (void*) ffParseInitSystemCommandOptions, .parseJsonObject = (void*) ffParseInitSystemJsonObject, .printModule = (void*) ffPrintInitSystem, .generateJsonResult = (void*) ffGenerateInitSystemJsonResult, diff --git a/src/modules/kernel/kernel.c b/src/modules/kernel/kernel.c index 421ebab03..fd21f67ed 100644 --- a/src/modules/kernel/kernel.c +++ b/src/modules/kernel/kernel.c @@ -32,16 +32,6 @@ void ffPrintKernel(FFKernelOptions* options) } } -bool ffParseKernelCommandOptions(FFKernelOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_KERNEL_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseKernelJsonObject(FFKernelOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -79,7 +69,6 @@ void ffGenerateKernelJsonResult(FF_MAYBE_UNUSED FFKernelOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_KERNEL_MODULE_NAME, .description = "Print system kernel version", - .parseCommandOptions = (void*) ffParseKernelCommandOptions, .parseJsonObject = (void*) ffParseKernelJsonObject, .printModule = (void*) ffPrintKernel, .generateJsonResult = (void*) ffGenerateKernelJsonResult, diff --git a/src/modules/keyboard/keyboard.c b/src/modules/keyboard/keyboard.c index 35b4f5d86..4b2a34329 100644 --- a/src/modules/keyboard/keyboard.c +++ b/src/modules/keyboard/keyboard.c @@ -48,16 +48,6 @@ void ffPrintKeyboard(FFKeyboardOptions* options) } } -bool ffParseKeyboardCommandOptions(FFKeyboardOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_KEYBOARD_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseKeyboardJsonObject(FFKeyboardOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -109,7 +99,6 @@ void ffGenerateKeyboardJsonResult(FF_MAYBE_UNUSED FFKeyboardOptions* options, yy static FFModuleBaseInfo ffModuleInfo = { .name = FF_KEYBOARD_MODULE_NAME, .description = "List (connected) keyboards", - .parseCommandOptions = (void*) ffParseKeyboardCommandOptions, .parseJsonObject = (void*) ffParseKeyboardJsonObject, .printModule = (void*) ffPrintKeyboard, .generateJsonResult = (void*) ffGenerateKeyboardJsonResult, diff --git a/src/modules/lm/lm.c b/src/modules/lm/lm.c index 4cdb42a70..9afcdefc4 100644 --- a/src/modules/lm/lm.c +++ b/src/modules/lm/lm.c @@ -47,16 +47,6 @@ void ffPrintLM(FFLMOptions* options) ffStrbufDestroy(&result.version); } -bool ffParseLMCommandOptions(FFLMOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_LM_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseLMJsonObject(FFLMOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -112,7 +102,6 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_LM_MODULE_NAME, .description = "Print login manager (desktop manager) name and version", - .parseCommandOptions = (void*) ffParseLMCommandOptions, .parseJsonObject = (void*) ffParseLMJsonObject, .printModule = (void*) ffPrintLM, .generateJsonResult = (void*) ffGenerateLMJsonResult, diff --git a/src/modules/loadavg/loadavg.c b/src/modules/loadavg/loadavg.c index afd443cfd..1fb7655e8 100644 --- a/src/modules/loadavg/loadavg.c +++ b/src/modules/loadavg/loadavg.c @@ -90,31 +90,6 @@ void ffPrintLoadavg(FFLoadavgOptions* options) } } -bool ffParseLoadavgCommandOptions(FFLoadavgOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_LOADAVG_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "ndigits")) - { - options->ndigits = (uint8_t) ffOptionParseUInt32(key, value); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "compact")) - { - options->compact = ffOptionParseBoolean(value); - return true; - } - - if (ffPercentParseCommandOptions(key, subKey, value, &options->percent)) - return true; - - return false; -} - void ffParseLoadavgJsonObject(FFLoadavgOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -178,7 +153,6 @@ void ffGenerateLoadavgJsonResult(FF_MAYBE_UNUSED FFLoadavgOptions* options, yyjs static FFModuleBaseInfo ffModuleInfo = { .name = FF_LOADAVG_MODULE_NAME, .description = "Print system load averages", - .parseCommandOptions = (void*) ffParseLoadavgCommandOptions, .parseJsonObject = (void*) ffParseLoadavgJsonObject, .printModule = (void*) ffPrintLoadavg, .generateJsonResult = (void*) ffGenerateLoadavgJsonResult, diff --git a/src/modules/locale/locale.c b/src/modules/locale/locale.c index 04e7d9159..290f9196e 100644 --- a/src/modules/locale/locale.c +++ b/src/modules/locale/locale.c @@ -28,16 +28,6 @@ void ffPrintLocale(FFLocaleOptions* options) } } -bool ffParseLocaleCommandOptions(FFLocaleOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_LOCALE_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseLocaleJsonObject(FFLocaleOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -76,7 +66,6 @@ void ffGenerateLocaleJsonResult(FF_MAYBE_UNUSED FFLocaleOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_LOCALE_MODULE_NAME, .description = "Print system locale name", - .parseCommandOptions = (void*) ffParseLocaleCommandOptions, .parseJsonObject = (void*) ffParseLocaleJsonObject, .printModule = (void*) ffPrintLocale, .generateJsonResult = (void*) ffGenerateLocaleJsonResult, diff --git a/src/modules/localip/localip.c b/src/modules/localip/localip.c index 16680c690..cfc936fdf 100644 --- a/src/modules/localip/localip.c +++ b/src/modules/localip/localip.c @@ -178,121 +178,6 @@ void ffPrintLocalIp(FFLocalIpOptions* options) } } -bool ffParseLocalIpCommandOptions(FFLocalIpOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_LOCALIP_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "show-ipv4")) - { - if (ffOptionParseBoolean(value)) - options->showType |= FF_LOCALIP_TYPE_IPV4_BIT; - else - options->showType &= ~FF_LOCALIP_TYPE_IPV4_BIT; - return true; - } - - if (ffStrEqualsIgnCase(subKey, "show-ipv6")) - { - if (ffOptionParseBoolean(value)) - options->showType |= FF_LOCALIP_TYPE_IPV6_BIT; - else - options->showType &= ~FF_LOCALIP_TYPE_IPV6_BIT; - return true; - } - - if (ffStrEqualsIgnCase(subKey, "show-mac")) - { - if (ffOptionParseBoolean(value)) - options->showType |= FF_LOCALIP_TYPE_MAC_BIT; - else - options->showType &= ~FF_LOCALIP_TYPE_MAC_BIT; - return true; - } - - if (ffStrEqualsIgnCase(subKey, "show-loop")) - { - if (ffOptionParseBoolean(value)) - options->showType |= FF_LOCALIP_TYPE_LOOP_BIT; - else - options->showType &= ~FF_LOCALIP_TYPE_LOOP_BIT; - return true; - } - - if (ffStrEqualsIgnCase(subKey, "show-prefix-len")) - { - if (ffOptionParseBoolean(value)) - options->showType |= FF_LOCALIP_TYPE_PREFIX_LEN_BIT; - else - options->showType &= ~FF_LOCALIP_TYPE_PREFIX_LEN_BIT; - return true; - } - - if (ffStrEqualsIgnCase(subKey, "show-mtu")) - { - if (ffOptionParseBoolean(value)) - options->showType |= FF_LOCALIP_TYPE_MTU_BIT; - else - options->showType &= ~FF_LOCALIP_TYPE_MTU_BIT; - return true; - } - - if (ffStrEqualsIgnCase(subKey, "show-speed")) - { - if (ffOptionParseBoolean(value)) - options->showType |= FF_LOCALIP_TYPE_SPEED_BIT; - else - options->showType &= ~FF_LOCALIP_TYPE_SPEED_BIT; - return true; - } - - if (ffStrEqualsIgnCase(subKey, "show-flags")) - { - if (ffOptionParseBoolean(value)) - options->showType |= FF_LOCALIP_TYPE_FLAGS_BIT; - else - options->showType &= ~FF_LOCALIP_TYPE_FLAGS_BIT; - return true; - } - - if(ffStrEqualsIgnCase(subKey, "compact")) - { - if (ffOptionParseBoolean(value)) - options->showType |= FF_LOCALIP_TYPE_COMPACT_BIT; - else - options->showType &= ~FF_LOCALIP_TYPE_COMPACT_BIT; - return true; - } - - if (ffStrEqualsIgnCase(subKey, "default-route-only")) - { - if (ffOptionParseBoolean(value)) - options->showType |= FF_LOCALIP_TYPE_DEFAULT_ROUTE_ONLY_BIT; - else - options->showType &= ~FF_LOCALIP_TYPE_DEFAULT_ROUTE_ONLY_BIT; - return true; - } - - if (ffStrEqualsIgnCase(subKey, "show-all-ips")) - { - if (ffOptionParseBoolean(value)) - options->showType |= FF_LOCALIP_TYPE_ALL_IPS_BIT; - else - options->showType &= ~FF_LOCALIP_TYPE_ALL_IPS_BIT; - return true; - } - - if (ffStrEqualsIgnCase(subKey, "name-prefix")) - { - ffOptionParseString(key, value, &options->namePrefix); - return true; - } - - return false; -} - void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -503,7 +388,6 @@ void ffGenerateLocalIpJsonResult(FF_MAYBE_UNUSED FFLocalIpOptions* options, yyjs static FFModuleBaseInfo ffModuleInfo = { .name = FF_LOCALIP_MODULE_NAME, .description = "List local IP addresses (v4 or v6), MAC addresses, etc", - .parseCommandOptions = (void*) ffParseLocalIpCommandOptions, .parseJsonObject = (void*) ffParseLocalIpJsonObject, .printModule = (void*) ffPrintLocalIp, .generateJsonResult = (void*) ffGenerateLocalIpJsonResult, diff --git a/src/modules/media/media.c b/src/modules/media/media.c index d52a9f3c8..71dfb96ea 100644 --- a/src/modules/media/media.c +++ b/src/modules/media/media.c @@ -106,16 +106,6 @@ void ffPrintMedia(FFMediaOptions* options) } } -bool ffParseMediaCommandOptions(FFMediaOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_MEDIA_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseMediaJsonObject(FFMediaOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -164,7 +154,6 @@ void ffGenerateMediaJsonResult(FF_MAYBE_UNUSED FFMediaOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_MEDIA_MODULE_NAME, .description = "Print playing song name", - .parseCommandOptions = (void*) ffParseMediaCommandOptions, .parseJsonObject = (void*) ffParseMediaJsonObject, .printModule = (void*) ffPrintMedia, .generateJsonResult = (void*) ffGenerateMediaJsonResult, diff --git a/src/modules/memory/memory.c b/src/modules/memory/memory.c index 711fbae0d..1948a162e 100644 --- a/src/modules/memory/memory.c +++ b/src/modules/memory/memory.c @@ -71,19 +71,6 @@ void ffPrintMemory(FFMemoryOptions* options) } } -bool ffParseMemoryCommandOptions(FFMemoryOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_MEMORY_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffPercentParseCommandOptions(key, subKey, value, &options->percent)) - return true; - - return false; -} - void ffParseMemoryJsonObject(FFMemoryOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -129,7 +116,6 @@ void ffGenerateMemoryJsonResult(FF_MAYBE_UNUSED FFMemoryOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_MEMORY_MODULE_NAME, .description = "Print system memory usage info", - .parseCommandOptions = (void*) ffParseMemoryCommandOptions, .parseJsonObject = (void*) ffParseMemoryJsonObject, .printModule = (void*) ffPrintMemory, .generateJsonResult = (void*) ffGenerateMemoryJsonResult, diff --git a/src/modules/monitor/monitor.c b/src/modules/monitor/monitor.c index 526bde08c..fd0efac20 100644 --- a/src/modules/monitor/monitor.c +++ b/src/modules/monitor/monitor.c @@ -86,16 +86,6 @@ void ffPrintMonitor(FFMonitorOptions* options) } } -bool ffParseMonitorCommandOptions(FFMonitorOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_MONITOR_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseMonitorJsonObject(FFMonitorOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -125,7 +115,6 @@ void ffGenerateMonitorJsonResult(FF_MAYBE_UNUSED FFMonitorOptions* options, yyjs static FFModuleBaseInfo ffModuleInfo = { .name = FF_MONITOR_MODULE_NAME, .description = "Alias of Display module", - .parseCommandOptions = (void*) ffParseMonitorCommandOptions, .parseJsonObject = (void*) ffParseMonitorJsonObject, .printModule = (void*) ffPrintMonitor, .generateJsonResult = (void*) ffGenerateMonitorJsonResult, diff --git a/src/modules/mouse/mouse.c b/src/modules/mouse/mouse.c index e7207bcfe..1d5eeea88 100644 --- a/src/modules/mouse/mouse.c +++ b/src/modules/mouse/mouse.c @@ -48,16 +48,6 @@ void ffPrintMouse(FFMouseOptions* options) } } -bool ffParseMouseCommandOptions(FFMouseOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_MOUSE_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseMouseJsonObject(FFMouseOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -109,7 +99,6 @@ void ffGenerateMouseJsonResult(FF_MAYBE_UNUSED FFMouseOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_MOUSE_MODULE_NAME, .description = "List connected mouses", - .parseCommandOptions = (void*) ffParseMouseCommandOptions, .parseJsonObject = (void*) ffParseMouseJsonObject, .printModule = (void*) ffPrintMouse, .generateJsonResult = (void*) ffGenerateMouseJsonResult, diff --git a/src/modules/netio/netio.c b/src/modules/netio/netio.c index 6980f8bd0..9733ee99b 100644 --- a/src/modules/netio/netio.c +++ b/src/modules/netio/netio.c @@ -103,40 +103,6 @@ void ffPrintNetIO(FFNetIOOptions* options) } } -bool ffParseNetIOCommandOptions(FFNetIOOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_NETIO_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "name-prefix")) - { - ffOptionParseString(key, value, &options->namePrefix); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "default-route-only")) - { - options->defaultRouteOnly = ffOptionParseBoolean(value); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "detect-total")) - { - options->detectTotal = ffOptionParseBoolean(value); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "wait-time")) - { - options->waitTime = ffOptionParseUInt32(key, value); - return true; - } - - return false; -} - void ffParseNetIOJsonObject(FFNetIOOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -227,7 +193,6 @@ void ffGenerateNetIOJsonResult(FFNetIOOptions* options, yyjson_mut_doc* doc, yyj static FFModuleBaseInfo ffModuleInfo = { .name = FF_NETIO_MODULE_NAME, .description = "Print network I/O throughput", - .parseCommandOptions = (void*) ffParseNetIOCommandOptions, .parseJsonObject = (void*) ffParseNetIOJsonObject, .printModule = (void*) ffPrintNetIO, .generateJsonResult = (void*) ffGenerateNetIOJsonResult, diff --git a/src/modules/opencl/opencl.c b/src/modules/opencl/opencl.c index 8a5cd5879..ad93db8a0 100644 --- a/src/modules/opencl/opencl.c +++ b/src/modules/opencl/opencl.c @@ -30,16 +30,6 @@ void ffPrintOpenCL(FFOpenCLOptions* options) } } -bool ffParseOpenCLCommandOptions(FFOpenCLOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_OPENCL_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseOpenCLJsonObject(FFOpenCLOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -127,7 +117,6 @@ void ffGenerateOpenCLJsonResult(FF_MAYBE_UNUSED FFOpenCLOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_OPENCL_MODULE_NAME, .description = "Print highest OpenCL version supported by the GPU", - .parseCommandOptions = (void*) ffParseOpenCLCommandOptions, .parseJsonObject = (void*) ffParseOpenCLJsonObject, .printModule = (void*) ffPrintOpenCL, .generateJsonResult = (void*) ffGenerateOpenCLJsonResult, diff --git a/src/modules/opengl/opengl.c b/src/modules/opengl/opengl.c index a83e8d9c0..43ef88d44 100644 --- a/src/modules/opengl/opengl.c +++ b/src/modules/opengl/opengl.c @@ -43,27 +43,6 @@ void ffPrintOpenGL(FFOpenGLOptions* options) ffStrbufDestroy(&result.library); } -bool ffParseOpenGLCommandOptions(FFOpenGLOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_OPENGL_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "library")) - { - options->library = (FFOpenGLLibrary) ffOptionParseEnum(key, value, (FFKeyValuePair[]) { - { "auto", FF_OPENGL_LIBRARY_AUTO }, - { "egl", FF_OPENGL_LIBRARY_EGL }, - { "glx", FF_OPENGL_LIBRARY_GLX }, - {} - }); - return true; - } - - return false; -} - void ffParseOpenGLJsonObject(FFOpenGLOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -151,7 +130,6 @@ void ffGenerateOpenGLJsonResult(FF_MAYBE_UNUSED FFOpenGLOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_OPENGL_MODULE_NAME, .description = "Print highest OpenGL version supported by the GPU", - .parseCommandOptions = (void*) ffParseOpenGLCommandOptions, .parseJsonObject = (void*) ffParseOpenGLJsonObject, .printModule = (void*) ffPrintOpenGL, .generateJsonResult = (void*) ffGenerateOpenGLJsonResult, diff --git a/src/modules/os/os.c b/src/modules/os/os.c index c2e17e837..9bcb13387 100644 --- a/src/modules/os/os.c +++ b/src/modules/os/os.c @@ -115,16 +115,6 @@ void ffPrintOS(FFOSOptions* options) } } -bool ffParseOSCommandOptions(FFOSOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_OS_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseOSJsonObject(FFOSOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -172,7 +162,6 @@ void ffGenerateOSJsonResult(FF_MAYBE_UNUSED FFOSOptions* options, yyjson_mut_doc static FFModuleBaseInfo ffModuleInfo = { .name = FF_OS_MODULE_NAME, .description = "Print operating system name and version", - .parseCommandOptions = (void*) ffParseOSCommandOptions, .parseJsonObject = (void*) ffParseOSJsonObject, .printModule = (void*) ffPrintOS, .generateJsonResult = (void*) ffGenerateOSJsonResult, diff --git a/src/modules/packages/packages.c b/src/modules/packages/packages.c index 917aea944..a5d61ee72 100644 --- a/src/modules/packages/packages.c +++ b/src/modules/packages/packages.c @@ -205,117 +205,6 @@ void ffPrintPackages(FFPackagesOptions* options) ffStrbufDestroy(&counts.pacmanBranch); } -bool ffParsePackagesCommandOptions(FFPackagesOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_PACKAGES_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "disabled")) - { - options->disabled = FF_PACKAGES_FLAG_NONE; - FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate(); - ffOptionParseString(key, value, &buffer); - - char *start = buffer.chars, *end = strchr(start, ':'); - while (true) - { - if (end) - *end = '\0'; - - #define FF_TEST_PACKAGE_NAME(name) else if (ffStrEqualsIgnCase(start, #name)) { options->disabled |= FF_PACKAGES_FLAG_ ## name ## _BIT; } - switch (toupper(start[0])) - { - case 'A': if (false); - FF_TEST_PACKAGE_NAME(APK) - FF_TEST_PACKAGE_NAME(AM) - break; - case 'B': if (false); - FF_TEST_PACKAGE_NAME(BREW) - break; - case 'C': if (false); - FF_TEST_PACKAGE_NAME(CHOCO) - break; - case 'D': if (false); - FF_TEST_PACKAGE_NAME(DPKG) - break; - case 'E': if (false); - FF_TEST_PACKAGE_NAME(EMERGE) - FF_TEST_PACKAGE_NAME(EOPKG) - break; - case 'F': if (false); - FF_TEST_PACKAGE_NAME(FLATPAK) - break; - case 'G': if (false); - FF_TEST_PACKAGE_NAME(GUIX) - break; - case 'H': if (false); - FF_TEST_PACKAGE_NAME(HPKG) - break; - case 'L': if (false); - FF_TEST_PACKAGE_NAME(LPKG) - FF_TEST_PACKAGE_NAME(LPKGBUILD) - FF_TEST_PACKAGE_NAME(LINGLONG) - break; - case 'M': if (false); - FF_TEST_PACKAGE_NAME(MACPORTS) - FF_TEST_PACKAGE_NAME(MPORT) - break; - case 'N': if (false); - FF_TEST_PACKAGE_NAME(NIX) - break; - case 'O': if (false); - FF_TEST_PACKAGE_NAME(OPKG) - break; - case 'P': if (false); - FF_TEST_PACKAGE_NAME(PACMAN) - FF_TEST_PACKAGE_NAME(PACSTALL) - FF_TEST_PACKAGE_NAME(PALUDIS) - FF_TEST_PACKAGE_NAME(PISI) - FF_TEST_PACKAGE_NAME(PKG) - FF_TEST_PACKAGE_NAME(PKGTOOL) - FF_TEST_PACKAGE_NAME(PKGSRC) - break; - case 'R': if (false); - FF_TEST_PACKAGE_NAME(RPM) - break; - case 'S': if (false); - FF_TEST_PACKAGE_NAME(SCOOP) - FF_TEST_PACKAGE_NAME(SNAP) - FF_TEST_PACKAGE_NAME(SOAR) - FF_TEST_PACKAGE_NAME(SORCERY) - break; - case 'W': if (false); - FF_TEST_PACKAGE_NAME(WINGET) - break; - case 'X': if (false); - FF_TEST_PACKAGE_NAME(XBPS) - break; - } - #undef FF_TEST_PACKAGE_NAME - - if (end) - { - start = end + 1; - end = strchr(start, ':'); - } - else - break; - } - - return true; - } - - if (ffStrEqualsIgnCase(subKey, "combined")) - { - options->combined = ffOptionParseBoolean(value); - return true; - } - - return false; -} - void ffParsePackagesJsonObject(FFPackagesOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -545,7 +434,6 @@ void ffGeneratePackagesJsonResult(FF_MAYBE_UNUSED FFPackagesOptions* options, yy static FFModuleBaseInfo ffModuleInfo = { .name = FF_PACKAGES_MODULE_NAME, .description = "List installed package managers and count of installed packages", - .parseCommandOptions = (void*) ffParsePackagesCommandOptions, .parseJsonObject = (void*) ffParsePackagesJsonObject, .printModule = (void*) ffPrintPackages, .generateJsonResult = (void*) ffGeneratePackagesJsonResult, diff --git a/src/modules/physicaldisk/physicaldisk.c b/src/modules/physicaldisk/physicaldisk.c index 53ca43a27..79be411cb 100644 --- a/src/modules/physicaldisk/physicaldisk.c +++ b/src/modules/physicaldisk/physicaldisk.c @@ -133,25 +133,6 @@ void ffPrintPhysicalDisk(FFPhysicalDiskOptions* options) } } -bool ffParsePhysicalDiskCommandOptions(FFPhysicalDiskOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_PHYSICALDISK_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "name-prefix")) - { - ffOptionParseString(key, value, &options->namePrefix); - return true; - } - - if (ffTempsParseCommandOptions(key, subKey, value, &options->temp, &options->tempConfig)) - return true; - - return false; -} - void ffParsePhysicalDiskJsonObject(FFPhysicalDiskOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -248,7 +229,6 @@ void ffGeneratePhysicalDiskJsonResult(FFPhysicalDiskOptions* options, yyjson_mut static FFModuleBaseInfo ffModuleInfo = { .name = FF_PHYSICALDISK_MODULE_NAME, .description = "Print physical disk information", - .parseCommandOptions = (void*) ffParsePhysicalDiskCommandOptions, .parseJsonObject = (void*) ffParsePhysicalDiskJsonObject, .printModule = (void*) ffPrintPhysicalDisk, .generateJsonResult = (void*) ffGeneratePhysicalDiskJsonResult, diff --git a/src/modules/physicalmemory/physicalmemory.c b/src/modules/physicalmemory/physicalmemory.c index 340bc551e..e36ceaa64 100644 --- a/src/modules/physicalmemory/physicalmemory.c +++ b/src/modules/physicalmemory/physicalmemory.c @@ -80,16 +80,6 @@ void ffPrintPhysicalMemory(FFPhysicalMemoryOptions* options) } } -bool ffParsePhysicalMemoryCommandOptions(FFPhysicalMemoryOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_PHYSICALMEMORY_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParsePhysicalMemoryJsonObject(FFPhysicalMemoryOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -152,7 +142,6 @@ void ffGeneratePhysicalMemoryJsonResult(FF_MAYBE_UNUSED FFPhysicalMemoryOptions* static FFModuleBaseInfo ffModuleInfo = { .name = FF_PHYSICALMEMORY_MODULE_NAME, .description = "Print system physical memory devices", - .parseCommandOptions = (void*) ffParsePhysicalMemoryCommandOptions, .parseJsonObject = (void*) ffParsePhysicalMemoryJsonObject, .printModule = (void*) ffPrintPhysicalMemory, .generateJsonConfig = (void*) ffGeneratePhysicalMemoryJsonConfig, diff --git a/src/modules/player/player.c b/src/modules/player/player.c index 6d6dea813..2c7aaac97 100644 --- a/src/modules/player/player.c +++ b/src/modules/player/player.c @@ -81,16 +81,6 @@ void ffPrintPlayer(FFPlayerOptions* options) } } -bool ffParsePlayerCommandOptions(FFPlayerOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_PLAYER_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParsePlayerJsonObject(FFPlayerOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -120,7 +110,6 @@ void ffGeneratePlayerJsonResult(FF_MAYBE_UNUSED FFMediaOptions* options, yyjson_ static FFModuleBaseInfo ffModuleInfo = { .name = FF_PLAYER_MODULE_NAME, .description = "Print music player name", - .parseCommandOptions = (void*) ffParsePlayerCommandOptions, .parseJsonObject = (void*) ffParsePlayerJsonObject, .printModule = (void*) ffPrintPlayer, .generateJsonResult = (void*) ffGeneratePlayerJsonResult, diff --git a/src/modules/poweradapter/poweradapter.c b/src/modules/poweradapter/poweradapter.c index de2a36e39..8f33d6ae8 100644 --- a/src/modules/poweradapter/poweradapter.c +++ b/src/modules/poweradapter/poweradapter.c @@ -56,16 +56,6 @@ void ffPrintPowerAdapter(FFPowerAdapterOptions* options) } } -bool ffParsePowerAdapterCommandOptions(FFPowerAdapterOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_POWERADAPTER_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffGeneratePowerAdapterJsonConfig(FFPowerAdapterOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { __attribute__((__cleanup__(ffDestroyPowerAdapterOptions))) FFPowerAdapterOptions defaultOptions; @@ -124,7 +114,6 @@ void ffGeneratePowerAdapterJsonResult(FF_MAYBE_UNUSED FFPowerAdapterOptions* opt static FFModuleBaseInfo ffModuleInfo = { .name = FF_POWERADAPTER_MODULE_NAME, .description = "Print power adapter name and charging watts", - .parseCommandOptions = (void*) ffParsePowerAdapterCommandOptions, .parseJsonObject = (void*) ffParsePowerAdapterJsonObject, .printModule = (void*) ffPrintPowerAdapter, .generateJsonResult = (void*) ffGeneratePowerAdapterJsonResult, diff --git a/src/modules/processes/processes.c b/src/modules/processes/processes.c index bf272e97d..0c79b4d27 100644 --- a/src/modules/processes/processes.c +++ b/src/modules/processes/processes.c @@ -29,16 +29,6 @@ void ffPrintProcesses(FFProcessesOptions* options) } } -bool ffParseProcessesCommandOptions(FFProcessesOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_PROCESSES_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseProcessesJsonObject(FFProcessesOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -77,7 +67,6 @@ void ffGenerateProcessesJsonResult(FF_MAYBE_UNUSED FFProcessesOptions* options, static FFModuleBaseInfo ffModuleInfo = { .name = FF_PROCESSES_MODULE_NAME, .description = "Print number of running processes", - .parseCommandOptions = (void*) ffParseProcessesCommandOptions, .parseJsonObject = (void*) ffParseProcessesJsonObject, .printModule = (void*) ffPrintProcesses, .generateJsonResult = (void*) ffGenerateProcessesJsonResult, diff --git a/src/modules/publicip/publicip.c b/src/modules/publicip/publicip.c index 16bdfd6ac..2dbee34ba 100644 --- a/src/modules/publicip/publicip.c +++ b/src/modules/publicip/publicip.c @@ -39,34 +39,6 @@ void ffPrintPublicIp(FFPublicIpOptions* options) ffStrbufDestroy(&result.location); } -bool ffParsePublicIpCommandOptions(FFPublicIpOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_PUBLICIP_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "url")) - { - ffOptionParseString(key, value, &options->url); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "timeout")) - { - options->timeout = ffOptionParseUInt32(key, value); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "ipv6")) - { - options->ipv6 = ffOptionParseBoolean(value); - return true; - } - - return false; -} - void ffParsePublicIpJsonObject(FFPublicIpOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -139,7 +111,6 @@ void ffGeneratePublicIpJsonResult(FFPublicIpOptions* options, yyjson_mut_doc* do static FFModuleBaseInfo ffModuleInfo = { .name = FF_PUBLICIP_MODULE_NAME, .description = "Print your public IP address, etc", - .parseCommandOptions = (void*) ffParsePublicIpCommandOptions, .parseJsonObject = (void*) ffParsePublicIpJsonObject, .printModule = (void*) ffPrintPublicIp, .generateJsonResult = (void*) ffGeneratePublicIpJsonResult, diff --git a/src/modules/separator/separator.c b/src/modules/separator/separator.c index 16171ac50..e6bd66aa7 100644 --- a/src/modules/separator/separator.c +++ b/src/modules/separator/separator.c @@ -114,32 +114,6 @@ void ffPrintSeparator(FFSeparatorOptions* options) putchar('\n'); } -bool ffParseSeparatorCommandOptions(FFSeparatorOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_SEPARATOR_MODULE_NAME); - if (!subKey) return false; - - if (ffStrEqualsIgnCase(subKey, "string")) - { - ffOptionParseString(key, value, &options->string); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "output-color")) - { - ffOptionParseColor(value, &options->outputColor); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "length")) - { - options->length = ffOptionParseUInt32(key, value); - return true; - } - - return false; -} - void ffParseSeparatorJsonObject(FFSeparatorOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -183,7 +157,6 @@ void ffGenerateSeparatorJsonConfig(FFSeparatorOptions* options, yyjson_mut_doc* static FFModuleBaseInfo ffModuleInfo = { .name = FF_SEPARATOR_MODULE_NAME, .description = "Print a separator line", - .parseCommandOptions = (void*) ffParseSeparatorCommandOptions, .parseJsonObject = (void*) ffParseSeparatorJsonObject, .printModule = (void*) ffPrintSeparator, .generateJsonConfig = (void*) ffGenerateSeparatorJsonConfig, diff --git a/src/modules/shell/shell.c b/src/modules/shell/shell.c index 58853696e..0c9d15274 100644 --- a/src/modules/shell/shell.c +++ b/src/modules/shell/shell.c @@ -42,16 +42,6 @@ void ffPrintShell(FFShellOptions* options) } } -bool ffParseShellCommandOptions(FFShellOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_SHELL_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseShellJsonObject(FFShellOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -101,7 +91,6 @@ void ffGenerateShellJsonResult(FF_MAYBE_UNUSED FFShellOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_SHELL_MODULE_NAME, .description = "Print current shell name and version", - .parseCommandOptions = (void*) ffParseShellCommandOptions, .parseJsonObject = (void*) ffParseShellJsonObject, .printModule = (void*) ffPrintShell, .generateJsonResult = (void*) ffGenerateShellJsonResult, diff --git a/src/modules/sound/sound.c b/src/modules/sound/sound.c index 008671d1a..1f948ac95 100644 --- a/src/modules/sound/sound.c +++ b/src/modules/sound/sound.c @@ -112,30 +112,6 @@ void ffPrintSound(FFSoundOptions* options) } } -bool ffParseSoundCommandOptions(FFSoundOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_SOUND_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "sound-type")) - { - options->soundType = (FFSoundType) ffOptionParseEnum(key, value, (FFKeyValuePair[]) { - { "main", FF_SOUND_TYPE_MAIN }, - { "active", FF_SOUND_TYPE_ACTIVE }, - { "all", FF_SOUND_TYPE_ALL }, - {}, - }); - return true; - } - - if (ffPercentParseCommandOptions(key, subKey, value, &options->percent)) - return true; - - return false; -} - void ffParseSoundJsonObject(FFSoundOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -233,7 +209,6 @@ void ffGenerateSoundJsonResult(FF_MAYBE_UNUSED FFSoundOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_SOUND_MODULE_NAME, .description = "Print sound devices, volume, etc", - .parseCommandOptions = (void*) ffParseSoundCommandOptions, .parseJsonObject = (void*) ffParseSoundJsonObject, .printModule = (void*) ffPrintSound, .generateJsonResult = (void*) ffGenerateSoundJsonResult, diff --git a/src/modules/swap/swap.c b/src/modules/swap/swap.c index 45aa00683..ede68f3f7 100644 --- a/src/modules/swap/swap.c +++ b/src/modules/swap/swap.c @@ -131,25 +131,6 @@ void ffPrintSwap(FFSwapOptions* options) } } -bool ffParseSwapCommandOptions(FFSwapOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_SWAP_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffPercentParseCommandOptions(key, subKey, value, &options->percent)) - return true; - - if (ffStrEqualsIgnCase(subKey, "separate")) - { - options->separate = ffOptionParseBoolean(value); - return true; - } - - return false; -} - void ffParseSwapJsonObject(FFSwapOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -211,7 +192,6 @@ void ffGenerateSwapJsonResult(FF_MAYBE_UNUSED FFSwapOptions* options, yyjson_mut static FFModuleBaseInfo ffModuleInfo = { .name = FF_SWAP_MODULE_NAME, .description = "Print swap (paging file) space usage", - .parseCommandOptions = (void*) ffParseSwapCommandOptions, .parseJsonObject = (void*) ffParseSwapJsonObject, .printModule = (void*) ffPrintSwap, .generateJsonResult = (void*) ffGenerateSwapJsonResult, diff --git a/src/modules/terminal/terminal.c b/src/modules/terminal/terminal.c index 852fe43e3..febbfba3e 100644 --- a/src/modules/terminal/terminal.c +++ b/src/modules/terminal/terminal.c @@ -38,16 +38,6 @@ void ffPrintTerminal(FFTerminalOptions* options) } } -bool ffParseTerminalCommandOptions(FFTerminalOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_TERMINAL_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseTerminalJsonObject(FFTerminalOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -94,7 +84,6 @@ void ffGenerateTerminalJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options, yy static FFModuleBaseInfo ffModuleInfo = { .name = FF_TERMINAL_MODULE_NAME, .description = "Print current terminal name and version", - .parseCommandOptions = (void*) ffParseTerminalCommandOptions, .parseJsonObject = (void*) ffParseTerminalJsonObject, .printModule = (void*) ffPrintTerminal, .generateJsonResult = (void*) ffGenerateTerminalJsonResult, diff --git a/src/modules/terminalfont/terminalfont.c b/src/modules/terminalfont/terminalfont.c index 9949ab533..837e5ac3b 100644 --- a/src/modules/terminalfont/terminalfont.c +++ b/src/modules/terminalfont/terminalfont.c @@ -46,16 +46,6 @@ void ffPrintTerminalFont(FFTerminalFontOptions* options) ffFontDestroy(&terminalFont.fallback); } -bool ffParseTerminalFontCommandOptions(FFTerminalFontOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_TERMINALFONT_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseTerminalFontJsonObject(FFTerminalFontOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -119,7 +109,6 @@ void ffGenerateTerminalFontJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options static FFModuleBaseInfo ffModuleInfo = { .name = FF_TERMINALFONT_MODULE_NAME, .description = "Print font name and size used by current terminal", - .parseCommandOptions = (void*) ffParseTerminalFontCommandOptions, .parseJsonObject = (void*) ffParseTerminalFontJsonObject, .printModule = (void*) ffPrintTerminalFont, .generateJsonResult = (void*) ffGenerateTerminalFontJsonResult, diff --git a/src/modules/terminalsize/terminalsize.c b/src/modules/terminalsize/terminalsize.c index e89155b42..f36ec7d5b 100644 --- a/src/modules/terminalsize/terminalsize.c +++ b/src/modules/terminalsize/terminalsize.c @@ -38,16 +38,6 @@ void ffPrintTerminalSize(FFTerminalSizeOptions* options) } } -bool ffParseTerminalSizeCommandOptions(FFTerminalSizeOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_TERMINALSIZE_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseTerminalSizeJsonObject(FFTerminalSizeOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -89,7 +79,6 @@ void ffGenerateTerminalSizeJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options static FFModuleBaseInfo ffModuleInfo = { .name = FF_TERMINALSIZE_MODULE_NAME, .description = "Print current terminal size", - .parseCommandOptions = (void*) ffParseTerminalSizeCommandOptions, .parseJsonObject = (void*) ffParseTerminalSizeJsonObject, .printModule = (void*) ffPrintTerminalSize, .generateJsonResult = (void*) ffGenerateTerminalSizeJsonResult, diff --git a/src/modules/terminaltheme/terminaltheme.c b/src/modules/terminaltheme/terminaltheme.c index a0f561fa1..cc4e901e5 100644 --- a/src/modules/terminaltheme/terminaltheme.c +++ b/src/modules/terminaltheme/terminaltheme.c @@ -43,16 +43,6 @@ void ffPrintTerminalTheme(FFTerminalThemeOptions* options) } } -bool ffParseTerminalThemeCommandOptions(FFTerminalThemeOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_TERMINALTHEME_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseTerminalThemeJsonObject(FFTerminalThemeOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -102,7 +92,6 @@ void ffGenerateTerminalThemeJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* option static FFModuleBaseInfo ffModuleInfo = { .name = FF_TERMINALTHEME_MODULE_NAME, .description = "Print current terminal theme (foreground and background colors)", - .parseCommandOptions = (void*) ffParseTerminalThemeCommandOptions, .parseJsonObject = (void*) ffParseTerminalThemeJsonObject, .printModule = (void*) ffPrintTerminalTheme, .generateJsonResult = (void*) ffGenerateTerminalThemeJsonResult, diff --git a/src/modules/theme/theme.c b/src/modules/theme/theme.c index 48975e5c9..ca78bc7c1 100644 --- a/src/modules/theme/theme.c +++ b/src/modules/theme/theme.c @@ -43,16 +43,6 @@ void ffPrintTheme(FFThemeOptions* options) ffStrbufDestroy(&result.theme2); } -bool ffParseThemeCommandOptions(FFThemeOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_THEME_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseThemeJsonObject(FFThemeOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -99,7 +89,6 @@ void ffGenerateThemeJsonResult(FF_MAYBE_UNUSED FFThemeOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_THEME_MODULE_NAME, .description = "Print current theme of desktop environment", - .parseCommandOptions = (void*) ffParseThemeCommandOptions, .parseJsonObject = (void*) ffParseThemeJsonObject, .printModule = (void*) ffPrintTheme, .generateJsonResult = (void*) ffGenerateThemeJsonResult, diff --git a/src/modules/title/title.c b/src/modules/title/title.c index 3f033d856..dc5ad2920 100644 --- a/src/modules/title/title.c +++ b/src/modules/title/title.c @@ -68,40 +68,6 @@ void ffPrintTitle(FFTitleOptions* options) } } -bool ffParseTitleCommandOptions(FFTitleOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_TITLE_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "fqdn")) - { - options->fqdn = ffOptionParseBoolean(value); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "color-user")) - { - ffOptionParseColor(value, &options->colorUser); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "color-at")) - { - ffOptionParseColor(value, &options->colorAt); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "color-host")) - { - ffOptionParseColor(value, &options->colorHost); - return true; - } - - return false; -} - void ffParseTitleJsonObject(FFTitleOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -177,7 +143,6 @@ void ffGenerateTitleJsonResult(FF_MAYBE_UNUSED FFTitleOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_TITLE_MODULE_NAME, .description = "Print title, which contains your user name, hostname", - .parseCommandOptions = (void*) ffParseTitleCommandOptions, .parseJsonObject = (void*) ffParseTitleJsonObject, .printModule = (void*) ffPrintTitle, .generateJsonResult = (void*) ffGenerateTitleJsonResult, diff --git a/src/modules/tpm/tpm.c b/src/modules/tpm/tpm.c index 64df1ff66..b29a240aa 100644 --- a/src/modules/tpm/tpm.c +++ b/src/modules/tpm/tpm.c @@ -38,16 +38,6 @@ void ffPrintTPM(FFTPMOptions* options) ffStrbufDestroy(&result.description); } -bool ffParseTPMCommandOptions(FFTPMOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_TPM_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseTPMJsonObject(FFTPMOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -94,7 +84,6 @@ void ffGenerateTPMJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options, yyjson_ static FFModuleBaseInfo ffModuleInfo = { .name = FF_TPM_MODULE_NAME, .description = "Print info of Trusted Platform Module (TPM) Security Device", - .parseCommandOptions = (void*) ffParseTPMCommandOptions, .parseJsonObject = (void*) ffParseTPMJsonObject, .printModule = (void*) ffPrintTPM, .generateJsonResult = (void*) ffGenerateTPMJsonResult, diff --git a/src/modules/uptime/uptime.c b/src/modules/uptime/uptime.c index 224725ed7..fa2b11d8a 100644 --- a/src/modules/uptime/uptime.c +++ b/src/modules/uptime/uptime.c @@ -56,16 +56,6 @@ void ffPrintUptime(FFUptimeOptions* options) } } -bool ffParseUptimeCommandOptions(FFUptimeOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_UPTIME_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseUptimeJsonObject(FFUptimeOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -106,7 +96,6 @@ void ffGenerateUptimeJsonResult(FF_MAYBE_UNUSED FFUptimeOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_UPTIME_MODULE_NAME, .description = "Print how long system has been running", - .parseCommandOptions = (void*) ffParseUptimeCommandOptions, .parseJsonObject = (void*) ffParseUptimeJsonObject, .printModule = (void*) ffPrintUptime, .generateJsonResult = (void*) ffGenerateUptimeJsonResult, diff --git a/src/modules/users/users.c b/src/modules/users/users.c index 435c35ac1..f1137b1c1 100644 --- a/src/modules/users/users.c +++ b/src/modules/users/users.c @@ -107,28 +107,6 @@ void ffPrintUsers(FFUsersOptions* options) } } -bool ffParseUsersCommandOptions(FFUsersOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_USERS_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "compact")) - { - options->compact = ffOptionParseBoolean(value); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "myself-only")) - { - options->myselfOnly = ffOptionParseBoolean(value); - return true; - } - - return false; -} - void ffParseUsersJsonObject(FFUsersOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -210,7 +188,6 @@ void ffGenerateUsersJsonResult(FFUsersOptions* options, yyjson_mut_doc* doc, yyj static FFModuleBaseInfo ffModuleInfo = { .name = FF_USERS_MODULE_NAME, .description = "Print users currently logged in", - .parseCommandOptions = (void*) ffParseUsersCommandOptions, .parseJsonObject = (void*) ffParseUsersJsonObject, .printModule = (void*) ffPrintUsers, .generateJsonResult = (void*) ffGenerateUsersJsonResult, diff --git a/src/modules/version/version.c b/src/modules/version/version.c index d7db250b5..6b86e0dbd 100644 --- a/src/modules/version/version.c +++ b/src/modules/version/version.c @@ -44,16 +44,6 @@ void ffPrintVersion(FFVersionOptions* options) } } -bool ffParseVersionCommandOptions(FFVersionOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_VERSION_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseVersionJsonObject(FFVersionOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -110,7 +100,6 @@ void ffGenerateVersionJsonResult(FF_MAYBE_UNUSED FFVersionOptions* options, yyjs static FFModuleBaseInfo ffModuleInfo = { .name = FF_VERSION_MODULE_NAME, .description = "Print Fastfetch version", - .parseCommandOptions = (void*) ffParseVersionCommandOptions, .parseJsonObject = (void*) ffParseVersionJsonObject, .printModule = (void*) ffPrintVersion, .generateJsonResult = (void*) ffGenerateVersionJsonResult, diff --git a/src/modules/vulkan/vulkan.c b/src/modules/vulkan/vulkan.c index f74c15c34..f67f549a9 100644 --- a/src/modules/vulkan/vulkan.c +++ b/src/modules/vulkan/vulkan.c @@ -50,16 +50,6 @@ void ffPrintVulkan(FFVulkanOptions* options) } } -bool ffParseVulkanCommandOptions(FFVulkanOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_VULKAN_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseVulkanJsonObject(FFVulkanOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -141,7 +131,6 @@ void ffGenerateVulkanJsonResult(FF_MAYBE_UNUSED FFVulkanOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_VULKAN_MODULE_NAME, .description = "Print highest Vulkan version supported by the GPU", - .parseCommandOptions = (void*) ffParseVulkanCommandOptions, .parseJsonObject = (void*) ffParseVulkanJsonObject, .printModule = (void*) ffPrintVulkan, .generateJsonResult = (void*) ffGenerateVulkanJsonResult, diff --git a/src/modules/wallpaper/wallpaper.c b/src/modules/wallpaper/wallpaper.c index 997c2473a..8635bf325 100644 --- a/src/modules/wallpaper/wallpaper.c +++ b/src/modules/wallpaper/wallpaper.c @@ -40,16 +40,6 @@ void ffPrintWallpaper(FFWallpaperOptions* options) } } -bool ffParseWallpaperCommandOptions(FFWallpaperOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_WALLPAPER_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseWallpaperJsonObject(FFWallpaperOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -86,7 +76,6 @@ void ffGenerateWallpaperJsonResult(FF_MAYBE_UNUSED FFWallpaperOptions* options, static FFModuleBaseInfo ffModuleInfo = { .name = FF_WALLPAPER_MODULE_NAME, .description = "Print image file path of current wallpaper", - .parseCommandOptions = (void*) ffParseWallpaperCommandOptions, .parseJsonObject = (void*) ffParseWallpaperJsonObject, .printModule = (void*) ffPrintWallpaper, .generateJsonResult = (void*) ffGenerateWallpaperJsonResult, diff --git a/src/modules/weather/weather.c b/src/modules/weather/weather.c index 03761d391..aef1e26e9 100644 --- a/src/modules/weather/weather.c +++ b/src/modules/weather/weather.c @@ -29,34 +29,6 @@ void ffPrintWeather(FFWeatherOptions* options) } } -bool ffParseWeatherCommandOptions(FFWeatherOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_WEATHER_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "location")) - { - ffOptionParseString(key, value, &options->location); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "output-format")) - { - ffOptionParseString(key, value, &options->outputFormat); - return true; - } - - if (ffStrEqualsIgnCase(subKey, "timeout")) - { - options->timeout = ffOptionParseUInt32(key, value); - return true; - } - - return false; -} - void ffParseWeatherJsonObject(FFWeatherOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -122,7 +94,6 @@ void ffGenerateWeatherJsonResult(FFWeatherOptions* options, yyjson_mut_doc* doc, static FFModuleBaseInfo ffModuleInfo = { .name = FF_WEATHER_MODULE_NAME, .description = "Print weather information", - .parseCommandOptions = (void*) ffParseWeatherCommandOptions, .parseJsonObject = (void*) ffParseWeatherJsonObject, .printModule = (void*) ffPrintWeather, .generateJsonResult = (void*) ffGenerateWeatherJsonResult, diff --git a/src/modules/wifi/wifi.c b/src/modules/wifi/wifi.c index 6f52c0271..ec5aaf18f 100644 --- a/src/modules/wifi/wifi.c +++ b/src/modules/wifi/wifi.c @@ -136,19 +136,6 @@ void ffPrintWifi(FFWifiOptions* options) } } -bool ffParseWifiCommandOptions(FFWifiOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_WIFI_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffPercentParseCommandOptions(key, subKey, value, &options->percent)) - return true; - - return false; -} - void ffParseWifiJsonObject(FFWifiOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -222,7 +209,6 @@ void ffGenerateWifiJsonResult(FF_MAYBE_UNUSED FFWifiOptions* options, yyjson_mut static FFModuleBaseInfo ffModuleInfo = { .name = FF_WIFI_MODULE_NAME, .description = "Print connected Wi-Fi info (SSID, connection and security protocol)", - .parseCommandOptions = (void*) ffParseWifiCommandOptions, .parseJsonObject = (void*) ffParseWifiJsonObject, .printModule = (void*) ffPrintWifi, .generateJsonResult = (void*) ffGenerateWifiJsonResult, diff --git a/src/modules/wm/wm.c b/src/modules/wm/wm.c index cb3a64232..46a73e4a4 100644 --- a/src/modules/wm/wm.c +++ b/src/modules/wm/wm.c @@ -63,22 +63,6 @@ void ffPrintWM(FFWMOptions* options) } } -bool ffParseWMCommandOptions(FFWMOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_WM_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffStrEqualsIgnCase(subKey, "detect-plugin")) - { - options->detectPlugin = ffOptionParseBoolean(value); - return true; - } - - return false; -} - void ffParseWMJsonObject(FFWMOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -138,7 +122,6 @@ void ffGenerateWMJsonResult(FF_MAYBE_UNUSED FFWMOptions* options, yyjson_mut_doc static FFModuleBaseInfo ffModuleInfo = { .name = FF_WM_MODULE_NAME, .description = "Print window manager name and version", - .parseCommandOptions = (void*) ffParseWMCommandOptions, .parseJsonObject = (void*) ffParseWMJsonObject, .printModule = (void*) ffPrintWM, .generateJsonResult = (void*) ffGenerateWMJsonResult, diff --git a/src/modules/wmtheme/wmtheme.c b/src/modules/wmtheme/wmtheme.c index a3830dace..f5d425f51 100644 --- a/src/modules/wmtheme/wmtheme.c +++ b/src/modules/wmtheme/wmtheme.c @@ -29,16 +29,6 @@ void ffPrintWMTheme(FFWMThemeOptions* options) } } -bool ffParseWMThemeCommandOptions(FFWMThemeOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_WMTHEME_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - return false; -} - void ffParseWMThemeJsonObject(FFWMThemeOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -75,7 +65,6 @@ void ffGenerateWMThemeJsonResult(FF_MAYBE_UNUSED FFWMThemeOptions* options, yyjs static FFModuleBaseInfo ffModuleInfo = { .name = FF_WMTHEME_MODULE_NAME, .description = "Print current theme of window manager", - .parseCommandOptions = (void*) ffParseWMThemeCommandOptions, .parseJsonObject = (void*) ffParseWMThemeJsonObject, .printModule = (void*) ffPrintWMTheme, .generateJsonResult = (void*) ffGenerateWMThemeJsonResult, diff --git a/src/modules/zpool/zpool.c b/src/modules/zpool/zpool.c index ba110a607..b88b6c7a0 100644 --- a/src/modules/zpool/zpool.c +++ b/src/modules/zpool/zpool.c @@ -107,19 +107,6 @@ void ffPrintZpool(FFZpoolOptions* options) } } -bool ffParseZpoolCommandOptions(FFZpoolOptions* options, const char* key, const char* value) -{ - const char* subKey = ffOptionTestPrefix(key, FF_ZPOOL_MODULE_NAME); - if (!subKey) return false; - if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) - return true; - - if (ffPercentParseCommandOptions(key, subKey, value, &options->percent)) - return true; - - return false; -} - void ffParseZpoolJsonObject(FFZpoolOptions* options, yyjson_val* module) { yyjson_val *key, *val; @@ -180,7 +167,6 @@ void ffGenerateZpoolJsonResult(FF_MAYBE_UNUSED FFZpoolOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_ZPOOL_MODULE_NAME, .description = "Print ZFS storage pools", - .parseCommandOptions = (void*) ffParseZpoolCommandOptions, .parseJsonObject = (void*) ffParseZpoolJsonObject, .printModule = (void*) ffPrintZpool, .generateJsonResult = (void*) ffGenerateZpoolJsonResult, From c491c9e8fc0c5c3aed90948c89a2b55c93e742c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 3 Aug 2025 09:31:38 +0800 Subject: [PATCH 19/83] Display: add `compactMode: null`; improve json schema --- doc/json_schema.json | 23 ++++++++++++++++++----- src/modules/display/display.c | 25 +++++++++++++++---------- 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/doc/json_schema.json b/doc/json_schema.json index d89acd532..d7baa0735 100644 --- a/doc/json_schema.json +++ b/doc/json_schema.json @@ -2067,12 +2067,25 @@ }, "order": { "description": "Set the order should be used when printing", - "enum": [ - "none", - "asc", - "desc" + "oneOf": [ + { + "const": null, + "description": "Use the default order" + }, + { + "const": "none", + "description": "Use the detected order (kept for compatibility)" + }, + { + "const": "asc", + "description": "Sort by display name in ascending order" + }, + { + "const": "desc", + "description": "Sort by display name in descending order" + } ], - "default": "none" + "default": null }, "key": { "$ref": "#/$defs/key" diff --git a/src/modules/display/display.c b/src/modules/display/display.c index d60876572..71cb4adad 100644 --- a/src/modules/display/display.c +++ b/src/modules/display/display.c @@ -257,17 +257,22 @@ void ffParseDisplayJsonObject(FFDisplayOptions* options, yyjson_val* module) if (unsafe_yyjson_equals_str(key, "order")) { - int value; - const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { - { "asc", FF_DISPLAY_ORDER_ASC }, - { "desc", FF_DISPLAY_ORDER_DESC }, - { "none", FF_DISPLAY_ORDER_NONE }, - {}, - }); - if (error) - ffPrintError(FF_DISPLAY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", unsafe_yyjson_get_str(key), error); + if (yyjson_is_null(val)) + options->order = FF_DISPLAY_ORDER_NONE; else - options->order = (FFDisplayOrder) value; + { + int value; + const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { + { "asc", FF_DISPLAY_ORDER_ASC }, + { "desc", FF_DISPLAY_ORDER_DESC }, + { "none", FF_DISPLAY_ORDER_NONE }, + {}, + }); + if (error) + ffPrintError(FF_DISPLAY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", unsafe_yyjson_get_str(key), error); + else + options->order = (FFDisplayOrder) value; + } continue; } From dd4f006b5f57ad6f7f8bde3335ba709f7d8d2b18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 3 Aug 2025 10:14:53 +0800 Subject: [PATCH 20/83] GPU: support `"hideType": null` --- src/modules/gpu/gpu.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/modules/gpu/gpu.c b/src/modules/gpu/gpu.c index b608dc300..58392af1e 100644 --- a/src/modules/gpu/gpu.c +++ b/src/modules/gpu/gpu.c @@ -240,18 +240,23 @@ void ffParseGPUJsonObject(FFGPUOptions* options, yyjson_val* module) if (unsafe_yyjson_equals_str(key, "hideType")) { - int value; - const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { - { "none", FF_GPU_TYPE_NONE }, - { "unknown", FF_GPU_TYPE_UNKNOWN }, - { "integrated", FF_GPU_TYPE_INTEGRATED }, - { "discrete", FF_GPU_TYPE_DISCRETE }, - {}, - }); - if (error) - ffPrintError(FF_GPU_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", unsafe_yyjson_get_str(key), error); + if (yyjson_is_null(val)) + options->hideType = FF_GPU_TYPE_NONE; else - options->hideType = (FFGPUType) value; + { + int value; + const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { + { "none", FF_GPU_TYPE_NONE }, + { "unknown", FF_GPU_TYPE_UNKNOWN }, + { "integrated", FF_GPU_TYPE_INTEGRATED }, + { "discrete", FF_GPU_TYPE_DISCRETE }, + {}, + }); + if (error) + ffPrintError(FF_GPU_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Invalid %s value: %s", unsafe_yyjson_get_str(key), error); + else + options->hideType = (FFGPUType) value; + } continue; } From badae2ba9dcc9f2ad76c5717dac5464eaa6b089f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 3 Aug 2025 10:16:46 +0800 Subject: [PATCH 21/83] JsonSchema: Improves JSON schema enums with oneOf objects containing descriptive explanations for allowed values --- doc/json_schema.json | 361 +++++++++++++++++++++++++++++++++---------- 1 file changed, 276 insertions(+), 85 deletions(-) diff --git a/doc/json_schema.json b/doc/json_schema.json index d7baa0735..b8fce5a35 100644 --- a/doc/json_schema.json +++ b/doc/json_schema.json @@ -559,23 +559,67 @@ "properties": { "type": { "description": "Set the type of the logo", - "enum": [ - "auto", - "builtin", - "small", - "file", - "file-raw", - "data", - "data-raw", - "command-raw", - "sixel", - "kitty", - "kitty-direct", - "kitty-icat", - "iterm", - "chafa", - "raw", - "none" + "oneOf": [ + { + "const": "auto", + "description": "If something is given, first try built-in, then file. Otherwise detect logo" + }, + { + "const": "builtin", + "description": "Built-in ASCII art" + }, + { + "const": "small", + "description": "Built-in ASCII art, small version (not all logos support this option)" + }, + { + "const": "file", + "description": "Text file, printed with color code replacement" + }, + { + "const": "file-raw", + "description": "Text file, printed as is" + }, + { + "const": "data", + "description": "Text data, printed with color code replacement" + }, + { + "const": "data-raw", + "description": "Text data, printed as is" + }, + { + "const": "sixel", + "description": "Image file, printed as sixel codes" + }, + { + "const": "kitty", + "description": "Image file, printed using kitty graphics protocol" + }, + { + "const": "kitty-direct", + "description": "Image file, tells the terminal emulator to read image data from the specified file" + }, + { + "const": "kitty-icat", + "description": "Image file, uses `kitten icat` to display the image. Requires binary `kitten` to be installed" + }, + { + "const": "iterm", + "description": "Image file, uses `iTerm` image protocol" + }, + { + "const": "chafa", + "description": "Image file, prints `ASCII` art image generated by `libchafa`" + }, + { + "const": "raw", + "description": "Image file, printed as `raw` binary string image" + }, + { + "const": "none", + "description": "Disable logo printing" + } ], "default": "auto" }, @@ -700,32 +744,71 @@ "canvasMode": { "type": "string", "description": "Determine how colors are used in the output. This value maps to enum ChafaCanvasMode.", - "enum": [ - "TRUECOLOR", - "INDEXED_256", - "INDEXED_240", - "INDEXED_16", - "FGBG_BGFG", - "FGBG", - "INDEXED_8", - "INDEXED_16_8" + "oneOf": [ + { + "const": "TRUECOLOR", + "description": "Use 24-bit true colors" + }, + { + "const": "INDEXED_256", + "description": "Use 256 colors" + }, + { + "const": "INDEXED_240", + "description": "Use 240 colors, but avoid using the lower 16 whose values vary between terminal environments" + }, + { + "const": "INDEXED_16", + "description": "Use 16 colors using the aixterm ANSI extension" + }, + { + "const": "FGBG_BGFG", + "description": "Use default foreground and background colors, plus inversion" + }, + { + "const": "FGBG", + "description": "Use default foreground and background colors. No ANSI codes will be used" + }, + { + "const": "INDEXED_8", + "description": "Use 8 colors, compatible with original ANSI X3.64" + }, + { + "const": "INDEXED_16_8", + "description": "Use 16 FG colors (8 of which enabled with bold/bright) and 8 BG colors" + } ] }, "colorSpace": { "type": "string", "description": "Set color space used for quantization. This value maps to enum ChafaColorSpace.", - "enum": [ - "RGB", - "DIN99D" + "oneOf": [ + { + "const": "RGB", + "description": "RGB color space. Fast but imprecise" + }, + { + "const": "DIN99D", + "description": "DIN99d color space. Slower, but good perceptual color precision" + } ] }, "ditherMode": { "type": "string", "description": "Set output dither mode (No effect with 24-bit color). This value maps to enum ChafaDitherMode.", - "enum": [ - "NONE", - "ORDERED", - "DIFFUSION" + "oneOf": [ + { + "const": "NONE", + "description": "No dithering" + }, + { + "const": "ORDERED", + "description": "Ordered dithering (Bayer or similar)" + }, + { + "const": "DIFFUSION", + "description": "Error diffusion dithering (Floyd-Steinberg or similar)" + } ] } } @@ -889,11 +972,23 @@ "type": { "type": "string", "description": "Set whether to show icon before string keys", - "enum": [ - "none", - "string", - "icon", - "both" + "oneOf": [ + { + "const": "none", + "description": "Disable keys" + }, + { + "const": "string", + "description": "Show string keys" + }, + { + "const": "icon", + "description": "Show icon keys (requires newest nerd font)" + }, + { + "const": "both", + "description": "Show both icon and string keys" + } ], "default": "string" }, @@ -955,7 +1050,24 @@ "unit": { "type": "string", "description": "Set the unit of temperature", - "enum": ["D", "Default", "Celsius", "C", "Fahrenheit", "F", "Kelvin", "K"], + "oneOf": [ + { + "const": "C", + "description": "Celsius" + }, + { + "const": "F", + "description": "Fahrenheit" + }, + { + "const": "K", + "description": "Kelvin" + }, + { + "const": "D", + "description": "Default (alias for Celsius)" + } + ], "default": "D" }, "ndigits": { @@ -1821,14 +1933,35 @@ "symbol": { "description": "Set the symbol to use", "type": "string", - "enum": [ - "block", - "background", - "circle", - "diamond", - "triangle", - "square", - "star" + "oneOf": [ + { + "const": "block", + "description": "\u2588\u2588\u2588" + }, + { + "const": "background", + "description": "(whitespaces with background)" + }, + { + "const": "circle", + "description": "\u25cf" + }, + { + "const": "diamond", + "description": "\u25c6" + }, + { + "const": "triangle", + "description": "\u25b2" + }, + { + "const": "square", + "description": "\u25a0" + }, + { + "const": "star", + "description": "\u2605" + } ], "default": "background" }, @@ -1887,7 +2020,7 @@ "type": "string" }, "param": { - "description": "Set the parameter used when starting the shell\nDefault: /c for Windows, -c for *nix", + "description": "Set the parameter used when starting the shell\nIf set to an empty string, it will be ignored\nDefault: /c for Windows, -c for *nix", "type": "string" }, "text": { @@ -2251,8 +2384,8 @@ }, "slowVersionDetection": { "type": "boolean", - "description": "Set if DE version should be detected with slow operations.\nShould be unnecessary for most cases.", - "default": "false" + "description": "Set if DE version should be detected with slow operations.\nShould be unnecessary for most cases.\nThis is only used as a fallback method. Please file a bug report if you encounter any issues.", + "default": false }, "key": { "$ref": "#/$defs/key" @@ -2287,10 +2420,19 @@ "description": "Print DNS servers" }, "showType": { - "enum": [ - "ipv4", - "ipv6", - "both" + "oneOf": [ + { + "const": "ipv4", + "description": "Show IPv4 addresses only" + }, + { + "const": "ipv6", + "description": "Show IPv6 addresses only" + }, + { + "const": "both", + "description": "Show both IPv4 and IPv6 addresses" + } ], "default": "both", "description": "Specify the type of DNS servers should be detected" @@ -2436,31 +2578,62 @@ "$ref": "#/$defs/temperature" }, "driverSpecific": { - "description": "Use driver specific method to detect more detailed GPU information (memory usage, core count, etc)", + "description": "Use driver specific method to detect more detailed GPU information (memory usage, core count, etc)\nRequires the latest GPU drivers to be installed.", "type": "boolean", "default": false }, "detectionMethod": { "description": "Force using a specified method to detect GPUs", "type": "string", - "enum": [ - "auto", - "pci", - "vulkan", - "opencl", - "opengl" + "oneOf": [ + { + "const": "auto", + "description": "Query platform-specific graphics APIs.\nRequires proper GPU drivers to be installed.\nSupported on Linux, FreeBSD, Windows and macOS" + }, + { + "const": "pci", + "description": "Search PCI devices, which does not require GPU drivers to be installed.\nNot supported on Windows and macOS" + }, + { + "const": "vulkan", + "description": "Use Vulkan API.\nSlow and requires proper Vulkan drivers to be installed.\nUsed for Android" + }, + { + "const": "opencl", + "description": "Use OpenCL API.\nSlow and requires proper OpenCL drivers to be installed" + }, + { + "const": "opengl", + "description": "Use OpenGL API.\nSlow and only detects one GPU.\nUsed for OpenBSD" + } ], - "default": "auto" + "default": "" }, "hideType": { "description": "Specify the type of GPUs should not be printed", - "enum": [ - "integrated", - "discrete", - "unknown", - "none" + "oneOf": [ + { + "const": null, + "description": "Do not hide any GPUs" + }, + { + "const": "none", + "description": "Do not hide any GPUs (kept for compatibility)" + }, + { + "const": "integrated", + "description": "Hide integrated GPUs" + }, + { + "const": "discrete", + "description": "Hide discrete GPUs" + }, + { + "const": "unknown", + "description": "Hide unknown (unrecognized) GPUs" + } ], - "default": "none" + "default": null }, "key": { "$ref": "#/$defs/key" @@ -2719,7 +2892,7 @@ "default": true }, "showAllIps": { - "description": "Show all IPs bound to the same interface.\nBy default only the first IP is shown", + "description": "Show all IPs bound to the same interface.\nBy default only the firstly detected IP is shown", "type": "boolean", "default": false }, @@ -2738,7 +2911,7 @@ "type": "string" }, "defaultRouteOnly": { - "description": "Show ips that are used for default routing only", + "description": "Show ips that are used for default routing only\nDoesn't work on Android", "type": "boolean", "default": true }, @@ -2986,7 +3159,7 @@ "type": "string" }, "defaultRouteOnly": { - "description": "Show ips that are used for default routing only", + "description": "Show ips that are used for default routing only\nDoesn't work on Android", "type": "boolean", "default": true }, @@ -2997,7 +3170,7 @@ }, "waitTime": { "type": "integer", - "description": "Wait time (in ms). Disk I/O = (totalBytesEnd - totalBytesStart) / waitTime", + "description": "Wait time (in ms). Net I/O = (totalBytesEnd - totalBytesStart) / waitTime", "default": 200, "minimum": 1 }, @@ -3067,10 +3240,19 @@ }, "library": { "description": "Set the OpenGL context creation library to use", - "enum": [ - "auto", - "egl", - "glx" + "oneOf": [ + { + "const": "auto", + "description": "Prefer EGL on *nix; prefer platform-specific implementation on others" + }, + { + "const": "egl", + "description": "Use EGL, which works on TTY" + }, + { + "const": "glx", + "description": "Use GLX, requires X session (*nix only)" + } ], "default": "auto" }, @@ -3397,10 +3579,10 @@ "default": "http://ipinfo.io/ip" }, "timeout": { - "description": "Time in milliseconds to wait for the public ip server to respond", + "description": "Time in milliseconds to wait for the public ip server to respond.\n0 to disable timeout", "type": "integer", "minimum": 0, - "default": "disabled (0)" + "default": 0 }, "ipv6": { "description": "Whether to use IPv6 for public IP detection server", @@ -3503,10 +3685,19 @@ "soundType": { "description": "Set what type of sound devices should be printed", "type": "string", - "enum": [ - "main", - "active", - "all" + "oneOf": [ + { + "const": "main", + "description": "Print only main sound devices" + }, + { + "const": "active", + "description": "Print only active sound devices" + }, + { + "const": "all", + "description": "Print all sound devices" + } ], "default": "main" }, @@ -4004,14 +4195,14 @@ "const": "weather" }, "location": { - "description": "The location to display", + "description": "The location to display\nMust be URI encoded (e.g., a whitespace must be encoded as \"+\")", "type": "string" }, "timeout": { - "description": "Time in milliseconds to wait for the weather server to respond", + "description": "Time in milliseconds to wait for the weather server to respond.\n0 to disable timeout", "type": "integer", "minimum": 0, - "default": "disabled (0)" + "default": 0 }, "outputFormat": { "description": "The output weather format to be used (must be URI encoded)", From 9b68674c4f280b8ed57eba6b2b52851e9ba32675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 3 Aug 2025 18:18:12 +0800 Subject: [PATCH 22/83] OS (Linux): don't detect Bedrock linux when ran restricted Fix #1881 --- src/detection/os/os_linux.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/detection/os/os_linux.c b/src/detection/os/os_linux.c index 0774b9816..d845c958b 100644 --- a/src/detection/os/os_linux.c +++ b/src/detection/os/os_linux.c @@ -306,16 +306,10 @@ FF_MAYBE_UNUSED static bool detectFedoraVariant(FFOSResult* result) return false; } -static void detectOS(FFOSResult* os) +static bool detectBedrock(FFOSResult* os) { - #ifdef FF_CUSTOM_OS_RELEASE_PATH - parseOsRelease(FF_STR(FF_CUSTOM_OS_RELEASE_PATH), os); - #ifdef FF_CUSTOM_LSB_RELEASE_PATH - parseLsbRelease(FF_STR(FF_CUSTOM_LSB_RELEASE_PATH), os); - #endif - return; - #endif - + const char* bedrockRestrict = getenv("BEDROCK_RESTRICT"); + if(bedrockRestrict && bedrockRestrict[0] == '1') return false; if(parseOsRelease(FASTFETCH_TARGET_DIR_ROOT "/bedrock" FASTFETCH_TARGET_DIR_ETC "/bedrock-release", os)) { if(os->id.length == 0) @@ -328,8 +322,23 @@ static void detectOS(FFOSResult* os) ffStrbufAppendS(&os->prettyName, "Bedrock Linux"); parseOsRelease("/bedrock" FASTFETCH_TARGET_DIR_ETC "/os-release", os); - return; + return true; } + return false; +} + +static void detectOS(FFOSResult* os) +{ + #ifdef FF_CUSTOM_OS_RELEASE_PATH + parseOsRelease(FF_STR(FF_CUSTOM_OS_RELEASE_PATH), os); + #ifdef FF_CUSTOM_LSB_RELEASE_PATH + parseLsbRelease(FF_STR(FF_CUSTOM_LSB_RELEASE_PATH), os); + #endif + return; + #endif + + if (detectBedrock(os)) + return; // Refer: https://gist.github.com/natefoo/814c5bf936922dad97ff From 582268f44f9b9ac0a634cda7c5b051c0dbc45c56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 3 Aug 2025 18:19:22 +0800 Subject: [PATCH 23/83] Disk (Linux): ignore Bedrock Linux subvolumes Ref: https://github.com/fastfetch-cli/fastfetch/issues/1881#issuecomment-3148302531 --- src/detection/disk/disk_linux.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/detection/disk/disk_linux.c b/src/detection/disk/disk_linux.c index 0076c21f6..fe13c8599 100644 --- a/src/detection/disk/disk_linux.c +++ b/src/detection/disk/disk_linux.c @@ -55,6 +55,9 @@ static bool isPhysicalDevice(const struct mntent* device) ffStrStartsWith(device->mnt_fsname + 5, "fd") //Ignore fd devices ) return false; + if (ffStrStartsWith(device->mnt_dir, "/bedrock/")) // Ignore Bedrock Linux subvolumes + return false; + struct stat deviceStat; if(stat(device->mnt_fsname, &deviceStat) != 0) return false; From 6f8d276545ea2962fc17dcd9b5f3c2f37689d526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 3 Aug 2025 18:39:41 +0800 Subject: [PATCH 24/83] Modules: add init and destroy option callbacks to module info --- src/common/option.h | 2 ++ src/modules/battery/battery.c | 2 ++ src/modules/bios/bios.c | 2 ++ src/modules/bluetooth/bluetooth.c | 2 ++ src/modules/bluetoothradio/bluetoothradio.c | 2 ++ src/modules/board/board.c | 2 ++ src/modules/bootmgr/bootmgr.c | 2 ++ src/modules/break/break.c | 2 ++ src/modules/brightness/brightness.c | 2 ++ src/modules/btrfs/btrfs.c | 2 ++ src/modules/camera/camera.c | 2 ++ src/modules/chassis/chassis.c | 2 ++ src/modules/colors/colors.c | 2 ++ src/modules/command/command.c | 2 ++ src/modules/cpu/cpu.c | 2 ++ src/modules/cpucache/cpucache.c | 2 ++ src/modules/cpuusage/cpuusage.c | 2 ++ src/modules/cursor/cursor.c | 2 ++ src/modules/custom/custom.c | 2 ++ src/modules/datetime/datetime.c | 2 ++ src/modules/de/de.c | 2 ++ src/modules/disk/disk.c | 2 ++ src/modules/diskio/diskio.c | 2 ++ src/modules/display/display.c | 2 ++ src/modules/dns/dns.c | 2 ++ src/modules/editor/editor.c | 2 ++ src/modules/font/font.c | 2 ++ src/modules/gamepad/gamepad.c | 2 ++ src/modules/gpu/gpu.c | 2 ++ src/modules/host/host.c | 2 ++ src/modules/icons/icons.c | 2 ++ src/modules/initsystem/initsystem.c | 2 ++ src/modules/kernel/kernel.c | 2 ++ src/modules/keyboard/keyboard.c | 2 ++ src/modules/lm/lm.c | 2 ++ src/modules/loadavg/loadavg.c | 2 ++ src/modules/locale/locale.c | 2 ++ src/modules/localip/localip.c | 2 ++ src/modules/media/media.c | 2 ++ src/modules/memory/memory.c | 2 ++ src/modules/monitor/monitor.c | 2 ++ src/modules/mouse/mouse.c | 2 ++ src/modules/netio/netio.c | 2 ++ src/modules/opencl/opencl.c | 2 ++ src/modules/opengl/opengl.c | 2 ++ src/modules/os/os.c | 2 ++ src/modules/packages/packages.c | 2 ++ src/modules/physicaldisk/physicaldisk.c | 2 ++ src/modules/physicalmemory/physicalmemory.c | 2 ++ src/modules/player/player.c | 2 ++ src/modules/poweradapter/poweradapter.c | 2 ++ src/modules/processes/processes.c | 2 ++ src/modules/publicip/publicip.c | 2 ++ src/modules/separator/separator.c | 2 ++ src/modules/shell/shell.c | 2 ++ src/modules/sound/sound.c | 2 ++ src/modules/swap/swap.c | 2 ++ src/modules/terminal/terminal.c | 2 ++ src/modules/terminalfont/terminalfont.c | 2 ++ src/modules/terminalsize/terminalsize.c | 2 ++ src/modules/terminaltheme/terminaltheme.c | 2 ++ src/modules/theme/theme.c | 2 ++ src/modules/title/title.c | 2 ++ src/modules/tpm/tpm.c | 2 ++ src/modules/uptime/uptime.c | 2 ++ src/modules/users/users.c | 2 ++ src/modules/version/version.c | 2 ++ src/modules/vulkan/vulkan.c | 2 ++ src/modules/wallpaper/wallpaper.c | 2 ++ src/modules/weather/weather.c | 2 ++ src/modules/wifi/wifi.c | 2 ++ src/modules/wm/wm.c | 2 ++ src/modules/wmtheme/wmtheme.c | 2 ++ src/modules/zpool/zpool.c | 2 ++ 74 files changed, 148 insertions(+) diff --git a/src/common/option.h b/src/common/option.h index 0e68ec4e1..618739a5d 100644 --- a/src/common/option.h +++ b/src/common/option.h @@ -29,6 +29,8 @@ typedef struct FFModuleBaseInfo // This is UB, because `void*` is not compatible with `FF*Options*`. // However we can't do it better unless we move to C++, so that `option` becomes a `this` pointer // https://stackoverflow.com/questions/559581/casting-a-function-pointer-to-another-type + void (*initOptions)(void* options); + void (*destroyOptions)(void* options); void (*parseJsonObject)(void* options, struct yyjson_val *module); void (*printModule)(void* options); void (*generateJsonResult)(void* options, struct yyjson_mut_doc* doc, struct yyjson_mut_val* module); diff --git a/src/modules/battery/battery.c b/src/modules/battery/battery.c index 90f211760..27982c9b0 100644 --- a/src/modules/battery/battery.c +++ b/src/modules/battery/battery.c @@ -248,6 +248,8 @@ void ffGenerateBatteryJsonResult(FFBatteryOptions* options, yyjson_mut_doc* doc, static FFModuleBaseInfo ffModuleInfo = { .name = FF_BATTERY_MODULE_NAME, .description = "Print battery capacity, status, etc", + .initOptions = (void*) ffInitBatteryOptions, + .destroyOptions = (void*) ffDestroyBatteryOptions, .parseJsonObject = (void*) ffParseBatteryJsonObject, .printModule = (void*) ffPrintBattery, .generateJsonResult = (void*) ffGenerateBatteryJsonResult, diff --git a/src/modules/bios/bios.c b/src/modules/bios/bios.c index c9e758e59..bbf1a5f08 100644 --- a/src/modules/bios/bios.c +++ b/src/modules/bios/bios.c @@ -131,6 +131,8 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_BIOS_MODULE_NAME, .description = "Print information of 1st-stage bootloader (name, version, release date, etc)", + .initOptions = (void*) ffInitBiosOptions, + .destroyOptions = (void*) ffDestroyBiosOptions, .parseJsonObject = (void*) ffParseBiosJsonObject, .printModule = (void*) ffPrintBios, .generateJsonResult = (void*) ffGenerateBiosJsonResult, diff --git a/src/modules/bluetooth/bluetooth.c b/src/modules/bluetooth/bluetooth.c index 6274e8c4a..4409b0a16 100644 --- a/src/modules/bluetooth/bluetooth.c +++ b/src/modules/bluetooth/bluetooth.c @@ -166,6 +166,8 @@ void ffGenerateBluetoothJsonResult(FFBluetoothOptions* options, yyjson_mut_doc* static FFModuleBaseInfo ffModuleInfo = { .name = FF_BLUETOOTH_MODULE_NAME, .description = "List (connected) bluetooth devices", + .initOptions = (void*) ffInitBluetoothOptions, + .destroyOptions = (void*) ffDestroyBluetoothOptions, .parseJsonObject = (void*) ffParseBluetoothJsonObject, .printModule = (void*) ffPrintBluetooth, .generateJsonResult = (void*) ffGenerateBluetoothJsonResult, diff --git a/src/modules/bluetoothradio/bluetoothradio.c b/src/modules/bluetoothradio/bluetoothradio.c index 2432ab633..d55ab6c49 100644 --- a/src/modules/bluetoothradio/bluetoothradio.c +++ b/src/modules/bluetoothradio/bluetoothradio.c @@ -169,6 +169,8 @@ void ffGenerateBluetoothRadioJsonResult(FF_MAYBE_UNUSED FFBluetoothRadioOptions* static FFModuleBaseInfo ffModuleInfo = { .name = FF_BLUETOOTHRADIO_MODULE_NAME, .description = "List bluetooth radios width supported version and vendor", + .initOptions = (void*) ffInitBluetoothRadioOptions, + .destroyOptions = (void*) ffDestroyBluetoothRadioOptions, .parseJsonObject = (void*) ffParseBluetoothRadioJsonObject, .printModule = (void*) ffPrintBluetoothRadio, .generateJsonResult = (void*) ffGenerateBluetoothRadioJsonResult, diff --git a/src/modules/board/board.c b/src/modules/board/board.c index 3c5c29873..693b9b3cf 100644 --- a/src/modules/board/board.c +++ b/src/modules/board/board.c @@ -109,6 +109,8 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_BOARD_MODULE_NAME, .description = "Print motherboard name and other info", + .initOptions = (void*) ffInitBoardOptions, + .destroyOptions = (void*) ffDestroyBoardOptions, .parseJsonObject = (void*) ffParseBoardJsonObject, .printModule = (void*) ffPrintBoard, .generateJsonResult = (void*) ffGenerateBoardJsonResult, diff --git a/src/modules/bootmgr/bootmgr.c b/src/modules/bootmgr/bootmgr.c index e5084e318..47c831350 100644 --- a/src/modules/bootmgr/bootmgr.c +++ b/src/modules/bootmgr/bootmgr.c @@ -100,6 +100,8 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_BOOTMGR_MODULE_NAME, .description = "Print information of 2nd-stage bootloader (name, firmware, etc)", + .initOptions = (void*) ffInitBootmgrOptions, + .destroyOptions = (void*) ffDestroyBootmgrOptions, .parseJsonObject = (void*) ffParseBootmgrJsonObject, .printModule = (void*) ffPrintBootmgr, .generateJsonResult = (void*) ffGenerateBootmgrJsonResult, diff --git a/src/modules/break/break.c b/src/modules/break/break.c index fbb88b637..978bff5c6 100644 --- a/src/modules/break/break.c +++ b/src/modules/break/break.c @@ -24,6 +24,8 @@ void ffParseBreakJsonObject(FF_MAYBE_UNUSED FFBreakOptions* options, FF_MAYBE_UN static FFModuleBaseInfo ffModuleInfo = { .name = FF_BREAK_MODULE_NAME, .description = "Print a empty line", + .initOptions = (void*) ffInitBreakOptions, + .destroyOptions = (void*) ffDestroyBreakOptions, .parseJsonObject = (void*) ffParseBreakJsonObject, .printModule = (void*) ffPrintBreak, }; diff --git a/src/modules/brightness/brightness.c b/src/modules/brightness/brightness.c index 8b5a43d6a..cfd10aa10 100644 --- a/src/modules/brightness/brightness.c +++ b/src/modules/brightness/brightness.c @@ -190,6 +190,8 @@ void ffGenerateBrightnessJsonResult(FF_MAYBE_UNUSED FFBrightnessOptions* options static FFModuleBaseInfo ffModuleInfo = { .name = FF_BRIGHTNESS_MODULE_NAME, .description = "Print current brightness level of your monitors", + .initOptions = (void*) ffInitBrightnessOptions, + .destroyOptions = (void*) ffDestroyBrightnessOptions, .parseJsonObject = (void*) ffParseBrightnessJsonObject, .printModule = (void*) ffPrintBrightness, .generateJsonResult = (void*) ffGenerateBrightnessJsonResult, diff --git a/src/modules/btrfs/btrfs.c b/src/modules/btrfs/btrfs.c index 22db04bca..0c96b7623 100644 --- a/src/modules/btrfs/btrfs.c +++ b/src/modules/btrfs/btrfs.c @@ -203,6 +203,8 @@ void ffGenerateBtrfsJsonResult(FF_MAYBE_UNUSED FFBtrfsOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_BTRFS_MODULE_NAME, .description = "Print Linux BTRFS volumes", + .initOptions = (void*) ffInitBtrfsOptions, + .destroyOptions = (void*) ffDestroyBtrfsOptions, .parseJsonObject = (void*) ffParseBtrfsJsonObject, .printModule = (void*) ffPrintBtrfs, .generateJsonResult = (void*) ffGenerateBtrfsJsonResult, diff --git a/src/modules/camera/camera.c b/src/modules/camera/camera.c index 78215dd5c..34155d207 100644 --- a/src/modules/camera/camera.c +++ b/src/modules/camera/camera.c @@ -123,6 +123,8 @@ void ffGenerateCameraJsonResult(FF_MAYBE_UNUSED FFCameraOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_CAMERA_MODULE_NAME, .description = "Print available cameras", + .initOptions = (void*) ffInitCameraOptions, + .destroyOptions = (void*) ffDestroyCameraOptions, .parseJsonObject = (void*) ffParseCameraJsonObject, .printModule = (void*) ffPrintCamera, .generateJsonResult = (void*) ffGenerateCameraJsonResult, diff --git a/src/modules/chassis/chassis.c b/src/modules/chassis/chassis.c index 867c0201b..827f9c507 100644 --- a/src/modules/chassis/chassis.c +++ b/src/modules/chassis/chassis.c @@ -110,6 +110,8 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_CHASSIS_MODULE_NAME, .description = "Print chassis type (desktop, laptop, etc)", + .initOptions = (void*) ffInitChassisOptions, + .destroyOptions = (void*) ffDestroyChassisOptions, .parseJsonObject = (void*) ffParseChassisJsonObject, .printModule = (void*) ffPrintChassis, .generateJsonResult = (void*) ffGenerateChassisJsonResult, diff --git a/src/modules/colors/colors.c b/src/modules/colors/colors.c index 59946166d..2eb180cae 100644 --- a/src/modules/colors/colors.c +++ b/src/modules/colors/colors.c @@ -242,6 +242,8 @@ void ffGenerateColorsJsonConfig(FFColorsOptions* options, yyjson_mut_doc* doc, y static FFModuleBaseInfo ffModuleInfo = { .name = FF_COLORS_MODULE_NAME, .description = "Print some colored blocks", + .initOptions = (void*) ffInitColorsOptions, + .destroyOptions = (void*) ffDestroyColorsOptions, .parseJsonObject = (void*) ffParseColorsJsonObject, .printModule = (void*) ffPrintColors, .generateJsonConfig = (void*) ffGenerateColorsJsonConfig, diff --git a/src/modules/command/command.c b/src/modules/command/command.c index 0e05d6f77..22f5fd17c 100644 --- a/src/modules/command/command.c +++ b/src/modules/command/command.c @@ -123,6 +123,8 @@ void ffGenerateCommandJsonResult(FF_MAYBE_UNUSED FFCommandOptions* options, yyjs static FFModuleBaseInfo ffModuleInfo = { .name = FF_COMMAND_MODULE_NAME, .description = "Run custom shell scripts", + .initOptions = (void*) ffInitCommandOptions, + .destroyOptions = (void*) ffDestroyCommandOptions, .parseJsonObject = (void*) ffParseCommandJsonObject, .printModule = (void*) ffPrintCommand, .generateJsonResult = (void*) ffGenerateCommandJsonResult, diff --git a/src/modules/cpu/cpu.c b/src/modules/cpu/cpu.c index 49c5a59a8..5af82f82c 100644 --- a/src/modules/cpu/cpu.c +++ b/src/modules/cpu/cpu.c @@ -215,6 +215,8 @@ void ffGenerateCPUJsonResult(FFCPUOptions* options, yyjson_mut_doc* doc, yyjson_ static FFModuleBaseInfo ffModuleInfo = { .name = FF_CPU_MODULE_NAME, .description = "Print CPU name, frequency, etc", + .initOptions = (void*) ffInitCPUOptions, + .destroyOptions = (void*) ffDestroyCPUOptions, .parseJsonObject = (void*) ffParseCPUJsonObject, .printModule = (void*) ffPrintCPU, .generateJsonResult = (void*) ffGenerateCPUJsonResult, diff --git a/src/modules/cpucache/cpucache.c b/src/modules/cpucache/cpucache.c index 7a509fda6..29a574afa 100644 --- a/src/modules/cpucache/cpucache.c +++ b/src/modules/cpucache/cpucache.c @@ -211,6 +211,8 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_CPUCACHE_MODULE_NAME, .description = "Print CPU cache sizes", + .initOptions = (void*) ffInitCPUCacheOptions, + .destroyOptions = (void*) ffDestroyCPUCacheOptions, .parseJsonObject = (void*) ffParseCPUCacheJsonObject, .printModule = (void*) ffPrintCPUCache, .generateJsonResult = (void*) ffGenerateCPUCacheJsonResult, diff --git a/src/modules/cpuusage/cpuusage.c b/src/modules/cpuusage/cpuusage.c index 4f3b244d5..c5a6f595d 100644 --- a/src/modules/cpuusage/cpuusage.c +++ b/src/modules/cpuusage/cpuusage.c @@ -177,6 +177,8 @@ void ffGenerateCPUUsageJsonResult(FFCPUUsageOptions* options, yyjson_mut_doc* do static FFModuleBaseInfo ffModuleInfo = { .name = FF_CPUUSAGE_MODULE_NAME, .description = "Print CPU usage. Costs some time to collect data", + .initOptions = (void*) ffInitCPUUsageOptions, + .destroyOptions = (void*) ffDestroyCPUUsageOptions, .parseJsonObject = (void*) ffParseCPUUsageJsonObject, .printModule = (void*) ffPrintCPUUsage, .generateJsonResult = (void*) ffGenerateCPUUsageJsonResult, diff --git a/src/modules/cursor/cursor.c b/src/modules/cursor/cursor.c index 573eca95f..edec4b5c9 100644 --- a/src/modules/cursor/cursor.c +++ b/src/modules/cursor/cursor.c @@ -97,6 +97,8 @@ void ffGenerateCursorJsonResult(FF_MAYBE_UNUSED FFCursorOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_CURSOR_MODULE_NAME, .description = "Print cursor style name", + .initOptions = (void*) ffInitCursorOptions, + .destroyOptions = (void*) ffDestroyCursorOptions, .parseJsonObject = (void*) ffParseCursorJsonObject, .printModule = (void*) ffPrintCursor, .generateJsonResult = (void*) ffGenerateCursorJsonResult, diff --git a/src/modules/custom/custom.c b/src/modules/custom/custom.c index 5831430c5..4f3e706fa 100644 --- a/src/modules/custom/custom.c +++ b/src/modules/custom/custom.c @@ -33,6 +33,8 @@ void ffParseCustomJsonObject(FFCustomOptions* options, yyjson_val* module) static FFModuleBaseInfo ffModuleInfo = { .name = FF_CUSTOM_MODULE_NAME, .description = "Print a custom string, with or without key", + .initOptions = (void*) ffInitCustomOptions, + .destroyOptions = (void*) ffDestroyCustomOptions, .parseJsonObject = (void*) ffParseCustomJsonObject, .printModule = (void*) ffPrintCustom, .generateJsonConfig = (void*) ffGenerateCustomJsonConfig, diff --git a/src/modules/datetime/datetime.c b/src/modules/datetime/datetime.c index dd82937f0..f90780a88 100644 --- a/src/modules/datetime/datetime.c +++ b/src/modules/datetime/datetime.c @@ -146,6 +146,8 @@ void ffGenerateDateTimeJsonResult(FF_MAYBE_UNUSED FFDateTimeOptions* options, yy static FFModuleBaseInfo ffModuleInfo = { .name = FF_DATETIME_MODULE_NAME, .description = "Print current date and time", + .initOptions = (void*) ffInitDateTimeOptions, + .destroyOptions = (void*) ffDestroyDateTimeOptions, .parseJsonObject = (void*) ffParseDateTimeJsonObject, .printModule = (void*) ffPrintDateTime, .generateJsonResult = (void*) ffGenerateDateTimeJsonResult, diff --git a/src/modules/de/de.c b/src/modules/de/de.c index 7f0020b11..4ec94aa77 100644 --- a/src/modules/de/de.c +++ b/src/modules/de/de.c @@ -94,6 +94,8 @@ void ffGenerateDEJsonResult(FF_MAYBE_UNUSED FFDEOptions* options, yyjson_mut_doc static FFModuleBaseInfo ffModuleInfo = { .name = FF_DE_MODULE_NAME, .description = "Print desktop environment name", + .initOptions = (void*) ffInitDEOptions, + .destroyOptions = (void*) ffDestroyDEOptions, .parseJsonObject = (void*) ffParseDEJsonObject, .printModule = (void*) ffPrintDE, .generateJsonResult = (void*) ffGenerateDEJsonResult, diff --git a/src/modules/disk/disk.c b/src/modules/disk/disk.c index a6ac53a72..a8b646ff0 100644 --- a/src/modules/disk/disk.c +++ b/src/modules/disk/disk.c @@ -415,6 +415,8 @@ void ffGenerateDiskJsonResult(FFDiskOptions* options, yyjson_mut_doc* doc, yyjso static FFModuleBaseInfo ffModuleInfo = { .name = FF_DISK_MODULE_NAME, .description = "Print partitions, space usage, file system, etc", + .initOptions = (void*) ffInitDiskOptions, + .destroyOptions = (void*) ffDestroyDiskOptions, .parseJsonObject = (void*) ffParseDiskJsonObject, .printModule = (void*) ffPrintDisk, .generateJsonResult = (void*) ffGenerateDiskJsonResult, diff --git a/src/modules/diskio/diskio.c b/src/modules/diskio/diskio.c index 6c73f3e21..6bc13524e 100644 --- a/src/modules/diskio/diskio.c +++ b/src/modules/diskio/diskio.c @@ -173,6 +173,8 @@ void ffGenerateDiskIOJsonResult(FFDiskIOOptions* options, yyjson_mut_doc* doc, y static FFModuleBaseInfo ffModuleInfo = { .name = FF_DISKIO_MODULE_NAME, .description = "Print physical disk I/O throughput", + .initOptions = (void*) ffInitDiskIOOptions, + .destroyOptions = (void*) ffDestroyDiskIOOptions, .parseJsonObject = (void*) ffParseDiskIOJsonObject, .printModule = (void*) ffPrintDiskIO, .generateJsonResult = (void*) ffGenerateDiskIOJsonResult, diff --git a/src/modules/display/display.c b/src/modules/display/display.c index 71cb4adad..ecefdbe91 100644 --- a/src/modules/display/display.c +++ b/src/modules/display/display.c @@ -405,6 +405,8 @@ void ffGenerateDisplayJsonResult(FF_MAYBE_UNUSED FFDisplayOptions* options, yyjs static FFModuleBaseInfo ffModuleInfo = { .name = FF_DISPLAY_MODULE_NAME, .description = "Print resolutions, refresh rates, etc", + .initOptions = (void*) ffInitDisplayOptions, + .destroyOptions = (void*) ffDestroyDisplayOptions, .parseJsonObject = (void*) ffParseDisplayJsonObject, .printModule = (void*) ffPrintDisplay, .generateJsonResult = (void*) ffGenerateDisplayJsonResult, diff --git a/src/modules/dns/dns.c b/src/modules/dns/dns.c index 815865ff6..749aa8d90 100644 --- a/src/modules/dns/dns.c +++ b/src/modules/dns/dns.c @@ -142,6 +142,8 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_DNS_MODULE_NAME, .description = "Print configured DNS servers", + .initOptions = (void*) ffInitDNSOptions, + .destroyOptions = (void*) ffDestroyDNSOptions, .parseJsonObject = (void*) ffParseDNSJsonObject, .printModule = (void*) ffPrintDNS, .generateJsonResult = (void*) ffGenerateDNSJsonResult, diff --git a/src/modules/editor/editor.c b/src/modules/editor/editor.c index 67223bb50..d6e08fda0 100644 --- a/src/modules/editor/editor.c +++ b/src/modules/editor/editor.c @@ -107,6 +107,8 @@ void ffGenerateEditorJsonResult(FF_MAYBE_UNUSED FFEditorOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_EDITOR_MODULE_NAME, .description = "Print information of the default editor ($VISUAL or $EDITOR)", + .initOptions = (void*) ffInitEditorOptions, + .destroyOptions = (void*) ffDestroyEditorOptions, .parseJsonObject = (void*) ffParseEditorJsonObject, .printModule = (void*) ffPrintEditor, .generateJsonResult = (void*) ffGenerateEditorJsonResult, diff --git a/src/modules/font/font.c b/src/modules/font/font.c index bf0fc2459..f7d272615 100644 --- a/src/modules/font/font.c +++ b/src/modules/font/font.c @@ -91,6 +91,8 @@ void ffGenerateFontJsonResult(FF_MAYBE_UNUSED FFFontOptions* options, yyjson_mut static FFModuleBaseInfo ffModuleInfo = { .name = FF_FONT_MODULE_NAME, .description = "Print system font names", + .initOptions = (void*) ffInitFontOptions, + .destroyOptions = (void*) ffDestroyFontOptions, .parseJsonObject = (void*) ffParseFontJsonObject, .printModule = (void*) ffPrintFont, .generateJsonResult = (void*) ffGenerateFontJsonResult, diff --git a/src/modules/gamepad/gamepad.c b/src/modules/gamepad/gamepad.c index 5e6e394d3..1558d5873 100644 --- a/src/modules/gamepad/gamepad.c +++ b/src/modules/gamepad/gamepad.c @@ -133,6 +133,8 @@ void ffGenerateGamepadJsonResult(FF_MAYBE_UNUSED FFGamepadOptions* options, yyjs static FFModuleBaseInfo ffModuleInfo = { .name = FF_GAMEPAD_MODULE_NAME, .description = "List (connected) gamepads", + .initOptions = (void*) ffInitGamepadOptions, + .destroyOptions = (void*) ffDestroyGamepadOptions, .parseJsonObject = (void*) ffParseGamepadJsonObject, .printModule = (void*) ffPrintGamepad, .generateJsonResult = (void*) ffGenerateGamepadJsonResult, diff --git a/src/modules/gpu/gpu.c b/src/modules/gpu/gpu.c index 58392af1e..e74eb3ccf 100644 --- a/src/modules/gpu/gpu.c +++ b/src/modules/gpu/gpu.c @@ -417,6 +417,8 @@ void ffGenerateGPUJsonResult(FFGPUOptions* options, yyjson_mut_doc* doc, yyjson_ static FFModuleBaseInfo ffModuleInfo = { .name = FF_GPU_MODULE_NAME, .description = "Print GPU names, graphic memory size, type, etc", + .initOptions = (void*) ffInitGPUOptions, + .destroyOptions = (void*) ffDestroyGPUOptions, .parseJsonObject = (void*) ffParseGPUJsonObject, .printModule = (void*) ffPrintGPU, .generateJsonResult = (void*) ffGenerateGPUJsonResult, diff --git a/src/modules/host/host.c b/src/modules/host/host.c index 3d4fd3942..9d1c7e74b 100644 --- a/src/modules/host/host.c +++ b/src/modules/host/host.c @@ -134,6 +134,8 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_HOST_MODULE_NAME, .description = "Print product name of your computer", + .initOptions = (void*) ffInitHostOptions, + .destroyOptions = (void*) ffDestroyHostOptions, .parseJsonObject = (void*) ffParseHostJsonObject, .printModule = (void*) ffPrintHost, .generateJsonResult = (void*) ffGenerateHostJsonResult, diff --git a/src/modules/icons/icons.c b/src/modules/icons/icons.c index ae2ad783b..d8ebf7574 100644 --- a/src/modules/icons/icons.c +++ b/src/modules/icons/icons.c @@ -89,6 +89,8 @@ void ffGenerateIconsJsonResult(FF_MAYBE_UNUSED FFIconsOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_ICONS_MODULE_NAME, .description = "Print icon style name", + .initOptions = (void*) ffInitIconsOptions, + .destroyOptions = (void*) ffDestroyIconsOptions, .parseJsonObject = (void*) ffParseIconsJsonObject, .printModule = (void*) ffPrintIcons, .generateJsonResult = (void*) ffGenerateIconsJsonResult, diff --git a/src/modules/initsystem/initsystem.c b/src/modules/initsystem/initsystem.c index 591a78e0a..1652838a1 100644 --- a/src/modules/initsystem/initsystem.c +++ b/src/modules/initsystem/initsystem.c @@ -101,6 +101,8 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_INITSYSTEM_MODULE_NAME, .description = "Print init system (pid 1) name and version", + .initOptions = (void*) ffInitInitSystemOptions, + .destroyOptions = (void*) ffDestroyInitSystemOptions, .parseJsonObject = (void*) ffParseInitSystemJsonObject, .printModule = (void*) ffPrintInitSystem, .generateJsonResult = (void*) ffGenerateInitSystemJsonResult, diff --git a/src/modules/kernel/kernel.c b/src/modules/kernel/kernel.c index fd21f67ed..23b544d9c 100644 --- a/src/modules/kernel/kernel.c +++ b/src/modules/kernel/kernel.c @@ -69,6 +69,8 @@ void ffGenerateKernelJsonResult(FF_MAYBE_UNUSED FFKernelOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_KERNEL_MODULE_NAME, .description = "Print system kernel version", + .initOptions = (void*) ffInitKernelOptions, + .destroyOptions = (void*) ffDestroyKernelOptions, .parseJsonObject = (void*) ffParseKernelJsonObject, .printModule = (void*) ffPrintKernel, .generateJsonResult = (void*) ffGenerateKernelJsonResult, diff --git a/src/modules/keyboard/keyboard.c b/src/modules/keyboard/keyboard.c index 4b2a34329..d024444ec 100644 --- a/src/modules/keyboard/keyboard.c +++ b/src/modules/keyboard/keyboard.c @@ -99,6 +99,8 @@ void ffGenerateKeyboardJsonResult(FF_MAYBE_UNUSED FFKeyboardOptions* options, yy static FFModuleBaseInfo ffModuleInfo = { .name = FF_KEYBOARD_MODULE_NAME, .description = "List (connected) keyboards", + .initOptions = (void*) ffInitKeyboardOptions, + .destroyOptions = (void*) ffDestroyKeyboardOptions, .parseJsonObject = (void*) ffParseKeyboardJsonObject, .printModule = (void*) ffPrintKeyboard, .generateJsonResult = (void*) ffGenerateKeyboardJsonResult, diff --git a/src/modules/lm/lm.c b/src/modules/lm/lm.c index 9afcdefc4..cba026452 100644 --- a/src/modules/lm/lm.c +++ b/src/modules/lm/lm.c @@ -102,6 +102,8 @@ exit: static FFModuleBaseInfo ffModuleInfo = { .name = FF_LM_MODULE_NAME, .description = "Print login manager (desktop manager) name and version", + .initOptions = (void*) ffInitLMOptions, + .destroyOptions = (void*) ffDestroyLMOptions, .parseJsonObject = (void*) ffParseLMJsonObject, .printModule = (void*) ffPrintLM, .generateJsonResult = (void*) ffGenerateLMJsonResult, diff --git a/src/modules/loadavg/loadavg.c b/src/modules/loadavg/loadavg.c index 1fb7655e8..b7aeb71a0 100644 --- a/src/modules/loadavg/loadavg.c +++ b/src/modules/loadavg/loadavg.c @@ -153,6 +153,8 @@ void ffGenerateLoadavgJsonResult(FF_MAYBE_UNUSED FFLoadavgOptions* options, yyjs static FFModuleBaseInfo ffModuleInfo = { .name = FF_LOADAVG_MODULE_NAME, .description = "Print system load averages", + .initOptions = (void*) ffInitLoadavgOptions, + .destroyOptions = (void*) ffDestroyLoadavgOptions, .parseJsonObject = (void*) ffParseLoadavgJsonObject, .printModule = (void*) ffPrintLoadavg, .generateJsonResult = (void*) ffGenerateLoadavgJsonResult, diff --git a/src/modules/locale/locale.c b/src/modules/locale/locale.c index 290f9196e..fdcd045f1 100644 --- a/src/modules/locale/locale.c +++ b/src/modules/locale/locale.c @@ -66,6 +66,8 @@ void ffGenerateLocaleJsonResult(FF_MAYBE_UNUSED FFLocaleOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_LOCALE_MODULE_NAME, .description = "Print system locale name", + .initOptions = (void*) ffInitLocaleOptions, + .destroyOptions = (void*) ffDestroyLocaleOptions, .parseJsonObject = (void*) ffParseLocaleJsonObject, .printModule = (void*) ffPrintLocale, .generateJsonResult = (void*) ffGenerateLocaleJsonResult, diff --git a/src/modules/localip/localip.c b/src/modules/localip/localip.c index cfc936fdf..72bab65a5 100644 --- a/src/modules/localip/localip.c +++ b/src/modules/localip/localip.c @@ -388,6 +388,8 @@ void ffGenerateLocalIpJsonResult(FF_MAYBE_UNUSED FFLocalIpOptions* options, yyjs static FFModuleBaseInfo ffModuleInfo = { .name = FF_LOCALIP_MODULE_NAME, .description = "List local IP addresses (v4 or v6), MAC addresses, etc", + .initOptions = (void*) ffInitLocalIpOptions, + .destroyOptions = (void*) ffDestroyLocalIpOptions, .parseJsonObject = (void*) ffParseLocalIpJsonObject, .printModule = (void*) ffPrintLocalIp, .generateJsonResult = (void*) ffGenerateLocalIpJsonResult, diff --git a/src/modules/media/media.c b/src/modules/media/media.c index 71dfb96ea..8fb1555d4 100644 --- a/src/modules/media/media.c +++ b/src/modules/media/media.c @@ -154,6 +154,8 @@ void ffGenerateMediaJsonResult(FF_MAYBE_UNUSED FFMediaOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_MEDIA_MODULE_NAME, .description = "Print playing song name", + .initOptions = (void*) ffInitMediaOptions, + .destroyOptions = (void*) ffDestroyMediaOptions, .parseJsonObject = (void*) ffParseMediaJsonObject, .printModule = (void*) ffPrintMedia, .generateJsonResult = (void*) ffGenerateMediaJsonResult, diff --git a/src/modules/memory/memory.c b/src/modules/memory/memory.c index 1948a162e..7388c44cc 100644 --- a/src/modules/memory/memory.c +++ b/src/modules/memory/memory.c @@ -116,6 +116,8 @@ void ffGenerateMemoryJsonResult(FF_MAYBE_UNUSED FFMemoryOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_MEMORY_MODULE_NAME, .description = "Print system memory usage info", + .initOptions = (void*) ffInitMemoryOptions, + .destroyOptions = (void*) ffDestroyMemoryOptions, .parseJsonObject = (void*) ffParseMemoryJsonObject, .printModule = (void*) ffPrintMemory, .generateJsonResult = (void*) ffGenerateMemoryJsonResult, diff --git a/src/modules/monitor/monitor.c b/src/modules/monitor/monitor.c index fd0efac20..557db306b 100644 --- a/src/modules/monitor/monitor.c +++ b/src/modules/monitor/monitor.c @@ -115,6 +115,8 @@ void ffGenerateMonitorJsonResult(FF_MAYBE_UNUSED FFMonitorOptions* options, yyjs static FFModuleBaseInfo ffModuleInfo = { .name = FF_MONITOR_MODULE_NAME, .description = "Alias of Display module", + .initOptions = (void*) ffInitMonitorOptions, + .destroyOptions = (void*) ffDestroyMonitorOptions, .parseJsonObject = (void*) ffParseMonitorJsonObject, .printModule = (void*) ffPrintMonitor, .generateJsonResult = (void*) ffGenerateMonitorJsonResult, diff --git a/src/modules/mouse/mouse.c b/src/modules/mouse/mouse.c index 1d5eeea88..298bc02a3 100644 --- a/src/modules/mouse/mouse.c +++ b/src/modules/mouse/mouse.c @@ -99,6 +99,8 @@ void ffGenerateMouseJsonResult(FF_MAYBE_UNUSED FFMouseOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_MOUSE_MODULE_NAME, .description = "List connected mouses", + .initOptions = (void*) ffInitMouseOptions, + .destroyOptions = (void*) ffDestroyMouseOptions, .parseJsonObject = (void*) ffParseMouseJsonObject, .printModule = (void*) ffPrintMouse, .generateJsonResult = (void*) ffGenerateMouseJsonResult, diff --git a/src/modules/netio/netio.c b/src/modules/netio/netio.c index 9733ee99b..30e643a6a 100644 --- a/src/modules/netio/netio.c +++ b/src/modules/netio/netio.c @@ -193,6 +193,8 @@ void ffGenerateNetIOJsonResult(FFNetIOOptions* options, yyjson_mut_doc* doc, yyj static FFModuleBaseInfo ffModuleInfo = { .name = FF_NETIO_MODULE_NAME, .description = "Print network I/O throughput", + .initOptions = (void*) ffInitNetIOOptions, + .destroyOptions = (void*) ffDestroyNetIOOptions, .parseJsonObject = (void*) ffParseNetIOJsonObject, .printModule = (void*) ffPrintNetIO, .generateJsonResult = (void*) ffGenerateNetIOJsonResult, diff --git a/src/modules/opencl/opencl.c b/src/modules/opencl/opencl.c index ad93db8a0..d0a72ea80 100644 --- a/src/modules/opencl/opencl.c +++ b/src/modules/opencl/opencl.c @@ -117,6 +117,8 @@ void ffGenerateOpenCLJsonResult(FF_MAYBE_UNUSED FFOpenCLOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_OPENCL_MODULE_NAME, .description = "Print highest OpenCL version supported by the GPU", + .initOptions = (void*) ffInitOpenCLOptions, + .destroyOptions = (void*) ffDestroyOpenCLOptions, .parseJsonObject = (void*) ffParseOpenCLJsonObject, .printModule = (void*) ffPrintOpenCL, .generateJsonResult = (void*) ffGenerateOpenCLJsonResult, diff --git a/src/modules/opengl/opengl.c b/src/modules/opengl/opengl.c index 43ef88d44..1ee320fd9 100644 --- a/src/modules/opengl/opengl.c +++ b/src/modules/opengl/opengl.c @@ -130,6 +130,8 @@ void ffGenerateOpenGLJsonResult(FF_MAYBE_UNUSED FFOpenGLOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_OPENGL_MODULE_NAME, .description = "Print highest OpenGL version supported by the GPU", + .initOptions = (void*) ffInitOpenGLOptions, + .destroyOptions = (void*) ffDestroyOpenGLOptions, .parseJsonObject = (void*) ffParseOpenGLJsonObject, .printModule = (void*) ffPrintOpenGL, .generateJsonResult = (void*) ffGenerateOpenGLJsonResult, diff --git a/src/modules/os/os.c b/src/modules/os/os.c index 9bcb13387..6056de9b1 100644 --- a/src/modules/os/os.c +++ b/src/modules/os/os.c @@ -162,6 +162,8 @@ void ffGenerateOSJsonResult(FF_MAYBE_UNUSED FFOSOptions* options, yyjson_mut_doc static FFModuleBaseInfo ffModuleInfo = { .name = FF_OS_MODULE_NAME, .description = "Print operating system name and version", + .initOptions = (void*) ffInitOSOptions, + .destroyOptions = (void*) ffDestroyOSOptions, .parseJsonObject = (void*) ffParseOSJsonObject, .printModule = (void*) ffPrintOS, .generateJsonResult = (void*) ffGenerateOSJsonResult, diff --git a/src/modules/packages/packages.c b/src/modules/packages/packages.c index a5d61ee72..23025404d 100644 --- a/src/modules/packages/packages.c +++ b/src/modules/packages/packages.c @@ -434,6 +434,8 @@ void ffGeneratePackagesJsonResult(FF_MAYBE_UNUSED FFPackagesOptions* options, yy static FFModuleBaseInfo ffModuleInfo = { .name = FF_PACKAGES_MODULE_NAME, .description = "List installed package managers and count of installed packages", + .initOptions = (void*) ffInitPackagesOptions, + .destroyOptions = (void*) ffDestroyPackagesOptions, .parseJsonObject = (void*) ffParsePackagesJsonObject, .printModule = (void*) ffPrintPackages, .generateJsonResult = (void*) ffGeneratePackagesJsonResult, diff --git a/src/modules/physicaldisk/physicaldisk.c b/src/modules/physicaldisk/physicaldisk.c index 79be411cb..b93bfe6ce 100644 --- a/src/modules/physicaldisk/physicaldisk.c +++ b/src/modules/physicaldisk/physicaldisk.c @@ -229,6 +229,8 @@ void ffGeneratePhysicalDiskJsonResult(FFPhysicalDiskOptions* options, yyjson_mut static FFModuleBaseInfo ffModuleInfo = { .name = FF_PHYSICALDISK_MODULE_NAME, .description = "Print physical disk information", + .initOptions = (void*) ffInitPhysicalDiskOptions, + .destroyOptions = (void*) ffDestroyPhysicalDiskOptions, .parseJsonObject = (void*) ffParsePhysicalDiskJsonObject, .printModule = (void*) ffPrintPhysicalDisk, .generateJsonResult = (void*) ffGeneratePhysicalDiskJsonResult, diff --git a/src/modules/physicalmemory/physicalmemory.c b/src/modules/physicalmemory/physicalmemory.c index e36ceaa64..cb6bcb918 100644 --- a/src/modules/physicalmemory/physicalmemory.c +++ b/src/modules/physicalmemory/physicalmemory.c @@ -142,6 +142,8 @@ void ffGeneratePhysicalMemoryJsonResult(FF_MAYBE_UNUSED FFPhysicalMemoryOptions* static FFModuleBaseInfo ffModuleInfo = { .name = FF_PHYSICALMEMORY_MODULE_NAME, .description = "Print system physical memory devices", + .initOptions = (void*) ffInitPhysicalMemoryOptions, + .destroyOptions = (void*) ffDestroyPhysicalMemoryOptions, .parseJsonObject = (void*) ffParsePhysicalMemoryJsonObject, .printModule = (void*) ffPrintPhysicalMemory, .generateJsonConfig = (void*) ffGeneratePhysicalMemoryJsonConfig, diff --git a/src/modules/player/player.c b/src/modules/player/player.c index 2c7aaac97..555746a90 100644 --- a/src/modules/player/player.c +++ b/src/modules/player/player.c @@ -110,6 +110,8 @@ void ffGeneratePlayerJsonResult(FF_MAYBE_UNUSED FFMediaOptions* options, yyjson_ static FFModuleBaseInfo ffModuleInfo = { .name = FF_PLAYER_MODULE_NAME, .description = "Print music player name", + .initOptions = (void*) ffInitPlayerOptions, + .destroyOptions = (void*) ffDestroyPlayerOptions, .parseJsonObject = (void*) ffParsePlayerJsonObject, .printModule = (void*) ffPrintPlayer, .generateJsonResult = (void*) ffGeneratePlayerJsonResult, diff --git a/src/modules/poweradapter/poweradapter.c b/src/modules/poweradapter/poweradapter.c index 8f33d6ae8..abd3b4f85 100644 --- a/src/modules/poweradapter/poweradapter.c +++ b/src/modules/poweradapter/poweradapter.c @@ -114,6 +114,8 @@ void ffGeneratePowerAdapterJsonResult(FF_MAYBE_UNUSED FFPowerAdapterOptions* opt static FFModuleBaseInfo ffModuleInfo = { .name = FF_POWERADAPTER_MODULE_NAME, .description = "Print power adapter name and charging watts", + .initOptions = (void*) ffInitPowerAdapterOptions, + .destroyOptions = (void*) ffDestroyPowerAdapterOptions, .parseJsonObject = (void*) ffParsePowerAdapterJsonObject, .printModule = (void*) ffPrintPowerAdapter, .generateJsonResult = (void*) ffGeneratePowerAdapterJsonResult, diff --git a/src/modules/processes/processes.c b/src/modules/processes/processes.c index 0c79b4d27..5d8ab9d76 100644 --- a/src/modules/processes/processes.c +++ b/src/modules/processes/processes.c @@ -67,6 +67,8 @@ void ffGenerateProcessesJsonResult(FF_MAYBE_UNUSED FFProcessesOptions* options, static FFModuleBaseInfo ffModuleInfo = { .name = FF_PROCESSES_MODULE_NAME, .description = "Print number of running processes", + .initOptions = (void*) ffInitProcessesOptions, + .destroyOptions = (void*) ffDestroyProcessesOptions, .parseJsonObject = (void*) ffParseProcessesJsonObject, .printModule = (void*) ffPrintProcesses, .generateJsonResult = (void*) ffGenerateProcessesJsonResult, diff --git a/src/modules/publicip/publicip.c b/src/modules/publicip/publicip.c index 2dbee34ba..fce7ca18e 100644 --- a/src/modules/publicip/publicip.c +++ b/src/modules/publicip/publicip.c @@ -111,6 +111,8 @@ void ffGeneratePublicIpJsonResult(FFPublicIpOptions* options, yyjson_mut_doc* do static FFModuleBaseInfo ffModuleInfo = { .name = FF_PUBLICIP_MODULE_NAME, .description = "Print your public IP address, etc", + .initOptions = (void*) ffInitPublicIpOptions, + .destroyOptions = (void*) ffDestroyPublicIpOptions, .parseJsonObject = (void*) ffParsePublicIpJsonObject, .printModule = (void*) ffPrintPublicIp, .generateJsonResult = (void*) ffGeneratePublicIpJsonResult, diff --git a/src/modules/separator/separator.c b/src/modules/separator/separator.c index e6bd66aa7..a8b9a86be 100644 --- a/src/modules/separator/separator.c +++ b/src/modules/separator/separator.c @@ -157,6 +157,8 @@ void ffGenerateSeparatorJsonConfig(FFSeparatorOptions* options, yyjson_mut_doc* static FFModuleBaseInfo ffModuleInfo = { .name = FF_SEPARATOR_MODULE_NAME, .description = "Print a separator line", + .initOptions = (void*) ffInitSeparatorOptions, + .destroyOptions = (void*) ffDestroySeparatorOptions, .parseJsonObject = (void*) ffParseSeparatorJsonObject, .printModule = (void*) ffPrintSeparator, .generateJsonConfig = (void*) ffGenerateSeparatorJsonConfig, diff --git a/src/modules/shell/shell.c b/src/modules/shell/shell.c index 0c9d15274..df433ded9 100644 --- a/src/modules/shell/shell.c +++ b/src/modules/shell/shell.c @@ -91,6 +91,8 @@ void ffGenerateShellJsonResult(FF_MAYBE_UNUSED FFShellOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_SHELL_MODULE_NAME, .description = "Print current shell name and version", + .initOptions = (void*) ffInitShellOptions, + .destroyOptions = (void*) ffDestroyShellOptions, .parseJsonObject = (void*) ffParseShellJsonObject, .printModule = (void*) ffPrintShell, .generateJsonResult = (void*) ffGenerateShellJsonResult, diff --git a/src/modules/sound/sound.c b/src/modules/sound/sound.c index 1f948ac95..759f8fdf4 100644 --- a/src/modules/sound/sound.c +++ b/src/modules/sound/sound.c @@ -209,6 +209,8 @@ void ffGenerateSoundJsonResult(FF_MAYBE_UNUSED FFSoundOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_SOUND_MODULE_NAME, .description = "Print sound devices, volume, etc", + .initOptions = (void*) ffInitSoundOptions, + .destroyOptions = (void*) ffDestroySoundOptions, .parseJsonObject = (void*) ffParseSoundJsonObject, .printModule = (void*) ffPrintSound, .generateJsonResult = (void*) ffGenerateSoundJsonResult, diff --git a/src/modules/swap/swap.c b/src/modules/swap/swap.c index ede68f3f7..54265d90a 100644 --- a/src/modules/swap/swap.c +++ b/src/modules/swap/swap.c @@ -192,6 +192,8 @@ void ffGenerateSwapJsonResult(FF_MAYBE_UNUSED FFSwapOptions* options, yyjson_mut static FFModuleBaseInfo ffModuleInfo = { .name = FF_SWAP_MODULE_NAME, .description = "Print swap (paging file) space usage", + .initOptions = (void*) ffInitSwapOptions, + .destroyOptions = (void*) ffDestroySwapOptions, .parseJsonObject = (void*) ffParseSwapJsonObject, .printModule = (void*) ffPrintSwap, .generateJsonResult = (void*) ffGenerateSwapJsonResult, diff --git a/src/modules/terminal/terminal.c b/src/modules/terminal/terminal.c index febbfba3e..9ddb3ae7f 100644 --- a/src/modules/terminal/terminal.c +++ b/src/modules/terminal/terminal.c @@ -84,6 +84,8 @@ void ffGenerateTerminalJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options, yy static FFModuleBaseInfo ffModuleInfo = { .name = FF_TERMINAL_MODULE_NAME, .description = "Print current terminal name and version", + .initOptions = (void*) ffInitTerminalOptions, + .destroyOptions = (void*) ffDestroyTerminalOptions, .parseJsonObject = (void*) ffParseTerminalJsonObject, .printModule = (void*) ffPrintTerminal, .generateJsonResult = (void*) ffGenerateTerminalJsonResult, diff --git a/src/modules/terminalfont/terminalfont.c b/src/modules/terminalfont/terminalfont.c index 837e5ac3b..43cab5610 100644 --- a/src/modules/terminalfont/terminalfont.c +++ b/src/modules/terminalfont/terminalfont.c @@ -109,6 +109,8 @@ void ffGenerateTerminalFontJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options static FFModuleBaseInfo ffModuleInfo = { .name = FF_TERMINALFONT_MODULE_NAME, .description = "Print font name and size used by current terminal", + .initOptions = (void*) ffInitTerminalFontOptions, + .destroyOptions = (void*) ffDestroyTerminalFontOptions, .parseJsonObject = (void*) ffParseTerminalFontJsonObject, .printModule = (void*) ffPrintTerminalFont, .generateJsonResult = (void*) ffGenerateTerminalFontJsonResult, diff --git a/src/modules/terminalsize/terminalsize.c b/src/modules/terminalsize/terminalsize.c index f36ec7d5b..9b5a6f56b 100644 --- a/src/modules/terminalsize/terminalsize.c +++ b/src/modules/terminalsize/terminalsize.c @@ -79,6 +79,8 @@ void ffGenerateTerminalSizeJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options static FFModuleBaseInfo ffModuleInfo = { .name = FF_TERMINALSIZE_MODULE_NAME, .description = "Print current terminal size", + .initOptions = (void*) ffInitTerminalSizeOptions, + .destroyOptions = (void*) ffDestroyTerminalSizeOptions, .parseJsonObject = (void*) ffParseTerminalSizeJsonObject, .printModule = (void*) ffPrintTerminalSize, .generateJsonResult = (void*) ffGenerateTerminalSizeJsonResult, diff --git a/src/modules/terminaltheme/terminaltheme.c b/src/modules/terminaltheme/terminaltheme.c index cc4e901e5..dd7a256b4 100644 --- a/src/modules/terminaltheme/terminaltheme.c +++ b/src/modules/terminaltheme/terminaltheme.c @@ -92,6 +92,8 @@ void ffGenerateTerminalThemeJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* option static FFModuleBaseInfo ffModuleInfo = { .name = FF_TERMINALTHEME_MODULE_NAME, .description = "Print current terminal theme (foreground and background colors)", + .initOptions = (void*) ffInitTerminalThemeOptions, + .destroyOptions = (void*) ffDestroyTerminalThemeOptions, .parseJsonObject = (void*) ffParseTerminalThemeJsonObject, .printModule = (void*) ffPrintTerminalTheme, .generateJsonResult = (void*) ffGenerateTerminalThemeJsonResult, diff --git a/src/modules/theme/theme.c b/src/modules/theme/theme.c index ca78bc7c1..daa93d9eb 100644 --- a/src/modules/theme/theme.c +++ b/src/modules/theme/theme.c @@ -89,6 +89,8 @@ void ffGenerateThemeJsonResult(FF_MAYBE_UNUSED FFThemeOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_THEME_MODULE_NAME, .description = "Print current theme of desktop environment", + .initOptions = (void*) ffInitThemeOptions, + .destroyOptions = (void*) ffDestroyThemeOptions, .parseJsonObject = (void*) ffParseThemeJsonObject, .printModule = (void*) ffPrintTheme, .generateJsonResult = (void*) ffGenerateThemeJsonResult, diff --git a/src/modules/title/title.c b/src/modules/title/title.c index dc5ad2920..293e1f9dd 100644 --- a/src/modules/title/title.c +++ b/src/modules/title/title.c @@ -143,6 +143,8 @@ void ffGenerateTitleJsonResult(FF_MAYBE_UNUSED FFTitleOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_TITLE_MODULE_NAME, .description = "Print title, which contains your user name, hostname", + .initOptions = (void*) ffInitTitleOptions, + .destroyOptions = (void*) ffDestroyTitleOptions, .parseJsonObject = (void*) ffParseTitleJsonObject, .printModule = (void*) ffPrintTitle, .generateJsonResult = (void*) ffGenerateTitleJsonResult, diff --git a/src/modules/tpm/tpm.c b/src/modules/tpm/tpm.c index b29a240aa..bd0c05f08 100644 --- a/src/modules/tpm/tpm.c +++ b/src/modules/tpm/tpm.c @@ -84,6 +84,8 @@ void ffGenerateTPMJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options, yyjson_ static FFModuleBaseInfo ffModuleInfo = { .name = FF_TPM_MODULE_NAME, .description = "Print info of Trusted Platform Module (TPM) Security Device", + .initOptions = (void*) ffInitTPMOptions, + .destroyOptions = (void*) ffDestroyTPMOptions, .parseJsonObject = (void*) ffParseTPMJsonObject, .printModule = (void*) ffPrintTPM, .generateJsonResult = (void*) ffGenerateTPMJsonResult, diff --git a/src/modules/uptime/uptime.c b/src/modules/uptime/uptime.c index fa2b11d8a..771e4b6da 100644 --- a/src/modules/uptime/uptime.c +++ b/src/modules/uptime/uptime.c @@ -96,6 +96,8 @@ void ffGenerateUptimeJsonResult(FF_MAYBE_UNUSED FFUptimeOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_UPTIME_MODULE_NAME, .description = "Print how long system has been running", + .initOptions = (void*) ffInitUptimeOptions, + .destroyOptions = (void*) ffDestroyUptimeOptions, .parseJsonObject = (void*) ffParseUptimeJsonObject, .printModule = (void*) ffPrintUptime, .generateJsonResult = (void*) ffGenerateUptimeJsonResult, diff --git a/src/modules/users/users.c b/src/modules/users/users.c index f1137b1c1..71d2150a3 100644 --- a/src/modules/users/users.c +++ b/src/modules/users/users.c @@ -188,6 +188,8 @@ void ffGenerateUsersJsonResult(FFUsersOptions* options, yyjson_mut_doc* doc, yyj static FFModuleBaseInfo ffModuleInfo = { .name = FF_USERS_MODULE_NAME, .description = "Print users currently logged in", + .initOptions = (void*) ffInitUsersOptions, + .destroyOptions = (void*) ffDestroyUsersOptions, .parseJsonObject = (void*) ffParseUsersJsonObject, .printModule = (void*) ffPrintUsers, .generateJsonResult = (void*) ffGenerateUsersJsonResult, diff --git a/src/modules/version/version.c b/src/modules/version/version.c index 6b86e0dbd..e39036eeb 100644 --- a/src/modules/version/version.c +++ b/src/modules/version/version.c @@ -100,6 +100,8 @@ void ffGenerateVersionJsonResult(FF_MAYBE_UNUSED FFVersionOptions* options, yyjs static FFModuleBaseInfo ffModuleInfo = { .name = FF_VERSION_MODULE_NAME, .description = "Print Fastfetch version", + .initOptions = (void*) ffInitVersionOptions, + .destroyOptions = (void*) ffDestroyVersionOptions, .parseJsonObject = (void*) ffParseVersionJsonObject, .printModule = (void*) ffPrintVersion, .generateJsonResult = (void*) ffGenerateVersionJsonResult, diff --git a/src/modules/vulkan/vulkan.c b/src/modules/vulkan/vulkan.c index f67f549a9..3cd6e5fb9 100644 --- a/src/modules/vulkan/vulkan.c +++ b/src/modules/vulkan/vulkan.c @@ -131,6 +131,8 @@ void ffGenerateVulkanJsonResult(FF_MAYBE_UNUSED FFVulkanOptions* options, yyjson static FFModuleBaseInfo ffModuleInfo = { .name = FF_VULKAN_MODULE_NAME, .description = "Print highest Vulkan version supported by the GPU", + .initOptions = (void*) ffInitVulkanOptions, + .destroyOptions = (void*) ffDestroyVulkanOptions, .parseJsonObject = (void*) ffParseVulkanJsonObject, .printModule = (void*) ffPrintVulkan, .generateJsonResult = (void*) ffGenerateVulkanJsonResult, diff --git a/src/modules/wallpaper/wallpaper.c b/src/modules/wallpaper/wallpaper.c index 8635bf325..445cadb33 100644 --- a/src/modules/wallpaper/wallpaper.c +++ b/src/modules/wallpaper/wallpaper.c @@ -76,6 +76,8 @@ void ffGenerateWallpaperJsonResult(FF_MAYBE_UNUSED FFWallpaperOptions* options, static FFModuleBaseInfo ffModuleInfo = { .name = FF_WALLPAPER_MODULE_NAME, .description = "Print image file path of current wallpaper", + .initOptions = (void*) ffInitWallpaperOptions, + .destroyOptions = (void*) ffDestroyWallpaperOptions, .parseJsonObject = (void*) ffParseWallpaperJsonObject, .printModule = (void*) ffPrintWallpaper, .generateJsonResult = (void*) ffGenerateWallpaperJsonResult, diff --git a/src/modules/weather/weather.c b/src/modules/weather/weather.c index aef1e26e9..3fad7d116 100644 --- a/src/modules/weather/weather.c +++ b/src/modules/weather/weather.c @@ -94,6 +94,8 @@ void ffGenerateWeatherJsonResult(FFWeatherOptions* options, yyjson_mut_doc* doc, static FFModuleBaseInfo ffModuleInfo = { .name = FF_WEATHER_MODULE_NAME, .description = "Print weather information", + .initOptions = (void*) ffInitWeatherOptions, + .destroyOptions = (void*) ffDestroyWeatherOptions, .parseJsonObject = (void*) ffParseWeatherJsonObject, .printModule = (void*) ffPrintWeather, .generateJsonResult = (void*) ffGenerateWeatherJsonResult, diff --git a/src/modules/wifi/wifi.c b/src/modules/wifi/wifi.c index ec5aaf18f..799c9e547 100644 --- a/src/modules/wifi/wifi.c +++ b/src/modules/wifi/wifi.c @@ -209,6 +209,8 @@ void ffGenerateWifiJsonResult(FF_MAYBE_UNUSED FFWifiOptions* options, yyjson_mut static FFModuleBaseInfo ffModuleInfo = { .name = FF_WIFI_MODULE_NAME, .description = "Print connected Wi-Fi info (SSID, connection and security protocol)", + .initOptions = (void*) ffInitWifiOptions, + .destroyOptions = (void*) ffDestroyWifiOptions, .parseJsonObject = (void*) ffParseWifiJsonObject, .printModule = (void*) ffPrintWifi, .generateJsonResult = (void*) ffGenerateWifiJsonResult, diff --git a/src/modules/wm/wm.c b/src/modules/wm/wm.c index 46a73e4a4..075176f0c 100644 --- a/src/modules/wm/wm.c +++ b/src/modules/wm/wm.c @@ -122,6 +122,8 @@ void ffGenerateWMJsonResult(FF_MAYBE_UNUSED FFWMOptions* options, yyjson_mut_doc static FFModuleBaseInfo ffModuleInfo = { .name = FF_WM_MODULE_NAME, .description = "Print window manager name and version", + .initOptions = (void*) ffInitWMOptions, + .destroyOptions = (void*) ffDestroyWMOptions, .parseJsonObject = (void*) ffParseWMJsonObject, .printModule = (void*) ffPrintWM, .generateJsonResult = (void*) ffGenerateWMJsonResult, diff --git a/src/modules/wmtheme/wmtheme.c b/src/modules/wmtheme/wmtheme.c index f5d425f51..302e73322 100644 --- a/src/modules/wmtheme/wmtheme.c +++ b/src/modules/wmtheme/wmtheme.c @@ -65,6 +65,8 @@ void ffGenerateWMThemeJsonResult(FF_MAYBE_UNUSED FFWMThemeOptions* options, yyjs static FFModuleBaseInfo ffModuleInfo = { .name = FF_WMTHEME_MODULE_NAME, .description = "Print current theme of window manager", + .initOptions = (void*) ffInitWMThemeOptions, + .destroyOptions = (void*) ffDestroyWMThemeOptions, .parseJsonObject = (void*) ffParseWMThemeJsonObject, .printModule = (void*) ffPrintWMTheme, .generateJsonResult = (void*) ffGenerateWMThemeJsonResult, diff --git a/src/modules/zpool/zpool.c b/src/modules/zpool/zpool.c index b88b6c7a0..68eebda09 100644 --- a/src/modules/zpool/zpool.c +++ b/src/modules/zpool/zpool.c @@ -167,6 +167,8 @@ void ffGenerateZpoolJsonResult(FF_MAYBE_UNUSED FFZpoolOptions* options, yyjson_m static FFModuleBaseInfo ffModuleInfo = { .name = FF_ZPOOL_MODULE_NAME, .description = "Print ZFS storage pools", + .initOptions = (void*) ffInitZpoolOptions, + .destroyOptions = (void*) ffDestroyZpoolOptions, .parseJsonObject = (void*) ffParseZpoolJsonObject, .printModule = (void*) ffPrintZpool, .generateJsonResult = (void*) ffGenerateZpoolJsonResult, From 559082806b370a62ddd4c81520e3fa56b0d11b58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 3 Aug 2025 22:50:56 +0800 Subject: [PATCH 25/83] Modules: export module info --- src/modules/battery/battery.c | 4 ++-- src/modules/battery/battery.h | 2 ++ src/modules/bios/bios.c | 4 ++-- src/modules/bios/bios.h | 2 ++ src/modules/bluetooth/bluetooth.c | 4 ++-- src/modules/bluetooth/bluetooth.h | 2 ++ src/modules/bluetoothradio/bluetoothradio.c | 4 ++-- src/modules/bluetoothradio/bluetoothradio.h | 2 ++ src/modules/board/board.c | 4 ++-- src/modules/board/board.h | 2 ++ src/modules/bootmgr/bootmgr.c | 4 ++-- src/modules/bootmgr/bootmgr.h | 2 ++ src/modules/break/break.c | 4 ++-- src/modules/break/break.h | 2 ++ src/modules/brightness/brightness.c | 4 ++-- src/modules/brightness/brightness.h | 2 ++ src/modules/btrfs/btrfs.c | 4 ++-- src/modules/btrfs/btrfs.h | 2 ++ src/modules/camera/camera.c | 4 ++-- src/modules/camera/camera.h | 2 ++ src/modules/chassis/chassis.c | 4 ++-- src/modules/chassis/chassis.h | 2 ++ src/modules/colors/colors.c | 4 ++-- src/modules/colors/colors.h | 2 ++ src/modules/command/command.c | 4 ++-- src/modules/command/command.h | 2 ++ src/modules/cpu/cpu.c | 4 ++-- src/modules/cpu/cpu.h | 2 ++ src/modules/cpucache/cpucache.c | 4 ++-- src/modules/cpucache/cpucache.h | 2 ++ src/modules/cpuusage/cpuusage.c | 4 ++-- src/modules/cpuusage/cpuusage.h | 2 ++ src/modules/cursor/cursor.c | 4 ++-- src/modules/cursor/cursor.h | 2 ++ src/modules/custom/custom.c | 4 ++-- src/modules/custom/custom.h | 2 ++ src/modules/datetime/datetime.c | 4 ++-- src/modules/datetime/datetime.h | 2 ++ src/modules/de/de.c | 4 ++-- src/modules/de/de.h | 2 ++ src/modules/disk/disk.c | 4 ++-- src/modules/disk/disk.h | 2 ++ src/modules/diskio/diskio.c | 4 ++-- src/modules/diskio/diskio.h | 2 ++ src/modules/display/display.c | 4 ++-- src/modules/display/display.h | 2 ++ src/modules/dns/dns.c | 4 ++-- src/modules/dns/dns.h | 2 ++ src/modules/editor/editor.c | 4 ++-- src/modules/editor/editor.h | 2 ++ src/modules/font/font.c | 4 ++-- src/modules/font/font.h | 2 ++ src/modules/gamepad/gamepad.c | 4 ++-- src/modules/gamepad/gamepad.h | 2 ++ src/modules/gpu/gpu.c | 4 ++-- src/modules/gpu/gpu.h | 2 ++ src/modules/host/host.c | 4 ++-- src/modules/host/host.h | 2 ++ src/modules/icons/icons.c | 4 ++-- src/modules/icons/icons.h | 2 ++ src/modules/initsystem/initsystem.c | 4 ++-- src/modules/initsystem/initsystem.h | 2 ++ src/modules/kernel/kernel.c | 4 ++-- src/modules/kernel/kernel.h | 2 ++ src/modules/keyboard/keyboard.c | 4 ++-- src/modules/keyboard/keyboard.h | 2 ++ src/modules/lm/lm.c | 4 ++-- src/modules/lm/lm.h | 2 ++ src/modules/loadavg/loadavg.c | 4 ++-- src/modules/loadavg/loadavg.h | 2 ++ src/modules/locale/locale.c | 4 ++-- src/modules/locale/locale.h | 2 ++ src/modules/localip/localip.c | 4 ++-- src/modules/localip/localip.h | 2 ++ src/modules/media/media.c | 4 ++-- src/modules/media/media.h | 2 ++ src/modules/memory/memory.c | 4 ++-- src/modules/memory/memory.h | 2 ++ src/modules/monitor/monitor.c | 4 ++-- src/modules/monitor/monitor.h | 2 ++ src/modules/mouse/mouse.c | 4 ++-- src/modules/mouse/mouse.h | 2 ++ src/modules/netio/netio.c | 6 +++--- src/modules/netio/netio.h | 2 ++ src/modules/opencl/opencl.c | 4 ++-- src/modules/opencl/opencl.h | 2 ++ src/modules/opengl/opengl.c | 4 ++-- src/modules/opengl/opengl.h | 2 ++ src/modules/os/os.c | 6 ++++-- src/modules/os/os.h | 2 ++ src/modules/packages/packages.c | 4 ++-- src/modules/packages/packages.h | 2 ++ src/modules/physicaldisk/physicaldisk.c | 4 ++-- src/modules/physicaldisk/physicaldisk.h | 2 ++ src/modules/physicalmemory/physicalmemory.c | 4 ++-- src/modules/physicalmemory/physicalmemory.h | 2 ++ src/modules/player/player.c | 4 ++-- src/modules/player/player.h | 2 ++ src/modules/poweradapter/poweradapter.c | 4 ++-- src/modules/poweradapter/poweradapter.h | 2 ++ src/modules/processes/processes.c | 4 ++-- src/modules/processes/processes.h | 2 ++ src/modules/publicip/publicip.c | 4 ++-- src/modules/publicip/publicip.h | 2 ++ src/modules/separator/separator.c | 4 ++-- src/modules/separator/separator.h | 2 ++ src/modules/shell/shell.c | 4 ++-- src/modules/shell/shell.h | 2 ++ src/modules/sound/sound.c | 4 ++-- src/modules/sound/sound.h | 2 ++ src/modules/swap/swap.c | 4 ++-- src/modules/swap/swap.h | 2 ++ src/modules/terminal/terminal.c | 4 ++-- src/modules/terminal/terminal.h | 2 ++ src/modules/terminalfont/terminalfont.c | 4 ++-- src/modules/terminalfont/terminalfont.h | 2 ++ src/modules/terminalsize/terminalsize.c | 4 ++-- src/modules/terminalsize/terminalsize.h | 2 ++ src/modules/terminaltheme/terminaltheme.c | 4 ++-- src/modules/terminaltheme/terminaltheme.h | 2 ++ src/modules/theme/theme.c | 4 ++-- src/modules/theme/theme.h | 2 ++ src/modules/title/title.c | 4 ++-- src/modules/title/title.h | 2 ++ src/modules/tpm/tpm.c | 4 ++-- src/modules/tpm/tpm.h | 2 ++ src/modules/uptime/uptime.c | 4 ++-- src/modules/uptime/uptime.h | 2 ++ src/modules/users/users.c | 4 ++-- src/modules/users/users.h | 2 ++ src/modules/version/version.c | 4 ++-- src/modules/version/version.h | 2 ++ src/modules/vulkan/vulkan.c | 4 ++-- src/modules/vulkan/vulkan.h | 2 ++ src/modules/wallpaper/wallpaper.c | 4 ++-- src/modules/wallpaper/wallpaper.h | 2 ++ src/modules/weather/weather.c | 4 ++-- src/modules/weather/weather.h | 2 ++ src/modules/wifi/wifi.c | 4 ++-- src/modules/wifi/wifi.h | 2 ++ src/modules/wm/wm.c | 4 ++-- src/modules/wm/wm.h | 2 ++ src/modules/wmtheme/wmtheme.c | 4 ++-- src/modules/wmtheme/wmtheme.h | 2 ++ src/modules/zpool/zpool.c | 4 ++-- src/modules/zpool/zpool.h | 2 ++ 146 files changed, 295 insertions(+), 147 deletions(-) diff --git a/src/modules/battery/battery.c b/src/modules/battery/battery.c index 27982c9b0..7d306accf 100644 --- a/src/modules/battery/battery.c +++ b/src/modules/battery/battery.c @@ -245,7 +245,7 @@ void ffGenerateBatteryJsonResult(FFBatteryOptions* options, yyjson_mut_doc* doc, } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffBatteryModuleInfo = { .name = FF_BATTERY_MODULE_NAME, .description = "Print battery capacity, status, etc", .initOptions = (void*) ffInitBatteryOptions, @@ -275,7 +275,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitBatteryOptions(FFBatteryOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffBatteryModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); options->temp = false; options->tempConfig = (FFColorRangeConfig) { 60, 80 }; diff --git a/src/modules/battery/battery.h b/src/modules/battery/battery.h index 60d0f1c89..9bde4f063 100644 --- a/src/modules/battery/battery.h +++ b/src/modules/battery/battery.h @@ -7,3 +7,5 @@ void ffPrintBattery(FFBatteryOptions* options); void ffInitBatteryOptions(FFBatteryOptions* options); void ffDestroyBatteryOptions(FFBatteryOptions* options); + +extern FFModuleBaseInfo ffBatteryModuleInfo; diff --git a/src/modules/bios/bios.c b/src/modules/bios/bios.c index bbf1a5f08..f2afa9c44 100644 --- a/src/modules/bios/bios.c +++ b/src/modules/bios/bios.c @@ -128,7 +128,7 @@ exit: ffStrbufDestroy(&bios.type); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffBiosModuleInfo = { .name = FF_BIOS_MODULE_NAME, .description = "Print information of 1st-stage bootloader (name, version, release date, etc)", .initOptions = (void*) ffInitBiosOptions, @@ -148,7 +148,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitBiosOptions(FFBiosOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffBiosModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/bios/bios.h b/src/modules/bios/bios.h index 14444c435..43c2a17e4 100644 --- a/src/modules/bios/bios.h +++ b/src/modules/bios/bios.h @@ -7,3 +7,5 @@ void ffPrintBios(FFBiosOptions* options); void ffInitBiosOptions(FFBiosOptions* options); void ffDestroyBiosOptions(FFBiosOptions* options); + +extern FFModuleBaseInfo ffBiosModuleInfo; diff --git a/src/modules/bluetooth/bluetooth.c b/src/modules/bluetooth/bluetooth.c index 4409b0a16..7df3ada40 100644 --- a/src/modules/bluetooth/bluetooth.c +++ b/src/modules/bluetooth/bluetooth.c @@ -163,7 +163,7 @@ void ffGenerateBluetoothJsonResult(FFBluetoothOptions* options, yyjson_mut_doc* } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffBluetoothModuleInfo = { .name = FF_BLUETOOTH_MODULE_NAME, .description = "List (connected) bluetooth devices", .initOptions = (void*) ffInitBluetoothOptions, @@ -184,7 +184,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitBluetoothOptions(FFBluetoothOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffBluetoothModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); options->showDisconnected = false; options->percent = (FFPercentageModuleConfig) { 50, 20, 0 }; diff --git a/src/modules/bluetooth/bluetooth.h b/src/modules/bluetooth/bluetooth.h index 20c3b6d81..448bebab1 100644 --- a/src/modules/bluetooth/bluetooth.h +++ b/src/modules/bluetooth/bluetooth.h @@ -7,3 +7,5 @@ void ffPrintBluetooth(FFBluetoothOptions* options); void ffInitBluetoothOptions(FFBluetoothOptions* options); void ffDestroyBluetoothOptions(FFBluetoothOptions* options); + +extern FFModuleBaseInfo ffBluetoothModuleInfo; diff --git a/src/modules/bluetoothradio/bluetoothradio.c b/src/modules/bluetoothradio/bluetoothradio.c index d55ab6c49..0a75e3205 100644 --- a/src/modules/bluetoothradio/bluetoothradio.c +++ b/src/modules/bluetoothradio/bluetoothradio.c @@ -166,7 +166,7 @@ void ffGenerateBluetoothRadioJsonResult(FF_MAYBE_UNUSED FFBluetoothRadioOptions* } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffBluetoothRadioModuleInfo = { .name = FF_BLUETOOTHRADIO_MODULE_NAME, .description = "List bluetooth radios width supported version and vendor", .initOptions = (void*) ffInitBluetoothRadioOptions, @@ -189,7 +189,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitBluetoothRadioOptions(FFBluetoothRadioOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffBluetoothRadioModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰐻"); } diff --git a/src/modules/bluetoothradio/bluetoothradio.h b/src/modules/bluetoothradio/bluetoothradio.h index ee9ef1195..d1371151f 100644 --- a/src/modules/bluetoothradio/bluetoothradio.h +++ b/src/modules/bluetoothradio/bluetoothradio.h @@ -7,3 +7,5 @@ void ffPrintBluetoothRadio(FFBluetoothRadioOptions* options); void ffInitBluetoothRadioOptions(FFBluetoothRadioOptions* options); void ffDestroyBluetoothRadioOptions(FFBluetoothRadioOptions* options); + +extern FFModuleBaseInfo ffBluetoothRadioModuleInfo; diff --git a/src/modules/board/board.c b/src/modules/board/board.c index 693b9b3cf..57cd52b3b 100644 --- a/src/modules/board/board.c +++ b/src/modules/board/board.c @@ -106,7 +106,7 @@ exit: ffStrbufDestroy(&board.serial); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffBoardModuleInfo = { .name = FF_BOARD_MODULE_NAME, .description = "Print motherboard name and other info", .initOptions = (void*) ffInitBoardOptions, @@ -125,7 +125,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitBoardOptions(FFBoardOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffBoardModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/board/board.h b/src/modules/board/board.h index 7fdbffe95..6760e736d 100644 --- a/src/modules/board/board.h +++ b/src/modules/board/board.h @@ -7,3 +7,5 @@ void ffPrintBoard(FFBoardOptions* options); void ffInitBoardOptions(FFBoardOptions* options); void ffDestroyBoardOptions(FFBoardOptions* options); + +extern FFModuleBaseInfo ffBoardModuleInfo; diff --git a/src/modules/bootmgr/bootmgr.c b/src/modules/bootmgr/bootmgr.c index 47c831350..d693acbaa 100644 --- a/src/modules/bootmgr/bootmgr.c +++ b/src/modules/bootmgr/bootmgr.c @@ -97,7 +97,7 @@ exit: ffStrbufDestroy(&bootmgr.firmware); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffBootmgrModuleInfo = { .name = FF_BOOTMGR_MODULE_NAME, .description = "Print information of 2nd-stage bootloader (name, firmware, etc)", .initOptions = (void*) ffInitBootmgrOptions, @@ -117,7 +117,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitBootmgrOptions(FFBootmgrOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffBootmgrModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/bootmgr/bootmgr.h b/src/modules/bootmgr/bootmgr.h index 31a3b7946..98b030602 100644 --- a/src/modules/bootmgr/bootmgr.h +++ b/src/modules/bootmgr/bootmgr.h @@ -7,3 +7,5 @@ void ffPrintBootmgr(FFBootmgrOptions* options); void ffInitBootmgrOptions(FFBootmgrOptions* options); void ffDestroyBootmgrOptions(FFBootmgrOptions* options); + +extern FFModuleBaseInfo ffBootmgrModuleInfo; diff --git a/src/modules/break/break.c b/src/modules/break/break.c index 978bff5c6..c2be5f5b0 100644 --- a/src/modules/break/break.c +++ b/src/modules/break/break.c @@ -21,7 +21,7 @@ void ffParseBreakJsonObject(FF_MAYBE_UNUSED FFBreakOptions* options, FF_MAYBE_UN } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffBreakModuleInfo = { .name = FF_BREAK_MODULE_NAME, .description = "Print a empty line", .initOptions = (void*) ffInitBreakOptions, @@ -32,7 +32,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitBreakOptions(FF_MAYBE_UNUSED FFBreakOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffBreakModuleInfo; } void ffDestroyBreakOptions(FF_MAYBE_UNUSED FFBreakOptions* options) diff --git a/src/modules/break/break.h b/src/modules/break/break.h index b651a503e..f436bfcbb 100644 --- a/src/modules/break/break.h +++ b/src/modules/break/break.h @@ -7,3 +7,5 @@ void ffPrintBreak(FFBreakOptions* options); void ffInitBreakOptions(FFBreakOptions* options); void ffDestroyBreakOptions(FFBreakOptions* options); + +extern FFModuleBaseInfo ffBreakModuleInfo; diff --git a/src/modules/brightness/brightness.c b/src/modules/brightness/brightness.c index cfd10aa10..4c93ea02f 100644 --- a/src/modules/brightness/brightness.c +++ b/src/modules/brightness/brightness.c @@ -187,7 +187,7 @@ void ffGenerateBrightnessJsonResult(FF_MAYBE_UNUSED FFBrightnessOptions* options } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffBrightnessModuleInfo = { .name = FF_BRIGHTNESS_MODULE_NAME, .description = "Print current brightness level of your monitors", .initOptions = (void*) ffInitBrightnessOptions, @@ -209,7 +209,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitBrightnessOptions(FFBrightnessOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffBrightnessModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰯪"); options->ddcciSleep = 10; diff --git a/src/modules/brightness/brightness.h b/src/modules/brightness/brightness.h index 36faaf304..0ee6b83c3 100644 --- a/src/modules/brightness/brightness.h +++ b/src/modules/brightness/brightness.h @@ -7,3 +7,5 @@ void ffPrintBrightness(FFBrightnessOptions* options); void ffInitBrightnessOptions(FFBrightnessOptions* options); void ffDestroyBrightnessOptions(FFBrightnessOptions* options); + +extern FFModuleBaseInfo ffBrightnessModuleInfo; diff --git a/src/modules/btrfs/btrfs.c b/src/modules/btrfs/btrfs.c index 0c96b7623..a2aab728b 100644 --- a/src/modules/btrfs/btrfs.c +++ b/src/modules/btrfs/btrfs.c @@ -200,7 +200,7 @@ void ffGenerateBtrfsJsonResult(FF_MAYBE_UNUSED FFBtrfsOptions* options, yyjson_m } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffBtrfsModuleInfo = { .name = FF_BTRFS_MODULE_NAME, .description = "Print Linux BTRFS volumes", .initOptions = (void*) ffInitBtrfsOptions, @@ -228,7 +228,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitBtrfsOptions(FFBtrfsOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffBtrfsModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󱑛"); options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; } diff --git a/src/modules/btrfs/btrfs.h b/src/modules/btrfs/btrfs.h index 25df25084..dbc31e0de 100644 --- a/src/modules/btrfs/btrfs.h +++ b/src/modules/btrfs/btrfs.h @@ -7,3 +7,5 @@ void ffPrintBtrfs(FFBtrfsOptions* options); void ffInitBtrfsOptions(FFBtrfsOptions* options); void ffDestroyBtrfsOptions(FFBtrfsOptions* options); + +extern FFModuleBaseInfo ffBtrfsModuleInfo; diff --git a/src/modules/camera/camera.c b/src/modules/camera/camera.c index 34155d207..39b643bdd 100644 --- a/src/modules/camera/camera.c +++ b/src/modules/camera/camera.c @@ -120,7 +120,7 @@ void ffGenerateCameraJsonResult(FF_MAYBE_UNUSED FFCameraOptions* options, yyjson } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffCameraModuleInfo = { .name = FF_CAMERA_MODULE_NAME, .description = "Print available cameras", .initOptions = (void*) ffInitCameraOptions, @@ -141,7 +141,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitCameraOptions(FFCameraOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffCameraModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰄀"); } diff --git a/src/modules/camera/camera.h b/src/modules/camera/camera.h index 47d2e1cc7..e1dc96839 100644 --- a/src/modules/camera/camera.h +++ b/src/modules/camera/camera.h @@ -7,3 +7,5 @@ void ffPrintCamera(FFCameraOptions* options); void ffInitCameraOptions(FFCameraOptions* options); void ffDestroyCameraOptions(FFCameraOptions* options); + +extern FFModuleBaseInfo ffCameraModuleInfo; diff --git a/src/modules/chassis/chassis.c b/src/modules/chassis/chassis.c index 827f9c507..e1cb72bb5 100644 --- a/src/modules/chassis/chassis.c +++ b/src/modules/chassis/chassis.c @@ -107,7 +107,7 @@ exit: ffStrbufDestroy(&result.serial); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffChassisModuleInfo = { .name = FF_CHASSIS_MODULE_NAME, .description = "Print chassis type (desktop, laptop, etc)", .initOptions = (void*) ffInitChassisOptions, @@ -126,7 +126,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitChassisOptions(FFChassisOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffChassisModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/chassis/chassis.h b/src/modules/chassis/chassis.h index f37358c94..ed6870cde 100644 --- a/src/modules/chassis/chassis.h +++ b/src/modules/chassis/chassis.h @@ -7,3 +7,5 @@ void ffPrintChassis(FFChassisOptions* options); void ffInitChassisOptions(FFChassisOptions* options); void ffDestroyChassisOptions(FFChassisOptions* options); + +extern FFModuleBaseInfo ffChassisModuleInfo; diff --git a/src/modules/colors/colors.c b/src/modules/colors/colors.c index 2eb180cae..22c8b639f 100644 --- a/src/modules/colors/colors.c +++ b/src/modules/colors/colors.c @@ -239,7 +239,7 @@ void ffGenerateColorsJsonConfig(FFColorsOptions* options, yyjson_mut_doc* doc, y } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffColorsModuleInfo = { .name = FF_COLORS_MODULE_NAME, .description = "Print some colored blocks", .initOptions = (void*) ffInitColorsOptions, @@ -251,7 +251,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitColorsOptions(FFColorsOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffColorsModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); ffStrbufSetStatic(&options->moduleArgs.key, " "); options->symbol = FF_COLORS_SYMBOL_BACKGROUND; diff --git a/src/modules/colors/colors.h b/src/modules/colors/colors.h index 8520f54b6..9d250dc8a 100644 --- a/src/modules/colors/colors.h +++ b/src/modules/colors/colors.h @@ -7,3 +7,5 @@ void ffPrintColors(FFColorsOptions* options); void ffInitColorsOptions(FFColorsOptions* options); void ffDestroyColorsOptions(FFColorsOptions* options); + +extern FFModuleBaseInfo ffColorsModuleInfo; diff --git a/src/modules/command/command.c b/src/modules/command/command.c index 22f5fd17c..b2045566f 100644 --- a/src/modules/command/command.c +++ b/src/modules/command/command.c @@ -120,7 +120,7 @@ void ffGenerateCommandJsonResult(FF_MAYBE_UNUSED FFCommandOptions* options, yyjs yyjson_mut_obj_add_strbuf(doc, module, "result", &result); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffCommandModuleInfo = { .name = FF_COMMAND_MODULE_NAME, .description = "Run custom shell scripts", .initOptions = (void*) ffInitCommandOptions, @@ -136,7 +136,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitCommandOptions(FFCommandOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffCommandModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); ffStrbufInitStatic(&options->shell, diff --git a/src/modules/command/command.h b/src/modules/command/command.h index 246412801..195de886b 100644 --- a/src/modules/command/command.h +++ b/src/modules/command/command.h @@ -7,3 +7,5 @@ void ffPrintCommand(FFCommandOptions* options); void ffInitCommandOptions(FFCommandOptions* options); void ffDestroyCommandOptions(FFCommandOptions* options); + +extern FFModuleBaseInfo ffCommandModuleInfo; diff --git a/src/modules/cpu/cpu.c b/src/modules/cpu/cpu.c index 5af82f82c..2c35bbe56 100644 --- a/src/modules/cpu/cpu.c +++ b/src/modules/cpu/cpu.c @@ -212,7 +212,7 @@ void ffGenerateCPUJsonResult(FFCPUOptions* options, yyjson_mut_doc* doc, yyjson_ ffStrbufDestroy(&cpu.vendor); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffCPUModuleInfo = { .name = FF_CPU_MODULE_NAME, .description = "Print CPU name, frequency, etc", .initOptions = (void*) ffInitCPUOptions, @@ -237,7 +237,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitCPUOptions(FFCPUOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffCPUModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); options->temp = false; options->tempConfig = (FFColorRangeConfig) { 60, 80 }; diff --git a/src/modules/cpu/cpu.h b/src/modules/cpu/cpu.h index 1db4efbf7..b8ffcded4 100644 --- a/src/modules/cpu/cpu.h +++ b/src/modules/cpu/cpu.h @@ -7,3 +7,5 @@ void ffPrintCPU(FFCPUOptions* options); void ffInitCPUOptions(FFCPUOptions* options); void ffDestroyCPUOptions(FFCPUOptions* options); + +extern FFModuleBaseInfo ffCPUModuleInfo; diff --git a/src/modules/cpucache/cpucache.c b/src/modules/cpucache/cpucache.c index 29a574afa..b46b7de18 100644 --- a/src/modules/cpucache/cpucache.c +++ b/src/modules/cpucache/cpucache.c @@ -208,7 +208,7 @@ exit: ffListDestroy(&result.caches[3]); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffCPUCacheModuleInfo = { .name = FF_CPUCACHE_MODULE_NAME, .description = "Print CPU cache sizes", .initOptions = (void*) ffInitCPUCacheOptions, @@ -225,7 +225,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitCPUCacheOptions(FFCPUCacheOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffCPUCacheModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); options->compact = false; diff --git a/src/modules/cpucache/cpucache.h b/src/modules/cpucache/cpucache.h index c6d5d8ef6..5a9fa164a 100644 --- a/src/modules/cpucache/cpucache.h +++ b/src/modules/cpucache/cpucache.h @@ -7,3 +7,5 @@ void ffPrintCPUCache(FFCPUCacheOptions* options); void ffInitCPUCacheOptions(FFCPUCacheOptions* options); void ffDestroyCPUCacheOptions(FFCPUCacheOptions* options); + +extern FFModuleBaseInfo ffCPUCacheModuleInfo; diff --git a/src/modules/cpuusage/cpuusage.c b/src/modules/cpuusage/cpuusage.c index c5a6f595d..d50a5cac1 100644 --- a/src/modules/cpuusage/cpuusage.c +++ b/src/modules/cpuusage/cpuusage.c @@ -174,7 +174,7 @@ void ffGenerateCPUUsageJsonResult(FFCPUUsageOptions* options, yyjson_mut_doc* do } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffCPUUsageModuleInfo = { .name = FF_CPUUSAGE_MODULE_NAME, .description = "Print CPU usage. Costs some time to collect data", .initOptions = (void*) ffInitCPUUsageOptions, @@ -197,7 +197,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitCPUUsageOptions(FFCPUUsageOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffCPUUsageModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰓅"); options->separate = false; options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; diff --git a/src/modules/cpuusage/cpuusage.h b/src/modules/cpuusage/cpuusage.h index bbd74f085..8e2b26091 100644 --- a/src/modules/cpuusage/cpuusage.h +++ b/src/modules/cpuusage/cpuusage.h @@ -9,3 +9,5 @@ void ffPrepareCPUUsage(); void ffPrintCPUUsage(FFCPUUsageOptions* options); void ffInitCPUUsageOptions(FFCPUUsageOptions* options); void ffDestroyCPUUsageOptions(FFCPUUsageOptions* options); + +extern FFModuleBaseInfo ffCPUUsageModuleInfo; diff --git a/src/modules/cursor/cursor.c b/src/modules/cursor/cursor.c index edec4b5c9..00b59003a 100644 --- a/src/modules/cursor/cursor.c +++ b/src/modules/cursor/cursor.c @@ -94,7 +94,7 @@ void ffGenerateCursorJsonResult(FF_MAYBE_UNUSED FFCursorOptions* options, yyjson ffStrbufDestroy(&result.size); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffCursorModuleInfo = { .name = FF_CURSOR_MODULE_NAME, .description = "Print cursor style name", .initOptions = (void*) ffInitCursorOptions, @@ -111,7 +111,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitCursorOptions(FFCursorOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffCursorModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰆿"); } diff --git a/src/modules/cursor/cursor.h b/src/modules/cursor/cursor.h index 939033682..b4fcc1e3b 100644 --- a/src/modules/cursor/cursor.h +++ b/src/modules/cursor/cursor.h @@ -7,3 +7,5 @@ void ffPrintCursor(FFCursorOptions* options); void ffInitCursorOptions(FFCursorOptions* options); void ffDestroyCursorOptions(FFCursorOptions* options); + +extern FFModuleBaseInfo ffCursorModuleInfo; diff --git a/src/modules/custom/custom.c b/src/modules/custom/custom.c index 4f3e706fa..0f5182cd7 100644 --- a/src/modules/custom/custom.c +++ b/src/modules/custom/custom.c @@ -30,7 +30,7 @@ void ffParseCustomJsonObject(FFCustomOptions* options, yyjson_val* module) } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffCustomModuleInfo = { .name = FF_CUSTOM_MODULE_NAME, .description = "Print a custom string, with or without key", .initOptions = (void*) ffInitCustomOptions, @@ -42,7 +42,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitCustomOptions(FFCustomOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffCustomModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); ffStrbufSetStatic(&options->moduleArgs.key, " "); } diff --git a/src/modules/custom/custom.h b/src/modules/custom/custom.h index 172fe9ea3..50611704c 100644 --- a/src/modules/custom/custom.h +++ b/src/modules/custom/custom.h @@ -7,3 +7,5 @@ void ffPrintCustom(FFCustomOptions* options); void ffInitCustomOptions(FFCustomOptions* options); void ffDestroyCustomOptions(FFCustomOptions* options); + +extern FFModuleBaseInfo ffCustomModuleInfo; diff --git a/src/modules/datetime/datetime.c b/src/modules/datetime/datetime.c index f90780a88..3bf57a7a9 100644 --- a/src/modules/datetime/datetime.c +++ b/src/modules/datetime/datetime.c @@ -143,7 +143,7 @@ void ffGenerateDateTimeJsonResult(FF_MAYBE_UNUSED FFDateTimeOptions* options, yy yyjson_mut_obj_add_strcpy(doc, module, "result", ffTimeToFullStr(ffTimeGetNow())); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffDateTimeModuleInfo = { .name = FF_DATETIME_MODULE_NAME, .description = "Print current date and time", .initOptions = (void*) ffInitDateTimeOptions, @@ -181,7 +181,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitDateTimeOptions(FFDateTimeOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffDateTimeModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/datetime/datetime.h b/src/modules/datetime/datetime.h index b169e73d1..2b5383b89 100644 --- a/src/modules/datetime/datetime.h +++ b/src/modules/datetime/datetime.h @@ -7,3 +7,5 @@ void ffPrintDateTime(FFDateTimeOptions* options); void ffInitDateTimeOptions(FFDateTimeOptions* options); void ffDestroyDateTimeOptions(FFDateTimeOptions* options); + +extern FFModuleBaseInfo ffDateTimeModuleInfo; diff --git a/src/modules/de/de.c b/src/modules/de/de.c index 4ec94aa77..4390544a1 100644 --- a/src/modules/de/de.c +++ b/src/modules/de/de.c @@ -91,7 +91,7 @@ void ffGenerateDEJsonResult(FF_MAYBE_UNUSED FFDEOptions* options, yyjson_mut_doc yyjson_mut_obj_add_strbuf(doc, obj, "version", &version); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffDEModuleInfo = { .name = FF_DE_MODULE_NAME, .description = "Print desktop environment name", .initOptions = (void*) ffInitDEOptions, @@ -109,7 +109,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitDEOptions(FFDEOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffDEModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); options->slowVersionDetection = false; diff --git a/src/modules/de/de.h b/src/modules/de/de.h index 01cc458aa..90b5a9662 100644 --- a/src/modules/de/de.h +++ b/src/modules/de/de.h @@ -7,3 +7,5 @@ void ffPrintDE(FFDEOptions* options); void ffInitDEOptions(FFDEOptions* options); void ffDestroyDEOptions(FFDEOptions* options); + +extern FFModuleBaseInfo ffDEModuleInfo; diff --git a/src/modules/disk/disk.c b/src/modules/disk/disk.c index a8b646ff0..0f8259722 100644 --- a/src/modules/disk/disk.c +++ b/src/modules/disk/disk.c @@ -412,7 +412,7 @@ void ffGenerateDiskJsonResult(FFDiskOptions* options, yyjson_mut_doc* doc, yyjso } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffDiskModuleInfo = { .name = FF_DISK_MODULE_NAME, .description = "Print partitions, space usage, file system, etc", .initOptions = (void*) ffInitDiskOptions, @@ -451,7 +451,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitDiskOptions(FFDiskOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffDiskModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); ffStrbufInit(&options->folders); diff --git a/src/modules/disk/disk.h b/src/modules/disk/disk.h index e21531eae..cf0ee3478 100644 --- a/src/modules/disk/disk.h +++ b/src/modules/disk/disk.h @@ -7,3 +7,5 @@ void ffPrintDisk(FFDiskOptions* options); void ffInitDiskOptions(FFDiskOptions* options); void ffDestroyDiskOptions(FFDiskOptions* options); + +extern FFModuleBaseInfo ffDiskModuleInfo; diff --git a/src/modules/diskio/diskio.c b/src/modules/diskio/diskio.c index 6bc13524e..5764aa1b8 100644 --- a/src/modules/diskio/diskio.c +++ b/src/modules/diskio/diskio.c @@ -170,7 +170,7 @@ void ffGenerateDiskIOJsonResult(FFDiskIOOptions* options, yyjson_mut_doc* doc, y } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffDiskIOModuleInfo = { .name = FF_DISKIO_MODULE_NAME, .description = "Print physical disk I/O throughput", .initOptions = (void*) ffInitDiskIOOptions, @@ -193,7 +193,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitDiskIOOptions(FFDiskIOOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffDiskIOModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰓅"); ffStrbufInit(&options->namePrefix); diff --git a/src/modules/diskio/diskio.h b/src/modules/diskio/diskio.h index b3fa27bde..3dca4949f 100644 --- a/src/modules/diskio/diskio.h +++ b/src/modules/diskio/diskio.h @@ -9,3 +9,5 @@ void ffPrepareDiskIO(FFDiskIOOptions* options); void ffPrintDiskIO(FFDiskIOOptions* options); void ffInitDiskIOOptions(FFDiskIOOptions* options); void ffDestroyDiskIOOptions(FFDiskIOOptions* options); + +extern FFModuleBaseInfo ffDiskIOModuleInfo; diff --git a/src/modules/display/display.c b/src/modules/display/display.c index ecefdbe91..40ebc3477 100644 --- a/src/modules/display/display.c +++ b/src/modules/display/display.c @@ -402,7 +402,7 @@ void ffGenerateDisplayJsonResult(FF_MAYBE_UNUSED FFDisplayOptions* options, yyjs } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffDisplayModuleInfo = { .name = FF_DISPLAY_MODULE_NAME, .description = "Print resolutions, refresh rates, etc", .initOptions = (void*) ffInitDisplayOptions, @@ -441,7 +441,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitDisplayOptions(FFDisplayOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffDisplayModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰍹"); options->compactType = FF_DISPLAY_COMPACT_TYPE_NONE; options->preciseRefreshRate = false; diff --git a/src/modules/display/display.h b/src/modules/display/display.h index 7479295cf..9c3950aea 100644 --- a/src/modules/display/display.h +++ b/src/modules/display/display.h @@ -7,3 +7,5 @@ void ffPrintDisplay(FFDisplayOptions* options); void ffInitDisplayOptions(FFDisplayOptions* options); void ffDestroyDisplayOptions(FFDisplayOptions* options); + +extern FFModuleBaseInfo ffDisplayModuleInfo; diff --git a/src/modules/dns/dns.c b/src/modules/dns/dns.c index 749aa8d90..4de82d78b 100644 --- a/src/modules/dns/dns.c +++ b/src/modules/dns/dns.c @@ -139,7 +139,7 @@ exit: } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffDNSModuleInfo = { .name = FF_DNS_MODULE_NAME, .description = "Print configured DNS servers", .initOptions = (void*) ffInitDNSOptions, @@ -155,7 +155,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitDNSOptions(FFDNSOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffDNSModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰇖"); options->showType = FF_DNS_TYPE_BOTH; diff --git a/src/modules/dns/dns.h b/src/modules/dns/dns.h index a26504d59..46bff8c13 100644 --- a/src/modules/dns/dns.h +++ b/src/modules/dns/dns.h @@ -7,3 +7,5 @@ void ffPrintDNS(FFDNSOptions* options); void ffInitDNSOptions(FFDNSOptions* options); void ffDestroyDNSOptions(FFDNSOptions* options); + +extern FFModuleBaseInfo ffDNSModuleInfo; diff --git a/src/modules/editor/editor.c b/src/modules/editor/editor.c index d6e08fda0..256a434fe 100644 --- a/src/modules/editor/editor.c +++ b/src/modules/editor/editor.c @@ -104,7 +104,7 @@ void ffGenerateEditorJsonResult(FF_MAYBE_UNUSED FFEditorOptions* options, yyjson ffStrbufDestroy(&result.version); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffEditorModuleInfo = { .name = FF_EDITOR_MODULE_NAME, .description = "Print information of the default editor ($VISUAL or $EDITOR)", .initOptions = (void*) ffInitEditorOptions, @@ -124,7 +124,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitEditorOptions(FFEditorOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffEditorModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󱞎"); } diff --git a/src/modules/editor/editor.h b/src/modules/editor/editor.h index c18c8f67d..0f597fffc 100644 --- a/src/modules/editor/editor.h +++ b/src/modules/editor/editor.h @@ -7,3 +7,5 @@ void ffPrintEditor(FFEditorOptions* options); void ffInitEditorOptions(FFEditorOptions* options); void ffDestroyEditorOptions(FFEditorOptions* options); + +extern FFModuleBaseInfo ffEditorModuleInfo; diff --git a/src/modules/font/font.c b/src/modules/font/font.c index f7d272615..4ec299478 100644 --- a/src/modules/font/font.c +++ b/src/modules/font/font.c @@ -88,7 +88,7 @@ void ffGenerateFontJsonResult(FF_MAYBE_UNUSED FFFontOptions* options, yyjson_mut ffStrbufDestroy(&font.fonts[i]); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffFontModuleInfo = { .name = FF_FONT_MODULE_NAME, .description = "Print system font names", .initOptions = (void*) ffInitFontOptions, @@ -108,7 +108,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitFontOptions(FFFontOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffFontModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/font/font.h b/src/modules/font/font.h index 01d78f0ec..0872ce7b1 100644 --- a/src/modules/font/font.h +++ b/src/modules/font/font.h @@ -7,3 +7,5 @@ void ffPrintFont(FFFontOptions* options); void ffInitFontOptions(FFFontOptions* options); void ffDestroyFontOptions(FFFontOptions* options); + +extern FFModuleBaseInfo ffFontModuleInfo; diff --git a/src/modules/gamepad/gamepad.c b/src/modules/gamepad/gamepad.c index 1558d5873..854098ea5 100644 --- a/src/modules/gamepad/gamepad.c +++ b/src/modules/gamepad/gamepad.c @@ -130,7 +130,7 @@ void ffGenerateGamepadJsonResult(FF_MAYBE_UNUSED FFGamepadOptions* options, yyjs } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffGamepadModuleInfo = { .name = FF_GAMEPAD_MODULE_NAME, .description = "List (connected) gamepads", .initOptions = (void*) ffInitGamepadOptions, @@ -149,7 +149,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitGamepadOptions(FFGamepadOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffGamepadModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰺵"); options->percent = (FFPercentageModuleConfig) { 50, 20, 0 }; } diff --git a/src/modules/gamepad/gamepad.h b/src/modules/gamepad/gamepad.h index 309edd0a7..7534fff68 100644 --- a/src/modules/gamepad/gamepad.h +++ b/src/modules/gamepad/gamepad.h @@ -7,3 +7,5 @@ void ffPrintGamepad(FFGamepadOptions* options); void ffInitGamepadOptions(FFGamepadOptions* options); void ffDestroyGamepadOptions(FFGamepadOptions* options); + +extern FFModuleBaseInfo ffGamepadModuleInfo; diff --git a/src/modules/gpu/gpu.c b/src/modules/gpu/gpu.c index e74eb3ccf..3b4813f8b 100644 --- a/src/modules/gpu/gpu.c +++ b/src/modules/gpu/gpu.c @@ -414,7 +414,7 @@ void ffGenerateGPUJsonResult(FFGPUOptions* options, yyjson_mut_doc* doc, yyjson_ } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffGPUModuleInfo = { .name = FF_GPU_MODULE_NAME, .description = "Print GPU names, graphic memory size, type, etc", .initOptions = (void*) ffInitGPUOptions, @@ -449,7 +449,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitGPUOptions(FFGPUOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffGPUModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰾲"); options->driverSpecific = false; diff --git a/src/modules/gpu/gpu.h b/src/modules/gpu/gpu.h index 36dbd441d..e112f740f 100644 --- a/src/modules/gpu/gpu.h +++ b/src/modules/gpu/gpu.h @@ -7,3 +7,5 @@ void ffPrintGPU(FFGPUOptions* options); void ffInitGPUOptions(FFGPUOptions* options); void ffDestroyGPUOptions(FFGPUOptions* options); + +extern FFModuleBaseInfo ffGPUModuleInfo; diff --git a/src/modules/host/host.c b/src/modules/host/host.c index 9d1c7e74b..08c7c36d2 100644 --- a/src/modules/host/host.c +++ b/src/modules/host/host.c @@ -131,7 +131,7 @@ exit: ffStrbufDestroy(&host.vendor); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffHostModuleInfo = { .name = FF_HOST_MODULE_NAME, .description = "Print product name of your computer", .initOptions = (void*) ffInitHostOptions, @@ -153,7 +153,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitHostOptions(FFHostOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffHostModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰌢"); } diff --git a/src/modules/host/host.h b/src/modules/host/host.h index 780849bf2..d684b2043 100644 --- a/src/modules/host/host.h +++ b/src/modules/host/host.h @@ -7,3 +7,5 @@ void ffPrintHost(FFHostOptions* options); void ffInitHostOptions(FFHostOptions* options); void ffDestroyHostOptions(FFHostOptions* options); + +extern FFModuleBaseInfo ffHostModuleInfo; diff --git a/src/modules/icons/icons.c b/src/modules/icons/icons.c index d8ebf7574..91225fdf1 100644 --- a/src/modules/icons/icons.c +++ b/src/modules/icons/icons.c @@ -86,7 +86,7 @@ void ffGenerateIconsJsonResult(FF_MAYBE_UNUSED FFIconsOptions* options, yyjson_m ffStrbufDestroy(&result.icons2); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffIconsModuleInfo = { .name = FF_ICONS_MODULE_NAME, .description = "Print icon style name", .initOptions = (void*) ffInitIconsOptions, @@ -103,7 +103,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitIconsOptions(FFIconsOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffIconsModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/icons/icons.h b/src/modules/icons/icons.h index d31a83a9a..6ec8b4ee8 100644 --- a/src/modules/icons/icons.h +++ b/src/modules/icons/icons.h @@ -7,3 +7,5 @@ void ffPrintIcons(FFIconsOptions* options); void ffInitIconsOptions(FFIconsOptions* options); void ffDestroyIconsOptions(FFIconsOptions* options); + +extern FFModuleBaseInfo ffIconsModuleInfo; diff --git a/src/modules/initsystem/initsystem.c b/src/modules/initsystem/initsystem.c index 1652838a1..19625dc17 100644 --- a/src/modules/initsystem/initsystem.c +++ b/src/modules/initsystem/initsystem.c @@ -98,7 +98,7 @@ exit: ffStrbufDestroy(&result.version); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffInitSystemModuleInfo = { .name = FF_INITSYSTEM_MODULE_NAME, .description = "Print init system (pid 1) name and version", .initOptions = (void*) ffInitInitSystemOptions, @@ -117,7 +117,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitInitSystemOptions(FFInitSystemOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffInitSystemModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰿄"); } diff --git a/src/modules/initsystem/initsystem.h b/src/modules/initsystem/initsystem.h index 718f6691b..0a021ff61 100644 --- a/src/modules/initsystem/initsystem.h +++ b/src/modules/initsystem/initsystem.h @@ -7,3 +7,5 @@ void ffPrintInitSystem(FFInitSystemOptions* options); void ffInitInitSystemOptions(FFInitSystemOptions* options); void ffDestroyInitSystemOptions(FFInitSystemOptions* options); + +extern FFModuleBaseInfo ffInitSystemModuleInfo; diff --git a/src/modules/kernel/kernel.c b/src/modules/kernel/kernel.c index 23b544d9c..21d1e0ad9 100644 --- a/src/modules/kernel/kernel.c +++ b/src/modules/kernel/kernel.c @@ -66,7 +66,7 @@ void ffGenerateKernelJsonResult(FF_MAYBE_UNUSED FFKernelOptions* options, yyjson yyjson_mut_obj_add_uint(doc, obj, "pageSize", info->pageSize); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffKernelModuleInfo = { .name = FF_KERNEL_MODULE_NAME, .description = "Print system kernel version", .initOptions = (void*) ffInitKernelOptions, @@ -87,7 +87,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitKernelOptions(FFKernelOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffKernelModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/kernel/kernel.h b/src/modules/kernel/kernel.h index c1a6be856..7e2c0c68d 100644 --- a/src/modules/kernel/kernel.h +++ b/src/modules/kernel/kernel.h @@ -7,3 +7,5 @@ void ffPrintKernel(FFKernelOptions* options); void ffInitKernelOptions(FFKernelOptions* options); void ffDestroyKernelOptions(FFKernelOptions* options); + +extern FFModuleBaseInfo ffKernelModuleInfo; diff --git a/src/modules/keyboard/keyboard.c b/src/modules/keyboard/keyboard.c index d024444ec..d60d6543b 100644 --- a/src/modules/keyboard/keyboard.c +++ b/src/modules/keyboard/keyboard.c @@ -96,7 +96,7 @@ void ffGenerateKeyboardJsonResult(FF_MAYBE_UNUSED FFKeyboardOptions* options, yy } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffKeyboardModuleInfo = { .name = FF_KEYBOARD_MODULE_NAME, .description = "List (connected) keyboards", .initOptions = (void*) ffInitKeyboardOptions, @@ -113,7 +113,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitKeyboardOptions(FFKeyboardOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffKeyboardModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/keyboard/keyboard.h b/src/modules/keyboard/keyboard.h index b54a3ccba..140faf3ad 100644 --- a/src/modules/keyboard/keyboard.h +++ b/src/modules/keyboard/keyboard.h @@ -7,3 +7,5 @@ void ffPrintKeyboard(FFKeyboardOptions* options); void ffInitKeyboardOptions(FFKeyboardOptions* options); void ffDestroyKeyboardOptions(FFKeyboardOptions* options); + +extern FFModuleBaseInfo ffKeyboardModuleInfo; diff --git a/src/modules/lm/lm.c b/src/modules/lm/lm.c index cba026452..34bd9a40b 100644 --- a/src/modules/lm/lm.c +++ b/src/modules/lm/lm.c @@ -99,7 +99,7 @@ exit: ffStrbufDestroy(&result.version); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffLMModuleInfo = { .name = FF_LM_MODULE_NAME, .description = "Print login manager (desktop manager) name and version", .initOptions = (void*) ffInitLMOptions, @@ -117,7 +117,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitLMOptions(FFLMOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffLMModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰧨"); } diff --git a/src/modules/lm/lm.h b/src/modules/lm/lm.h index f6e1569e1..1dbf6d355 100644 --- a/src/modules/lm/lm.h +++ b/src/modules/lm/lm.h @@ -7,3 +7,5 @@ void ffPrintLM(FFLMOptions* options); void ffInitLMOptions(FFLMOptions* options); void ffDestroyLMOptions(FFLMOptions* options); + +extern FFModuleBaseInfo ffLMModuleInfo; diff --git a/src/modules/loadavg/loadavg.c b/src/modules/loadavg/loadavg.c index b7aeb71a0..1b7cd4e44 100644 --- a/src/modules/loadavg/loadavg.c +++ b/src/modules/loadavg/loadavg.c @@ -150,7 +150,7 @@ void ffGenerateLoadavgJsonResult(FF_MAYBE_UNUSED FFLoadavgOptions* options, yyjs yyjson_mut_arr_add_real(doc, arr, result[i]); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffLoadavgModuleInfo = { .name = FF_LOADAVG_MODULE_NAME, .description = "Print system load averages", .initOptions = (void*) ffInitLoadavgOptions, @@ -168,7 +168,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitLoadavgOptions(FFLoadavgOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffLoadavgModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; diff --git a/src/modules/loadavg/loadavg.h b/src/modules/loadavg/loadavg.h index 1d546f57b..b1cecb6f0 100644 --- a/src/modules/loadavg/loadavg.h +++ b/src/modules/loadavg/loadavg.h @@ -7,3 +7,5 @@ void ffPrintLoadavg(FFLoadavgOptions* options); void ffInitLoadavgOptions(FFLoadavgOptions* options); void ffDestroyLoadavgOptions(FFLoadavgOptions* options); + +extern FFModuleBaseInfo ffLoadavgModuleInfo; diff --git a/src/modules/locale/locale.c b/src/modules/locale/locale.c index fdcd045f1..cb8a4496d 100644 --- a/src/modules/locale/locale.c +++ b/src/modules/locale/locale.c @@ -63,7 +63,7 @@ void ffGenerateLocaleJsonResult(FF_MAYBE_UNUSED FFLocaleOptions* options, yyjson yyjson_mut_obj_add_strbuf(doc, module, "result", &locale); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffLocaleModuleInfo = { .name = FF_LOCALE_MODULE_NAME, .description = "Print system locale name", .initOptions = (void*) ffInitLocaleOptions, @@ -79,7 +79,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitLocaleOptions(FFLocaleOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffLocaleModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/locale/locale.h b/src/modules/locale/locale.h index c1fe3f8f7..3420a954c 100644 --- a/src/modules/locale/locale.h +++ b/src/modules/locale/locale.h @@ -7,3 +7,5 @@ void ffPrintLocale(FFLocaleOptions* options); void ffInitLocaleOptions(FFLocaleOptions* options); void ffDestroyLocaleOptions(FFLocaleOptions* options); + +extern FFModuleBaseInfo ffLocaleModuleInfo; diff --git a/src/modules/localip/localip.c b/src/modules/localip/localip.c index 72bab65a5..1feb6b6bc 100644 --- a/src/modules/localip/localip.c +++ b/src/modules/localip/localip.c @@ -385,7 +385,7 @@ void ffGenerateLocalIpJsonResult(FF_MAYBE_UNUSED FFLocalIpOptions* options, yyjs } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffLocalIPModuleInfo = { .name = FF_LOCALIP_MODULE_NAME, .description = "List local IP addresses (v4 or v6), MAC addresses, etc", .initOptions = (void*) ffInitLocalIpOptions, @@ -408,7 +408,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitLocalIpOptions(FFLocalIpOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffLocalIPModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰩟"); options->showType = FF_LOCALIP_TYPE_IPV4_BIT | FF_LOCALIP_TYPE_PREFIX_LEN_BIT diff --git a/src/modules/localip/localip.h b/src/modules/localip/localip.h index 1ac255979..9a2e3876e 100644 --- a/src/modules/localip/localip.h +++ b/src/modules/localip/localip.h @@ -7,3 +7,5 @@ void ffPrintLocalIp(FFLocalIpOptions* options); void ffInitLocalIpOptions(FFLocalIpOptions* options); void ffDestroyLocalIpOptions(FFLocalIpOptions* options); + +extern FFModuleBaseInfo ffLocalIPModuleInfo; diff --git a/src/modules/media/media.c b/src/modules/media/media.c index 8fb1555d4..290f6ec38 100644 --- a/src/modules/media/media.c +++ b/src/modules/media/media.c @@ -151,7 +151,7 @@ void ffGenerateMediaJsonResult(FF_MAYBE_UNUSED FFMediaOptions* options, yyjson_m yyjson_mut_obj_add_strbuf(doc, player, "url", &media->url); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffMediaModuleInfo = { .name = FF_MEDIA_MODULE_NAME, .description = "Print playing song name", .initOptions = (void*) ffInitMediaOptions, @@ -171,7 +171,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitMediaOptions(FFMediaOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffMediaModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/media/media.h b/src/modules/media/media.h index 7c010b1fe..3ddbbfdf7 100644 --- a/src/modules/media/media.h +++ b/src/modules/media/media.h @@ -7,3 +7,5 @@ void ffPrintMedia(FFMediaOptions* options); void ffInitMediaOptions(FFMediaOptions* options); void ffDestroyMediaOptions(FFMediaOptions* options); + +extern FFModuleBaseInfo ffMediaModuleInfo; diff --git a/src/modules/memory/memory.c b/src/modules/memory/memory.c index 7388c44cc..fa1fbbc9f 100644 --- a/src/modules/memory/memory.c +++ b/src/modules/memory/memory.c @@ -113,7 +113,7 @@ void ffGenerateMemoryJsonResult(FF_MAYBE_UNUSED FFMemoryOptions* options, yyjson yyjson_mut_obj_add_uint(doc, obj, "used", storage.bytesUsed); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffMemoryModuleInfo = { .name = FF_MEMORY_MODULE_NAME, .description = "Print system memory usage info", .initOptions = (void*) ffInitMemoryOptions, @@ -132,7 +132,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitMemoryOptions(FFMemoryOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffMemoryModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; } diff --git a/src/modules/memory/memory.h b/src/modules/memory/memory.h index dcef5e50d..69dc76402 100644 --- a/src/modules/memory/memory.h +++ b/src/modules/memory/memory.h @@ -7,3 +7,5 @@ void ffPrintMemory(FFMemoryOptions* options); void ffInitMemoryOptions(FFMemoryOptions* options); void ffDestroyMemoryOptions(FFMemoryOptions* options); + +extern FFModuleBaseInfo ffMemoryModuleInfo; diff --git a/src/modules/monitor/monitor.c b/src/modules/monitor/monitor.c index 557db306b..36ddf337a 100644 --- a/src/modules/monitor/monitor.c +++ b/src/modules/monitor/monitor.c @@ -112,7 +112,7 @@ void ffGenerateMonitorJsonResult(FF_MAYBE_UNUSED FFMonitorOptions* options, yyjs yyjson_mut_obj_add_str(doc, module, "error", "Monitor module is an alias of Display module"); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffMonitorModuleInfo = { .name = FF_MONITOR_MODULE_NAME, .description = "Alias of Display module", .initOptions = (void*) ffInitMonitorOptions, @@ -139,7 +139,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitMonitorOptions(FFMonitorOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffMonitorModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰹑"); } diff --git a/src/modules/monitor/monitor.h b/src/modules/monitor/monitor.h index d928c2ffe..fc0f45c8d 100644 --- a/src/modules/monitor/monitor.h +++ b/src/modules/monitor/monitor.h @@ -7,3 +7,5 @@ void ffPrintMonitor(FFMonitorOptions* options); void ffInitMonitorOptions(FFMonitorOptions* options); void ffDestroyMonitorOptions(FFMonitorOptions* options); + +extern FFModuleBaseInfo ffMonitorModuleInfo; diff --git a/src/modules/mouse/mouse.c b/src/modules/mouse/mouse.c index 298bc02a3..e84db7ff1 100644 --- a/src/modules/mouse/mouse.c +++ b/src/modules/mouse/mouse.c @@ -96,7 +96,7 @@ void ffGenerateMouseJsonResult(FF_MAYBE_UNUSED FFMouseOptions* options, yyjson_m } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffMouseModuleInfo = { .name = FF_MOUSE_MODULE_NAME, .description = "List connected mouses", .initOptions = (void*) ffInitMouseOptions, @@ -113,7 +113,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitMouseOptions(FFMouseOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffMouseModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰍽"); } diff --git a/src/modules/mouse/mouse.h b/src/modules/mouse/mouse.h index d78a375ae..fbcef98e6 100644 --- a/src/modules/mouse/mouse.h +++ b/src/modules/mouse/mouse.h @@ -7,3 +7,5 @@ void ffPrintMouse(FFMouseOptions* options); void ffInitMouseOptions(FFMouseOptions* options); void ffDestroyMouseOptions(FFMouseOptions* options); + +extern FFModuleBaseInfo ffMouseModuleInfo; diff --git a/src/modules/netio/netio.c b/src/modules/netio/netio.c index 30e643a6a..7e648853b 100644 --- a/src/modules/netio/netio.c +++ b/src/modules/netio/netio.c @@ -190,7 +190,7 @@ void ffGenerateNetIOJsonResult(FFNetIOOptions* options, yyjson_mut_doc* doc, yyj } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffNetIOModuleInfo = { .name = FF_NETIO_MODULE_NAME, .description = "Print network I/O throughput", .initOptions = (void*) ffInitNetIOOptions, @@ -217,12 +217,12 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitNetIOOptions(FFNetIOOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffNetIOModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰾆"); ffStrbufInit(&options->namePrefix); options->defaultRouteOnly = - #if __ANDROID__ || __OpenBSD__ + #if __ANDROID__ false #else true diff --git a/src/modules/netio/netio.h b/src/modules/netio/netio.h index 5b94e4bf2..8b119cf63 100644 --- a/src/modules/netio/netio.h +++ b/src/modules/netio/netio.h @@ -9,3 +9,5 @@ void ffPrepareNetIO(FFNetIOOptions* options); void ffPrintNetIO(FFNetIOOptions* options); void ffInitNetIOOptions(FFNetIOOptions* options); void ffDestroyNetIOOptions(FFNetIOOptions* options); + +extern FFModuleBaseInfo ffNetIOModuleInfo; diff --git a/src/modules/opencl/opencl.c b/src/modules/opencl/opencl.c index d0a72ea80..341f04e5c 100644 --- a/src/modules/opencl/opencl.c +++ b/src/modules/opencl/opencl.c @@ -114,7 +114,7 @@ void ffGenerateOpenCLJsonResult(FF_MAYBE_UNUSED FFOpenCLOptions* options, yyjson } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffOpenCLModuleInfo = { .name = FF_OPENCL_MODULE_NAME, .description = "Print highest OpenCL version supported by the GPU", .initOptions = (void*) ffInitOpenCLOptions, @@ -132,7 +132,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitOpenCLOptions(FFOpenCLOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffOpenCLModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/opencl/opencl.h b/src/modules/opencl/opencl.h index f378e3f0b..a089821d7 100644 --- a/src/modules/opencl/opencl.h +++ b/src/modules/opencl/opencl.h @@ -7,3 +7,5 @@ void ffPrintOpenCL(FFOpenCLOptions* options); void ffInitOpenCLOptions(FFOpenCLOptions* options); void ffDestroyOpenCLOptions(FFOpenCLOptions* options); + +extern FFModuleBaseInfo ffOpenCLModuleInfo; diff --git a/src/modules/opengl/opengl.c b/src/modules/opengl/opengl.c index 1ee320fd9..d8ee5e5b6 100644 --- a/src/modules/opengl/opengl.c +++ b/src/modules/opengl/opengl.c @@ -127,7 +127,7 @@ void ffGenerateOpenGLJsonResult(FF_MAYBE_UNUSED FFOpenGLOptions* options, yyjson ffStrbufDestroy(&result.library); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffOpenGLModuleInfo = { .name = FF_OPENGL_MODULE_NAME, .description = "Print highest OpenGL version supported by the GPU", .initOptions = (void*) ffInitOpenGLOptions, @@ -147,7 +147,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitOpenGLOptions(FFOpenGLOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffOpenGLModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); options->library = FF_OPENGL_LIBRARY_AUTO; diff --git a/src/modules/opengl/opengl.h b/src/modules/opengl/opengl.h index 0f9d34735..2a8e19e52 100644 --- a/src/modules/opengl/opengl.h +++ b/src/modules/opengl/opengl.h @@ -7,3 +7,5 @@ void ffPrintOpenGL(FFOpenGLOptions* options); void ffInitOpenGLOptions(FFOpenGLOptions* options); void ffDestroyOpenGLOptions(FFOpenGLOptions* options); + +extern FFModuleBaseInfo ffOpenGLModuleInfo; diff --git a/src/modules/os/os.c b/src/modules/os/os.c index 6056de9b1..969fddd26 100644 --- a/src/modules/os/os.c +++ b/src/modules/os/os.c @@ -159,7 +159,7 @@ void ffGenerateOSJsonResult(FF_MAYBE_UNUSED FFOSOptions* options, yyjson_mut_doc yyjson_mut_obj_add_strbuf(doc, obj, "versionID", &os->versionID); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffOSModuleInfo = { .name = FF_OS_MODULE_NAME, .description = "Print operating system name and version", .initOptions = (void*) ffInitOSOptions, @@ -186,7 +186,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitOSOptions(FFOSOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffOSModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, #ifdef _WIN32 "" @@ -202,6 +202,8 @@ void ffInitOSOptions(FFOSOptions* options) "" #elif __OpenBSD__ "" + #elif __Haiku__ + "" #else "?" #endif diff --git a/src/modules/os/os.h b/src/modules/os/os.h index ff2aa787d..35deb41af 100644 --- a/src/modules/os/os.h +++ b/src/modules/os/os.h @@ -7,3 +7,5 @@ void ffPrintOS(FFOSOptions* options); void ffInitOSOptions(FFOSOptions* options); void ffDestroyOSOptions(FFOSOptions* options); + +extern FFModuleBaseInfo ffOSModuleInfo; diff --git a/src/modules/packages/packages.c b/src/modules/packages/packages.c index 23025404d..a3bb951d0 100644 --- a/src/modules/packages/packages.c +++ b/src/modules/packages/packages.c @@ -431,7 +431,7 @@ void ffGeneratePackagesJsonResult(FF_MAYBE_UNUSED FFPackagesOptions* options, yy yyjson_mut_obj_add_strbuf(doc, obj, "pacmanBranch", &counts.pacmanBranch); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffPackagesModuleInfo = { .name = FF_PACKAGES_MODULE_NAME, .description = "List installed package managers and count of installed packages", .initOptions = (void*) ffInitPackagesOptions, @@ -493,7 +493,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitPackagesOptions(FFPackagesOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffPackagesModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰏖"); options->disabled = FF_PACKAGES_DISABLE_LIST; diff --git a/src/modules/packages/packages.h b/src/modules/packages/packages.h index 97b8b4c91..7d2b7dd40 100644 --- a/src/modules/packages/packages.h +++ b/src/modules/packages/packages.h @@ -7,3 +7,5 @@ void ffPrintPackages(FFPackagesOptions* options); void ffInitPackagesOptions(FFPackagesOptions* options); void ffDestroyPackagesOptions(FFPackagesOptions* options); + +extern FFModuleBaseInfo ffPackagesModuleInfo; diff --git a/src/modules/physicaldisk/physicaldisk.c b/src/modules/physicaldisk/physicaldisk.c index b93bfe6ce..4c971ac0c 100644 --- a/src/modules/physicaldisk/physicaldisk.c +++ b/src/modules/physicaldisk/physicaldisk.c @@ -226,7 +226,7 @@ void ffGeneratePhysicalDiskJsonResult(FFPhysicalDiskOptions* options, yyjson_mut } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffPhysicalDiskModuleInfo = { .name = FF_PHYSICALDISK_MODULE_NAME, .description = "Print physical disk information", .initOptions = (void*) ffInitPhysicalDiskOptions, @@ -251,7 +251,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitPhysicalDiskOptions(FFPhysicalDiskOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffPhysicalDiskModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰋊"); ffStrbufInit(&options->namePrefix); diff --git a/src/modules/physicaldisk/physicaldisk.h b/src/modules/physicaldisk/physicaldisk.h index d8216c140..2ce2d05e6 100644 --- a/src/modules/physicaldisk/physicaldisk.h +++ b/src/modules/physicaldisk/physicaldisk.h @@ -7,3 +7,5 @@ void ffPrintPhysicalDisk(FFPhysicalDiskOptions* options); void ffInitPhysicalDiskOptions(FFPhysicalDiskOptions* options); void ffDestroyPhysicalDiskOptions(FFPhysicalDiskOptions* options); + +extern FFModuleBaseInfo ffPhysicalDiskModuleInfo; diff --git a/src/modules/physicalmemory/physicalmemory.c b/src/modules/physicalmemory/physicalmemory.c index cb6bcb918..7ab325050 100644 --- a/src/modules/physicalmemory/physicalmemory.c +++ b/src/modules/physicalmemory/physicalmemory.c @@ -139,7 +139,7 @@ void ffGeneratePhysicalMemoryJsonResult(FF_MAYBE_UNUSED FFPhysicalMemoryOptions* } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffPhysicalMemoryModuleInfo = { .name = FF_PHYSICALMEMORY_MODULE_NAME, .description = "Print system physical memory devices", .initOptions = (void*) ffInitPhysicalMemoryOptions, @@ -165,7 +165,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitPhysicalMemoryOptions(FFPhysicalMemoryOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffPhysicalMemoryModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰑭"); } diff --git a/src/modules/physicalmemory/physicalmemory.h b/src/modules/physicalmemory/physicalmemory.h index c9e0048d1..51d25206e 100644 --- a/src/modules/physicalmemory/physicalmemory.h +++ b/src/modules/physicalmemory/physicalmemory.h @@ -7,3 +7,5 @@ void ffPrintPhysicalMemory(FFPhysicalMemoryOptions* options); void ffInitPhysicalMemoryOptions(FFPhysicalMemoryOptions* options); void ffDestroyPhysicalMemoryOptions(FFPhysicalMemoryOptions* options); + +extern FFModuleBaseInfo ffPhysicalMemoryModuleInfo; diff --git a/src/modules/player/player.c b/src/modules/player/player.c index 555746a90..9811922a9 100644 --- a/src/modules/player/player.c +++ b/src/modules/player/player.c @@ -107,7 +107,7 @@ void ffGeneratePlayerJsonResult(FF_MAYBE_UNUSED FFMediaOptions* options, yyjson_ yyjson_mut_obj_add_str(doc, module, "error", "Player module is an alias of Media module"); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffPlayerModuleInfo = { .name = FF_PLAYER_MODULE_NAME, .description = "Print music player name", .initOptions = (void*) ffInitPlayerOptions, @@ -126,7 +126,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitPlayerOptions(FFPlayerOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffPlayerModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰥠"); } diff --git a/src/modules/player/player.h b/src/modules/player/player.h index 3912a3fe3..f70380c6d 100644 --- a/src/modules/player/player.h +++ b/src/modules/player/player.h @@ -8,3 +8,5 @@ void ffPrintPlayer(FFPlayerOptions* options); void ffInitPlayerOptions(FFPlayerOptions* options); void ffDestroyPlayerOptions(FFPlayerOptions* options); + +extern FFModuleBaseInfo ffPlayerModuleInfo; diff --git a/src/modules/poweradapter/poweradapter.c b/src/modules/poweradapter/poweradapter.c index abd3b4f85..0f57862c6 100644 --- a/src/modules/poweradapter/poweradapter.c +++ b/src/modules/poweradapter/poweradapter.c @@ -111,7 +111,7 @@ void ffGeneratePowerAdapterJsonResult(FF_MAYBE_UNUSED FFPowerAdapterOptions* opt } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffPowerAdapterModuleInfo = { .name = FF_POWERADAPTER_MODULE_NAME, .description = "Print power adapter name and charging watts", .initOptions = (void*) ffInitPowerAdapterOptions, @@ -132,7 +132,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitPowerAdapterOptions(FFPowerAdapterOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffPowerAdapterModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰚥"); } diff --git a/src/modules/poweradapter/poweradapter.h b/src/modules/poweradapter/poweradapter.h index 315c6e749..03d2c8946 100644 --- a/src/modules/poweradapter/poweradapter.h +++ b/src/modules/poweradapter/poweradapter.h @@ -7,3 +7,5 @@ void ffPrintPowerAdapter(FFPowerAdapterOptions* options); void ffInitPowerAdapterOptions(FFPowerAdapterOptions* options); void ffDestroyPowerAdapterOptions(FFPowerAdapterOptions* options); + +extern FFModuleBaseInfo ffPowerAdapterModuleInfo; diff --git a/src/modules/processes/processes.c b/src/modules/processes/processes.c index 5d8ab9d76..05b6c3df5 100644 --- a/src/modules/processes/processes.c +++ b/src/modules/processes/processes.c @@ -64,7 +64,7 @@ void ffGenerateProcessesJsonResult(FF_MAYBE_UNUSED FFProcessesOptions* options, yyjson_mut_obj_add_uint(doc, module, "result", result); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffProcessesModuleInfo = { .name = FF_PROCESSES_MODULE_NAME, .description = "Print number of running processes", .initOptions = (void*) ffInitProcessesOptions, @@ -80,7 +80,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitProcessesOptions(FFProcessesOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffProcessesModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/processes/processes.h b/src/modules/processes/processes.h index d2159ca0e..a8e733001 100644 --- a/src/modules/processes/processes.h +++ b/src/modules/processes/processes.h @@ -7,3 +7,5 @@ void ffPrintProcesses(FFProcessesOptions* options); void ffInitProcessesOptions(FFProcessesOptions* options); void ffDestroyProcessesOptions(FFProcessesOptions* options); + +extern FFModuleBaseInfo ffProcessesModuleInfo; diff --git a/src/modules/publicip/publicip.c b/src/modules/publicip/publicip.c index fce7ca18e..3a0f417f5 100644 --- a/src/modules/publicip/publicip.c +++ b/src/modules/publicip/publicip.c @@ -108,7 +108,7 @@ void ffGeneratePublicIpJsonResult(FFPublicIpOptions* options, yyjson_mut_doc* do ffStrbufDestroy(&result.location); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffPublicIPModuleInfo = { .name = FF_PUBLICIP_MODULE_NAME, .description = "Print your public IP address, etc", .initOptions = (void*) ffInitPublicIpOptions, @@ -125,7 +125,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitPublicIpOptions(FFPublicIpOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffPublicIPModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰩠"); ffStrbufInit(&options->url); diff --git a/src/modules/publicip/publicip.h b/src/modules/publicip/publicip.h index e54bab809..0d178e520 100644 --- a/src/modules/publicip/publicip.h +++ b/src/modules/publicip/publicip.h @@ -9,3 +9,5 @@ void ffPreparePublicIp(FFPublicIpOptions* options); void ffPrintPublicIp(FFPublicIpOptions* options); void ffInitPublicIpOptions(FFPublicIpOptions* options); void ffDestroyPublicIpOptions(FFPublicIpOptions* options); + +extern FFModuleBaseInfo ffPublicIPModuleInfo; diff --git a/src/modules/separator/separator.c b/src/modules/separator/separator.c index a8b9a86be..a8ddd1dbb 100644 --- a/src/modules/separator/separator.c +++ b/src/modules/separator/separator.c @@ -154,7 +154,7 @@ void ffGenerateSeparatorJsonConfig(FFSeparatorOptions* options, yyjson_mut_doc* yyjson_mut_obj_add_strbuf(doc, module, "string", &options->string); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffSeparatorModuleInfo = { .name = FF_SEPARATOR_MODULE_NAME, .description = "Print a separator line", .initOptions = (void*) ffInitSeparatorOptions, @@ -166,7 +166,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitSeparatorOptions(FFSeparatorOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffSeparatorModuleInfo; ffStrbufInitStatic(&options->string, "-"); ffStrbufInit(&options->outputColor); options->length = 0; diff --git a/src/modules/separator/separator.h b/src/modules/separator/separator.h index bca935521..804a76405 100644 --- a/src/modules/separator/separator.h +++ b/src/modules/separator/separator.h @@ -7,3 +7,5 @@ void ffPrintSeparator(FFSeparatorOptions* options); void ffInitSeparatorOptions(FFSeparatorOptions* options); void ffDestroySeparatorOptions(FFSeparatorOptions* options); + +extern FFModuleBaseInfo ffSeparatorModuleInfo; diff --git a/src/modules/shell/shell.c b/src/modules/shell/shell.c index df433ded9..638db6a43 100644 --- a/src/modules/shell/shell.c +++ b/src/modules/shell/shell.c @@ -88,7 +88,7 @@ void ffGenerateShellJsonResult(FF_MAYBE_UNUSED FFShellOptions* options, yyjson_m yyjson_mut_obj_add_null(doc, obj, "tty"); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffShellModuleInfo = { .name = FF_SHELL_MODULE_NAME, .description = "Print current shell name and version", .initOptions = (void*) ffInitShellOptions, @@ -111,7 +111,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitShellOptions(FFShellOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffShellModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/shell/shell.h b/src/modules/shell/shell.h index 01f9f17de..12fd2107b 100644 --- a/src/modules/shell/shell.h +++ b/src/modules/shell/shell.h @@ -7,3 +7,5 @@ void ffPrintShell(FFShellOptions* options); void ffInitShellOptions(FFShellOptions* options); void ffDestroyShellOptions(FFShellOptions* options); + +extern FFModuleBaseInfo ffShellModuleInfo; diff --git a/src/modules/sound/sound.c b/src/modules/sound/sound.c index 759f8fdf4..92adc266c 100644 --- a/src/modules/sound/sound.c +++ b/src/modules/sound/sound.c @@ -206,7 +206,7 @@ void ffGenerateSoundJsonResult(FF_MAYBE_UNUSED FFSoundOptions* options, yyjson_m } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffSoundModuleInfo = { .name = FF_SOUND_MODULE_NAME, .description = "Print sound devices, volume, etc", .initOptions = (void*) ffInitSoundOptions, @@ -227,7 +227,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitSoundOptions(FFSoundOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffSoundModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); options->soundType = FF_SOUND_TYPE_MAIN; diff --git a/src/modules/sound/sound.h b/src/modules/sound/sound.h index 35c3f2a7b..fa4e808ab 100644 --- a/src/modules/sound/sound.h +++ b/src/modules/sound/sound.h @@ -7,3 +7,5 @@ void ffPrintSound(FFSoundOptions* options); void ffInitSoundOptions(FFSoundOptions* options); void ffDestroySoundOptions(FFSoundOptions* options); + +extern FFModuleBaseInfo ffSoundModuleInfo; diff --git a/src/modules/swap/swap.c b/src/modules/swap/swap.c index 54265d90a..15d7fe916 100644 --- a/src/modules/swap/swap.c +++ b/src/modules/swap/swap.c @@ -189,7 +189,7 @@ void ffGenerateSwapJsonResult(FF_MAYBE_UNUSED FFSwapOptions* options, yyjson_mut } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffSwapModuleInfo = { .name = FF_SWAP_MODULE_NAME, .description = "Print swap (paging file) space usage", .initOptions = (void*) ffInitSwapOptions, @@ -209,7 +209,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitSwapOptions(FFSwapOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffSwapModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰓡"); options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; options->separate = false; diff --git a/src/modules/swap/swap.h b/src/modules/swap/swap.h index b44ae4df3..c7c61dff1 100644 --- a/src/modules/swap/swap.h +++ b/src/modules/swap/swap.h @@ -7,3 +7,5 @@ void ffPrintSwap(FFSwapOptions* options); void ffInitSwapOptions(FFSwapOptions* options); void ffDestroySwapOptions(FFSwapOptions* options); + +extern FFModuleBaseInfo ffSwapModuleInfo; diff --git a/src/modules/terminal/terminal.c b/src/modules/terminal/terminal.c index 9ddb3ae7f..1eb6dfba1 100644 --- a/src/modules/terminal/terminal.c +++ b/src/modules/terminal/terminal.c @@ -81,7 +81,7 @@ void ffGenerateTerminalJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options, yy yyjson_mut_obj_add_strbuf(doc, obj, "tty", &result->tty); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffTerminalModuleInfo = { .name = FF_TERMINAL_MODULE_NAME, .description = "Print current terminal name and version", .initOptions = (void*) ffInitTerminalOptions, @@ -104,7 +104,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitTerminalOptions(FFTerminalOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffTerminalModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/terminal/terminal.h b/src/modules/terminal/terminal.h index 9e1bbf75e..f397867f4 100644 --- a/src/modules/terminal/terminal.h +++ b/src/modules/terminal/terminal.h @@ -7,3 +7,5 @@ void ffPrintTerminal(FFTerminalOptions* options); void ffInitTerminalOptions(FFTerminalOptions* options); void ffDestroyTerminalOptions(FFTerminalOptions* options); + +extern FFModuleBaseInfo ffTerminalModuleInfo; diff --git a/src/modules/terminalfont/terminalfont.c b/src/modules/terminalfont/terminalfont.c index 43cab5610..e6b1dfe1e 100644 --- a/src/modules/terminalfont/terminalfont.c +++ b/src/modules/terminalfont/terminalfont.c @@ -106,7 +106,7 @@ void ffGenerateTerminalFontJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options ffFontDestroy(&result.fallback); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffTerminalFontModuleInfo = { .name = FF_TERMINALFONT_MODULE_NAME, .description = "Print font name and size used by current terminal", .initOptions = (void*) ffInitTerminalFontOptions, @@ -125,7 +125,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitTerminalFontOptions(FFTerminalFontOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffTerminalFontModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/terminalfont/terminalfont.h b/src/modules/terminalfont/terminalfont.h index 01eee0802..ff12829e1 100644 --- a/src/modules/terminalfont/terminalfont.h +++ b/src/modules/terminalfont/terminalfont.h @@ -7,3 +7,5 @@ void ffPrintTerminalFont(FFTerminalFontOptions* options); void ffInitTerminalFontOptions(FFTerminalFontOptions* options); void ffDestroyTerminalFontOptions(FFTerminalFontOptions* options); + +extern FFModuleBaseInfo ffTerminalFontModuleInfo; diff --git a/src/modules/terminalsize/terminalsize.c b/src/modules/terminalsize/terminalsize.c index 9b5a6f56b..1b3dfe029 100644 --- a/src/modules/terminalsize/terminalsize.c +++ b/src/modules/terminalsize/terminalsize.c @@ -76,7 +76,7 @@ void ffGenerateTerminalSizeJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options yyjson_mut_obj_add_uint(doc, obj, "height", result.height); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffTerminalSizeModuleInfo = { .name = FF_TERMINALSIZE_MODULE_NAME, .description = "Print current terminal size", .initOptions = (void*) ffInitTerminalSizeOptions, @@ -95,7 +95,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitTerminalSizeOptions(FFTerminalSizeOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffTerminalSizeModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰲎"); } diff --git a/src/modules/terminalsize/terminalsize.h b/src/modules/terminalsize/terminalsize.h index e88f8b6c7..eca007a48 100644 --- a/src/modules/terminalsize/terminalsize.h +++ b/src/modules/terminalsize/terminalsize.h @@ -7,3 +7,5 @@ void ffPrintTerminalSize(FFTerminalSizeOptions* options); void ffInitTerminalSizeOptions(FFTerminalSizeOptions* options); void ffDestroyTerminalSizeOptions(FFTerminalSizeOptions* options); + +extern FFModuleBaseInfo ffTerminalSizeModuleInfo; diff --git a/src/modules/terminaltheme/terminaltheme.c b/src/modules/terminaltheme/terminaltheme.c index dd7a256b4..74439f59e 100644 --- a/src/modules/terminaltheme/terminaltheme.c +++ b/src/modules/terminaltheme/terminaltheme.c @@ -89,7 +89,7 @@ void ffGenerateTerminalThemeJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* option yyjson_mut_obj_add_bool(doc, bg, "dark", result.bg.dark); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffTerminalThemeModuleInfo = { .name = FF_TERMINALTHEME_MODULE_NAME, .description = "Print current terminal theme (foreground and background colors)", .initOptions = (void*) ffInitTerminalThemeOptions, @@ -108,7 +108,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitTerminalThemeOptions(FFTerminalThemeOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffTerminalThemeModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰔎"); } diff --git a/src/modules/terminaltheme/terminaltheme.h b/src/modules/terminaltheme/terminaltheme.h index fb5cbb58a..d44826eee 100644 --- a/src/modules/terminaltheme/terminaltheme.h +++ b/src/modules/terminaltheme/terminaltheme.h @@ -7,3 +7,5 @@ void ffPrintTerminalTheme(FFTerminalThemeOptions* options); void ffInitTerminalThemeOptions(FFTerminalThemeOptions* options); void ffDestroyTerminalThemeOptions(FFTerminalThemeOptions* options); + +extern FFModuleBaseInfo ffTerminalThemeModuleInfo; diff --git a/src/modules/theme/theme.c b/src/modules/theme/theme.c index daa93d9eb..3b1448b28 100644 --- a/src/modules/theme/theme.c +++ b/src/modules/theme/theme.c @@ -86,7 +86,7 @@ void ffGenerateThemeJsonResult(FF_MAYBE_UNUSED FFThemeOptions* options, yyjson_m ffStrbufDestroy(&result.theme2); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffThemeModuleInfo = { .name = FF_THEME_MODULE_NAME, .description = "Print current theme of desktop environment", .initOptions = (void*) ffInitThemeOptions, @@ -103,7 +103,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitThemeOptions(FFThemeOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffThemeModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰉼"); } diff --git a/src/modules/theme/theme.h b/src/modules/theme/theme.h index 6ead202bf..4b9c24f49 100644 --- a/src/modules/theme/theme.h +++ b/src/modules/theme/theme.h @@ -7,3 +7,5 @@ void ffPrintTheme(FFThemeOptions* options); void ffInitThemeOptions(FFThemeOptions* options); void ffDestroyThemeOptions(FFThemeOptions* options); + +extern FFModuleBaseInfo ffThemeModuleInfo; diff --git a/src/modules/title/title.c b/src/modules/title/title.c index 293e1f9dd..b80cae4cc 100644 --- a/src/modules/title/title.c +++ b/src/modules/title/title.c @@ -140,7 +140,7 @@ void ffGenerateTitleJsonResult(FF_MAYBE_UNUSED FFTitleOptions* options, yyjson_m yyjson_mut_obj_add_strbuf(doc, obj, "userShell", &instance.state.platform.userShell); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffTitleModuleInfo = { .name = FF_TITLE_MODULE_NAME, .description = "Print title, which contains your user name, hostname", .initOptions = (void*) ffInitTitleOptions, @@ -164,7 +164,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitTitleOptions(FFTitleOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffTitleModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); ffStrbufSetStatic(&options->moduleArgs.key, " "); diff --git a/src/modules/title/title.h b/src/modules/title/title.h index 83ddfa9b5..6b616ec31 100644 --- a/src/modules/title/title.h +++ b/src/modules/title/title.h @@ -7,3 +7,5 @@ void ffPrintTitle(FFTitleOptions* options); void ffInitTitleOptions(FFTitleOptions* options); void ffDestroyTitleOptions(FFTitleOptions* options); + +extern FFModuleBaseInfo ffTitleModuleInfo; diff --git a/src/modules/tpm/tpm.c b/src/modules/tpm/tpm.c index bd0c05f08..82eb04d51 100644 --- a/src/modules/tpm/tpm.c +++ b/src/modules/tpm/tpm.c @@ -81,7 +81,7 @@ void ffGenerateTPMJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options, yyjson_ ffStrbufDestroy(&result.description); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffTPMModuleInfo = { .name = FF_TPM_MODULE_NAME, .description = "Print info of Trusted Platform Module (TPM) Security Device", .initOptions = (void*) ffInitTPMOptions, @@ -98,7 +98,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitTPMOptions(FFTPMOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffTPMModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/tpm/tpm.h b/src/modules/tpm/tpm.h index 3356a46dc..fefcae96e 100644 --- a/src/modules/tpm/tpm.h +++ b/src/modules/tpm/tpm.h @@ -7,3 +7,5 @@ void ffPrintTPM(FFTPMOptions* options); void ffInitTPMOptions(FFTPMOptions* options); void ffDestroyTPMOptions(FFTPMOptions* options); + +extern FFModuleBaseInfo ffTPMModuleInfo; diff --git a/src/modules/uptime/uptime.c b/src/modules/uptime/uptime.c index 771e4b6da..9738d8ac0 100644 --- a/src/modules/uptime/uptime.c +++ b/src/modules/uptime/uptime.c @@ -93,7 +93,7 @@ void ffGenerateUptimeJsonResult(FF_MAYBE_UNUSED FFUptimeOptions* options, yyjson yyjson_mut_obj_add_strcpy(doc, obj, "bootTime", ffTimeToFullStr(result.bootTime)); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffUptimeModuleInfo = { .name = FF_UPTIME_MODULE_NAME, .description = "Print how long system has been running", .initOptions = (void*) ffInitUptimeOptions, @@ -118,7 +118,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitUptimeOptions(FFUptimeOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffUptimeModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/uptime/uptime.h b/src/modules/uptime/uptime.h index 17b6c1bc6..7ffddb694 100644 --- a/src/modules/uptime/uptime.h +++ b/src/modules/uptime/uptime.h @@ -7,3 +7,5 @@ void ffPrintUptime(FFUptimeOptions* options); void ffInitUptimeOptions(FFUptimeOptions* options); void ffDestroyUptimeOptions(FFUptimeOptions* options); + +extern FFModuleBaseInfo ffUptimeModuleInfo; diff --git a/src/modules/users/users.c b/src/modules/users/users.c index 71d2150a3..4f0fc4cfa 100644 --- a/src/modules/users/users.c +++ b/src/modules/users/users.c @@ -185,7 +185,7 @@ void ffGenerateUsersJsonResult(FFUsersOptions* options, yyjson_mut_doc* doc, yyj } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffUsersModuleInfo = { .name = FF_USERS_MODULE_NAME, .description = "Print users currently logged in", .initOptions = (void*) ffInitUsersOptions, @@ -213,7 +213,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitUsersOptions(FFUsersOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffUsersModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); options->compact = false; diff --git a/src/modules/users/users.h b/src/modules/users/users.h index 81d3dd3f5..c8c7f78e2 100644 --- a/src/modules/users/users.h +++ b/src/modules/users/users.h @@ -7,3 +7,5 @@ void ffPrintUsers(FFUsersOptions* options); void ffInitUsersOptions(FFUsersOptions* options); void ffDestroyUsersOptions(FFUsersOptions* options); + +extern FFModuleBaseInfo ffUsersModuleInfo; diff --git a/src/modules/version/version.c b/src/modules/version/version.c index e39036eeb..599978478 100644 --- a/src/modules/version/version.c +++ b/src/modules/version/version.c @@ -97,7 +97,7 @@ void ffGenerateVersionJsonResult(FF_MAYBE_UNUSED FFVersionOptions* options, yyjs } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffVersionModuleInfo = { .name = FF_VERSION_MODULE_NAME, .description = "Print Fastfetch version", .initOptions = (void*) ffInitVersionOptions, @@ -122,7 +122,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitVersionOptions(FFVersionOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffVersionModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/version/version.h b/src/modules/version/version.h index 1cab28d94..9228f99e8 100644 --- a/src/modules/version/version.h +++ b/src/modules/version/version.h @@ -7,3 +7,5 @@ void ffPrintVersion(FFVersionOptions* options); void ffInitVersionOptions(FFVersionOptions* options); void ffDestroyVersionOptions(FFVersionOptions* options); + +extern FFModuleBaseInfo ffVersionModuleInfo; diff --git a/src/modules/vulkan/vulkan.c b/src/modules/vulkan/vulkan.c index 3cd6e5fb9..f8740be65 100644 --- a/src/modules/vulkan/vulkan.c +++ b/src/modules/vulkan/vulkan.c @@ -128,7 +128,7 @@ void ffGenerateVulkanJsonResult(FF_MAYBE_UNUSED FFVulkanOptions* options, yyjson } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffVulkanModuleInfo = { .name = FF_VULKAN_MODULE_NAME, .description = "Print highest Vulkan version supported by the GPU", .initOptions = (void*) ffInitVulkanOptions, @@ -147,7 +147,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitVulkanOptions(FFVulkanOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffVulkanModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); } diff --git a/src/modules/vulkan/vulkan.h b/src/modules/vulkan/vulkan.h index 397c42093..0a42bdd84 100644 --- a/src/modules/vulkan/vulkan.h +++ b/src/modules/vulkan/vulkan.h @@ -7,3 +7,5 @@ void ffPrintVulkan(FFVulkanOptions* options); void ffInitVulkanOptions(FFVulkanOptions* options); void ffDestroyVulkanOptions(FFVulkanOptions* options); + +extern FFModuleBaseInfo ffVulkanModuleInfo; diff --git a/src/modules/wallpaper/wallpaper.c b/src/modules/wallpaper/wallpaper.c index 445cadb33..b69c75a61 100644 --- a/src/modules/wallpaper/wallpaper.c +++ b/src/modules/wallpaper/wallpaper.c @@ -73,7 +73,7 @@ void ffGenerateWallpaperJsonResult(FF_MAYBE_UNUSED FFWallpaperOptions* options, yyjson_mut_obj_add_strbuf(doc, module, "result", &fullpath); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffWallpaperModuleInfo = { .name = FF_WALLPAPER_MODULE_NAME, .description = "Print image file path of current wallpaper", .initOptions = (void*) ffInitWallpaperOptions, @@ -90,7 +90,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitWallpaperOptions(FFWallpaperOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffWallpaperModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰸉"); } diff --git a/src/modules/wallpaper/wallpaper.h b/src/modules/wallpaper/wallpaper.h index a2c804ae3..12876b481 100644 --- a/src/modules/wallpaper/wallpaper.h +++ b/src/modules/wallpaper/wallpaper.h @@ -7,3 +7,5 @@ void ffPrintWallpaper(FFWallpaperOptions* options); void ffInitWallpaperOptions(FFWallpaperOptions* options); void ffDestroyWallpaperOptions(FFWallpaperOptions* options); + +extern FFModuleBaseInfo ffWallpaperModuleInfo; diff --git a/src/modules/weather/weather.c b/src/modules/weather/weather.c index 3fad7d116..b86c687ee 100644 --- a/src/modules/weather/weather.c +++ b/src/modules/weather/weather.c @@ -91,7 +91,7 @@ void ffGenerateWeatherJsonResult(FFWeatherOptions* options, yyjson_mut_doc* doc, yyjson_mut_obj_add_strbuf(doc, module, "result", &result); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffWeatherModuleInfo = { .name = FF_WEATHER_MODULE_NAME, .description = "Print weather information", .initOptions = (void*) ffInitWeatherOptions, @@ -107,7 +107,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitWeatherOptions(FFWeatherOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffWeatherModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰖙"); ffStrbufInit(&options->location); diff --git a/src/modules/weather/weather.h b/src/modules/weather/weather.h index 1ec2f02a2..54c4bbde2 100644 --- a/src/modules/weather/weather.h +++ b/src/modules/weather/weather.h @@ -9,3 +9,5 @@ void ffPrepareWeather(FFWeatherOptions* options); void ffPrintWeather(FFWeatherOptions* options); void ffInitWeatherOptions(FFWeatherOptions* options); void ffDestroyWeatherOptions(FFWeatherOptions* options); + +extern FFModuleBaseInfo ffWeatherModuleInfo; diff --git a/src/modules/wifi/wifi.c b/src/modules/wifi/wifi.c index 799c9e547..f19e46f84 100644 --- a/src/modules/wifi/wifi.c +++ b/src/modules/wifi/wifi.c @@ -206,7 +206,7 @@ void ffGenerateWifiJsonResult(FF_MAYBE_UNUSED FFWifiOptions* options, yyjson_mut } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffWifiModuleInfo = { .name = FF_WIFI_MODULE_NAME, .description = "Print connected Wi-Fi info (SSID, connection and security protocol)", .initOptions = (void*) ffInitWifiOptions, @@ -234,7 +234,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitWifiOptions(FFWifiOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffWifiModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); options->percent = (FFPercentageModuleConfig) { 50, 20, 0 }; diff --git a/src/modules/wifi/wifi.h b/src/modules/wifi/wifi.h index bd23565d3..4e517b1e2 100644 --- a/src/modules/wifi/wifi.h +++ b/src/modules/wifi/wifi.h @@ -7,3 +7,5 @@ void ffPrintWifi(FFWifiOptions* options); void ffInitWifiOptions(FFWifiOptions* options); void ffDestroyWifiOptions(FFWifiOptions* options); + +extern FFModuleBaseInfo ffWifiModuleInfo; diff --git a/src/modules/wm/wm.c b/src/modules/wm/wm.c index 075176f0c..0838f380b 100644 --- a/src/modules/wm/wm.c +++ b/src/modules/wm/wm.c @@ -119,7 +119,7 @@ void ffGenerateWMJsonResult(FF_MAYBE_UNUSED FFWMOptions* options, yyjson_mut_doc yyjson_mut_obj_add_strbuf(doc, obj, "version", &version); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffWMModuleInfo = { .name = FF_WM_MODULE_NAME, .description = "Print window manager name and version", .initOptions = (void*) ffInitWMOptions, @@ -139,7 +139,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitWMOptions(FFWMOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffWMModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); options->detectPlugin = false; } diff --git a/src/modules/wm/wm.h b/src/modules/wm/wm.h index 93edec8b4..181fa9360 100644 --- a/src/modules/wm/wm.h +++ b/src/modules/wm/wm.h @@ -7,3 +7,5 @@ void ffPrintWM(FFWMOptions* options); void ffInitWMOptions(FFWMOptions* options); void ffDestroyWMOptions(FFWMOptions* options); + +extern FFModuleBaseInfo ffWMModuleInfo; diff --git a/src/modules/wmtheme/wmtheme.c b/src/modules/wmtheme/wmtheme.c index 302e73322..d10adc73b 100644 --- a/src/modules/wmtheme/wmtheme.c +++ b/src/modules/wmtheme/wmtheme.c @@ -62,7 +62,7 @@ void ffGenerateWMThemeJsonResult(FF_MAYBE_UNUSED FFWMThemeOptions* options, yyjs yyjson_mut_obj_add_strbuf(doc, module, "result", &themeOrError); } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffWMThemeModuleInfo = { .name = FF_WMTHEME_MODULE_NAME, .description = "Print current theme of window manager", .initOptions = (void*) ffInitWMThemeOptions, @@ -78,7 +78,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitWMThemeOptions(FFWMThemeOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffWMThemeModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰓸"); } diff --git a/src/modules/wmtheme/wmtheme.h b/src/modules/wmtheme/wmtheme.h index 9a2a24982..354e72728 100644 --- a/src/modules/wmtheme/wmtheme.h +++ b/src/modules/wmtheme/wmtheme.h @@ -7,3 +7,5 @@ void ffPrintWMTheme(FFWMThemeOptions* options); void ffInitWMThemeOptions(FFWMThemeOptions* options); void ffDestroyWMThemeOptions(FFWMThemeOptions* options); + +extern FFModuleBaseInfo ffWMThemeModuleInfo; diff --git a/src/modules/zpool/zpool.c b/src/modules/zpool/zpool.c index 68eebda09..49a6928c0 100644 --- a/src/modules/zpool/zpool.c +++ b/src/modules/zpool/zpool.c @@ -164,7 +164,7 @@ void ffGenerateZpoolJsonResult(FF_MAYBE_UNUSED FFZpoolOptions* options, yyjson_m } } -static FFModuleBaseInfo ffModuleInfo = { +FFModuleBaseInfo ffZpoolModuleInfo = { .name = FF_ZPOOL_MODULE_NAME, .description = "Print ZFS storage pools", .initOptions = (void*) ffInitZpoolOptions, @@ -187,7 +187,7 @@ static FFModuleBaseInfo ffModuleInfo = { void ffInitZpoolOptions(FFZpoolOptions* options) { - options->moduleInfo = ffModuleInfo; + options->moduleInfo = ffZpoolModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󱑛"); options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; } diff --git a/src/modules/zpool/zpool.h b/src/modules/zpool/zpool.h index 03623e063..bdc88ba90 100644 --- a/src/modules/zpool/zpool.h +++ b/src/modules/zpool/zpool.h @@ -7,3 +7,5 @@ void ffPrintZpool(FFZpoolOptions* options); void ffInitZpoolOptions(FFZpoolOptions* options); void ffDestroyZpoolOptions(FFZpoolOptions* options); + +extern FFModuleBaseInfo ffZpoolModuleInfo; From 75d2c668d0f627b9b5c3b5664fb6b5773af835af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 4 Aug 2025 14:25:14 +0800 Subject: [PATCH 26/83] Modules: refactor module option handling for static allocation Moves module option structs out of global config and removes dynamic allocation, using static buffers and size assertions for safer, simpler management. Refactors module initialization and destruction to work with isolated option structs, eliminating the need for the previous modules container and related code. Unifies module option header usage and updates detection logic to leverage statically-sized option buffers, improving encapsulation and maintainability. Simplifies module function signatures and reduces coupling between modules and config. Enhances future extensibility and reliability by enforcing max size constraints and removing unnecessary indirections. --- CMakeLists.txt | 1 - presets/neofetch.jsonc | 12 +- src/common/commandoption.c | 42 +++-- src/common/init.c | 9 +- src/common/jsonconfig.c | 38 ++-- src/common/modules.c | 148 +++++++-------- src/common/option.h | 2 + src/detection/battery/battery.h | 1 + src/detection/bios/bios.h | 1 + src/detection/bluetooth/bluetooth.h | 1 + src/detection/bluetoothradio/bluetoothradio.h | 1 + src/detection/board/board.h | 1 + src/detection/bootmgr/bootmgr.h | 1 + src/detection/brightness/brightness.h | 2 +- src/detection/btrfs/btrfs.h | 1 + src/detection/camera/camera.h | 1 + src/detection/chassis/chassis.h | 1 + src/detection/cpu/cpu.h | 1 + src/detection/cpucache/cpucache.h | 1 + src/detection/cpuusage/cpuusage.h | 1 + src/detection/cursor/cursor.h | 1 + src/detection/de/de.h | 1 + src/detection/disk/disk.h | 1 + src/detection/diskio/diskio.h | 1 + src/detection/displayserver/displayserver.h | 1 + src/detection/dns/dns.h | 1 + src/detection/editor/editor.h | 1 + src/detection/font/font.h | 3 +- src/detection/gpu/gpu.c | 6 +- src/detection/gpu/gpu.h | 1 + src/detection/host/host.h | 1 + src/detection/icons/icons.h | 1 + src/detection/initsystem/initsystem.h | 1 + src/detection/lm/lm.h | 1 + src/detection/localip/localip.h | 1 + src/detection/media/media.h | 1 + src/detection/memory/memory.h | 1 + src/detection/netio/netio.h | 1 + src/detection/opencl/opencl.h | 1 + src/detection/opengl/opengl.h | 1 + src/detection/os/os.h | 1 + src/detection/packages/packages.h | 1 + src/detection/physicaldisk/physicaldisk.h | 1 + src/detection/physicalmemory/physicalmemory.h | 1 + src/detection/poweradapter/poweradapter.h | 1 + src/detection/publicip/publicip.c | 4 +- src/detection/publicip/publicip.h | 5 +- src/detection/swap/swap.h | 1 + src/detection/terminalfont/terminalfont.h | 1 + src/detection/terminalshell/terminalshell.h | 2 + .../terminalshell/terminalshell_linux.c | 2 +- src/detection/terminalsize/terminalsize.h | 1 + src/detection/terminaltheme/terminaltheme.h | 1 + src/detection/theme/theme.h | 1 + src/detection/tpm/tpm.h | 1 + src/detection/uptime/uptime.h | 1 + src/detection/users/users.h | 1 + src/detection/version/version.h | 1 + src/detection/vulkan/vulkan.h | 1 + src/detection/weather/weather.h | 1 + src/detection/wifi/wifi.h | 1 + src/detection/wm/wm.h | 1 + src/detection/zpool/zpool.h | 1 + src/fastfetch.h | 2 - src/flashfetch.c | 169 +++++++++++++----- src/logo/logo.c | 14 +- src/modules/battery/battery.c | 35 ++-- src/modules/battery/battery.h | 2 +- src/modules/battery/option.h | 5 +- src/modules/bios/bios.c | 21 ++- src/modules/bios/bios.h | 2 +- src/modules/bios/option.h | 5 +- src/modules/bluetooth/bluetooth.c | 25 ++- src/modules/bluetooth/bluetooth.h | 2 +- src/modules/bluetooth/option.h | 5 +- src/modules/bluetoothradio/bluetoothradio.c | 21 ++- src/modules/bluetoothradio/bluetoothradio.h | 2 +- src/modules/bluetoothradio/option.h | 5 +- src/modules/board/board.c | 21 ++- src/modules/board/board.h | 2 +- src/modules/board/option.h | 5 +- src/modules/bootmgr/bootmgr.c | 21 ++- src/modules/bootmgr/bootmgr.h | 2 +- src/modules/bootmgr/option.h | 5 +- src/modules/break/break.c | 17 +- src/modules/break/break.h | 2 +- src/modules/break/option.h | 5 +- src/modules/brightness/brightness.c | 29 ++- src/modules/brightness/brightness.h | 2 +- src/modules/brightness/option.h | 5 +- src/modules/btrfs/btrfs.c | 23 ++- src/modules/btrfs/btrfs.h | 2 +- src/modules/btrfs/option.h | 5 +- src/modules/camera/camera.c | 21 ++- src/modules/camera/camera.h | 2 +- src/modules/camera/option.h | 5 +- src/modules/chassis/chassis.c | 21 ++- src/modules/chassis/chassis.h | 2 +- src/modules/chassis/option.h | 5 +- src/modules/colors/colors.c | 21 ++- src/modules/colors/colors.h | 2 +- src/modules/colors/option.h | 5 +- src/modules/command/command.c | 29 ++- src/modules/command/command.h | 2 +- src/modules/command/option.h | 5 +- src/modules/cpu/cpu.c | 27 ++- src/modules/cpu/cpu.h | 2 +- src/modules/cpu/option.h | 5 +- src/modules/cpucache/cpucache.c | 25 ++- src/modules/cpucache/cpucache.h | 2 +- src/modules/cpucache/option.h | 5 +- src/modules/cpuusage/cpuusage.c | 27 ++- src/modules/cpuusage/cpuusage.h | 2 +- src/modules/cpuusage/option.h | 5 +- src/modules/cursor/cursor.c | 21 ++- src/modules/cursor/cursor.h | 2 +- src/modules/cursor/option.h | 5 +- src/modules/custom/custom.c | 23 ++- src/modules/custom/custom.h | 2 +- src/modules/custom/option.h | 5 +- src/modules/datetime/datetime.c | 21 ++- src/modules/datetime/datetime.h | 2 +- src/modules/datetime/option.h | 5 +- src/modules/de/de.c | 25 ++- src/modules/de/de.h | 2 +- src/modules/de/option.h | 5 +- src/modules/disk/disk.c | 49 +++-- src/modules/disk/disk.h | 2 +- src/modules/disk/option.h | 5 +- src/modules/diskio/diskio.c | 31 ++-- src/modules/diskio/diskio.h | 2 +- src/modules/diskio/option.h | 5 +- src/modules/display/display.c | 25 ++- src/modules/display/display.h | 2 +- src/modules/display/option.h | 5 +- src/modules/dns/dns.c | 25 ++- src/modules/dns/dns.h | 2 +- src/modules/dns/option.h | 5 +- src/modules/editor/editor.c | 21 ++- src/modules/editor/editor.h | 2 +- src/modules/editor/option.h | 5 +- src/modules/font/font.c | 21 ++- src/modules/font/font.h | 2 +- src/modules/font/option.h | 5 +- src/modules/gamepad/gamepad.c | 23 ++- src/modules/gamepad/gamepad.h | 2 +- src/modules/gamepad/option.h | 5 +- src/modules/gpu/gpu.c | 47 +++-- src/modules/gpu/gpu.h | 2 +- src/modules/gpu/option.h | 5 +- src/modules/host/host.c | 21 ++- src/modules/host/host.h | 2 +- src/modules/host/option.h | 5 +- src/modules/icons/icons.c | 21 ++- src/modules/icons/icons.h | 2 +- src/modules/icons/option.h | 5 +- src/modules/initsystem/initsystem.c | 21 ++- src/modules/initsystem/initsystem.h | 2 +- src/modules/initsystem/option.h | 5 +- src/modules/kernel/kernel.c | 21 ++- src/modules/kernel/kernel.h | 2 +- src/modules/kernel/option.h | 5 +- src/modules/keyboard/keyboard.c | 21 ++- src/modules/keyboard/keyboard.h | 2 +- src/modules/keyboard/option.h | 5 +- src/modules/lm/lm.c | 21 ++- src/modules/lm/lm.h | 2 +- src/modules/lm/option.h | 5 +- src/modules/loadavg/loadavg.c | 29 ++- src/modules/loadavg/loadavg.h | 2 +- src/modules/loadavg/option.h | 5 +- src/modules/locale/locale.c | 21 ++- src/modules/locale/locale.h | 2 +- src/modules/locale/option.h | 5 +- src/modules/localip/localip.c | 37 ++-- src/modules/localip/localip.h | 2 +- src/modules/localip/option.h | 5 +- src/modules/media/media.c | 21 ++- src/modules/media/media.h | 2 +- src/modules/media/option.h | 5 +- src/modules/memory/memory.c | 23 ++- src/modules/memory/memory.h | 2 +- src/modules/memory/option.h | 5 +- src/modules/modules.h | 2 - src/modules/monitor/monitor.c | 21 ++- src/modules/monitor/monitor.h | 2 +- src/modules/monitor/option.h | 5 +- src/modules/mouse/mouse.c | 21 ++- src/modules/mouse/mouse.h | 2 +- src/modules/mouse/option.h | 5 +- src/modules/netio/netio.c | 45 +++-- src/modules/netio/netio.h | 2 +- src/modules/netio/option.h | 5 +- src/modules/opencl/opencl.c | 21 ++- src/modules/opencl/opencl.h | 2 +- src/modules/opencl/option.h | 5 +- src/modules/opengl/opengl.c | 25 ++- src/modules/opengl/opengl.h | 2 +- src/modules/opengl/option.h | 5 +- src/modules/os/option.h | 5 +- src/modules/os/os.c | 51 +++--- src/modules/os/os.h | 2 +- src/modules/packages/option.h | 5 +- src/modules/packages/packages.c | 27 ++- src/modules/packages/packages.h | 2 +- src/modules/physicaldisk/option.h | 5 +- src/modules/physicaldisk/physicaldisk.c | 31 ++-- src/modules/physicaldisk/physicaldisk.h | 2 +- src/modules/physicalmemory/option.h | 5 +- src/modules/physicalmemory/physicalmemory.c | 21 ++- src/modules/physicalmemory/physicalmemory.h | 2 +- src/modules/player/option.h | 5 +- src/modules/player/player.c | 21 ++- src/modules/player/player.h | 2 +- src/modules/poweradapter/option.h | 5 +- src/modules/poweradapter/poweradapter.c | 21 ++- src/modules/poweradapter/poweradapter.h | 2 +- src/modules/processes/option.h | 5 +- src/modules/processes/processes.c | 21 ++- src/modules/processes/processes.h | 2 +- src/modules/publicip/option.h | 9 +- src/modules/publicip/publicip.c | 43 +++-- src/modules/publicip/publicip.h | 10 +- src/modules/separator/option.h | 6 +- src/modules/separator/separator.c | 23 ++- src/modules/separator/separator.h | 2 +- src/modules/shell/option.h | 5 +- src/modules/shell/shell.c | 21 ++- src/modules/shell/shell.h | 2 +- src/modules/sound/option.h | 5 +- src/modules/sound/sound.c | 27 ++- src/modules/sound/sound.h | 2 +- src/modules/swap/option.h | 5 +- src/modules/swap/swap.c | 25 ++- src/modules/swap/swap.h | 2 +- src/modules/terminal/option.h | 5 +- src/modules/terminal/terminal.c | 21 ++- src/modules/terminal/terminal.h | 2 +- src/modules/terminalfont/option.h | 5 +- src/modules/terminalfont/terminalfont.c | 23 ++- src/modules/terminalfont/terminalfont.h | 2 +- src/modules/terminalsize/option.h | 5 +- src/modules/terminalsize/terminalsize.c | 23 ++- src/modules/terminalsize/terminalsize.h | 2 +- src/modules/terminaltheme/option.h | 5 +- src/modules/terminaltheme/terminaltheme.c | 23 ++- src/modules/terminaltheme/terminaltheme.h | 2 +- src/modules/theme/option.h | 5 +- src/modules/theme/theme.c | 21 ++- src/modules/theme/theme.h | 2 +- src/modules/title/option.h | 7 +- src/modules/title/title.c | 39 ++-- src/modules/title/title.h | 2 +- src/modules/tpm/option.h | 5 +- src/modules/tpm/tpm.c | 23 ++- src/modules/tpm/tpm.h | 2 +- src/modules/uptime/option.h | 5 +- src/modules/uptime/uptime.c | 21 ++- src/modules/uptime/uptime.h | 2 +- src/modules/users/option.h | 5 +- src/modules/users/users.c | 27 ++- src/modules/users/users.h | 2 +- src/modules/version/option.h | 5 +- src/modules/version/version.c | 21 ++- src/modules/version/version.h | 2 +- src/modules/vulkan/option.h | 5 +- src/modules/vulkan/vulkan.c | 21 ++- src/modules/vulkan/vulkan.h | 2 +- src/modules/wallpaper/option.h | 5 +- src/modules/wallpaper/wallpaper.c | 21 ++- src/modules/wallpaper/wallpaper.h | 2 +- src/modules/weather/option.h | 5 +- src/modules/weather/weather.c | 29 ++- src/modules/weather/weather.h | 2 +- src/modules/wifi/option.h | 5 +- src/modules/wifi/wifi.c | 25 ++- src/modules/wifi/wifi.h | 2 +- src/modules/wm/option.h | 5 +- src/modules/wm/wm.c | 23 ++- src/modules/wm/wm.h | 2 +- src/modules/wmtheme/option.h | 5 +- src/modules/wmtheme/wmtheme.c | 21 ++- src/modules/wmtheme/wmtheme.h | 2 +- src/modules/zpool/option.h | 5 +- src/modules/zpool/zpool.c | 23 ++- src/modules/zpool/zpool.h | 2 +- src/options/display.h | 1 + src/options/modules.c | 156 ---------------- src/options/modules.h | 83 --------- 289 files changed, 1449 insertions(+), 1672 deletions(-) delete mode 100644 src/options/modules.c delete mode 100644 src/options/modules.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 22917aec6..b01a1eae7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -474,7 +474,6 @@ set(LIBFASTFETCH_SRC src/modules/wmtheme/wmtheme.c src/modules/zpool/zpool.c src/options/display.c - src/options/modules.c src/options/logo.c src/options/general.c src/util/edidHelper.c diff --git a/presets/neofetch.jsonc b/presets/neofetch.jsonc index 66f9b9de6..0f38ed5f2 100644 --- a/presets/neofetch.jsonc +++ b/presets/neofetch.jsonc @@ -3,7 +3,12 @@ "display": { "size": { "maxPrefix": "MB", - "ndigits": 0 + "ndigits": 0, + "spaceBeforeUnit": "never" + }, + "freq": { + "ndigits": 3, + "spaceBeforeUnit": "never" } }, "modules": [ @@ -39,11 +44,12 @@ "cpu", { "type": "gpu", - "key": "GPU" + "key": "GPU", + "format": "{name}" }, { "type": "memory", - "format": "{} / {}" + "format": "{used} / {total}" }, "break", "colors" diff --git a/src/common/commandoption.c b/src/common/commandoption.c index 004f81044..d38921a46 100644 --- a/src/common/commandoption.c +++ b/src/common/commandoption.c @@ -12,7 +12,6 @@ void ffPrepareCommandOption(FFdata* data) { - FFOptionsModules* const options = &instance.config.modules; //If we don't have a custom structure, use the default one if(data->structure.length == 0) ffStrbufAppendS(&data->structure, FASTFETCH_DATATEXT_STRUCTURE); // Cannot use `ffStrbufSetStatic` here because we will modify the string @@ -21,22 +20,38 @@ void ffPrepareCommandOption(FFdata* data) ffPrepareCPUUsage(); if(ffStrbufContainIgnCaseS(&data->structure, FF_DISKIO_MODULE_NAME)) - ffPrepareDiskIO(&options->diskIo); + { + __attribute__((__cleanup__(ffDestroyDiskIOOptions))) FFDiskIOOptions options; + ffInitDiskIOOptions(&options); + ffPrepareDiskIO(&options); + } if(ffStrbufContainIgnCaseS(&data->structure, FF_NETIO_MODULE_NAME)) - ffPrepareNetIO(&options->netIo); + { + __attribute__((__cleanup__(ffDestroyNetIOOptions))) FFNetIOOptions options; + ffInitNetIOOptions(&options); + ffPrepareNetIO(&options); + } if(instance.config.general.multithreading) { if(ffStrbufContainIgnCaseS(&data->structure, FF_PUBLICIP_MODULE_NAME)) - ffPreparePublicIp(&options->publicIP); + { + __attribute__((__cleanup__(ffDestroyPublicIpOptions))) FFPublicIPOptions options; + ffInitPublicIpOptions(&options); + ffPreparePublicIp(&options); + } if(ffStrbufContainIgnCaseS(&data->structure, FF_WEATHER_MODULE_NAME)) - ffPrepareWeather(&options->weather); + { + __attribute__((__cleanup__(ffDestroyWeatherOptions))) FFWeatherOptions options; + ffInitWeatherOptions(&options); + ffPrepareWeather(&options); + } } } -static void genJsonConfig(FFModuleBaseInfo* baseInfo, yyjson_mut_doc* doc) +static void genJsonConfig(FFModuleBaseInfo* baseInfo, void* options, yyjson_mut_doc* doc) { yyjson_mut_val* modules = yyjson_mut_obj_get(doc->root, "modules"); if (!modules) @@ -48,7 +63,7 @@ static void genJsonConfig(FFModuleBaseInfo* baseInfo, yyjson_mut_doc* doc) yyjson_mut_obj_add_strbuf(doc, module, "type", &type); if (baseInfo->generateJsonConfig) - baseInfo->generateJsonConfig(baseInfo, doc, module); + baseInfo->generateJsonConfig(options, doc, module); if (yyjson_mut_obj_size(module) > 1) yyjson_mut_arr_add_val(modules, module); @@ -56,19 +71,19 @@ static void genJsonConfig(FFModuleBaseInfo* baseInfo, yyjson_mut_doc* doc) yyjson_mut_arr_add_strbuf(doc, modules, &type); } -static void genJsonResult(FFModuleBaseInfo* baseInfo, yyjson_mut_doc* doc) +static void genJsonResult(FFModuleBaseInfo* baseInfo, void* options, yyjson_mut_doc* doc) { yyjson_mut_val* module = yyjson_mut_arr_add_obj(doc, doc->root); yyjson_mut_obj_add_str(doc, module, "type", baseInfo->name); if (baseInfo->generateJsonResult) - baseInfo->generateJsonResult(baseInfo, doc, module); + baseInfo->generateJsonResult(options, doc, module); else yyjson_mut_obj_add_str(doc, module, "error", "Unsupported for JSON format"); } static void parseStructureCommand( const char* line, - void (*fn)(FFModuleBaseInfo *baseInfo, yyjson_mut_doc* jsonDoc), + void (*fn)(FFModuleBaseInfo* baseInfo, void* options, yyjson_mut_doc* jsonDoc), yyjson_mut_doc* jsonDoc ) { @@ -79,10 +94,13 @@ static void parseStructureCommand( FFModuleBaseInfo* baseInfo = *modules; if (ffStrEqualsIgnCase(line, baseInfo->name)) { + uint8_t optionBuf[FF_OPTION_MAX_SIZE]; + baseInfo->initOptions(optionBuf); if (__builtin_expect(jsonDoc != NULL, false)) - fn(baseInfo, jsonDoc); + fn(baseInfo, optionBuf, jsonDoc); else - baseInfo->printModule(baseInfo); + baseInfo->printModule(optionBuf); + baseInfo->destroyOptions(optionBuf); return; } } diff --git a/src/common/init.c b/src/common/init.c index 8b6032c03..078402aac 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -42,14 +42,13 @@ static void defaultConfig(void) { ffOptionsInitLogo(&instance.config.logo); ffOptionsInitGeneral(&instance.config.general); - ffOptionsInitModules(&instance.config.modules); ffOptionsInitDisplay(&instance.config.display); } void ffInitInstance(void) { #ifdef WIN32 - //https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/setlocale-wsetlocale?source=recommendations&view=msvc-170#utf-8-support + // https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/setlocale-wsetlocale?source=recommendat> setlocale(LC_ALL, ".UTF8"); #else // Never use `setlocale(LC_ALL, "")` @@ -96,11 +95,6 @@ static void chldSignalHandler(FF_MAYBE_UNUSED int signal) void ffStart(void) { - #ifdef FF_START_DETECTION_THREADS - if(instance.config.general.multithreading) - startDetectionThreads(); - #endif - ffDisableLinewrap = instance.config.display.disableLinewrap && !instance.config.display.pipe && !instance.state.resultDoc; ffHideCursor = instance.config.display.hideCursor && !instance.config.display.pipe && !instance.state.resultDoc; @@ -150,7 +144,6 @@ static void destroyConfig(void) { ffOptionsDestroyLogo(&instance.config.logo); ffOptionsDestroyGeneral(&instance.config.general); - ffOptionsDestroyModules(&instance.config.modules); ffOptionsDestroyDisplay(&instance.config.display); } diff --git a/src/common/jsonconfig.c b/src/common/jsonconfig.c index 2434ddad0..155f65668 100644 --- a/src/common/jsonconfig.c +++ b/src/common/jsonconfig.c @@ -99,12 +99,12 @@ const char* ffJsonConfigParseEnum(yyjson_val* val, int* result, FFKeyValuePair p return "Invalid enum value type; must be a string or integer"; } -static inline void genJsonResult(FFModuleBaseInfo* baseInfo, yyjson_mut_doc* doc) +static inline void genJsonResult(FFModuleBaseInfo* baseInfo, void* options, yyjson_mut_doc* doc) { yyjson_mut_val* module = yyjson_mut_arr_add_obj(doc, doc->root); yyjson_mut_obj_add_str(doc, module, "type", baseInfo->name); if (baseInfo->generateJsonResult) - baseInfo->generateJsonResult(baseInfo, doc, module); + baseInfo->generateJsonResult(options, doc, module); else yyjson_mut_obj_add_str(doc, module, "error", "Unsupported for JSON format"); } @@ -118,11 +118,14 @@ static bool parseModuleJsonObject(const char* type, yyjson_val* jsonVal, yyjson_ FFModuleBaseInfo* baseInfo = *modules; if (ffStrEqualsIgnCase(type, baseInfo->name)) { - if (jsonVal) baseInfo->parseJsonObject(baseInfo, jsonVal); + uint8_t optionBuf[FF_OPTION_MAX_SIZE]; + baseInfo->initOptions(optionBuf); + if (jsonVal) baseInfo->parseJsonObject(optionBuf, jsonVal); if (__builtin_expect(jsonDoc != NULL, false)) - genJsonResult(baseInfo, jsonDoc); + genJsonResult(baseInfo, optionBuf, jsonDoc); else - baseInfo->printModule(baseInfo); + baseInfo->printModule(optionBuf); + baseInfo->destroyOptions(optionBuf); return true; } } @@ -131,7 +134,6 @@ static bool parseModuleJsonObject(const char* type, yyjson_val* jsonVal, yyjson_ static void prepareModuleJsonObject(const char* type, yyjson_val* module) { - FFconfig* cfg = &instance.config; switch (type[0]) { case 'b': case 'B': { @@ -142,32 +144,40 @@ static void prepareModuleJsonObject(const char* type, yyjson_val* module) case 'd': case 'D': { if (ffStrEqualsIgnCase(type, FF_DISKIO_MODULE_NAME)) { - if (module) cfg->modules.diskIo.moduleInfo.parseJsonObject(&cfg->modules.diskIo, module); - ffPrepareDiskIO(&cfg->modules.diskIo); + __attribute__((__cleanup__(ffDestroyDiskIOOptions))) FFDiskIOOptions options; + ffInitDiskIOOptions(&options); + if (module) ffDiskIOModuleInfo.parseJsonObject(&options, module); + ffPrepareDiskIO(&options); } break; } case 'n': case 'N': { if (ffStrEqualsIgnCase(type, FF_NETIO_MODULE_NAME)) { - if (module) cfg->modules.netIo.moduleInfo.parseJsonObject(&cfg->modules.netIo, module); - ffPrepareNetIO(&cfg->modules.netIo); + __attribute__((__cleanup__(ffDestroyNetIOOptions))) FFNetIOOptions options; + ffInitNetIOOptions(&options); + if (module) ffNetIOModuleInfo.parseJsonObject(&options, module); + ffPrepareNetIO(&options); } break; } case 'p': case 'P': { if (ffStrEqualsIgnCase(type, FF_PUBLICIP_MODULE_NAME)) { - if (module) cfg->modules.publicIP.moduleInfo.parseJsonObject(&cfg->modules.publicIP, module); - ffPreparePublicIp(&cfg->modules.publicIP); + __attribute__((__cleanup__(ffDestroyPublicIpOptions))) FFPublicIPOptions options; + ffInitPublicIpOptions(&options); + if (module) ffPublicIPModuleInfo.parseJsonObject(&options, module); + ffPreparePublicIp(&options); } break; } case 'w': case 'W': { if (ffStrEqualsIgnCase(type, FF_WEATHER_MODULE_NAME)) { - if (module) cfg->modules.weather.moduleInfo.parseJsonObject(&cfg->modules.weather, module); - ffPrepareWeather(&cfg->modules.weather); + __attribute__((__cleanup__(ffDestroyWeatherOptions))) FFWeatherOptions options; + ffInitWeatherOptions(&options); + if (module) ffWeatherModuleInfo.parseJsonObject(&options, module); + ffPrepareWeather(&options); } break; } diff --git a/src/common/modules.c b/src/common/modules.c index 724c1aa49..7ad221005 100644 --- a/src/common/modules.c +++ b/src/common/modules.c @@ -1,69 +1,69 @@ -#include "fastfetch.h" +#include "modules/modules.h" static FFModuleBaseInfo* A[] = { NULL, }; static FFModuleBaseInfo* B[] = { - (FFModuleBaseInfo*) &instance.config.modules.battery, - (FFModuleBaseInfo*) &instance.config.modules.bios, - (FFModuleBaseInfo*) &instance.config.modules.bluetooth, - (FFModuleBaseInfo*) &instance.config.modules.bluetoothRadio, - (FFModuleBaseInfo*) &instance.config.modules.board, - (FFModuleBaseInfo*) &instance.config.modules.bootmgr, - (FFModuleBaseInfo*) &instance.config.modules.break_, - (FFModuleBaseInfo*) &instance.config.modules.brightness, - (FFModuleBaseInfo*) &instance.config.modules.btrfs, + &ffBatteryModuleInfo, + &ffBiosModuleInfo, + &ffBluetoothModuleInfo, + &ffBluetoothRadioModuleInfo, + &ffBoardModuleInfo, + &ffBootmgrModuleInfo, + &ffBreakModuleInfo, + &ffBrightnessModuleInfo, + &ffBtrfsModuleInfo, NULL, }; static FFModuleBaseInfo* C[] = { - (FFModuleBaseInfo*) &instance.config.modules.camera, - (FFModuleBaseInfo*) &instance.config.modules.chassis, - (FFModuleBaseInfo*) &instance.config.modules.command, - (FFModuleBaseInfo*) &instance.config.modules.colors, - (FFModuleBaseInfo*) &instance.config.modules.cpu, - (FFModuleBaseInfo*) &instance.config.modules.cpuCache, - (FFModuleBaseInfo*) &instance.config.modules.cpuUsage, - (FFModuleBaseInfo*) &instance.config.modules.cursor, - (FFModuleBaseInfo*) &instance.config.modules.custom, + &ffCameraModuleInfo, + &ffChassisModuleInfo, + &ffCommandModuleInfo, + &ffColorsModuleInfo, + &ffCPUModuleInfo, + &ffCPUCacheModuleInfo, + &ffCPUUsageModuleInfo, + &ffCursorModuleInfo, + &ffCustomModuleInfo, NULL, }; static FFModuleBaseInfo* D[] = { - (FFModuleBaseInfo*) &instance.config.modules.dateTime, - (FFModuleBaseInfo*) &instance.config.modules.de, - (FFModuleBaseInfo*) &instance.config.modules.display, - (FFModuleBaseInfo*) &instance.config.modules.disk, - (FFModuleBaseInfo*) &instance.config.modules.diskIo, - (FFModuleBaseInfo*) &instance.config.modules.dns, + &ffDateTimeModuleInfo, + &ffDEModuleInfo, + &ffDisplayModuleInfo, + &ffDiskModuleInfo, + &ffDiskIOModuleInfo, + &ffDNSModuleInfo, NULL, }; static FFModuleBaseInfo* E[] = { - (FFModuleBaseInfo*) &instance.config.modules.editor, + &ffEditorModuleInfo, NULL, }; static FFModuleBaseInfo* F[] = { - (FFModuleBaseInfo*) &instance.config.modules.font, + &ffFontModuleInfo, NULL, }; static FFModuleBaseInfo* G[] = { - (FFModuleBaseInfo*) &instance.config.modules.gamepad, - (FFModuleBaseInfo*) &instance.config.modules.gpu, + &ffGamepadModuleInfo, + &ffGPUModuleInfo, NULL, }; static FFModuleBaseInfo* H[] = { - (FFModuleBaseInfo*) &instance.config.modules.host, + &ffHostModuleInfo, NULL, }; static FFModuleBaseInfo* I[] = { - (FFModuleBaseInfo*) &instance.config.modules.icons, - (FFModuleBaseInfo*) &instance.config.modules.initSystem, + &ffIconsModuleInfo, + &ffInitSystemModuleInfo, NULL, }; @@ -72,47 +72,47 @@ static FFModuleBaseInfo* J[] = { }; static FFModuleBaseInfo* K[] = { - (FFModuleBaseInfo*) &instance.config.modules.kernel, - (FFModuleBaseInfo*) &instance.config.modules.keyboard, + &ffKernelModuleInfo, + &ffKeyboardModuleInfo, NULL, }; static FFModuleBaseInfo* L[] = { - (FFModuleBaseInfo*) &instance.config.modules.lm, - (FFModuleBaseInfo*) &instance.config.modules.loadavg, - (FFModuleBaseInfo*) &instance.config.modules.locale, - (FFModuleBaseInfo*) &instance.config.modules.localIP, + &ffLMModuleInfo, + &ffLoadavgModuleInfo, + &ffLocaleModuleInfo, + &ffLocalIPModuleInfo, NULL, }; static FFModuleBaseInfo* M[] = { - (FFModuleBaseInfo*) &instance.config.modules.media, - (FFModuleBaseInfo*) &instance.config.modules.memory, - (FFModuleBaseInfo*) &instance.config.modules.monitor, - (FFModuleBaseInfo*) &instance.config.modules.mouse, + &ffMediaModuleInfo, + &ffMemoryModuleInfo, + &ffMonitorModuleInfo, + &ffMouseModuleInfo, NULL, }; static FFModuleBaseInfo* N[] = { - (FFModuleBaseInfo*) &instance.config.modules.netIo, + &ffNetIOModuleInfo, NULL, }; static FFModuleBaseInfo* O[] = { - (FFModuleBaseInfo*) &instance.config.modules.openCL, - (FFModuleBaseInfo*) &instance.config.modules.openGL, - (FFModuleBaseInfo*) &instance.config.modules.os, + &ffOpenCLModuleInfo, + &ffOpenGLModuleInfo, + &ffOSModuleInfo, NULL, }; static FFModuleBaseInfo* P[] = { - (FFModuleBaseInfo*) &instance.config.modules.packages, - (FFModuleBaseInfo*) &instance.config.modules.physicalDisk, - (FFModuleBaseInfo*) &instance.config.modules.physicalMemory, - (FFModuleBaseInfo*) &instance.config.modules.player, - (FFModuleBaseInfo*) &instance.config.modules.powerAdapter, - (FFModuleBaseInfo*) &instance.config.modules.processes, - (FFModuleBaseInfo*) &instance.config.modules.publicIP, + &ffPackagesModuleInfo, + &ffPhysicalDiskModuleInfo, + &ffPhysicalMemoryModuleInfo, + &ffPlayerModuleInfo, + &ffPowerAdapterModuleInfo, + &ffProcessesModuleInfo, + &ffPublicIPModuleInfo, NULL, }; @@ -125,42 +125,42 @@ static FFModuleBaseInfo* R[] = { }; static FFModuleBaseInfo* S[] = { - (FFModuleBaseInfo*) &instance.config.modules.separator, - (FFModuleBaseInfo*) &instance.config.modules.shell, - (FFModuleBaseInfo*) &instance.config.modules.sound, - (FFModuleBaseInfo*) &instance.config.modules.swap, + &ffSeparatorModuleInfo, + &ffShellModuleInfo, + &ffSoundModuleInfo, + &ffSwapModuleInfo, NULL, }; static FFModuleBaseInfo* T[] = { - (FFModuleBaseInfo*) &instance.config.modules.terminal, - (FFModuleBaseInfo*) &instance.config.modules.terminalFont, - (FFModuleBaseInfo*) &instance.config.modules.terminalSize, - (FFModuleBaseInfo*) &instance.config.modules.terminalTheme, - (FFModuleBaseInfo*) &instance.config.modules.title, - (FFModuleBaseInfo*) &instance.config.modules.theme, - (FFModuleBaseInfo*) &instance.config.modules.tpm, + &ffTerminalModuleInfo, + &ffTerminalFontModuleInfo, + &ffTerminalSizeModuleInfo, + &ffTerminalThemeModuleInfo, + &ffTitleModuleInfo, + &ffThemeModuleInfo, + &ffTPMModuleInfo, NULL, }; static FFModuleBaseInfo* U[] = { - (FFModuleBaseInfo*) &instance.config.modules.uptime, - (FFModuleBaseInfo*) &instance.config.modules.users, + &ffUptimeModuleInfo, + &ffUsersModuleInfo, NULL, }; static FFModuleBaseInfo* V[] = { - (FFModuleBaseInfo*) &instance.config.modules.version, - (FFModuleBaseInfo*) &instance.config.modules.vulkan, + &ffVersionModuleInfo, + &ffVulkanModuleInfo, NULL, }; static FFModuleBaseInfo* W[] = { - (FFModuleBaseInfo*) &instance.config.modules.wallpaper, - (FFModuleBaseInfo*) &instance.config.modules.weather, - (FFModuleBaseInfo*) &instance.config.modules.wm, - (FFModuleBaseInfo*) &instance.config.modules.wifi, - (FFModuleBaseInfo*) &instance.config.modules.wmTheme, + &ffWallpaperModuleInfo, + &ffWeatherModuleInfo, + &ffWMModuleInfo, + &ffWifiModuleInfo, + &ffWMThemeModuleInfo, NULL, }; @@ -173,7 +173,7 @@ static FFModuleBaseInfo* Y[] = { }; static FFModuleBaseInfo* Z[] = { - (FFModuleBaseInfo*) &instance.config.modules.zpool, + &ffZpoolModuleInfo, NULL, }; diff --git a/src/common/option.h b/src/common/option.h index 618739a5d..e9c8cd81b 100644 --- a/src/common/option.h +++ b/src/common/option.h @@ -95,3 +95,5 @@ static inline void ffOptionDestroyModuleArg(FFModuleArgs* args) ffStrbufDestroy(&args->outputFormat); ffStrbufDestroy(&args->outputColor); } + +enum { FF_OPTION_MAX_SIZE = 1 << 8 }; // Maximum size of a single option value, used for static allocation diff --git a/src/detection/battery/battery.h b/src/detection/battery/battery.h index 94aa65e32..807ccdf0d 100644 --- a/src/detection/battery/battery.h +++ b/src/detection/battery/battery.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/battery/option.h" #define FF_BATTERY_TEMP_UNSET (0/0.0) diff --git a/src/detection/bios/bios.h b/src/detection/bios/bios.h index 5272c5ca1..4a0969d26 100644 --- a/src/detection/bios/bios.h +++ b/src/detection/bios/bios.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/bios/option.h" typedef struct FFBiosResult { diff --git a/src/detection/bluetooth/bluetooth.h b/src/detection/bluetooth/bluetooth.h index 57bf9ef3a..0a4153ce5 100644 --- a/src/detection/bluetooth/bluetooth.h +++ b/src/detection/bluetooth/bluetooth.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/bluetooth/option.h" typedef struct FFBluetoothResult { diff --git a/src/detection/bluetoothradio/bluetoothradio.h b/src/detection/bluetoothradio/bluetoothradio.h index 46ea60f58..8999b84a4 100644 --- a/src/detection/bluetoothradio/bluetoothradio.h +++ b/src/detection/bluetoothradio/bluetoothradio.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/bluetoothradio/option.h" typedef struct FFBluetoothRadioResult { diff --git a/src/detection/board/board.h b/src/detection/board/board.h index 64a8dd3a7..f41e60e13 100644 --- a/src/detection/board/board.h +++ b/src/detection/board/board.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/board/option.h" typedef struct FFBoardResult { diff --git a/src/detection/bootmgr/bootmgr.h b/src/detection/bootmgr/bootmgr.h index c2d1ac2a3..e0fbcddcc 100644 --- a/src/detection/bootmgr/bootmgr.h +++ b/src/detection/bootmgr/bootmgr.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/bootmgr/option.h" typedef struct FFBootmgrResult { diff --git a/src/detection/brightness/brightness.h b/src/detection/brightness/brightness.h index 3db260a66..5f2f1405a 100644 --- a/src/detection/brightness/brightness.h +++ b/src/detection/brightness/brightness.h @@ -1,7 +1,7 @@ #pragma once #include "fastfetch.h" -#include "util/FFlist.h" +#include "modules/brightness/option.h" typedef struct FFBrightnessResult { diff --git a/src/detection/btrfs/btrfs.h b/src/detection/btrfs/btrfs.h index a82157d09..8940ebc8a 100644 --- a/src/detection/btrfs/btrfs.h +++ b/src/detection/btrfs/btrfs.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/btrfs/option.h" typedef struct FFBtrfsDiskUsage { diff --git a/src/detection/camera/camera.h b/src/detection/camera/camera.h index 83d07f312..ee0c32d0c 100644 --- a/src/detection/camera/camera.h +++ b/src/detection/camera/camera.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/camera/option.h" typedef struct FFCameraResult { diff --git a/src/detection/chassis/chassis.h b/src/detection/chassis/chassis.h index 0c9c0380d..8f57232ec 100644 --- a/src/detection/chassis/chassis.h +++ b/src/detection/chassis/chassis.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/chassis/option.h" typedef struct FFChassisResult { diff --git a/src/detection/cpu/cpu.h b/src/detection/cpu/cpu.h index 5af7a8275..06ce87f9f 100644 --- a/src/detection/cpu/cpu.h +++ b/src/detection/cpu/cpu.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/cpu/option.h" #define FF_CPU_TEMP_UNSET (0/0.0) diff --git a/src/detection/cpucache/cpucache.h b/src/detection/cpucache/cpucache.h index f63964240..2e6e060e4 100644 --- a/src/detection/cpucache/cpucache.h +++ b/src/detection/cpucache/cpucache.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/cpucache/option.h" typedef enum __attribute__((__packed__)) FFCPUCacheType { diff --git a/src/detection/cpuusage/cpuusage.h b/src/detection/cpuusage/cpuusage.h index 7950d452b..353b7297c 100644 --- a/src/detection/cpuusage/cpuusage.h +++ b/src/detection/cpuusage/cpuusage.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/cpuusage/option.h" typedef struct FFCpuUsageInfo { uint64_t inUseAll; diff --git a/src/detection/cursor/cursor.h b/src/detection/cursor/cursor.h index 3e3ff6d40..6a6f68b27 100644 --- a/src/detection/cursor/cursor.h +++ b/src/detection/cursor/cursor.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/cursor/option.h" typedef struct FFCursorResult { diff --git a/src/detection/de/de.h b/src/detection/de/de.h index 9d8b2201f..67e8c1c41 100644 --- a/src/detection/de/de.h +++ b/src/detection/de/de.h @@ -1,5 +1,6 @@ #pragma once #include "fastfetch.h" +#include "modules/de/option.h" const char* ffDetectDEVersion(const FFstrbuf* deName, FFstrbuf* result, FFDEOptions* options); diff --git a/src/detection/disk/disk.h b/src/detection/disk/disk.h index 4a24f9de0..526de8128 100644 --- a/src/detection/disk/disk.h +++ b/src/detection/disk/disk.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/disk/option.h" typedef struct FFDisk { diff --git a/src/detection/diskio/diskio.h b/src/detection/diskio/diskio.h index 0082b18b7..fdaae3b18 100644 --- a/src/detection/diskio/diskio.h +++ b/src/detection/diskio/diskio.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/diskio/option.h" typedef struct FFDiskIOResult { diff --git a/src/detection/displayserver/displayserver.h b/src/detection/displayserver/displayserver.h index 7949f61ec..f502f175a 100644 --- a/src/detection/displayserver/displayserver.h +++ b/src/detection/displayserver/displayserver.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/display/option.h" #define FF_DE_PRETTY_PLASMA "KDE Plasma" #define FF_DE_PRETTY_GNOME "GNOME" diff --git a/src/detection/dns/dns.h b/src/detection/dns/dns.h index ec25005c3..3653f62d3 100644 --- a/src/detection/dns/dns.h +++ b/src/detection/dns/dns.h @@ -1,5 +1,6 @@ #pragma once #include "fastfetch.h" +#include "modules/dns/option.h" const char* ffDetectDNS(FFDNSOptions* options, FFlist* results /* list of FFstrbuf */); diff --git a/src/detection/editor/editor.h b/src/detection/editor/editor.h index 38d63aebe..d130c43bd 100644 --- a/src/detection/editor/editor.h +++ b/src/detection/editor/editor.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/editor/option.h" typedef struct FFEditorResult { diff --git a/src/detection/font/font.h b/src/detection/font/font.h index 0f0e28d1f..ed05d1d8c 100644 --- a/src/detection/font/font.h +++ b/src/detection/font/font.h @@ -1,8 +1,9 @@ #pragma once #include "fastfetch.h" +#include "modules/font/option.h" -#define FF_DETECT_FONT_NUM_FONTS 4 +enum { FF_DETECT_FONT_NUM_FONTS = 4 }; typedef struct FFFontResult { diff --git a/src/detection/gpu/gpu.c b/src/detection/gpu/gpu.c index a27ab01c7..5bd667ff2 100644 --- a/src/detection/gpu/gpu.c +++ b/src/detection/gpu/gpu.c @@ -2,6 +2,7 @@ #include "detection/vulkan/vulkan.h" #include "detection/opencl/opencl.h" #include "detection/opengl/opengl.h" +#include "modules/opengl/opengl.h" const char* FF_GPU_VENDOR_NAME_APPLE = "Apple"; const char* FF_GPU_VENDOR_NAME_AMD = "AMD"; @@ -56,7 +57,10 @@ const char* detectByOpenGL(FFlist* gpus) ffStrbufInit(&result.slv); ffStrbufInit(&result.library); - const char* error = ffDetectOpenGL(&instance.config.modules.openGL, &result); + __attribute__((__cleanup__(ffDestroyOpenGLOptions))) FFOpenGLOptions options; + ffInitOpenGLOptions(&options); + const char* error = ffDetectOpenGL(&options, &result); + if (!error) { FFGPUResult* gpu = (FFGPUResult*) ffListAdd(gpus); diff --git a/src/detection/gpu/gpu.h b/src/detection/gpu/gpu.h index e4db0f858..7d641a0a0 100644 --- a/src/detection/gpu/gpu.h +++ b/src/detection/gpu/gpu.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/gpu/option.h" #define FF_GPU_TEMP_UNSET (0/0.0) #define FF_GPU_CORE_COUNT_UNSET -1 diff --git a/src/detection/host/host.h b/src/detection/host/host.h index a8aa16b74..bd76e434e 100644 --- a/src/detection/host/host.h +++ b/src/detection/host/host.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/host/option.h" typedef struct FFHostResult { diff --git a/src/detection/icons/icons.h b/src/detection/icons/icons.h index f921270c6..4c96304aa 100644 --- a/src/detection/icons/icons.h +++ b/src/detection/icons/icons.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/icons/option.h" typedef struct FFIconsResult { diff --git a/src/detection/initsystem/initsystem.h b/src/detection/initsystem/initsystem.h index 07f79ff74..7103616bf 100644 --- a/src/detection/initsystem/initsystem.h +++ b/src/detection/initsystem/initsystem.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/initsystem/option.h" typedef struct FFInitSystemResult { diff --git a/src/detection/lm/lm.h b/src/detection/lm/lm.h index 4cbaf7c13..1cd8bb3ba 100644 --- a/src/detection/lm/lm.h +++ b/src/detection/lm/lm.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/lm/option.h" typedef struct FFLMResult { diff --git a/src/detection/localip/localip.h b/src/detection/localip/localip.h index a3fde0f1c..ddcb5e503 100644 --- a/src/detection/localip/localip.h +++ b/src/detection/localip/localip.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/localip/option.h" typedef struct FFLocalIpResult { diff --git a/src/detection/media/media.h b/src/detection/media/media.h index 5c97da471..598bbf55a 100644 --- a/src/detection/media/media.h +++ b/src/detection/media/media.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/media/option.h" typedef struct FFMediaResult { diff --git a/src/detection/memory/memory.h b/src/detection/memory/memory.h index 8929883e8..71a9ea9a4 100644 --- a/src/detection/memory/memory.h +++ b/src/detection/memory/memory.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/memory/option.h" typedef struct FFMemoryResult { diff --git a/src/detection/netio/netio.h b/src/detection/netio/netio.h index de633a107..47328b432 100644 --- a/src/detection/netio/netio.h +++ b/src/detection/netio/netio.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/netio/option.h" typedef struct FFNetIOResult { diff --git a/src/detection/opencl/opencl.h b/src/detection/opencl/opencl.h index a8b0063e4..c7d6ddb96 100644 --- a/src/detection/opencl/opencl.h +++ b/src/detection/opencl/opencl.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/opencl/option.h" typedef struct FFOpenCLResult { diff --git a/src/detection/opengl/opengl.h b/src/detection/opengl/opengl.h index 466dcf256..5dbf2e392 100644 --- a/src/detection/opengl/opengl.h +++ b/src/detection/opengl/opengl.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/opengl/option.h" typedef struct FFOpenGLResult { diff --git a/src/detection/os/os.h b/src/detection/os/os.h index e1b7828fe..09226b9c2 100644 --- a/src/detection/os/os.h +++ b/src/detection/os/os.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/os/option.h" typedef struct FFOSResult { diff --git a/src/detection/packages/packages.h b/src/detection/packages/packages.h index e96b0762c..c824b448a 100644 --- a/src/detection/packages/packages.h +++ b/src/detection/packages/packages.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/packages/option.h" typedef struct FFPackagesResult { diff --git a/src/detection/physicaldisk/physicaldisk.h b/src/detection/physicaldisk/physicaldisk.h index fbed2f52c..793d19975 100644 --- a/src/detection/physicaldisk/physicaldisk.h +++ b/src/detection/physicaldisk/physicaldisk.h @@ -1,4 +1,5 @@ #include "fastfetch.h" +#include "modules/physicaldisk/option.h" #define FF_PHYSICALDISK_TEMP_UNSET (0/0.0) diff --git a/src/detection/physicalmemory/physicalmemory.h b/src/detection/physicalmemory/physicalmemory.h index 2580295ca..74ca37767 100644 --- a/src/detection/physicalmemory/physicalmemory.h +++ b/src/detection/physicalmemory/physicalmemory.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/physicalmemory/option.h" typedef struct FFPhysicalMemoryResult { diff --git a/src/detection/poweradapter/poweradapter.h b/src/detection/poweradapter/poweradapter.h index 43c3a48e9..64c0eb5ec 100644 --- a/src/detection/poweradapter/poweradapter.h +++ b/src/detection/poweradapter/poweradapter.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/poweradapter/option.h" typedef struct FFPowerAdapterResult { diff --git a/src/detection/publicip/publicip.c b/src/detection/publicip/publicip.c index a76a550ae..7fed00cc2 100644 --- a/src/detection/publicip/publicip.c +++ b/src/detection/publicip/publicip.c @@ -5,7 +5,7 @@ static FFNetworkingState states[2]; static const char* statuses[2] = { FF_UNITIALIZED, FF_UNITIALIZED }; -void ffPreparePublicIp(FFPublicIpOptions* options) +void ffPreparePublicIp(FFPublicIPOptions* options) { FFNetworkingState* state = &states[options->ipv6]; const char** status = &statuses[options->ipv6]; @@ -58,7 +58,7 @@ static inline void wrapYyjsonFree(yyjson_doc** doc) yyjson_doc_free(*doc); } -const char* ffDetectPublicIp(FFPublicIpOptions* options, FFPublicIpResult* result) +const char* ffDetectPublicIp(FFPublicIPOptions* options, FFPublicIpResult* result) { FFNetworkingState* state = &states[options->ipv6]; const char** status = &statuses[options->ipv6]; diff --git a/src/detection/publicip/publicip.h b/src/detection/publicip/publicip.h index 463514762..917e787ab 100644 --- a/src/detection/publicip/publicip.h +++ b/src/detection/publicip/publicip.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/publicip/option.h" typedef struct FFPublicIpResult { @@ -8,5 +9,5 @@ typedef struct FFPublicIpResult FFstrbuf location; } FFPublicIpResult; -void ffPreparePublicIp(FFPublicIpOptions* options); -const char* ffDetectPublicIp(FFPublicIpOptions* options, FFPublicIpResult* result); +void ffPreparePublicIp(FFPublicIPOptions* options); +const char* ffDetectPublicIp(FFPublicIPOptions* options, FFPublicIpResult* result); diff --git a/src/detection/swap/swap.h b/src/detection/swap/swap.h index 227b4968e..c89940c12 100644 --- a/src/detection/swap/swap.h +++ b/src/detection/swap/swap.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/swap/option.h" typedef struct FFSwapResult { diff --git a/src/detection/terminalfont/terminalfont.h b/src/detection/terminalfont/terminalfont.h index 0cb33b71d..03ddad99e 100644 --- a/src/detection/terminalfont/terminalfont.h +++ b/src/detection/terminalfont/terminalfont.h @@ -2,6 +2,7 @@ #include "fastfetch.h" #include "common/font.h" +#include "modules/font/option.h" typedef struct FFTerminalFontResult { diff --git a/src/detection/terminalshell/terminalshell.h b/src/detection/terminalshell/terminalshell.h index cebc4647d..a2a6f23f8 100644 --- a/src/detection/terminalshell/terminalshell.h +++ b/src/detection/terminalshell/terminalshell.h @@ -1,6 +1,8 @@ #pragma once #include "fastfetch.h" +#include "modules/terminal/option.h" +#include "modules/shell/option.h" typedef struct FFShellResult { diff --git a/src/detection/terminalshell/terminalshell_linux.c b/src/detection/terminalshell/terminalshell_linux.c index 3414d148f..adda26c03 100644 --- a/src/detection/terminalshell/terminalshell_linux.c +++ b/src/detection/terminalshell/terminalshell_linux.c @@ -53,7 +53,7 @@ static pid_t getShellInfo(FFShellResult* result, pid_t pid) ffStrbufContainS(&result->processName, "hyfetch") || //when hyfetch uses fastfetch as backend ffStrbufEqualS(&result->processName, "clifm") || //https://github.com/leo-arch/clifm/issues/289 ffStrbufEqualS(&result->processName, "valgrind") || - ffStrbufEqualS(&result->processName, "fastfetch") || //994 + ffStrbufEqualS(&result->processName, "fastfetch") || //#994 ffStrbufEqualS(&result->processName, "flashfetch") || ffStrbufEqualS(&result->processName, "proot") || ffStrbufEqualS(&result->processName, "script") || diff --git a/src/detection/terminalsize/terminalsize.h b/src/detection/terminalsize/terminalsize.h index f8b116d73..e178f34b9 100644 --- a/src/detection/terminalsize/terminalsize.h +++ b/src/detection/terminalsize/terminalsize.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/terminalsize/option.h" typedef struct FFTerminalSizeResult { diff --git a/src/detection/terminaltheme/terminaltheme.h b/src/detection/terminaltheme/terminaltheme.h index 9f54c7f22..a3077823b 100644 --- a/src/detection/terminaltheme/terminaltheme.h +++ b/src/detection/terminaltheme/terminaltheme.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/terminaltheme/option.h" typedef struct FFTerminalThemeColor { diff --git a/src/detection/theme/theme.h b/src/detection/theme/theme.h index aa70f05ba..afd3400c6 100644 --- a/src/detection/theme/theme.h +++ b/src/detection/theme/theme.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/theme/option.h" typedef struct FFThemeResult { diff --git a/src/detection/tpm/tpm.h b/src/detection/tpm/tpm.h index 2310a23bf..5b5aa4e43 100644 --- a/src/detection/tpm/tpm.h +++ b/src/detection/tpm/tpm.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/tpm/option.h" typedef struct FFTPMResult { diff --git a/src/detection/uptime/uptime.h b/src/detection/uptime/uptime.h index 6f0696d39..f6426bc59 100644 --- a/src/detection/uptime/uptime.h +++ b/src/detection/uptime/uptime.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/uptime/option.h" typedef struct FFUptimeResult { diff --git a/src/detection/users/users.h b/src/detection/users/users.h index e29a1858d..baa3775c6 100644 --- a/src/detection/users/users.h +++ b/src/detection/users/users.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/users/option.h" typedef struct FFUserResult { diff --git a/src/detection/version/version.h b/src/detection/version/version.h index 272e87bc3..e97099aac 100644 --- a/src/detection/version/version.h +++ b/src/detection/version/version.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/version/option.h" typedef struct FFVersionResult { diff --git a/src/detection/vulkan/vulkan.h b/src/detection/vulkan/vulkan.h index 5b6d7832e..75a5b8de7 100644 --- a/src/detection/vulkan/vulkan.h +++ b/src/detection/vulkan/vulkan.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/vulkan/option.h" typedef struct FFVulkanResult { diff --git a/src/detection/weather/weather.h b/src/detection/weather/weather.h index 24dde33bb..bd3d1bc08 100644 --- a/src/detection/weather/weather.h +++ b/src/detection/weather/weather.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/weather/option.h" void ffPrepareWeather(FFWeatherOptions* options); const char* ffDetectWeather(FFWeatherOptions* options, FFstrbuf* result); diff --git a/src/detection/wifi/wifi.h b/src/detection/wifi/wifi.h index f941869a0..a7a99f4e4 100644 --- a/src/detection/wifi/wifi.h +++ b/src/detection/wifi/wifi.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/wifi/option.h" struct FFWifiInterface { diff --git a/src/detection/wm/wm.h b/src/detection/wm/wm.h index 5f5fa4adf..115a8cdd8 100644 --- a/src/detection/wm/wm.h +++ b/src/detection/wm/wm.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/wm/wm.h" const char* ffDetectWMPlugin(FFstrbuf* pluginName); const char* ffDetectWMVersion(const FFstrbuf* wmName, FFstrbuf* result, FFWMOptions* options); diff --git a/src/detection/zpool/zpool.h b/src/detection/zpool/zpool.h index aa8bee03e..e8a5191ae 100644 --- a/src/detection/zpool/zpool.h +++ b/src/detection/zpool/zpool.h @@ -1,6 +1,7 @@ #pragma once #include "fastfetch.h" +#include "modules/zpool/option.h" typedef struct FFZpoolResult { diff --git a/src/fastfetch.h b/src/fastfetch.h index d20248e93..9b031b87a 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -20,7 +20,6 @@ #include "util/platform/FFPlatform.h" #include "util/unused.h" -#include "options/modules.h" #include "options/logo.h" #include "options/display.h" #include "options/general.h" @@ -42,7 +41,6 @@ typedef struct FFconfig FFOptionsLogo logo; FFOptionsDisplay display; FFOptionsGeneral general; - FFOptionsModules modules; } FFconfig; typedef struct FFstate diff --git a/src/flashfetch.c b/src/flashfetch.c index 371a0ca98..aef4bc510 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -3,55 +3,138 @@ #include "common/init.h" #include "modules/modules.h" +// A dirty replicate of neofetch int main(void) { - ffInitInstance(); //This also applies default configuration to instance.config + ffInitInstance(); // Init everything - //Modify instance.config here - FFOptionsModules* const options = &instance.config.modules; + // Modify global config here if needed + instance.config.display.sizeMaxPrefix = 2; // MB + instance.config.display.sizeNdigits = 2; + instance.config.display.freqNdigits = 3; + instance.config.display.freqSpaceBeforeUnit = FF_SPACE_BEFORE_UNIT_NEVER; + instance.config.display.sizeSpaceBeforeUnit = FF_SPACE_BEFORE_UNIT_NEVER; - // ffPrepareCPUUsage(); - // ffPreparePublicIp(&options->publicIP); - // ffPrepareWeather(&options->weather); - - //Does things like starting detection threads, disabling line wrap, etc + // Logo printing and other preparation stuff ffStart(); - //Printing - void* const modules[] = { - &options->title, - &options->separator, - &options->os, - &options->host, - &options->kernel, - &options->uptime, - &options->packages, - &options->shell, - &options->display, - &options->de, - &options->wm, - &options->wmTheme, - &options->theme, - &options->icons, - &options->font, - &options->cursor, - &options->terminal, - &options->terminalFont, - &options->cpu, - &options->gpu, - &options->memory, - &options->swap, - &options->disk, - &options->localIP, - &options->battery, - &options->powerAdapter, - &options->locale, - &options->break_, - &options->colors, - }; - - for (size_t i = 0; i < ARRAY_SIZE(modules); i++) - ((const FFModuleBaseInfo*) modules[i])->printModule(modules[i]); + // Print all modules + { + __attribute__((cleanup(ffDestroyTitleOptions))) FFTitleOptions options; + ffInitTitleOptions(&options); + ffPrintTitle(&options); + } + { + __attribute__((cleanup(ffDestroySeparatorOptions))) FFSeparatorOptions options; + ffInitSeparatorOptions(&options); + ffPrintSeparator(&options); + } + { + __attribute__((cleanup(ffDestroyOSOptions))) FFOSOptions options; + ffInitOSOptions(&options); + ffPrintOS(&options); + } + { + __attribute__((cleanup(ffDestroyHostOptions))) FFHostOptions options; + ffInitHostOptions(&options); + ffPrintHost(&options); + } + { + __attribute__((cleanup(ffDestroyKernelOptions))) FFKernelOptions options; + ffInitKernelOptions(&options); + ffStrbufSetStatic(&options.moduleArgs.outputFormat, "{release}"); + ffPrintKernel(&options); + } + { + __attribute__((cleanup(ffDestroyUptimeOptions))) FFUptimeOptions options; + ffInitUptimeOptions(&options); + ffPrintUptime(&options); + } + { + __attribute__((cleanup(ffDestroyPackagesOptions))) FFPackagesOptions options; + ffInitPackagesOptions(&options); + options.combined = true; + ffPrintPackages(&options); + } + { + __attribute__((cleanup(ffDestroyShellOptions))) FFShellOptions options; + ffInitShellOptions(&options); + ffPrintShell(&options); + } + { + __attribute__((cleanup(ffDestroyDisplayOptions))) FFDisplayOptions options; + ffInitDisplayOptions(&options); + options.compactType = FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT; + ffStrbufSetStatic(&options.moduleArgs.key, "Resolution"); + ffPrintDisplay(&options); + } + { + __attribute__((cleanup(ffDestroyDEOptions))) FFDEOptions options; + ffInitDEOptions(&options); + ffPrintDE(&options); + } + { + instance.config.general.detectVersion = false; + __attribute__((cleanup(ffDestroyWMOptions))) FFWMOptions options; + ffInitWMOptions(&options); + options.detectPlugin = true; + ffPrintWM(&options); + instance.config.general.detectVersion = true; + } + { + __attribute__((cleanup(ffDestroyWMThemeOptions))) FFWMThemeOptions options; + ffInitWMThemeOptions(&options); + ffPrintWMTheme(&options); + } + { + __attribute__((cleanup(ffDestroyThemeOptions))) FFThemeOptions options; + ffInitThemeOptions(&options); + ffPrintTheme(&options); + } + { + __attribute__((cleanup(ffDestroyIconsOptions))) FFIconsOptions options; + ffInitIconsOptions(&options); + ffPrintIcons(&options); + } + { + __attribute__((cleanup(ffDestroyTerminalOptions))) FFTerminalOptions options; + ffInitTerminalOptions(&options); + ffPrintTerminal(&options); + } + { + __attribute__((cleanup(ffDestroyTerminalFontOptions))) FFTerminalFontOptions options; + ffInitTerminalFontOptions(&options); + ffStrbufSetStatic(&options.moduleArgs.outputFormat, "{/name}{-}{/}{name}{?size} {size}{?}"); + ffPrintTerminalFont(&options); + } + { + __attribute__((cleanup(ffDestroyCPUOptions))) FFCPUOptions options; + ffInitCPUOptions(&options); + ffPrintCPU(&options); + } + { + __attribute__((cleanup(ffDestroyGPUOptions))) FFGPUOptions options; + ffInitGPUOptions(&options); + ffStrbufSetStatic(&options.moduleArgs.key, "GPU"); + ffStrbufSetStatic(&options.moduleArgs.outputFormat, "{name}"); + ffPrintGPU(&options); + } + { + __attribute__((cleanup(ffDestroyMemoryOptions))) FFMemoryOptions options; + ffInitMemoryOptions(&options); + ffStrbufSetStatic(&options.moduleArgs.outputFormat, "{} / {}"); + ffPrintMemory(&options); + } + { + __attribute__((cleanup(ffDestroyBreakOptions))) FFBreakOptions options; + ffInitBreakOptions(&options); + ffPrintBreak(&options); + } + { + __attribute__((cleanup(ffDestroyColorsOptions))) FFColorsOptions options; + ffInitColorsOptions(&options); + ffPrintColors(&options); + } ffFinish(); ffDestroyInstance(); diff --git a/src/logo/logo.c b/src/logo/logo.c index 0052ac7f8..c2c4acbbf 100644 --- a/src/logo/logo.c +++ b/src/logo/logo.c @@ -568,14 +568,12 @@ static bool logoTryKnownType(void) { FF_STRBUF_AUTO_DESTROY source = ffStrbufCreate(); - FFCommandOptions* commandOptions = &instance.config.modules.command; - const char* error = ffProcessAppendStdOut(&source, commandOptions->param.length ? (char* const[]){ - commandOptions->shell.chars, - commandOptions->param.chars, - options->source.chars, - NULL - } : (char* const[]){ - commandOptions->shell.chars, + const char* error = ffProcessAppendStdOut(&source, (char* const[]){ + #ifdef _WIN32 + "cmd.exe", "/c", + #else + "/bin/sh", "-c", + #endif options->source.chars, NULL }); diff --git a/src/modules/battery/battery.c b/src/modules/battery/battery.c index 7d306accf..788008427 100644 --- a/src/modules/battery/battery.c +++ b/src/modules/battery/battery.c @@ -245,6 +245,23 @@ void ffGenerateBatteryJsonResult(FFBatteryOptions* options, yyjson_mut_doc* doc, } } +void ffInitBatteryOptions(FFBatteryOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); + options->temp = false; + options->tempConfig = (FFColorRangeConfig) { 60, 80 }; + options->percent = (FFPercentageModuleConfig) { 50, 20, 0 }; + + #ifdef _WIN32 + options->useSetupApi = false; + #endif +} + +void ffDestroyBatteryOptions(FFBatteryOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffBatteryModuleInfo = { .name = FF_BATTERY_MODULE_NAME, .description = "Print battery capacity, status, etc", @@ -272,21 +289,3 @@ FFModuleBaseInfo ffBatteryModuleInfo = { {"Battery time remaining (formatted)", "time-formatted"}, })) }; - -void ffInitBatteryOptions(FFBatteryOptions* options) -{ - options->moduleInfo = ffBatteryModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); - options->temp = false; - options->tempConfig = (FFColorRangeConfig) { 60, 80 }; - options->percent = (FFPercentageModuleConfig) { 50, 20, 0 }; - - #ifdef _WIN32 - options->useSetupApi = false; - #endif -} - -void ffDestroyBatteryOptions(FFBatteryOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/battery/battery.h b/src/modules/battery/battery.h index 9bde4f063..820a7bc7c 100644 --- a/src/modules/battery/battery.h +++ b/src/modules/battery/battery.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_BATTERY_MODULE_NAME "Battery" diff --git a/src/modules/battery/option.h b/src/modules/battery/option.h index 8b04ef1b4..1ac5b97be 100644 --- a/src/modules/battery/option.h +++ b/src/modules/battery/option.h @@ -1,13 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" #include "common/percent.h" typedef struct FFBatteryOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; bool temp; @@ -18,3 +15,5 @@ typedef struct FFBatteryOptions bool useSetupApi; #endif } FFBatteryOptions; + +static_assert(sizeof(FFBatteryOptions) <= FF_OPTION_MAX_SIZE, "FFBatteryOptions size exceeds maximum allowed size"); diff --git a/src/modules/bios/bios.c b/src/modules/bios/bios.c index f2afa9c44..f802ffd79 100644 --- a/src/modules/bios/bios.c +++ b/src/modules/bios/bios.c @@ -128,6 +128,16 @@ exit: ffStrbufDestroy(&bios.type); } +void ffInitBiosOptions(FFBiosOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyBiosOptions(FFBiosOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffBiosModuleInfo = { .name = FF_BIOS_MODULE_NAME, .description = "Print information of 1st-stage bootloader (name, version, release date, etc)", @@ -145,14 +155,3 @@ FFModuleBaseInfo ffBiosModuleInfo = { {"Firmware type", "type"}, })) }; - -void ffInitBiosOptions(FFBiosOptions* options) -{ - options->moduleInfo = ffBiosModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyBiosOptions(FFBiosOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/bios/bios.h b/src/modules/bios/bios.h index 43c2a17e4..22b35edda 100644 --- a/src/modules/bios/bios.h +++ b/src/modules/bios/bios.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_BIOS_MODULE_NAME "BIOS" diff --git a/src/modules/bios/option.h b/src/modules/bios/option.h index 483e7b664..000803569 100644 --- a/src/modules/bios/option.h +++ b/src/modules/bios/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFBiosOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFBiosOptions; + +static_assert(sizeof(FFBiosOptions) <= FF_OPTION_MAX_SIZE, "FFBiosOptions size exceeds maximum allowed size"); diff --git a/src/modules/bluetooth/bluetooth.c b/src/modules/bluetooth/bluetooth.c index 7df3ada40..c26316ae8 100644 --- a/src/modules/bluetooth/bluetooth.c +++ b/src/modules/bluetooth/bluetooth.c @@ -163,6 +163,18 @@ void ffGenerateBluetoothJsonResult(FFBluetoothOptions* options, yyjson_mut_doc* } } +void ffInitBluetoothOptions(FFBluetoothOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); + options->showDisconnected = false; + options->percent = (FFPercentageModuleConfig) { 50, 20, 0 }; +} + +void ffDestroyBluetoothOptions(FFBluetoothOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffBluetoothModuleInfo = { .name = FF_BLUETOOTH_MODULE_NAME, .description = "List (connected) bluetooth devices", @@ -181,16 +193,3 @@ FFModuleBaseInfo ffBluetoothModuleInfo = { {"Battery percentage bar", "battery-percentage-bar"}, })) }; - -void ffInitBluetoothOptions(FFBluetoothOptions* options) -{ - options->moduleInfo = ffBluetoothModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); - options->showDisconnected = false; - options->percent = (FFPercentageModuleConfig) { 50, 20, 0 }; -} - -void ffDestroyBluetoothOptions(FFBluetoothOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/bluetooth/bluetooth.h b/src/modules/bluetooth/bluetooth.h index 448bebab1..889be9690 100644 --- a/src/modules/bluetooth/bluetooth.h +++ b/src/modules/bluetooth/bluetooth.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_BLUETOOTH_MODULE_NAME "Bluetooth" diff --git a/src/modules/bluetooth/option.h b/src/modules/bluetooth/option.h index 4de6fff72..516c0d8b4 100644 --- a/src/modules/bluetooth/option.h +++ b/src/modules/bluetooth/option.h @@ -1,15 +1,14 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" #include "common/percent.h" typedef struct FFBluetoothOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; bool showDisconnected; FFPercentageModuleConfig percent; } FFBluetoothOptions; + +static_assert(sizeof(FFBluetoothOptions) <= FF_OPTION_MAX_SIZE, "FFBluetoothOptions size exceeds maximum allowed size"); diff --git a/src/modules/bluetoothradio/bluetoothradio.c b/src/modules/bluetoothradio/bluetoothradio.c index 0a75e3205..9d96d27a7 100644 --- a/src/modules/bluetoothradio/bluetoothradio.c +++ b/src/modules/bluetoothradio/bluetoothradio.c @@ -166,6 +166,16 @@ void ffGenerateBluetoothRadioJsonResult(FF_MAYBE_UNUSED FFBluetoothRadioOptions* } } +void ffInitBluetoothRadioOptions(FFBluetoothRadioOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰐻"); +} + +void ffDestroyBluetoothRadioOptions(FFBluetoothRadioOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffBluetoothRadioModuleInfo = { .name = FF_BLUETOOTHRADIO_MODULE_NAME, .description = "List bluetooth radios width supported version and vendor", @@ -186,14 +196,3 @@ FFModuleBaseInfo ffBluetoothRadioModuleInfo = { {"Connectable / Pairable", "connectable"}, })) }; - -void ffInitBluetoothRadioOptions(FFBluetoothRadioOptions* options) -{ - options->moduleInfo = ffBluetoothRadioModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰐻"); -} - -void ffDestroyBluetoothRadioOptions(FFBluetoothRadioOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/bluetoothradio/bluetoothradio.h b/src/modules/bluetoothradio/bluetoothradio.h index d1371151f..9d63525fe 100644 --- a/src/modules/bluetoothradio/bluetoothradio.h +++ b/src/modules/bluetoothradio/bluetoothradio.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_BLUETOOTHRADIO_MODULE_NAME "BluetoothRadio" diff --git a/src/modules/bluetoothradio/option.h b/src/modules/bluetoothradio/option.h index 714200d3e..1b718b834 100644 --- a/src/modules/bluetoothradio/option.h +++ b/src/modules/bluetoothradio/option.h @@ -1,12 +1,11 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" #include "common/percent.h" typedef struct FFBluetoothRadioOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFBluetoothRadioOptions; + +static_assert(sizeof(FFBluetoothRadioOptions) <= FF_OPTION_MAX_SIZE, "FFBluetoothRadioOptions size exceeds maximum allowed size"); diff --git a/src/modules/board/board.c b/src/modules/board/board.c index 57cd52b3b..78947294f 100644 --- a/src/modules/board/board.c +++ b/src/modules/board/board.c @@ -106,6 +106,16 @@ exit: ffStrbufDestroy(&board.serial); } +void ffInitBoardOptions(FFBoardOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyBoardOptions(FFBoardOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffBoardModuleInfo = { .name = FF_BOARD_MODULE_NAME, .description = "Print motherboard name and other info", @@ -122,14 +132,3 @@ FFModuleBaseInfo ffBoardModuleInfo = { {"Board serial number", "serial"}, })) }; - -void ffInitBoardOptions(FFBoardOptions* options) -{ - options->moduleInfo = ffBoardModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyBoardOptions(FFBoardOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/board/board.h b/src/modules/board/board.h index 6760e736d..3fdea021d 100644 --- a/src/modules/board/board.h +++ b/src/modules/board/board.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_BOARD_MODULE_NAME "Board" diff --git a/src/modules/board/option.h b/src/modules/board/option.h index 1640ff3d3..bcc69adf3 100644 --- a/src/modules/board/option.h +++ b/src/modules/board/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFBoardOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFBoardOptions; + +static_assert(sizeof(FFBoardOptions) <= FF_OPTION_MAX_SIZE, "FFBoardOptions size exceeds maximum allowed size"); diff --git a/src/modules/bootmgr/bootmgr.c b/src/modules/bootmgr/bootmgr.c index d693acbaa..29c08500c 100644 --- a/src/modules/bootmgr/bootmgr.c +++ b/src/modules/bootmgr/bootmgr.c @@ -97,6 +97,16 @@ exit: ffStrbufDestroy(&bootmgr.firmware); } +void ffInitBootmgrOptions(FFBootmgrOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyBootmgrOptions(FFBootmgrOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffBootmgrModuleInfo = { .name = FF_BOOTMGR_MODULE_NAME, .description = "Print information of 2nd-stage bootloader (name, firmware, etc)", @@ -114,14 +124,3 @@ FFModuleBaseInfo ffBootmgrModuleInfo = { {"Boot order", "order"}, })) }; - -void ffInitBootmgrOptions(FFBootmgrOptions* options) -{ - options->moduleInfo = ffBootmgrModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyBootmgrOptions(FFBootmgrOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/bootmgr/bootmgr.h b/src/modules/bootmgr/bootmgr.h index 98b030602..9150f5218 100644 --- a/src/modules/bootmgr/bootmgr.h +++ b/src/modules/bootmgr/bootmgr.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_BOOTMGR_MODULE_NAME "Bootmgr" diff --git a/src/modules/bootmgr/option.h b/src/modules/bootmgr/option.h index 04a7d3cc5..e27e71efd 100644 --- a/src/modules/bootmgr/option.h +++ b/src/modules/bootmgr/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFBootmgrOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFBootmgrOptions; + +static_assert(sizeof(FFBootmgrOptions) <= FF_OPTION_MAX_SIZE, "FFBootmgrOptions size exceeds maximum allowed size"); diff --git a/src/modules/break/break.c b/src/modules/break/break.c index c2be5f5b0..34fb4c2ad 100644 --- a/src/modules/break/break.c +++ b/src/modules/break/break.c @@ -21,6 +21,14 @@ void ffParseBreakJsonObject(FF_MAYBE_UNUSED FFBreakOptions* options, FF_MAYBE_UN } } +void ffInitBreakOptions(FF_MAYBE_UNUSED FFBreakOptions* options) +{ +} + +void ffDestroyBreakOptions(FF_MAYBE_UNUSED FFBreakOptions* options) +{ +} + FFModuleBaseInfo ffBreakModuleInfo = { .name = FF_BREAK_MODULE_NAME, .description = "Print a empty line", @@ -29,12 +37,3 @@ FFModuleBaseInfo ffBreakModuleInfo = { .parseJsonObject = (void*) ffParseBreakJsonObject, .printModule = (void*) ffPrintBreak, }; - -void ffInitBreakOptions(FF_MAYBE_UNUSED FFBreakOptions* options) -{ - options->moduleInfo = ffBreakModuleInfo; -} - -void ffDestroyBreakOptions(FF_MAYBE_UNUSED FFBreakOptions* options) -{ -} diff --git a/src/modules/break/break.h b/src/modules/break/break.h index f436bfcbb..772d19744 100644 --- a/src/modules/break/break.h +++ b/src/modules/break/break.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_BREAK_MODULE_NAME "Break" diff --git a/src/modules/break/option.h b/src/modules/break/option.h index 4d2870c26..e5acbf20d 100644 --- a/src/modules/break/option.h +++ b/src/modules/break/option.h @@ -1,10 +1,9 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFBreakOptions { - FFModuleBaseInfo moduleInfo; } FFBreakOptions; + +static_assert(sizeof(FFBreakOptions) <= FF_OPTION_MAX_SIZE, "FFBreakOptions size exceeds maximum allowed size"); diff --git a/src/modules/brightness/brightness.c b/src/modules/brightness/brightness.c index 4c93ea02f..35e83f144 100644 --- a/src/modules/brightness/brightness.c +++ b/src/modules/brightness/brightness.c @@ -187,6 +187,20 @@ void ffGenerateBrightnessJsonResult(FF_MAYBE_UNUSED FFBrightnessOptions* options } } +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 = FF_BRIGHTNESS_MODULE_NAME, .description = "Print current brightness level of your monitors", @@ -206,18 +220,3 @@ FFModuleBaseInfo ffBrightnessModuleInfo = { {"Is built-in screen", "is-builtin"}, })) }; - -void ffInitBrightnessOptions(FFBrightnessOptions* options) -{ - options->moduleInfo = ffBrightnessModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰯪"); - - options->ddcciSleep = 10; - options->percent = (FFPercentageModuleConfig) { 100, 100, 0 }; - options->compact = false; -} - -void ffDestroyBrightnessOptions(FFBrightnessOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/brightness/brightness.h b/src/modules/brightness/brightness.h index 0ee6b83c3..3b443425f 100644 --- a/src/modules/brightness/brightness.h +++ b/src/modules/brightness/brightness.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_BRIGHTNESS_MODULE_NAME "Brightness" diff --git a/src/modules/brightness/option.h b/src/modules/brightness/option.h index 70337f59e..4ff3843e7 100644 --- a/src/modules/brightness/option.h +++ b/src/modules/brightness/option.h @@ -1,16 +1,15 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" #include "common/percent.h" typedef struct FFBrightnessOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; uint32_t ddcciSleep; // ms FFPercentageModuleConfig percent; bool compact; } FFBrightnessOptions; + +static_assert(sizeof(FFBrightnessOptions) <= FF_OPTION_MAX_SIZE, "FFBrightnessOptions size exceeds maximum allowed size"); diff --git a/src/modules/btrfs/btrfs.c b/src/modules/btrfs/btrfs.c index a2aab728b..6872c00e0 100644 --- a/src/modules/btrfs/btrfs.c +++ b/src/modules/btrfs/btrfs.c @@ -200,6 +200,17 @@ void ffGenerateBtrfsJsonResult(FF_MAYBE_UNUSED FFBtrfsOptions* options, yyjson_m } } +void ffInitBtrfsOptions(FFBtrfsOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󱑛"); + options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; +} + +void ffDestroyBtrfsOptions(FFBtrfsOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffBtrfsModuleInfo = { .name = FF_BTRFS_MODULE_NAME, .description = "Print Linux BTRFS volumes", @@ -225,15 +236,3 @@ FFModuleBaseInfo ffBtrfsModuleInfo = { {"Sector size", "sector-size"}, })) }; - -void ffInitBtrfsOptions(FFBtrfsOptions* options) -{ - options->moduleInfo = ffBtrfsModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󱑛"); - options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; -} - -void ffDestroyBtrfsOptions(FFBtrfsOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/btrfs/btrfs.h b/src/modules/btrfs/btrfs.h index dbc31e0de..3cd77df32 100644 --- a/src/modules/btrfs/btrfs.h +++ b/src/modules/btrfs/btrfs.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_BTRFS_MODULE_NAME "Btrfs" diff --git a/src/modules/btrfs/option.h b/src/modules/btrfs/option.h index 2e4b069b4..019eacb19 100644 --- a/src/modules/btrfs/option.h +++ b/src/modules/btrfs/option.h @@ -1,14 +1,13 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" #include "common/percent.h" typedef struct FFBtrfsOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFPercentageModuleConfig percent; } FFBtrfsOptions; + +static_assert(sizeof(FFBtrfsOptions) <= FF_OPTION_MAX_SIZE, "FFBtrfsOptions size exceeds maximum allowed size"); diff --git a/src/modules/camera/camera.c b/src/modules/camera/camera.c index 39b643bdd..557e27f2e 100644 --- a/src/modules/camera/camera.c +++ b/src/modules/camera/camera.c @@ -120,6 +120,16 @@ void ffGenerateCameraJsonResult(FF_MAYBE_UNUSED FFCameraOptions* options, yyjson } } +void ffInitCameraOptions(FFCameraOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰄀"); +} + +void ffDestroyCameraOptions(FFCameraOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffCameraModuleInfo = { .name = FF_CAMERA_MODULE_NAME, .description = "Print available cameras", @@ -138,14 +148,3 @@ FFModuleBaseInfo ffCameraModuleInfo = { {"Height (in px)", "height"}, })) }; - -void ffInitCameraOptions(FFCameraOptions* options) -{ - options->moduleInfo = ffCameraModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰄀"); -} - -void ffDestroyCameraOptions(FFCameraOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/camera/camera.h b/src/modules/camera/camera.h index e1dc96839..1de49bdca 100644 --- a/src/modules/camera/camera.h +++ b/src/modules/camera/camera.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_CAMERA_MODULE_NAME "Camera" diff --git a/src/modules/camera/option.h b/src/modules/camera/option.h index 7c7ac05b6..6a2481fe8 100644 --- a/src/modules/camera/option.h +++ b/src/modules/camera/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFCameraOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFCameraOptions; + +static_assert(sizeof(FFCameraOptions) <= FF_OPTION_MAX_SIZE, "FFCameraOptions size exceeds maximum allowed size"); diff --git a/src/modules/chassis/chassis.c b/src/modules/chassis/chassis.c index e1cb72bb5..bf357c3cb 100644 --- a/src/modules/chassis/chassis.c +++ b/src/modules/chassis/chassis.c @@ -107,6 +107,16 @@ exit: ffStrbufDestroy(&result.serial); } +void ffInitChassisOptions(FFChassisOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyChassisOptions(FFChassisOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffChassisModuleInfo = { .name = FF_CHASSIS_MODULE_NAME, .description = "Print chassis type (desktop, laptop, etc)", @@ -123,14 +133,3 @@ FFModuleBaseInfo ffChassisModuleInfo = { {"Chassis serial number", "serial"}, })), }; - -void ffInitChassisOptions(FFChassisOptions* options) -{ - options->moduleInfo = ffChassisModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyChassisOptions(FFChassisOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/chassis/chassis.h b/src/modules/chassis/chassis.h index ed6870cde..47a80d6ff 100644 --- a/src/modules/chassis/chassis.h +++ b/src/modules/chassis/chassis.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_CHASSIS_MODULE_NAME "Chassis" diff --git a/src/modules/chassis/option.h b/src/modules/chassis/option.h index de6338cd5..b3100653f 100644 --- a/src/modules/chassis/option.h +++ b/src/modules/chassis/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFChassisOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFChassisOptions; + +static_assert(sizeof(FFChassisOptions) <= FF_OPTION_MAX_SIZE, "FFChassisOptions size exceeds maximum allowed size"); diff --git a/src/modules/colors/colors.c b/src/modules/colors/colors.c index 22c8b639f..21d870d76 100644 --- a/src/modules/colors/colors.c +++ b/src/modules/colors/colors.c @@ -239,19 +239,8 @@ void ffGenerateColorsJsonConfig(FFColorsOptions* options, yyjson_mut_doc* doc, y } } -FFModuleBaseInfo ffColorsModuleInfo = { - .name = FF_COLORS_MODULE_NAME, - .description = "Print some colored blocks", - .initOptions = (void*) ffInitColorsOptions, - .destroyOptions = (void*) ffDestroyColorsOptions, - .parseJsonObject = (void*) ffParseColorsJsonObject, - .printModule = (void*) ffPrintColors, - .generateJsonConfig = (void*) ffGenerateColorsJsonConfig, -}; - void ffInitColorsOptions(FFColorsOptions* options) { - options->moduleInfo = ffColorsModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); ffStrbufSetStatic(&options->moduleArgs.key, " "); options->symbol = FF_COLORS_SYMBOL_BACKGROUND; @@ -266,3 +255,13 @@ void ffDestroyColorsOptions(FF_MAYBE_UNUSED FFColorsOptions* options) { ffOptionDestroyModuleArg(&options->moduleArgs); } + +FFModuleBaseInfo ffColorsModuleInfo = { + .name = FF_COLORS_MODULE_NAME, + .description = "Print some colored blocks", + .initOptions = (void*) ffInitColorsOptions, + .destroyOptions = (void*) ffDestroyColorsOptions, + .parseJsonObject = (void*) ffParseColorsJsonObject, + .printModule = (void*) ffPrintColors, + .generateJsonConfig = (void*) ffGenerateColorsJsonConfig, +}; diff --git a/src/modules/colors/colors.h b/src/modules/colors/colors.h index 9d250dc8a..3581dabd9 100644 --- a/src/modules/colors/colors.h +++ b/src/modules/colors/colors.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_COLORS_MODULE_NAME "Colors" diff --git a/src/modules/colors/option.h b/src/modules/colors/option.h index 1a948a9b1..6a0bbb0d4 100644 --- a/src/modules/colors/option.h +++ b/src/modules/colors/option.h @@ -1,7 +1,5 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef enum __attribute__((__packed__)) FFColorsSymbol @@ -23,10 +21,11 @@ typedef struct FFBlockConfig typedef struct FFColorsOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFColorsSymbol symbol; uint32_t paddingLeft; FFBlockConfig block; } FFColorsOptions; + +static_assert(sizeof(FFColorsOptions) <= FF_OPTION_MAX_SIZE, "FFColorsOptions size exceeds maximum allowed size"); diff --git a/src/modules/command/command.c b/src/modules/command/command.c index b2045566f..785f9514e 100644 --- a/src/modules/command/command.c +++ b/src/modules/command/command.c @@ -120,23 +120,8 @@ void ffGenerateCommandJsonResult(FF_MAYBE_UNUSED FFCommandOptions* options, yyjs yyjson_mut_obj_add_strbuf(doc, module, "result", &result); } -FFModuleBaseInfo ffCommandModuleInfo = { - .name = FF_COMMAND_MODULE_NAME, - .description = "Run custom shell scripts", - .initOptions = (void*) ffInitCommandOptions, - .destroyOptions = (void*) ffDestroyCommandOptions, - .parseJsonObject = (void*) ffParseCommandJsonObject, - .printModule = (void*) ffPrintCommand, - .generateJsonResult = (void*) ffGenerateCommandJsonResult, - .generateJsonConfig = (void*) ffGenerateCommandJsonConfig, - .formatArgs = FF_FORMAT_ARG_LIST(((FFModuleFormatArg[]) { - {"Command result", "result"}, - })) -}; - void ffInitCommandOptions(FFCommandOptions* options) { - options->moduleInfo = ffCommandModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, ""); ffStrbufInitStatic(&options->shell, @@ -163,3 +148,17 @@ void ffDestroyCommandOptions(FFCommandOptions* options) ffStrbufDestroy(&options->param); ffStrbufDestroy(&options->text); } + +FFModuleBaseInfo ffCommandModuleInfo = { + .name = FF_COMMAND_MODULE_NAME, + .description = "Run custom shell scripts", + .initOptions = (void*) ffInitCommandOptions, + .destroyOptions = (void*) ffDestroyCommandOptions, + .parseJsonObject = (void*) ffParseCommandJsonObject, + .printModule = (void*) ffPrintCommand, + .generateJsonResult = (void*) ffGenerateCommandJsonResult, + .generateJsonConfig = (void*) ffGenerateCommandJsonConfig, + .formatArgs = FF_FORMAT_ARG_LIST(((FFModuleFormatArg[]) { + {"Command result", "result"}, + })) +}; diff --git a/src/modules/command/command.h b/src/modules/command/command.h index 195de886b..dd28a8056 100644 --- a/src/modules/command/command.h +++ b/src/modules/command/command.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_COMMAND_MODULE_NAME "Command" diff --git a/src/modules/command/option.h b/src/modules/command/option.h index d30c51ea8..62fbeb981 100644 --- a/src/modules/command/option.h +++ b/src/modules/command/option.h @@ -1,15 +1,14 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFCommandOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFstrbuf shell; FFstrbuf param; FFstrbuf text; } FFCommandOptions; + +static_assert(sizeof(FFCommandOptions) <= FF_OPTION_MAX_SIZE, "FFCommandOptions size exceeds maximum allowed size"); diff --git a/src/modules/cpu/cpu.c b/src/modules/cpu/cpu.c index 2c35bbe56..b8f95356e 100644 --- a/src/modules/cpu/cpu.c +++ b/src/modules/cpu/cpu.c @@ -212,6 +212,19 @@ void ffGenerateCPUJsonResult(FFCPUOptions* options, yyjson_mut_doc* doc, yyjson_ ffStrbufDestroy(&cpu.vendor); } +void ffInitCPUOptions(FFCPUOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); + options->temp = false; + options->tempConfig = (FFColorRangeConfig) { 60, 80 }; + options->showPeCoreCount = false; +} + +void ffDestroyCPUOptions(FFCPUOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffCPUModuleInfo = { .name = FF_CPU_MODULE_NAME, .description = "Print CPU name, frequency, etc", @@ -234,17 +247,3 @@ FFModuleBaseInfo ffCPUModuleInfo = { {"Processor package count", "packages"}, })) }; - -void ffInitCPUOptions(FFCPUOptions* options) -{ - options->moduleInfo = ffCPUModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); - options->temp = false; - options->tempConfig = (FFColorRangeConfig) { 60, 80 }; - options->showPeCoreCount = false; -} - -void ffDestroyCPUOptions(FFCPUOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/cpu/cpu.h b/src/modules/cpu/cpu.h index b8ffcded4..c6be13500 100644 --- a/src/modules/cpu/cpu.h +++ b/src/modules/cpu/cpu.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_CPU_MODULE_NAME "CPU" diff --git a/src/modules/cpu/option.h b/src/modules/cpu/option.h index af2c87a3f..e0948af2e 100644 --- a/src/modules/cpu/option.h +++ b/src/modules/cpu/option.h @@ -1,15 +1,14 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFCPUOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; bool temp; FFColorRangeConfig tempConfig; bool showPeCoreCount; } FFCPUOptions; + +static_assert(sizeof(FFCPUOptions) <= FF_OPTION_MAX_SIZE, "FFCPUOptions size exceeds maximum allowed size"); diff --git a/src/modules/cpucache/cpucache.c b/src/modules/cpucache/cpucache.c index b46b7de18..58a73f839 100644 --- a/src/modules/cpucache/cpucache.c +++ b/src/modules/cpucache/cpucache.c @@ -208,6 +208,18 @@ exit: ffListDestroy(&result.caches[3]); } +void ffInitCPUCacheOptions(FFCPUCacheOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); + + options->compact = false; +} + +void ffDestroyCPUCacheOptions(FFCPUCacheOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffCPUCacheModuleInfo = { .name = FF_CPUCACHE_MODULE_NAME, .description = "Print CPU cache sizes", @@ -222,16 +234,3 @@ FFModuleBaseInfo ffCPUCacheModuleInfo = { {"Sum result", "sum"}, })) }; - -void ffInitCPUCacheOptions(FFCPUCacheOptions* options) -{ - options->moduleInfo = ffCPUCacheModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); - - options->compact = false; -} - -void ffDestroyCPUCacheOptions(FFCPUCacheOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/cpucache/cpucache.h b/src/modules/cpucache/cpucache.h index 5a9fa164a..22987a857 100644 --- a/src/modules/cpucache/cpucache.h +++ b/src/modules/cpucache/cpucache.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_CPUCACHE_MODULE_NAME "CPUCache" diff --git a/src/modules/cpucache/option.h b/src/modules/cpucache/option.h index f3e65eef7..f53acf691 100644 --- a/src/modules/cpucache/option.h +++ b/src/modules/cpucache/option.h @@ -1,13 +1,12 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFCPUCacheOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; bool compact; } FFCPUCacheOptions; + +static_assert(sizeof(FFCPUCacheOptions) <= FF_OPTION_MAX_SIZE, "FFCPUCacheOptions size exceeds maximum allowed size"); diff --git a/src/modules/cpuusage/cpuusage.c b/src/modules/cpuusage/cpuusage.c index d50a5cac1..180260069 100644 --- a/src/modules/cpuusage/cpuusage.c +++ b/src/modules/cpuusage/cpuusage.c @@ -174,6 +174,19 @@ void ffGenerateCPUUsageJsonResult(FFCPUUsageOptions* options, yyjson_mut_doc* do } } +void ffInitCPUUsageOptions(FFCPUUsageOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰓅"); + options->separate = false; + options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; + options->waitTime = 200; +} + +void ffDestroyCPUUsageOptions(FFCPUUsageOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffCPUUsageModuleInfo = { .name = FF_CPUUSAGE_MODULE_NAME, .description = "Print CPU usage. Costs some time to collect data", @@ -194,17 +207,3 @@ FFModuleBaseInfo ffCPUUsageModuleInfo = { {"CPU usage (percentage bar, minimum)", "min-bar"}, })) }; - -void ffInitCPUUsageOptions(FFCPUUsageOptions* options) -{ - options->moduleInfo = ffCPUUsageModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰓅"); - options->separate = false; - options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; - options->waitTime = 200; -} - -void ffDestroyCPUUsageOptions(FFCPUUsageOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/cpuusage/cpuusage.h b/src/modules/cpuusage/cpuusage.h index 8e2b26091..221e74778 100644 --- a/src/modules/cpuusage/cpuusage.h +++ b/src/modules/cpuusage/cpuusage.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_CPUUSAGE_MODULE_NAME "CPUUsage" diff --git a/src/modules/cpuusage/option.h b/src/modules/cpuusage/option.h index 9f65f701d..dc19fbe76 100644 --- a/src/modules/cpuusage/option.h +++ b/src/modules/cpuusage/option.h @@ -1,16 +1,15 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" #include "common/percent.h" typedef struct FFCPUUsageOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; bool separate; FFPercentageModuleConfig percent; uint32_t waitTime; // in ms } FFCPUUsageOptions; + +static_assert(sizeof(FFCPUUsageOptions) <= FF_OPTION_MAX_SIZE, "FFCPUUsageOptions size exceeds maximum allowed size"); diff --git a/src/modules/cursor/cursor.c b/src/modules/cursor/cursor.c index 00b59003a..53406337f 100644 --- a/src/modules/cursor/cursor.c +++ b/src/modules/cursor/cursor.c @@ -94,6 +94,16 @@ void ffGenerateCursorJsonResult(FF_MAYBE_UNUSED FFCursorOptions* options, yyjson ffStrbufDestroy(&result.size); } +void ffInitCursorOptions(FFCursorOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰆿"); +} + +void ffDestroyCursorOptions(FFCursorOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffCursorModuleInfo = { .name = FF_CURSOR_MODULE_NAME, .description = "Print cursor style name", @@ -108,14 +118,3 @@ FFModuleBaseInfo ffCursorModuleInfo = { {"Cursor size", "size"}, })), }; - -void ffInitCursorOptions(FFCursorOptions* options) -{ - options->moduleInfo = ffCursorModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰆿"); -} - -void ffDestroyCursorOptions(FFCursorOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/cursor/cursor.h b/src/modules/cursor/cursor.h index b4fcc1e3b..c74031cfa 100644 --- a/src/modules/cursor/cursor.h +++ b/src/modules/cursor/cursor.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_CURSOR_MODULE_NAME "Cursor" diff --git a/src/modules/cursor/option.h b/src/modules/cursor/option.h index 26c2bb9f4..3f02c567c 100644 --- a/src/modules/cursor/option.h +++ b/src/modules/cursor/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFCursorOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFCursorOptions; + +static_assert(sizeof(FFCursorOptions) <= FF_OPTION_MAX_SIZE, "FFCursorOptions size exceeds maximum allowed size"); diff --git a/src/modules/custom/custom.c b/src/modules/custom/custom.c index 0f5182cd7..221fd05ae 100644 --- a/src/modules/custom/custom.c +++ b/src/modules/custom/custom.c @@ -30,6 +30,17 @@ void ffParseCustomJsonObject(FFCustomOptions* options, yyjson_val* module) } } +void ffInitCustomOptions(FFCustomOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); + ffStrbufSetStatic(&options->moduleArgs.key, " "); +} + +void ffDestroyCustomOptions(FFCustomOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffCustomModuleInfo = { .name = FF_CUSTOM_MODULE_NAME, .description = "Print a custom string, with or without key", @@ -39,15 +50,3 @@ FFModuleBaseInfo ffCustomModuleInfo = { .printModule = (void*) ffPrintCustom, .generateJsonConfig = (void*) ffGenerateCustomJsonConfig, }; - -void ffInitCustomOptions(FFCustomOptions* options) -{ - options->moduleInfo = ffCustomModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); - ffStrbufSetStatic(&options->moduleArgs.key, " "); -} - -void ffDestroyCustomOptions(FFCustomOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/custom/custom.h b/src/modules/custom/custom.h index 50611704c..f4dfefab0 100644 --- a/src/modules/custom/custom.h +++ b/src/modules/custom/custom.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_CUSTOM_MODULE_NAME "Custom" diff --git a/src/modules/custom/option.h b/src/modules/custom/option.h index b0776a833..c66ccee7d 100644 --- a/src/modules/custom/option.h +++ b/src/modules/custom/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFCustomOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFCustomOptions; + +static_assert(sizeof(FFCustomOptions) <= FF_OPTION_MAX_SIZE, "FFCustomOptions size exceeds maximum allowed size"); diff --git a/src/modules/datetime/datetime.c b/src/modules/datetime/datetime.c index 3bf57a7a9..041901088 100644 --- a/src/modules/datetime/datetime.c +++ b/src/modules/datetime/datetime.c @@ -143,6 +143,16 @@ void ffGenerateDateTimeJsonResult(FF_MAYBE_UNUSED FFDateTimeOptions* options, yy yyjson_mut_obj_add_strcpy(doc, module, "result", ffTimeToFullStr(ffTimeGetNow())); } +void ffInitDateTimeOptions(FFDateTimeOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyDateTimeOptions(FFDateTimeOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffDateTimeModuleInfo = { .name = FF_DATETIME_MODULE_NAME, .description = "Print current date and time", @@ -178,14 +188,3 @@ FFModuleBaseInfo ffDateTimeModuleInfo = { {"Day in month with leading zero", "day-pretty"}, })) }; - -void ffInitDateTimeOptions(FFDateTimeOptions* options) -{ - options->moduleInfo = ffDateTimeModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyDateTimeOptions(FFDateTimeOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/datetime/datetime.h b/src/modules/datetime/datetime.h index 2b5383b89..bdf8f732d 100644 --- a/src/modules/datetime/datetime.h +++ b/src/modules/datetime/datetime.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_DATETIME_MODULE_NAME "DateTime" diff --git a/src/modules/datetime/option.h b/src/modules/datetime/option.h index f9d25cfe3..fffd5dc51 100644 --- a/src/modules/datetime/option.h +++ b/src/modules/datetime/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFDateTimeOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFDateTimeOptions; + +static_assert(sizeof(FFDateTimeOptions) <= FF_OPTION_MAX_SIZE, "FFDateTimeOptions size exceeds maximum allowed size"); diff --git a/src/modules/de/de.c b/src/modules/de/de.c index 4390544a1..bb331daf2 100644 --- a/src/modules/de/de.c +++ b/src/modules/de/de.c @@ -91,6 +91,18 @@ void ffGenerateDEJsonResult(FF_MAYBE_UNUSED FFDEOptions* options, yyjson_mut_doc yyjson_mut_obj_add_strbuf(doc, obj, "version", &version); } +void ffInitDEOptions(FFDEOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); + + options->slowVersionDetection = false; +} + +void ffDestroyDEOptions(FFDEOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffDEModuleInfo = { .name = FF_DE_MODULE_NAME, .description = "Print desktop environment name", @@ -106,16 +118,3 @@ FFModuleBaseInfo ffDEModuleInfo = { {"DE version", "version"}, })) }; - -void ffInitDEOptions(FFDEOptions* options) -{ - options->moduleInfo = ffDEModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); - - options->slowVersionDetection = false; -} - -void ffDestroyDEOptions(FFDEOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/de/de.h b/src/modules/de/de.h index 90b5a9662..ca945380b 100644 --- a/src/modules/de/de.h +++ b/src/modules/de/de.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_DE_MODULE_NAME "DE" diff --git a/src/modules/de/option.h b/src/modules/de/option.h index f94797666..c587a0c96 100644 --- a/src/modules/de/option.h +++ b/src/modules/de/option.h @@ -1,13 +1,12 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFDEOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; bool slowVersionDetection; } FFDEOptions; + +static_assert(sizeof(FFDEOptions) <= FF_OPTION_MAX_SIZE, "FFDEOptions size exceeds maximum allowed size"); diff --git a/src/modules/disk/disk.c b/src/modules/disk/disk.c index 0f8259722..4f51c065c 100644 --- a/src/modules/disk/disk.c +++ b/src/modules/disk/disk.c @@ -412,6 +412,30 @@ void ffGenerateDiskJsonResult(FFDiskOptions* options, yyjson_mut_doc* doc, yyjso } } +void ffInitDiskOptions(FFDiskOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); + + ffStrbufInit(&options->folders); + #if _WIN32 || __APPLE__ || __ANDROID__ + ffStrbufInit(&options->hideFolders); + #else + ffStrbufInitStatic(&options->hideFolders, "/efi:/boot:/boot/efi:/boot/firmware"); + #endif + ffStrbufInit(&options->hideFS); + options->showTypes = FF_DISK_VOLUME_TYPE_REGULAR_BIT | FF_DISK_VOLUME_TYPE_EXTERNAL_BIT | FF_DISK_VOLUME_TYPE_READONLY_BIT; + options->calcType = FF_DISK_CALC_TYPE_FREE; + options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; +} + +void ffDestroyDiskOptions(FFDiskOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); + ffStrbufDestroy(&options->folders); + ffStrbufDestroy(&options->hideFolders); + ffStrbufDestroy(&options->hideFS); +} + FFModuleBaseInfo ffDiskModuleInfo = { .name = FF_DISK_MODULE_NAME, .description = "Print partitions, space usage, file system, etc", @@ -448,28 +472,3 @@ FFModuleBaseInfo ffDiskModuleInfo = { {"Years fraction after creation", "years-fraction"}, })) }; - -void ffInitDiskOptions(FFDiskOptions* options) -{ - options->moduleInfo = ffDiskModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); - - ffStrbufInit(&options->folders); - #if _WIN32 || __APPLE__ || __ANDROID__ - ffStrbufInit(&options->hideFolders); - #else - ffStrbufInitStatic(&options->hideFolders, "/efi:/boot:/boot/efi:/boot/firmware"); - #endif - ffStrbufInit(&options->hideFS); - options->showTypes = FF_DISK_VOLUME_TYPE_REGULAR_BIT | FF_DISK_VOLUME_TYPE_EXTERNAL_BIT | FF_DISK_VOLUME_TYPE_READONLY_BIT; - options->calcType = FF_DISK_CALC_TYPE_FREE; - options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; -} - -void ffDestroyDiskOptions(FFDiskOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); - ffStrbufDestroy(&options->folders); - ffStrbufDestroy(&options->hideFolders); - ffStrbufDestroy(&options->hideFS); -} diff --git a/src/modules/disk/disk.h b/src/modules/disk/disk.h index cf0ee3478..c96155fe1 100644 --- a/src/modules/disk/disk.h +++ b/src/modules/disk/disk.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_DISK_MODULE_NAME "Disk" diff --git a/src/modules/disk/option.h b/src/modules/disk/option.h index 427e159f9..f4ec16f93 100644 --- a/src/modules/disk/option.h +++ b/src/modules/disk/option.h @@ -1,7 +1,5 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" #include "common/percent.h" @@ -25,7 +23,6 @@ typedef enum __attribute__((__packed__)) FFDiskCalcType typedef struct FFDiskOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFstrbuf folders; @@ -35,3 +32,5 @@ typedef struct FFDiskOptions FFDiskCalcType calcType; FFPercentageModuleConfig percent; } FFDiskOptions; + +static_assert(sizeof(FFDiskOptions) <= FF_OPTION_MAX_SIZE, "FFDiskOptions size exceeds maximum allowed size"); diff --git a/src/modules/diskio/diskio.c b/src/modules/diskio/diskio.c index 5764aa1b8..8d6a59433 100644 --- a/src/modules/diskio/diskio.c +++ b/src/modules/diskio/diskio.c @@ -170,6 +170,21 @@ void ffGenerateDiskIOJsonResult(FFDiskIOOptions* options, yyjson_mut_doc* doc, y } } +void ffInitDiskIOOptions(FFDiskIOOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰓅"); + + ffStrbufInit(&options->namePrefix); + options->detectTotal = false; + options->waitTime = 1000; +} + +void ffDestroyDiskIOOptions(FFDiskIOOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); + ffStrbufDestroy(&options->namePrefix); +} + FFModuleBaseInfo ffDiskIOModuleInfo = { .name = FF_DISKIO_MODULE_NAME, .description = "Print physical disk I/O throughput", @@ -190,19 +205,3 @@ FFModuleBaseInfo ffDiskIOModuleInfo = { {"Number of writes", "write-count"}, })) }; - -void ffInitDiskIOOptions(FFDiskIOOptions* options) -{ - options->moduleInfo = ffDiskIOModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰓅"); - - ffStrbufInit(&options->namePrefix); - options->detectTotal = false; - options->waitTime = 1000; -} - -void ffDestroyDiskIOOptions(FFDiskIOOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); - ffStrbufDestroy(&options->namePrefix); -} diff --git a/src/modules/diskio/diskio.h b/src/modules/diskio/diskio.h index 3dca4949f..ba3977bae 100644 --- a/src/modules/diskio/diskio.h +++ b/src/modules/diskio/diskio.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_DISKIO_MODULE_NAME "DiskIO" diff --git a/src/modules/diskio/option.h b/src/modules/diskio/option.h index c41e0428b..5de458fa3 100644 --- a/src/modules/diskio/option.h +++ b/src/modules/diskio/option.h @@ -1,15 +1,14 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFDiskIOOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFstrbuf namePrefix; uint32_t waitTime; bool detectTotal; } FFDiskIOOptions; + +static_assert(sizeof(FFDiskIOOptions) <= FF_OPTION_MAX_SIZE, "FFDiskIOOptions size exceeds maximum allowed size"); diff --git a/src/modules/display/display.c b/src/modules/display/display.c index 40ebc3477..acfc4c0e4 100644 --- a/src/modules/display/display.c +++ b/src/modules/display/display.c @@ -402,6 +402,18 @@ void ffGenerateDisplayJsonResult(FF_MAYBE_UNUSED FFDisplayOptions* options, yyjs } } +void ffInitDisplayOptions(FFDisplayOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰍹"); + options->compactType = FF_DISPLAY_COMPACT_TYPE_NONE; + options->preciseRefreshRate = false; +} + +void ffDestroyDisplayOptions(FFDisplayOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffDisplayModuleInfo = { .name = FF_DISPLAY_MODULE_NAME, .description = "Print resolutions, refresh rates, etc", @@ -438,16 +450,3 @@ FFModuleBaseInfo ffDisplayModuleInfo = { {"Screen preferred refresh rate (in Hz)", "preferred-refresh-rate"}, })) }; - -void ffInitDisplayOptions(FFDisplayOptions* options) -{ - options->moduleInfo = ffDisplayModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰍹"); - options->compactType = FF_DISPLAY_COMPACT_TYPE_NONE; - options->preciseRefreshRate = false; -} - -void ffDestroyDisplayOptions(FFDisplayOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/display/display.h b/src/modules/display/display.h index 9c3950aea..8b9f41941 100644 --- a/src/modules/display/display.h +++ b/src/modules/display/display.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_DISPLAY_MODULE_NAME "Display" diff --git a/src/modules/display/option.h b/src/modules/display/option.h index 7233b2dd3..12ad3c5ec 100644 --- a/src/modules/display/option.h +++ b/src/modules/display/option.h @@ -1,7 +1,5 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef enum __attribute__((__packed__)) FFDisplayCompactType @@ -22,10 +20,11 @@ typedef enum __attribute__((__packed__)) FFDisplayOrder typedef struct FFDisplayOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFDisplayCompactType compactType; bool preciseRefreshRate; FFDisplayOrder order; } FFDisplayOptions; + +static_assert(sizeof(FFDisplayOptions) <= FF_OPTION_MAX_SIZE, "FFDisplayOptions size exceeds maximum allowed size"); diff --git a/src/modules/dns/dns.c b/src/modules/dns/dns.c index 4de82d78b..c9736ffc9 100644 --- a/src/modules/dns/dns.c +++ b/src/modules/dns/dns.c @@ -139,6 +139,18 @@ exit: } } +void ffInitDNSOptions(FFDNSOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰇖"); + + options->showType = FF_DNS_TYPE_BOTH; +} + +void ffDestroyDNSOptions(FFDNSOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffDNSModuleInfo = { .name = FF_DNS_MODULE_NAME, .description = "Print configured DNS servers", @@ -152,16 +164,3 @@ FFModuleBaseInfo ffDNSModuleInfo = { {"DNS result", "result"}, })) }; - -void ffInitDNSOptions(FFDNSOptions* options) -{ - options->moduleInfo = ffDNSModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰇖"); - - options->showType = FF_DNS_TYPE_BOTH; -} - -void ffDestroyDNSOptions(FFDNSOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/dns/dns.h b/src/modules/dns/dns.h index 46bff8c13..e33763775 100644 --- a/src/modules/dns/dns.h +++ b/src/modules/dns/dns.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_DNS_MODULE_NAME "DNS" diff --git a/src/modules/dns/option.h b/src/modules/dns/option.h index 18dbb147b..bc3bd5690 100644 --- a/src/modules/dns/option.h +++ b/src/modules/dns/option.h @@ -1,7 +1,5 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef enum __attribute__((__packed__)) FFDNSShowType { @@ -13,8 +11,9 @@ typedef enum __attribute__((__packed__)) FFDNSShowType { typedef struct FFDNSOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFDNSShowType showType; } FFDNSOptions; + +static_assert(sizeof(FFDNSOptions) <= FF_OPTION_MAX_SIZE, "FFDNSOptions size exceeds maximum allowed size"); diff --git a/src/modules/editor/editor.c b/src/modules/editor/editor.c index 256a434fe..06318f1f1 100644 --- a/src/modules/editor/editor.c +++ b/src/modules/editor/editor.c @@ -104,6 +104,16 @@ void ffGenerateEditorJsonResult(FF_MAYBE_UNUSED FFEditorOptions* options, yyjson ffStrbufDestroy(&result.version); } +void ffInitEditorOptions(FFEditorOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󱞎"); +} + +void ffDestroyEditorOptions(FFEditorOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffEditorModuleInfo = { .name = FF_EDITOR_MODULE_NAME, .description = "Print information of the default editor ($VISUAL or $EDITOR)", @@ -121,14 +131,3 @@ FFModuleBaseInfo ffEditorModuleInfo = { {"Version", "version"}, })) }; - -void ffInitEditorOptions(FFEditorOptions* options) -{ - options->moduleInfo = ffEditorModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󱞎"); -} - -void ffDestroyEditorOptions(FFEditorOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/editor/editor.h b/src/modules/editor/editor.h index 0f597fffc..0e5be29e1 100644 --- a/src/modules/editor/editor.h +++ b/src/modules/editor/editor.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_EDITOR_MODULE_NAME "Editor" diff --git a/src/modules/editor/option.h b/src/modules/editor/option.h index 92503d659..f7c545f84 100644 --- a/src/modules/editor/option.h +++ b/src/modules/editor/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFEditorOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFEditorOptions; + +static_assert(sizeof(FFEditorOptions) <= FF_OPTION_MAX_SIZE, "FFEditorOptions size exceeds maximum allowed size"); diff --git a/src/modules/font/font.c b/src/modules/font/font.c index 4ec299478..7e308407c 100644 --- a/src/modules/font/font.c +++ b/src/modules/font/font.c @@ -88,6 +88,16 @@ void ffGenerateFontJsonResult(FF_MAYBE_UNUSED FFFontOptions* options, yyjson_mut ffStrbufDestroy(&font.fonts[i]); } +void ffInitFontOptions(FFFontOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyFontOptions(FFFontOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffFontModuleInfo = { .name = FF_FONT_MODULE_NAME, .description = "Print system font names", @@ -105,14 +115,3 @@ FFModuleBaseInfo ffFontModuleInfo = { {"Combined fonts for display", "combined"}, })) }; - -void ffInitFontOptions(FFFontOptions* options) -{ - options->moduleInfo = ffFontModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyFontOptions(FFFontOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/font/font.h b/src/modules/font/font.h index 0872ce7b1..9d3630bd2 100644 --- a/src/modules/font/font.h +++ b/src/modules/font/font.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_FONT_MODULE_NAME "Font" diff --git a/src/modules/font/option.h b/src/modules/font/option.h index 12552bcce..6c942e7dd 100644 --- a/src/modules/font/option.h +++ b/src/modules/font/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFFontOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFFontOptions; + +static_assert(sizeof(FFFontOptions) <= FF_OPTION_MAX_SIZE, "FFFontOptions size exceeds maximum allowed size"); diff --git a/src/modules/gamepad/gamepad.c b/src/modules/gamepad/gamepad.c index 854098ea5..d6bf3ee55 100644 --- a/src/modules/gamepad/gamepad.c +++ b/src/modules/gamepad/gamepad.c @@ -130,6 +130,17 @@ void ffGenerateGamepadJsonResult(FF_MAYBE_UNUSED FFGamepadOptions* options, yyjs } } +void ffInitGamepadOptions(FFGamepadOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰺵"); + options->percent = (FFPercentageModuleConfig) { 50, 20, 0 }; +} + +void ffDestroyGamepadOptions(FFGamepadOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffGamepadModuleInfo = { .name = FF_GAMEPAD_MODULE_NAME, .description = "List (connected) gamepads", @@ -146,15 +157,3 @@ FFModuleBaseInfo ffGamepadModuleInfo = { {"Battery percentage bar", "battery-percentage-bar"}, })) }; - -void ffInitGamepadOptions(FFGamepadOptions* options) -{ - options->moduleInfo = ffGamepadModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰺵"); - options->percent = (FFPercentageModuleConfig) { 50, 20, 0 }; -} - -void ffDestroyGamepadOptions(FFGamepadOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/gamepad/gamepad.h b/src/modules/gamepad/gamepad.h index 7534fff68..7d252d8c0 100644 --- a/src/modules/gamepad/gamepad.h +++ b/src/modules/gamepad/gamepad.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_GAMEPAD_MODULE_NAME "Gamepad" diff --git a/src/modules/gamepad/option.h b/src/modules/gamepad/option.h index d1b570bf8..8640a0d7c 100644 --- a/src/modules/gamepad/option.h +++ b/src/modules/gamepad/option.h @@ -1,13 +1,12 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFGamepadOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFPercentageModuleConfig percent; } FFGamepadOptions; + +static_assert(sizeof(FFGamepadOptions) <= FF_OPTION_MAX_SIZE, "FFGamepadOptions size exceeds maximum allowed size"); diff --git a/src/modules/gpu/gpu.c b/src/modules/gpu/gpu.c index 3b4813f8b..f7a532961 100644 --- a/src/modules/gpu/gpu.c +++ b/src/modules/gpu/gpu.c @@ -414,6 +414,29 @@ void ffGenerateGPUJsonResult(FFGPUOptions* options, yyjson_mut_doc* doc, yyjson_ } } +void ffInitGPUOptions(FFGPUOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰾲"); + + options->driverSpecific = false; + options->detectionMethod = + #if defined(__x86_64__) || defined(__i386__) + FF_GPU_DETECTION_METHOD_PCI + #else + FF_GPU_DETECTION_METHOD_AUTO + #endif + ; + options->temp = false; + options->hideType = FF_GPU_TYPE_NONE; + options->tempConfig = (FFColorRangeConfig) { 60, 80 }; + options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; +} + +void ffDestroyGPUOptions(FFGPUOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffGPUModuleInfo = { .name = FF_GPU_MODULE_NAME, .description = "Print GPU names, graphic memory size, type, etc", @@ -446,27 +469,3 @@ FFModuleBaseInfo ffGPUModuleInfo = { {"Memory type (Windows only)", "memory-type"}, })), }; - -void ffInitGPUOptions(FFGPUOptions* options) -{ - options->moduleInfo = ffGPUModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰾲"); - - options->driverSpecific = false; - options->detectionMethod = - #if defined(__x86_64__) || defined(__i386__) - FF_GPU_DETECTION_METHOD_PCI - #else - FF_GPU_DETECTION_METHOD_AUTO - #endif - ; - options->temp = false; - options->hideType = FF_GPU_TYPE_NONE; - options->tempConfig = (FFColorRangeConfig) { 60, 80 }; - options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; -} - -void ffDestroyGPUOptions(FFGPUOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/gpu/gpu.h b/src/modules/gpu/gpu.h index e112f740f..afc952d6c 100644 --- a/src/modules/gpu/gpu.h +++ b/src/modules/gpu/gpu.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_GPU_MODULE_NAME "GPU" diff --git a/src/modules/gpu/option.h b/src/modules/gpu/option.h index f88343770..36d2f0af1 100644 --- a/src/modules/gpu/option.h +++ b/src/modules/gpu/option.h @@ -1,7 +1,5 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" #include "common/percent.h" @@ -24,7 +22,6 @@ typedef enum __attribute__((__packed__)) FFGPUDetectionMethod typedef struct FFGPUOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFGPUType hideType; @@ -35,3 +32,5 @@ typedef struct FFGPUOptions FFColorRangeConfig tempConfig; FFPercentageModuleConfig percent; } FFGPUOptions; + +static_assert(sizeof(FFGPUOptions) <= FF_OPTION_MAX_SIZE, "FFGPUOptions size exceeds maximum allowed size"); diff --git a/src/modules/host/host.c b/src/modules/host/host.c index 08c7c36d2..59692336b 100644 --- a/src/modules/host/host.c +++ b/src/modules/host/host.c @@ -131,6 +131,16 @@ exit: ffStrbufDestroy(&host.vendor); } +void ffInitHostOptions(FFHostOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰌢"); +} + +void ffDestroyHostOptions(FFHostOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffHostModuleInfo = { .name = FF_HOST_MODULE_NAME, .description = "Print product name of your computer", @@ -150,14 +160,3 @@ FFModuleBaseInfo ffHostModuleInfo = { {"Product uuid", "uuid"}, })) }; - -void ffInitHostOptions(FFHostOptions* options) -{ - options->moduleInfo = ffHostModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰌢"); -} - -void ffDestroyHostOptions(FFHostOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/host/host.h b/src/modules/host/host.h index d684b2043..79f22e527 100644 --- a/src/modules/host/host.h +++ b/src/modules/host/host.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_HOST_MODULE_NAME "Host" diff --git a/src/modules/host/option.h b/src/modules/host/option.h index 1c6bf26f3..2516f864c 100644 --- a/src/modules/host/option.h +++ b/src/modules/host/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFHostOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFHostOptions; + +static_assert(sizeof(FFHostOptions) <= FF_OPTION_MAX_SIZE, "FFHostOptions size exceeds maximum allowed size"); diff --git a/src/modules/icons/icons.c b/src/modules/icons/icons.c index 91225fdf1..210d8996c 100644 --- a/src/modules/icons/icons.c +++ b/src/modules/icons/icons.c @@ -86,6 +86,16 @@ void ffGenerateIconsJsonResult(FF_MAYBE_UNUSED FFIconsOptions* options, yyjson_m ffStrbufDestroy(&result.icons2); } +void ffInitIconsOptions(FFIconsOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyIconsOptions(FFIconsOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffIconsModuleInfo = { .name = FF_ICONS_MODULE_NAME, .description = "Print icon style name", @@ -100,14 +110,3 @@ FFModuleBaseInfo ffIconsModuleInfo = { {"Icons part 2", "icons2"}, })) }; - -void ffInitIconsOptions(FFIconsOptions* options) -{ - options->moduleInfo = ffIconsModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyIconsOptions(FFIconsOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/icons/icons.h b/src/modules/icons/icons.h index 6ec8b4ee8..6f2bb877c 100644 --- a/src/modules/icons/icons.h +++ b/src/modules/icons/icons.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_ICONS_MODULE_NAME "Icons" diff --git a/src/modules/icons/option.h b/src/modules/icons/option.h index 456668796..966bba5f5 100644 --- a/src/modules/icons/option.h +++ b/src/modules/icons/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFIconsOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFIconsOptions; + +static_assert(sizeof(FFIconsOptions) <= FF_OPTION_MAX_SIZE, "FFIconsOptions size exceeds maximum allowed size"); diff --git a/src/modules/initsystem/initsystem.c b/src/modules/initsystem/initsystem.c index 19625dc17..c549011ea 100644 --- a/src/modules/initsystem/initsystem.c +++ b/src/modules/initsystem/initsystem.c @@ -98,6 +98,16 @@ exit: ffStrbufDestroy(&result.version); } +void ffInitInitSystemOptions(FFInitSystemOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰿄"); +} + +void ffDestroyInitSystemOptions(FFInitSystemOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffInitSystemModuleInfo = { .name = FF_INITSYSTEM_MODULE_NAME, .description = "Print init system (pid 1) name and version", @@ -114,14 +124,3 @@ FFModuleBaseInfo ffInitSystemModuleInfo = { {"Init system pid", "pid"}, })) }; - -void ffInitInitSystemOptions(FFInitSystemOptions* options) -{ - options->moduleInfo = ffInitSystemModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰿄"); -} - -void ffDestroyInitSystemOptions(FFInitSystemOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/initsystem/initsystem.h b/src/modules/initsystem/initsystem.h index 0a021ff61..37b601481 100644 --- a/src/modules/initsystem/initsystem.h +++ b/src/modules/initsystem/initsystem.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_INITSYSTEM_MODULE_NAME "InitSystem" diff --git a/src/modules/initsystem/option.h b/src/modules/initsystem/option.h index aa4620670..54c10158e 100644 --- a/src/modules/initsystem/option.h +++ b/src/modules/initsystem/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFInitSystemOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFInitSystemOptions; + +static_assert(sizeof(FFInitSystemOptions) <= FF_OPTION_MAX_SIZE, "FFInitSystemOptions size exceeds maximum allowed size"); diff --git a/src/modules/kernel/kernel.c b/src/modules/kernel/kernel.c index 21d1e0ad9..0d707129f 100644 --- a/src/modules/kernel/kernel.c +++ b/src/modules/kernel/kernel.c @@ -66,6 +66,16 @@ void ffGenerateKernelJsonResult(FF_MAYBE_UNUSED FFKernelOptions* options, yyjson yyjson_mut_obj_add_uint(doc, obj, "pageSize", info->pageSize); } +void ffInitKernelOptions(FFKernelOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyKernelOptions(FFKernelOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffKernelModuleInfo = { .name = FF_KERNEL_MODULE_NAME, .description = "Print system kernel version", @@ -84,14 +94,3 @@ FFModuleBaseInfo ffKernelModuleInfo = { {"Page size", "page-size"}, })) }; - -void ffInitKernelOptions(FFKernelOptions* options) -{ - options->moduleInfo = ffKernelModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyKernelOptions(FFKernelOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/kernel/kernel.h b/src/modules/kernel/kernel.h index 7e2c0c68d..743ac2148 100644 --- a/src/modules/kernel/kernel.h +++ b/src/modules/kernel/kernel.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_KERNEL_MODULE_NAME "Kernel" diff --git a/src/modules/kernel/option.h b/src/modules/kernel/option.h index fd3cb17a3..2b2b27d7e 100644 --- a/src/modules/kernel/option.h +++ b/src/modules/kernel/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFKernelOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFKernelOptions; + +static_assert(sizeof(FFKernelOptions) <= FF_OPTION_MAX_SIZE, "FFKernelOptions size exceeds maximum allowed size"); diff --git a/src/modules/keyboard/keyboard.c b/src/modules/keyboard/keyboard.c index d60d6543b..5c582b122 100644 --- a/src/modules/keyboard/keyboard.c +++ b/src/modules/keyboard/keyboard.c @@ -96,6 +96,16 @@ void ffGenerateKeyboardJsonResult(FF_MAYBE_UNUSED FFKeyboardOptions* options, yy } } +void ffInitKeyboardOptions(FFKeyboardOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyKeyboardOptions(FFKeyboardOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffKeyboardModuleInfo = { .name = FF_KEYBOARD_MODULE_NAME, .description = "List (connected) keyboards", @@ -110,14 +120,3 @@ FFModuleBaseInfo ffKeyboardModuleInfo = { {"Serial number", "serial"}, })) }; - -void ffInitKeyboardOptions(FFKeyboardOptions* options) -{ - options->moduleInfo = ffKeyboardModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyKeyboardOptions(FFKeyboardOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/keyboard/keyboard.h b/src/modules/keyboard/keyboard.h index 140faf3ad..fee46ccb1 100644 --- a/src/modules/keyboard/keyboard.h +++ b/src/modules/keyboard/keyboard.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_KEYBOARD_MODULE_NAME "Keyboard" diff --git a/src/modules/keyboard/option.h b/src/modules/keyboard/option.h index 4f39eee19..b65de5ceb 100644 --- a/src/modules/keyboard/option.h +++ b/src/modules/keyboard/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFKeyboardOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFKeyboardOptions; + +static_assert(sizeof(FFKeyboardOptions) <= FF_OPTION_MAX_SIZE, "FFKeyboardOptions size exceeds maximum allowed size"); diff --git a/src/modules/lm/lm.c b/src/modules/lm/lm.c index 34bd9a40b..09d56ea57 100644 --- a/src/modules/lm/lm.c +++ b/src/modules/lm/lm.c @@ -99,6 +99,16 @@ exit: ffStrbufDestroy(&result.version); } +void ffInitLMOptions(FFLMOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰧨"); +} + +void ffDestroyLMOptions(FFLMOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffLMModuleInfo = { .name = FF_LM_MODULE_NAME, .description = "Print login manager (desktop manager) name and version", @@ -114,14 +124,3 @@ FFModuleBaseInfo ffLMModuleInfo = { {"LM version", "version"}, })) }; - -void ffInitLMOptions(FFLMOptions* options) -{ - options->moduleInfo = ffLMModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰧨"); -} - -void ffDestroyLMOptions(FFLMOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/lm/lm.h b/src/modules/lm/lm.h index 1dbf6d355..950ca6ad1 100644 --- a/src/modules/lm/lm.h +++ b/src/modules/lm/lm.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_LM_MODULE_NAME "LM" diff --git a/src/modules/lm/option.h b/src/modules/lm/option.h index 4255382ff..21a4ad8b7 100644 --- a/src/modules/lm/option.h +++ b/src/modules/lm/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFLMOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFLMOptions; + +static_assert(sizeof(FFLMOptions) <= FF_OPTION_MAX_SIZE, "FFLMOptions size exceeds maximum allowed size"); diff --git a/src/modules/loadavg/loadavg.c b/src/modules/loadavg/loadavg.c index 1b7cd4e44..a6fc70eb5 100644 --- a/src/modules/loadavg/loadavg.c +++ b/src/modules/loadavg/loadavg.c @@ -150,6 +150,20 @@ void ffGenerateLoadavgJsonResult(FF_MAYBE_UNUSED FFLoadavgOptions* options, yyjs yyjson_mut_arr_add_real(doc, arr, result[i]); } +void ffInitLoadavgOptions(FFLoadavgOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); + + options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; + options->ndigits = 2; + options->compact = true; +} + +void ffDestroyLoadavgOptions(FFLoadavgOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffLoadavgModuleInfo = { .name = FF_LOADAVG_MODULE_NAME, .description = "Print system load averages", @@ -165,18 +179,3 @@ FFModuleBaseInfo ffLoadavgModuleInfo = { {"Load average over 15min", "loadavg3"}, })) }; - -void ffInitLoadavgOptions(FFLoadavgOptions* options) -{ - options->moduleInfo = ffLoadavgModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); - - options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; - options->ndigits = 2; - options->compact = true; -} - -void ffDestroyLoadavgOptions(FFLoadavgOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/loadavg/loadavg.h b/src/modules/loadavg/loadavg.h index b1cecb6f0..8ee495bf8 100644 --- a/src/modules/loadavg/loadavg.h +++ b/src/modules/loadavg/loadavg.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_LOADAVG_MODULE_NAME "Loadavg" diff --git a/src/modules/loadavg/option.h b/src/modules/loadavg/option.h index aee5f435c..947b310db 100644 --- a/src/modules/loadavg/option.h +++ b/src/modules/loadavg/option.h @@ -1,15 +1,14 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFLoadavgOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFPercentageModuleConfig percent; uint8_t ndigits; bool compact; } FFLoadavgOptions; + +static_assert(sizeof(FFLoadavgOptions) <= FF_OPTION_MAX_SIZE, "FFLoadavgOptions size exceeds maximum allowed size"); diff --git a/src/modules/locale/locale.c b/src/modules/locale/locale.c index cb8a4496d..40b1dcfba 100644 --- a/src/modules/locale/locale.c +++ b/src/modules/locale/locale.c @@ -63,6 +63,16 @@ void ffGenerateLocaleJsonResult(FF_MAYBE_UNUSED FFLocaleOptions* options, yyjson yyjson_mut_obj_add_strbuf(doc, module, "result", &locale); } +void ffInitLocaleOptions(FFLocaleOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyLocaleOptions(FFLocaleOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffLocaleModuleInfo = { .name = FF_LOCALE_MODULE_NAME, .description = "Print system locale name", @@ -76,14 +86,3 @@ FFModuleBaseInfo ffLocaleModuleInfo = { {"Locale code", "result"}, })) }; - -void ffInitLocaleOptions(FFLocaleOptions* options) -{ - options->moduleInfo = ffLocaleModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyLocaleOptions(FFLocaleOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/locale/locale.h b/src/modules/locale/locale.h index 3420a954c..a56a612ae 100644 --- a/src/modules/locale/locale.h +++ b/src/modules/locale/locale.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_LOCALE_MODULE_NAME "Locale" diff --git a/src/modules/locale/option.h b/src/modules/locale/option.h index c6ba96720..236d61ee3 100644 --- a/src/modules/locale/option.h +++ b/src/modules/locale/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFLocaleOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFLocaleOptions; + +static_assert(sizeof(FFLocaleOptions) <= FF_OPTION_MAX_SIZE, "FFLocaleOptions size exceeds maximum allowed size"); diff --git a/src/modules/localip/localip.c b/src/modules/localip/localip.c index 1feb6b6bc..d2e754e68 100644 --- a/src/modules/localip/localip.c +++ b/src/modules/localip/localip.c @@ -385,6 +385,24 @@ void ffGenerateLocalIpJsonResult(FF_MAYBE_UNUSED FFLocalIpOptions* options, yyjs } } +void ffInitLocalIpOptions(FFLocalIpOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰩟"); + + options->showType = FF_LOCALIP_TYPE_IPV4_BIT | FF_LOCALIP_TYPE_PREFIX_LEN_BIT + #if !__ANDROID__ /*Permission denied*/ + | FF_LOCALIP_TYPE_DEFAULT_ROUTE_ONLY_BIT + #endif + ; + ffStrbufInit(&options->namePrefix); +} + +void ffDestroyLocalIpOptions(FFLocalIpOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); + ffStrbufDestroy(&options->namePrefix); +} + FFModuleBaseInfo ffLocalIPModuleInfo = { .name = FF_LOCALIP_MODULE_NAME, .description = "List local IP addresses (v4 or v6), MAC addresses, etc", @@ -405,22 +423,3 @@ FFModuleBaseInfo ffLocalIPModuleInfo = { {"Interface flags", "flags"}, })) }; - -void ffInitLocalIpOptions(FFLocalIpOptions* options) -{ - options->moduleInfo = ffLocalIPModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰩟"); - - options->showType = FF_LOCALIP_TYPE_IPV4_BIT | FF_LOCALIP_TYPE_PREFIX_LEN_BIT - #if !__ANDROID__ /*Permission denied*/ - | FF_LOCALIP_TYPE_DEFAULT_ROUTE_ONLY_BIT - #endif - ; - ffStrbufInit(&options->namePrefix); -} - -void ffDestroyLocalIpOptions(FFLocalIpOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); - ffStrbufDestroy(&options->namePrefix); -} diff --git a/src/modules/localip/localip.h b/src/modules/localip/localip.h index 9a2e3876e..616469975 100644 --- a/src/modules/localip/localip.h +++ b/src/modules/localip/localip.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_LOCALIP_MODULE_NAME "LocalIp" diff --git a/src/modules/localip/option.h b/src/modules/localip/option.h index c95b77d8b..b809fe2fa 100644 --- a/src/modules/localip/option.h +++ b/src/modules/localip/option.h @@ -1,7 +1,5 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef enum __attribute__((__packed__)) FFLocalIpType @@ -25,9 +23,10 @@ static_assert(sizeof(FFLocalIpType) == sizeof(uint16_t), ""); typedef struct FFLocalIpOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFLocalIpType showType; FFstrbuf namePrefix; } FFLocalIpOptions; + +static_assert(sizeof(FFLocalIpOptions) <= FF_OPTION_MAX_SIZE, "FFLocalIpOptions size exceeds maximum allowed size"); diff --git a/src/modules/media/media.c b/src/modules/media/media.c index 290f6ec38..b14289cce 100644 --- a/src/modules/media/media.c +++ b/src/modules/media/media.c @@ -151,6 +151,16 @@ void ffGenerateMediaJsonResult(FF_MAYBE_UNUSED FFMediaOptions* options, yyjson_m yyjson_mut_obj_add_strbuf(doc, player, "url", &media->url); } +void ffInitMediaOptions(FFMediaOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyMediaOptions(FFMediaOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffMediaModuleInfo = { .name = FF_MEDIA_MODULE_NAME, .description = "Print playing song name", @@ -168,14 +178,3 @@ FFModuleBaseInfo ffMediaModuleInfo = { {"Status", "status"}, })) }; - -void ffInitMediaOptions(FFMediaOptions* options) -{ - options->moduleInfo = ffMediaModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyMediaOptions(FFMediaOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/media/media.h b/src/modules/media/media.h index 3ddbbfdf7..af18735b9 100644 --- a/src/modules/media/media.h +++ b/src/modules/media/media.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_MEDIA_MODULE_NAME "Media" diff --git a/src/modules/media/option.h b/src/modules/media/option.h index cb57b8b6e..e90ee854f 100644 --- a/src/modules/media/option.h +++ b/src/modules/media/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFMediaOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFMediaOptions; + +static_assert(sizeof(FFMediaOptions) <= FF_OPTION_MAX_SIZE, "FFMediaOptions size exceeds maximum allowed size"); diff --git a/src/modules/memory/memory.c b/src/modules/memory/memory.c index fa1fbbc9f..6b7b09e96 100644 --- a/src/modules/memory/memory.c +++ b/src/modules/memory/memory.c @@ -113,6 +113,17 @@ void ffGenerateMemoryJsonResult(FF_MAYBE_UNUSED FFMemoryOptions* options, yyjson yyjson_mut_obj_add_uint(doc, obj, "used", storage.bytesUsed); } +void ffInitMemoryOptions(FFMemoryOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); + options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; +} + +void ffDestroyMemoryOptions(FFMemoryOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffMemoryModuleInfo = { .name = FF_MEMORY_MODULE_NAME, .description = "Print system memory usage info", @@ -129,15 +140,3 @@ FFModuleBaseInfo ffMemoryModuleInfo = { {"Percentage used (bar)", "percentage-bar"}, })) }; - -void ffInitMemoryOptions(FFMemoryOptions* options) -{ - options->moduleInfo = ffMemoryModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); - options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; -} - -void ffDestroyMemoryOptions(FFMemoryOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/memory/memory.h b/src/modules/memory/memory.h index 69dc76402..5c43b4f75 100644 --- a/src/modules/memory/memory.h +++ b/src/modules/memory/memory.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_MEMORY_MODULE_NAME "Memory" diff --git a/src/modules/memory/option.h b/src/modules/memory/option.h index 76fc9fd06..243847f5f 100644 --- a/src/modules/memory/option.h +++ b/src/modules/memory/option.h @@ -1,14 +1,13 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" #include "common/percent.h" typedef struct FFMemoryOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFPercentageModuleConfig percent; } FFMemoryOptions; + +static_assert(sizeof(FFMemoryOptions) <= FF_OPTION_MAX_SIZE, "FFMemoryOptions size exceeds maximum allowed size"); diff --git a/src/modules/modules.h b/src/modules/modules.h index e6594f030..adc128f94 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -1,7 +1,5 @@ #pragma once -// For "fastfetch.c" and "flashfetch.c" - #include "modules/battery/battery.h" #include "modules/bios/bios.h" #include "modules/bluetooth/bluetooth.h" diff --git a/src/modules/monitor/monitor.c b/src/modules/monitor/monitor.c index 36ddf337a..dfc6de0e9 100644 --- a/src/modules/monitor/monitor.c +++ b/src/modules/monitor/monitor.c @@ -112,6 +112,16 @@ void ffGenerateMonitorJsonResult(FF_MAYBE_UNUSED FFMonitorOptions* options, yyjs yyjson_mut_obj_add_str(doc, module, "error", "Monitor module is an alias of Display module"); } +void ffInitMonitorOptions(FFMonitorOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰹑"); +} + +void ffDestroyMonitorOptions(FFMonitorOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffMonitorModuleInfo = { .name = FF_MONITOR_MODULE_NAME, .description = "Alias of Display module", @@ -136,14 +146,3 @@ FFModuleBaseInfo ffMonitorModuleInfo = { {"True if the display is HDR compatible", "hdr-compatible"}, })) }; - -void ffInitMonitorOptions(FFMonitorOptions* options) -{ - options->moduleInfo = ffMonitorModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰹑"); -} - -void ffDestroyMonitorOptions(FFMonitorOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/monitor/monitor.h b/src/modules/monitor/monitor.h index fc0f45c8d..17320b22e 100644 --- a/src/modules/monitor/monitor.h +++ b/src/modules/monitor/monitor.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_MONITOR_MODULE_NAME "Monitor" diff --git a/src/modules/monitor/option.h b/src/modules/monitor/option.h index b474ae7b2..07905ecba 100644 --- a/src/modules/monitor/option.h +++ b/src/modules/monitor/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFMonitorOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFMonitorOptions; + +static_assert(sizeof(FFMonitorOptions) <= FF_OPTION_MAX_SIZE, "FFMonitorOptions size exceeds maximum allowed size"); diff --git a/src/modules/mouse/mouse.c b/src/modules/mouse/mouse.c index e84db7ff1..d1d83fe11 100644 --- a/src/modules/mouse/mouse.c +++ b/src/modules/mouse/mouse.c @@ -96,6 +96,16 @@ void ffGenerateMouseJsonResult(FF_MAYBE_UNUSED FFMouseOptions* options, yyjson_m } } +void ffInitMouseOptions(FFMouseOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰍽"); +} + +void ffDestroyMouseOptions(FFMouseOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffMouseModuleInfo = { .name = FF_MOUSE_MODULE_NAME, .description = "List connected mouses", @@ -110,14 +120,3 @@ FFModuleBaseInfo ffMouseModuleInfo = { {"Mouse serial number", "serial"}, })) }; - -void ffInitMouseOptions(FFMouseOptions* options) -{ - options->moduleInfo = ffMouseModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰍽"); -} - -void ffDestroyMouseOptions(FFMouseOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/mouse/mouse.h b/src/modules/mouse/mouse.h index fbcef98e6..796c998e9 100644 --- a/src/modules/mouse/mouse.h +++ b/src/modules/mouse/mouse.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_MOUSE_MODULE_NAME "Mouse" diff --git a/src/modules/mouse/option.h b/src/modules/mouse/option.h index db9ea1866..470104d3f 100644 --- a/src/modules/mouse/option.h +++ b/src/modules/mouse/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFMouseOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFMouseOptions; + +static_assert(sizeof(FFMouseOptions) <= FF_OPTION_MAX_SIZE, "FFMouseOptions size exceeds maximum allowed size"); diff --git a/src/modules/netio/netio.c b/src/modules/netio/netio.c index 7e648853b..2595fa013 100644 --- a/src/modules/netio/netio.c +++ b/src/modules/netio/netio.c @@ -190,6 +190,28 @@ void ffGenerateNetIOJsonResult(FFNetIOOptions* options, yyjson_mut_doc* doc, yyj } } +void ffInitNetIOOptions(FFNetIOOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰾆"); + + ffStrbufInit(&options->namePrefix); + options->defaultRouteOnly = + #if __ANDROID__ + false + #else + true + #endif + ; + options->detectTotal = false; + options->waitTime = 1000; +} + +void ffDestroyNetIOOptions(FFNetIOOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); + ffStrbufDestroy(&options->namePrefix); +} + FFModuleBaseInfo ffNetIOModuleInfo = { .name = FF_NETIO_MODULE_NAME, .description = "Print network I/O throughput", @@ -214,26 +236,3 @@ FFModuleBaseInfo ffNetIOModuleInfo = { {"Number of packets dropped when sending [per second]", "tx-drops"}, })) }; - -void ffInitNetIOOptions(FFNetIOOptions* options) -{ - options->moduleInfo = ffNetIOModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰾆"); - - ffStrbufInit(&options->namePrefix); - options->defaultRouteOnly = - #if __ANDROID__ - false - #else - true - #endif - ; - options->detectTotal = false; - options->waitTime = 1000; -} - -void ffDestroyNetIOOptions(FFNetIOOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); - ffStrbufDestroy(&options->namePrefix); -} diff --git a/src/modules/netio/netio.h b/src/modules/netio/netio.h index 8b119cf63..b5468347e 100644 --- a/src/modules/netio/netio.h +++ b/src/modules/netio/netio.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_NETIO_MODULE_NAME "NetIO" diff --git a/src/modules/netio/option.h b/src/modules/netio/option.h index 7709b21e1..61ffa37d5 100644 --- a/src/modules/netio/option.h +++ b/src/modules/netio/option.h @@ -1,12 +1,9 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFNetIOOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFstrbuf namePrefix; @@ -14,3 +11,5 @@ typedef struct FFNetIOOptions bool defaultRouteOnly; bool detectTotal; } FFNetIOOptions; + +static_assert(sizeof(FFNetIOOptions) <= FF_OPTION_MAX_SIZE, "FFNetIOOptions size exceeds maximum allowed size"); diff --git a/src/modules/opencl/opencl.c b/src/modules/opencl/opencl.c index 341f04e5c..9bfb23976 100644 --- a/src/modules/opencl/opencl.c +++ b/src/modules/opencl/opencl.c @@ -114,6 +114,16 @@ void ffGenerateOpenCLJsonResult(FF_MAYBE_UNUSED FFOpenCLOptions* options, yyjson } } +void ffInitOpenCLOptions(FFOpenCLOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyOpenCLOptions(FFOpenCLOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffOpenCLModuleInfo = { .name = FF_OPENCL_MODULE_NAME, .description = "Print highest OpenCL version supported by the GPU", @@ -129,14 +139,3 @@ FFModuleBaseInfo ffOpenCLModuleInfo = { {"Platform vendor", "vendor"}, })) }; - -void ffInitOpenCLOptions(FFOpenCLOptions* options) -{ - options->moduleInfo = ffOpenCLModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyOpenCLOptions(FFOpenCLOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/opencl/opencl.h b/src/modules/opencl/opencl.h index a089821d7..bf47c6fbe 100644 --- a/src/modules/opencl/opencl.h +++ b/src/modules/opencl/opencl.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_OPENCL_MODULE_NAME "OpenCL" diff --git a/src/modules/opencl/option.h b/src/modules/opencl/option.h index 048c9b266..2fd7dff26 100644 --- a/src/modules/opencl/option.h +++ b/src/modules/opencl/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFOpenCLOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFOpenCLOptions; + +static_assert(sizeof(FFOpenCLOptions) <= FF_OPTION_MAX_SIZE, "FFOpenCLOptions size exceeds maximum allowed size"); diff --git a/src/modules/opengl/opengl.c b/src/modules/opengl/opengl.c index d8ee5e5b6..241da9902 100644 --- a/src/modules/opengl/opengl.c +++ b/src/modules/opengl/opengl.c @@ -127,6 +127,18 @@ void ffGenerateOpenGLJsonResult(FF_MAYBE_UNUSED FFOpenGLOptions* options, yyjson ffStrbufDestroy(&result.library); } +void ffInitOpenGLOptions(FFOpenGLOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); + + options->library = FF_OPENGL_LIBRARY_AUTO; +} + +void ffDestroyOpenGLOptions(FFOpenGLOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffOpenGLModuleInfo = { .name = FF_OPENGL_MODULE_NAME, .description = "Print highest OpenGL version supported by the GPU", @@ -144,16 +156,3 @@ FFModuleBaseInfo ffOpenGLModuleInfo = { {"OpenGL library used", "library"}, })) }; - -void ffInitOpenGLOptions(FFOpenGLOptions* options) -{ - options->moduleInfo = ffOpenGLModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); - - options->library = FF_OPENGL_LIBRARY_AUTO; -} - -void ffDestroyOpenGLOptions(FFOpenGLOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/opengl/opengl.h b/src/modules/opengl/opengl.h index 2a8e19e52..f60938d1e 100644 --- a/src/modules/opengl/opengl.h +++ b/src/modules/opengl/opengl.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_OPENGL_MODULE_NAME "OpenGL" diff --git a/src/modules/opengl/option.h b/src/modules/opengl/option.h index bdd4e446a..cc4b6ef46 100644 --- a/src/modules/opengl/option.h +++ b/src/modules/opengl/option.h @@ -1,7 +1,5 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef enum __attribute__((__packed__)) FFOpenGLLibrary @@ -13,8 +11,9 @@ typedef enum __attribute__((__packed__)) FFOpenGLLibrary typedef struct FFOpenGLOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFOpenGLLibrary library; } FFOpenGLOptions; + +static_assert(sizeof(FFOpenGLOptions) <= FF_OPTION_MAX_SIZE, "FFOpenGLOptions size exceeds maximum allowed size"); diff --git a/src/modules/os/option.h b/src/modules/os/option.h index ae098a53a..c7142b237 100644 --- a/src/modules/os/option.h +++ b/src/modules/os/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFOSOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFOSOptions; + +static_assert(sizeof(FFOSOptions) <= FF_OPTION_MAX_SIZE, "FFOSOptions size exceeds maximum allowed size"); diff --git a/src/modules/os/os.c b/src/modules/os/os.c index 969fddd26..2a363f399 100644 --- a/src/modules/os/os.c +++ b/src/modules/os/os.c @@ -159,34 +159,8 @@ void ffGenerateOSJsonResult(FF_MAYBE_UNUSED FFOSOptions* options, yyjson_mut_doc yyjson_mut_obj_add_strbuf(doc, obj, "versionID", &os->versionID); } -FFModuleBaseInfo ffOSModuleInfo = { - .name = FF_OS_MODULE_NAME, - .description = "Print operating system name and version", - .initOptions = (void*) ffInitOSOptions, - .destroyOptions = (void*) ffDestroyOSOptions, - .parseJsonObject = (void*) ffParseOSJsonObject, - .printModule = (void*) ffPrintOS, - .generateJsonResult = (void*) ffGenerateOSJsonResult, - .generateJsonConfig = (void*) ffGenerateOSJsonConfig, - .formatArgs = FF_FORMAT_ARG_LIST(((FFModuleFormatArg[]) { - {"Name of the kernel", "sysname"}, - {"Name of the OS", "name"}, - {"Pretty name of the OS, if available", "pretty-name"}, - {"ID of the OS", "id"}, - {"ID like of the OS", "id-like"}, - {"Variant of the OS", "variant"}, - {"Variant ID of the OS", "variant-id"}, - {"Version of the OS", "version"}, - {"Version ID of the OS", "version-id"}, - {"Version codename of the OS", "codename"}, - {"Build ID of the OS", "build-id"}, - {"Architecture of the OS", "arch"}, - })) -}; - void ffInitOSOptions(FFOSOptions* options) { - options->moduleInfo = ffOSModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, #ifdef _WIN32 "" @@ -214,3 +188,28 @@ void ffDestroyOSOptions(FFOSOptions* options) { ffOptionDestroyModuleArg(&options->moduleArgs); } + +FFModuleBaseInfo ffOSModuleInfo = { + .name = FF_OS_MODULE_NAME, + .description = "Print operating system name and version", + .initOptions = (void*) ffInitOSOptions, + .destroyOptions = (void*) ffDestroyOSOptions, + .parseJsonObject = (void*) ffParseOSJsonObject, + .printModule = (void*) ffPrintOS, + .generateJsonResult = (void*) ffGenerateOSJsonResult, + .generateJsonConfig = (void*) ffGenerateOSJsonConfig, + .formatArgs = FF_FORMAT_ARG_LIST(((FFModuleFormatArg[]) { + {"Name of the kernel", "sysname"}, + {"Name of the OS", "name"}, + {"Pretty name of the OS, if available", "pretty-name"}, + {"ID of the OS", "id"}, + {"ID like of the OS", "id-like"}, + {"Variant of the OS", "variant"}, + {"Variant ID of the OS", "variant-id"}, + {"Version of the OS", "version"}, + {"Version ID of the OS", "version-id"}, + {"Version codename of the OS", "codename"}, + {"Build ID of the OS", "build-id"}, + {"Architecture of the OS", "arch"}, + })) +}; diff --git a/src/modules/os/os.h b/src/modules/os/os.h index 35deb41af..bf6ebf9d6 100644 --- a/src/modules/os/os.h +++ b/src/modules/os/os.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_OS_MODULE_NAME "OS" diff --git a/src/modules/packages/option.h b/src/modules/packages/option.h index 5709578d4..240ca6666 100644 --- a/src/modules/packages/option.h +++ b/src/modules/packages/option.h @@ -1,7 +1,5 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef enum __attribute__((__packed__)) FFPackagesFlags @@ -44,9 +42,10 @@ static_assert(sizeof(FFPackagesFlags) == sizeof(uint64_t), ""); typedef struct FFPackagesOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFPackagesFlags disabled; bool combined; } FFPackagesOptions; + +static_assert(sizeof(FFPackagesOptions) <= FF_OPTION_MAX_SIZE, "FFPackagesOptions size exceeds maximum allowed size"); diff --git a/src/modules/packages/packages.c b/src/modules/packages/packages.c index a3bb951d0..0ca1f2cea 100644 --- a/src/modules/packages/packages.c +++ b/src/modules/packages/packages.c @@ -431,6 +431,19 @@ void ffGeneratePackagesJsonResult(FF_MAYBE_UNUSED FFPackagesOptions* options, yy yyjson_mut_obj_add_strbuf(doc, obj, "pacmanBranch", &counts.pacmanBranch); } +void ffInitPackagesOptions(FFPackagesOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰏖"); + + options->disabled = FF_PACKAGES_DISABLE_LIST; + options->combined = false; +} + +void ffDestroyPackagesOptions(FFPackagesOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffPackagesModuleInfo = { .name = FF_PACKAGES_MODULE_NAME, .description = "List installed package managers and count of installed packages", @@ -490,17 +503,3 @@ FFModuleBaseInfo ffPackagesModuleInfo = { {"Total number of all hpkg packages", "hpkg-all"}, })) }; - -void ffInitPackagesOptions(FFPackagesOptions* options) -{ - options->moduleInfo = ffPackagesModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰏖"); - - options->disabled = FF_PACKAGES_DISABLE_LIST; - options->combined = false; -} - -void ffDestroyPackagesOptions(FFPackagesOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/packages/packages.h b/src/modules/packages/packages.h index 7d2b7dd40..8b904d48d 100644 --- a/src/modules/packages/packages.h +++ b/src/modules/packages/packages.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_PACKAGES_MODULE_NAME "Packages" diff --git a/src/modules/physicaldisk/option.h b/src/modules/physicaldisk/option.h index fbd2dc685..3951f0610 100644 --- a/src/modules/physicaldisk/option.h +++ b/src/modules/physicaldisk/option.h @@ -1,15 +1,14 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFPhysicalDiskOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFstrbuf namePrefix; bool temp; FFColorRangeConfig tempConfig; } FFPhysicalDiskOptions; + +static_assert(sizeof(FFPhysicalDiskOptions) <= FF_OPTION_MAX_SIZE, "FFPhysicalDiskOptions size exceeds maximum allowed size"); diff --git a/src/modules/physicaldisk/physicaldisk.c b/src/modules/physicaldisk/physicaldisk.c index 4c971ac0c..917816c61 100644 --- a/src/modules/physicaldisk/physicaldisk.c +++ b/src/modules/physicaldisk/physicaldisk.c @@ -226,6 +226,21 @@ void ffGeneratePhysicalDiskJsonResult(FFPhysicalDiskOptions* options, yyjson_mut } } +void ffInitPhysicalDiskOptions(FFPhysicalDiskOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰋊"); + + ffStrbufInit(&options->namePrefix); + options->temp = false; + options->tempConfig = (FFColorRangeConfig) { 50, 70 }; +} + +void ffDestroyPhysicalDiskOptions(FFPhysicalDiskOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); + ffStrbufDestroy(&options->namePrefix); +} + FFModuleBaseInfo ffPhysicalDiskModuleInfo = { .name = FF_PHYSICALDISK_MODULE_NAME, .description = "Print physical disk information", @@ -248,19 +263,3 @@ FFModuleBaseInfo ffPhysicalDiskModuleInfo = { {"Device temperature (formatted)", "temperature"}, })) }; - -void ffInitPhysicalDiskOptions(FFPhysicalDiskOptions* options) -{ - options->moduleInfo = ffPhysicalDiskModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰋊"); - - ffStrbufInit(&options->namePrefix); - options->temp = false; - options->tempConfig = (FFColorRangeConfig) { 50, 70 }; -} - -void ffDestroyPhysicalDiskOptions(FFPhysicalDiskOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); - ffStrbufDestroy(&options->namePrefix); -} diff --git a/src/modules/physicaldisk/physicaldisk.h b/src/modules/physicaldisk/physicaldisk.h index 2ce2d05e6..e73b3f358 100644 --- a/src/modules/physicaldisk/physicaldisk.h +++ b/src/modules/physicaldisk/physicaldisk.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_PHYSICALDISK_MODULE_NAME "PhysicalDisk" diff --git a/src/modules/physicalmemory/option.h b/src/modules/physicalmemory/option.h index 96ebccc57..154354b4a 100644 --- a/src/modules/physicalmemory/option.h +++ b/src/modules/physicalmemory/option.h @@ -1,12 +1,11 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" #include "common/percent.h" typedef struct FFPhysicalMemoryOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFPhysicalMemoryOptions; + +static_assert(sizeof(FFPhysicalMemoryOptions) <= FF_OPTION_MAX_SIZE, "FFPhysicalMemoryOptions size exceeds maximum allowed size"); diff --git a/src/modules/physicalmemory/physicalmemory.c b/src/modules/physicalmemory/physicalmemory.c index 7ab325050..81a05b47c 100644 --- a/src/modules/physicalmemory/physicalmemory.c +++ b/src/modules/physicalmemory/physicalmemory.c @@ -139,6 +139,16 @@ void ffGeneratePhysicalMemoryJsonResult(FF_MAYBE_UNUSED FFPhysicalMemoryOptions* } } +void ffInitPhysicalMemoryOptions(FFPhysicalMemoryOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰑭"); +} + +void ffDestroyPhysicalMemoryOptions(FFPhysicalMemoryOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffPhysicalMemoryModuleInfo = { .name = FF_PHYSICALMEMORY_MODULE_NAME, .description = "Print system physical memory devices", @@ -162,14 +172,3 @@ FFModuleBaseInfo ffPhysicalMemoryModuleInfo = { {"True if ECC enabled", "is-ecc-enabled"}, })) }; - -void ffInitPhysicalMemoryOptions(FFPhysicalMemoryOptions* options) -{ - options->moduleInfo = ffPhysicalMemoryModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰑭"); -} - -void ffDestroyPhysicalMemoryOptions(FFPhysicalMemoryOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/physicalmemory/physicalmemory.h b/src/modules/physicalmemory/physicalmemory.h index 51d25206e..7df2b6c94 100644 --- a/src/modules/physicalmemory/physicalmemory.h +++ b/src/modules/physicalmemory/physicalmemory.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_PHYSICALMEMORY_MODULE_NAME "PhysicalMemory" diff --git a/src/modules/player/option.h b/src/modules/player/option.h index 1d34797fb..9d55821fd 100644 --- a/src/modules/player/option.h +++ b/src/modules/player/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFPlayerOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFPlayerOptions; + +static_assert(sizeof(FFPlayerOptions) <= FF_OPTION_MAX_SIZE, "FFPlayerOptions size exceeds maximum allowed size"); diff --git a/src/modules/player/player.c b/src/modules/player/player.c index 9811922a9..72af48027 100644 --- a/src/modules/player/player.c +++ b/src/modules/player/player.c @@ -107,6 +107,16 @@ void ffGeneratePlayerJsonResult(FF_MAYBE_UNUSED FFMediaOptions* options, yyjson_ yyjson_mut_obj_add_str(doc, module, "error", "Player module is an alias of Media module"); } +void ffInitPlayerOptions(FFPlayerOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰥠"); +} + +void ffDestroyPlayerOptions(FFPlayerOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffPlayerModuleInfo = { .name = FF_PLAYER_MODULE_NAME, .description = "Print music player name", @@ -123,14 +133,3 @@ FFModuleBaseInfo ffPlayerModuleInfo = { {"URL name", "url"}, })) }; - -void ffInitPlayerOptions(FFPlayerOptions* options) -{ - options->moduleInfo = ffPlayerModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰥠"); -} - -void ffDestroyPlayerOptions(FFPlayerOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/player/player.h b/src/modules/player/player.h index f70380c6d..b99a6da6b 100644 --- a/src/modules/player/player.h +++ b/src/modules/player/player.h @@ -1,7 +1,7 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_PLAYER_MODULE_NAME "Player" diff --git a/src/modules/poweradapter/option.h b/src/modules/poweradapter/option.h index 02a72eaf7..303bbba73 100644 --- a/src/modules/poweradapter/option.h +++ b/src/modules/poweradapter/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFPowerAdapterOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFPowerAdapterOptions; + +static_assert(sizeof(FFPowerAdapterOptions) <= FF_OPTION_MAX_SIZE, "FFPowerAdapterOptions size exceeds maximum allowed size"); diff --git a/src/modules/poweradapter/poweradapter.c b/src/modules/poweradapter/poweradapter.c index 0f57862c6..0ed4813a3 100644 --- a/src/modules/poweradapter/poweradapter.c +++ b/src/modules/poweradapter/poweradapter.c @@ -111,6 +111,16 @@ void ffGeneratePowerAdapterJsonResult(FF_MAYBE_UNUSED FFPowerAdapterOptions* opt } } +void ffInitPowerAdapterOptions(FFPowerAdapterOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰚥"); +} + +void ffDestroyPowerAdapterOptions(FFPowerAdapterOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffPowerAdapterModuleInfo = { .name = FF_POWERADAPTER_MODULE_NAME, .description = "Print power adapter name and charging watts", @@ -129,14 +139,3 @@ FFModuleBaseInfo ffPowerAdapterModuleInfo = { {"Power adapter serial number", "serial"}, })) }; - -void ffInitPowerAdapterOptions(FFPowerAdapterOptions* options) -{ - options->moduleInfo = ffPowerAdapterModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰚥"); -} - -void ffDestroyPowerAdapterOptions(FFPowerAdapterOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/poweradapter/poweradapter.h b/src/modules/poweradapter/poweradapter.h index 03d2c8946..165060a5e 100644 --- a/src/modules/poweradapter/poweradapter.h +++ b/src/modules/poweradapter/poweradapter.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_POWERADAPTER_MODULE_NAME "PowerAdapter" diff --git a/src/modules/processes/option.h b/src/modules/processes/option.h index 6946ecad4..0b59f9df3 100644 --- a/src/modules/processes/option.h +++ b/src/modules/processes/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFProcessesOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFProcessesOptions; + +static_assert(sizeof(FFProcessesOptions) <= FF_OPTION_MAX_SIZE, "FFProcessesOptions size exceeds maximum allowed size"); diff --git a/src/modules/processes/processes.c b/src/modules/processes/processes.c index 05b6c3df5..4277e71a4 100644 --- a/src/modules/processes/processes.c +++ b/src/modules/processes/processes.c @@ -64,6 +64,16 @@ void ffGenerateProcessesJsonResult(FF_MAYBE_UNUSED FFProcessesOptions* options, yyjson_mut_obj_add_uint(doc, module, "result", result); } +void ffInitProcessesOptions(FFProcessesOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyProcessesOptions(FFProcessesOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffProcessesModuleInfo = { .name = FF_PROCESSES_MODULE_NAME, .description = "Print number of running processes", @@ -77,14 +87,3 @@ FFModuleBaseInfo ffProcessesModuleInfo = { {"Process count", "result"} })) }; - -void ffInitProcessesOptions(FFProcessesOptions* options) -{ - options->moduleInfo = ffProcessesModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyProcessesOptions(FFProcessesOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/processes/processes.h b/src/modules/processes/processes.h index a8e733001..d9f0ae3d8 100644 --- a/src/modules/processes/processes.h +++ b/src/modules/processes/processes.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_PROCESSES_MODULE_NAME "Processes" diff --git a/src/modules/publicip/option.h b/src/modules/publicip/option.h index 427bab31a..e3118cb28 100644 --- a/src/modules/publicip/option.h +++ b/src/modules/publicip/option.h @@ -1,15 +1,14 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" -typedef struct FFPublicIpOptions +typedef struct FFPublicIPOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFstrbuf url; uint32_t timeout; bool ipv6; -} FFPublicIpOptions; +} FFPublicIPOptions; + +static_assert(sizeof(FFPublicIPOptions) <= FF_OPTION_MAX_SIZE, "FFPublicIPOptions size exceeds maximum allowed size"); diff --git a/src/modules/publicip/publicip.c b/src/modules/publicip/publicip.c index 3a0f417f5..187a95a17 100644 --- a/src/modules/publicip/publicip.c +++ b/src/modules/publicip/publicip.c @@ -6,7 +6,7 @@ #define FF_PUBLICIP_DISPLAY_NAME "Public IP" -void ffPrintPublicIp(FFPublicIpOptions* options) +void ffPrintPublicIp(FFPublicIPOptions* options) { FFPublicIpResult result; ffStrbufInit(&result.ip); @@ -39,7 +39,7 @@ void ffPrintPublicIp(FFPublicIpOptions* options) ffStrbufDestroy(&result.location); } -void ffParsePublicIpJsonObject(FFPublicIpOptions* options, yyjson_val* module) +void ffParsePublicIpJsonObject(FFPublicIPOptions* options, yyjson_val* module) { yyjson_val *key, *val; size_t idx, max; @@ -70,9 +70,9 @@ void ffParsePublicIpJsonObject(FFPublicIpOptions* options, yyjson_val* module) } } -void ffGeneratePublicIpJsonConfig(FFPublicIpOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) +void ffGeneratePublicIpJsonConfig(FFPublicIPOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyPublicIpOptions))) FFPublicIpOptions defaultOptions; + __attribute__((__cleanup__(ffDestroyPublicIpOptions))) FFPublicIPOptions defaultOptions; ffInitPublicIpOptions(&defaultOptions); ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); @@ -87,7 +87,7 @@ void ffGeneratePublicIpJsonConfig(FFPublicIpOptions* options, yyjson_mut_doc* do yyjson_mut_obj_add_bool(doc, module, "ipv6", options->ipv6); } -void ffGeneratePublicIpJsonResult(FFPublicIpOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) +void ffGeneratePublicIpJsonResult(FFPublicIPOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { FFPublicIpResult result; ffStrbufInit(&result.ip); @@ -108,6 +108,22 @@ void ffGeneratePublicIpJsonResult(FFPublicIpOptions* options, yyjson_mut_doc* do ffStrbufDestroy(&result.location); } +void ffInitPublicIpOptions(FFPublicIPOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰩠"); + + ffStrbufInit(&options->url); + options->timeout = 0; + options->ipv6 = false; +} + +void ffDestroyPublicIpOptions(FFPublicIPOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); + + ffStrbufDestroy(&options->url); +} + FFModuleBaseInfo ffPublicIPModuleInfo = { .name = FF_PUBLICIP_MODULE_NAME, .description = "Print your public IP address, etc", @@ -122,20 +138,3 @@ FFModuleBaseInfo ffPublicIPModuleInfo = { {"Location", "location"}, })) }; - -void ffInitPublicIpOptions(FFPublicIpOptions* options) -{ - options->moduleInfo = ffPublicIPModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰩠"); - - ffStrbufInit(&options->url); - options->timeout = 0; - options->ipv6 = false; -} - -void ffDestroyPublicIpOptions(FFPublicIpOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); - - ffStrbufDestroy(&options->url); -} diff --git a/src/modules/publicip/publicip.h b/src/modules/publicip/publicip.h index 0d178e520..5fd70ab4f 100644 --- a/src/modules/publicip/publicip.h +++ b/src/modules/publicip/publicip.h @@ -1,13 +1,13 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_PUBLICIP_MODULE_NAME "PublicIp" -void ffPreparePublicIp(FFPublicIpOptions* options); +void ffPreparePublicIp(FFPublicIPOptions* options); -void ffPrintPublicIp(FFPublicIpOptions* options); -void ffInitPublicIpOptions(FFPublicIpOptions* options); -void ffDestroyPublicIpOptions(FFPublicIpOptions* options); +void ffPrintPublicIp(FFPublicIPOptions* options); +void ffInitPublicIpOptions(FFPublicIPOptions* options); +void ffDestroyPublicIpOptions(FFPublicIPOptions* options); extern FFModuleBaseInfo ffPublicIPModuleInfo; diff --git a/src/modules/separator/option.h b/src/modules/separator/option.h index 5f435e7f0..92274c806 100644 --- a/src/modules/separator/option.h +++ b/src/modules/separator/option.h @@ -1,14 +1,12 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFSeparatorOptions { - FFModuleBaseInfo moduleInfo; - FFstrbuf string; FFstrbuf outputColor; uint32_t length; } FFSeparatorOptions; + +static_assert(sizeof(FFSeparatorOptions) <= FF_OPTION_MAX_SIZE, "FFSeparatorOptions size exceeds maximum allowed size"); diff --git a/src/modules/separator/separator.c b/src/modules/separator/separator.c index a8ddd1dbb..3786949ad 100644 --- a/src/modules/separator/separator.c +++ b/src/modules/separator/separator.c @@ -56,7 +56,7 @@ void ffPrintSeparator(FFSeparatorOptions* options) { setlocale(LC_CTYPE, ""); mbstate_t state = {}; - bool fqdn = instance.config.modules.title.fqdn; + bool fqdn = true; // TODO: Make this configurable const FFPlatform* platform = &instance.state.platform; FF_AUTO_FREE wchar_t* wstr = malloc((max( @@ -154,19 +154,8 @@ void ffGenerateSeparatorJsonConfig(FFSeparatorOptions* options, yyjson_mut_doc* yyjson_mut_obj_add_strbuf(doc, module, "string", &options->string); } -FFModuleBaseInfo ffSeparatorModuleInfo = { - .name = FF_SEPARATOR_MODULE_NAME, - .description = "Print a separator line", - .initOptions = (void*) ffInitSeparatorOptions, - .destroyOptions = (void*) ffDestroySeparatorOptions, - .parseJsonObject = (void*) ffParseSeparatorJsonObject, - .printModule = (void*) ffPrintSeparator, - .generateJsonConfig = (void*) ffGenerateSeparatorJsonConfig, -}; - void ffInitSeparatorOptions(FFSeparatorOptions* options) { - options->moduleInfo = ffSeparatorModuleInfo; ffStrbufInitStatic(&options->string, "-"); ffStrbufInit(&options->outputColor); options->length = 0; @@ -176,3 +165,13 @@ void ffDestroySeparatorOptions(FFSeparatorOptions* options) { ffStrbufDestroy(&options->string); } + +FFModuleBaseInfo ffSeparatorModuleInfo = { + .name = FF_SEPARATOR_MODULE_NAME, + .description = "Print a separator line", + .initOptions = (void*) ffInitSeparatorOptions, + .destroyOptions = (void*) ffDestroySeparatorOptions, + .parseJsonObject = (void*) ffParseSeparatorJsonObject, + .printModule = (void*) ffPrintSeparator, + .generateJsonConfig = (void*) ffGenerateSeparatorJsonConfig, +}; diff --git a/src/modules/separator/separator.h b/src/modules/separator/separator.h index 804a76405..d23fc6c94 100644 --- a/src/modules/separator/separator.h +++ b/src/modules/separator/separator.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_SEPARATOR_MODULE_NAME "Separator" diff --git a/src/modules/shell/option.h b/src/modules/shell/option.h index b356cbac9..49ec83f51 100644 --- a/src/modules/shell/option.h +++ b/src/modules/shell/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFShellOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFShellOptions; + +static_assert(sizeof(FFShellOptions) <= FF_OPTION_MAX_SIZE, "FFShellOptions size exceeds maximum allowed size"); diff --git a/src/modules/shell/shell.c b/src/modules/shell/shell.c index 638db6a43..4ec724b62 100644 --- a/src/modules/shell/shell.c +++ b/src/modules/shell/shell.c @@ -88,6 +88,16 @@ void ffGenerateShellJsonResult(FF_MAYBE_UNUSED FFShellOptions* options, yyjson_m yyjson_mut_obj_add_null(doc, obj, "tty"); } +void ffInitShellOptions(FFShellOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyShellOptions(FFShellOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffShellModuleInfo = { .name = FF_SHELL_MODULE_NAME, .description = "Print current shell name and version", @@ -108,14 +118,3 @@ FFModuleBaseInfo ffShellModuleInfo = { {"Shell tty used", "tty"}, })) }; - -void ffInitShellOptions(FFShellOptions* options) -{ - options->moduleInfo = ffShellModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyShellOptions(FFShellOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/shell/shell.h b/src/modules/shell/shell.h index 12fd2107b..db39aa964 100644 --- a/src/modules/shell/shell.h +++ b/src/modules/shell/shell.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_SHELL_MODULE_NAME "Shell" diff --git a/src/modules/sound/option.h b/src/modules/sound/option.h index 7ec2c1614..0c9f0fd4f 100644 --- a/src/modules/sound/option.h +++ b/src/modules/sound/option.h @@ -1,7 +1,5 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" #include "common/percent.h" @@ -14,9 +12,10 @@ typedef enum __attribute__((__packed__)) FFSoundType typedef struct FFSoundOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFSoundType soundType; FFPercentageModuleConfig percent; } FFSoundOptions; + +static_assert(sizeof(FFSoundOptions) <= FF_OPTION_MAX_SIZE, "FFSoundOptions size exceeds maximum allowed size"); diff --git a/src/modules/sound/sound.c b/src/modules/sound/sound.c index 92adc266c..dcc9e75a9 100644 --- a/src/modules/sound/sound.c +++ b/src/modules/sound/sound.c @@ -206,6 +206,19 @@ void ffGenerateSoundJsonResult(FF_MAYBE_UNUSED FFSoundOptions* options, yyjson_m } } +void ffInitSoundOptions(FFSoundOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); + + options->soundType = FF_SOUND_TYPE_MAIN; + options->percent = (FFPercentageModuleConfig) { 80, 90, 0 }; +} + +void ffDestroySoundOptions(FFSoundOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffSoundModuleInfo = { .name = FF_SOUND_MODULE_NAME, .description = "Print sound devices, volume, etc", @@ -224,17 +237,3 @@ FFModuleBaseInfo ffSoundModuleInfo = { {"Platform API used", "platform-api"}, })) }; - -void ffInitSoundOptions(FFSoundOptions* options) -{ - options->moduleInfo = ffSoundModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); - - options->soundType = FF_SOUND_TYPE_MAIN; - options->percent = (FFPercentageModuleConfig) { 80, 90, 0 }; -} - -void ffDestroySoundOptions(FFSoundOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/sound/sound.h b/src/modules/sound/sound.h index fa4e808ab..80766b5ae 100644 --- a/src/modules/sound/sound.h +++ b/src/modules/sound/sound.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_SOUND_MODULE_NAME "Sound" diff --git a/src/modules/swap/option.h b/src/modules/swap/option.h index e0f44e02a..2d9691100 100644 --- a/src/modules/swap/option.h +++ b/src/modules/swap/option.h @@ -1,15 +1,14 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" #include "common/percent.h" typedef struct FFSwapOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFPercentageModuleConfig percent; bool separate; } FFSwapOptions; + +static_assert(sizeof(FFSwapOptions) <= FF_OPTION_MAX_SIZE, "FFSwapOptions size exceeds maximum allowed size"); diff --git a/src/modules/swap/swap.c b/src/modules/swap/swap.c index 15d7fe916..ea2d01d41 100644 --- a/src/modules/swap/swap.c +++ b/src/modules/swap/swap.c @@ -189,6 +189,18 @@ void ffGenerateSwapJsonResult(FF_MAYBE_UNUSED FFSwapOptions* options, yyjson_mut } } +void ffInitSwapOptions(FFSwapOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰓡"); + options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; + options->separate = false; +} + +void ffDestroySwapOptions(FFSwapOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffSwapModuleInfo = { .name = FF_SWAP_MODULE_NAME, .description = "Print swap (paging file) space usage", @@ -206,16 +218,3 @@ FFModuleBaseInfo ffSwapModuleInfo = { {"Name", "name"}, })) }; - -void ffInitSwapOptions(FFSwapOptions* options) -{ - options->moduleInfo = ffSwapModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰓡"); - options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; - options->separate = false; -} - -void ffDestroySwapOptions(FFSwapOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/swap/swap.h b/src/modules/swap/swap.h index c7c61dff1..7f31ecd01 100644 --- a/src/modules/swap/swap.h +++ b/src/modules/swap/swap.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_SWAP_MODULE_NAME "Swap" diff --git a/src/modules/terminal/option.h b/src/modules/terminal/option.h index e974c9979..49b005e03 100644 --- a/src/modules/terminal/option.h +++ b/src/modules/terminal/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFTerminalOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFTerminalOptions; + +static_assert(sizeof(FFTerminalOptions) <= FF_OPTION_MAX_SIZE, "FFTerminalOptions size exceeds maximum allowed size"); diff --git a/src/modules/terminal/terminal.c b/src/modules/terminal/terminal.c index 1eb6dfba1..caede6747 100644 --- a/src/modules/terminal/terminal.c +++ b/src/modules/terminal/terminal.c @@ -81,6 +81,16 @@ void ffGenerateTerminalJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options, yy yyjson_mut_obj_add_strbuf(doc, obj, "tty", &result->tty); } +void ffInitTerminalOptions(FFTerminalOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyTerminalOptions(FFTerminalOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffTerminalModuleInfo = { .name = FF_TERMINAL_MODULE_NAME, .description = "Print current terminal name and version", @@ -101,14 +111,3 @@ FFModuleBaseInfo ffTerminalModuleInfo = { {"Terminal tty / pts used", "tty"}, })) }; - -void ffInitTerminalOptions(FFTerminalOptions* options) -{ - options->moduleInfo = ffTerminalModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyTerminalOptions(FFTerminalOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/terminal/terminal.h b/src/modules/terminal/terminal.h index f397867f4..df30bfadf 100644 --- a/src/modules/terminal/terminal.h +++ b/src/modules/terminal/terminal.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_TERMINAL_MODULE_NAME "Terminal" diff --git a/src/modules/terminalfont/option.h b/src/modules/terminalfont/option.h index 64417bf0a..db652adce 100644 --- a/src/modules/terminalfont/option.h +++ b/src/modules/terminalfont/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFTerminalFontOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFTerminalFontOptions; + +static_assert(sizeof(FFTerminalFontOptions) <= FF_OPTION_MAX_SIZE, "FFTerminalFontOptions size exceeds maximum allowed size"); diff --git a/src/modules/terminalfont/terminalfont.c b/src/modules/terminalfont/terminalfont.c index e6b1dfe1e..7356369ec 100644 --- a/src/modules/terminalfont/terminalfont.c +++ b/src/modules/terminalfont/terminalfont.c @@ -67,7 +67,7 @@ void ffGenerateTerminalFontJsonConfig(FFTerminalFontOptions* options, yyjson_mut ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); } -void ffGenerateTerminalFontJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) +void ffGenerateTerminalFontJsonResult(FF_MAYBE_UNUSED FFTerminalFontOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { FFTerminalFontResult result; ffFontInit(&result.font); @@ -106,6 +106,16 @@ void ffGenerateTerminalFontJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options ffFontDestroy(&result.fallback); } +void ffInitTerminalFontOptions(FFTerminalFontOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyTerminalFontOptions(FFTerminalFontOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffTerminalFontModuleInfo = { .name = FF_TERMINALFONT_MODULE_NAME, .description = "Print font name and size used by current terminal", @@ -122,14 +132,3 @@ FFModuleBaseInfo ffTerminalFontModuleInfo = { {"Terminal font styles", "styles"}, })), }; - -void ffInitTerminalFontOptions(FFTerminalFontOptions* options) -{ - options->moduleInfo = ffTerminalFontModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyTerminalFontOptions(FFTerminalFontOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/terminalfont/terminalfont.h b/src/modules/terminalfont/terminalfont.h index ff12829e1..c1716912a 100644 --- a/src/modules/terminalfont/terminalfont.h +++ b/src/modules/terminalfont/terminalfont.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_TERMINALFONT_MODULE_NAME "TerminalFont" diff --git a/src/modules/terminalsize/option.h b/src/modules/terminalsize/option.h index 7d584837f..518856a8c 100644 --- a/src/modules/terminalsize/option.h +++ b/src/modules/terminalsize/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFTerminalSizeOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFTerminalSizeOptions; + +static_assert(sizeof(FFTerminalSizeOptions) <= FF_OPTION_MAX_SIZE, "FFTerminalSizeOptions size exceeds maximum allowed size"); diff --git a/src/modules/terminalsize/terminalsize.c b/src/modules/terminalsize/terminalsize.c index 1b3dfe029..ec9148b9b 100644 --- a/src/modules/terminalsize/terminalsize.c +++ b/src/modules/terminalsize/terminalsize.c @@ -59,7 +59,7 @@ void ffGenerateTerminalSizeJsonConfig(FFTerminalSizeOptions* options, yyjson_mut ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); } -void ffGenerateTerminalSizeJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) +void ffGenerateTerminalSizeJsonResult(FF_MAYBE_UNUSED FFTerminalSizeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { FFTerminalSizeResult result; @@ -76,6 +76,16 @@ void ffGenerateTerminalSizeJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options yyjson_mut_obj_add_uint(doc, obj, "height", result.height); } +void ffInitTerminalSizeOptions(FFTerminalSizeOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰲎"); +} + +void ffDestroyTerminalSizeOptions(FFTerminalSizeOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffTerminalSizeModuleInfo = { .name = FF_TERMINALSIZE_MODULE_NAME, .description = "Print current terminal size", @@ -92,14 +102,3 @@ FFModuleBaseInfo ffTerminalSizeModuleInfo = { {"Terminal height (in pixels)", "height"}, })), }; - -void ffInitTerminalSizeOptions(FFTerminalSizeOptions* options) -{ - options->moduleInfo = ffTerminalSizeModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰲎"); -} - -void ffDestroyTerminalSizeOptions(FFTerminalSizeOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/terminalsize/terminalsize.h b/src/modules/terminalsize/terminalsize.h index eca007a48..859d09b0c 100644 --- a/src/modules/terminalsize/terminalsize.h +++ b/src/modules/terminalsize/terminalsize.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_TERMINALSIZE_MODULE_NAME "TerminalSize" diff --git a/src/modules/terminaltheme/option.h b/src/modules/terminaltheme/option.h index aecbe18d7..3d8cdc252 100644 --- a/src/modules/terminaltheme/option.h +++ b/src/modules/terminaltheme/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFTerminalThemeOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFTerminalThemeOptions; + +static_assert(sizeof(FFTerminalThemeOptions) <= FF_OPTION_MAX_SIZE, "FFTerminalThemeOptions size exceeds maximum allowed size"); diff --git a/src/modules/terminaltheme/terminaltheme.c b/src/modules/terminaltheme/terminaltheme.c index 74439f59e..2b504fd5b 100644 --- a/src/modules/terminaltheme/terminaltheme.c +++ b/src/modules/terminaltheme/terminaltheme.c @@ -64,7 +64,7 @@ void ffGenerateTerminalThemeJsonConfig(FFTerminalThemeOptions* options, yyjson_m ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); } -void ffGenerateTerminalThemeJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) +void ffGenerateTerminalThemeJsonResult(FF_MAYBE_UNUSED FFTerminalThemeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { FFTerminalThemeResult result = {}; @@ -89,6 +89,16 @@ void ffGenerateTerminalThemeJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* option yyjson_mut_obj_add_bool(doc, bg, "dark", result.bg.dark); } +void ffInitTerminalThemeOptions(FFTerminalThemeOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰔎"); +} + +void ffDestroyTerminalThemeOptions(FFTerminalThemeOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffTerminalThemeModuleInfo = { .name = FF_TERMINALTHEME_MODULE_NAME, .description = "Print current terminal theme (foreground and background colors)", @@ -105,14 +115,3 @@ FFModuleBaseInfo ffTerminalThemeModuleInfo = { {"Terminal background type (Dark / Light)", "bg-type"}, })) }; - -void ffInitTerminalThemeOptions(FFTerminalThemeOptions* options) -{ - options->moduleInfo = ffTerminalThemeModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰔎"); -} - -void ffDestroyTerminalThemeOptions(FFTerminalThemeOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/terminaltheme/terminaltheme.h b/src/modules/terminaltheme/terminaltheme.h index d44826eee..dbe6ac192 100644 --- a/src/modules/terminaltheme/terminaltheme.h +++ b/src/modules/terminaltheme/terminaltheme.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_TERMINALTHEME_MODULE_NAME "TerminalTheme" diff --git a/src/modules/theme/option.h b/src/modules/theme/option.h index 9c3b32a88..ca232bfb9 100644 --- a/src/modules/theme/option.h +++ b/src/modules/theme/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFThemeOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFThemeOptions; + +static_assert(sizeof(FFThemeOptions) <= FF_OPTION_MAX_SIZE, "FFThemeOptions size exceeds maximum allowed size"); diff --git a/src/modules/theme/theme.c b/src/modules/theme/theme.c index 3b1448b28..f6cfd945b 100644 --- a/src/modules/theme/theme.c +++ b/src/modules/theme/theme.c @@ -86,6 +86,16 @@ void ffGenerateThemeJsonResult(FF_MAYBE_UNUSED FFThemeOptions* options, yyjson_m ffStrbufDestroy(&result.theme2); } +void ffInitThemeOptions(FFThemeOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰉼"); +} + +void ffDestroyThemeOptions(FFThemeOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffThemeModuleInfo = { .name = FF_THEME_MODULE_NAME, .description = "Print current theme of desktop environment", @@ -100,14 +110,3 @@ FFModuleBaseInfo ffThemeModuleInfo = { {"Theme part 2", "theme2"}, })) }; - -void ffInitThemeOptions(FFThemeOptions* options) -{ - options->moduleInfo = ffThemeModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰉼"); -} - -void ffDestroyThemeOptions(FFThemeOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/theme/theme.h b/src/modules/theme/theme.h index 4b9c24f49..6d677a2d0 100644 --- a/src/modules/theme/theme.h +++ b/src/modules/theme/theme.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_THEME_MODULE_NAME "Theme" diff --git a/src/modules/title/option.h b/src/modules/title/option.h index 9c3ea074b..16505d39b 100644 --- a/src/modules/title/option.h +++ b/src/modules/title/option.h @@ -1,16 +1,15 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFTitleOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; - bool fqdn; FFstrbuf colorUser; FFstrbuf colorAt; FFstrbuf colorHost; + bool fqdn; } FFTitleOptions; + +static_assert(sizeof(FFTitleOptions) <= FF_OPTION_MAX_SIZE, "FFTitleOptions size exceeds maximum allowed size"); diff --git a/src/modules/title/title.c b/src/modules/title/title.c index b80cae4cc..8821ac2d5 100644 --- a/src/modules/title/title.c +++ b/src/modules/title/title.c @@ -140,6 +140,25 @@ void ffGenerateTitleJsonResult(FF_MAYBE_UNUSED FFTitleOptions* options, yyjson_m yyjson_mut_obj_add_strbuf(doc, obj, "userShell", &instance.state.platform.userShell); } +void ffInitTitleOptions(FFTitleOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); + ffStrbufSetStatic(&options->moduleArgs.key, " "); + + options->fqdn = false; + ffStrbufInit(&options->colorUser); + ffStrbufInit(&options->colorAt); + ffStrbufInit(&options->colorHost); +} + +void ffDestroyTitleOptions(FFTitleOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); + ffStrbufDestroy(&options->colorUser); + ffStrbufDestroy(&options->colorAt); + ffStrbufDestroy(&options->colorHost); +} + FFModuleBaseInfo ffTitleModuleInfo = { .name = FF_TITLE_MODULE_NAME, .description = "Print title, which contains your user name, hostname", @@ -161,23 +180,3 @@ FFModuleBaseInfo ffTitleModuleInfo = { {"Full user name", "full-user-name"}, })) }; - -void ffInitTitleOptions(FFTitleOptions* options) -{ - options->moduleInfo = ffTitleModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); - ffStrbufSetStatic(&options->moduleArgs.key, " "); - - options->fqdn = false; - ffStrbufInit(&options->colorUser); - ffStrbufInit(&options->colorAt); - ffStrbufInit(&options->colorHost); -} - -void ffDestroyTitleOptions(FFTitleOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); - ffStrbufDestroy(&options->colorUser); - ffStrbufDestroy(&options->colorAt); - ffStrbufDestroy(&options->colorHost); -} diff --git a/src/modules/title/title.h b/src/modules/title/title.h index 6b616ec31..4a41bcfe6 100644 --- a/src/modules/title/title.h +++ b/src/modules/title/title.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_TITLE_MODULE_NAME "Title" diff --git a/src/modules/tpm/option.h b/src/modules/tpm/option.h index d98c21df2..19fb79029 100644 --- a/src/modules/tpm/option.h +++ b/src/modules/tpm/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFTPMOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFTPMOptions; + +static_assert(sizeof(FFTPMOptions) <= FF_OPTION_MAX_SIZE, "FFTPMOptions size exceeds maximum allowed size"); diff --git a/src/modules/tpm/tpm.c b/src/modules/tpm/tpm.c index 82eb04d51..fc447d160 100644 --- a/src/modules/tpm/tpm.c +++ b/src/modules/tpm/tpm.c @@ -59,7 +59,7 @@ void ffGenerateTPMJsonConfig(FFTPMOptions* options, yyjson_mut_doc* doc, yyjson_ ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); } -void ffGenerateTPMJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) +void ffGenerateTPMJsonResult(FF_MAYBE_UNUSED FFTPMOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { FFTPMResult result = { .version = ffStrbufCreate(), @@ -81,6 +81,16 @@ void ffGenerateTPMJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options, yyjson_ ffStrbufDestroy(&result.description); } +void ffInitTPMOptions(FFTPMOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyTPMOptions(FFTPMOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffTPMModuleInfo = { .name = FF_TPM_MODULE_NAME, .description = "Print info of Trusted Platform Module (TPM) Security Device", @@ -95,14 +105,3 @@ FFModuleBaseInfo ffTPMModuleInfo = { {"TPM general description", "description"}, })) }; - -void ffInitTPMOptions(FFTPMOptions* options) -{ - options->moduleInfo = ffTPMModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyTPMOptions(FFTPMOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/tpm/tpm.h b/src/modules/tpm/tpm.h index fefcae96e..c5ef666df 100644 --- a/src/modules/tpm/tpm.h +++ b/src/modules/tpm/tpm.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_TPM_MODULE_NAME "TPM" diff --git a/src/modules/uptime/option.h b/src/modules/uptime/option.h index f047db76c..4235995c5 100644 --- a/src/modules/uptime/option.h +++ b/src/modules/uptime/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFUptimeOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFUptimeOptions; + +static_assert(sizeof(FFUptimeOptions) <= FF_OPTION_MAX_SIZE, "FFUptimeOptions size exceeds maximum allowed size"); diff --git a/src/modules/uptime/uptime.c b/src/modules/uptime/uptime.c index 9738d8ac0..d0b489cac 100644 --- a/src/modules/uptime/uptime.c +++ b/src/modules/uptime/uptime.c @@ -93,6 +93,16 @@ void ffGenerateUptimeJsonResult(FF_MAYBE_UNUSED FFUptimeOptions* options, yyjson yyjson_mut_obj_add_strcpy(doc, obj, "bootTime", ffTimeToFullStr(result.bootTime)); } +void ffInitUptimeOptions(FFUptimeOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyUptimeOptions(FFUptimeOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffUptimeModuleInfo = { .name = FF_UPTIME_MODULE_NAME, .description = "Print how long system has been running", @@ -115,14 +125,3 @@ FFModuleBaseInfo ffUptimeModuleInfo = { {"Formatted uptime", "formatted"}, })) }; - -void ffInitUptimeOptions(FFUptimeOptions* options) -{ - options->moduleInfo = ffUptimeModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyUptimeOptions(FFUptimeOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/uptime/uptime.h b/src/modules/uptime/uptime.h index 7ffddb694..a12fcd549 100644 --- a/src/modules/uptime/uptime.h +++ b/src/modules/uptime/uptime.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_UPTIME_MODULE_NAME "Uptime" diff --git a/src/modules/users/option.h b/src/modules/users/option.h index af194fea2..16ea5e88f 100644 --- a/src/modules/users/option.h +++ b/src/modules/users/option.h @@ -1,14 +1,13 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFUsersOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; bool compact; bool myselfOnly; } FFUsersOptions; + +static_assert(sizeof(FFUsersOptions) <= FF_OPTION_MAX_SIZE, "FFUsersOptions size exceeds maximum allowed size"); diff --git a/src/modules/users/users.c b/src/modules/users/users.c index 4f0fc4cfa..cd82d359a 100644 --- a/src/modules/users/users.c +++ b/src/modules/users/users.c @@ -185,6 +185,19 @@ void ffGenerateUsersJsonResult(FFUsersOptions* options, yyjson_mut_doc* doc, yyj } } +void ffInitUsersOptions(FFUsersOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); + + options->compact = false; + options->myselfOnly = false; +} + +void ffDestroyUsersOptions(FFUsersOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffUsersModuleInfo = { .name = FF_USERS_MODULE_NAME, .description = "Print users currently logged in", @@ -210,17 +223,3 @@ FFModuleBaseInfo ffUsersModuleInfo = { {"Years fraction after login", "years-fraction"}, })) }; - -void ffInitUsersOptions(FFUsersOptions* options) -{ - options->moduleInfo = ffUsersModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); - - options->compact = false; - options->myselfOnly = false; -} - -void ffDestroyUsersOptions(FFUsersOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/users/users.h b/src/modules/users/users.h index c8c7f78e2..bc249bda1 100644 --- a/src/modules/users/users.h +++ b/src/modules/users/users.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_USERS_MODULE_NAME "Users" diff --git a/src/modules/version/option.h b/src/modules/version/option.h index 12c151be0..f3b68b4f2 100644 --- a/src/modules/version/option.h +++ b/src/modules/version/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFVersionOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFVersionOptions; + +static_assert(sizeof(FFVersionOptions) <= FF_OPTION_MAX_SIZE, "FFVersionOptions size exceeds maximum allowed size"); diff --git a/src/modules/version/version.c b/src/modules/version/version.c index 599978478..42b50e11e 100644 --- a/src/modules/version/version.c +++ b/src/modules/version/version.c @@ -97,6 +97,16 @@ void ffGenerateVersionJsonResult(FF_MAYBE_UNUSED FFVersionOptions* options, yyjs } } +void ffInitVersionOptions(FFVersionOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyVersionOptions(FFVersionOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffVersionModuleInfo = { .name = FF_VERSION_MODULE_NAME, .description = "Print Fastfetch version", @@ -119,14 +129,3 @@ FFModuleBaseInfo ffVersionModuleInfo = { {"Libc used when compiling", "libc"}, })) }; - -void ffInitVersionOptions(FFVersionOptions* options) -{ - options->moduleInfo = ffVersionModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyVersionOptions(FFVersionOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/version/version.h b/src/modules/version/version.h index 9228f99e8..1135e5394 100644 --- a/src/modules/version/version.h +++ b/src/modules/version/version.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_VERSION_MODULE_NAME "Version" diff --git a/src/modules/vulkan/option.h b/src/modules/vulkan/option.h index 132af5bbe..38ec20c99 100644 --- a/src/modules/vulkan/option.h +++ b/src/modules/vulkan/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFVulkanOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFVulkanOptions; + +static_assert(sizeof(FFVulkanOptions) <= FF_OPTION_MAX_SIZE, "FFVulkanOptions size exceeds maximum allowed size"); diff --git a/src/modules/vulkan/vulkan.c b/src/modules/vulkan/vulkan.c index f8740be65..331f91a61 100644 --- a/src/modules/vulkan/vulkan.c +++ b/src/modules/vulkan/vulkan.c @@ -128,6 +128,16 @@ void ffGenerateVulkanJsonResult(FF_MAYBE_UNUSED FFVulkanOptions* options, yyjson } } +void ffInitVulkanOptions(FFVulkanOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); +} + +void ffDestroyVulkanOptions(FFVulkanOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffVulkanModuleInfo = { .name = FF_VULKAN_MODULE_NAME, .description = "Print highest Vulkan version supported by the GPU", @@ -144,14 +154,3 @@ FFModuleBaseInfo ffVulkanModuleInfo = { {"Instance version", "instance-version"}, })) }; - -void ffInitVulkanOptions(FFVulkanOptions* options) -{ - options->moduleInfo = ffVulkanModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); -} - -void ffDestroyVulkanOptions(FFVulkanOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/vulkan/vulkan.h b/src/modules/vulkan/vulkan.h index 0a42bdd84..7a5d0f29d 100644 --- a/src/modules/vulkan/vulkan.h +++ b/src/modules/vulkan/vulkan.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_VULKAN_MODULE_NAME "Vulkan" diff --git a/src/modules/wallpaper/option.h b/src/modules/wallpaper/option.h index 539a57f9b..621699fa3 100644 --- a/src/modules/wallpaper/option.h +++ b/src/modules/wallpaper/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFWallpaperOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFWallpaperOptions; + +static_assert(sizeof(FFWallpaperOptions) <= FF_OPTION_MAX_SIZE, "FFWallpaperOptions size exceeds maximum allowed size"); diff --git a/src/modules/wallpaper/wallpaper.c b/src/modules/wallpaper/wallpaper.c index b69c75a61..fe7c3efc1 100644 --- a/src/modules/wallpaper/wallpaper.c +++ b/src/modules/wallpaper/wallpaper.c @@ -73,6 +73,16 @@ void ffGenerateWallpaperJsonResult(FF_MAYBE_UNUSED FFWallpaperOptions* options, yyjson_mut_obj_add_strbuf(doc, module, "result", &fullpath); } +void ffInitWallpaperOptions(FFWallpaperOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰸉"); +} + +void ffDestroyWallpaperOptions(FFWallpaperOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffWallpaperModuleInfo = { .name = FF_WALLPAPER_MODULE_NAME, .description = "Print image file path of current wallpaper", @@ -87,14 +97,3 @@ FFModuleBaseInfo ffWallpaperModuleInfo = { {"Full path", "full-path"}, })) }; - -void ffInitWallpaperOptions(FFWallpaperOptions* options) -{ - options->moduleInfo = ffWallpaperModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰸉"); -} - -void ffDestroyWallpaperOptions(FFWallpaperOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/wallpaper/wallpaper.h b/src/modules/wallpaper/wallpaper.h index 12876b481..3ca28bfcd 100644 --- a/src/modules/wallpaper/wallpaper.h +++ b/src/modules/wallpaper/wallpaper.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_WALLPAPER_MODULE_NAME "Wallpaper" diff --git a/src/modules/weather/option.h b/src/modules/weather/option.h index b8c7e7cad..76c3df11b 100644 --- a/src/modules/weather/option.h +++ b/src/modules/weather/option.h @@ -1,15 +1,14 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFWeatherOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFstrbuf location; FFstrbuf outputFormat; uint32_t timeout; } FFWeatherOptions; + +static_assert(sizeof(FFWeatherOptions) <= FF_OPTION_MAX_SIZE, "FFWeatherOptions size exceeds maximum allowed size"); diff --git a/src/modules/weather/weather.c b/src/modules/weather/weather.c index b86c687ee..e44c75c31 100644 --- a/src/modules/weather/weather.c +++ b/src/modules/weather/weather.c @@ -91,23 +91,8 @@ void ffGenerateWeatherJsonResult(FFWeatherOptions* options, yyjson_mut_doc* doc, yyjson_mut_obj_add_strbuf(doc, module, "result", &result); } -FFModuleBaseInfo ffWeatherModuleInfo = { - .name = FF_WEATHER_MODULE_NAME, - .description = "Print weather information", - .initOptions = (void*) ffInitWeatherOptions, - .destroyOptions = (void*) ffDestroyWeatherOptions, - .parseJsonObject = (void*) ffParseWeatherJsonObject, - .printModule = (void*) ffPrintWeather, - .generateJsonResult = (void*) ffGenerateWeatherJsonResult, - .generateJsonConfig = (void*) ffGenerateWeatherJsonConfig, - .formatArgs = FF_FORMAT_ARG_LIST(((FFModuleFormatArg[]) { - {"Weather result", "result"}, - })) -}; - void ffInitWeatherOptions(FFWeatherOptions* options) { - options->moduleInfo = ffWeatherModuleInfo; ffOptionInitModuleArg(&options->moduleArgs, "󰖙"); ffStrbufInit(&options->location); @@ -121,3 +106,17 @@ void ffDestroyWeatherOptions(FFWeatherOptions* options) ffStrbufDestroy(&options->outputFormat); } + +FFModuleBaseInfo ffWeatherModuleInfo = { + .name = FF_WEATHER_MODULE_NAME, + .description = "Print weather information", + .initOptions = (void*) ffInitWeatherOptions, + .destroyOptions = (void*) ffDestroyWeatherOptions, + .parseJsonObject = (void*) ffParseWeatherJsonObject, + .printModule = (void*) ffPrintWeather, + .generateJsonResult = (void*) ffGenerateWeatherJsonResult, + .generateJsonConfig = (void*) ffGenerateWeatherJsonConfig, + .formatArgs = FF_FORMAT_ARG_LIST(((FFModuleFormatArg[]) { + {"Weather result", "result"}, + })) +}; diff --git a/src/modules/weather/weather.h b/src/modules/weather/weather.h index 54c4bbde2..5b3c9739b 100644 --- a/src/modules/weather/weather.h +++ b/src/modules/weather/weather.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_WEATHER_MODULE_NAME "Weather" diff --git a/src/modules/wifi/option.h b/src/modules/wifi/option.h index 3628df69d..f74579267 100644 --- a/src/modules/wifi/option.h +++ b/src/modules/wifi/option.h @@ -1,13 +1,12 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFWifiOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFPercentageModuleConfig percent; } FFWifiOptions; + +static_assert(sizeof(FFWifiOptions) <= FF_OPTION_MAX_SIZE, "FFWifiOptions size exceeds maximum allowed size"); diff --git a/src/modules/wifi/wifi.c b/src/modules/wifi/wifi.c index f19e46f84..e7d411017 100644 --- a/src/modules/wifi/wifi.c +++ b/src/modules/wifi/wifi.c @@ -206,6 +206,18 @@ void ffGenerateWifiJsonResult(FF_MAYBE_UNUSED FFWifiOptions* options, yyjson_mut } } +void ffInitWifiOptions(FFWifiOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); + + options->percent = (FFPercentageModuleConfig) { 50, 20, 0 }; +} + +void ffDestroyWifiOptions(FFWifiOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffWifiModuleInfo = { .name = FF_WIFI_MODULE_NAME, .description = "Print connected Wi-Fi info (SSID, connection and security protocol)", @@ -231,16 +243,3 @@ FFModuleBaseInfo ffWifiModuleInfo = { {"Connection channel band in GHz", "band"}, })) }; - -void ffInitWifiOptions(FFWifiOptions* options) -{ - options->moduleInfo = ffWifiModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); - - options->percent = (FFPercentageModuleConfig) { 50, 20, 0 }; -} - -void ffDestroyWifiOptions(FFWifiOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/wifi/wifi.h b/src/modules/wifi/wifi.h index 4e517b1e2..0fcef5f1c 100644 --- a/src/modules/wifi/wifi.h +++ b/src/modules/wifi/wifi.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_WIFI_MODULE_NAME "Wifi" diff --git a/src/modules/wm/option.h b/src/modules/wm/option.h index b38ab7c3a..d213c9c3a 100644 --- a/src/modules/wm/option.h +++ b/src/modules/wm/option.h @@ -1,13 +1,12 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFWMOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; bool detectPlugin; } FFWMOptions; + +static_assert(sizeof(FFWMOptions) <= FF_OPTION_MAX_SIZE, "FFWMOptions size exceeds maximum allowed size"); diff --git a/src/modules/wm/wm.c b/src/modules/wm/wm.c index 0838f380b..6da7ea9d6 100644 --- a/src/modules/wm/wm.c +++ b/src/modules/wm/wm.c @@ -119,6 +119,17 @@ void ffGenerateWMJsonResult(FF_MAYBE_UNUSED FFWMOptions* options, yyjson_mut_doc yyjson_mut_obj_add_strbuf(doc, obj, "version", &version); } +void ffInitWMOptions(FFWMOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, ""); + options->detectPlugin = false; +} + +void ffDestroyWMOptions(FFWMOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffWMModuleInfo = { .name = FF_WM_MODULE_NAME, .description = "Print window manager name and version", @@ -136,15 +147,3 @@ FFModuleBaseInfo ffWMModuleInfo = { {"WM version", "version"}, })) }; - -void ffInitWMOptions(FFWMOptions* options) -{ - options->moduleInfo = ffWMModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, ""); - options->detectPlugin = false; -} - -void ffDestroyWMOptions(FFWMOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/wm/wm.h b/src/modules/wm/wm.h index 181fa9360..5b6556806 100644 --- a/src/modules/wm/wm.h +++ b/src/modules/wm/wm.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_WM_MODULE_NAME "WM" diff --git a/src/modules/wmtheme/option.h b/src/modules/wmtheme/option.h index b2b9fc5a8..b12f9f8b3 100644 --- a/src/modules/wmtheme/option.h +++ b/src/modules/wmtheme/option.h @@ -1,11 +1,10 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" typedef struct FFWMThemeOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; } FFWMThemeOptions; + +static_assert(sizeof(FFWMThemeOptions) <= FF_OPTION_MAX_SIZE, "FFWMThemeOptions size exceeds maximum allowed size"); diff --git a/src/modules/wmtheme/wmtheme.c b/src/modules/wmtheme/wmtheme.c index d10adc73b..d7e4178dc 100644 --- a/src/modules/wmtheme/wmtheme.c +++ b/src/modules/wmtheme/wmtheme.c @@ -62,6 +62,16 @@ void ffGenerateWMThemeJsonResult(FF_MAYBE_UNUSED FFWMThemeOptions* options, yyjs yyjson_mut_obj_add_strbuf(doc, module, "result", &themeOrError); } +void ffInitWMThemeOptions(FFWMThemeOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󰓸"); +} + +void ffDestroyWMThemeOptions(FFWMThemeOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffWMThemeModuleInfo = { .name = FF_WMTHEME_MODULE_NAME, .description = "Print current theme of window manager", @@ -75,14 +85,3 @@ FFModuleBaseInfo ffWMThemeModuleInfo = { {"WM theme", "result"}, })) }; - -void ffInitWMThemeOptions(FFWMThemeOptions* options) -{ - options->moduleInfo = ffWMThemeModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󰓸"); -} - -void ffDestroyWMThemeOptions(FFWMThemeOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/wmtheme/wmtheme.h b/src/modules/wmtheme/wmtheme.h index 354e72728..e3bad8ee0 100644 --- a/src/modules/wmtheme/wmtheme.h +++ b/src/modules/wmtheme/wmtheme.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_WMTHEME_MODULE_NAME "WMTheme" diff --git a/src/modules/zpool/option.h b/src/modules/zpool/option.h index ac4f8ff3f..49522b3be 100644 --- a/src/modules/zpool/option.h +++ b/src/modules/zpool/option.h @@ -1,14 +1,13 @@ #pragma once -// This file will be included in "fastfetch.h", do NOT put unnecessary things here - #include "common/option.h" #include "common/percent.h" typedef struct FFZpoolOptions { - FFModuleBaseInfo moduleInfo; FFModuleArgs moduleArgs; FFPercentageModuleConfig percent; } FFZpoolOptions; + +static_assert(sizeof(FFZpoolOptions) <= FF_OPTION_MAX_SIZE, "FFZpoolOptions size exceeds maximum allowed size"); diff --git a/src/modules/zpool/zpool.c b/src/modules/zpool/zpool.c index 49a6928c0..5b6eecf9f 100644 --- a/src/modules/zpool/zpool.c +++ b/src/modules/zpool/zpool.c @@ -164,6 +164,17 @@ void ffGenerateZpoolJsonResult(FF_MAYBE_UNUSED FFZpoolOptions* options, yyjson_m } } +void ffInitZpoolOptions(FFZpoolOptions* options) +{ + ffOptionInitModuleArg(&options->moduleArgs, "󱑛"); + options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; +} + +void ffDestroyZpoolOptions(FFZpoolOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + FFModuleBaseInfo ffZpoolModuleInfo = { .name = FF_ZPOOL_MODULE_NAME, .description = "Print ZFS storage pools", @@ -184,15 +195,3 @@ FFModuleBaseInfo ffZpoolModuleInfo = { {"Fragmentation percentage bar", "fragmentation-percentage-bar"}, })) }; - -void ffInitZpoolOptions(FFZpoolOptions* options) -{ - options->moduleInfo = ffZpoolModuleInfo; - ffOptionInitModuleArg(&options->moduleArgs, "󱑛"); - options->percent = (FFPercentageModuleConfig) { 50, 80, 0 }; -} - -void ffDestroyZpoolOptions(FFZpoolOptions* options) -{ - ffOptionDestroyModuleArg(&options->moduleArgs); -} diff --git a/src/modules/zpool/zpool.h b/src/modules/zpool/zpool.h index bdc88ba90..7f282f253 100644 --- a/src/modules/zpool/zpool.h +++ b/src/modules/zpool/zpool.h @@ -1,6 +1,6 @@ #pragma once -#include "fastfetch.h" +#include "option.h" #define FF_ZPOOL_MODULE_NAME "Zpool" diff --git a/src/options/display.h b/src/options/display.h index 9fbe33d14..4193cd2c6 100644 --- a/src/options/display.h +++ b/src/options/display.h @@ -1,5 +1,6 @@ #pragma once +#include "common/percent.h" #include "util/FFstrbuf.h" typedef enum __attribute__((__packed__)) FFSizeBinaryPrefixType diff --git a/src/options/modules.c b/src/options/modules.c deleted file mode 100644 index 755f65a87..000000000 --- a/src/options/modules.c +++ /dev/null @@ -1,156 +0,0 @@ -#include "fastfetch.h" -#include "modules/modules.h" - -void ffOptionsInitModules(FFOptionsModules* options) -{ - ffInitBatteryOptions(&options->battery); - ffInitBiosOptions(&options->bios); - ffInitBluetoothOptions(&options->bluetooth); - ffInitBluetoothRadioOptions(&options->bluetoothRadio); - ffInitBoardOptions(&options->board); - ffInitBootmgrOptions(&options->bootmgr); - ffInitBreakOptions(&options->break_); - ffInitBrightnessOptions(&options->brightness); - ffInitBtrfsOptions(&options->btrfs); - ffInitCameraOptions(&options->camera); - ffInitCPUOptions(&options->cpu); - ffInitCPUUsageOptions(&options->cpuUsage); - ffInitCPUCacheOptions(&options->cpuCache); - ffInitChassisOptions(&options->chassis); - ffInitColorsOptions(&options->colors); - ffInitCommandOptions(&options->command); - ffInitCursorOptions(&options->cursor); - ffInitCustomOptions(&options->custom); - ffInitDEOptions(&options->de); - ffInitDateTimeOptions(&options->dateTime); - ffInitDiskOptions(&options->disk); - ffInitDiskIOOptions(&options->diskIo); - ffInitDisplayOptions(&options->display); - ffInitDNSOptions(&options->dns); - ffInitEditorOptions(&options->editor); - ffInitFontOptions(&options->font); - ffInitGPUOptions(&options->gpu); - ffInitGamepadOptions(&options->gamepad); - ffInitHostOptions(&options->host); - ffInitIconsOptions(&options->icons); - ffInitInitSystemOptions(&options->initSystem); - ffInitKernelOptions(&options->kernel); - ffInitKeyboardOptions(&options->keyboard); - ffInitLMOptions(&options->lm); - ffInitLoadavgOptions(&options->loadavg); - ffInitLocalIpOptions(&options->localIP); - ffInitLocaleOptions(&options->locale); - ffInitMediaOptions(&options->media); - ffInitMemoryOptions(&options->memory); - ffInitMonitorOptions(&options->monitor); - ffInitMouseOptions(&options->mouse); - ffInitNetIOOptions(&options->netIo); - ffInitOSOptions(&options->os); - ffInitOpenCLOptions(&options->openCL); - ffInitOpenGLOptions(&options->openGL); - ffInitPackagesOptions(&options->packages); - ffInitPhysicalDiskOptions(&options->physicalDisk); - ffInitPhysicalMemoryOptions(&options->physicalMemory); - ffInitPlayerOptions(&options->player); - ffInitPowerAdapterOptions(&options->powerAdapter); - ffInitProcessesOptions(&options->processes); - ffInitPublicIpOptions(&options->publicIP); - ffInitSeparatorOptions(&options->separator); - ffInitShellOptions(&options->shell); - ffInitSoundOptions(&options->sound); - ffInitSwapOptions(&options->swap); - ffInitTerminalOptions(&options->terminal); - ffInitTerminalFontOptions(&options->terminalFont); - ffInitTerminalSizeOptions(&options->terminalSize); - ffInitTerminalThemeOptions(&options->terminalTheme); - ffInitThemeOptions(&options->theme); - ffInitTitleOptions(&options->title); - ffInitTPMOptions(&options->tpm); - ffInitUptimeOptions(&options->uptime); - ffInitUsersOptions(&options->users); - ffInitVersionOptions(&options->version); - ffInitVulkanOptions(&options->vulkan); - ffInitWMOptions(&options->wm); - ffInitWMThemeOptions(&options->wmTheme); - ffInitWallpaperOptions(&options->wallpaper); - ffInitWeatherOptions(&options->weather); - ffInitWifiOptions(&options->wifi); - ffInitZpoolOptions(&options->zpool); -} - -void ffOptionsDestroyModules(FFOptionsModules* options) -{ - ffDestroyBatteryOptions(&options->battery); - ffDestroyBiosOptions(&options->bios); - ffDestroyBluetoothOptions(&options->bluetooth); - ffDestroyBluetoothRadioOptions(&options->bluetoothRadio); - ffDestroyBoardOptions(&options->board); - ffDestroyBootmgrOptions(&options->bootmgr); - ffDestroyBreakOptions(&options->break_); - ffDestroyBrightnessOptions(&options->brightness); - ffDestroyBtrfsOptions(&options->btrfs); - ffDestroyCameraOptions(&options->camera); - ffDestroyCPUOptions(&options->cpu); - ffDestroyCPUCacheOptions(&options->cpuCache); - ffDestroyCPUUsageOptions(&options->cpuUsage); - ffDestroyChassisOptions(&options->chassis); - ffDestroyColorsOptions(&options->colors); - ffDestroyCommandOptions(&options->command); - ffDestroyCursorOptions(&options->cursor); - ffDestroyCustomOptions(&options->custom); - ffDestroyDEOptions(&options->de); - ffDestroyDateTimeOptions(&options->dateTime); - ffDestroyDiskOptions(&options->disk); - ffDestroyDiskIOOptions(&options->diskIo); - ffDestroyDisplayOptions(&options->display); - ffDestroyDNSOptions(&options->dns); - ffDestroyEditorOptions(&options->editor); - ffDestroyFontOptions(&options->font); - ffDestroyGPUOptions(&options->gpu); - ffDestroyGamepadOptions(&options->gamepad); - ffDestroyHostOptions(&options->host); - ffDestroyIconsOptions(&options->icons); - ffDestroyInitSystemOptions(&options->initSystem); - ffDestroyKernelOptions(&options->kernel); - ffDestroyKeyboardOptions(&options->keyboard); - ffDestroyLMOptions(&options->lm); - ffDestroyLoadavgOptions(&options->loadavg); - ffDestroyLocalIpOptions(&options->localIP); - ffDestroyLocaleOptions(&options->locale); - ffDestroyMediaOptions(&options->media); - ffDestroyMemoryOptions(&options->memory); - ffDestroyMonitorOptions(&options->monitor); - ffDestroyMouseOptions(&options->mouse); - ffDestroyNetIOOptions(&options->netIo); - ffDestroyOSOptions(&options->os); - ffDestroyOpenCLOptions(&options->openCL); - ffDestroyOpenGLOptions(&options->openGL); - ffDestroyPhysicalDiskOptions(&options->physicalDisk); - ffDestroyPhysicalMemoryOptions(&options->physicalMemory); - ffDestroyPackagesOptions(&options->packages); - ffDestroyPlayerOptions(&options->player); - ffDestroyPowerAdapterOptions(&options->powerAdapter); - ffDestroyProcessesOptions(&options->processes); - ffDestroyPublicIpOptions(&options->publicIP); - ffDestroySeparatorOptions(&options->separator); - ffDestroyShellOptions(&options->shell); - ffDestroySoundOptions(&options->sound); - ffDestroySwapOptions(&options->swap); - ffDestroyTerminalOptions(&options->terminal); - ffDestroyTerminalFontOptions(&options->terminalFont); - ffDestroyTerminalSizeOptions(&options->terminalSize); - ffDestroyTerminalThemeOptions(&options->terminalTheme); - ffDestroyThemeOptions(&options->theme); - ffDestroyTitleOptions(&options->title); - ffDestroyTPMOptions(&options->tpm); - ffDestroyUptimeOptions(&options->uptime); - ffDestroyUsersOptions(&options->users); - ffDestroyVersionOptions(&options->version); - ffDestroyVulkanOptions(&options->vulkan); - ffDestroyWMOptions(&options->wm); - ffDestroyWMThemeOptions(&options->wmTheme); - ffDestroyWallpaperOptions(&options->wallpaper); - ffDestroyWeatherOptions(&options->weather); - ffDestroyWifiOptions(&options->wifi); - ffDestroyZpoolOptions(&options->zpool); -} diff --git a/src/options/modules.h b/src/options/modules.h deleted file mode 100644 index 4ff82f972..000000000 --- a/src/options/modules.h +++ /dev/null @@ -1,83 +0,0 @@ -#pragma once - -#include "modules/options.h" - -typedef struct FFOptionsModules -{ - FFBatteryOptions battery; - FFBiosOptions bios; - FFBluetoothOptions bluetooth; - FFBluetoothRadioOptions bluetoothRadio; - FFBoardOptions board; - FFBootmgrOptions bootmgr; - FFBreakOptions break_; - FFBrightnessOptions brightness; - FFBtrfsOptions btrfs; - FFCPUOptions cpu; - FFCPUCacheOptions cpuCache; - FFCPUUsageOptions cpuUsage; - FFCameraOptions camera; - FFChassisOptions chassis; - FFColorsOptions colors; - FFCommandOptions command; - FFCursorOptions cursor; - FFCustomOptions custom; - FFDEOptions de; - FFDateTimeOptions dateTime; - FFDiskOptions disk; - FFDiskIOOptions diskIo; - FFDisplayOptions display; - FFDNSOptions dns; - FFEditorOptions editor; - FFFontOptions font; - FFGPUOptions gpu; - FFGamepadOptions gamepad; - FFHostOptions host; - FFIconsOptions icons; - FFInitSystemOptions initSystem; - FFKernelOptions kernel; - FFKeyboardOptions keyboard; - FFLMOptions lm; - FFLoadavgOptions loadavg; - FFLocalIpOptions localIP; - FFLocaleOptions locale; - FFMediaOptions media; - FFMemoryOptions memory; - FFMonitorOptions monitor; - FFMouseOptions mouse; - FFNetIOOptions netIo; - FFOSOptions os; - FFOpenCLOptions openCL; - FFOpenGLOptions openGL; - FFPackagesOptions packages; - FFPhysicalDiskOptions physicalDisk; - FFPhysicalMemoryOptions physicalMemory; - FFPlayerOptions player; - FFPowerAdapterOptions powerAdapter; - FFProcessesOptions processes; - FFPublicIpOptions publicIP; - FFSeparatorOptions separator; - FFShellOptions shell; - FFSoundOptions sound; - FFSwapOptions swap; - FFTerminalOptions terminal; - FFTerminalFontOptions terminalFont; - FFTerminalSizeOptions terminalSize; - FFTerminalThemeOptions terminalTheme; - FFThemeOptions theme; - FFTitleOptions title; - FFTPMOptions tpm; - FFUptimeOptions uptime; - FFUsersOptions users; - FFVersionOptions version; - FFVulkanOptions vulkan; - FFWMOptions wm; - FFWMThemeOptions wmTheme; - FFWallpaperOptions wallpaper; - FFWeatherOptions weather; - FFWifiOptions wifi; - FFZpoolOptions zpool; -} FFOptionsModules; - -void ffOptionsInitModules(FFOptionsModules* options); -void ffOptionsDestroyModules(FFOptionsModules* options); From e753d4d3a49b6363fe8b7d3cf6baddef4fb1a99d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 4 Aug 2025 15:08:30 +0800 Subject: [PATCH 27/83] Doc: remove command line flags of modules --- src/data/help.json | 901 --------------------------------------------- src/fastfetch.c | 5 +- 2 files changed, 3 insertions(+), 903 deletions(-) diff --git a/src/data/help.json b/src/data/help.json index 7a5ba4ec1..f13d48e81 100644 --- a/src/data/help.json +++ b/src/data/help.json @@ -898,906 +898,5 @@ } } } - ], - "Module specific": [ - { - "long": "title-fqdn", - "desc": "Specify whether the title should use fully qualified domain name", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "title-color-user", - "desc": "Set the color of the user name (left part)", - "remark": "See `-h color` for the list of available colors", - "arg": { - "type": "color", - "default": "Use color of \"--color-title\"" - } - }, - { - "long": "title-color-at", - "desc": "Set the color of the @ symbol (middle part)", - "remark": "See `-h color` for the list of available colors", - "arg": { - "type": "color", - "default": "Use color of \"--color-title\"" - } - }, - { - "long": "title-color-host", - "desc": "Set the color of the host name (right part)", - "remark": "See `-h color` for the list of available colors", - "arg": { - "type": "color", - "default": "default" - } - }, - { - "long": "separator-string", - "desc": "Set the string to be printed by the separator line", - "arg": { - "type": "str", - "default": "-" - } - }, - { - "long": "separator-output-color", - "desc": "Set the color of the separator line", - "arg": { - "type": "color", - "default": "default" - } - }, - { - "long": "separator-length", - "desc": "Set the length of the separator line", - "remark": "Set to 0 to automatically calculate it based on the title length", - "arg": { - "type": "num", - "default": "0" - } - }, - { - "long": "disk-folders", - "desc": "A colon (semicolon on Windows) separated list of folder paths to detect", - "remark": "On Windows, a drive letter must be upper-cased and end with \"\\\". \"/\" is used as an alias of the system drive. This option overrides other disk-show-* options", - "arg": { - "type": "path", - "default": "Auto detection using mount-points" - } - }, - { - "long": "disk-hide-folders", - "desc": "A colon (semicolon on Windows) separated list of folder paths to hide from the disk output", - "arg": { - "type": "path", - "default": "/efi:/boot:/boot/efi:/boot/firmware" - } - }, - { - "long": "disk-hide-fs", - "desc": "A colon separated list of file systems to hide from the disk output", - "arg": { - "type": "string", - "default": "" - } - }, - { - "long": "disk-show-regular", - "desc": "Specify whether regular volumes should be displayed", - "arg": { - "type": "bool", - "optional": true, - "default": true - } - }, - { - "long": "disk-show-external", - "desc": "Specify whether external volumes should be displayed", - "arg": { - "type": "bool", - "optional": true, - "default": true - } - }, - { - "long": "disk-show-hidden", - "desc": "Specify whether hidden volumes should be displayed", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "disk-show-subvolumes", - "desc": "Specify whether subvolumes should be displayed", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "disk-show-readonly", - "desc": "Specify whether read-only volumes should be displayed", - "arg": { - "type": "bool", - "optional": true, - "default": true - } - }, - { - "long": "disk-show-unknown", - "desc": "Specify whether unknown volumes (unable to detect sizes) should be displayed", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "disk-use-available", - "desc": "Use f_bavail (lpFreeBytesAvailableToCaller for Windows) instead of f_bfree to calculate used bytes", - "remark": "May be required for macOS to display correct results", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "diskio-detect-total", - "desc": "Detect total bytes instead of current rate", - "arg": { - "type": "bool", - "default": false - } - }, - { - "long": "diskio-name-prefix", - "desc": "Show only disks with the given name prefix", - "arg": { - "type": "str" - } - }, - { - "long": "diskio-wait-time", - "desc": "Set the wait time (in ms) when detecting disk usage", - "arg": { - "type": "num", - "default": 1000 - } - }, - { - "long": "physicaldisk-name-prefix", - "desc": "Show only disks with the given name prefix", - "arg": { - "type": "str" - } - }, - { - "long": "physicaldisk-temp", - "desc": "Detect and display SSD temperature if supported", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "bluetooth-show-disconnected", - "desc": "Specify whether disconnected Bluetooth devices should be displayed", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "packages-disabled", - "desc": "A colon-separated list of package managers to disable when detecting", - "remark": [ - "Some detection methods can be very slow.", - "You may need to increase the value of '--processing-timeout' to make it work properly.", - "Use `--packages-disabled none` to enable all." - ], - "arg": { - "type": "string", - "default": "winget" - } - }, - { - "long": "packages-combined", - "desc": "Whether to combine related package managers into single counts", - "remark": "e.g., nix-system + nix-user = nix", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "display-compact-type", - "desc": "Specify whether all displays should be printed in one line", - "arg": { - "type": "enum", - "enum": { - "none": "Disable this compact mode", - "original": "Print original resolutions", - "scaled": "Print scaled resolutions", - "original-with-refresh-rate": "Print original resolutions with refresh rate", - "scaled-with-refresh-rate": "Print scaled resolutions with refresh rate" - }, - "default": "none" - } - }, - { - "long": "display-precise-refresh-rate", - "desc": "Specify whether decimal refresh rates should not be rounded to integers when printing", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "display-order", - "desc": "Set the order to use when printing displays", - "arg": { - "type": "enum", - "enum": { - "none": "Use the detected order", - "asc": "Sort by display name in ascending order", - "desc": "Sort by display name in descending order" - }, - "default": "none" - } - }, - { - "long": "brightness-ddcci-sleep", - "desc": "Set the sleep time (in ms) when sending DDC/CI requests", - "remark": "See for details", - "arg": { - "type": "num", - "default": 10 - } - }, - { - "long": "brightness-compact", - "desc": "Specify whether multiple results should be printed in one line", - "arg": { - "type": "bool", - "default": false - } - }, - { - "long": "sound-type", - "desc": "Set which types of sound devices should be displayed", - "arg": { - "type": "enum", - "enum": { - "main": "Print only main sound devices", - "active": "Print only active sound devices", - "all": "Print all sound devices" - }, - "default": "main" - } - }, - { - "long": "battery-use-setup-api", - "desc": "Specify whether \"SetupAPI\" should be used on Windows to detect battery info", - "remark": [ - "SetupAPI supports multiple batteries, but is slower.", - "Windows only" - ], - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "cpu-temp", - "desc": "Detect and display CPU temperature if supported", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "cpu-show-pe-core-count", - "desc": "Detect and display CPU frequency of different core types (e.g., P-cores and E-cores) if supported", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "cpucache-compact", - "desc": "Show all CPU caches in one line", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "cpuusage-separate", - "desc": "Display CPU usage per logical core, instead of an average result", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "cpuusage-wait-time", - "desc": "Set the wait time (in ms) when detecting CPU usage", - "arg": { - "type": "num", - "default": 200 - } - }, - { - "long": "de-slow-version-detection", - "desc": "Specify whether DE version should be detected with slower operations", - "remark": [ - "This is only used as a fallback method. Please file a bug report if you encounter any issues.", - "Linux only" - ], - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "gpu-temp", - "desc": "Detect and display GPU temperature if supported", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "gpu-driver-specific", - "desc": "Use driver-specific methods to detect more detailed GPU information (memory usage, core count, etc.)", - "remark": "Requires the latest GPU drivers to be installed.", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "gpu-detection-method", - "desc": "Force using a specified method to detect GPUs", - "remark": "Will fall back to other methods if the specified method fails", - "arg": { - "type": "enum", - "enum": { - "auto": "Query platform-specific graphics APIs. Requires proper GPU drivers to be installed. Supported on Linux, FreeBSD, Windows and macOS", - "pci": "Search PCI devices, which does not require GPU drivers to be installed. Not supported on Windows and macOS", - "vulkan": "Use Vulkan API. Slow and requires proper Vulkan drivers to be installed. Used for Android", - "opencl": "Use OpenCL API. Slow and requires proper OpenCL drivers to be installed", - "opengl": "Use OpenGL API. Slow and only detects one GPU. Used for OpenBSD" - }, - "default": "auto" - } - }, - { - "long": "gpu-hide-type", - "desc": "Specify which types of GPUs should not be displayed (default: all GPUs are shown, regardless of recognition)", - "arg": { - "type": "enum", - "enum": { - "integrated": "Hide integrated GPUs", - "discrete": "Hide discrete GPUs", - "unknown": "Hide unknown (unrecognized) GPUs", - "none": "Do not hide any GPUs" - }, - "default": "none" - } - }, - { - "long": "battery-temp", - "desc": "Detect and display battery temperature if supported", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "loadavg-ndigits", - "desc": "Set the number of digits to keep after the decimal point when printing load average", - "arg": { - "type": "num", - "default": 2 - } - }, - { - "long": "loadavg-compact", - "desc": "Show load average values in one line", - "arg": { - "type": "bool", - "optional": true, - "default": true - } - }, - { - "long": "localip-show-ipv4", - "desc": "Show IPv4 addresses in the local IP module", - "arg": { - "type": "bool", - "optional": true, - "default": true - } - }, - { - "long": "localip-show-ipv6", - "desc": "Show IPv6 addresses in the local IP module", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "localip-show-mac", - "desc": "Show MAC addresses in the local IP module", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "localip-show-loop", - "desc": "Show loopback addresses (127.0.0.1) in the local IP module", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "localip-show-mtu", - "desc": "Show network interface MTU (Maximum Transmission Unit) size in bytes", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "localip-show-speed", - "desc": "Show network interface link speed in human-readable format (or as a 1Mb units integer in JSON format)", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "localip-show-prefix-len", - "desc": "Show network prefix length (/N) in the local IP module", - "arg": { - "type": "bool", - "optional": true, - "default": true - } - }, - { - "long": "localip-name-prefix", - "desc": "Show only interfaces with the given interface name prefix", - "arg": { - "type": "str" - } - }, - { - "long": "localip-default-route-only", - "desc": "Show only the interface that is used for default routing", - "remark": "Doesn't work on Android", - "arg": { - "type": "bool", - "optional": true, - "default": true - } - }, - { - "long": "localip-show-all-ips", - "desc": "Show all IPs bound to the same interface. By default, only the first IP is shown", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "localip-show-flags", - "desc": "Show network interface flags in the local IP module", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "localip-compact", - "desc": "Show all IPs in one line", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "dns-show-type", - "desc": "Specify which types of DNS servers should be detected", - "arg": { - "type": "enum", - "enum": { - "ipv4": "Show IPv4 addresses only", - "ipv6": "Show IPv6 addresses only", - "both": "Show both IPv4 and IPv6 addresses" - }, - "default": "both" - } - }, - { - "long": "netio-name-prefix", - "desc": "Show only interfaces with the given name prefix", - "arg": { - "type": "str" - } - }, - { - "long": "netio-default-route-only", - "desc": "Show only the interface that is used for default routing", - "remark": "Doesn't work on Android", - "arg": { - "type": "bool", - "optional": true, - "default": true - } - }, - { - "long": "netio-detect-total", - "desc": "Detect total bytes instead of current rate", - "arg": { - "type": "bool", - "default": false - } - }, - { - "long": "netio-wait-time", - "desc": "Set the wait time (in ms) when detecting network usage", - "arg": { - "type": "num", - "default": 1000 - } - }, - { - "long": "publicip-timeout", - "desc": "Time in milliseconds to wait for the public IP server to respond", - "remark": "0 to disable timeout", - "arg": { - "type": "num", - "default": 0 - } - }, - { - "long": "publicip-url", - "desc": "The URL of the public IP detection server to use", - "arg": { - "type": "str" - } - }, - { - "long": "publicip-ipv6", - "desc": "Specify whether to use IPv6 for the public IP detection server", - "arg": { - "type": "bool", - "default": false - } - }, - { - "long": "weather-location", - "desc": "Set the location to use", - "remark": "Must be URI encoded (e.g., a whitespace must be encoded as \"+\")", - "arg": { - "type": "str" - } - }, - { - "long": "weather-timeout", - "desc": "Time in milliseconds to wait for the weather server to respond", - "remark": "0 to disable timeout", - "arg": { - "type": "num", - "default": 0 - } - }, - { - "long": "weather-output-format", - "desc": "The output weather format to use", - "remark": "Must be URI encoded", - "arg": { - "type": "str" - } - }, - { - "long": "wm-detect-plugin", - "desc": "Specify whether window manager plugins should be detected on supported platforms", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "users-compact", - "desc": "Show all active users in one line", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "users-myself-only", - "desc": "Show only the current user", - "arg": { - "type": "bool", - "optional": true, - "default": false - } - }, - { - "long": "player-name", - "desc": "The name of the player to use for the Media and Player modules", - "remark": "Linux only", - "arg": { - "type": "str" - } - }, - { - "long": "opengl-library", - "desc": "Set the OpenGL context creation library to use", - "arg": { - "type": "enum", - "enum": { - "auto": "Prefer EGL on *nix; prefer platform-specific implementation on others", - "egl": "EGL", - "glx": "GLX (*nix only)" - }, - "default": "auto" - } - }, - { - "long": "command-shell", - "desc": "Set the shell program to execute the command text", - "arg": { - "type": "str", - "default": "\"cmd\" for Windows; \"/bin/sh\" for *nix" - } - }, - { - "long": "command-param", - "desc": "Set the parameter to use when starting the shell", - "remark": "If set to an empty string, it will be ignored", - "arg": { - "type": "str", - "default": "\"/c\" for Windows; \"-c\" for *nix" - } - }, - { - "long": "command-key", - "desc": "Set the module key to display", - "arg": { - "type": "str" - } - }, - { - "long": "command-text", - "desc": "Set the command text to execute", - "arg": { - "type": "str" - } - }, - { - "long": "colors-symbol", - "desc": "Set the symbol to be printed by the Colors module", - "arg": { - "type": "enum", - "enum": { - "block": "\u2588\u2588\u2588", - "background": "(whitespaces with background)", - "circle": "\u25cf", - "diamond": "\u25c6", - "triangle": "\u25b2", - "square": "\u25a0", - "star": "\u2605" - }, - "default": "background" - } - }, - { - "long": "colors-padding-left", - "desc": "Set the number of white spaces to print before the symbol", - "arg": { - "type": "num", - "default": 0 - } - }, - { - "long": "colors-block-width", - "desc": "Set the block width in spaces", - "arg": { - "type": "num", - "default": 3 - } - }, - { - "long": "colors-block-range-start", - "desc": "Set the start range of colors in the blocks to print", - "remark": [ - "Display colors 0-15 in the blocks. (16 colors)", - "Display colors 0-7 in the blocks. (8 colors)", - "Only works for `--colors-symbol block`.", - "Must be in range 0-15", - "See also `--colors-range-end`" - ], - "arg": { - "type": "num", - "default": 0 - } - }, - { - "long": "colors-block-range-end", - "desc": "Set the end range of colors in the blocks to print", - "remark": [ - "Display colors 0-15 in the blocks. (16 colors)", - "Display colors 0-7 in the blocks. (8 colors)", - "Only works for `--colors-symbol block`.", - "Must be in range 0-15", - "See also `--colors-range-start`" - ], - "arg": { - "type": "num", - "default": 15 - } - } - ], - "General module": [ - { - "long": "-format", - "desc": [ - "Set the format string to use for a specific module", - "See ", - "For help about a specific format string, use \"fastfetch -h -format\"" - ], - "arg": { - "type": "format" - }, - "pseudo": true - }, - { - "long": "-key", - "desc": [ - "Set the key to use for a specific module.", - "For modules that print multiple lines, the string is parsed", - "as a format string with the index as the first character" - ], - "arg": { - "type": "key" - }, - "pseudo": true - }, - { - "long": "-key-color", - "desc": "Override the global \"--color-keys\" option for a specific module", - "arg": { - "type": "color" - }, - "pseudo": true - }, - { - "long": "-key-icon", - "desc": "Set the icon to be displayed by \"--key-type icon\"", - "arg": { - "type": "string" - }, - "pseudo": true - }, - { - "long": "-output-color", - "desc": "Override the global \"--color-output\" option for a specific module", - "arg": { - "type": "color" - }, - "pseudo": true - }, - { - "long": "-key-width", - "desc": "Override the global \"--key-width\" option for a specific module", - "arg": { - "type": "num" - }, - "pseudo": true - }, - { - "long": "-percent-green", - "desc": [ - "Threshold for percentage color ranges", - "Values less than percent-green will be shown in green" - ], - "arg": { - "type": "num" - }, - "pseudo": true - }, - { - "long": "-percent-yellow", - "desc": [ - "Threshold for percentage color ranges", - "Values greater than percent-green and less than percent-yellow will be shown in yellow", - "Values greater than percent-yellow will be shown in red" - ], - "arg": { - "type": "num" - }, - "pseudo": true - }, - { - "long": "-percent-type", - "desc": "Set the percentage output type", - "remark": [ - "0 to use global `--percent-type` value", - "1 for percentage number", - "2 for multi-color bar", - "3 for both", - "6 for bar only", - "9 for colored number", - "10 for monochrome bar" - ], - "arg": { - "type": "num", - "default": 0 - }, - "pseudo": true - }, - { - "long": "-temp-green", - "desc": [ - "Threshold for temperature color ranges", - "Values less than temp-green will be shown in green" - ], - "arg": { - "type": "num" - }, - "pseudo": true - }, - { - "long": "-temp-yellow", - "desc": [ - "Threshold for temperature color ranges", - "Values greater than temp-green and less than temp-yellow will be shown in yellow", - "Values greater than temp-yellow will be shown in red" - ], - "arg": { - "type": "num" - }, - "pseudo": true - } ] } diff --git a/src/fastfetch.c b/src/fastfetch.c index 43cfd911d..d4b437c8d 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -183,10 +183,11 @@ static void printFullHelp() yyjson_doc_free(doc); puts("\n\ -Parsing is not case sensitive. E.g. `--print-logos` is equal to `--Print-Logos`\n\ +Command flags are not case sensitive. E.g. `--print-logos` is equal to `--Print-Logos`\n\ If a value starts with a ?, it is optional. An optional boolean value defaults to true if not specified.\n\ More detailed help messages for each options can be printed with `-h `\n\ -All options can be made permanent with command `fastfetch --gen-config`"); +For detailed information on logo options, module configuration, and formatting, visit:\n\ + https://github.com/fastfetch-cli/fastfetch/wiki/Configuration"); } static bool printSpecificCommandHelp(const char* command) From fa4e11c73bcf421c63b918801b56049b7765cc6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 4 Aug 2025 16:46:28 +0800 Subject: [PATCH 28/83] JsonConfig: write all flags when generating config file --- doc/json_schema.json | 53 ++- src/common/jsonconfig.c | 14 +- src/common/jsonconfig.h | 2 +- src/common/percent.c | 14 +- src/common/percent.h | 4 +- src/common/temps.c | 19 +- src/common/temps.h | 2 +- src/modules/battery/battery.c | 11 +- src/modules/bios/bios.c | 5 +- src/modules/bluetooth/bluetooth.c | 10 +- src/modules/bluetoothradio/bluetoothradio.c | 5 +- src/modules/board/board.c | 5 +- src/modules/bootmgr/bootmgr.c | 5 +- src/modules/brightness/brightness.c | 13 +- src/modules/btrfs/btrfs.c | 7 +- src/modules/camera/camera.c | 5 +- src/modules/chassis/chassis.c | 5 +- src/modules/colors/colors.c | 44 +-- src/modules/command/command.c | 14 +- src/modules/cpu/cpu.c | 10 +- src/modules/cpucache/cpucache.c | 5 +- src/modules/cpuusage/cpuusage.c | 10 +- src/modules/cursor/cursor.c | 5 +- src/modules/custom/custom.c | 5 +- src/modules/datetime/datetime.c | 5 +- src/modules/de/de.c | 8 +- src/modules/disk/disk.c | 40 +- src/modules/diskio/diskio.c | 11 +- src/modules/display/display.c | 56 +-- src/modules/dns/dns.c | 33 +- src/modules/editor/editor.c | 5 +- src/modules/font/font.c | 5 +- src/modules/gamepad/gamepad.c | 7 +- src/modules/gpu/gpu.c | 76 ++-- src/modules/gpu/option.h | 1 - src/modules/host/host.c | 5 +- src/modules/icons/icons.c | 5 +- src/modules/initsystem/initsystem.c | 5 +- src/modules/kernel/kernel.c | 5 +- src/modules/keyboard/keyboard.c | 5 +- src/modules/lm/lm.c | 5 +- src/modules/loadavg/loadavg.c | 13 +- src/modules/locale/locale.c | 5 +- src/modules/localip/localip.c | 44 +-- src/modules/media/media.c | 5 +- src/modules/memory/memory.c | 7 +- src/modules/monitor/monitor.c | 5 +- src/modules/mouse/mouse.c | 5 +- src/modules/netio/netio.c | 14 +- src/modules/opencl/opencl.c | 5 +- src/modules/opengl/opengl.c | 28 +- src/modules/os/os.c | 5 +- src/modules/packages/packages.c | 84 ++--- src/modules/physicaldisk/physicaldisk.c | 10 +- src/modules/physicalmemory/physicalmemory.c | 5 +- src/modules/player/player.c | 5 +- src/modules/poweradapter/poweradapter.c | 5 +- src/modules/processes/processes.c | 5 +- src/modules/publicip/publicip.c | 14 +- src/modules/separator/separator.c | 8 +- src/modules/shell/shell.c | 5 +- src/modules/sound/sound.c | 30 +- src/modules/swap/swap.c | 8 +- src/modules/terminal/terminal.c | 5 +- src/modules/terminalfont/terminalfont.c | 5 +- src/modules/terminalsize/terminalsize.c | 5 +- src/modules/terminaltheme/terminaltheme.c | 5 +- src/modules/theme/theme.c | 5 +- src/modules/title/title.c | 25 +- src/modules/tpm/tpm.c | 5 +- src/modules/uptime/uptime.c | 5 +- src/modules/users/users.c | 11 +- src/modules/version/version.c | 5 +- src/modules/vulkan/vulkan.c | 5 +- src/modules/wallpaper/wallpaper.c | 5 +- src/modules/weather/weather.c | 14 +- src/modules/wifi/wifi.c | 7 +- src/modules/wm/wm.c | 8 +- src/modules/wmtheme/wmtheme.c | 5 +- src/modules/zpool/zpool.c | 7 +- src/options/display.c | 399 ++++++++++++-------- src/options/general.c | 43 +-- src/options/logo.c | 199 +++++----- 83 files changed, 700 insertions(+), 932 deletions(-) diff --git a/doc/json_schema.json b/doc/json_schema.json index b8fce5a35..ba6940442 100644 --- a/doc/json_schema.json +++ b/doc/json_schema.json @@ -10,25 +10,25 @@ ] }, "key": { - "description": "Key of the module", - "type": "string" + "description": "Key of the module\nOne whitespace character (` `) can be used to hide the key", + "type": "string", + "minLength": 1 }, "keyColor": { - "description": "Color of the module key. Left empty to use `display.color.keys`", + "description": "Color of the module key to override the global setting `display.color.key`", "$ref": "#/$defs/colors" }, "keyWidth": { - "description": "Width of the module key. Use 0 to use `display.keyWidth`", + "description": "Width of the module key to override the global setting `display.keyWidth`", "type": "integer", - "minimum": 0, - "default": 0 + "minimum": 1 }, "keyIcon": { "description": "Set the icon to be displayed by `display.keyType: \"icon\"`", "type": "string" }, "outputColor": { - "description": "Output color of the module. Left empty to use `display.color.output`", + "description": "Output color of the module to override the global setting `display.color.output`", "$ref": "#/$defs/colors" }, "percentType": { @@ -549,7 +549,7 @@ "const": null }, { - "description": "Set the source file of the logo", + "description": "Set the source file of the logo or built-in ASCII art name", "type": "string" }, { @@ -671,14 +671,30 @@ } }, "width": { - "type": "integer", - "description": "Set the width of the logo (in characters). Required for iTerm image protocol", - "minimum": 1 + "oneOf": [ + { + "type": "null", + "description": "Auto detect width (default)" + }, + { + "type": "integer", + "description": "Set the width of the logo (in characters). Required for some image protocols", + "minimum": 1 + } + ] }, "height": { - "type": "integer", - "description": "Set the height of the logo (in characters). Required for iTerm image protocol", - "minimum": 1 + "oneOf": [ + { + "type": "null", + "description": "Auto detect width (default)" + }, + { + "type": "integer", + "description": "Set the height of the logo (in characters). Required for some image protocols", + "minimum": 1 + } + ] }, "padding": { "type": "object", @@ -1998,9 +2014,15 @@ "key": { "$ref": "#/$defs/key" }, + "keyColor": { + "$ref": "#/$defs/keyColor" + }, "keyIcon": { "$ref": "#/$defs/keyIcon" }, + "keyWidth": { + "$ref": "#/$defs/keyWidth" + }, "condition": { "$ref": "#/$defs/conditions" } @@ -2635,6 +2657,9 @@ ], "default": null }, + "percent": { + "$ref": "#/$defs/percent" + }, "key": { "$ref": "#/$defs/key" }, diff --git a/src/common/jsonconfig.c b/src/common/jsonconfig.c index 155f65668..838b307ac 100644 --- a/src/common/jsonconfig.c +++ b/src/common/jsonconfig.c @@ -50,17 +50,19 @@ bool ffJsonConfigParseModuleArgs(yyjson_val* key, yyjson_val* val, FFModuleArgs* return false; } -void ffJsonConfigGenerateModuleArgsConfig(yyjson_mut_doc* doc, yyjson_mut_val* module, FFModuleArgs* defaultModuleArgs, FFModuleArgs* moduleArgs) +void ffJsonConfigGenerateModuleArgsConfig(yyjson_mut_doc* doc, yyjson_mut_val* module, FFModuleArgs* moduleArgs) { - if (!ffStrbufEqual(&defaultModuleArgs->key, &moduleArgs->key)) + if (moduleArgs->key.length > 0) yyjson_mut_obj_add_strbuf(doc, module, "key", &moduleArgs->key); - if (!ffStrbufEqual(&defaultModuleArgs->outputFormat, &moduleArgs->outputFormat)) + if (moduleArgs->outputFormat.length > 0) yyjson_mut_obj_add_strbuf(doc, module, "format", &moduleArgs->outputFormat); - if (!ffStrbufEqual(&defaultModuleArgs->keyColor, &moduleArgs->keyColor)) + if (moduleArgs->outputColor.length > 0) + yyjson_mut_obj_add_strbuf(doc, module, "outputColor", &moduleArgs->outputColor); + if (moduleArgs->keyColor.length > 0) yyjson_mut_obj_add_strbuf(doc, module, "keyColor", &moduleArgs->keyColor); - if (moduleArgs->keyWidth != defaultModuleArgs->keyWidth) + if (moduleArgs->keyWidth > 0) yyjson_mut_obj_add_uint(doc, module, "keyWidth", moduleArgs->keyWidth); - if (!ffStrbufEqual(&defaultModuleArgs->keyIcon, &moduleArgs->keyIcon)) + if (moduleArgs->keyIcon.length > 0) yyjson_mut_obj_add_strbuf(doc, module, "keyIcon", &moduleArgs->keyIcon); } diff --git a/src/common/jsonconfig.h b/src/common/jsonconfig.h index 90df7262b..08a297f75 100644 --- a/src/common/jsonconfig.h +++ b/src/common/jsonconfig.h @@ -5,7 +5,7 @@ bool ffJsonConfigParseModuleArgs(yyjson_val* key, yyjson_val* val, FFModuleArgs* moduleArgs); const char* ffJsonConfigParseEnum(yyjson_val* val, int* result, FFKeyValuePair pairs[]); void ffPrintJsonConfig(bool prepare, yyjson_mut_doc* jsonDoc); -void ffJsonConfigGenerateModuleArgsConfig(yyjson_mut_doc* doc, yyjson_mut_val* module, FFModuleArgs* defaultModuleArgs, FFModuleArgs* moduleArgs); +void ffJsonConfigGenerateModuleArgsConfig(yyjson_mut_doc* doc, yyjson_mut_val* module, FFModuleArgs* moduleArgs); yyjson_api_inline yyjson_mut_val* yyjson_mut_strbuf(yyjson_mut_doc *doc, const FFstrbuf* buf) { return yyjson_mut_strncpy(doc, buf->chars, buf->length); diff --git a/src/common/percent.c b/src/common/percent.c index 6779d1ef0..12bd86043 100644 --- a/src/common/percent.c +++ b/src/common/percent.c @@ -310,16 +310,10 @@ bool ffPercentParseJsonObject(yyjson_val* key, yyjson_val* value, FFPercentageMo return true; } -void ffPercentGenerateJsonConfig(yyjson_mut_doc* doc, yyjson_mut_val* module, FFPercentageModuleConfig defaultConfig, FFPercentageModuleConfig config) +void ffPercentGenerateJsonConfig(yyjson_mut_doc* doc, yyjson_mut_val* module, FFPercentageModuleConfig config) { - if (config.green == defaultConfig.green && config.yellow == defaultConfig.yellow) - return; - yyjson_mut_val* percent = yyjson_mut_obj_add_obj(doc, module, "percent"); - if (config.green != defaultConfig.green) - yyjson_mut_obj_add_uint(doc, percent, "green", config.green); - if (config.yellow != defaultConfig.yellow) - yyjson_mut_obj_add_uint(doc, percent, "yellow", config.yellow); - if (config.type != defaultConfig.type) - yyjson_mut_obj_add_uint(doc, percent, "type", config.type); + yyjson_mut_obj_add_uint(doc, percent, "green", config.green); + yyjson_mut_obj_add_uint(doc, percent, "yellow", config.yellow); + yyjson_mut_obj_add_uint(doc, percent, "type", config.type); } diff --git a/src/common/percent.h b/src/common/percent.h index b1b1bdc7e..a8bb18e33 100644 --- a/src/common/percent.h +++ b/src/common/percent.h @@ -11,7 +11,7 @@ typedef enum __attribute__((__packed__)) FFPercentageTypeFlags FF_PERCENTAGE_TYPE_BAR_BIT = 1 << 1, FF_PERCENTAGE_TYPE_HIDE_OTHERS_BIT = 1 << 2, FF_PERCENTAGE_TYPE_NUM_COLOR_BIT = 1 << 3, - FF_PERCENTAGE_TYPE_BAR_MONOCHROME_BIT = FF_PERCENTAGE_TYPE_NUM_COLOR_BIT, + FF_PERCENTAGE_TYPE_BAR_MONOCHROME_BIT = 1 << 4, FF_PERCENTAGE_TYPE_FORCE_UNSIGNED_ = UINT8_MAX, } FFPercentageTypeFlags; static_assert(sizeof(FFPercentageTypeFlags) == 1, ""); @@ -41,5 +41,5 @@ typedef struct yyjson_mut_doc yyjson_mut_doc; typedef struct yyjson_mut_val yyjson_mut_val; bool ffPercentParseCommandOptions(const char* key, const char* subkey, const char* value, FFPercentageModuleConfig* config); bool ffPercentParseJsonObject(yyjson_val* key, yyjson_val* value, FFPercentageModuleConfig* config); -void ffPercentGenerateJsonConfig(yyjson_mut_doc* doc, yyjson_mut_val* module, FFPercentageModuleConfig defaultConfig, FFPercentageModuleConfig config); +void ffPercentGenerateJsonConfig(yyjson_mut_doc* doc, yyjson_mut_val* module, FFPercentageModuleConfig config); const char* ffPercentParseTypeJsonConfig(yyjson_val* value, FFPercentageTypeFlags* result); diff --git a/src/common/temps.c b/src/common/temps.c index c07a2aed0..002ee6f48 100644 --- a/src/common/temps.c +++ b/src/common/temps.c @@ -159,23 +159,14 @@ bool ffTempsParseJsonObject(yyjson_val* key, yyjson_val* value, bool* useTemp, F return true; } -void ffTempsGenerateJsonConfig(yyjson_mut_doc* doc, yyjson_mut_val* module, FF_MAYBE_UNUSED bool defaultTemp, FFColorRangeConfig defaultConfig, bool temp, FFColorRangeConfig config) +void ffTempsGenerateJsonConfig(yyjson_mut_doc* doc, yyjson_mut_val* module, bool temp, FFColorRangeConfig config) { - assert(defaultTemp == false); // assume defaultTemp is always false - if (!temp) - return; - - if (config.green != defaultConfig.green || config.yellow != defaultConfig.yellow) - { - yyjson_mut_val* temp = yyjson_mut_obj_add_obj(doc, module, "temp"); - if (config.green != defaultConfig.green) - yyjson_mut_obj_add_uint(doc, temp, "green", config.green); - if (config.yellow != defaultConfig.yellow) - yyjson_mut_obj_add_uint(doc, temp, "yellow", config.yellow); - } + yyjson_mut_obj_add_bool(doc, module, "temp", false); else { - yyjson_mut_obj_add_bool(doc, module, "temp", true); + yyjson_mut_val* temp = yyjson_mut_obj_add_obj(doc, module, "temp"); + yyjson_mut_obj_add_uint(doc, temp, "green", config.green); + yyjson_mut_obj_add_uint(doc, temp, "yellow", config.yellow); } } diff --git a/src/common/temps.h b/src/common/temps.h index 5aa8f6bf3..f2f8eda89 100644 --- a/src/common/temps.h +++ b/src/common/temps.h @@ -6,4 +6,4 @@ void ffTempsAppendNum(double celsius, FFstrbuf* buffer, FFColorRangeConfig config, const FFModuleArgs* module); bool ffTempsParseCommandOptions(const char* key, const char* subkey, const char* value, bool* useTemp, FFColorRangeConfig* config); bool ffTempsParseJsonObject(yyjson_val* key, yyjson_val* value, bool* useTemp, FFColorRangeConfig* config); -void ffTempsGenerateJsonConfig(yyjson_mut_doc* doc, yyjson_mut_val* module, FF_MAYBE_UNUSED bool defaultTemp, FFColorRangeConfig defaultConfig, bool temp, FFColorRangeConfig config); +void ffTempsGenerateJsonConfig(yyjson_mut_doc* doc, yyjson_mut_val* module, bool temp, FFColorRangeConfig config); diff --git a/src/modules/battery/battery.c b/src/modules/battery/battery.c index 788008427..75158bd86 100644 --- a/src/modules/battery/battery.c +++ b/src/modules/battery/battery.c @@ -188,19 +188,14 @@ void ffParseBatteryJsonObject(FFBatteryOptions* options, yyjson_val* module) void ffGenerateBatteryJsonConfig(FFBatteryOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyBatteryOptions))) FFBatteryOptions defaultOptions; - ffInitBatteryOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); #ifdef _WIN32 - if (defaultOptions.useSetupApi != options->useSetupApi) yyjson_mut_obj_add_bool(doc, module, "useSetupApi", options->useSetupApi); #endif - ffTempsGenerateJsonConfig(doc, module, defaultOptions.temp, defaultOptions.tempConfig, options->temp, options->tempConfig); - - ffPercentGenerateJsonConfig(doc, module, defaultOptions.percent, options->percent); + ffTempsGenerateJsonConfig(doc, module, options->temp, options->tempConfig); + ffPercentGenerateJsonConfig(doc, module, options->percent); } void ffGenerateBatteryJsonResult(FFBatteryOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/bios/bios.c b/src/modules/bios/bios.c index f802ffd79..d2f59629e 100644 --- a/src/modules/bios/bios.c +++ b/src/modules/bios/bios.c @@ -90,10 +90,7 @@ void ffParseBiosJsonObject(FFBiosOptions* options, yyjson_val* module) void ffGenerateBiosJsonConfig(FFBiosOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyBiosOptions))) FFBiosOptions defaultOptions; - ffInitBiosOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateBiosJsonResult(FF_MAYBE_UNUSED FFBiosOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/bluetooth/bluetooth.c b/src/modules/bluetooth/bluetooth.c index c26316ae8..b5e05f21b 100644 --- a/src/modules/bluetooth/bluetooth.c +++ b/src/modules/bluetooth/bluetooth.c @@ -121,15 +121,11 @@ void ffParseBluetoothJsonObject(FFBluetoothOptions* options, yyjson_val* module) void ffGenerateBluetoothJsonConfig(FFBluetoothOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyBluetoothOptions))) FFBluetoothOptions defaultOptions; - ffInitBluetoothOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + yyjson_mut_obj_add_bool(doc, module, "showDisconnected", options->showDisconnected); - if (options->showDisconnected != defaultOptions.showDisconnected) - yyjson_mut_obj_add_bool(doc, module, "showDisconnected", options->showDisconnected); - - ffPercentGenerateJsonConfig(doc, module, defaultOptions.percent, options->percent); + ffPercentGenerateJsonConfig(doc, module, options->percent); } void ffGenerateBluetoothJsonResult(FFBluetoothOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/bluetoothradio/bluetoothradio.c b/src/modules/bluetoothradio/bluetoothradio.c index 9d96d27a7..810b5f438 100644 --- a/src/modules/bluetoothradio/bluetoothradio.c +++ b/src/modules/bluetoothradio/bluetoothradio.c @@ -120,10 +120,7 @@ void ffParseBluetoothRadioJsonObject(FFBluetoothRadioOptions* options, yyjson_va void ffGenerateBluetoothRadioJsonConfig(FFBluetoothRadioOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyBluetoothRadioOptions))) FFBluetoothRadioOptions defaultOptions; - ffInitBluetoothRadioOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateBluetoothRadioJsonResult(FF_MAYBE_UNUSED FFBluetoothRadioOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/board/board.c b/src/modules/board/board.c index 78947294f..a9cf573f6 100644 --- a/src/modules/board/board.c +++ b/src/modules/board/board.c @@ -65,10 +65,7 @@ void ffParseBoardJsonObject(FFBoardOptions* options, yyjson_val* module) void ffGenerateBoardJsonConfig(FFBoardOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyBoardOptions))) FFBoardOptions defaultOptions; - ffInitBoardOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateBoardJsonResult(FF_MAYBE_UNUSED FFBoardOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/bootmgr/bootmgr.c b/src/modules/bootmgr/bootmgr.c index 29c08500c..350499530 100644 --- a/src/modules/bootmgr/bootmgr.c +++ b/src/modules/bootmgr/bootmgr.c @@ -65,10 +65,7 @@ void ffParseBootmgrJsonObject(FFBootmgrOptions* options, yyjson_val* module) void ffGenerateBootmgrJsonConfig(FFBootmgrOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyBootmgrOptions))) FFBootmgrOptions defaultOptions; - ffInitBootmgrOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateBootmgrJsonResult(FF_MAYBE_UNUSED FFBootmgrOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/brightness/brightness.c b/src/modules/brightness/brightness.c index 35e83f144..c3855b07d 100644 --- a/src/modules/brightness/brightness.c +++ b/src/modules/brightness/brightness.c @@ -142,18 +142,13 @@ void ffParseBrightnessJsonObject(FFBrightnessOptions* options, yyjson_val* modul void ffGenerateBrightnessJsonConfig(FFBrightnessOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyBrightnessOptions))) FFBrightnessOptions defaultOptions; - ffInitBrightnessOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + yyjson_mut_obj_add_uint(doc, module, "ddcciSleep", options->ddcciSleep); - if (defaultOptions.ddcciSleep != options->ddcciSleep) - yyjson_mut_obj_add_uint(doc, module, "ddcciSleep", options->ddcciSleep); + ffPercentGenerateJsonConfig(doc, module, options->percent); - ffPercentGenerateJsonConfig(doc, module, defaultOptions.percent, options->percent); - - if (defaultOptions.compact != options->compact) - yyjson_mut_obj_add_bool(doc, module, "compact", options->compact); + yyjson_mut_obj_add_bool(doc, module, "compact", options->compact); } void ffGenerateBrightnessJsonResult(FF_MAYBE_UNUSED FFBrightnessOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/btrfs/btrfs.c b/src/modules/btrfs/btrfs.c index 6872c00e0..e337d4c72 100644 --- a/src/modules/btrfs/btrfs.c +++ b/src/modules/btrfs/btrfs.c @@ -148,12 +148,9 @@ void ffParseBtrfsJsonObject(FFBtrfsOptions* options, yyjson_val* module) void ffGenerateBtrfsJsonConfig(FFBtrfsOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyBtrfsOptions))) FFBtrfsOptions defaultOptions; - ffInitBtrfsOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); - - ffPercentGenerateJsonConfig(doc, module, defaultOptions.percent, options->percent); + ffPercentGenerateJsonConfig(doc, module, options->percent); } void ffGenerateBtrfsJsonResult(FF_MAYBE_UNUSED FFBtrfsOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/camera/camera.c b/src/modules/camera/camera.c index 557e27f2e..d12d7a662 100644 --- a/src/modules/camera/camera.c +++ b/src/modules/camera/camera.c @@ -82,10 +82,7 @@ void ffParseCameraJsonObject(FFCameraOptions* options, yyjson_val* module) void ffGenerateCameraJsonConfig(FFCameraOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyCameraOptions))) FFCameraOptions defaultOptions; - ffInitCameraOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateCameraJsonResult(FF_MAYBE_UNUSED FFCameraOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/chassis/chassis.c b/src/modules/chassis/chassis.c index bf357c3cb..e1344ab2b 100644 --- a/src/modules/chassis/chassis.c +++ b/src/modules/chassis/chassis.c @@ -66,10 +66,7 @@ void ffParseChassisJsonObject(FFChassisOptions* options, yyjson_val* module) void ffGenerateChassisJsonConfig(FFChassisOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyChassisOptions))) FFChassisOptions defaultOptions; - ffInitChassisOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateChassisJsonResult(FF_MAYBE_UNUSED FFChassisOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/colors/colors.c b/src/modules/colors/colors.c index 21d870d76..27dae0f40 100644 --- a/src/modules/colors/colors.c +++ b/src/modules/colors/colors.c @@ -200,42 +200,30 @@ void ffParseColorsJsonObject(FFColorsOptions* options, yyjson_val* module) void ffGenerateColorsJsonConfig(FFColorsOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyColorsOptions))) FFColorsOptions defaultOptions; - ffInitColorsOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + yyjson_mut_obj_remove_key(module, "format"); // Not supported - if (defaultOptions.symbol != options->symbol) + switch (options->symbol) { - switch (options->symbol) - { - case FF_COLORS_SYMBOL_CIRCLE: yyjson_mut_obj_add_str(doc, module, "symbol", "circle"); break; - case FF_COLORS_SYMBOL_DIAMOND: yyjson_mut_obj_add_str(doc, module, "symbol", "diamond"); break; - case FF_COLORS_SYMBOL_TRIANGLE: yyjson_mut_obj_add_str(doc, module, "symbol", "triangle"); break; - case FF_COLORS_SYMBOL_SQUARE: yyjson_mut_obj_add_str(doc, module, "symbol", "square"); break; - case FF_COLORS_SYMBOL_STAR: yyjson_mut_obj_add_str(doc, module, "symbol", "star"); break; - default: yyjson_mut_obj_add_str(doc, module, "symbol", "block"); break; - } + case FF_COLORS_SYMBOL_CIRCLE: yyjson_mut_obj_add_str(doc, module, "symbol", "circle"); break; + case FF_COLORS_SYMBOL_DIAMOND: yyjson_mut_obj_add_str(doc, module, "symbol", "diamond"); break; + case FF_COLORS_SYMBOL_TRIANGLE: yyjson_mut_obj_add_str(doc, module, "symbol", "triangle"); break; + case FF_COLORS_SYMBOL_SQUARE: yyjson_mut_obj_add_str(doc, module, "symbol", "square"); break; + case FF_COLORS_SYMBOL_STAR: yyjson_mut_obj_add_str(doc, module, "symbol", "star"); break; + default: yyjson_mut_obj_add_str(doc, module, "symbol", "block"); break; } - if (defaultOptions.paddingLeft != options->paddingLeft) - yyjson_mut_obj_add_uint(doc, module, "paddingLeft", options->paddingLeft); + yyjson_mut_obj_add_uint(doc, module, "paddingLeft", options->paddingLeft); { - yyjson_mut_val* block = yyjson_mut_obj(doc); + yyjson_mut_val* block = yyjson_mut_obj_add_obj(doc, module, "block"); - if (defaultOptions.block.width != options->block.width) - yyjson_mut_obj_add_uint(doc, block, "width", options->block.width); + yyjson_mut_obj_add_uint(doc, block, "width", options->block.width); - if (memcmp(defaultOptions.block.range, options->block.range, sizeof(options->block.range)) != 0) - { - yyjson_mut_val* range = yyjson_mut_obj_add_arr(doc, block, "range"); - for (uint8_t i = 0; i < 2; i++) - yyjson_mut_arr_add_uint(doc, range, options->block.range[i]); - } - - if (yyjson_mut_obj_size(block) > 0) - yyjson_mut_obj_add_val(doc, module, "block", block); + yyjson_mut_val* range = yyjson_mut_obj_add_arr(doc, block, "range"); + for (uint8_t i = 0; i < 2; i++) + yyjson_mut_arr_add_uint(doc, range, options->block.range[i]); } } @@ -251,7 +239,7 @@ void ffInitColorsOptions(FFColorsOptions* options) }; } -void ffDestroyColorsOptions(FF_MAYBE_UNUSED FFColorsOptions* options) +void ffDestroyColorsOptions(FFColorsOptions* options) { ffOptionDestroyModuleArg(&options->moduleArgs); } diff --git a/src/modules/command/command.c b/src/modules/command/command.c index 785f9514e..5a92d3cea 100644 --- a/src/modules/command/command.c +++ b/src/modules/command/command.c @@ -76,19 +76,13 @@ void ffParseCommandJsonObject(FFCommandOptions* options, yyjson_val* module) void ffGenerateCommandJsonConfig(FFCommandOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyCommandOptions))) FFCommandOptions defaultOptions; - ffInitCommandOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + yyjson_mut_obj_add_strbuf(doc, module, "shell", &options->shell); - if (!ffStrbufEqual(&defaultOptions.shell, &options->shell)) - yyjson_mut_obj_add_strbuf(doc, module, "shell", &options->shell); + yyjson_mut_obj_add_strbuf(doc, module, "param", &options->param); - if (!ffStrbufEqual(&defaultOptions.param, &options->param)) - yyjson_mut_obj_add_strbuf(doc, module, "param", &options->param); - - if (!ffStrbufEqual(&defaultOptions.text, &options->text)) - yyjson_mut_obj_add_strbuf(doc, module, "text", &options->text); + yyjson_mut_obj_add_strbuf(doc, module, "text", &options->text); } void ffGenerateCommandJsonResult(FF_MAYBE_UNUSED FFCommandOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/cpu/cpu.c b/src/modules/cpu/cpu.c index b8f95356e..23216f1f9 100644 --- a/src/modules/cpu/cpu.c +++ b/src/modules/cpu/cpu.c @@ -147,15 +147,11 @@ void ffParseCPUJsonObject(FFCPUOptions* options, yyjson_val* module) void ffGenerateCPUJsonConfig(FFCPUOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyCPUOptions))) FFCPUOptions defaultOptions; - ffInitCPUOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffTempsGenerateJsonConfig(doc, module, options->temp, options->tempConfig); - ffTempsGenerateJsonConfig(doc, module, defaultOptions.temp, defaultOptions.tempConfig, options->temp, options->tempConfig); - - if (defaultOptions.showPeCoreCount != options->showPeCoreCount) - yyjson_mut_obj_add_bool(doc, module, "showPeCoreCount", options->showPeCoreCount); + yyjson_mut_obj_add_bool(doc, module, "showPeCoreCount", options->showPeCoreCount); } void ffGenerateCPUJsonResult(FFCPUOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/cpucache/cpucache.c b/src/modules/cpucache/cpucache.c index 58a73f839..aeb9422b4 100644 --- a/src/modules/cpucache/cpucache.c +++ b/src/modules/cpucache/cpucache.c @@ -153,10 +153,9 @@ void ffParseCPUCacheJsonObject(FFCPUCacheOptions* options, yyjson_val* module) void ffGenerateCPUCacheJsonConfig(FFCPUCacheOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyCPUCacheOptions))) FFCPUCacheOptions defaultOptions; - ffInitCPUCacheOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + yyjson_mut_obj_add_bool(doc, module, "compact", options->compact); } void ffGenerateCPUCacheJsonResult(FF_MAYBE_UNUSED FFCPUCacheOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/cpuusage/cpuusage.c b/src/modules/cpuusage/cpuusage.c index 180260069..a86f78e20 100644 --- a/src/modules/cpuusage/cpuusage.c +++ b/src/modules/cpuusage/cpuusage.c @@ -146,15 +146,13 @@ void ffParseCPUUsageJsonObject(FFCPUUsageOptions* options, yyjson_val* module) void ffGenerateCPUUsageJsonConfig(FFCPUUsageOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyCPUUsageOptions))) FFCPUUsageOptions defaultOptions; - ffInitCPUUsageOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + yyjson_mut_obj_add_bool(doc, module, "separate", options->separate); - if (options->separate != defaultOptions.separate) - yyjson_mut_obj_add_bool(doc, module, "separate", options->separate); + ffPercentGenerateJsonConfig(doc, module, options->percent); - ffPercentGenerateJsonConfig(doc, module, defaultOptions.percent, options->percent); + yyjson_mut_obj_add_uint(doc, module, "waitTime", options->waitTime); } void ffGenerateCPUUsageJsonResult(FFCPUUsageOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/cursor/cursor.c b/src/modules/cursor/cursor.c index 53406337f..d8ce2c26e 100644 --- a/src/modules/cursor/cursor.c +++ b/src/modules/cursor/cursor.c @@ -63,10 +63,7 @@ void ffParseCursorJsonObject(FFCursorOptions* options, yyjson_val* module) void ffGenerateCursorJsonConfig(FFCursorOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyCursorOptions))) FFCursorOptions defaultOptions; - ffInitCursorOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateCursorJsonResult(FF_MAYBE_UNUSED FFCursorOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/custom/custom.c b/src/modules/custom/custom.c index 221fd05ae..4c2b8137d 100644 --- a/src/modules/custom/custom.c +++ b/src/modules/custom/custom.c @@ -11,10 +11,7 @@ void ffPrintCustom(FFCustomOptions* options) void ffGenerateCustomJsonConfig(FFCustomOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyCustomOptions))) FFCustomOptions defaultOptions; - ffInitCustomOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffParseCustomJsonObject(FFCustomOptions* options, yyjson_val* module) diff --git a/src/modules/datetime/datetime.c b/src/modules/datetime/datetime.c index 041901088..213b3bfdc 100644 --- a/src/modules/datetime/datetime.c +++ b/src/modules/datetime/datetime.c @@ -132,10 +132,7 @@ void ffParseDateTimeJsonObject(FFDateTimeOptions* options, yyjson_val* module) void ffGenerateDateTimeJsonConfig(FFDateTimeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyDateTimeOptions))) FFDateTimeOptions defaultOptions; - ffInitDateTimeOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateDateTimeJsonResult(FF_MAYBE_UNUSED FFDateTimeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/de/de.c b/src/modules/de/de.c index bb331daf2..ac901566d 100644 --- a/src/modules/de/de.c +++ b/src/modules/de/de.c @@ -63,13 +63,9 @@ void ffParseDEJsonObject(FFDEOptions* options, yyjson_val* module) void ffGenerateDEJsonConfig(FFDEOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyDEOptions))) FFDEOptions defaultOptions; - ffInitDEOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); - - if (defaultOptions.slowVersionDetection != options->slowVersionDetection) - yyjson_mut_obj_add_bool(doc, module, "slowVersionDetection", options->slowVersionDetection); + yyjson_mut_obj_add_bool(doc, module, "slowVersionDetection", options->slowVersionDetection); } void ffGenerateDEJsonResult(FF_MAYBE_UNUSED FFDEOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/disk/disk.c b/src/modules/disk/disk.c index 4f51c065c..ea74e4ef3 100644 --- a/src/modules/disk/disk.c +++ b/src/modules/disk/disk.c @@ -302,45 +302,29 @@ void ffParseDiskJsonObject(FFDiskOptions* options, yyjson_val* module) void ffGenerateDiskJsonConfig(FFDiskOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyDiskOptions))) FFDiskOptions defaultOptions; - ffInitDiskOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + yyjson_mut_obj_add_bool(doc, module, "showRegular", !!(options->showTypes & FF_DISK_VOLUME_TYPE_REGULAR_BIT)); - if (defaultOptions.showTypes != options->showTypes) - { - if (options->showTypes & FF_DISK_VOLUME_TYPE_REGULAR_BIT) - yyjson_mut_obj_add_bool(doc, module, "showRegular", true); + yyjson_mut_obj_add_bool(doc, module, "showExternal", !!(options->showTypes & FF_DISK_VOLUME_TYPE_EXTERNAL_BIT)); - if (options->showTypes & FF_DISK_VOLUME_TYPE_EXTERNAL_BIT) - yyjson_mut_obj_add_bool(doc, module, "showExternal", true); + yyjson_mut_obj_add_bool(doc, module, "showHidden", !!(options->showTypes & FF_DISK_VOLUME_TYPE_HIDDEN_BIT)); - if (options->showTypes & FF_DISK_VOLUME_TYPE_HIDDEN_BIT) - yyjson_mut_obj_add_bool(doc, module, "showHidden", true); + yyjson_mut_obj_add_bool(doc, module, "showSubvolumes", !!(options->showTypes & FF_DISK_VOLUME_TYPE_SUBVOLUME_BIT)); - if (options->showTypes & FF_DISK_VOLUME_TYPE_SUBVOLUME_BIT) - yyjson_mut_obj_add_bool(doc, module, "showSubvolumes", true); + yyjson_mut_obj_add_bool(doc, module, "showReadOnly", !!(options->showTypes & FF_DISK_VOLUME_TYPE_READONLY_BIT)); - if (options->showTypes & FF_DISK_VOLUME_TYPE_READONLY_BIT) - yyjson_mut_obj_add_bool(doc, module, "showReadOnly", true); + yyjson_mut_obj_add_bool(doc, module, "showUnknown", !!(options->showTypes & FF_DISK_VOLUME_TYPE_UNKNOWN_BIT)); - if (options->showTypes & FF_DISK_VOLUME_TYPE_UNKNOWN_BIT) - yyjson_mut_obj_add_bool(doc, module, "showUnknown", true); - } + yyjson_mut_obj_add_strbuf(doc, module, "folders", &options->folders); - if (!ffStrbufEqual(&options->folders, &defaultOptions.folders)) - yyjson_mut_obj_add_strbuf(doc, module, "folders", &options->folders); + yyjson_mut_obj_add_strbuf(doc, module, "hideFolders", &options->hideFolders); - if (!ffStrbufEqual(&options->hideFolders, &defaultOptions.hideFolders)) - yyjson_mut_obj_add_strbuf(doc, module, "hideFolders", &options->hideFolders); + yyjson_mut_obj_add_strbuf(doc, module, "hideFS", &options->hideFS); - if (!ffStrbufEqual(&options->hideFS, &defaultOptions.hideFS)) - yyjson_mut_obj_add_strbuf(doc, module, "hideFS", &options->hideFS); + yyjson_mut_obj_add_bool(doc, module, "useAvailable", options->calcType == FF_DISK_CALC_TYPE_AVAILABLE); - if (defaultOptions.calcType != options->calcType) - yyjson_mut_obj_add_bool(doc, module, "useAvailable", options->calcType == FF_DISK_CALC_TYPE_AVAILABLE); - - ffPercentGenerateJsonConfig(doc, module, defaultOptions.percent, options->percent); + ffPercentGenerateJsonConfig(doc, module, options->percent); } void ffGenerateDiskJsonResult(FFDiskOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/diskio/diskio.c b/src/modules/diskio/diskio.c index 8d6a59433..5fa60982e 100644 --- a/src/modules/diskio/diskio.c +++ b/src/modules/diskio/diskio.c @@ -128,16 +128,13 @@ void ffParseDiskIOJsonObject(FFDiskIOOptions* options, yyjson_val* module) void ffGenerateDiskIOJsonConfig(FFDiskIOOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyDiskIOOptions))) FFDiskIOOptions defaultOptions; - ffInitDiskIOOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + yyjson_mut_obj_add_strbuf(doc, module, "namePrefix", &options->namePrefix); - if (!ffStrbufEqual(&options->namePrefix, &defaultOptions.namePrefix)) - yyjson_mut_obj_add_strbuf(doc, module, "namePrefix", &options->namePrefix); + yyjson_mut_obj_add_bool(doc, module, "detectTotal", options->detectTotal); - if (defaultOptions.detectTotal != options->detectTotal) - yyjson_mut_obj_add_bool(doc, module, "detectTotal", options->detectTotal); + yyjson_mut_obj_add_uint(doc, module, "waitTime", options->waitTime); } void ffGenerateDiskIOJsonResult(FFDiskIOOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/display/display.c b/src/modules/display/display.c index acfc4c0e4..33b48e911 100644 --- a/src/modules/display/display.c +++ b/src/modules/display/display.c @@ -282,35 +282,41 @@ void ffParseDisplayJsonObject(FFDisplayOptions* options, yyjson_val* module) void ffGenerateDisplayJsonConfig(FFDisplayOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyDisplayOptions))) FFDisplayOptions defaultOptions; - ffInitDisplayOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); - - if (options->compactType != defaultOptions.compactType) + switch ((int) options->compactType) { - switch ((int) options->compactType) - { - case FF_DISPLAY_COMPACT_TYPE_NONE: - yyjson_mut_obj_add_str(doc, module, "compactType", "none"); - break; - case FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT: - yyjson_mut_obj_add_str(doc, module, "compactType", "original"); - break; - case FF_DISPLAY_COMPACT_TYPE_SCALED_BIT: - yyjson_mut_obj_add_str(doc, module, "compactType", "scaled"); - break; - case FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT | FF_DISPLAY_COMPACT_TYPE_REFRESH_RATE_BIT: - yyjson_mut_obj_add_str(doc, module, "compactType", "original-with-refresh-rate"); - break; - case FF_DISPLAY_COMPACT_TYPE_SCALED_BIT | FF_DISPLAY_COMPACT_TYPE_REFRESH_RATE_BIT: - yyjson_mut_obj_add_str(doc, module, "compactType", "scaled-with-refresh-rate"); - break; - } + case FF_DISPLAY_COMPACT_TYPE_NONE: + yyjson_mut_obj_add_str(doc, module, "compactType", "none"); + break; + case FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT: + yyjson_mut_obj_add_str(doc, module, "compactType", "original"); + break; + case FF_DISPLAY_COMPACT_TYPE_SCALED_BIT: + yyjson_mut_obj_add_str(doc, module, "compactType", "scaled"); + break; + case FF_DISPLAY_COMPACT_TYPE_ORIGINAL_BIT | FF_DISPLAY_COMPACT_TYPE_REFRESH_RATE_BIT: + yyjson_mut_obj_add_str(doc, module, "compactType", "original-with-refresh-rate"); + break; + case FF_DISPLAY_COMPACT_TYPE_SCALED_BIT | FF_DISPLAY_COMPACT_TYPE_REFRESH_RATE_BIT: + yyjson_mut_obj_add_str(doc, module, "compactType", "scaled-with-refresh-rate"); + break; } - if (options->preciseRefreshRate != defaultOptions.preciseRefreshRate) - yyjson_mut_obj_add_bool(doc, module, "preciseRefreshRate", options->preciseRefreshRate); + yyjson_mut_obj_add_bool(doc, module, "preciseRefreshRate", options->preciseRefreshRate); + + switch (options->order) + { + case FF_DISPLAY_ORDER_NONE: + yyjson_mut_obj_add_null(doc, module, "order"); + break; + case FF_DISPLAY_ORDER_ASC: + yyjson_mut_obj_add_str(doc, module, "order", "asc"); + break; + case FF_DISPLAY_ORDER_DESC: + yyjson_mut_obj_add_str(doc, module, "order", "desc"); + break; + } } void ffGenerateDisplayJsonResult(FF_MAYBE_UNUSED FFDisplayOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/dns/dns.c b/src/modules/dns/dns.c index c9736ffc9..aa36ceacb 100644 --- a/src/modules/dns/dns.c +++ b/src/modules/dns/dns.c @@ -88,32 +88,23 @@ void ffParseDNSJsonObject(FFDNSOptions* options, yyjson_val* module) void ffGenerateDNSJsonConfig(FFDNSOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyDNSOptions))) FFDNSOptions defaultOptions; - ffInitDNSOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); - - if (defaultOptions.showType != options->showType) + switch ((uint8_t) options->showType) { - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wswitch" // FF_DNS_TYPE_FORCE_UNSIGNED - switch (options->showType) - { - case FF_DNS_TYPE_IPV4_BIT: - yyjson_mut_obj_add_str(doc, module, "showType", "ipv4"); - break; - case FF_DNS_TYPE_IPV6_BIT: - yyjson_mut_obj_add_str(doc, module, "showType", "ipv6"); - break; - case FF_DNS_TYPE_BOTH: - yyjson_mut_obj_add_str(doc, module, "showType", "both"); - break; - } - #pragma GCC diagnostic pop + case FF_DNS_TYPE_IPV4_BIT: + yyjson_mut_obj_add_str(doc, module, "showType", "ipv4"); + break; + case FF_DNS_TYPE_IPV6_BIT: + yyjson_mut_obj_add_str(doc, module, "showType", "ipv6"); + break; + case FF_DNS_TYPE_BOTH: + yyjson_mut_obj_add_str(doc, module, "showType", "both"); + break; } } -void ffGenerateDNSJsonResult(FF_MAYBE_UNUSED FFDNSOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) +void ffGenerateDNSJsonResult(FFDNSOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { FF_LIST_AUTO_DESTROY result = ffListCreate(sizeof(FFstrbuf)); diff --git a/src/modules/editor/editor.c b/src/modules/editor/editor.c index 06318f1f1..e001d22e8 100644 --- a/src/modules/editor/editor.c +++ b/src/modules/editor/editor.c @@ -69,10 +69,7 @@ void ffParseEditorJsonObject(FFEditorOptions* options, yyjson_val* module) void ffGenerateEditorJsonConfig(FFEditorOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyEditorOptions))) FFEditorOptions defaultOptions; - ffInitEditorOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateEditorJsonResult(FF_MAYBE_UNUSED FFEditorOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/font/font.c b/src/modules/font/font.c index 7e308407c..eedf32c4e 100644 --- a/src/modules/font/font.c +++ b/src/modules/font/font.c @@ -56,10 +56,7 @@ void ffParseFontJsonObject(FFFontOptions* options, yyjson_val* module) void ffGenerateFontJsonConfig(FFFontOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyFontOptions))) FFFontOptions defaultOptions; - ffInitFontOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateFontJsonResult(FF_MAYBE_UNUSED FFFontOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/gamepad/gamepad.c b/src/modules/gamepad/gamepad.c index d6bf3ee55..5b1b6f7d5 100644 --- a/src/modules/gamepad/gamepad.c +++ b/src/modules/gamepad/gamepad.c @@ -95,12 +95,9 @@ void ffParseGamepadJsonObject(FFGamepadOptions* options, yyjson_val* module) void ffGenerateGamepadJsonConfig(FFGamepadOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyGamepadOptions))) FFGamepadOptions defaultOptions; - ffInitGamepadOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); - - ffPercentGenerateJsonConfig(doc, module, defaultOptions.percent, options->percent); + ffPercentGenerateJsonConfig(doc, module, options->percent); } void ffGenerateGamepadJsonResult(FF_MAYBE_UNUSED FFGamepadOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/gpu/gpu.c b/src/modules/gpu/gpu.c index f7a532961..22267ae35 100644 --- a/src/modules/gpu/gpu.c +++ b/src/modules/gpu/gpu.c @@ -269,58 +269,48 @@ void ffParseGPUJsonObject(FFGPUOptions* options, yyjson_val* module) void ffGenerateGPUJsonConfig(FFGPUOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyGPUOptions))) FFGPUOptions defaultOptions; - ffInitGPUOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + yyjson_mut_obj_add_bool(doc, module, "driverSpecific", options->driverSpecific); - if (options->driverSpecific != defaultOptions.driverSpecific) - yyjson_mut_obj_add_bool(doc, module, "driverSpecific", options->driverSpecific); - - if (options->detectionMethod != defaultOptions.detectionMethod) + switch (options->detectionMethod) { - switch (options->detectionMethod) - { - case FF_GPU_DETECTION_METHOD_AUTO: - yyjson_mut_obj_add_str(doc, module, "detectionMethod", "auto"); - break; - case FF_GPU_DETECTION_METHOD_PCI: - yyjson_mut_obj_add_str(doc, module, "detectionMethod", "pci"); - break; - case FF_GPU_DETECTION_METHOD_VULKAN: - yyjson_mut_obj_add_str(doc, module, "detectionMethod", "vulkan"); - break; - case FF_GPU_DETECTION_METHOD_OPENCL: - yyjson_mut_obj_add_str(doc, module, "detectionMethod", "opencl"); - break; - case FF_GPU_DETECTION_METHOD_OPENGL: - yyjson_mut_obj_add_str(doc, module, "detectionMethod", "opengl"); - break; - } + case FF_GPU_DETECTION_METHOD_AUTO: + yyjson_mut_obj_add_str(doc, module, "detectionMethod", "auto"); + break; + case FF_GPU_DETECTION_METHOD_PCI: + yyjson_mut_obj_add_str(doc, module, "detectionMethod", "pci"); + break; + case FF_GPU_DETECTION_METHOD_VULKAN: + yyjson_mut_obj_add_str(doc, module, "detectionMethod", "vulkan"); + break; + case FF_GPU_DETECTION_METHOD_OPENCL: + yyjson_mut_obj_add_str(doc, module, "detectionMethod", "opencl"); + break; + case FF_GPU_DETECTION_METHOD_OPENGL: + yyjson_mut_obj_add_str(doc, module, "detectionMethod", "opengl"); + break; } - ffTempsGenerateJsonConfig(doc, module, defaultOptions.temp, defaultOptions.tempConfig, options->temp, options->tempConfig); + ffTempsGenerateJsonConfig(doc, module, options->temp, options->tempConfig); - if (options->hideType != defaultOptions.hideType) + switch (options->hideType) { - switch (options->hideType) - { - case FF_GPU_TYPE_NONE: - yyjson_mut_obj_add_str(doc, module, "hideType", "none"); - break; - case FF_GPU_TYPE_UNKNOWN: - yyjson_mut_obj_add_str(doc, module, "hideType", "unknown"); - break; - case FF_GPU_TYPE_INTEGRATED: - yyjson_mut_obj_add_str(doc, module, "hideType", "integrated"); - break; - case FF_GPU_TYPE_DISCRETE: - yyjson_mut_obj_add_str(doc, module, "hideType", "discrete"); - break; - } + case FF_GPU_TYPE_NONE: + yyjson_mut_obj_add_str(doc, module, "hideType", "none"); + break; + case FF_GPU_TYPE_UNKNOWN: + yyjson_mut_obj_add_str(doc, module, "hideType", "unknown"); + break; + case FF_GPU_TYPE_INTEGRATED: + yyjson_mut_obj_add_str(doc, module, "hideType", "integrated"); + break; + case FF_GPU_TYPE_DISCRETE: + yyjson_mut_obj_add_str(doc, module, "hideType", "discrete"); + break; } - ffPercentGenerateJsonConfig(doc, module, defaultOptions.percent, options->percent); + ffPercentGenerateJsonConfig(doc, module, options->percent); } void ffGenerateGPUJsonResult(FFGPUOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/gpu/option.h b/src/modules/gpu/option.h index 36d2f0af1..0d1d0fac8 100644 --- a/src/modules/gpu/option.h +++ b/src/modules/gpu/option.h @@ -28,7 +28,6 @@ typedef struct FFGPUOptions FFGPUDetectionMethod detectionMethod; bool temp; bool driverSpecific; - bool forceMethod; FFColorRangeConfig tempConfig; FFPercentageModuleConfig percent; } FFGPUOptions; diff --git a/src/modules/host/host.c b/src/modules/host/host.c index 59692336b..9a265c058 100644 --- a/src/modules/host/host.c +++ b/src/modules/host/host.c @@ -82,10 +82,7 @@ void ffParseHostJsonObject(FFHostOptions* options, yyjson_val* module) void ffGenerateHostJsonConfig(FFHostOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyHostOptions))) FFHostOptions defaultOptions; - ffInitHostOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateHostJsonResult(FF_MAYBE_UNUSED FFHostOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/icons/icons.c b/src/modules/icons/icons.c index 210d8996c..c1347790e 100644 --- a/src/modules/icons/icons.c +++ b/src/modules/icons/icons.c @@ -58,10 +58,7 @@ void ffParseIconsJsonObject(FFIconsOptions* options, yyjson_val* module) void ffGenerateIconsJsonConfig(FFIconsOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyIconsOptions))) FFIconsOptions defaultOptions; - ffInitIconsOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateIconsJsonResult(FF_MAYBE_UNUSED FFIconsOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/initsystem/initsystem.c b/src/modules/initsystem/initsystem.c index c549011ea..28ad9ba80 100644 --- a/src/modules/initsystem/initsystem.c +++ b/src/modules/initsystem/initsystem.c @@ -63,10 +63,7 @@ void ffParseInitSystemJsonObject(FFInitSystemOptions* options, yyjson_val* modul void ffGenerateInitSystemJsonConfig(FFInitSystemOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyInitSystemOptions))) FFInitSystemOptions defaultOptions; - ffInitInitSystemOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateInitSystemJsonResult(FF_MAYBE_UNUSED FFInitSystemOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/kernel/kernel.c b/src/modules/kernel/kernel.c index 0d707129f..042ef3735 100644 --- a/src/modules/kernel/kernel.c +++ b/src/modules/kernel/kernel.c @@ -47,10 +47,7 @@ void ffParseKernelJsonObject(FFKernelOptions* options, yyjson_val* module) void ffGenerateKernelJsonConfig(FFKernelOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyKernelOptions))) FFKernelOptions defaultOptions; - ffInitKernelOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateKernelJsonResult(FF_MAYBE_UNUSED FFKernelOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/keyboard/keyboard.c b/src/modules/keyboard/keyboard.c index 5c582b122..ed67bf569 100644 --- a/src/modules/keyboard/keyboard.c +++ b/src/modules/keyboard/keyboard.c @@ -63,10 +63,7 @@ void ffParseKeyboardJsonObject(FFKeyboardOptions* options, yyjson_val* module) void ffGenerateKeyboardJsonConfig(FFKeyboardOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyKeyboardOptions))) FFKeyboardOptions defaultOptions; - ffInitKeyboardOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateKeyboardJsonResult(FF_MAYBE_UNUSED FFKeyboardOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/lm/lm.c b/src/modules/lm/lm.c index 09d56ea57..df67aa076 100644 --- a/src/modules/lm/lm.c +++ b/src/modules/lm/lm.c @@ -62,10 +62,7 @@ void ffParseLMJsonObject(FFLMOptions* options, yyjson_val* module) void ffGenerateLMJsonConfig(FFLMOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyLMOptions))) FFLMOptions defaultOptions; - ffInitLMOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateLMJsonResult(FF_MAYBE_UNUSED FFLMOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/loadavg/loadavg.c b/src/modules/loadavg/loadavg.c index a6fc70eb5..8d1d76ead 100644 --- a/src/modules/loadavg/loadavg.c +++ b/src/modules/loadavg/loadavg.c @@ -120,18 +120,13 @@ void ffParseLoadavgJsonObject(FFLoadavgOptions* options, yyjson_val* module) void ffGenerateLoadavgJsonConfig(FFLoadavgOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyLoadavgOptions))) FFLoadavgOptions defaultOptions; - ffInitLoadavgOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + yyjson_mut_obj_add_uint(doc, module, "ndigits", options->ndigits); - if (defaultOptions.ndigits != options->ndigits) - yyjson_mut_obj_add_uint(doc, module, "ndigits", options->ndigits); + yyjson_mut_obj_add_bool(doc, module, "compact", options->compact); - if (defaultOptions.compact != options->compact) - yyjson_mut_obj_add_bool(doc, module, "compact", options->compact); - - ffPercentGenerateJsonConfig(doc, module, defaultOptions.percent, options->percent); + ffPercentGenerateJsonConfig(doc, module, options->percent); } void ffGenerateLoadavgJsonResult(FF_MAYBE_UNUSED FFLoadavgOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/locale/locale.c b/src/modules/locale/locale.c index 40b1dcfba..1dc81d342 100644 --- a/src/modules/locale/locale.c +++ b/src/modules/locale/locale.c @@ -43,10 +43,7 @@ void ffParseLocaleJsonObject(FFLocaleOptions* options, yyjson_val* module) void ffGenerateLocaleJsonConfig(FFLocaleOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyLocaleOptions))) FFLocaleOptions defaultOptions; - ffInitLocaleOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateLocaleJsonResult(FF_MAYBE_UNUSED FFLocaleOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/localip/localip.c b/src/modules/localip/localip.c index d2e754e68..b6edad879 100644 --- a/src/modules/localip/localip.c +++ b/src/modules/localip/localip.c @@ -298,49 +298,31 @@ void ffParseLocalIpJsonObject(FFLocalIpOptions* options, yyjson_val* module) void ffGenerateLocalIpJsonConfig(FFLocalIpOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyLocalIpOptions))) FFLocalIpOptions defaultOptions; - ffInitLocalIpOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + yyjson_mut_obj_add_bool(doc, module, "showIpv4", !!(options->showType & FF_LOCALIP_TYPE_IPV4_BIT)); - if (defaultOptions.showType != options->showType) - { - if (!(options->showType & FF_LOCALIP_TYPE_IPV4_BIT)) - yyjson_mut_obj_add_bool(doc, module, "showIpv4", false); + yyjson_mut_obj_add_bool(doc, module, "showIpv6", !!(options->showType & FF_LOCALIP_TYPE_IPV6_BIT)); - if (options->showType & FF_LOCALIP_TYPE_IPV6_BIT) - yyjson_mut_obj_add_bool(doc, module, "showIpv6", true); + yyjson_mut_obj_add_bool(doc, module, "showMac", !!(options->showType & FF_LOCALIP_TYPE_MAC_BIT)); - if (options->showType & FF_LOCALIP_TYPE_MAC_BIT) - yyjson_mut_obj_add_bool(doc, module, "showMac", true); + yyjson_mut_obj_add_bool(doc, module, "showLoop", !!(options->showType & FF_LOCALIP_TYPE_LOOP_BIT)); - if (options->showType & FF_LOCALIP_TYPE_LOOP_BIT) - yyjson_mut_obj_add_bool(doc, module, "showLoop", true); + yyjson_mut_obj_add_bool(doc, module, "showPrefixLen", !!(options->showType & FF_LOCALIP_TYPE_PREFIX_LEN_BIT)); - if (options->showType & FF_LOCALIP_TYPE_PREFIX_LEN_BIT) - yyjson_mut_obj_add_bool(doc, module, "showPrefixLen", true); + yyjson_mut_obj_add_bool(doc, module, "showMtu", !!(options->showType & FF_LOCALIP_TYPE_MTU_BIT)); - if (options->showType & FF_LOCALIP_TYPE_MTU_BIT) - yyjson_mut_obj_add_bool(doc, module, "showMtu", true); + yyjson_mut_obj_add_bool(doc, module, "showSpeed", !!(options->showType & FF_LOCALIP_TYPE_SPEED_BIT)); - if (options->showType & FF_LOCALIP_TYPE_SPEED_BIT) - yyjson_mut_obj_add_bool(doc, module, "showSpeed", true); + yyjson_mut_obj_add_bool(doc, module, "showFlags", !!(options->showType & FF_LOCALIP_TYPE_FLAGS_BIT)); - if (options->showType & FF_LOCALIP_TYPE_FLAGS_BIT) - yyjson_mut_obj_add_bool(doc, module, "showFlags", true); + yyjson_mut_obj_add_bool(doc, module, "compact", !!(options->showType & FF_LOCALIP_TYPE_COMPACT_BIT)); - if (options->showType & FF_LOCALIP_TYPE_COMPACT_BIT) - yyjson_mut_obj_add_bool(doc, module, "compact", true); + yyjson_mut_obj_add_bool(doc, module, "defaultRouteOnly", !!(options->showType & FF_LOCALIP_TYPE_DEFAULT_ROUTE_ONLY_BIT)); - if (!(options->showType & FF_LOCALIP_TYPE_DEFAULT_ROUTE_ONLY_BIT)) - yyjson_mut_obj_add_bool(doc, module, "defaultRouteOnly", false); + yyjson_mut_obj_add_bool(doc, module, "showAllIps", !!(options->showType & FF_LOCALIP_TYPE_ALL_IPS_BIT)); - if (options->showType & FF_LOCALIP_TYPE_ALL_IPS_BIT) - yyjson_mut_obj_add_bool(doc, module, "showAllIps", true); - } - - if (!ffStrbufEqual(&options->namePrefix, &defaultOptions.namePrefix)) - yyjson_mut_obj_add_strbuf(doc, module, "namePrefix", &options->namePrefix); + yyjson_mut_obj_add_strbuf(doc, module, "namePrefix", &options->namePrefix); } void ffGenerateLocalIpJsonResult(FF_MAYBE_UNUSED FFLocalIpOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/media/media.c b/src/modules/media/media.c index b14289cce..1a175008f 100644 --- a/src/modules/media/media.c +++ b/src/modules/media/media.c @@ -121,10 +121,7 @@ void ffParseMediaJsonObject(FFMediaOptions* options, yyjson_val* module) void ffGenerateMediaJsonConfig(FFMediaOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyMediaOptions))) FFMediaOptions defaultOptions; - ffInitMediaOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateMediaJsonResult(FF_MAYBE_UNUSED FFMediaOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/memory/memory.c b/src/modules/memory/memory.c index 6b7b09e96..659c44013 100644 --- a/src/modules/memory/memory.c +++ b/src/modules/memory/memory.c @@ -89,12 +89,9 @@ void ffParseMemoryJsonObject(FFMemoryOptions* options, yyjson_val* module) void ffGenerateMemoryJsonConfig(FFMemoryOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyMemoryOptions))) FFMemoryOptions defaultOptions; - ffInitMemoryOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); - - ffPercentGenerateJsonConfig(doc, module, defaultOptions.percent, options->percent); + ffPercentGenerateJsonConfig(doc, module, options->percent); } void ffGenerateMemoryJsonResult(FF_MAYBE_UNUSED FFMemoryOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/monitor/monitor.c b/src/modules/monitor/monitor.c index dfc6de0e9..65af67a12 100644 --- a/src/modules/monitor/monitor.c +++ b/src/modules/monitor/monitor.c @@ -101,10 +101,7 @@ void ffParseMonitorJsonObject(FFMonitorOptions* options, yyjson_val* module) void ffGenerateMonitorJsonConfig(FFMonitorOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyMonitorOptions))) FFMonitorOptions defaultOptions; - ffInitMonitorOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateMonitorJsonResult(FF_MAYBE_UNUSED FFMonitorOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/mouse/mouse.c b/src/modules/mouse/mouse.c index d1d83fe11..00ce7d4ba 100644 --- a/src/modules/mouse/mouse.c +++ b/src/modules/mouse/mouse.c @@ -63,10 +63,7 @@ void ffParseMouseJsonObject(FFMouseOptions* options, yyjson_val* module) void ffGenerateMouseJsonConfig(FFMouseOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyMouseOptions))) FFMouseOptions defaultOptions; - ffInitMouseOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateMouseJsonResult(FF_MAYBE_UNUSED FFMouseOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/netio/netio.c b/src/modules/netio/netio.c index 2595fa013..8e932d405 100644 --- a/src/modules/netio/netio.c +++ b/src/modules/netio/netio.c @@ -142,19 +142,15 @@ void ffParseNetIOJsonObject(FFNetIOOptions* options, yyjson_val* module) void ffGenerateNetIOJsonConfig(FFNetIOOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyNetIOOptions))) FFNetIOOptions defaultOptions; - ffInitNetIOOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + yyjson_mut_obj_add_strbuf(doc, module, "namePrefix", &options->namePrefix); - if (!ffStrbufEqual(&options->namePrefix, &defaultOptions.namePrefix)) - yyjson_mut_obj_add_strbuf(doc, module, "namePrefix", &options->namePrefix); + yyjson_mut_obj_add_bool(doc, module, "defaultRouteOnly", options->defaultRouteOnly); - if (options->defaultRouteOnly != defaultOptions.defaultRouteOnly) - yyjson_mut_obj_add_bool(doc, module, "defaultRouteOnly", options->defaultRouteOnly); + yyjson_mut_obj_add_bool(doc, module, "detectTotal", options->detectTotal); - if (options->detectTotal != defaultOptions.detectTotal) - yyjson_mut_obj_add_bool(doc, module, "detectTotal", options->detectTotal); + yyjson_mut_obj_add_uint(doc, module, "waitTime", options->waitTime); } void ffGenerateNetIOJsonResult(FFNetIOOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/opencl/opencl.c b/src/modules/opencl/opencl.c index 9bfb23976..64f0ba63e 100644 --- a/src/modules/opencl/opencl.c +++ b/src/modules/opencl/opencl.c @@ -45,10 +45,7 @@ void ffParseOpenCLJsonObject(FFOpenCLOptions* options, yyjson_val* module) void ffGenerateOpenCLJsonConfig(FFOpenCLOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyOpenCLOptions))) FFOpenCLOptions defaultOptions; - ffInitOpenCLOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateOpenCLJsonResult(FF_MAYBE_UNUSED FFOpenCLOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/opengl/opengl.c b/src/modules/opengl/opengl.c index 241da9902..9dc99887e 100644 --- a/src/modules/opengl/opengl.c +++ b/src/modules/opengl/opengl.c @@ -74,25 +74,19 @@ void ffParseOpenGLJsonObject(FFOpenGLOptions* options, yyjson_val* module) void ffGenerateOpenGLJsonConfig(FFOpenGLOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyOpenGLOptions))) FFOpenGLOptions defaultOptions; - ffInitOpenGLOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); - - if (options->library != defaultOptions.library) + switch (options->library) { - switch (options->library) - { - case FF_OPENGL_LIBRARY_AUTO: - yyjson_mut_obj_add_str(doc, module, "library", "auto"); - break; - case FF_OPENGL_LIBRARY_EGL: - yyjson_mut_obj_add_str(doc, module, "library", "egl"); - break; - case FF_OPENGL_LIBRARY_GLX: - yyjson_mut_obj_add_str(doc, module, "library", "glx"); - break; - } + case FF_OPENGL_LIBRARY_AUTO: + yyjson_mut_obj_add_str(doc, module, "library", "auto"); + break; + case FF_OPENGL_LIBRARY_EGL: + yyjson_mut_obj_add_str(doc, module, "library", "egl"); + break; + case FF_OPENGL_LIBRARY_GLX: + yyjson_mut_obj_add_str(doc, module, "library", "glx"); + break; } } diff --git a/src/modules/os/os.c b/src/modules/os/os.c index 2a363f399..c3b3efd66 100644 --- a/src/modules/os/os.c +++ b/src/modules/os/os.c @@ -130,10 +130,7 @@ void ffParseOSJsonObject(FFOSOptions* options, yyjson_val* module) void ffGenerateOSJsonConfig(FFOSOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyOSOptions))) FFOSOptions defaultOptions; - ffInitOSOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateOSJsonResult(FF_MAYBE_UNUSED FFOSOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/packages/packages.c b/src/modules/packages/packages.c index 0ca1f2cea..d17911de0 100644 --- a/src/modules/packages/packages.c +++ b/src/modules/packages/packages.c @@ -324,52 +324,50 @@ void ffParsePackagesJsonObject(FFPackagesOptions* options, yyjson_val* module) void ffGeneratePackagesJsonConfig(FFPackagesOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyPackagesOptions))) FFPackagesOptions defaultOptions; - ffInitPackagesOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); - - if (options->disabled != defaultOptions.disabled) - { - yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "disabled"); - #define FF_TEST_PACKAGE_NAME(name) else if ((options->disabled & FF_PACKAGES_FLAG_ ## name ## _BIT) != (defaultOptions.disabled & FF_PACKAGES_FLAG_ ## name ## _BIT)) { yyjson_mut_arr_add_str(doc, arr, #name); } - if (false); - FF_TEST_PACKAGE_NAME(AM) - FF_TEST_PACKAGE_NAME(APK) - FF_TEST_PACKAGE_NAME(BREW) - FF_TEST_PACKAGE_NAME(CHOCO) - FF_TEST_PACKAGE_NAME(DPKG) - FF_TEST_PACKAGE_NAME(EMERGE) - FF_TEST_PACKAGE_NAME(EOPKG) - FF_TEST_PACKAGE_NAME(FLATPAK) - FF_TEST_PACKAGE_NAME(GUIX) - FF_TEST_PACKAGE_NAME(HPKG) - FF_TEST_PACKAGE_NAME(LINGLONG) - FF_TEST_PACKAGE_NAME(LPKG) - FF_TEST_PACKAGE_NAME(LPKGBUILD) - FF_TEST_PACKAGE_NAME(MACPORTS) - FF_TEST_PACKAGE_NAME(MPORT) - FF_TEST_PACKAGE_NAME(NIX) - FF_TEST_PACKAGE_NAME(OPKG) - FF_TEST_PACKAGE_NAME(PACMAN) - FF_TEST_PACKAGE_NAME(PACSTALL) - FF_TEST_PACKAGE_NAME(PALUDIS) - FF_TEST_PACKAGE_NAME(PISI) - FF_TEST_PACKAGE_NAME(PKG) - FF_TEST_PACKAGE_NAME(PKGTOOL) - FF_TEST_PACKAGE_NAME(PKGSRC) - FF_TEST_PACKAGE_NAME(RPM) - FF_TEST_PACKAGE_NAME(SCOOP) - FF_TEST_PACKAGE_NAME(SNAP) - FF_TEST_PACKAGE_NAME(SOAR) - FF_TEST_PACKAGE_NAME(SORCERY) - FF_TEST_PACKAGE_NAME(WINGET) - FF_TEST_PACKAGE_NAME(XBPS) - #undef FF_TEST_PACKAGE_NAME + FF_STRBUF_AUTO_DESTROY buf = ffStrbufCreate(); + yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "disabled"); + #define FF_TEST_PACKAGE_NAME(name) else if ((options->disabled & FF_PACKAGES_FLAG_ ## name ## _BIT)) { \ + ffStrbufSetS(&buf, #name); \ + ffStrbufLowerCase(&buf); \ + yyjson_mut_arr_add_strbuf(doc, arr, &buf); \ } + if (false); + FF_TEST_PACKAGE_NAME(AM) + FF_TEST_PACKAGE_NAME(APK) + FF_TEST_PACKAGE_NAME(BREW) + FF_TEST_PACKAGE_NAME(CHOCO) + FF_TEST_PACKAGE_NAME(DPKG) + FF_TEST_PACKAGE_NAME(EMERGE) + FF_TEST_PACKAGE_NAME(EOPKG) + FF_TEST_PACKAGE_NAME(FLATPAK) + FF_TEST_PACKAGE_NAME(GUIX) + FF_TEST_PACKAGE_NAME(HPKG) + FF_TEST_PACKAGE_NAME(LINGLONG) + FF_TEST_PACKAGE_NAME(LPKG) + FF_TEST_PACKAGE_NAME(LPKGBUILD) + FF_TEST_PACKAGE_NAME(MACPORTS) + FF_TEST_PACKAGE_NAME(MPORT) + FF_TEST_PACKAGE_NAME(NIX) + FF_TEST_PACKAGE_NAME(OPKG) + FF_TEST_PACKAGE_NAME(PACMAN) + FF_TEST_PACKAGE_NAME(PACSTALL) + FF_TEST_PACKAGE_NAME(PALUDIS) + FF_TEST_PACKAGE_NAME(PISI) + FF_TEST_PACKAGE_NAME(PKG) + FF_TEST_PACKAGE_NAME(PKGTOOL) + FF_TEST_PACKAGE_NAME(PKGSRC) + FF_TEST_PACKAGE_NAME(RPM) + FF_TEST_PACKAGE_NAME(SCOOP) + FF_TEST_PACKAGE_NAME(SNAP) + FF_TEST_PACKAGE_NAME(SOAR) + FF_TEST_PACKAGE_NAME(SORCERY) + FF_TEST_PACKAGE_NAME(WINGET) + FF_TEST_PACKAGE_NAME(XBPS) + #undef FF_TEST_PACKAGE_NAME - if (options->combined != defaultOptions.combined) - yyjson_mut_obj_add_bool(doc, module, "combined", options->combined); + yyjson_mut_obj_add_bool(doc, module, "combined", options->combined); } void ffGeneratePackagesJsonResult(FF_MAYBE_UNUSED FFPackagesOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/physicaldisk/physicaldisk.c b/src/modules/physicaldisk/physicaldisk.c index 917816c61..601ecd723 100644 --- a/src/modules/physicaldisk/physicaldisk.c +++ b/src/modules/physicaldisk/physicaldisk.c @@ -157,15 +157,11 @@ void ffParsePhysicalDiskJsonObject(FFPhysicalDiskOptions* options, yyjson_val* m void ffGeneratePhysicalDiskJsonConfig(FFPhysicalDiskOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyPhysicalDiskOptions))) FFPhysicalDiskOptions defaultOptions; - ffInitPhysicalDiskOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + yyjson_mut_obj_add_strbuf(doc, module, "namePrefix", &options->namePrefix); - if (!ffStrbufEqual(&options->namePrefix, &defaultOptions.namePrefix)) - yyjson_mut_obj_add_strbuf(doc, module, "namePrefix", &options->namePrefix); - - ffTempsGenerateJsonConfig(doc, module, defaultOptions.temp, defaultOptions.tempConfig, options->temp, options->tempConfig); + ffTempsGenerateJsonConfig(doc, module, options->temp, options->tempConfig); } void ffGeneratePhysicalDiskJsonResult(FFPhysicalDiskOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/physicalmemory/physicalmemory.c b/src/modules/physicalmemory/physicalmemory.c index 81a05b47c..09534595d 100644 --- a/src/modules/physicalmemory/physicalmemory.c +++ b/src/modules/physicalmemory/physicalmemory.c @@ -95,10 +95,7 @@ void ffParsePhysicalMemoryJsonObject(FFPhysicalMemoryOptions* options, yyjson_va void ffGeneratePhysicalMemoryJsonConfig(FFPhysicalMemoryOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyPhysicalMemoryOptions))) FFPhysicalMemoryOptions defaultOptions; - ffInitPhysicalMemoryOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGeneratePhysicalMemoryJsonResult(FF_MAYBE_UNUSED FFPhysicalMemoryOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/player/player.c b/src/modules/player/player.c index 72af48027..347a2977e 100644 --- a/src/modules/player/player.c +++ b/src/modules/player/player.c @@ -96,10 +96,7 @@ void ffParsePlayerJsonObject(FFPlayerOptions* options, yyjson_val* module) void ffGeneratePlayerJsonConfig(FFPlayerOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyPlayerOptions))) FFPlayerOptions defaultOptions; - ffInitPlayerOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGeneratePlayerJsonResult(FF_MAYBE_UNUSED FFMediaOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/poweradapter/poweradapter.c b/src/modules/poweradapter/poweradapter.c index 0ed4813a3..00c96ab0e 100644 --- a/src/modules/poweradapter/poweradapter.c +++ b/src/modules/poweradapter/poweradapter.c @@ -58,10 +58,7 @@ void ffPrintPowerAdapter(FFPowerAdapterOptions* options) void ffGeneratePowerAdapterJsonConfig(FFPowerAdapterOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyPowerAdapterOptions))) FFPowerAdapterOptions defaultOptions; - ffInitPowerAdapterOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffParsePowerAdapterJsonObject(FFPowerAdapterOptions* options, yyjson_val* module) diff --git a/src/modules/processes/processes.c b/src/modules/processes/processes.c index 4277e71a4..e7740a448 100644 --- a/src/modules/processes/processes.c +++ b/src/modules/processes/processes.c @@ -44,10 +44,7 @@ void ffParseProcessesJsonObject(FFProcessesOptions* options, yyjson_val* module) void ffGenerateProcessesJsonConfig(FFProcessesOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyProcessesOptions))) FFProcessesOptions defaultOptions; - ffInitProcessesOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateProcessesJsonResult(FF_MAYBE_UNUSED FFProcessesOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/publicip/publicip.c b/src/modules/publicip/publicip.c index 187a95a17..e52696dd6 100644 --- a/src/modules/publicip/publicip.c +++ b/src/modules/publicip/publicip.c @@ -72,19 +72,13 @@ void ffParsePublicIpJsonObject(FFPublicIPOptions* options, yyjson_val* module) void ffGeneratePublicIpJsonConfig(FFPublicIPOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyPublicIpOptions))) FFPublicIPOptions defaultOptions; - ffInitPublicIpOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + yyjson_mut_obj_add_strbuf(doc, module, "url", &options->url); - if (!ffStrbufEqual(&options->url, &defaultOptions.url)) - yyjson_mut_obj_add_strbuf(doc, module, "url", &options->url); + yyjson_mut_obj_add_uint(doc, module, "timeout", options->timeout); - if (defaultOptions.timeout != options->timeout) - yyjson_mut_obj_add_uint(doc, module, "timeout", options->timeout); - - if (defaultOptions.ipv6 != options->ipv6) - yyjson_mut_obj_add_bool(doc, module, "ipv6", options->ipv6); + yyjson_mut_obj_add_bool(doc, module, "ipv6", options->ipv6); } void ffGeneratePublicIpJsonResult(FFPublicIPOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/separator/separator.c b/src/modules/separator/separator.c index 3786949ad..0eec28119 100644 --- a/src/modules/separator/separator.c +++ b/src/modules/separator/separator.c @@ -147,11 +147,9 @@ void ffParseSeparatorJsonObject(FFSeparatorOptions* options, yyjson_val* module) void ffGenerateSeparatorJsonConfig(FFSeparatorOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroySeparatorOptions))) FFSeparatorOptions defaultOptions; - ffInitSeparatorOptions(&defaultOptions); - - if (!ffStrbufEqual(&options->string, &defaultOptions.string)) - yyjson_mut_obj_add_strbuf(doc, module, "string", &options->string); + yyjson_mut_obj_add_strbuf(doc, module, "string", &options->string); + yyjson_mut_obj_add_strbuf(doc, module, "outputColor", &options->outputColor); + yyjson_mut_obj_add_uint(doc, module, "length", options->length); } void ffInitSeparatorOptions(FFSeparatorOptions* options) diff --git a/src/modules/shell/shell.c b/src/modules/shell/shell.c index 4ec724b62..42bb9149d 100644 --- a/src/modules/shell/shell.c +++ b/src/modules/shell/shell.c @@ -57,10 +57,7 @@ void ffParseShellJsonObject(FFShellOptions* options, yyjson_val* module) void ffGenerateShellJsonConfig(FFShellOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyShellOptions))) FFShellOptions defaultOptions; - ffInitShellOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateShellJsonResult(FF_MAYBE_UNUSED FFShellOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/sound/sound.c b/src/modules/sound/sound.c index dcc9e75a9..1b4d0285c 100644 --- a/src/modules/sound/sound.c +++ b/src/modules/sound/sound.c @@ -146,28 +146,22 @@ void ffParseSoundJsonObject(FFSoundOptions* options, yyjson_val* module) void ffGenerateSoundJsonConfig(FFSoundOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroySoundOptions))) FFSoundOptions defaultOptions; - ffInitSoundOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); - - if (defaultOptions.soundType != options->soundType) + switch (options->soundType) { - switch (options->soundType) - { - case FF_SOUND_TYPE_MAIN: - yyjson_mut_obj_add_str(doc, module, "soundType", "main"); - break; - case FF_SOUND_TYPE_ACTIVE: - yyjson_mut_obj_add_str(doc, module, "soundType", "active"); - break; - case FF_SOUND_TYPE_ALL: - yyjson_mut_obj_add_str(doc, module, "soundType", "all"); - break; - } + case FF_SOUND_TYPE_MAIN: + yyjson_mut_obj_add_str(doc, module, "soundType", "main"); + break; + case FF_SOUND_TYPE_ACTIVE: + yyjson_mut_obj_add_str(doc, module, "soundType", "active"); + break; + case FF_SOUND_TYPE_ALL: + yyjson_mut_obj_add_str(doc, module, "soundType", "all"); + break; } - ffPercentGenerateJsonConfig(doc, module, defaultOptions.percent, options->percent); + ffPercentGenerateJsonConfig(doc, module, options->percent); } void ffGenerateSoundJsonResult(FF_MAYBE_UNUSED FFSoundOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/swap/swap.c b/src/modules/swap/swap.c index ea2d01d41..45e01c77b 100644 --- a/src/modules/swap/swap.c +++ b/src/modules/swap/swap.c @@ -155,12 +155,10 @@ void ffParseSwapJsonObject(FFSwapOptions* options, yyjson_val* module) void ffGenerateSwapJsonConfig(FFSwapOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroySwapOptions))) FFSwapOptions defaultOptions; - ffInitSwapOptions(&defaultOptions); + ffPercentGenerateJsonConfig(doc, module, options->percent); - ffPercentGenerateJsonConfig(doc, module, defaultOptions.percent, options->percent); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); + yyjson_mut_obj_add_bool(doc, module, "separate", options->separate); } void ffGenerateSwapJsonResult(FF_MAYBE_UNUSED FFSwapOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/terminal/terminal.c b/src/modules/terminal/terminal.c index caede6747..f5085421d 100644 --- a/src/modules/terminal/terminal.c +++ b/src/modules/terminal/terminal.c @@ -53,10 +53,7 @@ void ffParseTerminalJsonObject(FFTerminalOptions* options, yyjson_val* module) void ffGenerateTerminalJsonConfig(FFTerminalOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyTerminalOptions))) FFTerminalOptions defaultOptions; - ffInitTerminalOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateTerminalJsonResult(FF_MAYBE_UNUSED FFTerminalOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/terminalfont/terminalfont.c b/src/modules/terminalfont/terminalfont.c index 7356369ec..7ba2fc673 100644 --- a/src/modules/terminalfont/terminalfont.c +++ b/src/modules/terminalfont/terminalfont.c @@ -61,10 +61,7 @@ void ffParseTerminalFontJsonObject(FFTerminalFontOptions* options, yyjson_val* m void ffGenerateTerminalFontJsonConfig(FFTerminalFontOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyTerminalFontOptions))) FFTerminalFontOptions defaultOptions; - ffInitTerminalFontOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateTerminalFontJsonResult(FF_MAYBE_UNUSED FFTerminalFontOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/terminalsize/terminalsize.c b/src/modules/terminalsize/terminalsize.c index ec9148b9b..bc220107e 100644 --- a/src/modules/terminalsize/terminalsize.c +++ b/src/modules/terminalsize/terminalsize.c @@ -53,10 +53,7 @@ void ffParseTerminalSizeJsonObject(FFTerminalSizeOptions* options, yyjson_val* m void ffGenerateTerminalSizeJsonConfig(FFTerminalSizeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyTerminalSizeOptions))) FFTerminalSizeOptions defaultOptions; - ffInitTerminalSizeOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateTerminalSizeJsonResult(FF_MAYBE_UNUSED FFTerminalSizeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/terminaltheme/terminaltheme.c b/src/modules/terminaltheme/terminaltheme.c index 2b504fd5b..e6286dd6a 100644 --- a/src/modules/terminaltheme/terminaltheme.c +++ b/src/modules/terminaltheme/terminaltheme.c @@ -58,10 +58,7 @@ void ffParseTerminalThemeJsonObject(FFTerminalThemeOptions* options, yyjson_val* void ffGenerateTerminalThemeJsonConfig(FFTerminalThemeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyTerminalThemeOptions))) FFTerminalThemeOptions defaultOptions; - ffInitTerminalThemeOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateTerminalThemeJsonResult(FF_MAYBE_UNUSED FFTerminalThemeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/theme/theme.c b/src/modules/theme/theme.c index f6cfd945b..d0945fb0d 100644 --- a/src/modules/theme/theme.c +++ b/src/modules/theme/theme.c @@ -58,10 +58,7 @@ void ffParseThemeJsonObject(FFThemeOptions* options, yyjson_val* module) void ffGenerateThemeJsonConfig(FFThemeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyThemeOptions))) FFThemeOptions defaultOptions; - ffInitThemeOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateThemeJsonResult(FF_MAYBE_UNUSED FFThemeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/title/title.c b/src/modules/title/title.c index 8821ac2d5..c5a12b0a1 100644 --- a/src/modules/title/title.c +++ b/src/modules/title/title.c @@ -106,27 +106,14 @@ void ffParseTitleJsonObject(FFTitleOptions* options, yyjson_val* module) void ffGenerateTitleJsonConfig(FFTitleOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyTitleOptions))) FFTitleOptions defaultOptions; - ffInitTitleOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + yyjson_mut_obj_add_bool(doc, module, "fqdn", options->fqdn); - if (defaultOptions.fqdn != options->fqdn) - yyjson_mut_obj_add_bool(doc, module, "fqdn", options->fqdn); - - yyjson_mut_val* color = yyjson_mut_obj(doc); - - if (!ffStrbufEqual(&options->colorUser, &defaultOptions.colorUser)) - yyjson_mut_obj_add_strbuf(doc, color, "user", &options->colorUser); - - if (!ffStrbufEqual(&options->colorAt, &defaultOptions.colorAt)) - yyjson_mut_obj_add_strbuf(doc, color, "at", &options->colorAt); - - if (!ffStrbufEqual(&options->colorHost, &defaultOptions.colorHost)) - yyjson_mut_obj_add_strbuf(doc, color, "host", &options->colorHost); - - if (yyjson_mut_obj_size(color)) - yyjson_mut_obj_add_val(doc, module, "color", color); + yyjson_mut_val* color = yyjson_mut_obj_add_obj(doc, module, "color"); + yyjson_mut_obj_add_strbuf(doc, color, "user", &options->colorUser); + yyjson_mut_obj_add_strbuf(doc, color, "at", &options->colorAt); + yyjson_mut_obj_add_strbuf(doc, color, "host", &options->colorHost); } void ffGenerateTitleJsonResult(FF_MAYBE_UNUSED FFTitleOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/tpm/tpm.c b/src/modules/tpm/tpm.c index fc447d160..ad540bf12 100644 --- a/src/modules/tpm/tpm.c +++ b/src/modules/tpm/tpm.c @@ -53,10 +53,7 @@ void ffParseTPMJsonObject(FFTPMOptions* options, yyjson_val* module) void ffGenerateTPMJsonConfig(FFTPMOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyTPMOptions))) FFTPMOptions defaultOptions; - ffInitTPMOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateTPMJsonResult(FF_MAYBE_UNUSED FFTPMOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/uptime/uptime.c b/src/modules/uptime/uptime.c index d0b489cac..ca64ec572 100644 --- a/src/modules/uptime/uptime.c +++ b/src/modules/uptime/uptime.c @@ -71,10 +71,7 @@ void ffParseUptimeJsonObject(FFUptimeOptions* options, yyjson_val* module) void ffGenerateUptimeJsonConfig(FFUptimeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyUptimeOptions))) FFUptimeOptions defaultOptions; - ffInitUptimeOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateUptimeJsonResult(FF_MAYBE_UNUSED FFUptimeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/users/users.c b/src/modules/users/users.c index cd82d359a..fce2dc7ef 100644 --- a/src/modules/users/users.c +++ b/src/modules/users/users.c @@ -137,16 +137,11 @@ void ffParseUsersJsonObject(FFUsersOptions* options, yyjson_val* module) void ffGenerateUsersJsonConfig(FFUsersOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyUsersOptions))) FFUsersOptions defaultOptions; - ffInitUsersOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + yyjson_mut_obj_add_bool(doc, module, "compact", options->compact); - if (options->compact != defaultOptions.compact) - yyjson_mut_obj_add_bool(doc, module, "compact", options->compact); - - if (options->myselfOnly != defaultOptions.myselfOnly) - yyjson_mut_obj_add_bool(doc, module, "myselfOnly", options->myselfOnly); + yyjson_mut_obj_add_bool(doc, module, "myselfOnly", options->myselfOnly); } void ffGenerateUsersJsonResult(FFUsersOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/version/version.c b/src/modules/version/version.c index 42b50e11e..15f519c12 100644 --- a/src/modules/version/version.c +++ b/src/modules/version/version.c @@ -59,10 +59,7 @@ void ffParseVersionJsonObject(FFVersionOptions* options, yyjson_val* module) void ffGenerateVersionJsonConfig(FFVersionOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyVersionOptions))) FFVersionOptions defaultOptions; - ffInitVersionOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateVersionJsonResult(FF_MAYBE_UNUSED FFVersionOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/vulkan/vulkan.c b/src/modules/vulkan/vulkan.c index 331f91a61..429df582c 100644 --- a/src/modules/vulkan/vulkan.c +++ b/src/modules/vulkan/vulkan.c @@ -65,10 +65,7 @@ void ffParseVulkanJsonObject(FFVulkanOptions* options, yyjson_val* module) void ffGenerateVulkanJsonConfig(FFVulkanOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyVulkanOptions))) FFVulkanOptions defaultOptions; - ffInitVulkanOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateVulkanJsonResult(FF_MAYBE_UNUSED FFVulkanOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/wallpaper/wallpaper.c b/src/modules/wallpaper/wallpaper.c index fe7c3efc1..6c6466b38 100644 --- a/src/modules/wallpaper/wallpaper.c +++ b/src/modules/wallpaper/wallpaper.c @@ -55,10 +55,7 @@ void ffParseWallpaperJsonObject(FFWallpaperOptions* options, yyjson_val* module) void ffGenerateWallpaperJsonConfig(FFWallpaperOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyWallpaperOptions))) FFWallpaperOptions defaultOptions; - ffInitWallpaperOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateWallpaperJsonResult(FF_MAYBE_UNUSED FFWallpaperOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/weather/weather.c b/src/modules/weather/weather.c index e44c75c31..fec43ff5d 100644 --- a/src/modules/weather/weather.c +++ b/src/modules/weather/weather.c @@ -62,19 +62,13 @@ void ffParseWeatherJsonObject(FFWeatherOptions* options, yyjson_val* module) void ffGenerateWeatherJsonConfig(FFWeatherOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyWeatherOptions))) FFWeatherOptions defaultOptions; - ffInitWeatherOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + yyjson_mut_obj_add_strbuf(doc, module, "location", &options->location); - if (!ffStrbufEqual(&options->location, &defaultOptions.location)) - yyjson_mut_obj_add_strbuf(doc, module, "location", &options->location); + yyjson_mut_obj_add_strbuf(doc, module, "outputFormat", &options->outputFormat); - if (!ffStrbufEqual(&options->outputFormat, &defaultOptions.outputFormat)) - yyjson_mut_obj_add_strbuf(doc, module, "outputFormat", &options->outputFormat); - - if (options->timeout != defaultOptions.timeout) - yyjson_mut_obj_add_uint(doc, module, "timeout", options->timeout); + yyjson_mut_obj_add_uint(doc, module, "timeout", options->timeout); } void ffGenerateWeatherJsonResult(FFWeatherOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/wifi/wifi.c b/src/modules/wifi/wifi.c index e7d411017..47bb21985 100644 --- a/src/modules/wifi/wifi.c +++ b/src/modules/wifi/wifi.c @@ -154,12 +154,9 @@ void ffParseWifiJsonObject(FFWifiOptions* options, yyjson_val* module) void ffGenerateWifiJsonConfig(FFWifiOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyWifiOptions))) FFWifiOptions defaultOptions; - ffInitWifiOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); - - ffPercentGenerateJsonConfig(doc, module, defaultOptions.percent, options->percent); + ffPercentGenerateJsonConfig(doc, module, options->percent); } void ffGenerateWifiJsonResult(FF_MAYBE_UNUSED FFWifiOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/wm/wm.c b/src/modules/wm/wm.c index 6da7ea9d6..6753ce2da 100644 --- a/src/modules/wm/wm.c +++ b/src/modules/wm/wm.c @@ -84,13 +84,9 @@ void ffParseWMJsonObject(FFWMOptions* options, yyjson_val* module) void ffGenerateWMJsonConfig(FFWMOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyWMOptions))) FFWMOptions defaultOptions; - ffInitWMOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); - - if (options->detectPlugin != defaultOptions.detectPlugin) - yyjson_mut_obj_add_bool(doc, module, "detectPlugin", options->detectPlugin); + yyjson_mut_obj_add_bool(doc, module, "detectPlugin", options->detectPlugin); } void ffGenerateWMJsonResult(FF_MAYBE_UNUSED FFWMOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/wmtheme/wmtheme.c b/src/modules/wmtheme/wmtheme.c index d7e4178dc..d40ab821e 100644 --- a/src/modules/wmtheme/wmtheme.c +++ b/src/modules/wmtheme/wmtheme.c @@ -44,10 +44,7 @@ void ffParseWMThemeJsonObject(FFWMThemeOptions* options, yyjson_val* module) void ffGenerateWMThemeJsonConfig(FFWMThemeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyWMThemeOptions))) FFWMThemeOptions defaultOptions; - ffInitWMThemeOptions(&defaultOptions); - - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); } void ffGenerateWMThemeJsonResult(FF_MAYBE_UNUSED FFWMThemeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/modules/zpool/zpool.c b/src/modules/zpool/zpool.c index 5b6eecf9f..7eefe0240 100644 --- a/src/modules/zpool/zpool.c +++ b/src/modules/zpool/zpool.c @@ -125,12 +125,9 @@ void ffParseZpoolJsonObject(FFZpoolOptions* options, yyjson_val* module) void ffGenerateZpoolJsonConfig(FFZpoolOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - __attribute__((__cleanup__(ffDestroyZpoolOptions))) FFZpoolOptions defaultOptions; - ffInitZpoolOptions(&defaultOptions); + ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs); - ffJsonConfigGenerateModuleArgsConfig(doc, module, &defaultOptions.moduleArgs, &options->moduleArgs); - - ffPercentGenerateJsonConfig(doc, module, defaultOptions.percent, options->percent); + ffPercentGenerateJsonConfig(doc, module, options->percent); } void ffGenerateZpoolJsonResult(FF_MAYBE_UNUSED FFZpoolOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) diff --git a/src/options/display.c b/src/options/display.c index defbb89a9..1f0d22a2b 100644 --- a/src/options/display.c +++ b/src/options/display.c @@ -343,7 +343,16 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va if (!yyjson_is_obj(color)) return "display.bar.color must be an object"; yyjson_val* colorElapsed = yyjson_obj_get(color, "elapsed"); - if (colorElapsed) ffOptionParseColor(yyjson_get_str(colorElapsed), &options->barColorElapsed); + if (colorElapsed) + { + const char* value = yyjson_get_str(colorElapsed); + if (!value) + ffStrbufClear(&options->barColorElapsed); + else if (ffStrEqualsIgnCase(value, "auto")) + ffStrbufSetStatic(&options->barColorElapsed, "auto"); + else + ffOptionParseColor(value, &options->barColorElapsed); + } yyjson_val* colorTotal = yyjson_obj_get(color, "total"); if (colorTotal) ffOptionParseColor(yyjson_get_str(colorTotal), &options->barColorTotal); @@ -700,7 +709,14 @@ bool ffOptionsParseDisplayCommandLine(FFOptionsDisplay* options, const char* key else if(ffStrEqualsIgnCase(subkey, "border-right-elapsed")) ffOptionParseString(key, value, &options->barBorderRightElapsed); else if(ffStrEqualsIgnCase(subkey, "color-elapsed")) - ffOptionParseColor(value, &options->barColorElapsed); + { + if (!value) + ffStrbufClear(&options->barColorElapsed); + else if (ffStrEqualsIgnCase(value, "auto")) + ffStrbufSetStatic(&options->barColorElapsed, "auto"); + else + ffOptionParseColor(value, &options->barColorElapsed); + } else if(ffStrEqualsIgnCase(subkey, "color-total")) ffOptionParseColor(value, &options->barColorTotal); else if(ffStrEqualsIgnCase(subkey, "color-border")) @@ -813,188 +829,239 @@ void ffOptionsDestroyDisplay(FFOptionsDisplay* options) void ffOptionsGenerateDisplayJsonConfig(FFOptionsDisplay* options, yyjson_mut_doc* doc) { - __attribute__((__cleanup__(ffOptionsDestroyDisplay))) FFOptionsDisplay defaultOptions; - ffOptionsInitDisplay(&defaultOptions); + yyjson_mut_val* obj = yyjson_mut_obj_add_obj(doc, doc->root, "display"); - yyjson_mut_val* obj = yyjson_mut_obj(doc); + if (options->stat <= 0) + yyjson_mut_obj_add_bool(doc, obj, "stat", options->stat == 0); + else + yyjson_mut_obj_add_int(doc, obj, "stat", options->stat); + + yyjson_mut_obj_add_bool(doc, obj, "pipe", options->pipe); + + yyjson_mut_obj_add_bool(doc, obj, "showErrors", options->showErrors); + + yyjson_mut_obj_add_bool(doc, obj, "disableLinewrap", options->disableLinewrap); + + yyjson_mut_obj_add_bool(doc, obj, "hideCursor", options->hideCursor); + + yyjson_mut_obj_add_strbuf(doc, obj, "separator", &options->keyValueSeparator); - if (options->stat != defaultOptions.stat) { - if (options->stat <= 0) - yyjson_mut_obj_add_bool(doc, obj, "stat", options->stat == 0); + yyjson_mut_val* color = yyjson_mut_obj_add_obj(doc, obj, "color"); + yyjson_mut_obj_add_strbuf(doc, color, "keys", &options->colorKeys); + yyjson_mut_obj_add_strbuf(doc, color, "title", &options->colorTitle); + yyjson_mut_obj_add_strbuf(doc, color, "output", &options->colorOutput); + yyjson_mut_obj_add_strbuf(doc, color, "separator", &options->colorSeparator); + } + + yyjson_mut_obj_add_bool(doc, obj, "brightColor", options->brightColor); + + { + yyjson_mut_val* duration = yyjson_mut_obj_add_obj(doc, obj, "duration"); + yyjson_mut_obj_add_bool(doc, duration, "abbreviation", options->durationAbbreviation); + switch (options->durationSpaceBeforeUnit) + { + case FF_SPACE_BEFORE_UNIT_DEFAULT: + yyjson_mut_obj_add_str(doc, duration, "spaceBeforeUnit", "default"); + break; + case FF_SPACE_BEFORE_UNIT_ALWAYS: + yyjson_mut_obj_add_str(doc, duration, "spaceBeforeUnit", "always"); + break; + case FF_SPACE_BEFORE_UNIT_NEVER: + yyjson_mut_obj_add_str(doc, duration, "spaceBeforeUnit", "never"); + break; + } + } + + { + yyjson_mut_val* size = yyjson_mut_obj_add_obj(doc, obj, "size"); + yyjson_mut_obj_add_str(doc, size, "maxPrefix", ((const char* []) { + "B", + "kB", + "MB", + "GB", + "TB", + "PB", + "EB", + "ZB", + "YB", + })[options->sizeMaxPrefix]); + switch (options->sizeBinaryPrefix) + { + case FF_SIZE_BINARY_PREFIX_TYPE_IEC: + yyjson_mut_obj_add_str(doc, size, "binaryPrefix", "iec"); + break; + case FF_SIZE_BINARY_PREFIX_TYPE_SI: + yyjson_mut_obj_add_str(doc, size, "binaryPrefix", "si"); + break; + case FF_SIZE_BINARY_PREFIX_TYPE_JEDEC: + yyjson_mut_obj_add_str(doc, size, "binaryPrefix", "jedec"); + break; + } + yyjson_mut_obj_add_uint(doc, size, "ndigits", options->sizeNdigits); + switch (options->sizeSpaceBeforeUnit) + { + case FF_SPACE_BEFORE_UNIT_DEFAULT: + yyjson_mut_obj_add_str(doc, size, "spaceBeforeUnit", "default"); + break; + case FF_SPACE_BEFORE_UNIT_ALWAYS: + yyjson_mut_obj_add_str(doc, size, "spaceBeforeUnit", "always"); + break; + case FF_SPACE_BEFORE_UNIT_NEVER: + yyjson_mut_obj_add_str(doc, size, "spaceBeforeUnit", "never"); + break; + } + } + + { + yyjson_mut_val* temperature = yyjson_mut_obj_add_obj(doc, obj, "temp"); + switch (options->tempUnit) + { + case FF_TEMPERATURE_UNIT_DEFAULT: + yyjson_mut_obj_add_str(doc, temperature, "unit", "D"); + break; + case FF_TEMPERATURE_UNIT_CELSIUS: + yyjson_mut_obj_add_str(doc, obj, "unit", "C"); + break; + case FF_TEMPERATURE_UNIT_FAHRENHEIT: + yyjson_mut_obj_add_str(doc, obj, "unit", "F"); + break; + case FF_TEMPERATURE_UNIT_KELVIN: + yyjson_mut_obj_add_str(doc, obj, "unit", "K"); + break; + } + yyjson_mut_obj_add_uint(doc, temperature, "ndigits", options->tempNdigits); + { + yyjson_mut_val* color = yyjson_mut_obj_add_obj(doc, temperature, "color"); + yyjson_mut_obj_add_strbuf(doc, color, "green", &options->tempColorGreen); + yyjson_mut_obj_add_strbuf(doc, color, "yellow", &options->tempColorYellow); + yyjson_mut_obj_add_strbuf(doc, color, "red", &options->tempColorRed); + } + switch (options->tempSpaceBeforeUnit) + { + case FF_SPACE_BEFORE_UNIT_DEFAULT: + yyjson_mut_obj_add_str(doc, temperature, "spaceBeforeUnit", "default"); + break; + case FF_SPACE_BEFORE_UNIT_ALWAYS: + yyjson_mut_obj_add_str(doc, temperature, "spaceBeforeUnit", "always"); + break; + case FF_SPACE_BEFORE_UNIT_NEVER: + yyjson_mut_obj_add_str(doc, temperature, "spaceBeforeUnit", "never"); + break; + } + } + + { + yyjson_mut_val* percent = yyjson_mut_obj_add_obj(doc, obj, "percent"); + { + yyjson_mut_val* type = yyjson_mut_obj_add_arr(doc, percent, "type"); + if (options->percentType & FF_PERCENTAGE_TYPE_NUM_BIT) + yyjson_mut_arr_add_str(doc, type, "num"); + if (options->percentType & FF_PERCENTAGE_TYPE_BAR_BIT) + yyjson_mut_arr_add_str(doc, type, "var"); + if (options->percentType & FF_PERCENTAGE_TYPE_HIDE_OTHERS_BIT) + yyjson_mut_arr_add_str(doc, type, "hide-others"); + if (options->percentType & FF_PERCENTAGE_TYPE_NUM_COLOR_BIT) + yyjson_mut_arr_add_str(doc, type, "num-color"); + if (options->percentType & FF_PERCENTAGE_TYPE_BAR_MONOCHROME_BIT) + yyjson_mut_arr_add_str(doc, type, "bar-monochrome"); + } + yyjson_mut_obj_add_uint(doc, percent, "ndigits", options->percentNdigits); + { + yyjson_mut_val* color = yyjson_mut_obj_add_obj(doc, percent, "color"); + yyjson_mut_obj_add_strbuf(doc, color, "green", &options->percentColorGreen); + yyjson_mut_obj_add_strbuf(doc, color, "yellow", &options->percentColorYellow); + yyjson_mut_obj_add_strbuf(doc, color, "red", &options->percentColorRed); + } + switch (options->percentSpaceBeforeUnit) + { + case FF_SPACE_BEFORE_UNIT_DEFAULT: + yyjson_mut_obj_add_str(doc, percent, "spaceBeforeUnit", "default"); + break; + case FF_SPACE_BEFORE_UNIT_ALWAYS: + yyjson_mut_obj_add_str(doc, percent, "spaceBeforeUnit", "always"); + break; + case FF_SPACE_BEFORE_UNIT_NEVER: + yyjson_mut_obj_add_str(doc, percent, "spaceBeforeUnit", "never"); + break; + } + yyjson_mut_obj_add_uint(doc, percent, "width", options->percentWidth); + } + + { + yyjson_mut_val* bar = yyjson_mut_obj_add_obj(doc, obj, "bar"); + + yyjson_mut_val* char_ = yyjson_mut_obj_add_obj(doc, bar, "char"); + yyjson_mut_obj_add_strbuf(doc, char_, "elapsed", &options->barCharElapsed); + yyjson_mut_obj_add_strbuf(doc, char_, "total", &options->barCharTotal); + + yyjson_mut_val* border = yyjson_mut_obj_add_obj(doc, bar, "border"); + yyjson_mut_obj_add_strbuf(doc, border, "left", &options->barBorderLeft); + yyjson_mut_obj_add_strbuf(doc, border, "right", &options->barBorderRight); + yyjson_mut_obj_add_strbuf(doc, border, "leftElapsed", &options->barBorderLeftElapsed); + yyjson_mut_obj_add_strbuf(doc, border, "rightElapsed", &options->barBorderRightElapsed); + + yyjson_mut_val* color = yyjson_mut_obj_add_obj(doc, bar, "color"); + yyjson_mut_obj_add_strbuf(doc, color, "elapsed", &options->barColorElapsed); + yyjson_mut_obj_add_strbuf(doc, color, "total", &options->barColorTotal); + yyjson_mut_obj_add_strbuf(doc, color, "border", &options->barColorBorder); + + yyjson_mut_obj_add_uint(doc, bar, "width", options->barWidth); + } + + { + yyjson_mut_val* fraction = yyjson_mut_obj_add_obj(doc, obj, "fraction"); + + if (options->fractionNdigits < 0) + yyjson_mut_obj_add_null(doc, fraction, "ndigits"); else - yyjson_mut_obj_add_int(doc, obj, "stat", options->stat); + yyjson_mut_obj_add_uint(doc, fraction, "ndigits", (uint8_t) options->fractionNdigits); } - if (options->pipe != defaultOptions.pipe) - yyjson_mut_obj_add_bool(doc, obj, "pipe", options->pipe); - - if (options->showErrors != defaultOptions.showErrors) - yyjson_mut_obj_add_bool(doc, obj, "showErrors", options->showErrors); - - if (options->disableLinewrap != defaultOptions.disableLinewrap) - yyjson_mut_obj_add_bool(doc, obj, "disableLinewrap", options->disableLinewrap); - - if (options->hideCursor != defaultOptions.hideCursor) - yyjson_mut_obj_add_bool(doc, obj, "hideCursor", options->hideCursor); - - if (!ffStrbufEqual(&options->keyValueSeparator, &defaultOptions.keyValueSeparator)) - yyjson_mut_obj_add_strbuf(doc, obj, "separator", &options->keyValueSeparator); + yyjson_mut_obj_add_bool(doc, obj, "noBuffer", options->noBuffer); { - yyjson_mut_val* color = yyjson_mut_obj(doc); - if (!ffStrbufEqual(&options->colorKeys, &defaultOptions.colorKeys)) - yyjson_mut_obj_add_strbuf(doc, color, "keys", &options->colorKeys); - if (!ffStrbufEqual(&options->colorTitle, &defaultOptions.colorTitle)) - yyjson_mut_obj_add_strbuf(doc, color, "title", &options->colorTitle); - if (!ffStrbufEqual(&options->colorOutput, &defaultOptions.colorOutput)) - yyjson_mut_obj_add_strbuf(doc, color, "output", &options->colorOutput); - if (!ffStrbufEqual(&options->colorSeparator, &defaultOptions.colorSeparator)) - yyjson_mut_obj_add_strbuf(doc, color, "separator", &options->colorSeparator); - if (yyjson_mut_obj_size(color) > 0) + yyjson_mut_val* key = yyjson_mut_obj_add_obj(doc, obj, "key"); + yyjson_mut_obj_add_uint(doc, key, "width", options->keyWidth); + switch ((uint8_t) options->keyType) { - if (yyjson_mut_obj_size(color) == 2 && ffStrbufEqual(&options->colorKeys, &options->colorTitle)) - yyjson_mut_obj_add_strbuf(doc, obj, "color", &options->colorKeys); - else - yyjson_mut_obj_add_val(doc, obj, "color", color); + case FF_MODULE_KEY_TYPE_NONE: + yyjson_mut_obj_add_str(doc, key, "type", "none"); + break; + case FF_MODULE_KEY_TYPE_STRING: + yyjson_mut_obj_add_str(doc, key, "type", "string"); + break; + case FF_MODULE_KEY_TYPE_ICON: + yyjson_mut_obj_add_str(doc, key, "type", "icon"); + break; + case FF_MODULE_KEY_TYPE_BOTH: + yyjson_mut_obj_add_str(doc, key, "type", "both"); + break; } - } - if (options->brightColor != defaultOptions.brightColor) - yyjson_mut_obj_add_bool(doc, obj, "brightColor", options->brightColor); - - { - yyjson_mut_val* size = yyjson_mut_obj(doc); - if (options->sizeNdigits != defaultOptions.sizeNdigits) - yyjson_mut_obj_add_uint(doc, size, "ndigits", options->sizeNdigits); - if (options->sizeMaxPrefix != defaultOptions.sizeMaxPrefix && options->sizeMaxPrefix <= 8) - { - yyjson_mut_obj_add_str(doc, size, "maxPrefix", ((const char* []) { - "B", - "kB", - "MB", - "GB", - "TB", - "PB", - "EB", - "ZB", - "YB", - })[options->sizeMaxPrefix]); - } - if (options->sizeBinaryPrefix != defaultOptions.sizeBinaryPrefix) - { - switch (options->sizeBinaryPrefix) - { - case FF_SIZE_BINARY_PREFIX_TYPE_IEC: - yyjson_mut_obj_add_str(doc, size, "binaryPrefix", "iec"); - break; - case FF_SIZE_BINARY_PREFIX_TYPE_SI: - yyjson_mut_obj_add_str(doc, size, "binaryPrefix", "si"); - break; - case FF_SIZE_BINARY_PREFIX_TYPE_JEDEC: - yyjson_mut_obj_add_str(doc, size, "binaryPrefix", "jedec"); - break; - } - } - if (yyjson_mut_obj_size(size) > 0) - yyjson_mut_obj_add_val(doc, obj, "size", size); + yyjson_mut_obj_add_uint(doc, key, "paddingLeft", options->keyPaddingLeft); } { - yyjson_mut_val* temperature = yyjson_mut_obj(doc); - if (options->tempUnit != defaultOptions.tempUnit) + yyjson_mut_val* freq = yyjson_mut_obj_add_obj(doc, obj, "freq"); + yyjson_mut_obj_add_int(doc, freq, "ndigits", options->freqNdigits); + switch (options->percentSpaceBeforeUnit) { - switch (options->tempUnit) - { - case FF_TEMPERATURE_UNIT_DEFAULT: - yyjson_mut_obj_add_str(doc, temperature, "unit", "DEFAULT"); - break; - case FF_TEMPERATURE_UNIT_CELSIUS: - yyjson_mut_obj_add_str(doc, obj, "unit", "C"); - break; - case FF_TEMPERATURE_UNIT_FAHRENHEIT: - yyjson_mut_obj_add_str(doc, obj, "unit", "F"); - break; - case FF_TEMPERATURE_UNIT_KELVIN: - yyjson_mut_obj_add_str(doc, obj, "unit", "K"); - break; - } + case FF_SPACE_BEFORE_UNIT_DEFAULT: + yyjson_mut_obj_add_str(doc, freq, "spaceBeforeUnit", "default"); + break; + case FF_SPACE_BEFORE_UNIT_ALWAYS: + yyjson_mut_obj_add_str(doc, freq, "spaceBeforeUnit", "always"); + break; + case FF_SPACE_BEFORE_UNIT_NEVER: + yyjson_mut_obj_add_str(doc, freq, "spaceBeforeUnit", "never"); + break; } - if (options->tempNdigits != defaultOptions.tempNdigits) - yyjson_mut_obj_add_uint(doc, temperature, "ndigits", options->tempNdigits); - { - yyjson_mut_val* color = yyjson_mut_obj(doc); - if (!ffStrbufEqual(&options->tempColorGreen, &defaultOptions.tempColorGreen)) - yyjson_mut_obj_add_strbuf(doc, color, "green", &options->tempColorGreen); - if (!ffStrbufEqual(&options->tempColorYellow, &defaultOptions.tempColorYellow)) - yyjson_mut_obj_add_strbuf(doc, color, "yellow", &options->tempColorYellow); - if (!ffStrbufEqual(&options->tempColorRed, &defaultOptions.tempColorRed)) - yyjson_mut_obj_add_strbuf(doc, color, "red", &options->tempColorRed); - if (yyjson_mut_obj_size(color) > 0) - yyjson_mut_obj_add_val(doc, temperature, "color", color); - } - if (yyjson_mut_obj_size(temperature) > 0) - yyjson_mut_obj_add_val(doc, obj, "temp", temperature); } { - yyjson_mut_val* percent = yyjson_mut_obj(doc); - if (options->percentType != defaultOptions.percentType) - yyjson_mut_obj_add_uint(doc, percent, "type", options->percentType); - if (options->percentNdigits != defaultOptions.percentNdigits) - yyjson_mut_obj_add_uint(doc, percent, "ndigits", options->percentNdigits); - { - yyjson_mut_val* color = yyjson_mut_obj(doc); - if (!ffStrbufEqual(&options->percentColorGreen, &defaultOptions.percentColorGreen)) - yyjson_mut_obj_add_strbuf(doc, color, "green", &options->percentColorGreen); - if (!ffStrbufEqual(&options->percentColorYellow, &defaultOptions.percentColorYellow)) - yyjson_mut_obj_add_strbuf(doc, color, "yellow", &options->percentColorYellow); - if (!ffStrbufEqual(&options->percentColorRed, &defaultOptions.percentColorRed)) - yyjson_mut_obj_add_strbuf(doc, color, "red", &options->percentColorRed); - if (yyjson_mut_obj_size(color) > 0) - yyjson_mut_obj_add_val(doc, percent, "color", color); - } - if (yyjson_mut_obj_size(percent) > 0) - yyjson_mut_obj_add_val(doc, obj, "percent", percent); + yyjson_mut_val* constants = yyjson_mut_obj_add_arr(doc, obj, "constants"); + FF_LIST_FOR_EACH(FFstrbuf, item, options->constants) + yyjson_mut_arr_add_strbuf(doc, constants, item); } - - { - yyjson_mut_val* bar = yyjson_mut_obj(doc); - if (!ffStrbufEqual(&options->barCharElapsed, &defaultOptions.barCharElapsed)) - yyjson_mut_obj_add_strbuf(doc, bar, "charElapsed", &options->barCharElapsed); - if (!ffStrbufEqual(&options->barCharTotal, &defaultOptions.barCharTotal)) - yyjson_mut_obj_add_strbuf(doc, bar, "charTotal", &options->barCharTotal); - if (!ffStrbufEqual(&options->barBorderLeft, &defaultOptions.barBorderLeft)) - yyjson_mut_obj_add_strbuf(doc, bar, "borderLeft", &options->barBorderLeft); - if (!ffStrbufEqual(&options->barBorderRight, &defaultOptions.barBorderRight)) - yyjson_mut_obj_add_strbuf(doc, bar, "borderRight", &options->barBorderRight); - if (options->barWidth != defaultOptions.barWidth) - yyjson_mut_obj_add_uint(doc, bar, "width", options->barWidth); - - if (yyjson_mut_obj_size(bar) > 0) - yyjson_mut_obj_add_val(doc, obj, "bar", bar); - } - - if (options->noBuffer != defaultOptions.noBuffer) - yyjson_mut_obj_add_bool(doc, obj, "noBuffer", options->noBuffer); - - if (options->keyWidth != defaultOptions.keyWidth) - yyjson_mut_obj_add_uint(doc, obj, "keyWidth", options->keyWidth); - - if (options->keyType != defaultOptions.keyType) - yyjson_mut_obj_add_uint(doc, obj, "keyType", options->keyType); - - if (options->keyPaddingLeft != defaultOptions.keyPaddingLeft) - yyjson_mut_obj_add_uint(doc, obj, "keyPaddingLeft", options->keyPaddingLeft); - - { - yyjson_mut_val* freq = yyjson_mut_obj(doc); - if (options->freqNdigits != defaultOptions.freqNdigits) - yyjson_mut_obj_add_int(doc, freq, "ndigits", options->freqNdigits); - if (yyjson_mut_obj_size(freq) > 0) - yyjson_mut_obj_add_val(doc, obj, "freq", freq); - } - - if (yyjson_mut_obj_size(obj) > 0) - yyjson_mut_obj_add_val(doc, doc->root, "display", obj); } diff --git a/src/options/general.c b/src/options/general.c index e90355335..479bb9a10 100644 --- a/src/options/general.c +++ b/src/options/general.c @@ -121,45 +121,32 @@ void ffOptionsDestroyGeneral(FF_MAYBE_UNUSED FFOptionsGeneral* options) void ffOptionsGenerateGeneralJsonConfig(FFOptionsGeneral* options, yyjson_mut_doc* doc) { - __attribute__((__cleanup__(ffOptionsDestroyGeneral))) FFOptionsGeneral defaultOptions; - ffOptionsInitGeneral(&defaultOptions); + yyjson_mut_val* obj = yyjson_mut_obj_add_obj(doc, doc->root, "general"); - yyjson_mut_val* obj = yyjson_mut_obj(doc); + yyjson_mut_obj_add_bool(doc, obj, "thread", options->multithreading); - if (options->multithreading != defaultOptions.multithreading) - yyjson_mut_obj_add_bool(doc, obj, "thread", options->multithreading); - - if (options->processingTimeout != defaultOptions.processingTimeout) - yyjson_mut_obj_add_int(doc, obj, "processingTimeout", options->processingTimeout); + yyjson_mut_obj_add_int(doc, obj, "processingTimeout", options->processingTimeout); #if defined(__linux__) || defined(__FreeBSD__) || defined(__sun) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) - if (!ffStrbufEqual(&options->playerName, &defaultOptions.playerName)) - yyjson_mut_obj_add_strbuf(doc, obj, "playerName", &options->playerName); + yyjson_mut_obj_add_strbuf(doc, obj, "playerName", &options->playerName); - if (options->dsForceDrm != defaultOptions.dsForceDrm) + switch (options->dsForceDrm) { - 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; - } + 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; } #elif defined(_WIN32) - if (options->wmiTimeout != defaultOptions.wmiTimeout) - yyjson_mut_obj_add_int(doc, obj, "wmiTimeout", options->wmiTimeout); + yyjson_mut_obj_add_int(doc, obj, "wmiTimeout", options->wmiTimeout); #endif - - if (yyjson_mut_obj_size(obj) > 0) - yyjson_mut_obj_add_val(doc, doc->root, "general", obj); } diff --git a/src/options/logo.c b/src/options/logo.c index 1b6240d2e..34e420182 100644 --- a/src/options/logo.c +++ b/src/options/logo.c @@ -327,18 +327,28 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo } else if (ffStrEqualsIgnCase(key, "width")) { - uint32_t value = (uint32_t) yyjson_get_uint(val); - if (value == 0) - return "Logo width must be a positive integer"; - options->width = value; + if (yyjson_is_null(val)) + options->width = 0; + else + { + uint32_t value = (uint32_t) yyjson_get_uint(val); + if (value == 0) + return "Logo width must be a positive integer"; + options->width = value; + } continue; } else if (ffStrEqualsIgnCase(key, "height")) { - uint32_t value = (uint32_t) yyjson_get_uint(val); - if (value == 0) - return "Logo height must be a positive integer"; - options->height = value; + if (yyjson_is_null(val)) + options->height = 0; + else + { + uint32_t value = (uint32_t) yyjson_get_uint(val); + if (value == 0) + return "Logo height must be a positive integer"; + options->height = value; + } continue; } else if (ffStrEqualsIgnCase(key, "padding")) @@ -463,121 +473,106 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo void ffOptionsGenerateLogoJsonConfig(FFOptionsLogo* options, yyjson_mut_doc* doc) { - __attribute__((__cleanup__(ffOptionsDestroyLogo))) FFOptionsLogo defaultOptions; - ffOptionsInitLogo(&defaultOptions); - yyjson_mut_val* obj = yyjson_mut_obj(doc); - if (options->type != defaultOptions.type) + switch (options->type) { - switch (options->type) - { - case FF_LOGO_TYPE_NONE: - yyjson_mut_obj_add_null(doc, doc->root, "logo"); - return; - case FF_LOGO_TYPE_BUILTIN: - yyjson_mut_obj_add_str(doc, obj, "type", "builtin"); - break; - case FF_LOGO_TYPE_SMALL: - yyjson_mut_obj_add_str(doc, obj, "type", "small"); - break; - case FF_LOGO_TYPE_FILE: - yyjson_mut_obj_add_str(doc, obj, "type", "file"); - break; - case FF_LOGO_TYPE_FILE_RAW: - yyjson_mut_obj_add_str(doc, obj, "type", "file-raw"); - break; - case FF_LOGO_TYPE_DATA: - yyjson_mut_obj_add_str(doc, obj, "type", "data"); - break; - case FF_LOGO_TYPE_DATA_RAW: - yyjson_mut_obj_add_str(doc, obj, "type", "data-raw"); - break; - case FF_LOGO_TYPE_COMMAND_RAW: - yyjson_mut_obj_add_str(doc, obj, "type", "command-raw"); - break; - case FF_LOGO_TYPE_IMAGE_SIXEL: - yyjson_mut_obj_add_str(doc, obj, "type", "sixel"); - break; - case FF_LOGO_TYPE_IMAGE_KITTY: - yyjson_mut_obj_add_str(doc, obj, "type", "kitty"); - break; - case FF_LOGO_TYPE_IMAGE_ITERM: - yyjson_mut_obj_add_str(doc, obj, "type", "iterm"); - break; - case FF_LOGO_TYPE_IMAGE_CHAFA: - yyjson_mut_obj_add_str(doc, obj, "type", "chafa"); - break; - case FF_LOGO_TYPE_IMAGE_RAW: - yyjson_mut_obj_add_str(doc, obj, "type", "raw"); - break; - default: - yyjson_mut_obj_add_str(doc, obj, "type", "auto"); - break; - } + case FF_LOGO_TYPE_NONE: + yyjson_mut_obj_add_null(doc, doc->root, "logo"); + return; + case FF_LOGO_TYPE_BUILTIN: + yyjson_mut_obj_add_str(doc, obj, "type", "builtin"); + break; + case FF_LOGO_TYPE_SMALL: + yyjson_mut_obj_add_str(doc, obj, "type", "small"); + break; + case FF_LOGO_TYPE_FILE: + yyjson_mut_obj_add_str(doc, obj, "type", "file"); + break; + case FF_LOGO_TYPE_FILE_RAW: + yyjson_mut_obj_add_str(doc, obj, "type", "file-raw"); + break; + case FF_LOGO_TYPE_DATA: + yyjson_mut_obj_add_str(doc, obj, "type", "data"); + break; + case FF_LOGO_TYPE_DATA_RAW: + yyjson_mut_obj_add_str(doc, obj, "type", "data-raw"); + break; + case FF_LOGO_TYPE_COMMAND_RAW: + yyjson_mut_obj_add_str(doc, obj, "type", "command-raw"); + break; + case FF_LOGO_TYPE_IMAGE_SIXEL: + yyjson_mut_obj_add_str(doc, obj, "type", "sixel"); + break; + case FF_LOGO_TYPE_IMAGE_KITTY: + yyjson_mut_obj_add_str(doc, obj, "type", "kitty"); + break; + case FF_LOGO_TYPE_IMAGE_KITTY_DIRECT: + yyjson_mut_obj_add_str(doc, obj, "type", "kitty-direct"); + break; + case FF_LOGO_TYPE_IMAGE_KITTY_ICAT: + yyjson_mut_obj_add_str(doc, obj, "type", "kitty-icat"); + break; + case FF_LOGO_TYPE_IMAGE_ITERM: + yyjson_mut_obj_add_str(doc, obj, "type", "iterm"); + break; + case FF_LOGO_TYPE_IMAGE_CHAFA: + yyjson_mut_obj_add_str(doc, obj, "type", "chafa"); + break; + case FF_LOGO_TYPE_IMAGE_RAW: + yyjson_mut_obj_add_str(doc, obj, "type", "raw"); + break; + default: + yyjson_mut_obj_add_str(doc, obj, "type", "auto"); + break; } - if (!ffStrbufEqual(&options->source, &defaultOptions.source)) - yyjson_mut_obj_add_str(doc, obj, "source", options->source.chars); + yyjson_mut_obj_add_str(doc, obj, "source", options->source.chars); { yyjson_mut_val* color = yyjson_mut_obj(doc); for (int i = 0; i < FASTFETCH_LOGO_MAX_COLORS; i++) { - if (!ffStrbufEqual(&options->colors[i], &defaultOptions.colors[i])) - { - char c = (char)('1' + i); - yyjson_mut_obj_add(color, yyjson_mut_strncpy(doc, &c, 1), yyjson_mut_strbuf(doc, &options->colors[i])); - } + char c = (char)('1' + i); + yyjson_mut_obj_add(color, yyjson_mut_strncpy(doc, &c, 1), yyjson_mut_strbuf(doc, &options->colors[i])); } - if (yyjson_mut_obj_size(color) > 0) - yyjson_mut_obj_add_val(doc, obj, "color", color); + yyjson_mut_obj_add_val(doc, obj, "color", color); } - if (options->width != defaultOptions.width) + if (options->width == 0) + yyjson_mut_obj_add_null(doc, obj, "width"); + else yyjson_mut_obj_add_uint(doc, obj, "width", options->width); - if (options->height != defaultOptions.height) + if (options->height == 0) + yyjson_mut_obj_add_null(doc, obj, "height"); + else yyjson_mut_obj_add_uint(doc, obj, "height", options->height); { - yyjson_mut_val* padding = yyjson_mut_obj(doc); - if (options->paddingTop != defaultOptions.paddingTop) - yyjson_mut_obj_add_uint(doc, padding, "top", options->paddingTop); - if (options->paddingLeft != defaultOptions.paddingLeft) - yyjson_mut_obj_add_uint(doc, padding, "left", options->paddingLeft); - if (options->paddingRight != defaultOptions.paddingRight) - yyjson_mut_obj_add_uint(doc, padding, "right", options->paddingRight); - - if (yyjson_mut_obj_size(padding) > 0) - yyjson_mut_obj_add_val(doc, obj, "padding", padding); + yyjson_mut_val* padding = yyjson_mut_obj_add_obj(doc, obj, "padding"); + yyjson_mut_obj_add_uint(doc, padding, "top", options->paddingTop); + yyjson_mut_obj_add_uint(doc, padding, "left", options->paddingLeft); + yyjson_mut_obj_add_uint(doc, padding, "right", options->paddingRight); } - if (options->printRemaining != defaultOptions.printRemaining) - yyjson_mut_obj_add_bool(doc, obj, "printRemaining", options->printRemaining); + yyjson_mut_obj_add_bool(doc, obj, "printRemaining", options->printRemaining); - if (options->preserveAspectRatio != defaultOptions.preserveAspectRatio) - yyjson_mut_obj_add_bool(doc, obj, "preserveAspectRatio", options->preserveAspectRatio); + yyjson_mut_obj_add_bool(doc, obj, "preserveAspectRatio", options->preserveAspectRatio); - if (options->recache != defaultOptions.recache) - yyjson_mut_obj_add_bool(doc, obj, "recache", options->recache); + yyjson_mut_obj_add_bool(doc, obj, "recache", options->recache); - if (options->position != defaultOptions.position) - { - yyjson_mut_obj_add_str(doc, obj, "position", ((const char* []) { - "left", - "top", - "right", - })[options->position]); - } + yyjson_mut_obj_add_str(doc, obj, "position", ((const char* []) { + "left", + "top", + "right", + })[options->position]); { yyjson_mut_val* chafa = yyjson_mut_obj(doc); - if (options->chafaFgOnly != defaultOptions.chafaFgOnly) - yyjson_mut_obj_add_bool(doc, chafa, "fgOnly", options->chafaFgOnly); - if (!ffStrbufEqual(&options->chafaSymbols, &defaultOptions.chafaSymbols)) - yyjson_mut_obj_add_strbuf(doc, chafa, "symbols", &options->chafaSymbols); - if (options->chafaCanvasMode != defaultOptions.chafaCanvasMode && options->chafaCanvasMode <= 7) + yyjson_mut_obj_add_bool(doc, chafa, "fgOnly", options->chafaFgOnly); + yyjson_mut_obj_add_strbuf(doc, chafa, "symbols", &options->chafaSymbols); + if (options->chafaCanvasMode <= 7) { yyjson_mut_obj_add_str(doc, chafa, "canvasMode", ((const char* []) { "TRUECOLOR", @@ -590,14 +585,14 @@ void ffOptionsGenerateLogoJsonConfig(FFOptionsLogo* options, yyjson_mut_doc* doc "INDEXED_16_8", })[options->chafaCanvasMode]); } - if (options->chafaColorSpace != defaultOptions.chafaColorSpace && options->chafaColorSpace <= 1) + if (options->chafaColorSpace <= 1) { yyjson_mut_obj_add_str(doc, chafa, "colorSpace", ((const char* []) { "RGB", "DIN99D", })[options->chafaColorSpace]); } - if (options->chafaDitherMode != defaultOptions.chafaDitherMode && options->chafaDitherMode <= 2) + if (options->chafaDitherMode <= 2) { yyjson_mut_obj_add_str(doc, chafa, "ditherMode", ((const char* []) { "NONE", @@ -606,10 +601,8 @@ void ffOptionsGenerateLogoJsonConfig(FFOptionsLogo* options, yyjson_mut_doc* doc })[options->chafaDitherMode]); } - if (yyjson_mut_obj_size(chafa) > 0) - yyjson_mut_obj_add_val(doc, obj, "chafa", chafa); + yyjson_mut_obj_add_val(doc, obj, "chafa", chafa); } - if (yyjson_mut_obj_size(obj) > 0) - yyjson_mut_obj_add_val(doc, doc->root, "logo", obj); + yyjson_mut_obj_add_val(doc, doc->root, "logo", obj); } From e32987c408fdfc488b25080de80a35cd0f0fcf33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 5 Aug 2025 13:37:53 +0800 Subject: [PATCH 29/83] JsonConfig: make all non-module keys case-sensitive --- src/options/display.c | 46 ++++++++++++++++++++----------------------- src/options/general.c | 20 +++++++++---------- src/options/logo.c | 37 +++++++++++++++------------------- 3 files changed, 47 insertions(+), 56 deletions(-) diff --git a/src/options/display.c b/src/options/display.c index 1f0d22a2b..6bd4498f8 100644 --- a/src/options/display.c +++ b/src/options/display.c @@ -13,13 +13,11 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va if (!object) return NULL; if (!yyjson_is_obj(object)) return "Property 'display' must be an object"; - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(object, idx, max, key_, val) + yyjson_obj_foreach(object, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - - if (ffStrEqualsIgnCase(key, "stat")) + if (unsafe_yyjson_equals_str(key, "stat")) { if (yyjson_is_bool(val)) { @@ -39,21 +37,21 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va else return "display.stat must be a boolean or a positive integer"; } - else if (ffStrEqualsIgnCase(key, "pipe")) + else if (unsafe_yyjson_equals_str(key, "pipe")) options->pipe = yyjson_get_bool(val); - else if (ffStrEqualsIgnCase(key, "showErrors")) + else if (unsafe_yyjson_equals_str(key, "showErrors")) options->showErrors = yyjson_get_bool(val); - else if (ffStrEqualsIgnCase(key, "disableLinewrap")) + else if (unsafe_yyjson_equals_str(key, "disableLinewrap")) options->disableLinewrap = yyjson_get_bool(val); - else if (ffStrEqualsIgnCase(key, "hideCursor")) + else if (unsafe_yyjson_equals_str(key, "hideCursor")) options->hideCursor = yyjson_get_bool(val); - else if (ffStrEqualsIgnCase(key, "separator")) + else if (unsafe_yyjson_equals_str(key, "separator")) ffStrbufSetJsonVal(&options->keyValueSeparator, val); - else if (ffStrEqualsIgnCase(key, "color")) + else if (unsafe_yyjson_equals_str(key, "color")) { if (yyjson_is_str(val)) { - ffOptionParseColor(yyjson_get_str(val), &options->colorKeys); + ffOptionParseColor(unsafe_yyjson_get_str(val), &options->colorKeys); ffStrbufSet(&options->colorTitle, &options->colorKeys); } else if (yyjson_is_obj(val)) @@ -74,9 +72,9 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va else return "display.color must be either a string or an object"; } - else if (ffStrEqualsIgnCase(key, "brightColor")) + else if (unsafe_yyjson_equals_str(key, "brightColor")) options->brightColor = yyjson_get_bool(val); - else if (ffStrEqualsIgnCase(key, "duration")) + else if (unsafe_yyjson_equals_str(key, "duration")) { if (!yyjson_is_obj(val)) return "display.duration must be an object"; @@ -98,7 +96,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va options->durationSpaceBeforeUnit = (FFSpaceBeforeUnitType) value; } } - else if (ffStrEqualsIgnCase(key, "size")) + else if (unsafe_yyjson_equals_str(key, "size")) { if (!yyjson_is_obj(val)) return "display.size must be an object"; @@ -154,7 +152,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va options->sizeSpaceBeforeUnit = (FFSpaceBeforeUnitType) value; } } - else if (ffStrEqualsIgnCase(key, "temp")) + else if (unsafe_yyjson_equals_str(key, "temp")) { if (!yyjson_is_obj(val)) return "display.temp must be an object"; @@ -211,7 +209,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va options->tempSpaceBeforeUnit = (FFSpaceBeforeUnitType) value; } } - else if (ffStrEqualsIgnCase(key, "percent")) + else if (unsafe_yyjson_equals_str(key, "percent")) { if (!yyjson_is_obj(val)) return "display.percent must be an object"; @@ -259,7 +257,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va yyjson_val* width = yyjson_obj_get(val, "width"); if (width) options->percentWidth = (uint8_t) yyjson_get_uint(width); } - else if (ffStrEqualsIgnCase(key, "bar")) + else if (unsafe_yyjson_equals_str(key, "bar")) { if (yyjson_is_obj(val)) { @@ -369,7 +367,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va else return "display.bar must be an object"; } - else if (ffStrEqualsIgnCase(key, "fraction")) + else if (unsafe_yyjson_equals_str(key, "fraction")) { if (yyjson_is_obj(val)) { @@ -386,11 +384,9 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va else return "display.fraction must be an object"; } - else if (ffStrEqualsIgnCase(key, "noBuffer")) + else if (unsafe_yyjson_equals_str(key, "noBuffer")) options->noBuffer = yyjson_get_bool(val); - else if (ffStrEqualsIgnCase(key, "keyWidth")) - return "display.keyWidth has been renamed to display.key.width"; - else if (ffStrEqualsIgnCase(key, "key")) + else if (unsafe_yyjson_equals_str(key, "key")) { if (yyjson_is_obj(val)) { @@ -420,7 +416,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va else return "display.key must be an object"; } - else if (ffStrEqualsIgnCase(key, "constants")) + else if (unsafe_yyjson_equals_str(key, "constants")) { if (!yyjson_is_arr(val)) return "display.constants must be an array"; @@ -429,7 +425,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va yyjson_arr_foreach(val, idx, max, item) ffStrbufInitJsonVal(ffListAdd(&options->constants), item); } - else if (ffStrEqualsIgnCase(key, "freq")) + else if (unsafe_yyjson_equals_str(key, "freq")) { if (!yyjson_is_obj(val)) return "display.freq must be an object"; diff --git a/src/options/general.c b/src/options/general.c index 479bb9a10..f5d584f4d 100644 --- a/src/options/general.c +++ b/src/options/general.c @@ -12,30 +12,28 @@ const char* ffOptionsParseGeneralJsonConfig(FFOptionsGeneral* options, yyjson_va if (!object) return NULL; if (!yyjson_is_obj(object)) return "Property 'general' must be an object"; - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(object, idx, max, key_, val) + yyjson_obj_foreach(object, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - - if (ffStrEqualsIgnCase(key, "thread")) + if (unsafe_yyjson_equals_str(key, "thread")) options->multithreading = yyjson_get_bool(val); - else if (ffStrEqualsIgnCase(key, "processingTimeout")) + else if (unsafe_yyjson_equals_str(key, "processingTimeout")) options->processingTimeout = (int32_t) yyjson_get_int(val); - else if (ffStrEqualsIgnCase(key, "preRun")) + 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 (ffStrEqualsIgnCase(key, "detectVersion")) + else if (unsafe_yyjson_equals_str(key, "detectVersion")) options->detectVersion = yyjson_get_bool(val); #if defined(__linux__) || defined(__FreeBSD__) || defined(__sun) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) - else if (ffStrEqualsIgnCase(key, "playerName")) + else if (unsafe_yyjson_equals_str(key, "playerName")) ffStrbufSetJsonVal(&options->playerName, val); - else if (ffStrEqualsIgnCase(key, "dsForceDrm")) + else if (unsafe_yyjson_equals_str(key, "dsForceDrm")) { if (yyjson_is_str(val)) { @@ -127,6 +125,8 @@ void ffOptionsGenerateGeneralJsonConfig(FFOptionsGeneral* options, yyjson_mut_do yyjson_mut_obj_add_int(doc, obj, "processingTimeout", options->processingTimeout); + yyjson_mut_obj_add_bool(doc, obj, "detectVersion", options->detectVersion); + #if defined(__linux__) || defined(__FreeBSD__) || defined(__sun) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) yyjson_mut_obj_add_strbuf(doc, obj, "playerName", &options->playerName); diff --git a/src/options/logo.c b/src/options/logo.c index 34e420182..2e93dd518 100644 --- a/src/options/logo.c +++ b/src/options/logo.c @@ -269,13 +269,11 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo if (!yyjson_is_obj(object)) return "Property 'logo' must be an object"; - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(object, idx, max, key_, val) + yyjson_obj_foreach(object, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - - if (ffStrEqualsIgnCase(key, "type")) + if (unsafe_yyjson_equals_str(key, "type")) { int value; const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { @@ -302,22 +300,21 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo options->type = (FFLogoType) value; continue; } - else if (ffStrEqualsIgnCase(key, "source")) + else if (unsafe_yyjson_equals_str(key, "source")) { ffStrbufSetJsonVal(&options->source, val); continue; } - else if (ffStrEqualsIgnCase(key, "color")) + else if (unsafe_yyjson_equals_str(key, "color")) { if (!yyjson_is_obj(val)) return "Property 'color' must be an object"; - yyjson_val *key_c, *valc; + yyjson_val *keyc, *valc; size_t idxc, maxc; - yyjson_obj_foreach(val, idxc, maxc, key_c, valc) + yyjson_obj_foreach(val, idxc, maxc, keyc, valc) { - const char* keyc = yyjson_get_str(key_c); - uint32_t index = (uint32_t) strtoul(keyc, NULL, 10); + uint32_t index = (uint32_t) strtoul(unsafe_yyjson_get_str(keyc), NULL, 10); if (index < 1 || index > FASTFETCH_LOGO_MAX_COLORS) return "Keys of property 'color' must be a number between 1 to 9"; @@ -325,7 +322,7 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo } continue; } - else if (ffStrEqualsIgnCase(key, "width")) + else if (unsafe_yyjson_equals_str(key, "width")) { if (yyjson_is_null(val)) options->width = 0; @@ -338,7 +335,7 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo } continue; } - else if (ffStrEqualsIgnCase(key, "height")) + else if (unsafe_yyjson_equals_str(key, "height")) { if (yyjson_is_null(val)) options->height = 0; @@ -351,7 +348,7 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo } continue; } - else if (ffStrEqualsIgnCase(key, "padding")) + else if (unsafe_yyjson_equals_str(key, "padding")) { if (!yyjson_is_obj(val)) return "Logo padding must be an object"; @@ -370,24 +367,22 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo #undef FF_PARSE_PADDING_POSITON continue; } - else if (ffStrEqualsIgnCase(key, "printRemaining")) + else if (unsafe_yyjson_equals_str(key, "printRemaining")) { options->printRemaining = yyjson_get_bool(val); continue; } - else if (ffStrEqualsIgnCase(key, "preserveAspectRatio")) + else if (unsafe_yyjson_equals_str(key, "preserveAspectRatio")) { options->preserveAspectRatio = yyjson_get_bool(val); continue; } - else if (ffStrEqualsIgnCase(key, "recache")) + else if (unsafe_yyjson_equals_str(key, "recache")) { options->recache = yyjson_get_bool(val); continue; } - else if(ffStrEqualsIgnCase(key, "separate")) - return "logo.separate has been renamed to logo.position\n"; - else if (ffStrEqualsIgnCase(key, "position")) + else if (unsafe_yyjson_equals_str(key, "position")) { int value; const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { @@ -401,7 +396,7 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo options->position = (FFLogoPosition) value; continue; } - else if (ffStrEqualsIgnCase(key, "chafa")) + else if (unsafe_yyjson_equals_str(key, "chafa")) { if (!yyjson_is_obj(val)) return "Chafa config must be an object"; From 655d11c1cc1e3f4318dddf7d98523c5854b21d36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 5 Aug 2025 19:15:52 +0800 Subject: [PATCH 30/83] Chore: fix building on Windows --- src/options/general.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/options/general.c b/src/options/general.c index f5d584f4d..72f79798b 100644 --- a/src/options/general.c +++ b/src/options/general.c @@ -53,7 +53,7 @@ const char* ffOptionsParseGeneralJsonConfig(FFOptionsGeneral* options, yyjson_va options->dsForceDrm = yyjson_get_bool(val) ? FF_DS_FORCE_DRM_TYPE_TRUE : FF_DS_FORCE_DRM_TYPE_FALSE; } #elif defined(_WIN32) - else if (ffStrEqualsIgnCase(key, "wmiTimeout")) + else if (unsafe_yyjson_equals_str(key, "wmiTimeout")) options->wmiTimeout = (int32_t) yyjson_get_int(val); #endif From 137d5dfe90fcf25ca7030430d074f8dcd31cd0c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 5 Aug 2025 19:35:43 +0800 Subject: [PATCH 31/83] LocalIP (Windows): show only preferred IP when `showAllIPs` is not set Ref: #1883 --- src/detection/localip/localip_windows.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/detection/localip/localip_windows.c b/src/detection/localip/localip_windows.c index 1b067885d..45b1445b5 100644 --- a/src/detection/localip/localip_windows.c +++ b/src/detection/localip/localip_windows.c @@ -127,6 +127,9 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) for (IP_ADAPTER_UNICAST_ADDRESS* ifa = adapter->FirstUnicastAddress; ifa; ifa = ifa->Next) { + if (!(options->showType & FF_LOCALIP_TYPE_ALL_IPS_BIT) && ifa->DadState != IpDadStatePreferred) + continue; + if (ifa->Address.lpSockaddr->sa_family == AF_INET) { if (!(typesToAdd & (FF_LOCALIP_TYPE_IPV4_BIT | FF_LOCALIP_TYPE_ALL_IPS_BIT))) continue; From 5e770dc8b019702ca458cc0cad46161ebec608a4 Mon Sep 17 00:00:00 2001 From: Jannis Pohl <838818+jannispl@users.noreply.github.com> Date: Tue, 5 Aug 2025 17:30:06 +0200 Subject: [PATCH 32/83] LocalIP: consider preferred source address when retrieving default route (#1883) * LocalIP: consider preferred source address when retrieving default route * LocalIP: fix logic error when there is no preferred source address * LocalIP: use macros rather than manual free/close * LocalIP(BSD): fix build error * LocalIP: address Copilot suggestions --- src/common/netif/netif.c | 15 ++- src/common/netif/netif.h | 1 + src/common/netif/netif_bsd.c | 19 ++- src/common/netif/netif_haiku.c | 5 +- src/common/netif/netif_linux.c | 178 ++++++++++++++++++++++++-- src/common/netif/netif_windows.c | 5 +- src/detection/localip/localip_linux.c | 16 ++- 7 files changed, 214 insertions(+), 25 deletions(-) diff --git a/src/common/netif/netif.c b/src/common/netif/netif.c index 8d02b1a54..17b8726a4 100644 --- a/src/common/netif/netif.c +++ b/src/common/netif/netif.c @@ -7,15 +7,18 @@ #include #endif -bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex); +bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, uint32_t* preferredSourceAddr); enum { IF_INDEX_UNINITIALIZED = (uint32_t) -1, IF_INDEX_INVALID = (uint32_t) -2 }; static uint32_t ifIndex = IF_INDEX_UNINITIALIZED; static char ifName[IF_NAMESIZE + 1]; +static uint32_t preferredSourceAddr = 0; static inline void init() { - if (ifIndex == (uint32_t) IF_INDEX_UNINITIALIZED && !ffNetifGetDefaultRouteImpl(ifName, &ifIndex)) - ifIndex = (uint32_t) IF_INDEX_INVALID; + if (ifIndex == (uint32_t) IF_INDEX_UNINITIALIZED) { + if (!ffNetifGetDefaultRouteImpl(ifName, &ifIndex, &preferredSourceAddr)) + ifIndex = (uint32_t) IF_INDEX_INVALID; + } } const char* ffNetifGetDefaultRouteIfName() @@ -29,3 +32,9 @@ uint32_t ffNetifGetDefaultRouteIfIndex() init(); return ifIndex; } + +uint32_t ffNetifGetDefaultRoutePreferredSourceAddr() +{ + init(); + return preferredSourceAddr; +} diff --git a/src/common/netif/netif.h b/src/common/netif/netif.h index 40c97948d..1d7bd1dd2 100644 --- a/src/common/netif/netif.h +++ b/src/common/netif/netif.h @@ -4,3 +4,4 @@ const char* ffNetifGetDefaultRouteIfName(); uint32_t ffNetifGetDefaultRouteIfIndex(); +uint32_t ffNetifGetDefaultRoutePreferredSourceAddr(); diff --git a/src/common/netif/netif_bsd.c b/src/common/netif/netif_bsd.c index f85c39a62..8bdb22eef 100644 --- a/src/common/netif/netif_bsd.c +++ b/src/common/netif/netif_bsd.c @@ -50,8 +50,11 @@ get_rt_address(struct rt_msghdr *rtm, int desired) return NULL; } -bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex) +bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, uint32_t* preferredSourceAddr) { + if (preferredSourceAddr) + *preferredSourceAddr = 0; + #if defined(__OpenBSD__) || defined(__DragonFly__) int mib[6] = {CTL_NET, PF_ROUTE, 0, AF_INET, NET_RT_FLAGS, RTF_GATEWAY}; size_t needed; @@ -80,6 +83,12 @@ bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex) memcpy(iface, sdl->sdl_data, sdl->sdl_nlen); iface[sdl->sdl_nlen] = '\0'; *ifIndex = sdl->sdl_index; + + // Get the preferred source address + struct sockaddr_in* src = (struct sockaddr_in*)get_rt_address(rtm, RTA_IFA); + if (preferredSourceAddr && src && src->sin_family == AF_INET) + *preferredSourceAddr = src->sin_addr.s_addr; + return true; } } @@ -108,7 +117,7 @@ bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex) .rtm_type = RTM_GET, .rtm_flags = RTF_UP | RTF_GATEWAY, .rtm_version = RTM_VERSION, - .rtm_addrs = RTA_DST | RTA_IFP, + .rtm_addrs = RTA_DST | RTA_IFP | RTA_IFA, .rtm_msglen = sizeof(rtmsg.hdr) + sizeof(rtmsg.dst), .rtm_pid = pid, .rtm_seq = 1, @@ -139,6 +148,12 @@ bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex) memcpy(iface, sdl->sdl_data, sdl->sdl_nlen); iface[sdl->sdl_nlen] = '\0'; *ifIndex = sdl->sdl_index; + + // Get the preferred source address + struct sockaddr_in* src = (struct sockaddr_in*)get_rt_address(&rtmsg.hdr, RTA_IFA); + if (preferredSourceAddr && src && src->sin_family == AF_INET) + *preferredSourceAddr = src->sin_addr.s_addr; + return true; } return false; diff --git a/src/common/netif/netif_haiku.c b/src/common/netif/netif_haiku.c index daa0cd7a1..cb7401ab6 100644 --- a/src/common/netif/netif_haiku.c +++ b/src/common/netif/netif_haiku.c @@ -11,8 +11,11 @@ // loosely based on Haiku's src/bin/network/route/route.cpp -bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex) +bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, uint32_t* preferredSourceAddr) { + if (preferredSourceAddr) + *preferredSourceAddr = 0; + // TODO: AF_INET6 FF_AUTO_CLOSE_FD int pfRoute = socket(AF_INET, SOCK_RAW, AF_INET); if (pfRoute < 0) diff --git a/src/common/netif/netif_linux.c b/src/common/netif/netif_linux.c index 6c0dbd1e6..6a484e789 100644 --- a/src/common/netif/netif_linux.c +++ b/src/common/netif/netif_linux.c @@ -1,27 +1,179 @@ #include "netif.h" #include "common/io/io.h" +#include "util/mallocHelper.h" +#include +#include #include -#include #define FF_STR_INDIR(x) #x #define FF_STR(x) FF_STR_INDIR(x) -static bool getDefaultRouteIPv4(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex) +struct req_t { + struct nlmsghdr nlh; + struct rtmsg rtm; + struct rtattr rta; + uint32_t table; +}; + +struct Route4Entry { + uint32_t dest; + uint32_t gateway; + uint32_t src; + uint8_t prefix_length; + uint32_t metric; + uint32_t ifindex; +}; + +static bool getDefaultRouteIPv4(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, uint32_t* preferredSourceAddr) { - FILE* FF_AUTO_CLOSE_FILE netRoute = fopen("/proc/net/route", "r"); - if (!netRoute) return false; + FF_AUTO_CLOSE_FD int sock_fd = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE); + if (sock_fd < 0) + return false; - // skip first line - FF_UNUSED(fscanf(netRoute, "%*[^\n]\n")); + // Bind socket + struct sockaddr_nl addr; + memset(&addr, 0, sizeof(addr)); + addr.nl_family = AF_NETLINK; + addr.nl_pid = 0; // Let kernel assign PID + addr.nl_groups = 0; - unsigned long long destination; //, gateway, flags, refCount, use, metric, mask, mtu, ... - while (fscanf(netRoute, "%" FF_STR(IF_NAMESIZE) "s%llx%*[^\n]", iface, &destination) == 2) - { - if (destination != 0) continue; - *ifIndex = if_nametoindex(iface); + if (bind(sock_fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) { + return false; + } + + struct req_t req; + memset(&req, 0, sizeof(req)); + + // Netlink message header + req.nlh.nlmsg_len = sizeof(req); + req.nlh.nlmsg_type = RTM_GETROUTE; + req.nlh.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP; + req.nlh.nlmsg_seq = 0; + req.nlh.nlmsg_pid = 0; + + // Route message + req.rtm.rtm_family = AF_INET; + req.rtm.rtm_dst_len = 0; + req.rtm.rtm_src_len = 0; + req.rtm.rtm_tos = 0; + req.rtm.rtm_table = RT_TABLE_UNSPEC; + req.rtm.rtm_protocol = RTPROT_UNSPEC; + req.rtm.rtm_scope = RT_SCOPE_UNIVERSE; + req.rtm.rtm_type = RTN_UNSPEC; + req.rtm.rtm_flags = 0; + + // Route attribute for main table + req.rta.rta_len = RTA_LENGTH(sizeof(uint32_t)); + req.rta.rta_type = RTA_TABLE; + req.table = RT_TABLE_MAIN; + + struct sockaddr_nl dest_addr; + memset(&dest_addr, 0, sizeof(dest_addr)); + dest_addr.nl_family = AF_NETLINK; + dest_addr.nl_pid = 0; + dest_addr.nl_groups = 0; + + ssize_t sent = sendto(sock_fd, &req, sizeof(req), 0, + (struct sockaddr*)&dest_addr, sizeof(dest_addr)); + + if (sent != sizeof(req)) { + return false; + } + + struct sockaddr_nl src_addr; + socklen_t src_addr_len = sizeof(src_addr); + struct iovec iov = {NULL, 0}; + struct msghdr msg; + + memset(&msg, 0, sizeof(msg)); + msg.msg_name = &src_addr; + msg.msg_namelen = sizeof(src_addr); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + + ssize_t peek_size = recvmsg(sock_fd, &msg, MSG_PEEK | MSG_TRUNC); + if (peek_size < 0) { + return false; + } + + FF_AUTO_FREE uint8_t* buffer = malloc((size_t)peek_size); + + ssize_t received = recvfrom(sock_fd, buffer, (size_t)peek_size, 0, + (struct sockaddr*)&src_addr, &src_addr_len); + if (received != peek_size) { + return false; + } + + struct Route4Entry best_gw; + memset(&best_gw, 0, sizeof(best_gw)); + + for (const struct nlmsghdr* nlh = (struct nlmsghdr*)buffer; + NLMSG_OK(nlh, received); + nlh = NLMSG_NEXT(nlh, received)) { + + if (nlh->nlmsg_type == NLMSG_DONE) + break; + + if (nlh->nlmsg_type != RTM_NEWROUTE) + continue; + + struct rtmsg* rtm = (struct rtmsg*)NLMSG_DATA(nlh); + if (rtm->rtm_family != AF_INET) + continue; + + struct Route4Entry entry; + memset(&entry, 0, sizeof(struct Route4Entry)); + entry.prefix_length = rtm->rtm_dst_len; + + // Parse route attributes + size_t rtm_len = RTM_PAYLOAD(nlh); + for (struct rtattr* rta = RTM_RTA(rtm); + RTA_OK(rta, rtm_len); + rta = RTA_NEXT(rta, rtm_len)) { + + switch (rta->rta_type) { + case RTA_DST: + entry.dest = *(uint32_t*)RTA_DATA(rta); + break; + case RTA_GATEWAY: + entry.gateway = *(uint32_t*)RTA_DATA(rta); + break; + case RTA_PREFSRC: + entry.src = *(uint32_t*)RTA_DATA(rta); + break; + case RTA_PRIORITY: + entry.metric = *(uint32_t*)RTA_DATA(rta); + break; + case RTA_OIF: + entry.ifindex = *(uint32_t*)RTA_DATA(rta); + break; + } + } + + if (entry.gateway == 0 || entry.dest != 0 || entry.prefix_length != 0) + continue; + + if (best_gw.gateway == 0 || entry.metric < best_gw.metric) { + memcpy(&best_gw, &entry, sizeof(struct Route4Entry)); + } + } + + if (best_gw.gateway != 0) { + if (ifIndex) { + *ifIndex = best_gw.ifindex; + } + if (iface) { + if (if_indextoname(best_gw.ifindex, iface) == NULL) { + iface[0] = '\0'; + } + } + if (preferredSourceAddr) { + *preferredSourceAddr = best_gw.src; + } return true; } + iface[0] = '\0'; return false; } @@ -43,9 +195,9 @@ static bool getDefaultRouteIPv6(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex) return false; } -bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex) +bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, uint32_t* preferredSourceAddr) { - if (getDefaultRouteIPv4(iface, ifIndex)) + if (getDefaultRouteIPv4(iface, ifIndex, preferredSourceAddr)) return true; return getDefaultRouteIPv6(iface, ifIndex); diff --git a/src/common/netif/netif_windows.c b/src/common/netif/netif_windows.c index 0dfd2bd07..275c7b62e 100644 --- a/src/common/netif/netif_windows.c +++ b/src/common/netif/netif_windows.c @@ -4,8 +4,11 @@ #include // AF_INET6, IN6_IS_ADDR_UNSPECIFIED #include -bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex) +bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, uint32_t* preferredSourceAddr) { + if (preferredSourceAddr) + *preferredSourceAddr = 0; + PMIB_IPFORWARD_TABLE2 pIpForwardTable = NULL; if (!NETIO_SUCCESS(GetIpForwardTable2(AF_UNSPEC, &pIpForwardTable))) diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index f9cc343d6..ac8ead7dd 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -136,6 +136,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) return "getifaddrs(&ifAddrStruct) failed"; const char* defaultRouteIfName = ffNetifGetDefaultRouteIfName(); + const uint32_t preferredSourceAddr = ffNetifGetDefaultRoutePreferredSourceAddr(); for (struct ifaddrs* ifa = ifAddrStruct; ifa; ifa = ifa->ifa_next) { @@ -146,8 +147,8 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) continue; #endif - bool isDefaultRoute = ffStrEquals(defaultRouteIfName, ifa->ifa_name); - if ((options->showType & FF_LOCALIP_TYPE_DEFAULT_ROUTE_ONLY_BIT) && !isDefaultRoute) + bool isDefaultRouteIf = ffStrEquals(defaultRouteIfName, ifa->ifa_name); + if ((options->showType & FF_LOCALIP_TYPE_DEFAULT_ROUTE_ONLY_BIT) && !isDefaultRouteIf) continue; if ((ifa->ifa_flags & IFF_LOOPBACK) && !(options->showType & FF_LOCALIP_TYPE_LOOP_BIT)) @@ -164,6 +165,11 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) continue; struct sockaddr_in* ipv4 = (struct sockaddr_in*) ifa->ifa_addr; + + bool isDefaultRoute = isDefaultRouteIf && (preferredSourceAddr == 0 || ipv4->sin_addr.s_addr == preferredSourceAddr); + if ((options->showType & FF_LOCALIP_TYPE_DEFAULT_ROUTE_ONLY_BIT) && !isDefaultRoute) + continue; + char addressBuffer[INET_ADDRSTRLEN + 16]; inet_ntop(AF_INET, &ipv4->sin_addr, addressBuffer, INET_ADDRSTRLEN); @@ -203,7 +209,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) } } - addNewIp(results, ifa->ifa_name, addressBuffer, AF_INET6, isDefaultRoute, flags, !(options->showType & FF_LOCALIP_TYPE_ALL_IPS_BIT)); + addNewIp(results, ifa->ifa_name, addressBuffer, AF_INET6, isDefaultRouteIf, flags, !(options->showType & FF_LOCALIP_TYPE_ALL_IPS_BIT)); } #if __FreeBSD__ || __OpenBSD__ || __APPLE__ || __NetBSD__ || __HAIKU__ else if (ifa->ifa_addr->sa_family == AF_LINK) @@ -215,7 +221,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) uint8_t* ptr = (uint8_t*) LLADDR((struct sockaddr_dl *)ifa->ifa_addr); snprintf(addressBuffer, ARRAY_SIZE(addressBuffer), "%02x:%02x:%02x:%02x:%02x:%02x", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]); - addNewIp(results, ifa->ifa_name, addressBuffer, -1, isDefaultRoute, flags, false); + addNewIp(results, ifa->ifa_name, addressBuffer, -1, isDefaultRouteIf, flags, false); } #else else if (ifa->ifa_addr->sa_family == AF_PACKET) @@ -227,7 +233,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) uint8_t* ptr = ((struct sockaddr_ll *)ifa->ifa_addr)->sll_addr; snprintf(addressBuffer, ARRAY_SIZE(addressBuffer), "%02x:%02x:%02x:%02x:%02x:%02x", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]); - addNewIp(results, ifa->ifa_name, addressBuffer, -1, isDefaultRoute, flags, false); + addNewIp(results, ifa->ifa_name, addressBuffer, -1, isDefaultRouteIf, flags, false); } #endif } From b20aea7ab858b972d850eb3604ef58e193a0953e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 6 Aug 2025 13:46:15 +0800 Subject: [PATCH 33/83] Netif (BSD): split different implementations --- CMakeLists.txt | 5 ++- src/common/netif/netif_bsd.c | 50 +-------------------- src/common/netif/netif_obsd.c | 82 +++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 51 deletions(-) create mode 100644 src/common/netif/netif_obsd.c diff --git a/CMakeLists.txt b/CMakeLists.txt index b01a1eae7..9563631cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -638,7 +638,6 @@ elseif(FreeBSD) list(APPEND LIBFASTFETCH_SRC src/common/dbus.c src/common/io/io_unix.c - src/common/netif/netif_bsd.c src/common/networking/networking_linux.c src/common/processing_linux.c src/common/sysctl.c @@ -718,11 +717,13 @@ elseif(FreeBSD) ) if(DragonFly) list(APPEND LIBFASTFETCH_SRC + src/common/netif/netif_obsd.c src/detection/bluetooth/bluetooth_nosupport.c src/detection/wifi/wifi_nosupport.c ) else() list(APPEND LIBFASTFETCH_SRC + src/common/netif/netif_bsd.c src/detection/bluetooth/bluetooth_bsd.c src/detection/wifi/wifi_bsd.c ) @@ -813,7 +814,7 @@ elseif(OpenBSD) list(APPEND LIBFASTFETCH_SRC src/common/dbus.c src/common/io/io_unix.c - src/common/netif/netif_bsd.c + src/common/netif/netif_obsd.c src/common/networking/networking_linux.c src/common/processing_linux.c src/common/sysctl.c diff --git a/src/common/netif/netif_bsd.c b/src/common/netif/netif_bsd.c index 8bdb22eef..52c4750ae 100644 --- a/src/common/netif/netif_bsd.c +++ b/src/common/netif/netif_bsd.c @@ -9,20 +9,12 @@ #include #include -#if defined(__OpenBSD__) || defined(__DragonFly__) - #include -#endif - #define ROUNDUP2(a, n) ((a) > 0 ? (1 + (((a) - 1U) | ((n) - 1))) : (n)) -#if defined(__APPLE__) +#if defined(__APPLE__) || defined(__FreeBSD__) # define ROUNDUP(a) ROUNDUP2((a), sizeof(int)) #elif defined(__NetBSD__) # define ROUNDUP(a) ROUNDUP2((a), sizeof(uint64_t)) -#elif defined(__FreeBSD__) || defined(__DragonFly__) -# define ROUNDUP(a) ROUNDUP2((a), sizeof(int)) -#elif defined(__OpenBSD__) -# define ROUNDUP(a) ROUNDUP2((a), sizeof(int)) #elif defined(__sun) # define ROUNDUP(a) ROUNDUP2((a), _SS_ALIGNSIZE) #else @@ -55,45 +47,6 @@ bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, if (preferredSourceAddr) *preferredSourceAddr = 0; - #if defined(__OpenBSD__) || defined(__DragonFly__) - int mib[6] = {CTL_NET, PF_ROUTE, 0, AF_INET, NET_RT_FLAGS, RTF_GATEWAY}; - size_t needed; - - if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) - return false; - - FF_AUTO_FREE char* buf = malloc(needed); - - if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) - return false; - - char* lim = buf + needed; - struct rt_msghdr* rtm; - for (char* next = buf; next < lim; next += rtm->rtm_msglen) - { - rtm = (struct rt_msghdr *)next; - struct sockaddr* sa = (struct sockaddr *)(rtm + 1); - - if ((rtm->rtm_flags & RTF_GATEWAY) && (sa->sa_family == AF_INET)) - { - struct sockaddr_dl* sdl = (struct sockaddr_dl *)get_rt_address(rtm, RTA_IFP); - if (sdl->sdl_family == AF_LINK) - { - assert(sdl->sdl_nlen <= IF_NAMESIZE); - memcpy(iface, sdl->sdl_data, sdl->sdl_nlen); - iface[sdl->sdl_nlen] = '\0'; - *ifIndex = sdl->sdl_index; - - // Get the preferred source address - struct sockaddr_in* src = (struct sockaddr_in*)get_rt_address(rtm, RTA_IFA); - if (preferredSourceAddr && src && src->sin_family == AF_INET) - *preferredSourceAddr = src->sin_addr.s_addr; - - return true; - } - } - } - #else //https://github.com/hashPirate/copenheimer-masscan-fork/blob/36f1ed9f7b751a7dccd5ed27874e2e703db7d481/src/rawsock-getif.c#L104 FF_AUTO_CLOSE_FD int pfRoute = socket(PF_ROUTE, SOCK_RAW, AF_INET); @@ -159,7 +112,6 @@ bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, return false; } } - #endif return false; } diff --git a/src/common/netif/netif_obsd.c b/src/common/netif/netif_obsd.c new file mode 100644 index 000000000..c2224e16e --- /dev/null +++ b/src/common/netif/netif_obsd.c @@ -0,0 +1,82 @@ +#include "netif.h" + +#include "common/io/io.h" +#include "util/mallocHelper.h" + +#include +#include +#include +#include +#include +#include + +#define ROUNDUP2(a, n) ((a) > 0 ? (1 + (((a) - 1U) | ((n) - 1))) : (n)) + +#if defined(__OpenBSD__) || defined(__DragonFly__) +# define ROUNDUP(a) ROUNDUP2((a), sizeof(int)) +#else +# error unknown platform +#endif + +static struct sockaddr * +get_rt_address(struct rt_msghdr *rtm, int desired) +{ + struct sockaddr *sa = (struct sockaddr *)(rtm + 1); + + for (int i = 0; i < RTAX_MAX; i++) + { + if (rtm->rtm_addrs & (1 << i)) + { + if ((1 << i) == desired) + return sa; + sa = (struct sockaddr *)(ROUNDUP(sa->sa_len) + (char *)sa); + } + } + return NULL; +} + +bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, uint32_t* preferredSourceAddr) +{ + if (preferredSourceAddr) + *preferredSourceAddr = 0; + + int mib[6] = {CTL_NET, PF_ROUTE, 0, AF_INET, NET_RT_FLAGS, RTF_GATEWAY}; + size_t needed; + + if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) + return false; + + FF_AUTO_FREE char* buf = malloc(needed); + + if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) + return false; + + char* lim = buf + needed; + struct rt_msghdr* rtm; + for (char* next = buf; next < lim; next += rtm->rtm_msglen) + { + rtm = (struct rt_msghdr *)next; + struct sockaddr* sa = (struct sockaddr *)(rtm + 1); + + if ((rtm->rtm_flags & RTF_GATEWAY) && (sa->sa_family == AF_INET)) + { + struct sockaddr_dl* sdl = (struct sockaddr_dl *)get_rt_address(rtm, RTA_IFP); + if (sdl->sdl_family == AF_LINK) + { + assert(sdl->sdl_nlen <= IF_NAMESIZE); + memcpy(iface, sdl->sdl_data, sdl->sdl_nlen); + iface[sdl->sdl_nlen] = '\0'; + *ifIndex = sdl->sdl_index; + + // Get the preferred source address + struct sockaddr_in* src = (struct sockaddr_in*)get_rt_address(rtm, RTA_IFA); + if (preferredSourceAddr && src && src->sin_family == AF_INET) + *preferredSourceAddr = src->sin_addr.s_addr; + + return true; + } + } + } + + return false; +} From d9455adc7f895a3d413ffa3612499354c815ce61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 6 Aug 2025 21:57:05 +0800 Subject: [PATCH 34/83] Display: fix invalid `size.maxPrefix` default value in generated config file --- src/options/display.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/options/display.c b/src/options/display.c index 6bd4498f8..95cff25e8 100644 --- a/src/options/display.c +++ b/src/options/display.c @@ -765,7 +765,7 @@ void ffOptionsInitDisplay(FFOptionsDisplay* options) options->hideCursor = false; options->sizeBinaryPrefix = FF_SIZE_BINARY_PREFIX_TYPE_IEC; options->sizeNdigits = 2; - options->sizeMaxPrefix = UINT8_MAX; + options->sizeMaxPrefix = 8; // YB options->sizeSpaceBeforeUnit = FF_SPACE_BEFORE_UNIT_DEFAULT; options->stat = -1; From a84c4dc1f46260bbdeadb0e5f6511fca46f52205 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Thu, 7 Aug 2025 16:35:42 +0800 Subject: [PATCH 35/83] Netif: refactor API for dual-stack route detection Unifies IPv4 and IPv6 default route queries under a shared result structure and per-family functions. Improves clarity and extensibility by centralizing route logic, streamlining detection of preferred interfaces, and updating all consumers to use the new API. Prepares for more robust multi-protocol network information handling. --- src/common/netif/netif.c | 40 +-- src/common/netif/netif.h | 29 +- src/common/netif/netif_bsd.c | 81 ++++- src/common/netif/netif_haiku.c | 17 +- src/common/netif/netif_linux.c | 374 ++++++++++++++++-------- src/common/netif/netif_obsd.c | 54 +++- src/common/netif/netif_windows.c | 72 ++++- src/detection/dns/dns_windows.c | 2 +- src/detection/localip/localip_linux.c | 111 ++++++- src/detection/localip/localip_windows.c | 2 +- src/detection/netio/netio_apple.c | 4 +- src/detection/netio/netio_bsd.c | 2 +- src/detection/netio/netio_haiku.cpp | 2 +- src/detection/netio/netio_linux.c | 2 +- src/detection/netio/netio_sunos.c | 2 +- src/detection/netio/netio_windows.c | 2 +- 16 files changed, 585 insertions(+), 211 deletions(-) diff --git a/src/common/netif/netif.c b/src/common/netif/netif.c index 17b8726a4..52792a9f9 100644 --- a/src/common/netif/netif.c +++ b/src/common/netif/netif.c @@ -2,39 +2,23 @@ #ifndef _WIN32 #include -#else - #include - #include + #include #endif -bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, uint32_t* preferredSourceAddr); -enum { IF_INDEX_UNINITIALIZED = (uint32_t) -1, IF_INDEX_INVALID = (uint32_t) -2 }; -static uint32_t ifIndex = IF_INDEX_UNINITIALIZED; -static char ifName[IF_NAMESIZE + 1]; -static uint32_t preferredSourceAddr = 0; - -static inline void init() +const FFNetifDefaultRouteResult* ffNetifGetDefaultRouteV4(void) { - if (ifIndex == (uint32_t) IF_INDEX_UNINITIALIZED) { - if (!ffNetifGetDefaultRouteImpl(ifName, &ifIndex, &preferredSourceAddr)) - ifIndex = (uint32_t) IF_INDEX_INVALID; + static FFNetifDefaultRouteResult result; + if (result.status == FF_NETIF_UNINITIALIZED) { + result.status = ffNetifGetDefaultRouteImplV4(&result) ? FF_NETIF_OK : FF_NETIF_INVALID; } + return &result; } -const char* ffNetifGetDefaultRouteIfName() +const FFNetifDefaultRouteResult* ffNetifGetDefaultRouteV6(void) { - init(); - return ifName; -} - -uint32_t ffNetifGetDefaultRouteIfIndex() -{ - init(); - return ifIndex; -} - -uint32_t ffNetifGetDefaultRoutePreferredSourceAddr() -{ - init(); - return preferredSourceAddr; + static FFNetifDefaultRouteResult result; + if (result.status == FF_NETIF_UNINITIALIZED) { + result.status = ffNetifGetDefaultRouteImplV6(&result) ? FF_NETIF_OK : FF_NETIF_INVALID; + } + return &result; } diff --git a/src/common/netif/netif.h b/src/common/netif/netif.h index 1d7bd1dd2..99a1a69a0 100644 --- a/src/common/netif/netif.h +++ b/src/common/netif/netif.h @@ -2,6 +2,29 @@ #include "fastfetch.h" -const char* ffNetifGetDefaultRouteIfName(); -uint32_t ffNetifGetDefaultRouteIfIndex(); -uint32_t ffNetifGetDefaultRoutePreferredSourceAddr(); +#ifndef _WIN32 + #include + #include +#endif + +typedef enum __attribute__((__packed__)) FFNetifDefaultRouteResultStatus { + FF_NETIF_UNINITIALIZED, + FF_NETIF_INVALID, + FF_NETIF_OK +} FFNetifDefaultRouteResultStatus; + +typedef struct FFNetifDefaultRouteResult { + uint32_t ifIndex; + + #ifndef _WIN32 + char ifName[IF_NAMESIZE + 1]; + uint32_t preferredSourceAddrV4; + #endif + enum FFNetifDefaultRouteResultStatus status; +} FFNetifDefaultRouteResult; + +bool ffNetifGetDefaultRouteImplV4(FFNetifDefaultRouteResult* result); +bool ffNetifGetDefaultRouteImplV6(FFNetifDefaultRouteResult* result); + +const FFNetifDefaultRouteResult* ffNetifGetDefaultRouteV4(void); +const FFNetifDefaultRouteResult* ffNetifGetDefaultRouteV6(void); diff --git a/src/common/netif/netif_bsd.c b/src/common/netif/netif_bsd.c index 52c4750ae..a0cc4e521 100644 --- a/src/common/netif/netif_bsd.c +++ b/src/common/netif/netif_bsd.c @@ -42,11 +42,8 @@ get_rt_address(struct rt_msghdr *rtm, int desired) return NULL; } -bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, uint32_t* preferredSourceAddr) +bool ffNetifGetDefaultRouteImplV4(FFNetifDefaultRouteResult* result) { - if (preferredSourceAddr) - *preferredSourceAddr = 0; - //https://github.com/hashPirate/copenheimer-masscan-fork/blob/36f1ed9f7b751a7dccd5ed27874e2e703db7d481/src/rawsock-getif.c#L104 FF_AUTO_CLOSE_FD int pfRoute = socket(PF_ROUTE, SOCK_RAW, AF_INET); @@ -98,14 +95,80 @@ bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, ) { assert(sdl->sdl_nlen <= IF_NAMESIZE); - memcpy(iface, sdl->sdl_data, sdl->sdl_nlen); - iface[sdl->sdl_nlen] = '\0'; - *ifIndex = sdl->sdl_index; + memcpy(result->ifName, sdl->sdl_data, sdl->sdl_nlen); + result->ifName[sdl->sdl_nlen] = '\0'; + result->ifIndex = sdl->sdl_index; // Get the preferred source address struct sockaddr_in* src = (struct sockaddr_in*)get_rt_address(&rtmsg.hdr, RTA_IFA); - if (preferredSourceAddr && src && src->sin_family == AF_INET) - *preferredSourceAddr = src->sin_addr.s_addr; + if (src && src->sin_family == AF_INET) + result->preferredSourceAddrV4 = src->sin_addr.s_addr; + + return true; + } + return false; + } + } + + return false; +} + +bool ffNetifGetDefaultRouteImplV6(FFNetifDefaultRouteResult* result) +{ + //https://github.com/hashPirate/copenheimer-masscan-fork/blob/36f1ed9f7b751a7dccd5ed27874e2e703db7d481/src/rawsock-getif.c#L104 + + FF_AUTO_CLOSE_FD int pfRoute = socket(PF_ROUTE, SOCK_RAW, AF_INET6); + if (pfRoute < 0) + return false; + + { + struct timeval timeout = {1, 0}; + setsockopt(pfRoute, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)); + setsockopt(pfRoute, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)); + } + + int pid = getpid(); + + struct { + struct rt_msghdr hdr; + struct sockaddr_in6 dst; + uint8_t data[512]; + } rtmsg = { + .hdr = { + .rtm_type = RTM_GET, + .rtm_flags = RTF_UP | RTF_GATEWAY, + .rtm_version = RTM_VERSION, + .rtm_addrs = RTA_DST | RTA_IFP | RTA_IFA, + .rtm_msglen = sizeof(rtmsg.hdr) + sizeof(rtmsg.dst), + .rtm_pid = pid, + .rtm_seq = 1, + }, + .dst = { + .sin6_family = AF_INET6, + #ifndef __sun + .sin6_len = sizeof(rtmsg.dst), + #endif + }, + }; + + if (write(pfRoute, &rtmsg, rtmsg.hdr.rtm_msglen) != rtmsg.hdr.rtm_msglen) + return false; + + while (read(pfRoute, &rtmsg, sizeof(rtmsg)) > 0) + { + if (rtmsg.hdr.rtm_seq == 1 && rtmsg.hdr.rtm_pid == pid) + { + struct sockaddr_dl* sdl = (struct sockaddr_dl *)get_rt_address(&rtmsg.hdr, RTA_IFP); + if (sdl + #ifndef __sun + && sdl->sdl_len + #endif + ) + { + assert(sdl->sdl_nlen <= IF_NAMESIZE); + memcpy(result->ifName, sdl->sdl_data, sdl->sdl_nlen); + result->ifName[sdl->sdl_nlen] = '\0'; + result->ifIndex = sdl->sdl_index; return true; } diff --git a/src/common/netif/netif_haiku.c b/src/common/netif/netif_haiku.c index cb7401ab6..914db83e2 100644 --- a/src/common/netif/netif_haiku.c +++ b/src/common/netif/netif_haiku.c @@ -11,12 +11,8 @@ // loosely based on Haiku's src/bin/network/route/route.cpp -bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, uint32_t* preferredSourceAddr) +bool ffNetifGetDefaultRouteImplV4(FFNetifDefaultRouteResult* result) { - if (preferredSourceAddr) - *preferredSourceAddr = 0; - - // TODO: AF_INET6 FF_AUTO_CLOSE_FD int pfRoute = socket(AF_INET, SOCK_RAW, AF_INET); if (pfRoute < 0) return false; @@ -45,8 +41,9 @@ bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, while (interface < end) { if (interface->ifr_route.flags & RTF_DEFAULT) { - strlcpy(iface, interface->ifr_name, IF_NAMESIZE); - *ifIndex = if_nametoindex(interface->ifr_name); + strlcpy(result->ifName, interface->ifr_name, IF_NAMESIZE); + result->ifIndex = if_nametoindex(interface->ifr_name); + // TODO: Get the preferred source address return true; } @@ -64,3 +61,9 @@ bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, return false; } + +bool ffNetifGetDefaultRouteImplV6(FFNetifDefaultRouteResult* result) +{ + // TODO: AF_INET6 + return false; +} diff --git a/src/common/netif/netif_linux.c b/src/common/netif/netif_linux.c index 6a484e789..cef654d6b 100644 --- a/src/common/netif/netif_linux.c +++ b/src/common/netif/netif_linux.c @@ -9,88 +9,82 @@ #define FF_STR_INDIR(x) #x #define FF_STR(x) FF_STR_INDIR(x) -struct req_t { - struct nlmsghdr nlh; - struct rtmsg rtm; - struct rtattr rta; - uint32_t table; -}; - -struct Route4Entry { - uint32_t dest; - uint32_t gateway; - uint32_t src; - uint8_t prefix_length; - uint32_t metric; - uint32_t ifindex; -}; - -static bool getDefaultRouteIPv4(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, uint32_t* preferredSourceAddr) +bool ffNetifGetDefaultRouteImplV4(FFNetifDefaultRouteResult* result) { FF_AUTO_CLOSE_FD int sock_fd = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE); if (sock_fd < 0) return false; + unsigned pid = (unsigned) getpid(); + // Bind socket - struct sockaddr_nl addr; - memset(&addr, 0, sizeof(addr)); - addr.nl_family = AF_NETLINK; - addr.nl_pid = 0; // Let kernel assign PID - addr.nl_groups = 0; + struct sockaddr_nl addr = { + .nl_family = AF_NETLINK, + .nl_pid = pid, + .nl_groups = 0, // No multicast groups + }; if (bind(sock_fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) { return false; } - struct req_t req; - memset(&req, 0, sizeof(req)); + struct { + struct nlmsghdr nlh; + struct rtmsg rtm; + struct rtattr rta; + uint32_t table; + } req = { + // Netlink message header + .nlh = { + .nlmsg_len = sizeof(req), + .nlmsg_type = RTM_GETROUTE, + .nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP, + .nlmsg_seq = 1, + .nlmsg_pid = pid, + }, + // Route message + .rtm = { + .rtm_family = AF_INET, + .rtm_dst_len = 0, // Match all destinations + .rtm_src_len = 0, // Match all sources + .rtm_tos = 0, + .rtm_table = RT_TABLE_UNSPEC, + .rtm_protocol = RTPROT_UNSPEC, + .rtm_scope = RT_SCOPE_UNIVERSE, + .rtm_type = RTN_UNSPEC, + .rtm_flags = 0, + }, + // Route attribute for main table + .rta = { + .rta_len = RTA_LENGTH(sizeof(uint32_t)), + .rta_type = RTA_TABLE, + }, + .table = RT_TABLE_MAIN, + }; - // Netlink message header - req.nlh.nlmsg_len = sizeof(req); - req.nlh.nlmsg_type = RTM_GETROUTE; - req.nlh.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP; - req.nlh.nlmsg_seq = 0; - req.nlh.nlmsg_pid = 0; - - // Route message - req.rtm.rtm_family = AF_INET; - req.rtm.rtm_dst_len = 0; - req.rtm.rtm_src_len = 0; - req.rtm.rtm_tos = 0; - req.rtm.rtm_table = RT_TABLE_UNSPEC; - req.rtm.rtm_protocol = RTPROT_UNSPEC; - req.rtm.rtm_scope = RT_SCOPE_UNIVERSE; - req.rtm.rtm_type = RTN_UNSPEC; - req.rtm.rtm_flags = 0; - - // Route attribute for main table - req.rta.rta_len = RTA_LENGTH(sizeof(uint32_t)); - req.rta.rta_type = RTA_TABLE; - req.table = RT_TABLE_MAIN; - - struct sockaddr_nl dest_addr; - memset(&dest_addr, 0, sizeof(dest_addr)); - dest_addr.nl_family = AF_NETLINK; - dest_addr.nl_pid = 0; - dest_addr.nl_groups = 0; + struct sockaddr_nl dest_addr = { + .nl_family = AF_NETLINK, + .nl_pid = 0, // Kernel + .nl_groups = 0, // No multicast groups + }; ssize_t sent = sendto(sock_fd, &req, sizeof(req), 0, - (struct sockaddr*)&dest_addr, sizeof(dest_addr)); + (struct sockaddr*)&dest_addr, sizeof(dest_addr)); if (sent != sizeof(req)) { return false; } - struct sockaddr_nl src_addr; + struct sockaddr_nl src_addr = {}; socklen_t src_addr_len = sizeof(src_addr); - struct iovec iov = {NULL, 0}; - struct msghdr msg; - memset(&msg, 0, sizeof(msg)); - msg.msg_name = &src_addr; - msg.msg_namelen = sizeof(src_addr); - msg.msg_iov = &iov; - msg.msg_iovlen = 1; + struct iovec iov = {}; + struct msghdr msg = { + .msg_name = &src_addr, + .msg_namelen = sizeof(src_addr), + .msg_iov = &iov, + .msg_iovlen = 1, + }; ssize_t peek_size = recvmsg(sock_fd, &msg, MSG_PEEK | MSG_TRUNC); if (peek_size < 0) { @@ -100,18 +94,23 @@ static bool getDefaultRouteIPv4(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, FF_AUTO_FREE uint8_t* buffer = malloc((size_t)peek_size); ssize_t received = recvfrom(sock_fd, buffer, (size_t)peek_size, 0, - (struct sockaddr*)&src_addr, &src_addr_len); + (struct sockaddr*)&src_addr, &src_addr_len); if (received != peek_size) { return false; } - struct Route4Entry best_gw; - memset(&best_gw, 0, sizeof(best_gw)); + struct { + uint32_t metric; + uint32_t ifindex; + uint32_t prefsrc; + } entry; + uint32_t minMetric = UINT32_MAX; for (const struct nlmsghdr* nlh = (struct nlmsghdr*)buffer; NLMSG_OK(nlh, received); nlh = NLMSG_NEXT(nlh, received)) { - + if (nlh->nlmsg_seq != 1 || nlh->nlmsg_pid != pid) + continue; if (nlh->nlmsg_type == NLMSG_DONE) break; @@ -122,83 +121,222 @@ static bool getDefaultRouteIPv4(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, if (rtm->rtm_family != AF_INET) continue; - struct Route4Entry entry; - memset(&entry, 0, sizeof(struct Route4Entry)); - entry.prefix_length = rtm->rtm_dst_len; + if (rtm->rtm_dst_len != 0) + continue; + + entry = (__typeof__(entry)) { .metric = UINT32_MAX }; // Parse route attributes size_t rtm_len = RTM_PAYLOAD(nlh); for (struct rtattr* rta = RTM_RTA(rtm); RTA_OK(rta, rtm_len); - rta = RTA_NEXT(rta, rtm_len)) { + rta = RTA_NEXT(rta, rtm_len)) + { + if (RTA_PAYLOAD(rta) < sizeof(uint32_t)) + continue; // Skip invalid attributes + uint32_t rta_data = *(uint32_t*) RTA_DATA(rta); switch (rta->rta_type) { case RTA_DST: - entry.dest = *(uint32_t*)RTA_DATA(rta); - break; - case RTA_GATEWAY: - entry.gateway = *(uint32_t*)RTA_DATA(rta); - break; - case RTA_PREFSRC: - entry.src = *(uint32_t*)RTA_DATA(rta); - break; - case RTA_PRIORITY: - entry.metric = *(uint32_t*)RTA_DATA(rta); + if (rta_data != 0) goto next; break; case RTA_OIF: - entry.ifindex = *(uint32_t*)RTA_DATA(rta); + entry.ifindex = rta_data; + break; + case RTA_GATEWAY: + if (rta_data == 0) goto next; + break; + case RTA_PRIORITY: + if (rta_data >= minMetric) goto next; + entry.metric = rta_data; + break; + case RTA_PREFSRC: + entry.prefsrc = rta_data; break; } } - if (entry.gateway == 0 || entry.dest != 0 || entry.prefix_length != 0) + if (entry.metric >= minMetric) + { + next: + continue; + } + minMetric = entry.metric; + result->ifIndex = entry.ifindex; + result->preferredSourceAddrV4 = entry.prefsrc; + } + + if (minMetric < UINT32_MAX) + { + if_indextoname(result->ifIndex, result->ifName); + return true; + } + return false; +} + +bool ffNetifGetDefaultRouteImplV6(FFNetifDefaultRouteResult* result) +{ + FF_AUTO_CLOSE_FD int sock_fd = socket(AF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_ROUTE); + if (sock_fd < 0) + return false; + + unsigned pid = (unsigned) getpid(); + + // Bind socket + struct sockaddr_nl addr = { + .nl_family = AF_NETLINK, + .nl_pid = pid, + .nl_groups = 0, // No multicast groups + }; + + if (bind(sock_fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) { + return false; + } + + struct { + struct nlmsghdr nlh; + struct rtmsg rtm; + struct rtattr rta; + uint32_t table; + } req = { + // Netlink message header + .nlh = { + .nlmsg_len = sizeof(req), + .nlmsg_type = RTM_GETROUTE, + .nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP, + .nlmsg_seq = 1, + .nlmsg_pid = pid, + }, + // Route message + .rtm = { + .rtm_family = AF_INET6, // IPv6 instead of IPv4 + .rtm_dst_len = 0, // Match all destinations + .rtm_src_len = 0, // Match all sources + .rtm_tos = 0, + .rtm_table = RT_TABLE_UNSPEC, + .rtm_protocol = RTPROT_UNSPEC, + .rtm_scope = RT_SCOPE_UNIVERSE, + .rtm_type = RTN_UNSPEC, + .rtm_flags = 0, + }, + // Route attribute for main table + .rta = { + .rta_len = RTA_LENGTH(sizeof(uint32_t)), + .rta_type = RTA_TABLE, + }, + .table = RT_TABLE_MAIN, + }; + + struct sockaddr_nl dest_addr = { + .nl_family = AF_NETLINK, + .nl_pid = 0, // Kernel + .nl_groups = 0, // No multicast groups + }; + + ssize_t sent = sendto(sock_fd, &req, sizeof(req), 0, + (struct sockaddr*)&dest_addr, sizeof(dest_addr)); + + if (sent != sizeof(req)) { + return false; + } + + struct sockaddr_nl src_addr = {}; + socklen_t src_addr_len = sizeof(src_addr); + + struct iovec iov = {}; + struct msghdr msg = { + .msg_name = &src_addr, + .msg_namelen = sizeof(src_addr), + .msg_iov = &iov, + .msg_iovlen = 1, + }; + + ssize_t peek_size = recvmsg(sock_fd, &msg, MSG_PEEK | MSG_TRUNC); + if (peek_size < 0) { + return false; + } + + FF_AUTO_FREE uint8_t* buffer = malloc((size_t)peek_size); + + ssize_t received = recvfrom(sock_fd, buffer, (size_t)peek_size, 0, + (struct sockaddr*)&src_addr, &src_addr_len); + if (received != peek_size) { + return false; + } + + struct { + uint32_t metric; + uint32_t ifindex; + } entry; + uint32_t minMetric = UINT32_MAX; + + for (const struct nlmsghdr* nlh = (struct nlmsghdr*)buffer; + NLMSG_OK(nlh, received); + nlh = NLMSG_NEXT(nlh, received)) { + if (nlh->nlmsg_seq != 1 || nlh->nlmsg_pid != pid) + continue; + if (nlh->nlmsg_type == NLMSG_DONE) + break; + + if (nlh->nlmsg_type != RTM_NEWROUTE) continue; - if (best_gw.gateway == 0 || entry.metric < best_gw.metric) { - memcpy(&best_gw, &entry, sizeof(struct Route4Entry)); - } - } + struct rtmsg* rtm = (struct rtmsg*)NLMSG_DATA(nlh); + if (rtm->rtm_family != AF_INET6) + continue; - if (best_gw.gateway != 0) { - if (ifIndex) { - *ifIndex = best_gw.ifindex; - } - if (iface) { - if (if_indextoname(best_gw.ifindex, iface) == NULL) { - iface[0] = '\0'; + if (rtm->rtm_dst_len != 0) + continue; + + entry = (__typeof__(entry)) { .metric = UINT32_MAX }; + + // Parse route attributes + size_t rtm_len = RTM_PAYLOAD(nlh); + for (struct rtattr* rta = RTM_RTA(rtm); + RTA_OK(rta, rtm_len); + rta = RTA_NEXT(rta, rtm_len)) + { + switch (rta->rta_type) { + case RTA_DST: + if (RTA_PAYLOAD(rta) >= sizeof(struct in6_addr)) { + struct in6_addr* dst = (struct in6_addr*) RTA_DATA(rta); + if (!IN6_IS_ADDR_UNSPECIFIED(dst)) goto next; + } + break; + case RTA_OIF: + if (RTA_PAYLOAD(rta) >= sizeof(uint32_t)) { + entry.ifindex = *(uint32_t*) RTA_DATA(rta); + } + break; + case RTA_GATEWAY: + if (RTA_PAYLOAD(rta) >= sizeof(struct in6_addr)) { + struct in6_addr* gw = (struct in6_addr*) RTA_DATA(rta); + if (IN6_IS_ADDR_UNSPECIFIED(gw)) goto next; + } + break; + case RTA_PRIORITY: + if (RTA_PAYLOAD(rta) >= sizeof(uint32_t)) { + uint32_t metric = *(uint32_t*) RTA_DATA(rta); + if (metric >= minMetric) goto next; + entry.metric = metric; + } + break; } } - if (preferredSourceAddr) { - *preferredSourceAddr = best_gw.src; + + if (entry.metric >= minMetric) + { + next: + continue; } - return true; + minMetric = entry.metric; + result->ifIndex = entry.ifindex; } - - iface[0] = '\0'; - return false; -} -static bool getDefaultRouteIPv6(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex) -{ - FILE* FF_AUTO_CLOSE_FILE netRoute = fopen("/proc/net/ipv6_route", "r"); - if (!netRoute) return false; - - uint32_t prefixLen; - //destination, dest_prefix_len, source, src_prefix_len, next hop, metric, ref counter, use counter, flags, iface - while (fscanf(netRoute, "%*s %x %*s %*s %*s %*s %*s %*s %*s %" FF_STR(IF_NAMESIZE) "s", &prefixLen, iface) == 2) + if (minMetric < UINT32_MAX) { - if (prefixLen != 0) continue; - *ifIndex = if_nametoindex(iface); + if_indextoname(result->ifIndex, result->ifName); return true; } - iface[0] = '\0'; return false; } - -bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, uint32_t* preferredSourceAddr) -{ - if (getDefaultRouteIPv4(iface, ifIndex, preferredSourceAddr)) - return true; - - return getDefaultRouteIPv6(iface, ifIndex); -} diff --git a/src/common/netif/netif_obsd.c b/src/common/netif/netif_obsd.c index c2224e16e..4c419a608 100644 --- a/src/common/netif/netif_obsd.c +++ b/src/common/netif/netif_obsd.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -35,11 +36,8 @@ get_rt_address(struct rt_msghdr *rtm, int desired) return NULL; } -bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, uint32_t* preferredSourceAddr) +bool ffNetifGetDefaultRouteImplV4(FFNetifDefaultRouteResult* result) { - if (preferredSourceAddr) - *preferredSourceAddr = 0; - int mib[6] = {CTL_NET, PF_ROUTE, 0, AF_INET, NET_RT_FLAGS, RTF_GATEWAY}; size_t needed; @@ -64,14 +62,52 @@ bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, if (sdl->sdl_family == AF_LINK) { assert(sdl->sdl_nlen <= IF_NAMESIZE); - memcpy(iface, sdl->sdl_data, sdl->sdl_nlen); - iface[sdl->sdl_nlen] = '\0'; - *ifIndex = sdl->sdl_index; + memcpy(result->ifName, sdl->sdl_data, sdl->sdl_nlen); + result->ifName[sdl->sdl_nlen] = '\0'; + result->ifIndex = sdl->sdl_index; // Get the preferred source address struct sockaddr_in* src = (struct sockaddr_in*)get_rt_address(rtm, RTA_IFA); - if (preferredSourceAddr && src && src->sin_family == AF_INET) - *preferredSourceAddr = src->sin_addr.s_addr; + if (src && src->sin_family == AF_INET) + result->preferredSourceAddrV4 = src->sin_addr.s_addr; + + return true; + } + } + } + + return false; +} + +bool ffNetifGetDefaultRouteImplV6(FFNetifDefaultRouteResult* result) +{ + int mib[6] = {CTL_NET, PF_ROUTE, 0, AF_INET6, NET_RT_FLAGS, RTF_GATEWAY}; + size_t needed; + + if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) + return false; + + FF_AUTO_FREE char* buf = malloc(needed); + + if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) + return false; + + char* lim = buf + needed; + struct rt_msghdr* rtm; + for (char* next = buf; next < lim; next += rtm->rtm_msglen) + { + rtm = (struct rt_msghdr *)next; + struct sockaddr* sa = (struct sockaddr *)(rtm + 1); + + if ((rtm->rtm_flags & RTF_GATEWAY) && (sa->sa_family == AF_INET6)) + { + struct sockaddr_dl* sdl = (struct sockaddr_dl *)get_rt_address(rtm, RTA_IFP); + if (sdl && sdl->sdl_family == AF_LINK) + { + assert(sdl->sdl_nlen <= IF_NAMESIZE); + memcpy(result->ifName, sdl->sdl_data, sdl->sdl_nlen); + result->ifName[sdl->sdl_nlen] = '\0'; + result->ifIndex = sdl->sdl_index; return true; } diff --git a/src/common/netif/netif_windows.c b/src/common/netif/netif_windows.c index 275c7b62e..4fa7144b3 100644 --- a/src/common/netif/netif_windows.c +++ b/src/common/netif/netif_windows.c @@ -4,11 +4,8 @@ #include // AF_INET6, IN6_IS_ADDR_UNSPECIFIED #include -bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, uint32_t* preferredSourceAddr) +bool ffNetifGetDefaultRouteImplV4(FFNetifDefaultRouteResult* result) { - if (preferredSourceAddr) - *preferredSourceAddr = 0; - PMIB_IPFORWARD_TABLE2 pIpForwardTable = NULL; if (!NETIO_SUCCESS(GetIpForwardTable2(AF_UNSPEC, &pIpForwardTable))) @@ -21,20 +18,17 @@ bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, { MIB_IPFORWARD_ROW2* row = &pIpForwardTable->Table[i]; - if ((row->DestinationPrefix.PrefixLength == 0) && - ((row->DestinationPrefix.Prefix.Ipv4.sin_family == AF_INET && - row->DestinationPrefix.Prefix.Ipv4.sin_addr.S_un.S_addr == 0) || - (row->DestinationPrefix.Prefix.Ipv6.sin6_family == AF_INET6 && - IN6_IS_ADDR_UNSPECIFIED(&row->DestinationPrefix.Prefix.Ipv6.sin6_addr)))) + if (row->DestinationPrefix.PrefixLength == 0 && + row->DestinationPrefix.Prefix.Ipv4.sin_family == AF_INET && + row->DestinationPrefix.Prefix.Ipv4.sin_addr.S_un.S_addr == 0) { MIB_IF_ROW2 ifRow = { .InterfaceIndex = row->InterfaceIndex, }; - if (NETIO_SUCCESS(GetIfEntry2(&ifRow)) && - ifRow.OperStatus == IfOperStatusUp) + if (NETIO_SUCCESS(GetIfEntry2(&ifRow)) && ifRow.OperStatus == IfOperStatusUp) { MIB_IPINTERFACE_ROW ipInterfaceRow = { - .Family = (row->DestinationPrefix.Prefix.Ipv4.sin_family == AF_INET) ? AF_INET : AF_INET6, + .Family = AF_INET, .InterfaceIndex = row->InterfaceIndex, }; @@ -46,9 +40,57 @@ bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex, if (realMetric < smallestMetric) { smallestMetric = realMetric; - *ifIndex = row->InterfaceIndex; - if (WideCharToMultiByte(CP_UTF8, 0, ifRow.Alias, -1, iface, IF_NAMESIZE, NULL, NULL) > 0) - iface[IF_NAMESIZE] = '\0'; + result->ifIndex = row->InterfaceIndex; + foundDefault = true; + break; + } + } + } + } + + FreeMibTable(pIpForwardTable); + + return foundDefault; +} + + +bool ffNetifGetDefaultRouteImplV6(FFNetifDefaultRouteResult* result) +{ + PMIB_IPFORWARD_TABLE2 pIpForwardTable = NULL; + + if (!NETIO_SUCCESS(GetIpForwardTable2(AF_UNSPEC, &pIpForwardTable))) + return false; + + bool foundDefault = false; + uint32_t smallestMetric = UINT32_MAX; + + for (ULONG i = 0; i < pIpForwardTable->NumEntries; ++i) + { + MIB_IPFORWARD_ROW2* row = &pIpForwardTable->Table[i]; + + if (row->DestinationPrefix.PrefixLength == 0 && + row->DestinationPrefix.Prefix.Ipv6.sin6_family == AF_INET6 && + IN6_IS_ADDR_UNSPECIFIED(&row->DestinationPrefix.Prefix.Ipv6.sin6_addr)) + { + MIB_IF_ROW2 ifRow = { + .InterfaceIndex = row->InterfaceIndex, + }; + if (NETIO_SUCCESS(GetIfEntry2(&ifRow)) && ifRow.OperStatus == IfOperStatusUp) + { + MIB_IPINTERFACE_ROW ipInterfaceRow = { + .Family = AF_INET6, + .InterfaceIndex = row->InterfaceIndex, + }; + + uint32_t realMetric = row->Metric /* Metric offset */; + + if (NETIO_SUCCESS(GetIpInterfaceEntry(&ipInterfaceRow))) + realMetric += ipInterfaceRow.Metric /* Interface metric */; + + if (realMetric < smallestMetric) + { + smallestMetric = realMetric; + result->ifIndex = row->InterfaceIndex; foundDefault = true; } } diff --git a/src/detection/dns/dns_windows.c b/src/detection/dns/dns_windows.c index 55cda9e4f..48615117f 100644 --- a/src/detection/dns/dns_windows.c +++ b/src/detection/dns/dns_windows.c @@ -37,7 +37,7 @@ const char* ffDetectDNS(FFDNSOptions* options, FFlist* results) return "GetAdaptersAddresses() failed"; } - uint32_t defaultRouteIfIndex = ffNetifGetDefaultRouteIfIndex(); + uint32_t defaultRouteIfIndex = ffNetifGetDefaultRouteV4()->ifIndex; // Iterate through all of the adapters for (IP_ADAPTER_ADDRESSES* adapter = adapter_addresses; adapter; adapter = adapter->Next) { diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index ac8ead7dd..318c3fa92 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -11,11 +11,17 @@ #include #include #include +#include #ifdef __linux__ #include #include #include +#include +#endif + +#if __has_include() + #include #endif #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__APPLE__) || defined(__NetBSD__) || defined(__HAIKU__) @@ -88,6 +94,7 @@ static void addNewIp(FFlist* list, const char* name, const char* addr, int type, { if (!ffStrbufEqualS(&temp->name, name)) continue; ip = temp; + if (defaultRoute) ip->defaultRoute = true; break; } if (!ip) @@ -129,28 +136,87 @@ static void addNewIp(FFlist* list, const char* name, const char* addr, int type, } } +static bool isIPv6AddressPreferred(const char* ifname, struct sockaddr_in6* addr) +{ +#ifndef IN6_IS_ADDR_GLOBAL +#define IN6_IS_ADDR_GLOBAL(a) \ + ((((const uint32_t *) (a))[0] & htonl(0x70000000)) == htonl(0x20000000)) +#endif + if (!IN6_IS_ADDR_GLOBAL(&addr->sin6_addr)) + return false; + +#ifdef SIOCGIFAFLAG_IN6 + static int sockfd = 0; + if (sockfd == 0) sockfd = socket(AF_INET6, SOCK_DGRAM, 0); + if (sockfd < 0) return true; // Give up + + struct in6_ifreq ifr6 = {}; + ffStrCopy(ifr6.ifr_name, ifname, IFNAMSIZ); + ifr6.ifr_addr = *addr; + + if (ioctl(sockfd, SIOCGIFAFLAG_IN6, &ifr6) != 0) + return true; + + return !(ifr6.ifr_flags & IN6_IFF_DEPRECATED) && !(ifr6.ifr_flags & IN6_IFF_TEMPORARY); +#elif __linux__ + FF_UNUSED(ifname); + + static FFlist addresses = {}; + if (addresses.elementSize == 0) + { + ffListInit(&addresses, sizeof(struct in6_addr)); + FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate(); + if (!ffReadFileBuffer("/proc/net/if_inet6", &buffer)) + return true; + + char* line = NULL; + size_t len = 0; + while (ffStrbufGetline(&line, &len, &buffer)) + { + struct in6_addr* entry = (struct in6_addr*) ffListAdd(&addresses); + uint8_t flags; + if (sscanf(line, "%2" SCNx8 "%2" SCNx8 "%2" SCNx8 "%2" SCNx8 "%2" SCNx8 "%2" SCNx8 "%2" SCNx8 "%2" SCNx8 "%2" SCNx8 "%2" SCNx8 "%2" SCNx8 "%2" SCNx8 "%2" SCNx8 "%2" SCNx8 "%2" SCNx8 "%2" SCNx8 " %*s %*s %*s %" SCNx8 " %*s", + &entry->s6_addr[0], &entry->s6_addr[1], &entry->s6_addr[2], &entry->s6_addr[3], + &entry->s6_addr[4], &entry->s6_addr[5], &entry->s6_addr[6], &entry->s6_addr[7], + &entry->s6_addr[8], &entry->s6_addr[9], &entry->s6_addr[10], &entry->s6_addr[11], + &entry->s6_addr[12], &entry->s6_addr[13], &entry->s6_addr[14], &entry->s6_addr[15], + &flags) != 17 || + !IN6_IS_ADDR_GLOBAL(entry) || + (flags & IFA_F_DEPRECATED) || + (flags & IFA_F_TEMPORARY) + ) + --addresses.length; + } + } + if (addresses.capacity == 0) return true; // Give up + + FF_LIST_FOR_EACH(struct in6_addr, entry, addresses) + { + if (memcmp(&addr->sin6_addr, entry, sizeof(struct in6_addr)) == 0) + return true; + } + return false; +#else + return true; +#endif +} + const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) { struct ifaddrs* ifAddrStruct = NULL; if(getifaddrs(&ifAddrStruct) < 0) return "getifaddrs(&ifAddrStruct) failed"; - const char* defaultRouteIfName = ffNetifGetDefaultRouteIfName(); - const uint32_t preferredSourceAddr = ffNetifGetDefaultRoutePreferredSourceAddr(); - for (struct ifaddrs* ifa = ifAddrStruct; ifa; ifa = ifa->ifa_next) { if (!ifa->ifa_addr) continue; + #ifdef IFF_RUNNING if (!(ifa->ifa_flags & IFF_RUNNING)) continue; #endif - bool isDefaultRouteIf = ffStrEquals(defaultRouteIfName, ifa->ifa_name); - if ((options->showType & FF_LOCALIP_TYPE_DEFAULT_ROUTE_ONLY_BIT) && !isDefaultRouteIf) - continue; - if ((ifa->ifa_flags & IFF_LOOPBACK) && !(options->showType & FF_LOCALIP_TYPE_LOOP_BIT)) continue; @@ -166,9 +232,20 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) struct sockaddr_in* ipv4 = (struct sockaddr_in*) ifa->ifa_addr; - bool isDefaultRoute = isDefaultRouteIf && (preferredSourceAddr == 0 || ipv4->sin_addr.s_addr == preferredSourceAddr); - if ((options->showType & FF_LOCALIP_TYPE_DEFAULT_ROUTE_ONLY_BIT) && !isDefaultRoute) - continue; + const FFNetifDefaultRouteResult* defaultRoute = ffNetifGetDefaultRouteV4(); + bool isDefaultRouteIf = ffStrEquals(defaultRoute->ifName, ifa->ifa_name); + if (options->showType & FF_LOCALIP_TYPE_DEFAULT_ROUTE_ONLY_BIT) + { + if (!isDefaultRouteIf) + continue; + + if (!(options->showType & FF_LOCALIP_TYPE_ALL_IPS_BIT)) + { + bool isPreferredSourceAddr = defaultRoute->preferredSourceAddrV4 == 0 || ipv4->sin_addr.s_addr == defaultRoute->preferredSourceAddrV4; + if (!isPreferredSourceAddr) + continue; + } + } char addressBuffer[INET_ADDRSTRLEN + 16]; inet_ntop(AF_INET, &ipv4->sin_addr, addressBuffer, INET_ADDRSTRLEN); @@ -184,14 +261,22 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) } } - addNewIp(results, ifa->ifa_name, addressBuffer, AF_INET, isDefaultRoute, flags, !(options->showType & FF_LOCALIP_TYPE_ALL_IPS_BIT)); + addNewIp(results, ifa->ifa_name, addressBuffer, AF_INET, isDefaultRouteIf, flags, !(options->showType & FF_LOCALIP_TYPE_ALL_IPS_BIT)); } else if (ifa->ifa_addr->sa_family == AF_INET6) { if (!(options->showType & FF_LOCALIP_TYPE_IPV6_BIT)) continue; + const FFNetifDefaultRouteResult* defaultRoute = ffNetifGetDefaultRouteV6(); + bool isDefaultRouteIf = ffStrEquals(defaultRoute->ifName, ifa->ifa_name); + if ((options->showType & FF_LOCALIP_TYPE_DEFAULT_ROUTE_ONLY_BIT) && !isDefaultRouteIf) + continue; + struct sockaddr_in6* ipv6 = (struct sockaddr_in6 *)ifa->ifa_addr; + if (!(options->showType & FF_LOCALIP_TYPE_ALL_IPS_BIT) && !isIPv6AddressPreferred(ifa->ifa_name, ipv6)) + continue; + char addressBuffer[INET6_ADDRSTRLEN + 16]; inet_ntop(AF_INET6, &ipv6->sin6_addr, addressBuffer, INET6_ADDRSTRLEN); @@ -221,7 +306,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) uint8_t* ptr = (uint8_t*) LLADDR((struct sockaddr_dl *)ifa->ifa_addr); snprintf(addressBuffer, ARRAY_SIZE(addressBuffer), "%02x:%02x:%02x:%02x:%02x:%02x", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]); - addNewIp(results, ifa->ifa_name, addressBuffer, -1, isDefaultRouteIf, flags, false); + addNewIp(results, ifa->ifa_name, addressBuffer, -1, false, flags, false); } #else else if (ifa->ifa_addr->sa_family == AF_PACKET) @@ -233,7 +318,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) uint8_t* ptr = ((struct sockaddr_ll *)ifa->ifa_addr)->sll_addr; snprintf(addressBuffer, ARRAY_SIZE(addressBuffer), "%02x:%02x:%02x:%02x:%02x:%02x", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]); - addNewIp(results, ifa->ifa_name, addressBuffer, -1, isDefaultRouteIf, flags, false); + addNewIp(results, ifa->ifa_name, addressBuffer, -1, false, flags, false); } #endif } diff --git a/src/detection/localip/localip_windows.c b/src/detection/localip/localip_windows.c index 45b1445b5..143326f83 100644 --- a/src/detection/localip/localip_windows.c +++ b/src/detection/localip/localip_windows.c @@ -90,7 +90,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) return "GetAdaptersAddresses() failed"; } - uint32_t defaultRouteIfIndex = ffNetifGetDefaultRouteIfIndex(); + uint32_t defaultRouteIfIndex = ffNetifGetDefaultRouteV4()->ifIndex; // Iterate through all of the adapters for (IP_ADAPTER_ADDRESSES* adapter = adapter_addresses; adapter; adapter = adapter->Next) diff --git a/src/detection/netio/netio_apple.c b/src/detection/netio/netio_apple.c index cd5106026..69f2667c9 100644 --- a/src/detection/netio/netio_apple.c +++ b/src/detection/netio/netio_apple.c @@ -11,7 +11,7 @@ const char* ffNetIOGetIoCounters(FFlist* result, FFNetIOOptions* options) { int mib[] = {CTL_NET, PF_LINK, NETLINK_GENERIC, options->defaultRouteOnly ? IFMIB_IFDATA : IFMIB_IFALLDATA, - options->defaultRouteOnly ? (int) ffNetifGetDefaultRouteIfIndex() : 0, + options->defaultRouteOnly ? (int) ffNetifGetDefaultRouteV4()->ifIndex : 0, IFDATA_GENERAL}; size_t bufSize = 0; @@ -26,7 +26,7 @@ const char* ffNetIOGetIoCounters(FFlist* result, FFNetIOOptions* options) size_t ifCount = bufSize / sizeof(struct ifmibdata); - const char* defaultRouteIfName = ffNetifGetDefaultRouteIfName(); + const char* defaultRouteIfName = ffNetifGetDefaultRouteV4()->ifName; for (size_t i = 0; i < ifCount; i++) { diff --git a/src/detection/netio/netio_bsd.c b/src/detection/netio/netio_bsd.c index 9044600e5..dcf9b709d 100644 --- a/src/detection/netio/netio_bsd.c +++ b/src/detection/netio/netio_bsd.c @@ -12,7 +12,7 @@ const char* ffNetIOGetIoCounters(FFlist* result, FFNetIOOptions* options) { - uint32_t defaultRouteIfIndex = ffNetifGetDefaultRouteIfIndex(); + uint32_t defaultRouteIfIndex = ffNetifGetDefaultRouteV4()->ifIndex; size_t bufSize = 0; if (sysctl((int[]) { CTL_NET, PF_ROUTE, 0, 0, NET_RT_IFLIST, (options->defaultRouteOnly ? (int) defaultRouteIfIndex : 0) }, 6, NULL, &bufSize, 0, 0) < 0) diff --git a/src/detection/netio/netio_haiku.cpp b/src/detection/netio/netio_haiku.cpp index e0c62ebf2..812d926f4 100644 --- a/src/detection/netio/netio_haiku.cpp +++ b/src/detection/netio/netio_haiku.cpp @@ -13,7 +13,7 @@ const char* ffNetIOGetIoCounters(FFlist* result, FFNetIOOptions* options) BNetworkInterface interface; uint32 cookie = 0; - uint32_t defaultRouteIfIndex = ffNetifGetDefaultRouteIfIndex(); + uint32_t defaultRouteIfIndex = ffNetifGetDefaultRouteV4()->ifIndex; while (roster.GetNextInterface(&cookie, interface) == B_OK) { diff --git a/src/detection/netio/netio_linux.c b/src/detection/netio/netio_linux.c index 2a28c10eb..651a612fa 100644 --- a/src/detection/netio/netio_linux.c +++ b/src/detection/netio/netio_linux.c @@ -53,7 +53,7 @@ const char* ffNetIOGetIoCounters(FFlist* result, FFNetIOOptions* options) FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate(); - const char* defaultRouteIfName = ffNetifGetDefaultRouteIfName(); + const char* defaultRouteIfName = ffNetifGetDefaultRouteV4()->ifName; if (options->defaultRouteOnly) { diff --git a/src/detection/netio/netio_sunos.c b/src/detection/netio/netio_sunos.c index e87222e83..b85e1f671 100644 --- a/src/detection/netio/netio_sunos.c +++ b/src/detection/netio/netio_sunos.c @@ -16,7 +16,7 @@ const char* ffNetIOGetIoCounters(FFlist* result, FFNetIOOptions* options) if (!kc) return "kstat_open() failed"; - const char* defaultRoute = ffNetifGetDefaultRouteIfName(); + const char* defaultRouteIfName = ffNetifGetDefaultRouteV4()->ifName; for (kstat_t* ks = kc->kc_chain; ks; ks = ks->ks_next) { diff --git a/src/detection/netio/netio_windows.c b/src/detection/netio/netio_windows.c index 1d3ab8fbe..56e5fc06d 100644 --- a/src/detection/netio/netio_windows.c +++ b/src/detection/netio/netio_windows.c @@ -37,7 +37,7 @@ const char* ffNetIOGetIoCounters(FFlist* result, FFNetIOOptions* options) return "GetAdaptersAddresses() failed"; } - uint32_t defaultRouteIfIndex = ffNetifGetDefaultRouteIfIndex(); + uint32_t defaultRouteIfIndex = ffNetifGetDefaultRouteV4()->ifIndex; // Iterate through all of the adapters for (IP_ADAPTER_ADDRESSES* adapter = adapter_addresses; adapter; adapter = adapter->Next) From be11013ae28960933f4309f63375afa263c9cce7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 7 Aug 2025 20:18:52 +0800 Subject: [PATCH 36/83] LocalIP (BSD): fix building --- src/common/netif/netif_obsd.c | 1 - src/detection/localip/localip_linux.c | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/common/netif/netif_obsd.c b/src/common/netif/netif_obsd.c index 4c419a608..33bd0032b 100644 --- a/src/common/netif/netif_obsd.c +++ b/src/common/netif/netif_obsd.c @@ -7,7 +7,6 @@ #include #include #include -#include #include #include diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index 318c3fa92..5f9869083 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -157,7 +157,7 @@ static bool isIPv6AddressPreferred(const char* ifname, struct sockaddr_in6* addr if (ioctl(sockfd, SIOCGIFAFLAG_IN6, &ifr6) != 0) return true; - return !(ifr6.ifr_flags & IN6_IFF_DEPRECATED) && !(ifr6.ifr_flags & IN6_IFF_TEMPORARY); + return !(ifr6.ifr_ifru.ifru_flags6 & IN6_IFF_DEPRECATED) && !(ifr6.ifr_ifru.ifru_flags6 & IN6_IFF_TEMPORARY); #elif __linux__ FF_UNUSED(ifname); From 02c999725cf471a9fb0b762f65c51a8e67ee7d46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 7 Aug 2025 23:30:44 +0800 Subject: [PATCH 37/83] NetIO (SunOS): fix build --- src/detection/netio/netio_sunos.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/detection/netio/netio_sunos.c b/src/detection/netio/netio_sunos.c index b85e1f671..e946d6d7e 100644 --- a/src/detection/netio/netio_sunos.c +++ b/src/detection/netio/netio_sunos.c @@ -25,7 +25,7 @@ const char* ffNetIOGetIoCounters(FFlist* result, FFNetIOOptions* options) if (options->namePrefix.length && strncmp(ks->ks_name, options->namePrefix.chars, options->namePrefix.length) != 0) continue; - bool isDefaultRoute = ffStrEquals(ks->ks_name, defaultRoute); + bool isDefaultRoute = ffStrEquals(ks->ks_name, defaultRouteIfName); if (options->defaultRouteOnly && !isDefaultRoute) continue; From 64568b31d19b294d5b67fe92e51d1d229aebc9ac Mon Sep 17 00:00:00 2001 From: Carter Li Date: Fri, 8 Aug 2025 00:26:47 +0800 Subject: [PATCH 38/83] Netif (Haiku): add preferred source addr --- src/common/netif/netif_haiku.c | 51 +++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/src/common/netif/netif_haiku.c b/src/common/netif/netif_haiku.c index 914db83e2..06f8e90b6 100644 --- a/src/common/netif/netif_haiku.c +++ b/src/common/netif/netif_haiku.c @@ -41,9 +41,11 @@ bool ffNetifGetDefaultRouteImplV4(FFNetifDefaultRouteResult* result) while (interface < end) { if (interface->ifr_route.flags & RTF_DEFAULT) { + // interface->ifr_metric? strlcpy(result->ifName, interface->ifr_name, IF_NAMESIZE); result->ifIndex = if_nametoindex(interface->ifr_name); - // TODO: Get the preferred source address + if (interface->ifr_route.source) + result->preferredSourceAddrV4 = ((struct sockaddr_in*)interface->ifr_route.source)->sin_addr.s_addr; return true; } @@ -55,8 +57,7 @@ bool ffNetifGetDefaultRouteImplV4(FFNetifDefaultRouteResult* result) if (interface->ifr_route.gateway != NULL) addressSize += interface->ifr_route.gateway->sa_len; - interface = (struct ifreq*)((addr_t)interface + IF_NAMESIZE - + sizeof(struct route_entry) + addressSize); + interface = (struct ifreq*)((addr_t)interface + IF_NAMESIZE + sizeof(struct route_entry) + addressSize); } return false; @@ -64,6 +65,48 @@ bool ffNetifGetDefaultRouteImplV4(FFNetifDefaultRouteResult* result) bool ffNetifGetDefaultRouteImplV6(FFNetifDefaultRouteResult* result) { - // TODO: AF_INET6 + FF_AUTO_CLOSE_FD int pfRoute = socket(AF_INET, SOCK_RAW, AF_INET6); + if (pfRoute < 0) + return false; + + struct ifconf config; + config.ifc_len = sizeof(config.ifc_value); + if (ioctl(pfRoute, SIOCGRTSIZE, &config, sizeof(struct ifconf)) < 0) + return false; + + int size = config.ifc_value; + if (size <= 0) + return false; + + FF_AUTO_FREE void *buffer = malloc((size_t) size); + if (buffer == NULL) { + return false; + } + + config.ifc_len = size; + config.ifc_buf = buffer; + if (ioctl(pfRoute, SIOCGRTTABLE, &config, sizeof(struct ifconf)) < 0) + return false; + + struct ifreq *interface = (struct ifreq*)buffer; + struct ifreq *end = (struct ifreq*)((uint8_t*)buffer + size); + + while (interface < end) { + if (interface->ifr_route.flags & RTF_DEFAULT) { + strlcpy(result->ifName, interface->ifr_name, IF_NAMESIZE); + result->ifIndex = if_nametoindex(interface->ifr_name); + return true; + } + + size_t addressSize = 0; + if (interface->ifr_route.destination != NULL) + addressSize += interface->ifr_route.destination->sa_len; + if (interface->ifr_route.mask != NULL) + addressSize += interface->ifr_route.mask->sa_len; + if (interface->ifr_route.gateway != NULL) + addressSize += interface->ifr_route.gateway->sa_len; + + interface = (struct ifreq*)((addr_t)interface + IF_NAMESIZE + sizeof(struct route_entry) + addressSize); + } return false; } From 8cfee9d693feecb015a8c24a97c1a50fd2c19312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 8 Aug 2025 10:05:20 +0800 Subject: [PATCH 39/83] Netif: unifies BSD netif handling --- CMakeLists.txt | 9 +- src/common/netif/netif_apple.c | 193 +++++++++++++++++++++++++++++++++ src/common/netif/netif_bsd.c | 140 ++++++++---------------- src/common/netif/netif_obsd.c | 117 -------------------- 4 files changed, 240 insertions(+), 219 deletions(-) create mode 100644 src/common/netif/netif_apple.c delete mode 100644 src/common/netif/netif_obsd.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 9563631cb..29e403100 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -638,6 +638,7 @@ elseif(FreeBSD) list(APPEND LIBFASTFETCH_SRC src/common/dbus.c src/common/io/io_unix.c + src/common/netif/netif_bsd.c src/common/networking/networking_linux.c src/common/processing_linux.c src/common/sysctl.c @@ -717,13 +718,11 @@ elseif(FreeBSD) ) if(DragonFly) list(APPEND LIBFASTFETCH_SRC - src/common/netif/netif_obsd.c src/detection/bluetooth/bluetooth_nosupport.c src/detection/wifi/wifi_nosupport.c ) else() list(APPEND LIBFASTFETCH_SRC - src/common/netif/netif_bsd.c src/detection/bluetooth/bluetooth_bsd.c src/detection/wifi/wifi_bsd.c ) @@ -814,7 +813,7 @@ elseif(OpenBSD) list(APPEND LIBFASTFETCH_SRC src/common/dbus.c src/common/io/io_unix.c - src/common/netif/netif_obsd.c + src/common/netif/netif_bsd.c src/common/networking/networking_linux.c src/common/processing_linux.c src/common/sysctl.c @@ -896,7 +895,7 @@ elseif(OpenBSD) elseif(APPLE) list(APPEND LIBFASTFETCH_SRC src/common/io/io_unix.c - src/common/netif/netif_bsd.c + src/common/netif/netif_apple.c src/common/networking/networking_linux.c src/common/processing_linux.c src/common/sysctl.c @@ -1042,7 +1041,7 @@ elseif(SunOS) list(APPEND LIBFASTFETCH_SRC src/common/dbus.c src/common/io/io_unix.c - src/common/netif/netif_bsd.c + src/common/netif/netif_apple.c src/common/networking/networking_linux.c src/common/processing_linux.c src/detection/battery/battery_nosupport.c diff --git a/src/common/netif/netif_apple.c b/src/common/netif/netif_apple.c new file mode 100644 index 000000000..d62cb653c --- /dev/null +++ b/src/common/netif/netif_apple.c @@ -0,0 +1,193 @@ +#include "netif.h" + +#include "common/io/io.h" +#include "util/mallocHelper.h" + +#include +#include +#include +#include +#include + +#define ROUNDUP2(a, n) ((a) > 0 ? (1 + (((a) - 1U) | ((n) - 1))) : (n)) + +#if __APPLE__ + // https://github.com/apple-oss-distributions/network_cmds/blob/8f38231438e6a4d16ef8015e97e12c2c05105644/rtsol.tproj/if.c#L243 + #define ROUNDUP(a) ROUNDUP2((a), sizeof(uint32_t)) +#elif __sun + // https://github.com/illumos/illumos-gate/blob/95b8c88950fa7b19af46bc63230137cf96b0bff7/usr/src/cmd/cmd-inet/usr.sbin/route.c#L339 + #define ROUNDUP(a) ROUNDUP2((a), sizeof(long)) +#else + #error unknown platform +#endif + +static struct sockaddr * +get_rt_address(struct rt_msghdr *rtm, int desired) +{ + struct sockaddr *sa = (struct sockaddr *)(rtm + 1); + + for (int i = 0; i < RTAX_MAX; i++) + { + if (rtm->rtm_addrs & (1 << i)) + { + if ((1 << i) == desired) + return sa; + + #ifndef __sun + uint32_t salen = sa->sa_len; + #else + uint32_t salen; + // https://github.com/illumos/illumos-gate/blob/95b8c88950fa7b19af46bc63230137cf96b0bff7/usr/src/cmd/cmd-inet/usr.sbin/route.c#L2941 + switch (sa->sa_family) { + case AF_INET: + salen = sizeof (struct sockaddr_in); + case AF_LINK: + salen = sizeof (struct sockaddr_dl); + case AF_INET6: + salen = sizeof (struct sockaddr_in6); + default: + salen = sizeof (struct sockaddr); + } + #endif + sa = (struct sockaddr *)(ROUNDUP(salen) + (char *)sa); + } + } + return NULL; +} + +bool ffNetifGetDefaultRouteImplV4(FFNetifDefaultRouteResult* result) +{ + //https://github.com/hashPirate/copenheimer-masscan-fork/blob/36f1ed9f7b751a7dccd5ed27874e2e703db7d481/src/rawsock-getif.c#L104 + + FF_AUTO_CLOSE_FD int pfRoute = socket(PF_ROUTE, SOCK_RAW, AF_INET); + if (pfRoute < 0) + return false; + + { + struct timeval timeout = {1, 0}; + setsockopt(pfRoute, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)); + setsockopt(pfRoute, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)); + } + + int pid = getpid(); + + struct { + struct rt_msghdr hdr; + struct sockaddr_in dst; + uint8_t data[512]; + } rtmsg = { + .hdr = { + .rtm_type = RTM_GET, + .rtm_flags = RTF_UP | RTF_GATEWAY, + .rtm_version = RTM_VERSION, + .rtm_addrs = RTA_DST | RTA_IFP | RTA_IFA, + .rtm_msglen = sizeof(rtmsg.hdr) + sizeof(rtmsg.dst), + .rtm_pid = pid, + .rtm_seq = 1, + }, + .dst = { + .sin_family = AF_INET, + #ifndef __sun + .sin_len = sizeof(rtmsg.dst), + #endif + }, + }; + + if (send(pfRoute, &rtmsg, rtmsg.hdr.rtm_msglen, 0) != rtmsg.hdr.rtm_msglen) + return false; + + while (recv(pfRoute, &rtmsg, sizeof(rtmsg), 0) > 0 && !(rtmsg.hdr.rtm_seq == 1 && rtmsg.hdr.rtm_pid == pid)) + ; + + if ((rtmsg.hdr.rtm_flags & (RTF_UP | RTF_GATEWAY)) == (RTF_UP | RTF_GATEWAY)) + { + struct sockaddr_dl* sdl = (struct sockaddr_dl *)get_rt_address(&rtmsg.hdr, RTA_IFP); + if (sdl + #ifndef __sun + && sdl->sdl_len + #endif + ) + { + assert(sdl->sdl_nlen <= IF_NAMESIZE); + memcpy(result->ifName, sdl->sdl_data, sdl->sdl_nlen); + result->ifName[sdl->sdl_nlen] = '\0'; + result->ifIndex = sdl->sdl_index; + + // Get the preferred source address + struct sockaddr_in* src = (struct sockaddr_in*)get_rt_address(&rtmsg.hdr, RTA_IFA); + if (src && src->sin_family == AF_INET) + result->preferredSourceAddrV4 = src->sin_addr.s_addr; + + return true; + } + return false; + } + + return false; +} + +bool ffNetifGetDefaultRouteImplV6(FFNetifDefaultRouteResult* result) +{ + //https://github.com/hashPirate/copenheimer-masscan-fork/blob/36f1ed9f7b751a7dccd5ed27874e2e703db7d481/src/rawsock-getif.c#L104 + + FF_AUTO_CLOSE_FD int pfRoute = socket(PF_ROUTE, SOCK_RAW, AF_INET6); + if (pfRoute < 0) + return false; + + { + struct timeval timeout = {1, 0}; + setsockopt(pfRoute, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)); + setsockopt(pfRoute, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)); + } + + int pid = getpid(); + + struct { + struct rt_msghdr hdr; + struct sockaddr_in6 dst; + uint8_t data[512]; + } rtmsg = { + .hdr = { + .rtm_type = RTM_GET, + .rtm_flags = RTF_UP | RTF_GATEWAY, + .rtm_version = RTM_VERSION, + .rtm_addrs = RTA_DST | RTA_IFP, + .rtm_msglen = sizeof(rtmsg.hdr) + sizeof(rtmsg.dst), + .rtm_pid = pid, + .rtm_seq = 2, + }, + .dst = { + .sin6_family = AF_INET6, + #ifndef __sun + .sin6_len = sizeof(rtmsg.dst), + #endif + }, + }; + + if (send(pfRoute, &rtmsg, rtmsg.hdr.rtm_msglen, 0) != rtmsg.hdr.rtm_msglen) + return false; + + while (recv(pfRoute, &rtmsg, sizeof(rtmsg), 0) > 0 && !(rtmsg.hdr.rtm_seq == 2 && rtmsg.hdr.rtm_pid == pid)) + ; + + if ((rtmsg.hdr.rtm_flags & (RTF_UP | RTF_GATEWAY)) == (RTF_UP | RTF_GATEWAY)) + { + struct sockaddr_dl* sdl = (struct sockaddr_dl *)get_rt_address(&rtmsg.hdr, RTA_IFP); + if (sdl + #ifndef __sun + && sdl->sdl_len + #endif + ) + { + assert(sdl->sdl_nlen <= IF_NAMESIZE); + memcpy(result->ifName, sdl->sdl_data, sdl->sdl_nlen); + result->ifName[sdl->sdl_nlen] = '\0'; + result->ifIndex = sdl->sdl_index; + + return true; + } + return false; + } + + return false; +} diff --git a/src/common/netif/netif_bsd.c b/src/common/netif/netif_bsd.c index a0cc4e521..90c788908 100644 --- a/src/common/netif/netif_bsd.c +++ b/src/common/netif/netif_bsd.c @@ -8,17 +8,24 @@ #include #include #include +#include #define ROUNDUP2(a, n) ((a) > 0 ? (1 + (((a) - 1U) | ((n) - 1))) : (n)) -#if defined(__APPLE__) || defined(__FreeBSD__) -# define ROUNDUP(a) ROUNDUP2((a), sizeof(int)) -#elif defined(__NetBSD__) -# define ROUNDUP(a) ROUNDUP2((a), sizeof(uint64_t)) -#elif defined(__sun) -# define ROUNDUP(a) ROUNDUP2((a), _SS_ALIGNSIZE) +#if __DragonFly__ + // https://github.com/DragonFlyBSD/DragonFlyBSD/blob/cf0aa2f1e47a3f0a6055fe427563cb3f3e627064/sys/net/route.h#L315C9-L315C19 + #define ROUNDUP(a) ROUNDUP2((a), sizeof(long)) +#elif __FreeBSD__ + // https://github.com/freebsd/freebsd-src/blob/e4c0ecba44b20ebb2e4d80978c2cb6d16b730cb9/sys/net/route.h#L368C9-L368C16 + #define ROUNDUP(a) ROUNDUP2((a), sizeof(long)) +#elif __NetBSD__ + // https://github.com/NetBSD/src/blob/29beb637d057520c0ed37ac2cde966f7cc0cadf4/sys/net/route.h#L330 + #define ROUNDUP(a) ROUNDUP2((a), sizeof(uint64_t)) +#elif __OpenBSD__ + // https://github.com/openbsd/src/blob/ca647cfa4ec3ccb8360714bc0ebc32a394f7fb6a/regress/sys/netinet/bindconnect/bindconnect.c#L250 + #define ROUNDUP(a) ROUNDUP2((a), sizeof(long)) #else -# error unknown platform + #error unknown platform #endif static struct sockaddr * @@ -32,11 +39,7 @@ get_rt_address(struct rt_msghdr *rtm, int desired) { if ((1 << i) == desired) return sa; -#ifdef __sun - sa = (struct sockaddr *)(ROUNDUP(sizeof(struct sockaddr)) + (char *)sa); -#else sa = (struct sockaddr *)(ROUNDUP(sa->sa_len) + (char *)sa); -#endif } } return NULL; @@ -44,55 +47,28 @@ get_rt_address(struct rt_msghdr *rtm, int desired) bool ffNetifGetDefaultRouteImplV4(FFNetifDefaultRouteResult* result) { - //https://github.com/hashPirate/copenheimer-masscan-fork/blob/36f1ed9f7b751a7dccd5ed27874e2e703db7d481/src/rawsock-getif.c#L104 + int mib[6] = {CTL_NET, PF_ROUTE, 0, AF_INET, NET_RT_FLAGS, RTF_GATEWAY}; + size_t needed; - FF_AUTO_CLOSE_FD int pfRoute = socket(PF_ROUTE, SOCK_RAW, AF_INET); - if (pfRoute < 0) + if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0 || needed == 0) return false; - { - struct timeval timeout = {1, 0}; - setsockopt(pfRoute, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)); - setsockopt(pfRoute, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)); - } + FF_AUTO_FREE char* buf = malloc(needed); - int pid = getpid(); - - struct { - struct rt_msghdr hdr; - struct sockaddr_in dst; - uint8_t data[512]; - } rtmsg = { - .hdr = { - .rtm_type = RTM_GET, - .rtm_flags = RTF_UP | RTF_GATEWAY, - .rtm_version = RTM_VERSION, - .rtm_addrs = RTA_DST | RTA_IFP | RTA_IFA, - .rtm_msglen = sizeof(rtmsg.hdr) + sizeof(rtmsg.dst), - .rtm_pid = pid, - .rtm_seq = 1, - }, - .dst = { - .sin_family = AF_INET, - #ifndef __sun - .sin_len = sizeof(rtmsg.dst), - #endif - }, - }; - - if (write(pfRoute, &rtmsg, rtmsg.hdr.rtm_msglen) != rtmsg.hdr.rtm_msglen) + if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) return false; - while (read(pfRoute, &rtmsg, sizeof(rtmsg)) > 0) + char* lim = buf + needed; + struct rt_msghdr* rtm; + for (char* next = buf; next < lim; next += rtm->rtm_msglen) { - if (rtmsg.hdr.rtm_seq == 1 && rtmsg.hdr.rtm_pid == pid) + rtm = (struct rt_msghdr *)next; + struct sockaddr* sa = (struct sockaddr *)(rtm + 1); + + if ((rtm->rtm_flags & RTF_GATEWAY) && !(rtm->rtm_flags & RTF_REJECT) && (sa->sa_family == AF_INET)) { - struct sockaddr_dl* sdl = (struct sockaddr_dl *)get_rt_address(&rtmsg.hdr, RTA_IFP); - if (sdl - #ifndef __sun - && sdl->sdl_len - #endif - ) + struct sockaddr_dl* sdl = (struct sockaddr_dl *)get_rt_address(rtm, RTA_IFP); + if (sdl && sdl->sdl_family == AF_LINK) { assert(sdl->sdl_nlen <= IF_NAMESIZE); memcpy(result->ifName, sdl->sdl_data, sdl->sdl_nlen); @@ -100,70 +76,41 @@ bool ffNetifGetDefaultRouteImplV4(FFNetifDefaultRouteResult* result) result->ifIndex = sdl->sdl_index; // Get the preferred source address - struct sockaddr_in* src = (struct sockaddr_in*)get_rt_address(&rtmsg.hdr, RTA_IFA); + struct sockaddr_in* src = (struct sockaddr_in*)get_rt_address(rtm, RTA_IFA); if (src && src->sin_family == AF_INET) result->preferredSourceAddrV4 = src->sin_addr.s_addr; return true; } - return false; } } - return false; } bool ffNetifGetDefaultRouteImplV6(FFNetifDefaultRouteResult* result) { - //https://github.com/hashPirate/copenheimer-masscan-fork/blob/36f1ed9f7b751a7dccd5ed27874e2e703db7d481/src/rawsock-getif.c#L104 + int mib[6] = {CTL_NET, PF_ROUTE, 0, AF_INET6, NET_RT_FLAGS, RTF_GATEWAY}; + size_t needed; - FF_AUTO_CLOSE_FD int pfRoute = socket(PF_ROUTE, SOCK_RAW, AF_INET6); - if (pfRoute < 0) + if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0 || needed == 0) return false; - { - struct timeval timeout = {1, 0}; - setsockopt(pfRoute, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)); - setsockopt(pfRoute, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)); - } + FF_AUTO_FREE char* buf = malloc(needed); - int pid = getpid(); - - struct { - struct rt_msghdr hdr; - struct sockaddr_in6 dst; - uint8_t data[512]; - } rtmsg = { - .hdr = { - .rtm_type = RTM_GET, - .rtm_flags = RTF_UP | RTF_GATEWAY, - .rtm_version = RTM_VERSION, - .rtm_addrs = RTA_DST | RTA_IFP | RTA_IFA, - .rtm_msglen = sizeof(rtmsg.hdr) + sizeof(rtmsg.dst), - .rtm_pid = pid, - .rtm_seq = 1, - }, - .dst = { - .sin6_family = AF_INET6, - #ifndef __sun - .sin6_len = sizeof(rtmsg.dst), - #endif - }, - }; - - if (write(pfRoute, &rtmsg, rtmsg.hdr.rtm_msglen) != rtmsg.hdr.rtm_msglen) + if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) return false; - while (read(pfRoute, &rtmsg, sizeof(rtmsg)) > 0) + char* lim = buf + needed; + struct rt_msghdr* rtm; + for (char* next = buf; next < lim; next += rtm->rtm_msglen) { - if (rtmsg.hdr.rtm_seq == 1 && rtmsg.hdr.rtm_pid == pid) + rtm = (struct rt_msghdr *)next; + struct sockaddr* sa = (struct sockaddr *)(rtm + 1); + + if ((rtm->rtm_flags & RTF_GATEWAY) && !(rtm->rtm_flags & RTF_REJECT) && (sa->sa_family == AF_INET6)) { - struct sockaddr_dl* sdl = (struct sockaddr_dl *)get_rt_address(&rtmsg.hdr, RTA_IFP); - if (sdl - #ifndef __sun - && sdl->sdl_len - #endif - ) + struct sockaddr_dl* sdl = (struct sockaddr_dl *)get_rt_address(rtm, RTA_IFP); + if (sdl && sdl->sdl_family == AF_LINK) { assert(sdl->sdl_nlen <= IF_NAMESIZE); memcpy(result->ifName, sdl->sdl_data, sdl->sdl_nlen); @@ -172,7 +119,6 @@ bool ffNetifGetDefaultRouteImplV6(FFNetifDefaultRouteResult* result) return true; } - return false; } } diff --git a/src/common/netif/netif_obsd.c b/src/common/netif/netif_obsd.c deleted file mode 100644 index 33bd0032b..000000000 --- a/src/common/netif/netif_obsd.c +++ /dev/null @@ -1,117 +0,0 @@ -#include "netif.h" - -#include "common/io/io.h" -#include "util/mallocHelper.h" - -#include -#include -#include -#include -#include -#include - -#define ROUNDUP2(a, n) ((a) > 0 ? (1 + (((a) - 1U) | ((n) - 1))) : (n)) - -#if defined(__OpenBSD__) || defined(__DragonFly__) -# define ROUNDUP(a) ROUNDUP2((a), sizeof(int)) -#else -# error unknown platform -#endif - -static struct sockaddr * -get_rt_address(struct rt_msghdr *rtm, int desired) -{ - struct sockaddr *sa = (struct sockaddr *)(rtm + 1); - - for (int i = 0; i < RTAX_MAX; i++) - { - if (rtm->rtm_addrs & (1 << i)) - { - if ((1 << i) == desired) - return sa; - sa = (struct sockaddr *)(ROUNDUP(sa->sa_len) + (char *)sa); - } - } - return NULL; -} - -bool ffNetifGetDefaultRouteImplV4(FFNetifDefaultRouteResult* result) -{ - int mib[6] = {CTL_NET, PF_ROUTE, 0, AF_INET, NET_RT_FLAGS, RTF_GATEWAY}; - size_t needed; - - if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) - return false; - - FF_AUTO_FREE char* buf = malloc(needed); - - if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) - return false; - - char* lim = buf + needed; - struct rt_msghdr* rtm; - for (char* next = buf; next < lim; next += rtm->rtm_msglen) - { - rtm = (struct rt_msghdr *)next; - struct sockaddr* sa = (struct sockaddr *)(rtm + 1); - - if ((rtm->rtm_flags & RTF_GATEWAY) && (sa->sa_family == AF_INET)) - { - struct sockaddr_dl* sdl = (struct sockaddr_dl *)get_rt_address(rtm, RTA_IFP); - if (sdl->sdl_family == AF_LINK) - { - assert(sdl->sdl_nlen <= IF_NAMESIZE); - memcpy(result->ifName, sdl->sdl_data, sdl->sdl_nlen); - result->ifName[sdl->sdl_nlen] = '\0'; - result->ifIndex = sdl->sdl_index; - - // Get the preferred source address - struct sockaddr_in* src = (struct sockaddr_in*)get_rt_address(rtm, RTA_IFA); - if (src && src->sin_family == AF_INET) - result->preferredSourceAddrV4 = src->sin_addr.s_addr; - - return true; - } - } - } - - return false; -} - -bool ffNetifGetDefaultRouteImplV6(FFNetifDefaultRouteResult* result) -{ - int mib[6] = {CTL_NET, PF_ROUTE, 0, AF_INET6, NET_RT_FLAGS, RTF_GATEWAY}; - size_t needed; - - if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) - return false; - - FF_AUTO_FREE char* buf = malloc(needed); - - if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) - return false; - - char* lim = buf + needed; - struct rt_msghdr* rtm; - for (char* next = buf; next < lim; next += rtm->rtm_msglen) - { - rtm = (struct rt_msghdr *)next; - struct sockaddr* sa = (struct sockaddr *)(rtm + 1); - - if ((rtm->rtm_flags & RTF_GATEWAY) && (sa->sa_family == AF_INET6)) - { - struct sockaddr_dl* sdl = (struct sockaddr_dl *)get_rt_address(rtm, RTA_IFP); - if (sdl && sdl->sdl_family == AF_LINK) - { - assert(sdl->sdl_nlen <= IF_NAMESIZE); - memcpy(result->ifName, sdl->sdl_data, sdl->sdl_nlen); - result->ifName[sdl->sdl_nlen] = '\0'; - result->ifIndex = sdl->sdl_index; - - return true; - } - } - } - - return false; -} From 33983c5402f07a4e0a42ddac22d35ef1b1f7dc1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 8 Aug 2025 14:16:46 +0800 Subject: [PATCH 40/83] LocalIP: improve preferred IPv6 address detection --- src/detection/localip/localip_linux.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index 5f9869083..ed2bf866c 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -12,6 +12,7 @@ #include #include #include +#include #ifdef __linux__ #include @@ -142,12 +143,26 @@ static bool isIPv6AddressPreferred(const char* ifname, struct sockaddr_in6* addr #define IN6_IS_ADDR_GLOBAL(a) \ ((((const uint32_t *) (a))[0] & htonl(0x70000000)) == htonl(0x20000000)) #endif - if (!IN6_IS_ADDR_GLOBAL(&addr->sin6_addr)) +#ifndef IN6_IS_ADDR_UNIQUE_LOCAL +#define IN6_IS_ADDR_UNIQUE_LOCAL(a) \ + ((((const uint32_t *) (a))[0] & htonl(0xfe000000)) == htonl(0xfc000000)) +#endif + if (!IN6_IS_ADDR_GLOBAL(&addr->sin6_addr) && !IN6_IS_ADDR_UNIQUE_LOCAL(&addr->sin6_addr)) return false; #ifdef SIOCGIFAFLAG_IN6 static int sockfd = 0; - if (sockfd == 0) sockfd = socket(AF_INET6, SOCK_DGRAM, 0); + if (sockfd == 0) + { + sockfd = socket(AF_INET6, SOCK_DGRAM + #ifdef SOCK_CLOEXEC + | SOCK_CLOEXEC + #endif + , 0); + #ifndef SOCK_CLOEXEC + if (sockfd > 0) fcntl(sockfd, F_SETFD, FD_CLOEXEC); + #endif + } if (sockfd < 0) return true; // Give up struct in6_ifreq ifr6 = {}; @@ -157,7 +172,7 @@ static bool isIPv6AddressPreferred(const char* ifname, struct sockaddr_in6* addr if (ioctl(sockfd, SIOCGIFAFLAG_IN6, &ifr6) != 0) return true; - return !(ifr6.ifr_ifru.ifru_flags6 & IN6_IFF_DEPRECATED) && !(ifr6.ifr_ifru.ifru_flags6 & IN6_IFF_TEMPORARY); + return !(ifr6.ifr_ifru.ifru_flags6 & (IN6_IFF_DEPRECATED | IN6_IFF_TEMPORARY | IN6_IFF_TENTATIVE | IN6_IFF_DUPLICATED | IN6_IFF_OPTIMISTIC)); #elif __linux__ FF_UNUSED(ifname); @@ -181,9 +196,8 @@ static bool isIPv6AddressPreferred(const char* ifname, struct sockaddr_in6* addr &entry->s6_addr[8], &entry->s6_addr[9], &entry->s6_addr[10], &entry->s6_addr[11], &entry->s6_addr[12], &entry->s6_addr[13], &entry->s6_addr[14], &entry->s6_addr[15], &flags) != 17 || - !IN6_IS_ADDR_GLOBAL(entry) || - (flags & IFA_F_DEPRECATED) || - (flags & IFA_F_TEMPORARY) + (!IN6_IS_ADDR_GLOBAL(entry) && !IN6_IS_ADDR_UNIQUE_LOCAL(entry)) || + (flags & (IFA_F_DEPRECATED | IFA_F_TEMPORARY | IFA_F_TENTATIVE | IFA_F_DADFAILED | IFA_F_OPTIMISTIC)) ) --addresses.length; } From 1b0a65ecf2d76157f9ce21d53ab23f08a334b2ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 8 Aug 2025 14:59:39 +0800 Subject: [PATCH 41/83] Wifi: updates default WiFi percentage thresholds --- src/modules/wifi/wifi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/wifi/wifi.c b/src/modules/wifi/wifi.c index 47bb21985..a06cd1eda 100644 --- a/src/modules/wifi/wifi.c +++ b/src/modules/wifi/wifi.c @@ -207,7 +207,7 @@ void ffInitWifiOptions(FFWifiOptions* options) { ffOptionInitModuleArg(&options->moduleArgs, ""); - options->percent = (FFPercentageModuleConfig) { 50, 20, 0 }; + options->percent = (FFPercentageModuleConfig) { 75, 50, 0 }; } void ffDestroyWifiOptions(FFWifiOptions* options) From f96ddb4c102911dbf744db58e7e3a0b3933b7193 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Fri, 8 Aug 2025 15:32:12 +0800 Subject: [PATCH 42/83] LocalIP (BSD): fix compiling --- src/detection/localip/localip_linux.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index ed2bf866c..2626afaaa 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -171,8 +171,15 @@ static bool isIPv6AddressPreferred(const char* ifname, struct sockaddr_in6* addr if (ioctl(sockfd, SIOCGIFAFLAG_IN6, &ifr6) != 0) return true; - - return !(ifr6.ifr_ifru.ifru_flags6 & (IN6_IFF_DEPRECATED | IN6_IFF_TEMPORARY | IN6_IFF_TENTATIVE | IN6_IFF_DUPLICATED | IN6_IFF_OPTIMISTIC)); + #ifdef IN6_IFF_PREFER_SOURCE + if (ifr6.ifr_ifru.ifru_flags6 & IN6_IFF_PREFER_SOURCE) + return true; + #endif + return !(ifr6.ifr_ifru.ifru_flags6 & (IN6_IFF_DEPRECATED | IN6_IFF_TEMPORARY | IN6_IFF_TENTATIVE | IN6_IFF_DUPLICATED + #ifdef IN6_IFF_OPTIMISTIC + | IN6_IFF_OPTIMISTIC + #endif + )); #elif __linux__ FF_UNUSED(ifname); From ed94b4c46c48f2631a098d57af4ed294c030e139 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sat, 9 Aug 2025 18:34:25 +0800 Subject: [PATCH 43/83] Netif (SunOS): fix compiler warnings --- src/common/netif/netif_apple.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/common/netif/netif_apple.c b/src/common/netif/netif_apple.c index d62cb653c..18100f4e8 100644 --- a/src/common/netif/netif_apple.c +++ b/src/common/netif/netif_apple.c @@ -41,12 +41,16 @@ get_rt_address(struct rt_msghdr *rtm, int desired) switch (sa->sa_family) { case AF_INET: salen = sizeof (struct sockaddr_in); + break; case AF_LINK: salen = sizeof (struct sockaddr_dl); + break; case AF_INET6: salen = sizeof (struct sockaddr_in6); + break; default: salen = sizeof (struct sockaddr); + break; } #endif sa = (struct sockaddr *)(ROUNDUP(salen) + (char *)sa); From 4588644d398423c4e0d86700e0c15ab4f1517397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sat, 9 Aug 2025 18:35:53 +0800 Subject: [PATCH 44/83] Networking (SunOS): fix compiler warnings --- src/common/networking/networking_linux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/networking/networking_linux.c b/src/common/networking/networking_linux.c index 80576d587..074d4f528 100644 --- a/src/common/networking/networking_linux.c +++ b/src/common/networking/networking_linux.c @@ -346,7 +346,7 @@ const char* ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* ho FF_DEBUG("Multithreading mode enabled, creating connection thread"); state->thread = ffThreadCreate(connectAndSendThreadMain, state); if (state->thread) { - FF_DEBUG("Thread creation successful: thread=%p", (void*)state->thread); + FF_DEBUG("Thread creation successful: thread=%p", (void*)(uintptr_t)state->thread); return NULL; } FF_DEBUG("Thread creation failed"); From 2bb451d9e498ed6921837fa1953bf7491cf826fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sat, 9 Aug 2025 18:44:37 +0800 Subject: [PATCH 45/83] LocalIP (Linux): fix compiler warnings --- src/detection/localip/localip.h | 2 +- src/detection/localip/localip_linux.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/detection/localip/localip.h b/src/detection/localip/localip.h index ddcb5e503..78609f690 100644 --- a/src/detection/localip/localip.h +++ b/src/detection/localip/localip.h @@ -21,7 +21,7 @@ typedef struct FFLocalIpNIFlag const char *name; } FFLocalIpNIFlag; -static inline void ffLocalIpFillNIFlags(FFstrbuf *buf, uint32_t flag, const FFLocalIpNIFlag names[]) +static inline void ffLocalIpFillNIFlags(FFstrbuf *buf, uint64_t flag, const FFLocalIpNIFlag names[]) { for (const FFLocalIpNIFlag *nf = names; flag && nf->name; ++nf) { diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index 2626afaaa..59a4227d9 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -87,7 +87,7 @@ static const FFLocalIpNIFlag niFlagOptions[] = { {}, }; -static void addNewIp(FFlist* list, const char* name, const char* addr, int type, bool defaultRoute, uint32_t flags, bool firstOnly) +static void addNewIp(FFlist* list, const char* name, const char* addr, int type, bool defaultRoute, uint64_t flags, bool firstOnly) { FFLocalIpResult* ip = NULL; @@ -244,7 +244,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) if (options->namePrefix.length && strncmp(ifa->ifa_name, options->namePrefix.chars, options->namePrefix.length) != 0) continue; - uint32_t flags = options->showType & FF_LOCALIP_TYPE_FLAGS_BIT ? ifa->ifa_flags : 0; + uint64_t flags = options->showType & FF_LOCALIP_TYPE_FLAGS_BIT ? ifa->ifa_flags : 0; if (ifa->ifa_addr->sa_family == AF_INET) { From 1edc617b55517ffa19940cf3d1cc5fb3cb24ecad Mon Sep 17 00:00:00 2001 From: Carter Li Date: Sat, 9 Aug 2025 18:51:09 +0800 Subject: [PATCH 46/83] LocalIP (SunOS): add more if flags --- src/detection/localip/localip_linux.c | 73 ++++++++++++++----------- src/detection/localip/localip_windows.c | 22 ++++---- 2 files changed, 54 insertions(+), 41 deletions(-) diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index 59a4227d9..5f549e190 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -35,53 +35,64 @@ #include #endif +#define FF_LOCALIP_NIFLAG(name) { IFF_##name, #name } + static const FFLocalIpNIFlag niFlagOptions[] = { - { IFF_UP, "UP" }, - { IFF_BROADCAST, "BROADCAST" }, + FF_LOCALIP_NIFLAG(UP), + FF_LOCALIP_NIFLAG(BROADCAST), #ifdef IFF_DEBUG - { IFF_DEBUG, "DEBUG" }, + FF_LOCALIP_NIFLAG(DEBUG), #endif - { IFF_LOOPBACK, "LOOPBACK" }, - { IFF_POINTOPOINT, "POINTOPOINT" }, + FF_LOCALIP_NIFLAG(LOOPBACK), + FF_LOCALIP_NIFLAG(POINTOPOINT), #ifdef IFF_RUNNING - { IFF_RUNNING, "RUNNING" }, + FF_LOCALIP_NIFLAG(RUNNING), #endif - { IFF_NOARP, "NOARP" }, - { IFF_PROMISC, "PROMISC" }, - { IFF_ALLMULTI, "ALLMULTI" }, - { IFF_MULTICAST, "MULTICAST" }, + FF_LOCALIP_NIFLAG(NOARP), + FF_LOCALIP_NIFLAG(PROMISC), + FF_LOCALIP_NIFLAG(ALLMULTI), +#ifdef IFF_INTELLIGENT + FF_LOCALIP_NIFLAG(INTELLIGENT), +#endif + FF_LOCALIP_NIFLAG(MULTICAST), #ifdef IFF_NOTRAILERS - { IFF_NOTRAILERS, "NOTRAILERS" }, + FF_LOCALIP_NIFLAG(NOTRAILERS), #endif #ifdef __linux__ - { IFF_MASTER, "MASTER" }, - { IFF_SLAVE, "SLAVE" }, - { IFF_PORTSEL, "PORTSEL" }, - { IFF_AUTOMEDIA, "AUTOMEDIA" }, - { IFF_DYNAMIC, "DYNAMIC" }, - { IFF_LOWER_UP, "LOWER_UP" }, - { IFF_DORMANT, "DORMANT" }, - { IFF_ECHO, "ECHO" }, + FF_LOCALIP_NIFLAG(MASTER), + FF_LOCALIP_NIFLAG(SLAVE), + FF_LOCALIP_NIFLAG(PORTSEL), + FF_LOCALIP_NIFLAG(AUTOMEDIA), + FF_LOCALIP_NIFLAG(DYNAMIC), + FF_LOCALIP_NIFLAG(LOWER_UP), + FF_LOCALIP_NIFLAG(DORMANT), + FF_LOCALIP_NIFLAG(ECHO), #endif #if defined(__FreeBSD__) || defined(__APPLE__) || defined(__OpenBSD__) || defined(__NetBSD__) - { IFF_OACTIVE, "OACTIVE" }, - { IFF_SIMPLEX, "SIMPLEX" }, - { IFF_LINK0, "LINK0" }, - { IFF_LINK1, "LINK1" }, - { IFF_LINK2, "LINK2" }, + FF_LOCALIP_NIFLAG(OACTIVE), + FF_LOCALIP_NIFLAG(SIMPLEX), + FF_LOCALIP_NIFLAG(LINK0), + FF_LOCALIP_NIFLAG(LINK1), + FF_LOCALIP_NIFLAG(LINK2), #endif #ifdef IFF_ALTPHYS - { IFF_ALTPHYS, "ALTPHYS" }, + FF_LOCALIP_NIFLAG(ALTPHYS), #endif #ifdef IFF_CANTCONFIG - { IFF_CANTCONFIG, "CANTCONFIG" }, + FF_LOCALIP_NIFLAG(CANTCONFIG), #endif #ifdef __HAIKU__ - { IFF_AUTOUP, "IAUTOUP" }, - { IFF_SIMPLEX, "SIMPLEX" }, - { IFF_LINK, "LINK" }, - { IFF_AUTO_CONFIGURED, "AUTO_CONFIGURED" }, - { IFF_CONFIGURING, "CONFIGURING" }, + FF_LOCALIP_NIFLAG(AUTOUP), + FF_LOCALIP_NIFLAG(SIMPLEX), + FF_LOCALIP_NIFLAG(LINK), + FF_LOCALIP_NIFLAG(AUTO_CONFIGURED), + FF_LOCALIP_NIFLAG(CONFIGURING), +#endif +#ifdef __sun + FF_LOCALIP_NIFLAG(MULTI_BCAST), + FF_LOCALIP_NIFLAG(UNNUMBERED), + FF_LOCALIP_NIFLAG(DHCPRUNNING), + FF_LOCALIP_NIFLAG(PRIVATE), #endif // sentinel {}, diff --git a/src/detection/localip/localip_windows.c b/src/detection/localip/localip_windows.c index 143326f83..e98333079 100644 --- a/src/detection/localip/localip_windows.c +++ b/src/detection/localip/localip_windows.c @@ -6,17 +6,19 @@ #include "util/windows/unicode.h" #include "localip.h" +#define FF_LOCALIP_NIFLAG(name) { IP_ADAPTER_##name, #name } + static const FFLocalIpNIFlag niFlagOptions[] = { - { IP_ADAPTER_DDNS_ENABLED, "DDNS_ENABLED" }, - { IP_ADAPTER_REGISTER_ADAPTER_SUFFIX, "REGISTER_ADAPTER_SUFFIX" }, - { IP_ADAPTER_DHCP_ENABLED, "DHCP_ENABLED" }, - { IP_ADAPTER_RECEIVE_ONLY, "RECEIVE_ONLY" }, - { IP_ADAPTER_NO_MULTICAST, "NO_MULTICAST" }, - { IP_ADAPTER_IPV6_OTHER_STATEFUL_CONFIG, "IPV6_OTHER_STATEFUL_CONFIG" }, - { IP_ADAPTER_NETBIOS_OVER_TCPIP_ENABLED, "NETBIOS_OVER_TCPIP_ENABLED" }, - { IP_ADAPTER_IPV4_ENABLED, "IPV4_ENABLED" }, - { IP_ADAPTER_IPV6_ENABLED, "IPV6_ENABLED" }, - { IP_ADAPTER_IPV6_MANAGE_ADDRESS_CONFIG, "IPV6_MANAGE_ADDRESS_CONFIG" }, + FF_LOCALIP_NIFLAG(DDNS_ENABLED), + FF_LOCALIP_NIFLAG(REGISTER_ADAPTER_SUFFIX), + FF_LOCALIP_NIFLAG(DHCP_ENABLED), + FF_LOCALIP_NIFLAG(RECEIVE_ONLY), + FF_LOCALIP_NIFLAG(NO_MULTICAST), + FF_LOCALIP_NIFLAG(IPV6_OTHER_STATEFUL_CONFIG), + FF_LOCALIP_NIFLAG(NETBIOS_OVER_TCPIP_ENABLED), + FF_LOCALIP_NIFLAG(IPV4_ENABLED), + FF_LOCALIP_NIFLAG(IPV6_ENABLED), + FF_LOCALIP_NIFLAG(IPV6_MANAGE_ADDRESS_CONFIG), // sentinel {}, }; From 1bde2b31f9a631acc65a324598efc238d2d58f05 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Sat, 9 Aug 2025 19:27:07 +0800 Subject: [PATCH 47/83] LocalIP (SunOS): support `isIPv6AddressPreferred` --- src/detection/localip/localip_linux.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index 5f549e190..ebaa10b97 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -148,7 +148,7 @@ static void addNewIp(FFlist* list, const char* name, const char* addr, int type, } } -static bool isIPv6AddressPreferred(const char* ifname, struct sockaddr_in6* addr) +static bool isIPv6AddressPreferred(struct ifaddrs* ifa, struct sockaddr_in6* addr) { #ifndef IN6_IS_ADDR_GLOBAL #define IN6_IS_ADDR_GLOBAL(a) \ @@ -177,7 +177,7 @@ static bool isIPv6AddressPreferred(const char* ifname, struct sockaddr_in6* addr if (sockfd < 0) return true; // Give up struct in6_ifreq ifr6 = {}; - ffStrCopy(ifr6.ifr_name, ifname, IFNAMSIZ); + ffStrCopy(ifr6.ifr_name, ifa->ifa_name, IFNAMSIZ); ifr6.ifr_addr = *addr; if (ioctl(sockfd, SIOCGIFAFLAG_IN6, &ifr6) != 0) @@ -228,6 +228,10 @@ static bool isIPv6AddressPreferred(const char* ifname, struct sockaddr_in6* addr return true; } return false; +#elif __sun + if (ifa->ifa_flags & IFF_PREFERRED) + return true; + return !(ifa->ifa_flags & (IFF_DEPRECATED | IFF_TEMPORARY | IFF_DUPLICATE)); #else return true; #endif @@ -306,7 +310,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) continue; struct sockaddr_in6* ipv6 = (struct sockaddr_in6 *)ifa->ifa_addr; - if (!(options->showType & FF_LOCALIP_TYPE_ALL_IPS_BIT) && !isIPv6AddressPreferred(ifa->ifa_name, ipv6)) + if (!(options->showType & FF_LOCALIP_TYPE_ALL_IPS_BIT) && !isIPv6AddressPreferred(ifa, ipv6)) continue; char addressBuffer[INET6_ADDRSTRLEN + 16]; From f3c82ad837a576c5a05ede407ff6b366937b7281 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Sat, 9 Aug 2025 19:53:31 +0800 Subject: [PATCH 48/83] LocalIP (SunOS): add speed detection support --- src/detection/localip/localip_linux.c | 28 +++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index ebaa10b97..a36e27c42 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -34,6 +34,16 @@ #if defined(__sun) || defined(__HAIKU__) #include #endif +#if defined(__sun) +#include + +static inline void kstatFreeWrap(kstat_ctl_t** pkc) +{ + assert(pkc); + if (*pkc) + kstat_close(*pkc); +} +#endif #define FF_LOCALIP_NIFLAG(name) { IFF_##name, #name } @@ -769,6 +779,24 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) ffStrbufSetF(&iface->mac, "%02x:%02x:%02x:%02x:%02x:%02x", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]); } + if (options->showType & FF_LOCALIP_TYPE_SPEED_BIT) + { + __attribute__((__cleanup__(kstatFreeWrap))) kstat_ctl_t* kc = kstat_open(); + for (kstat_t* ks = kc->kc_chain; ks; ks = ks->ks_next) + { + if (!ffStrEquals(ks->ks_class, "net") || !ffStrEquals(ks->ks_module, "link")) continue; + if (ffStrbufEqualS(&iface->name, ks->ks_name)) + { + if (kstat_read(kc, ks, NULL) >= 0) + { + kstat_named_t* ifspeed = (kstat_named_t*) kstat_data_lookup(ks, "ifspeed"); + if (ifspeed) + iface->speed = (int32_t) (ifspeed->value.ui64 / 1000 / 1000); + } + break; + } + } + } #endif } } From a7347130ded8fff4a6763d14db851b7a960db50d Mon Sep 17 00:00:00 2001 From: Carter Li Date: Sat, 9 Aug 2025 22:20:04 +0800 Subject: [PATCH 49/83] LocalIP (Linux): fix building --- src/detection/localip/localip_linux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index a36e27c42..298631927 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -202,7 +202,7 @@ static bool isIPv6AddressPreferred(struct ifaddrs* ifa, struct sockaddr_in6* add #endif )); #elif __linux__ - FF_UNUSED(ifname); + FF_UNUSED(ifa); static FFlist addresses = {}; if (addresses.elementSize == 0) From 7ee0e8726ed020738335aabe6df30dd9c3556ea9 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Sun, 10 Aug 2025 00:14:16 +0800 Subject: [PATCH 50/83] CPU (macOS): use CPUID for freq detection on Intel --- src/detection/cpu/cpu_apple.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/detection/cpu/cpu_apple.c b/src/detection/cpu/cpu_apple.c index 1226131e5..a3607c683 100644 --- a/src/detection/cpu/cpu_apple.c +++ b/src/detection/cpu/cpu_apple.c @@ -72,14 +72,17 @@ static const char* detectFrequency(FFCPUResult* cpu) #else static const char* detectFrequency(FFCPUResult* cpu) { - cpu->frequencyBase = (uint32_t) (ffSysctlGetInt64("hw.cpufrequency", 0) / 1000 / 1000); - cpu->frequencyMax = (uint32_t) (ffSysctlGetInt64("hw.cpufrequency_max", 0) / 1000 / 1000); - if(cpu->frequencyBase == 0) + if (ffCPUDetectSpeedByCpuid(cpu) != NULL) { - unsigned current = 0; - size_t size = sizeof(current); - if (sysctl((int[]){ CTL_HW, HW_CPU_FREQ }, 2, ¤t, &size, NULL, 0) == 0) - cpu->frequencyBase = (uint32_t) (current / 1000 / 1000); + cpu->frequencyBase = (uint32_t) (ffSysctlGetInt64("hw.cpufrequency", 0) / 1000 / 1000); + cpu->frequencyMax = (uint32_t) (ffSysctlGetInt64("hw.cpufrequency_max", 0) / 1000 / 1000); + if(cpu->frequencyBase == 0) + { + unsigned current = 0; + size_t size = sizeof(current); + if (sysctl((int[]){ CTL_HW, HW_CPU_FREQ }, 2, ¤t, &size, NULL, 0) == 0) + cpu->frequencyBase = (uint32_t) (current / 1000 / 1000); + } } return NULL; } From f184f8dab5064795c261987ecf26134b2509b4e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sat, 9 Aug 2025 21:52:23 +0800 Subject: [PATCH 51/83] GPU (FreeBSD): fix gpu driver detection when DRM is used --- src/detection/gpu/gpu_bsd.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/detection/gpu/gpu_bsd.c b/src/detection/gpu/gpu_bsd.c index b4c263699..d7d9606be 100644 --- a/src/detection/gpu/gpu_bsd.c +++ b/src/detection/gpu/gpu_bsd.c @@ -106,7 +106,10 @@ static const char* detectByDrm(const FFGPUOptions* options, FFlist* gpus) .name_len = ARRAY_SIZE(driverName), }; if (ioctl(fd, DRM_IOCTL_VERSION, &ver) == 0) - ffStrbufSetF(&gpu->driver, "%*s %d.%d.%d", (int) ver.name_len, ver.name, ver.version_major, ver.version_minor, ver.version_patchlevel); + { + driverName[ver.name_len] = '\0'; + ffStrbufSetF(&gpu->driver, "%s %d.%d.%d", ver.name, ver.version_major, ver.version_minor, ver.version_patchlevel); + } if (ffStrStartsWith(driverName, "i915")) ffDrmDetectI915(gpu, fd); From bedb5eb6c5bbb76873f7080ebb6c7aae32643334 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 10 Aug 2025 21:41:47 +0800 Subject: [PATCH 52/83] Netif (SunOS): work around a bug that fails to detect default route for IPv4 --- src/common/netif/netif_apple.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/common/netif/netif_apple.c b/src/common/netif/netif_apple.c index 18100f4e8..c56533062 100644 --- a/src/common/netif/netif_apple.c +++ b/src/common/netif/netif_apple.c @@ -103,7 +103,9 @@ bool ffNetifGetDefaultRouteImplV4(FFNetifDefaultRouteResult* result) while (recv(pfRoute, &rtmsg, sizeof(rtmsg), 0) > 0 && !(rtmsg.hdr.rtm_seq == 1 && rtmsg.hdr.rtm_pid == pid)) ; + #ifndef __sun // On Solaris, the RTF_GATEWAY flag is not set for default routes for some reason if ((rtmsg.hdr.rtm_flags & (RTF_UP | RTF_GATEWAY)) == (RTF_UP | RTF_GATEWAY)) + #endif { struct sockaddr_dl* sdl = (struct sockaddr_dl *)get_rt_address(&rtmsg.hdr, RTA_IFP); if (sdl @@ -174,7 +176,9 @@ bool ffNetifGetDefaultRouteImplV6(FFNetifDefaultRouteResult* result) while (recv(pfRoute, &rtmsg, sizeof(rtmsg), 0) > 0 && !(rtmsg.hdr.rtm_seq == 2 && rtmsg.hdr.rtm_pid == pid)) ; + #ifndef __sun // On Solaris, the RTF_GATEWAY flag is not set for default routes for some reason if ((rtmsg.hdr.rtm_flags & (RTF_UP | RTF_GATEWAY)) == (RTF_UP | RTF_GATEWAY)) + #endif { struct sockaddr_dl* sdl = (struct sockaddr_dl *)get_rt_address(&rtmsg.hdr, RTA_IFP); if (sdl From 329cb229f8c6186084b33a36d77c3d97ca94d2a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 10 Aug 2025 23:15:04 +0800 Subject: [PATCH 53/83] Chore: remove unused functions --- src/common/option.c | 49 --------------------------------------------- src/common/option.h | 1 - 2 files changed, 50 deletions(-) diff --git a/src/common/option.c b/src/common/option.c index 76775980a..71a9a1d19 100644 --- a/src/common/option.c +++ b/src/common/option.c @@ -28,55 +28,6 @@ const char* ffOptionTestPrefix(const char* argumentKey, const char* moduleName) return subKey; } -bool ffOptionParseModuleArgs(const char* argumentKey, const char* subKey, const char* value, FFModuleArgs* result) -{ - if(ffStrEqualsIgnCase(subKey, "key")) - { - ffOptionParseString(argumentKey, value, &result->key); - return true; - } - else if(ffStrEqualsIgnCase(subKey, "format")) - { - ffOptionParseString(argumentKey, value, &result->outputFormat); - return true; - } - else if(ffStrEqualsIgnCase(subKey, "output-color")) - { - if(value == NULL) - { - fprintf(stderr, "Error: usage: %s \n", argumentKey); - exit(477); - } - ffOptionParseColor(value, &result->outputColor); - return true; - } - else if(ffStrStartsWithIgnCase(subKey, "key-")) - { - const char* subKey2 = subKey + strlen("key-"); - if(ffStrEqualsIgnCase(subKey2, "color")) - { - if(value == NULL) - { - fprintf(stderr, "Error: usage: %s \n", argumentKey); - exit(477); - } - ffOptionParseColor(value, &result->keyColor); - return true; - } - else if(ffStrEqualsIgnCase(subKey2, "width")) - { - result->keyWidth = ffOptionParseUInt32(argumentKey, value); - return true; - } - else if(ffStrEqualsIgnCase(subKey2, "icon")) - { - ffOptionParseString(argumentKey, value, &result->keyIcon); - return true; - } - } - return false; -} - void ffOptionParseString(const char* argumentKey, const char* value, FFstrbuf* buffer) { if(value == NULL) diff --git a/src/common/option.h b/src/common/option.h index e9c8cd81b..a47b9b504 100644 --- a/src/common/option.h +++ b/src/common/option.h @@ -64,7 +64,6 @@ typedef struct FFKeyValuePair } FFKeyValuePair; const char* ffOptionTestPrefix(const char* argumentKey, const char* moduleName); -bool ffOptionParseModuleArgs(const char* argumentKey, const char* pkey, const char* value, FFModuleArgs* result); void ffOptionParseString(const char* argumentKey, const char* value, FFstrbuf* buffer); FF_C_NODISCARD uint32_t ffOptionParseUInt32(const char* argumentKey, const char* value); FF_C_NODISCARD int32_t ffOptionParseInt32(const char* argumentKey, const char* value); From 1124342eda30bfc6fa8447da286488a0e6a74e04 Mon Sep 17 00:00:00 2001 From: aequabit Date: Mon, 11 Aug 2025 03:03:23 +0200 Subject: [PATCH 54/83] Display (Linux): show brand of Xserver in WM section (#1888) * Display: add server vendor string * Display (X11): fetch server vendor string using XCB/Xlib * WM: show server vendor string when not empty * Display (XCB): use proper string helper function * Display (X11): shorten "The X.Org Foundation" to "Xorg" --- src/detection/displayserver/displayserver.c | 1 + src/detection/displayserver/displayserver.h | 1 + src/detection/displayserver/linux/xcb.c | 26 ++++++++++++++++++++- src/detection/displayserver/linux/xlib.c | 23 +++++++++++++++++- src/modules/wm/wm.c | 7 ++++++ 5 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/detection/displayserver/displayserver.c b/src/detection/displayserver/displayserver.c index 6ae9efbc4..861cb3555 100644 --- a/src/detection/displayserver/displayserver.c +++ b/src/detection/displayserver/displayserver.c @@ -61,6 +61,7 @@ const FFDisplayServerResult* ffConnectDisplayServer() ffStrbufInit(&result.wmProtocolName); ffStrbufInit(&result.deProcessName); ffStrbufInit(&result.dePrettyName); + ffStrbufInit(&result.serverVendor); ffListInit(&result.displays, sizeof(FFDisplayResult)); ffConnectDisplayServerImpl(&result); } diff --git a/src/detection/displayserver/displayserver.h b/src/detection/displayserver/displayserver.h index f502f175a..a50cbc623 100644 --- a/src/detection/displayserver/displayserver.h +++ b/src/detection/displayserver/displayserver.h @@ -91,6 +91,7 @@ typedef struct FFDisplayServerResult FFstrbuf wmProtocolName; FFstrbuf deProcessName; FFstrbuf dePrettyName; + FFstrbuf serverVendor; FFlist displays; //List of FFDisplayResult } FFDisplayServerResult; diff --git a/src/detection/displayserver/linux/xcb.c b/src/detection/displayserver/linux/xcb.c index beb6aac0a..fe09031a0 100644 --- a/src/detection/displayserver/linux/xcb.c +++ b/src/detection/displayserver/linux/xcb.c @@ -6,6 +6,7 @@ #include "common/time.h" #include "util/edidHelper.h" #include "util/mallocHelper.h" +#include "util/stringUtils.h" #include #include @@ -24,6 +25,9 @@ typedef struct XcbPropertyData FF_LIBRARY_SYMBOL(xcb_get_atom_name_name) FF_LIBRARY_SYMBOL(xcb_get_atom_name_name_length) FF_LIBRARY_SYMBOL(xcb_get_atom_name_reply) + FF_LIBRARY_SYMBOL(xcb_get_setup) + FF_LIBRARY_SYMBOL(xcb_setup_vendor) + FF_LIBRARY_SYMBOL(xcb_setup_vendor_length) } XcbPropertyData; static bool xcbInitPropertyData(FF_MAYBE_UNUSED void* libraryHandle, XcbPropertyData* propertyData) @@ -38,6 +42,9 @@ static bool xcbInitPropertyData(FF_MAYBE_UNUSED void* libraryHandle, XcbProperty FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, xcb_get_atom_name_name, false) FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, xcb_get_atom_name_name_length, false) FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, xcb_get_atom_name_reply, false) + FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, xcb_get_setup, false) + FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, xcb_setup_vendor, false) + FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, xcb_setup_vendor_length, false) return true; } @@ -86,6 +93,21 @@ static void xcbDetectWMfromEWMH(XcbPropertyData* data, xcb_connection_t* connect ffStrbufSetS(&result->wmProcessName, wmName); } +static void xcbFetchServerVendor(XcbPropertyData* data, xcb_connection_t* connection, FFDisplayServerResult* result) +{ + const xcb_setup_t* setup = data->ffxcb_get_setup(connection); + + int length = data->ffxcb_setup_vendor_length(setup); + if(length <= 0) + return; + + ffStrbufSetNS(&result->serverVendor, (uint32_t) length, data->ffxcb_setup_vendor(setup)); + + //Shorten Xorg vendor string + if (!ffStrbufCompS(&result->serverVendor, "The X.Org Foundation")) + ffStrbufSetS(&result->serverVendor, "Xorg"); +} + typedef struct XcbRandrData { FF_LIBRARY_SYMBOL(xcb_randr_get_screen_resources_current) @@ -381,8 +403,10 @@ const char* ffdsConnectXcbRandr(FFDisplayServerResult* result) xcb_screen_iterator_t iterator = ffxcb_setup_roots_iterator(ffxcb_get_setup(data.connection)); - if(iterator.rem > 0 && propertyDataInitialized) + if(iterator.rem > 0 && propertyDataInitialized) { xcbDetectWMfromEWMH(&data.propData, data.connection, iterator.data->root, result); + xcbFetchServerVendor(&data.propData, data.connection, result); + } while(iterator.rem > 0) diff --git a/src/detection/displayserver/linux/xlib.c b/src/detection/displayserver/linux/xlib.c index ab16102be..af3a5895f 100644 --- a/src/detection/displayserver/linux/xlib.c +++ b/src/detection/displayserver/linux/xlib.c @@ -14,6 +14,7 @@ typedef struct X11PropertyData { FF_LIBRARY_SYMBOL(XInternAtom) FF_LIBRARY_SYMBOL(XGetWindowProperty) + FF_LIBRARY_SYMBOL(XServerVendor) FF_LIBRARY_SYMBOL(XFree) } X11PropertyData; @@ -21,6 +22,7 @@ static bool x11InitPropertyData(FF_MAYBE_UNUSED void* libraryHandle, X11Property { FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, XInternAtom, false) FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, XGetWindowProperty, false) + FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, XServerVendor, false) FF_LIBRARY_LOAD_SYMBOL_PTR(libraryHandle, propertyData, XFree, false) return true; @@ -62,6 +64,23 @@ static void x11DetectWMFromEWMH(X11PropertyData* data, Display* display, FFDispl data->ffXFree(wmWindow); } +static void x11FetchServerVendor(X11PropertyData* data, Display* display, FFDisplayServerResult* result) +{ + if(result->serverVendor.length > 0 || ffStrbufCompS(&result->wmProtocolName, FF_WM_PROTOCOL_WAYLAND) == 0) + return; + + const char* serverVendor = data->ffXServerVendor(display); + if(ffStrSet(serverVendor)) { + ffStrbufSetS(&result->serverVendor, serverVendor); + + //Shorten Xorg vendor string + if (!ffStrbufCompS(&result->serverVendor, "The X.Org Foundation")) + ffStrbufSetS(&result->serverVendor, "Xorg"); + } + + +} + typedef struct XrandrData { FF_LIBRARY_SYMBOL(XInternAtom) @@ -305,8 +324,10 @@ const char* ffdsConnectXrandr(FFDisplayServerResult* result) if(data.display == NULL) return "XOpenDisplay() failed"; - if(propertyDataInitialized && ScreenCount(data.display) > 0) + if(propertyDataInitialized && ScreenCount(data.display) > 0) { x11DetectWMFromEWMH(&propertyData, data.display, result); + x11FetchServerVendor(&propertyData, data.display, result); + } data.result = result; diff --git a/src/modules/wm/wm.c b/src/modules/wm/wm.c index 6753ce2da..b4ece3219 100644 --- a/src/modules/wm/wm.c +++ b/src/modules/wm/wm.c @@ -42,6 +42,13 @@ void ffPrintWM(FFWMOptions* options) putchar(')'); } + if(result->serverVendor.length > 0) + { + fputs(" [", stdout); + ffStrbufWriteTo(&result->serverVendor, stdout); + putchar(']'); + } + if(pluginName.length > 0) { fputs(" (with ", stdout); From b0340d5581c46dfcce854c3048e2b39806fedd17 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Mon, 11 Aug 2025 09:15:39 +0800 Subject: [PATCH 55/83] DisplayServer: merge `serverVender` into `wmProtocolName` Fix #1888 --- src/detection/displayserver/displayserver.c | 1 - src/detection/displayserver/displayserver.h | 1 - src/detection/displayserver/linux/xcb.c | 10 ++++++---- src/detection/displayserver/linux/xlib.c | 11 ++--------- src/modules/wm/wm.c | 7 ------- 5 files changed, 8 insertions(+), 22 deletions(-) diff --git a/src/detection/displayserver/displayserver.c b/src/detection/displayserver/displayserver.c index 861cb3555..6ae9efbc4 100644 --- a/src/detection/displayserver/displayserver.c +++ b/src/detection/displayserver/displayserver.c @@ -61,7 +61,6 @@ const FFDisplayServerResult* ffConnectDisplayServer() ffStrbufInit(&result.wmProtocolName); ffStrbufInit(&result.deProcessName); ffStrbufInit(&result.dePrettyName); - ffStrbufInit(&result.serverVendor); ffListInit(&result.displays, sizeof(FFDisplayResult)); ffConnectDisplayServerImpl(&result); } diff --git a/src/detection/displayserver/displayserver.h b/src/detection/displayserver/displayserver.h index a50cbc623..f502f175a 100644 --- a/src/detection/displayserver/displayserver.h +++ b/src/detection/displayserver/displayserver.h @@ -91,7 +91,6 @@ typedef struct FFDisplayServerResult FFstrbuf wmProtocolName; FFstrbuf deProcessName; FFstrbuf dePrettyName; - FFstrbuf serverVendor; FFlist displays; //List of FFDisplayResult } FFDisplayServerResult; diff --git a/src/detection/displayserver/linux/xcb.c b/src/detection/displayserver/linux/xcb.c index fe09031a0..c27672bec 100644 --- a/src/detection/displayserver/linux/xcb.c +++ b/src/detection/displayserver/linux/xcb.c @@ -101,11 +101,13 @@ static void xcbFetchServerVendor(XcbPropertyData* data, xcb_connection_t* connec if(length <= 0) return; - ffStrbufSetNS(&result->serverVendor, (uint32_t) length, data->ffxcb_setup_vendor(setup)); + FF_STRBUF_AUTO_DESTROY serverVendor = ffStrbufCreateNS((uint32_t) length, data->ffxcb_setup_vendor(setup)); - //Shorten Xorg vendor string - if (!ffStrbufCompS(&result->serverVendor, "The X.Org Foundation")) - ffStrbufSetS(&result->serverVendor, "Xorg"); + if (!ffStrbufEqualS(&serverVendor, "The X.Org Foundation")) // Original + { + ffStrbufDestroy(&result->wmProtocolName); + ffStrbufInitMove(&result->wmProtocolName, &serverVendor); + } } typedef struct XcbRandrData diff --git a/src/detection/displayserver/linux/xlib.c b/src/detection/displayserver/linux/xlib.c index af3a5895f..324290b32 100644 --- a/src/detection/displayserver/linux/xlib.c +++ b/src/detection/displayserver/linux/xlib.c @@ -66,16 +66,9 @@ static void x11DetectWMFromEWMH(X11PropertyData* data, Display* display, FFDispl static void x11FetchServerVendor(X11PropertyData* data, Display* display, FFDisplayServerResult* result) { - if(result->serverVendor.length > 0 || ffStrbufCompS(&result->wmProtocolName, FF_WM_PROTOCOL_WAYLAND) == 0) - return; - const char* serverVendor = data->ffXServerVendor(display); - if(ffStrSet(serverVendor)) { - ffStrbufSetS(&result->serverVendor, serverVendor); - - //Shorten Xorg vendor string - if (!ffStrbufCompS(&result->serverVendor, "The X.Org Foundation")) - ffStrbufSetS(&result->serverVendor, "Xorg"); + if (serverVendor && !ffStrEquals(serverVendor, "The X.Org Foundation")) { + ffStrbufSetS(&result->wmProtocolName, serverVendor); } diff --git a/src/modules/wm/wm.c b/src/modules/wm/wm.c index b4ece3219..6753ce2da 100644 --- a/src/modules/wm/wm.c +++ b/src/modules/wm/wm.c @@ -42,13 +42,6 @@ void ffPrintWM(FFWMOptions* options) putchar(')'); } - if(result->serverVendor.length > 0) - { - fputs(" [", stdout); - ffStrbufWriteTo(&result->serverVendor, stdout); - putchar(']'); - } - if(pluginName.length > 0) { fputs(" (with ", stdout); From eee98e54d07765f699664900e41bb52613054635 Mon Sep 17 00:00:00 2001 From: Juanma Date: Mon, 11 Aug 2025 03:45:53 +0200 Subject: [PATCH 56/83] OS (Linux): fix lliurex detection (#1882) * Proper detection of lliurex distribution * fix newline * Trim version and not versionID as assigned to lliurex-version output * Update os_linux.c --------- Co-authored-by: Carter Li --- src/detection/os/os_linux.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/detection/os/os_linux.c b/src/detection/os/os_linux.c index d845c958b..55f045ff6 100644 --- a/src/detection/os/os_linux.c +++ b/src/detection/os/os_linux.c @@ -89,6 +89,21 @@ FF_MAYBE_UNUSED static void getUbuntuFlavour(FFOSResult* result) ffStrbufSetStatic(&result->idLike, "ubuntu"); } + if (ffPathExists("/usr/bin/lliurex-version", FF_PATHTYPE_FILE)) + { + ffStrbufSetStatic(&result->name, "LliureX"); + ffStrbufSetStatic(&result->id, "lliurex"); + ffStrbufClear(&result->version); + if (ffProcessAppendStdOut(&result->version, (char* const[]) { + "/usr/bin/lliurex-version", + NULL, + }) == NULL) // 8.2.2 + ffStrbufTrimRightSpace(&result->version); + ffStrbufSetF(&result->prettyName, "LliureX %s", result->version.chars); + ffStrbufSetStatic(&result->idLike, "ubuntu"); + return; + } + if(ffStrContains(xdgConfigDirs, "kde") || ffStrContains(xdgConfigDirs, "plasma") || ffStrContains(xdgConfigDirs, "kubuntu")) { ffStrbufSetStatic(&result->name, "Kubuntu"); @@ -169,15 +184,6 @@ FF_MAYBE_UNUSED static void getUbuntuFlavour(FFOSResult* result) ffStrbufSetStatic(&result->idLike, "ubuntu"); return; } - - if(ffStrContains(xdgConfigDirs, "lliurex")) - { - ffStrbufSetStatic(&result->name, "LliureX"); - ffStrbufSetF(&result->prettyName, "LliureX %s", result->version.chars); - ffStrbufSetStatic(&result->id, "lliurex"); - ffStrbufSetStatic(&result->idLike, "ubuntu"); - return; - } } FF_MAYBE_UNUSED static void getDebianVersion(FFOSResult* result) From 5ab51c07d17d80bdc1785634820e92cbb1cbadc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 11 Aug 2025 09:58:44 +0800 Subject: [PATCH 57/83] Doc: don't recommand Ubuntu PPA [ci skip] --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index f31b8b511..58044a62f 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,6 @@ Some distributions package outdated versions of fastfetch. Older versions receiv Packaging status -* Ubuntu: [`ppa:zhangsongcui3371/fastfetch`](https://launchpad.net/~zhangsongcui3371/+archive/ubuntu/fastfetch) (for Ubuntu 22.04 or newer) * Debian: `apt install fastfetch` (for Debian 13 or newer) * Debian / Ubuntu: Download `fastfetch-linux-.deb` from [Github release page](https://github.com/fastfetch-cli/fastfetch/releases/latest) and double-click it (for Ubuntu 20.04 or newer and Debian 11 or newer). * Arch Linux: `pacman -S fastfetch` From 1c8e2e34ba6dd43e9df215c32153d632ad9243cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 11 Aug 2025 14:16:13 +0800 Subject: [PATCH 58/83] JsonSchema: remove unused properties [ci skip] --- doc/json_schema.json | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/doc/json_schema.json b/doc/json_schema.json index ba6940442..a1e66b3f9 100644 --- a/doc/json_schema.json +++ b/doc/json_schema.json @@ -1207,26 +1207,6 @@ } ] }, - "charElapsed": { - "type": "string", - "description": "Set the character to use in elapsed part. Deprecated in v2.50.0", - "default": "■" - }, - "charTotal": { - "type": "string", - "description": "Set the character to use in total part. Deprecated in v2.50.0", - "default": "-" - }, - "borderLeft": { - "type": "string", - "description": "Set the string to use at left border. Deprecated in v2.50.0", - "default": "[ " - }, - "borderRight": { - "type": "string", - "description": "Set the string to use at right border. Deprecated in v2.50.0", - "default": " ]" - }, "width": { "type": "integer", "description": "Set the width of the bar, in number of characters", From 3345c1e9dda1434fe108ca4117a48abd356b5dbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 11 Aug 2025 14:18:41 +0800 Subject: [PATCH 59/83] Percent: fix a copy-paste error --- src/common/percent.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/percent.c b/src/common/percent.c index 12bd86043..f10bea32f 100644 --- a/src/common/percent.c +++ b/src/common/percent.c @@ -146,9 +146,9 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf for (uint8_t i = blocksPercent; i < options->barWidth; ++i) { ffStrbufAppend(buffer, borderAsValue && i == 0 - ? &options->barBorderLeft + ? &options->barBorderLeftElapsed : borderAsValue && i == options->barWidth - 1 - ? &options->barBorderRight + ? &options->barBorderRightElapsed : &options->barCharTotal); } } From 060b69293c166265a7af0d15d06435dbfc946f48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 11 Aug 2025 14:18:52 +0800 Subject: [PATCH 60/83] Presets: add an example Fix #1887 --- presets/examples/29.jsonc | 136 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 presets/examples/29.jsonc diff --git a/presets/examples/29.jsonc b/presets/examples/29.jsonc new file mode 100644 index 000000000..493350a43 --- /dev/null +++ b/presets/examples/29.jsonc @@ -0,0 +1,136 @@ +// #1887 +{ + "$schema": "file:///Users/carter/fastfetch/doc/json_schema.json", + "logo": null, + "display": { + "constants": [ + "\u001b[s\u001b[33C│\u001b[u", + " » " + ], + "separator": "", + "percent": { + "type": ["num", "bar"] + }, + "brightColor": false, + "bar": { + "border": { + "left": "[", + "leftElapsed": "[─", + "right": "]", + "rightElapsed": "─]" + }, + "char": { + "elapsed": "─", + "total": "─" + }, + "color": { + "elapsed": "default", + "total": "light_black" + }, + "width": 14 + }, + "color": { + "separator": "default", + "keys": "default", + "output": "default" + } + }, + "modules": [ + "title", + { + "type": "custom", + "format": "┌────「 {#1}OS{#} 」────────────────────────────┐" + }, + { + "type": "os", + "key": "│ {icon}{$2}{$1}" + }, + { + "type": "disk", + "folders": "/", + "key": "│ {$1}", + "format": "{size-percentage-bar} {size-percentage}" + }, + { + "type": "disk", + "folders": "/", + "key": "│ {$1}", + "format": "{size-used} / {size-total}" + }, + { + "type": "custom", + "format": "└────────────────────────────────────────┘" + }, + "break", + { + "type": "custom", + "format": "┌────「 {#1}UI{#} 」────────────────────────────┐" + }, + { + "type": "wm", + "key": "│ {icon}{$2}{$1}" + }, + { + "type": "wmtheme", + "key": "│ {icon}{$2}{$1}" + }, + { + "type": "custom", + "key": "│ {$1}" + }, + { + "type": "display", + "key": "│ {icon}{$2}{$1}", + "format": "{width}x{height} @ {refresh-rate} Hz" + }, + { + "type": "custom", + "key": "│ {$1}" + }, + { + "type": "terminal", + "key": "│ {icon}{$2}{$1}" + }, + { + "type": "terminalfont", + "key": "│ {icon}{$2}{$1}" + }, + { + "type": "custom", + "format": "└────────────────────────────────────────┘" + }, + "break", + { + "type": "custom", + "format": "┌────「 {#1}HW{#} 」────────────────────────────┐" + }, + { + "type": "cpu", + "key": "│ {icon}{$2}{$1}", + "format": "{name}" + }, + { + "type": "gpu", + "key": "│ {icon}{$2}{$1}", + "format": "{name}" + }, + { + "type": "custom", + "key": "│ {$1}" + }, + { + "type": "memory", + "key": "│ {icon}{$2}{$1}", + "format": "{percentage-bar} {percentage}" + }, + { + "type": "memory", + "key": "│ {$1}", + "format": "{used} / {total}" + }, + { + "type": "custom", + "format": "└────────────────────────────────────────┘" + } + ] +} From 146981009b80b9008398a099e2202682af0ed257 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 11 Aug 2025 14:49:22 +0800 Subject: [PATCH 61/83] CommandLine: add `--gen-config-full` --- src/common/commandoption.c | 20 ++++++++++++++------ src/fastfetch.c | 32 ++++++++++++++++++++++---------- src/fastfetch.h | 1 + 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/common/commandoption.c b/src/common/commandoption.c index d38921a46..a0e249383 100644 --- a/src/common/commandoption.c +++ b/src/common/commandoption.c @@ -57,18 +57,26 @@ static void genJsonConfig(FFModuleBaseInfo* baseInfo, void* options, yyjson_mut_ if (!modules) modules = yyjson_mut_obj_add_arr(doc, doc->root, "modules"); - yyjson_mut_val* module = yyjson_mut_obj(doc); FF_STRBUF_AUTO_DESTROY type = ffStrbufCreateS(baseInfo->name); ffStrbufLowerCase(&type); - yyjson_mut_obj_add_strbuf(doc, module, "type", &type); - if (baseInfo->generateJsonConfig) - baseInfo->generateJsonConfig(options, doc, module); + if (instance.state.fullConfig) + { + yyjson_mut_val* module = yyjson_mut_obj(doc); + yyjson_mut_obj_add_strbuf(doc, module, "type", &type); - if (yyjson_mut_obj_size(module) > 1) - yyjson_mut_arr_add_val(modules, module); + if (baseInfo->generateJsonConfig) + baseInfo->generateJsonConfig(options, doc, module); + + if (yyjson_mut_obj_size(module) > 1) + yyjson_mut_arr_add_val(modules, module); + else + yyjson_mut_arr_add_strbuf(doc, modules, &type); + } else + { yyjson_mut_arr_add_strbuf(doc, modules, &type); + } } static void genJsonResult(FFModuleBaseInfo* baseInfo, void* options, yyjson_mut_doc* doc) diff --git a/src/fastfetch.c b/src/fastfetch.c index d4b437c8d..b0c7b3367 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -421,7 +421,8 @@ static bool parseJsoncFile(const char* path, bool strictJson) return true; } -static void generateConfigFile(bool force, const char* filePath) + +static void generateConfigFile(bool force, const char* filePath, bool fullConfig) { if (!filePath) { @@ -435,9 +436,11 @@ static void generateConfigFile(bool force, const char* filePath) if (!force && ffPathExists(instance.state.genConfigPath.chars, FF_PATHTYPE_ANY)) { - fprintf(stderr, "Error: file `%s` exists. Use `--gen-config-force` to overwrite\n", instance.state.genConfigPath.chars); + fprintf(stderr, "Error: file `%s` exists. Use `--gen-config%s-force` to overwrite\n", instance.state.genConfigPath.chars, fullConfig ? "-full" : ""); exit(477); } + + instance.state.fullConfig = fullConfig; } static void optionParseConfigFile(FFdata* data, const char* key, const char* value) @@ -599,9 +602,13 @@ static void parseCommand(FFdata* data, char* key, char* value) exit(0); } else if(ffStrEqualsIgnCase(key, "--gen-config")) - generateConfigFile(false, value); + generateConfigFile(false, value, false); else if(ffStrEqualsIgnCase(key, "--gen-config-force")) - generateConfigFile(true, value); + generateConfigFile(true, value, false); + else if(ffStrEqualsIgnCase(key, "--gen-config-full")) + generateConfigFile(false, value, true); + else if(ffStrEqualsIgnCase(key, "--gen-config-full-force")) + generateConfigFile(true, value, true); else if(ffStrEqualsIgnCase(key, "-c") || ffStrEqualsIgnCase(key, "--load-config") || ffStrEqualsIgnCase(key, "--config")) optionParseConfigFile(data, key, value); else if(ffStrEqualsIgnCase(key, "--format")) @@ -726,16 +733,21 @@ static void run(FFdata* data) ffFinish(); } -static void writeConfigFile(FFdata* data, const FFstrbuf* filename) +static void writeConfigFile(FFdata* data) { + const FFstrbuf* filename = &instance.state.genConfigPath; + yyjson_mut_doc* doc = yyjson_mut_doc_new(NULL); yyjson_mut_val* root = yyjson_mut_obj(doc); yyjson_mut_doc_set_root(doc, root); - yyjson_mut_obj_add_str(doc, root, "$schema", "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json"); + yyjson_mut_obj_add_str(doc, root, "$schema", "https://github.com/fastfetch-cli/fastfetch/raw/master/doc/json_schema.json"); - ffOptionsGenerateLogoJsonConfig(&instance.config.logo, doc); - ffOptionsGenerateDisplayJsonConfig(&instance.config.display, doc); - ffOptionsGenerateGeneralJsonConfig(&instance.config.general, doc); + if (instance.state.fullConfig) + { + ffOptionsGenerateLogoJsonConfig(&instance.config.logo, doc); + ffOptionsGenerateDisplayJsonConfig(&instance.config.display, doc); + ffOptionsGenerateGeneralJsonConfig(&instance.config.general, doc); + } ffMigrateCommandOptionToJsonc(data, doc); if (ffStrbufEqualS(filename, "-")) @@ -780,7 +792,7 @@ int main(int argc, char** argv) if (__builtin_expect(instance.state.genConfigPath.length == 0, true)) run(&data); else - writeConfigFile(&data, &instance.state.genConfigPath); + writeConfigFile(&data); ffStrbufDestroy(&data.structure); } diff --git a/src/fastfetch.h b/src/fastfetch.h index 9b031b87a..cf0c1bd9f 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -54,6 +54,7 @@ typedef struct FFstate yyjson_doc* configDoc; yyjson_mut_doc* resultDoc; FFstrbuf genConfigPath; + bool fullConfig; } FFstate; typedef struct FFinstance From 883923de4a8c3cc862fef389cdfbb91c3609f6e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 11 Aug 2025 15:27:20 +0800 Subject: [PATCH 62/83] CI (Haiku): reduce errors when installing deps (hopefully) --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 71629f5fc..fe2b38052 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -700,7 +700,7 @@ jobs: shell: bash run: | uname -a - pkgman install -y git dbus_devel mesa_devel libelf_devel imagemagick_devel opencl_headers ocl_icd_devel vulkan_devel zlib_devel chafa_devel cmake gcc make pkgconfig python3.10 + pkgman install -y git dbus_devel mesa_devel libelf_devel imagemagick_devel opencl_headers ocl_icd_devel vulkan_devel zlib_devel chafa_devel cmake gcc make pkgconfig python3.10 || pkgman install -y git dbus_devel mesa_devel libelf_devel imagemagick_devel opencl_headers ocl_icd_devel vulkan_devel zlib_devel chafa_devel cmake gcc make pkgconfig python3.10 cmake -DSET_TWEAK=Off -DBUILD_TESTS=On -DENABLE_EMBEDDED_PCIIDS=On -DENABLE_EMBEDDED_AMDGPUIDS=On . cmake --build . --target package --verbose -j4 ./fastfetch --list-features From 7f1063d09b301bbbe0d054b4dff58216894c9dca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 11 Aug 2025 16:35:35 +0800 Subject: [PATCH 63/83] Revert "CPU (macOS): use CPUID for freq detection on Intel" This reverts commit 7ee0e8726ed020738335aabe6df30dd9c3556ea9. --- src/detection/cpu/cpu_apple.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/detection/cpu/cpu_apple.c b/src/detection/cpu/cpu_apple.c index a3607c683..1226131e5 100644 --- a/src/detection/cpu/cpu_apple.c +++ b/src/detection/cpu/cpu_apple.c @@ -72,17 +72,14 @@ static const char* detectFrequency(FFCPUResult* cpu) #else static const char* detectFrequency(FFCPUResult* cpu) { - if (ffCPUDetectSpeedByCpuid(cpu) != NULL) + cpu->frequencyBase = (uint32_t) (ffSysctlGetInt64("hw.cpufrequency", 0) / 1000 / 1000); + cpu->frequencyMax = (uint32_t) (ffSysctlGetInt64("hw.cpufrequency_max", 0) / 1000 / 1000); + if(cpu->frequencyBase == 0) { - cpu->frequencyBase = (uint32_t) (ffSysctlGetInt64("hw.cpufrequency", 0) / 1000 / 1000); - cpu->frequencyMax = (uint32_t) (ffSysctlGetInt64("hw.cpufrequency_max", 0) / 1000 / 1000); - if(cpu->frequencyBase == 0) - { - unsigned current = 0; - size_t size = sizeof(current); - if (sysctl((int[]){ CTL_HW, HW_CPU_FREQ }, 2, ¤t, &size, NULL, 0) == 0) - cpu->frequencyBase = (uint32_t) (current / 1000 / 1000); - } + unsigned current = 0; + size_t size = sizeof(current); + if (sysctl((int[]){ CTL_HW, HW_CPU_FREQ }, 2, ¤t, &size, NULL, 0) == 0) + cpu->frequencyBase = (uint32_t) (current / 1000 / 1000); } return NULL; } From 1ec69d683863b4cac919525507325a6573bfca1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 11 Aug 2025 16:38:39 +0800 Subject: [PATCH 64/83] OS (Linux): tidy --- src/detection/os/os_linux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/detection/os/os_linux.c b/src/detection/os/os_linux.c index 55f045ff6..9b5ef3690 100644 --- a/src/detection/os/os_linux.c +++ b/src/detection/os/os_linux.c @@ -90,7 +90,7 @@ FF_MAYBE_UNUSED static void getUbuntuFlavour(FFOSResult* result) } if (ffPathExists("/usr/bin/lliurex-version", FF_PATHTYPE_FILE)) - { + { ffStrbufSetStatic(&result->name, "LliureX"); ffStrbufSetStatic(&result->id, "lliurex"); ffStrbufClear(&result->version); @@ -102,7 +102,7 @@ FF_MAYBE_UNUSED static void getUbuntuFlavour(FFOSResult* result) ffStrbufSetF(&result->prettyName, "LliureX %s", result->version.chars); ffStrbufSetStatic(&result->idLike, "ubuntu"); return; - } + } if(ffStrContains(xdgConfigDirs, "kde") || ffStrContains(xdgConfigDirs, "plasma") || ffStrContains(xdgConfigDirs, "kubuntu")) { From 3276949663ded8c28473d89aa3488732d7c64d0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 11 Aug 2025 16:42:53 +0800 Subject: [PATCH 65/83] Doc: update README & Changelog --- CHANGELOG.md | 16 ++++++++++++++++ README.md | 3 ++- src/data/help.json | 11 ++++++++++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56ca8e334..e9f2a5686 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # WIP Changes: +* Keys in JSON configuration files are now case-sensitive, as stated in v2.49.0 + * This is a breaking change, but it should not affect most users as long as your config file passes JSON schema validation. +* All module config flags are removed, as stated in v2.49.0 * Percent bar config `display.bar.*` options have been replaced with a more organized, nested object structure. * `display.bar.charElapsed` has been renamed to `display.bar.char.elapsed`. * `display.bar.charTotal` has been renamed to `display.bar.char.total`. @@ -12,6 +15,19 @@ Features: * `display.bar.border: null` has been added as a shorthand to disable bar borders. * Add `display.bar.color.{elapsed,total,border}` to customize the color of the elapsed, total and border sections of the percent bar. * `display.bar.color: null` has been added as a shorthand to disable bar colors. +* Improve Bedrock linux detection (#1881, OS / Disk, Linux) +* Add command flag `--gen-config-full` which generates a JSON config file that contains all optional module options. +* Default IP address shown when `localip.showAllIPs` is not set is improved (LocalIP) + * For IPv4, preferred source address (if detected) is shown + * For IPv6, first GUA or ULA that is not deprecated nor temporary is shown +* Support interface speed detection on SunOS (LocalIP, SunOS) +* Detect Xlibre (#1888, WM, Linux) + +Bugfixes: +* Fix possible segfault when parsing color strings in JSON config (#1878) +* Fix gpu driver detection when DRM is used (GPU, FreeBSD) +* Fix default route detection on DragonFly BSD (LocalIP, DFBSD) +* Fix lliurex detection (#1882, OS, Linux) # 2.49.0 diff --git a/README.md b/README.md index 58044a62f..6edd61773 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,8 @@ See the Wiki: https://github.com/fastfetch-cli/fastfetch/wiki/Building * Run with [all supported modules](https://github.com/fastfetch-cli/fastfetch/wiki/Support+Status#available-modules) to find what interests you: `fastfetch -c all.jsonc` * View all data that fastfetch detects: `fastfetch -s [:][:] --format json` * Display help messages: `fastfetch --help` -* Generate a config file based on command line arguments: `fastfetch --arg1 --arg2 --gen-config` +* Generate a minimal config file: `fastfetch [-s [:]] --gen-config []` + * Use: `--gen-config-full` to generate a full config file with all optional options ## Customization diff --git a/src/data/help.json b/src/data/help.json index f13d48e81..e99c6867f 100644 --- a/src/data/help.json +++ b/src/data/help.json @@ -77,7 +77,16 @@ }, { "long": "gen-config", - "desc": "Generate a config file at the specified path with options from the command line (if any)", + "desc": "Generate a minimal config file at the specified path", + "remark": "Defaults to \"~/.config/fastfetch/config.jsonc\". Will print the generated config if is \"-\"", + "arg": { + "type": "path", + "optional": true + } + }, + { + "long": "gen-config-full", + "desc": "Generate a full config file with all optional options at the specified path", "remark": "Defaults to \"~/.config/fastfetch/config.jsonc\". Will print the generated config if is \"-\"", "arg": { "type": "path", From 3ef84834fcca43ce8533ccc30864c375b9639f22 Mon Sep 17 00:00:00 2001 From: Osama Albahrani <54853250+osalbahr@users.noreply.github.com> Date: Tue, 12 Aug 2025 04:08:11 +0300 Subject: [PATCH 66/83] README: HomeBrew -> Homebrew (#1891) [ci skip] See https://brew.sh --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6edd61773..11832f6ba 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ If fastfetch is not packaged for your distribution or an outdated version is pac ### macOS -* [HomeBrew](https://formulae.brew.sh/formula/fastfetch#default): `brew install fastfetch` +* [Homebrew](https://formulae.brew.sh/formula/fastfetch#default): `brew install fastfetch` * [MacPorts](https://ports.macports.org/port/fastfetch/): `sudo port install fastfetch` ### Windows From a0265c320493202b3633ae9e6887be1beaa75b15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 12 Aug 2025 09:20:04 +0800 Subject: [PATCH 67/83] CI: upgrade to `actions/checkout@v5` --- .github/workflows/ci.yml | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fe2b38052..f22e9d373 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install codespell shell: bash @@ -29,7 +29,7 @@ jobs: contents: read steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: uname -a run: uname -a @@ -68,7 +68,7 @@ jobs: ffversion: ${{ steps.ffversion.outputs.ffversion }} steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: uname -a run: uname -a @@ -137,7 +137,7 @@ jobs: contents: read steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: uname -a run: uname -a @@ -198,7 +198,7 @@ jobs: contents: read steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: run VM uses: uraimo/run-on-arch-action@v3 @@ -237,7 +237,7 @@ jobs: contents: read steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: run VM uses: uraimo/run-on-arch-action@v3 @@ -273,7 +273,7 @@ jobs: contents: read steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: run VM uses: uraimo/run-on-arch-action@v3 @@ -308,7 +308,7 @@ jobs: contents: read steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: run VM uses: uraimo/run-on-arch-action@v3 @@ -343,7 +343,7 @@ jobs: contents: read steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: run VM uses: uraimo/run-on-arch-action@v3 @@ -374,7 +374,7 @@ jobs: name: Musl-amd64 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: setup alpine linux uses: jirutka/setup-alpine@master @@ -416,7 +416,7 @@ jobs: contents: read steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: uname -a run: uname -a @@ -463,7 +463,7 @@ jobs: contents: read steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: uname -a run: uname -a @@ -507,7 +507,7 @@ jobs: name: SunOS-amd64 steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: run VM uses: vmactions/omnios-vm@v1 @@ -543,7 +543,7 @@ jobs: contents: read steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: run VM uses: cross-platform-actions/action@master @@ -580,7 +580,7 @@ jobs: contents: read steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: run VM uses: cross-platform-actions/action@master @@ -616,7 +616,7 @@ jobs: contents: read steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: run VM uses: cross-platform-actions/action@master @@ -653,7 +653,7 @@ jobs: contents: read steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: run VM uses: vmactions/dragonflybsd-vm@v1 @@ -688,7 +688,7 @@ jobs: contents: read steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: run VM uses: cross-platform-actions/action@master @@ -726,7 +726,7 @@ jobs: shell: msys2 {0} steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: setup-msys2 uses: msys2/setup-msys2@v2 @@ -788,7 +788,7 @@ jobs: shell: msys2 {0} steps: - name: checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: setup-msys2 uses: msys2/setup-msys2@v2 From 4004501d0f3e30f2431b217fb02ec2b749ebe8c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 12 Aug 2025 19:25:10 +0800 Subject: [PATCH 68/83] Packages: unifies Nix package detection code Fixes: #1893 --- CMakeLists.txt | 2 + src/detection/packages/packages.h | 3 + src/detection/packages/packages_apple.c | 125 ++++++++---------- src/detection/packages/packages_linux.c | 162 +----------------------- src/detection/packages/packages_nix.c | 155 +++++++++++++++++++++++ 5 files changed, 215 insertions(+), 232 deletions(-) create mode 100644 src/detection/packages/packages_nix.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 29e403100..0b359e340 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -547,6 +547,7 @@ if(LINUX) src/detection/opengl/opengl_linux.c src/detection/os/os_linux.c src/detection/packages/packages_linux.c + src/detection/packages/packages_nix.c src/detection/poweradapter/poweradapter_linux.c src/detection/processes/processes_linux.c src/detection/gtk_qt/qt.c @@ -939,6 +940,7 @@ elseif(APPLE) src/detection/opengl/opengl_apple.c src/detection/os/os_apple.m src/detection/packages/packages_apple.c + src/detection/packages/packages_nix.c src/detection/poweradapter/poweradapter_apple.c src/detection/processes/processes_bsd.c src/detection/sound/sound_apple.c diff --git a/src/detection/packages/packages.h b/src/detection/packages/packages.h index c824b448a..c71711dcc 100644 --- a/src/detection/packages/packages.h +++ b/src/detection/packages/packages.h @@ -55,6 +55,9 @@ const char* ffDetectPackages(FFPackagesResult* result, FFPackagesOptions* option bool ffPackagesReadCache(FFstrbuf* cacheDir, FFstrbuf* cacheContent, const char* filePath, const char* packageId, uint32_t* result); bool ffPackagesWriteCache(FFstrbuf* cacheDir, FFstrbuf* cacheContent, uint32_t num_elements); +#if (defined(__linux__) && !defined(__ANDROID__)) || defined(__APPLE__) +uint32_t ffPackagesGetNix(FFstrbuf* baseDir, const char* dirname); +#endif #ifndef _WIN32 uint32_t ffPackagesGetNumElements(const char* dirname, bool isdir); #endif diff --git a/src/detection/packages/packages_apple.c b/src/detection/packages/packages_apple.c index 8391a0f56..5a176c834 100644 --- a/src/detection/packages/packages_apple.c +++ b/src/detection/packages/packages_apple.c @@ -4,91 +4,66 @@ #include "common/processing.h" #include "util/stringUtils.h" -static void countBrewPackages(const char* dirname, FFPackagesResult* result) +static void countBrewPackages(FFstrbuf* baseDir, FFPackagesResult* result) { - FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateS(dirname); - uint32_t baseDirLength = baseDir.length; - - ffStrbufAppendS(&baseDir, "/Caskroom"); - result->brewCask += ffPackagesGetNumElements(baseDir.chars, true); - ffStrbufSubstrBefore(&baseDir, baseDirLength); - - ffStrbufAppendS(&baseDir, "/Cellar"); - result->brew += ffPackagesGetNumElements(baseDir.chars, true); - ffStrbufSubstrBefore(&baseDir, baseDirLength); -} - -static void getBrewPackages(FFPackagesResult* result) -{ - const char* prefix = getenv("HOMEBREW_PREFIX"); - if(ffStrSet(prefix)) - return countBrewPackages(prefix, result); - - countBrewPackages(FASTFETCH_TARGET_DIR_ROOT "/opt/homebrew", result); - countBrewPackages(FASTFETCH_TARGET_DIR_USR "/local", result); -} - -static uint32_t countMacPortsPackages(const char* dirname) -{ - FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateS(dirname); - ffStrbufAppendS(&baseDir, "/var/macports/software"); - - return ffPackagesGetNumElements(baseDir.chars, true); -} - -static uint32_t getMacPortsPackages() -{ - const char* prefix = getenv("MACPORTS_PREFIX"); - if(ffStrSet(prefix)) - return countMacPortsPackages(prefix); - - return countMacPortsPackages(FASTFETCH_TARGET_DIR_ROOT "/opt/local"); -} - -static uint32_t getNixPackagesImpl(const char* path) -{ - //Nix detection is kinda slow, so we only do it if the dir exists - if(!ffPathExists(path, FF_PATHTYPE_DIRECTORY)) - return 0; - - FF_STRBUF_AUTO_DESTROY output = ffStrbufCreateA(128); - - //https://github.com/fastfetch-cli/fastfetch/issues/195#issuecomment-1191748222 - FF_STRBUF_AUTO_DESTROY command = ffStrbufCreateA(255); - ffStrbufAppendS(&command, "for x in $(nix-store --query --requisites "); - ffStrbufAppendS(&command, path); - ffStrbufAppendS(&command, "); do if [ -d $x ]; then echo $x ; fi ; done | cut -d- -f2- | egrep '([0-9]{1,}\\.)+[0-9]{1,}' | egrep -v '\\-doc$|\\-man$|\\-info$|\\-dev$|\\-bin$|^nixos-system-nixos-' | uniq | wc -l"); - - ffProcessAppendStdOut(&output, (char* const[]) { - FASTFETCH_TARGET_DIR_ROOT "/bin/sh", - "-c", - command.chars, - NULL - }); - - return (uint32_t) strtoul(output.chars, NULL, 10); -} - -static uint32_t getNixPackages(FFstrbuf* baseDir, const char* dirname) -{ uint32_t baseDirLength = baseDir->length; - ffStrbufAppendS(baseDir, dirname); - uint32_t num_elements = getNixPackagesImpl(baseDir->chars); + + ffStrbufAppendS(baseDir, "/Caskroom"); + result->brewCask += ffPackagesGetNumElements(baseDir->chars, true); ffStrbufSubstrBefore(baseDir, baseDirLength); - return num_elements; + + ffStrbufAppendS(baseDir, "/Cellar"); + result->brew += ffPackagesGetNumElements(baseDir->chars, true); + ffStrbufSubstrBefore(baseDir, baseDirLength); +} + +static uint32_t getMacPortsPackages(FFstrbuf* baseDir) +{ + ffStrbufAppendS(baseDir, "/var/macports/software"); + return ffPackagesGetNumElements(baseDir->chars, true); } void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) { - if (!(options->disabled & FF_PACKAGES_FLAG_BREW_BIT)) getBrewPackages(result); - if (!(options->disabled & FF_PACKAGES_FLAG_MACPORTS_BIT)) result->macports = getMacPortsPackages(); + FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreate(); + if (!(options->disabled & FF_PACKAGES_FLAG_BREW_BIT)) + { + const char* prefix = getenv("HOMEBREW_PREFIX"); + if (ffStrSet(prefix)) + { + ffStrbufSetS(&baseDir, prefix); + } + else + { + #ifdef __aarch64__ + ffStrbufSetS(&baseDir, FASTFETCH_TARGET_DIR_ROOT "/opt/homebrew"); + #else + ffStrbufSetS(&baseDir, FASTFETCH_TARGET_DIR_USR "/local"); + #endif + } + countBrewPackages(&baseDir, result); + } + if (!(options->disabled & FF_PACKAGES_FLAG_MACPORTS_BIT)) + { + const char* prefix = getenv("MACPORTS_PREFIX"); + if (ffStrSet(prefix)) + { + ffStrbufSetS(&baseDir, prefix); + } + else + { + ffStrbufSetS(&baseDir, FASTFETCH_TARGET_DIR_ROOT "/opt/local"); + } + + result->macports = getMacPortsPackages(&baseDir); + } if (!(options->disabled & FF_PACKAGES_FLAG_NIX_BIT)) { - FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateS(FASTFETCH_TARGET_DIR_ROOT); - result->nixDefault += getNixPackages(&baseDir, "/nix/var/nix/profiles/default"); - result->nixSystem += getNixPackages(&baseDir, "/run/current-system"); + ffStrbufSetS(&baseDir, FASTFETCH_TARGET_DIR_ROOT); + result->nixDefault += ffPackagesGetNix(&baseDir, "/nix/var/nix/profiles/default"); + result->nixSystem += ffPackagesGetNix(&baseDir, "/run/current-system"); ffStrbufSet(&baseDir, &instance.state.platform.homeDir); - result->nixUser = getNixPackages(&baseDir, "/.nix-profile"); + result->nixUser = ffPackagesGetNix(&baseDir, "/.nix-profile"); } } diff --git a/src/detection/packages/packages_linux.c b/src/detection/packages/packages_linux.c index 9fdb29485..2fb000300 100644 --- a/src/detection/packages/packages_linux.c +++ b/src/detection/packages/packages_linux.c @@ -1,7 +1,6 @@ #include "packages.h" #include "common/io/io.h" #include "common/parsing.h" -#include "common/processing.h" #include "common/properties.h" #include "common/settings.h" #include "detection/os/os.h" @@ -124,157 +123,6 @@ static uint32_t countFilesRecursive(FFstrbuf* baseDir, const char* dirname, cons return sum; } -static bool isValidNixPkg(FFstrbuf* pkg) -{ - if (!ffPathExists(pkg->chars, FF_PATHTYPE_DIRECTORY)) - return false; - - ffStrbufSubstrAfterLastC(pkg, '/'); - if ( - ffStrbufStartsWithS(pkg, "nixos-system-nixos-") || - ffStrbufEndsWithS(pkg, "-doc") || - ffStrbufEndsWithS(pkg, "-man") || - ffStrbufEndsWithS(pkg, "-info") || - ffStrbufEndsWithS(pkg, "-dev") || - ffStrbufEndsWithS(pkg, "-bin") - ) return false; - - enum { START, DIGIT, DOT, MATCH } state = START; - - for (uint32_t i = 0; i < pkg->length; i++) - { - char c = pkg->chars[i]; - switch (state) - { - case START: - if (ffCharIsDigit(c)) - state = DIGIT; - break; - case DIGIT: - if (ffCharIsDigit(c)) - continue; - if (c == '.') - state = DOT; - else - state = START; - break; - case DOT: - if (ffCharIsDigit(c)) - state = MATCH; - else - state = START; - break; - case MATCH: - break; - } - } - - return state == MATCH; -} - -static bool checkNixCache(FFstrbuf* cacheDir, FFstrbuf* hash, uint32_t* count) -{ - if (!ffPathExists(cacheDir->chars, FF_PATHTYPE_FILE)) - return false; - - FF_STRBUF_AUTO_DESTROY cacheContent = ffStrbufCreate(); - if (!ffReadFileBuffer(cacheDir->chars, &cacheContent)) - return false; - - // Format: \n - uint32_t split = ffStrbufFirstIndexC(&cacheContent, '\n'); - if (split == cacheContent.length) - return false; - - ffStrbufSetNS(hash, split, cacheContent.chars); - *count = (uint32_t)atoi(cacheContent.chars + split + 1); - - return true; -} - -static bool writeNixCache(FFstrbuf* cacheDir, FFstrbuf* hash, uint32_t count) -{ - FF_STRBUF_AUTO_DESTROY cacheContent = ffStrbufCreateCopy(hash); - ffStrbufAppendF(&cacheContent, "\n%u", count); - return ffWriteFileBuffer(cacheDir->chars, &cacheContent); -} - -static uint32_t getNixPackagesImpl(char* path) -{ - //Nix detection is kinda slow, so we only do it if the dir exists - if(!ffPathExists(path, FF_PATHTYPE_DIRECTORY)) - return 0; - - FF_STRBUF_AUTO_DESTROY cacheDir = ffStrbufCreateCopy(&instance.state.platform.cacheDir); - ffStrbufEnsureEndsWithC(&cacheDir, '/'); - ffStrbufAppendS(&cacheDir, "fastfetch/packages/nix"); - ffStrbufAppendS(&cacheDir, path); - - //Check the hash first to determine if we need to recompute the count - FF_STRBUF_AUTO_DESTROY hash = ffStrbufCreateA(64); - FF_STRBUF_AUTO_DESTROY cacheHash = ffStrbufCreateA(64); - uint32_t count = 0; - - ffProcessAppendStdOut(&hash, (char* const[]) { - "nix-store", - "--query", - "--hash", - path, - NULL - }); - - if (checkNixCache(&cacheDir, &cacheHash, &count) && ffStrbufEqual(&hash, &cacheHash)) - return count; - - //Cache is invalid, recompute the count - count = 0; - - //Implementation based on bash script from here: - //https://github.com/fastfetch-cli/fastfetch/issues/195#issuecomment-1191748222 - - FF_STRBUF_AUTO_DESTROY output = ffStrbufCreateA(1024); - - ffProcessAppendStdOut(&output, (char* const[]) { - "nix-store", - "--query", - "--requisites", - path, - NULL - }); - - uint32_t lineLength = 0; - for (uint32_t i = 0; i < output.length; i++) - { - if (output.chars[i] != '\n') - { - lineLength++; - continue; - } - - output.chars[i] = '\0'; - FFstrbuf line = { - .allocated = 0, - .length = lineLength, - .chars = output.chars + i - lineLength - }; - if (isValidNixPkg(&line)) - count++; - lineLength = 0; - } - - writeNixCache(&cacheDir, &hash, count); - return count; -} - -static uint32_t getNixPackages(FFstrbuf* baseDir, const char* dirname) -{ - uint32_t baseDirLength = baseDir->length; - ffStrbufAppendS(baseDir, dirname); - uint32_t num_elements = getNixPackagesImpl(baseDir->chars); - ffStrbufSubstrBefore(baseDir, baseDirLength); - return num_elements; -} - static uint32_t getXBPSImpl(FFstrbuf* baseDir) { DIR* dir = opendir(baseDir->chars); @@ -572,8 +420,8 @@ static void getPackageCounts(FFstrbuf* baseDir, FFPackagesResult* packageCounts, if (!(options->disabled & FF_PACKAGES_FLAG_FLATPAK_BIT)) packageCounts->flatpakSystem += getFlatpakPackages(baseDir, "/var/lib"); if (!(options->disabled & FF_PACKAGES_FLAG_NIX_BIT)) { - packageCounts->nixDefault += getNixPackages(baseDir, "/nix/var/nix/profiles/default"); - packageCounts->nixSystem += getNixPackages(baseDir, "/run/current-system"); + packageCounts->nixDefault += ffPackagesGetNix(baseDir, "/nix/var/nix/profiles/default"); + packageCounts->nixSystem += ffPackagesGetNix(baseDir, "/run/current-system"); } if (!(options->disabled & FF_PACKAGES_FLAG_PACMAN_BIT)) packageCounts->pacman += getNumElements(baseDir, "/var/lib/pacman/local", true); if (!(options->disabled & FF_PACKAGES_FLAG_LPKGBUILD_BIT)) packageCounts->lpkgbuild += getNumElements(baseDir, "/opt/Loc-OS-LPKG/lpkgbuild/remove", false); @@ -673,7 +521,7 @@ void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) if (!(options->disabled & FF_PACKAGES_FLAG_NIX_BIT)) { // Count packages from $HOME/.nix-profile - result->nixUser += getNixPackages(&baseDir, ".nix-profile"); + result->nixUser += ffPackagesGetNix(&baseDir, ".nix-profile"); // Check in $XDG_STATE_HOME/nix/profile FF_STRBUF_AUTO_DESTROY stateHome = ffStrbufCreate(); @@ -688,11 +536,11 @@ void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) ffStrbufSet(&stateHome, &instance.state.platform.homeDir); ffStrbufAppendS(&stateHome, ".local/state/"); } - result->nixUser += getNixPackages(&stateHome, "nix/profile"); + result->nixUser += ffPackagesGetNix(&stateHome, "nix/profile"); // Check in /etc/profiles/per-user/$USER FF_STRBUF_AUTO_DESTROY userPkgsDir = ffStrbufCreateStatic("/etc/profiles/per-user/"); - result->nixUser += getNixPackages(&userPkgsDir, instance.state.platform.userName.chars); + result->nixUser += ffPackagesGetNix(&userPkgsDir, instance.state.platform.userName.chars); } if (!(options->disabled & FF_PACKAGES_FLAG_GUIX_BIT)) diff --git a/src/detection/packages/packages_nix.c b/src/detection/packages/packages_nix.c new file mode 100644 index 000000000..08a5479a6 --- /dev/null +++ b/src/detection/packages/packages_nix.c @@ -0,0 +1,155 @@ +#include "packages.h" +#include "common/io/io.h" +#include "common/processing.h" +#include "util/stringUtils.h" + +static bool isValidNixPkg(FFstrbuf* pkg) +{ + if (!ffPathExists(pkg->chars, FF_PATHTYPE_DIRECTORY)) + return false; + + ffStrbufSubstrAfterLastC(pkg, '/'); + if ( + ffStrbufStartsWithS(pkg, "nixos-system-nixos-") || + ffStrbufEndsWithS(pkg, "-doc") || + ffStrbufEndsWithS(pkg, "-man") || + ffStrbufEndsWithS(pkg, "-info") || + ffStrbufEndsWithS(pkg, "-dev") || + ffStrbufEndsWithS(pkg, "-bin") + ) return false; + + enum { START, DIGIT, DOT, MATCH } state = START; + + for (uint32_t i = 0; i < pkg->length; i++) + { + char c = pkg->chars[i]; + switch (state) + { + case START: + if (ffCharIsDigit(c)) + state = DIGIT; + break; + case DIGIT: + if (ffCharIsDigit(c)) + continue; + if (c == '.') + state = DOT; + else + state = START; + break; + case DOT: + if (ffCharIsDigit(c)) + state = MATCH; + else + state = START; + break; + case MATCH: + break; + } + } + + return state == MATCH; +} + +static bool checkNixCache(FFstrbuf* cacheDir, FFstrbuf* hash, uint32_t* count) +{ + if (!ffPathExists(cacheDir->chars, FF_PATHTYPE_FILE)) + return false; + + FF_STRBUF_AUTO_DESTROY cacheContent = ffStrbufCreate(); + if (!ffReadFileBuffer(cacheDir->chars, &cacheContent)) + return false; + + // Format: \n + uint32_t split = ffStrbufFirstIndexC(&cacheContent, '\n'); + if (split == cacheContent.length) + return false; + + ffStrbufSetNS(hash, split, cacheContent.chars); + *count = (uint32_t)atoi(cacheContent.chars + split + 1); + + return true; +} + +static bool writeNixCache(FFstrbuf* cacheDir, FFstrbuf* hash, uint32_t count) +{ + FF_STRBUF_AUTO_DESTROY cacheContent = ffStrbufCreateCopy(hash); + ffStrbufAppendF(&cacheContent, "\n%u", count); + return ffWriteFileBuffer(cacheDir->chars, &cacheContent); +} + +static uint32_t getNixPackagesImpl(char* path) +{ + //Nix detection is kinda slow, so we only do it if the dir exists + if(!ffPathExists(path, FF_PATHTYPE_DIRECTORY)) + return 0; + + FF_STRBUF_AUTO_DESTROY cacheDir = ffStrbufCreateCopy(&instance.state.platform.cacheDir); + ffStrbufEnsureEndsWithC(&cacheDir, '/'); + ffStrbufAppendS(&cacheDir, "fastfetch/packages/nix"); + ffStrbufAppendS(&cacheDir, path); + + //Check the hash first to determine if we need to recompute the count + FF_STRBUF_AUTO_DESTROY hash = ffStrbufCreateA(64); + FF_STRBUF_AUTO_DESTROY cacheHash = ffStrbufCreateA(64); + uint32_t count = 0; + + ffProcessAppendStdOut(&hash, (char* const[]) { + "nix-store", + "--query", + "--hash", + path, + NULL + }); + + if (checkNixCache(&cacheDir, &cacheHash, &count) && ffStrbufEqual(&hash, &cacheHash)) + return count; + + //Cache is invalid, recompute the count + count = 0; + + //Implementation based on bash script from here: + //https://github.com/fastfetch-cli/fastfetch/issues/195#issuecomment-1191748222 + + FF_STRBUF_AUTO_DESTROY output = ffStrbufCreateA(1024); + + ffProcessAppendStdOut(&output, (char* const[]) { + "nix-store", + "--query", + "--requisites", + path, + NULL + }); + + uint32_t lineLength = 0; + for (uint32_t i = 0; i < output.length; i++) + { + if (output.chars[i] != '\n') + { + lineLength++; + continue; + } + + output.chars[i] = '\0'; + FFstrbuf line = { + .allocated = 0, + .length = lineLength, + .chars = output.chars + i - lineLength + }; + if (isValidNixPkg(&line)) + count++; + lineLength = 0; + } + + writeNixCache(&cacheDir, &hash, count); + return count; +} + +uint32_t ffPackagesGetNix(FFstrbuf* baseDir, const char* dirname) +{ + uint32_t baseDirLength = baseDir->length; + ffStrbufAppendS(baseDir, dirname); + uint32_t num_elements = getNixPackagesImpl(baseDir->chars); + ffStrbufSubstrBefore(baseDir, baseDirLength); + return num_elements; +} From ebc60ac66cc0bb412fa08fe226bb24884400ed22 Mon Sep 17 00:00:00 2001 From: NEOAPPS <158327205+neoapps-dev@users.noreply.github.com> Date: Tue, 12 Aug 2025 16:32:38 +0300 Subject: [PATCH 69/83] Logo (Builtin): add ObsidianOS (#1890) --- src/logo/ascii/obsidianos.txt | 19 +++++++++++++++++++ src/logo/builtin.c | 9 +++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/logo/ascii/obsidianos.txt diff --git a/src/logo/ascii/obsidianos.txt b/src/logo/ascii/obsidianos.txt new file mode 100644 index 000000000..8042b3e92 --- /dev/null +++ b/src/logo/ascii/obsidianos.txt @@ -0,0 +1,19 @@ + $1-`$2 + .$1o+`$2 + `o$1oo/$2 + `+o$1ooo:$2 + `+oo$1oooo:$2 + -+oo$1oooo+:$2 + `/:-:+$1+oooo+:$2 + `/++++/$1+++++++:$2 + `/++++++$1++++++++:$2 + `/+++oooo$1ooooooooo/`$2 + ./ooosssso$1++osssssso+`$2 + .oossssso-`$1```/ossssss+`$2 + -osssssso. $1 :ssssssso.$2 + :osssssss/ $1 osssso+++.$2 + /ossssssss/ $1 +ssssooo/-$2 + `/ossssso+/:- $1 -:/+osssso+-$2 + `+sso+:-` $1 `.-/+oso:$2 +`++:. $1 `-/+/$2 +.` $1 `/$2 \ No newline at end of file diff --git a/src/logo/builtin.c b/src/logo/builtin.c index 35eabdb65..c7608fbfb 100644 --- a/src/logo/builtin.c +++ b/src/logo/builtin.c @@ -3392,6 +3392,15 @@ static const FFlogo O[] = { FF_COLOR_FG_WHITE, }, }, + // ObsidianOS + { + .names = {"ObsidianOS"}, + .lines = FASTFETCH_DATATEXT_LOGO_OBSIDIANOS, + .colors = { + FF_COLOR_FG_MAGENTA, + FF_COLOR_FG_CYAN, + }, + }, // OmniOS { .names = {"OmniOS"}, From e1c4365c10f3889174b244aec7a199763f524f5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 12 Aug 2025 13:32:18 +0800 Subject: [PATCH 70/83] Cursor (macOS): improves color detection and rounding for cursor info --- CHANGELOG.md | 3 ++- src/detection/cursor/cursor_apple.m | 35 +++++++++++++++++++---------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9f2a5686..2d60a2cd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# WIP +# 2.50.0 Changes: * Keys in JSON configuration files are now case-sensitive, as stated in v2.49.0 @@ -22,6 +22,7 @@ Features: * For IPv6, first GUA or ULA that is not deprecated nor temporary is shown * Support interface speed detection on SunOS (LocalIP, SunOS) * Detect Xlibre (#1888, WM, Linux) +* Improve accuracy of color detection (Cursor, macOS) Bugfixes: * Fix possible segfault when parsing color strings in JSON config (#1878) diff --git a/src/detection/cursor/cursor_apple.m b/src/detection/cursor/cursor_apple.m index 29187e11d..610bd1ed8 100644 --- a/src/detection/cursor/cursor_apple.m +++ b/src/detection/cursor/cursor_apple.m @@ -2,19 +2,30 @@ #import -static void appendColor(FFstrbuf* str, NSDictionary* color) +static void appendColor(FFstrbuf* str, NSDictionary* dict) { - int r = (int) (((NSNumber*) color[@"red"]).doubleValue * 255); - int g = (int) (((NSNumber*) color[@"green"]).doubleValue * 255); - int b = (int) (((NSNumber*) color[@"blue"]).doubleValue * 255); - int a = (int) (((NSNumber*) color[@"alpha"]).doubleValue * 255); + uint32_t r = (uint32_t) (((NSNumber*) dict[@"red"]).doubleValue * 255 + .5); + uint32_t g = (uint32_t) (((NSNumber*) dict[@"green"]).doubleValue * 255 + .5); + uint32_t b = (uint32_t) (((NSNumber*) dict[@"blue"]).doubleValue * 255 + .5); + uint32_t a = (uint32_t) (((NSNumber*) dict[@"alpha"]).doubleValue * 255 + .5); + uint32_t color = (r << 24) | (g << 16) | (b << 8) | a; - if (r == 255 && g == 255 && b == 255 && a == 255) - ffStrbufAppendS(str, "White"); - else if (r == 0 && g == 0 && b == 0 && a == 255) - ffStrbufAppendS(str, "Black"); - else - ffStrbufAppendF(str, "#%02X%02X%02X%02X", r, g, b, a); + switch (color) + { + case 0x000000FF: ffStrbufAppendS(str, "Black"); return; + case 0x0433FFFF: ffStrbufAppendS(str, "Blue"); return; + case 0xAA7942FF: ffStrbufAppendS(str, "Brown"); return; + case 0x00FDFFFF: ffStrbufAppendS(str, "Cyan"); return; + case 0x00F900FF: ffStrbufAppendS(str, "Green"); return; + case 0xFF40FFFF: ffStrbufAppendS(str, "Magenta"); return; + case 0xFF9300FF: ffStrbufAppendS(str, "Orange"); return; + case 0x942192FF: ffStrbufAppendS(str, "Purple"); return; + case 0xFF2600FF: ffStrbufAppendS(str, "Red"); return; + case 0xFFFB00FF: ffStrbufAppendS(str, "Yellow"); return; + case 0xFFFFFFFF: ffStrbufAppendS(str, "White"); return; + case 0x00000000: ffStrbufAppendS(str, "Transparent"); return; + default: ffStrbufAppendF(str, "#%08X", color); return; + } } void ffDetectCursor(FFCursorResult* result) @@ -46,7 +57,7 @@ void ffDetectCursor(FFCursorResult* result) NSNumber* mouseDriverCursorSize = dict[@"mouseDriverCursorSize"]; if (mouseDriverCursorSize) - ffStrbufAppendF(&result->size, "%d", (int) (mouseDriverCursorSize.doubleValue * 32)); + ffStrbufAppendF(&result->size, "%d", (int) (mouseDriverCursorSize.doubleValue * 32 + 0.5)); else ffStrbufAppendS(&result->size, "32"); } From 53ecf57f190528423846223dbdc2193ceba0b2b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 13 Aug 2025 10:08:06 +0800 Subject: [PATCH 71/83] Doc: update changelog [ci skip] --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d60a2cd4..cb4b15870 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,9 @@ Bugfixes: * Fix default route detection on DragonFly BSD (LocalIP, DFBSD) * Fix lliurex detection (#1882, OS, Linux) +Logos: +* Add ObsidianOS (#1890) + # 2.49.0 Deprecation Notice: From 0b37acec5bdb97d8c77bcc94ab37dd28fcda918b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 14 Aug 2025 01:07:08 +0800 Subject: [PATCH 72/83] GPU (Windows): ignore software adapters; add verbose logs --- src/detection/gpu/gpu_windows.c | 224 +++++++++++++++++++++++++++----- 1 file changed, 193 insertions(+), 31 deletions(-) diff --git a/src/detection/gpu/gpu_windows.c b/src/detection/gpu/gpu_windows.c index 21dae1dc8..0c4aea174 100644 --- a/src/detection/gpu/gpu_windows.c +++ b/src/detection/gpu/gpu_windows.c @@ -4,13 +4,11 @@ #include "util/windows/unicode.h" #include "util/windows/registry.h" #include "util/mallocHelper.h" - -#define INITGUID -#include -#include -#include +#include "util/debug.h" #include "util/windows/nt.h" +#include + #define FF_EMPTY_GUID_STR L"{00000000-0000-0000-0000-000000000000}" enum { FF_GUID_STRLEN = sizeof(FF_EMPTY_GUID_STR) / sizeof(wchar_t) - 1 }; @@ -19,35 +17,55 @@ const uint32_t regDirectxKeyPrefixLength = (uint32_t) __builtin_strlen("SOFTWARE wchar_t regDriverKey[] = L"SYSTEM\\CurrentControlSet\\Control\\Class\\" FF_EMPTY_GUID_STR L"\\0000"; const uint32_t regDriverKeyPrefixLength = (uint32_t) __builtin_strlen("SYSTEM\\CurrentControlSet\\Control\\Class\\"); +#define GUID_DEVCLASS_DISPLAY_STRING L"{4d36e968-e325-11ce-bfc1-08002be10318}" // Found in + const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist* gpus) { - ULONG devInfListSize = 0; - if (CM_Get_Device_Interface_List_SizeW(&devInfListSize, (LPGUID)&GUID_DEVINTERFACE_DISPLAY_ADAPTER, NULL, CM_GET_DEVICE_INTERFACE_LIST_PRESENT) != CR_SUCCESS || devInfListSize <= 1) - return "No display devices found"; + FF_DEBUG("Starting GPU detection"); - FF_AUTO_FREE DEVINSTID_W devInfList = malloc(devInfListSize * sizeof(*devInfList)); - - if (CM_Get_Device_Interface_ListW((LPGUID)&GUID_DEVINTERFACE_DISPLAY_ADAPTER, NULL, devInfList, devInfListSize, CM_GET_DEVICE_INTERFACE_LIST_PRESENT) != CR_SUCCESS) - return "CM_Get_Device_Interface_ListW failed"; - - for (wchar_t* devInf = devInfList; *devInf; devInf += wcslen(devInf) + 1) + ULONG devIdListSize = 0; + if (CM_Get_Device_ID_List_SizeW(&devIdListSize, GUID_DEVCLASS_DISPLAY_STRING, CM_GETIDLIST_FILTER_CLASS | CM_GETIDLIST_FILTER_PRESENT) != CR_SUCCESS || devIdListSize <= 1) { - if (wcsncmp(devInf, L"\\\\?\\ROOT#BasicDisplay#", 22) == 0) - continue; // Skip Microsoft Basic Display Adapter + FF_DEBUG("No display devices found, list size: %lu", devIdListSize); + return "No display devices found"; + } + + FF_DEBUG("Found device ID list size: %lu", devIdListSize); + + FF_AUTO_FREE DEVINSTID_W devIdList = malloc(devIdListSize * sizeof(*devIdList)); + + if (CM_Get_Device_ID_ListW(GUID_DEVCLASS_DISPLAY_STRING, devIdList, devIdListSize, CM_GETIDLIST_FILTER_CLASS | CM_GETIDLIST_FILTER_PRESENT) != CR_SUCCESS) + { + FF_DEBUG("CM_Get_Device_ID_ListW failed"); + return "CM_Get_Device_ID_ListW failed"; + } + + int deviceCount = 0; + for (wchar_t* devId = devIdList; *devId; devId += wcslen(devId) + 1) + { + FF_DEBUG("Processing device ID: %ls", devId); + + if (wcsncmp(devId, L"SWD\\", 4) == 0) + { + FF_DEBUG("Skipping SWD device interface to avoid duplicates"); + continue; + } DEVINST devInst = 0; - wchar_t buffer[256]; - ULONG bufferLen = 0; { - DEVPROPTYPE propertyType; - bufferLen = sizeof(buffer); - if (CM_Get_Device_Interface_PropertyW(devInf, &DEVPKEY_Device_InstanceId, &propertyType, (PBYTE) buffer, &bufferLen, 0) != CR_SUCCESS || - CM_Locate_DevNodeW(&devInst, buffer, CM_LOCATE_DEVNODE_NORMAL) != CR_SUCCESS) + if (CM_Locate_DevNodeW(&devInst, devId, CM_LOCATE_DEVNODE_NORMAL) != CR_SUCCESS) + { + FF_DEBUG("Failed to get device instance ID or locate device node"); continue; + } + FF_DEBUG("Device instance ID: %lu", devInst); } FFGPUResult* gpu = (FFGPUResult*)ffListAdd(gpus); + deviceCount++; + FF_DEBUG("Added GPU #%d to list", deviceCount); + ffStrbufInit(&gpu->vendor); ffStrbufInit(&gpu->name); ffStrbufInit(&gpu->driver); @@ -63,8 +81,15 @@ const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist* gpu->frequency = FF_GPU_FREQUENCY_UNSET; unsigned vendorId = 0, deviceId = 0, subSystemId = 0, revId = 0; - if (swscanf(buffer, L"PCI\\VEN_%x&DEV_%x&SUBSYS_%x&REV_%x", &vendorId, &deviceId, &subSystemId, &revId) == 4) + if (swscanf(devId, L"PCI\\VEN_%x&DEV_%x&SUBSYS_%x&REV_%x", &vendorId, &deviceId, &subSystemId, &revId) == 4) + { + FF_DEBUG("Parsed PCI IDs - Vendor: 0x%x, Device: 0x%x, SubSystem: 0x%x, Rev: 0x%x", vendorId, deviceId, subSystemId, revId); ffStrbufSetStatic(&gpu->vendor, ffGPUGetVendorString(vendorId)); + } + else + { + FF_DEBUG("Failed to parse PCI device information from instance ID"); + } uint32_t pciBus = 0, pciAddr = 0, pciDev = 0, pciFunc = 0; @@ -78,53 +103,87 @@ const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist* pciFunc = pciAddr & 0xFFFF; gpu->deviceId = (pciBus * 1000ull) + (pciDev * 10ull) + pciFunc; pciAddr = 1; // Set to 1 to indicate that the device is a PCI device + FF_DEBUG("PCI location - Bus: %u, Device: %u, Function: %u, DeviceID: %llu", pciBus, pciDev, pciFunc, gpu->deviceId); } + else + { + FF_DEBUG("Failed to get PCI address"); + } + } + else + { + FF_DEBUG("Failed to get PCI bus number"); } uint64_t adapterLuid = 0; FF_HKEY_AUTO_DESTROY hVideoIdKey = NULL; + + wchar_t buffer[256]; + ULONG bufferLen = 0; if (CM_Open_DevNode_Key(devInst, KEY_QUERY_VALUE, 0, RegDisposition_OpenExisting, &hVideoIdKey, CM_REGISTRY_HARDWARE) == CR_SUCCESS) { + FF_DEBUG("Opened device node registry key"); bufferLen = sizeof(buffer); if (RegGetValueW(hVideoIdKey, NULL, L"VideoID", RRF_RT_REG_SZ, NULL, buffer, &bufferLen) == ERROR_SUCCESS && bufferLen == (FF_GUID_STRLEN + 1) * sizeof(wchar_t)) { + FF_DEBUG("Found VideoID: %ls", buffer); wmemcpy(regDirectxKey + regDirectxKeyPrefixLength, buffer, FF_GUID_STRLEN); FF_HKEY_AUTO_DESTROY hDirectxKey = NULL; if (ffRegOpenKeyForRead(HKEY_LOCAL_MACHINE, regDirectxKey, &hDirectxKey, NULL)) { + FF_DEBUG("Opened DirectX registry key"); + if (gpu->vendor.length == 0) { uint32_t vendorId = 0; if(ffRegReadUint(hDirectxKey, L"VendorId", &vendorId, NULL) && vendorId) + { + FF_DEBUG("Found vendor ID from DirectX registry: 0x%x", vendorId); ffStrbufSetStatic(&gpu->vendor, ffGPUGetVendorString(vendorId)); + } } - ffRegReadStrbuf(hDirectxKey, L"Description", &gpu->name, NULL); + if (ffRegReadStrbuf(hDirectxKey, L"Description", &gpu->name, NULL)) + FF_DEBUG("Found GPU description: %s", gpu->name.chars); + + if (ffRegReadUint64(hDirectxKey, L"DedicatedVideoMemory", &gpu->dedicated.total, NULL)) + FF_DEBUG("Found dedicated video memory: %llu bytes", gpu->dedicated.total); - ffRegReadUint64(hDirectxKey, L"DedicatedVideoMemory", &gpu->dedicated.total, NULL); if (ffRegReadUint64(hDirectxKey, L"DedicatedSystemMemory", &gpu->shared.total, NULL)) { + FF_DEBUG("Found dedicated system memory: %llu bytes", gpu->shared.total); uint64_t sharedSystemMemory = 0; if (ffRegReadUint64(hDirectxKey, L"SharedSystemMemory", &sharedSystemMemory, NULL)) + { gpu->shared.total += sharedSystemMemory; + FF_DEBUG("Added shared system memory: %llu bytes, total shared: %llu bytes", sharedSystemMemory, gpu->shared.total); + } } if (ffRegReadUint64(hDirectxKey, L"AdapterLuid", &adapterLuid, NULL)) { + FF_DEBUG("Found adapter LUID: %llu", adapterLuid); if (!gpu->deviceId) gpu->deviceId = adapterLuid; } uint32_t featureLevel = 0; if(ffRegReadUint(hDirectxKey, L"MaxD3D12FeatureLevel", &featureLevel, NULL) && featureLevel) + { + FF_DEBUG("Found D3D12 feature level: 0x%x", featureLevel); ffStrbufSetF(&gpu->platformApi, "Direct3D 12.%u", (featureLevel & 0x0F00) >> 8); + } else if(ffRegReadUint(hDirectxKey, L"MaxD3D11FeatureLevel", &featureLevel, NULL) && featureLevel) + { + FF_DEBUG("Found D3D11 feature level: 0x%x", featureLevel); ffStrbufSetF(&gpu->platformApi, "Direct3D 11.%u", (featureLevel & 0x0F00) >> 8); + } uint64_t driverVersion = 0; if(ffRegReadUint64(hDirectxKey, L"DriverVersion", &driverVersion, NULL) && driverVersion) { + FF_DEBUG("Found driver version: %llu", driverVersion); ffStrbufSetF(&gpu->driver, "%u.%u.%u.%u", (unsigned) (driverVersion >> 48) & 0xFFFF, (unsigned) (driverVersion >> 32) & 0xFFFF, @@ -133,21 +192,38 @@ const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist* ); } } + else + { + FF_DEBUG("Failed to open DirectX registry key"); + } } + else + { + FF_DEBUG("Failed to get VideoID or invalid buffer length"); + } + } + else + { + FF_DEBUG("Failed to open device node registry key"); } if (gpu->vendor.length == 0 || gpu->name.length == 0) { + FF_DEBUG("Trying fallback registry method for vendor/name"); bufferLen = sizeof(buffer); if (CM_Get_DevNode_Registry_PropertyW(devInst, CM_DRP_DRIVER, NULL, buffer, &bufferLen, 0) == CR_SUCCESS && bufferLen == (FF_GUID_STRLEN + strlen("\\0000") + 1) * 2) { + FF_DEBUG("Found driver GUID: %ls", buffer); wmemcpy(regDriverKey + regDriverKeyPrefixLength, buffer, FF_GUID_STRLEN + strlen("\\0000")); FF_HKEY_AUTO_DESTROY hRegDriverKey = NULL; if (ffRegOpenKeyForRead(HKEY_LOCAL_MACHINE, regDriverKey, &hRegDriverKey, NULL)) { + FF_DEBUG("Opened driver registry key"); + if (gpu->vendor.length == 0 && ffRegReadStrbuf(hRegDriverKey, L"ProviderName", &gpu->vendor, NULL)) { + FF_DEBUG("Found provider name: %s", gpu->vendor.chars); if (ffStrbufContainS(&gpu->vendor, "Intel")) ffStrbufSetStatic(&gpu->vendor, FF_GPU_VENDOR_NAME_INTEL); else if (ffStrbufContainS(&gpu->vendor, "NVIDIA")) @@ -155,20 +231,35 @@ const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist* else if (ffStrbufContainS(&gpu->vendor, "AMD") || ffStrbufContainS(&gpu->vendor, "ATI")) ffStrbufSetStatic(&gpu->vendor, FF_GPU_VENDOR_NAME_AMD); } - if (gpu->name.length == 0) - ffRegReadStrbuf(hRegDriverKey, L"DriverDesc", &gpu->name, NULL); - if (gpu->driver.length == 0) - ffRegReadStrbuf(hRegDriverKey, L"DriverVersion", &gpu->driver, NULL); + if (gpu->name.length == 0 && ffRegReadStrbuf(hRegDriverKey, L"DriverDesc", &gpu->name, NULL)) + FF_DEBUG("Found driver description: %s", gpu->name.chars); + if (gpu->driver.length == 0 && ffRegReadStrbuf(hRegDriverKey, L"DriverVersion", &gpu->driver, NULL)) + FF_DEBUG("Found driver version: %s", gpu->driver.chars); if (gpu->dedicated.total == FF_GPU_VMEM_SIZE_UNSET) { if (!ffRegReadUint64(hRegDriverKey, L"HardwareInformation.qwMemorySize", &gpu->dedicated.total, NULL)) { uint32_t memorySize = 0; if (ffRegReadUint(hRegDriverKey, L"HardwareInformation.MemorySize", &memorySize, NULL)) + { gpu->dedicated.total = memorySize; + FF_DEBUG("Found memory size from hardware info: %u bytes", memorySize); + } + } + else + { + FF_DEBUG("Found qwMemorySize from hardware info: %llu bytes", gpu->dedicated.total); } } } + else + { + FF_DEBUG("Failed to open driver registry key"); + } + } + else + { + FF_DEBUG("Failed to get driver GUID or invalid buffer length"); } } @@ -177,6 +268,7 @@ const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist* if (options->driverSpecific && getDriverSpecificDetectionFn(gpu->vendor.chars, &detectFn, &dllName)) { + FF_DEBUG("Calling driver-specific detection function for vendor: %s, DLL: %s", gpu->vendor.chars, dllName); detectFn( &(FFGpuDriverCondition) { .type = (deviceId > 0 ? FF_GPU_DRIVER_CONDITION_TYPE_DEVICE_ID : 0) @@ -210,17 +302,31 @@ const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist* }, dllName ); + FF_DEBUG("Driver-specific detection completed"); + } + else if (options->driverSpecific) + { + FF_DEBUG("No driver-specific detection function found for vendor: %s", gpu->vendor.chars); } if (!gpu->name.length) { + FF_DEBUG("Trying to get device description as fallback"); bufferLen = sizeof(buffer); if (CM_Get_DevNode_Registry_PropertyW(devInst, CM_DRP_DEVICEDESC, NULL, buffer, &bufferLen, 0) == CR_SUCCESS) + { ffStrbufSetWS(&gpu->name, buffer); + FF_DEBUG("Found device description: %s", gpu->name.chars); + } + else + { + FF_DEBUG("Failed to get device description"); + } } if (gpu->type == FF_GPU_TYPE_UNKNOWN && adapterLuid > 0) { + FF_DEBUG("Trying to determine GPU type using D3DKMT APIs"); HMODULE hgdi32 = GetModuleHandleW(L"gdi32.dll"); if (hgdi32) { @@ -230,6 +336,8 @@ const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist* D3DKMT_OPENADAPTERFROMLUID openAdapterFromLuid = { .AdapterLuid = *(LUID*)&adapterLuid }; if (NT_SUCCESS(ffD3DKMTOpenAdapterFromLuid(&openAdapterFromLuid))) { + FF_DEBUG("Successfully opened adapter from LUID"); + D3DKMT_ADAPTERTYPE adapterType = {}; D3DKMT_QUERYADAPTERINFO queryAdapterInfo = { .hAdapter = openAdapterFromLuid.hAdapter, @@ -239,14 +347,20 @@ const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist* }; if (NT_SUCCESS(D3DKMTQueryAdapterInfo(&queryAdapterInfo))) // Vista and later { + FF_DEBUG("Queried adapter type - HybridDiscrete: %d, HybridIntegrated: %d", adapterType.HybridDiscrete, adapterType.HybridIntegrated); if (adapterType.HybridDiscrete) gpu->type = FF_GPU_TYPE_DISCRETE; else if (adapterType.HybridIntegrated) gpu->type = FF_GPU_TYPE_INTEGRATED; } + else + { + FF_DEBUG("Failed to query adapter type"); + } if (gpu->frequency == FF_GPU_FREQUENCY_UNSET) { + FF_DEBUG("Trying to get GPU frequency information"); for (ULONG nodeIdx = 0; ; nodeIdx++) { D3DKMT_NODEMETADATA nodeMetadata = { @@ -258,8 +372,16 @@ const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist* .pPrivateDriverData = &nodeMetadata, .PrivateDriverDataSize = sizeof(nodeMetadata), }; - if (!NT_SUCCESS(D3DKMTQueryAdapterInfo(&queryAdapterInfo))) break; // Windows 10 and later - if (nodeMetadata.NodeData.EngineType != DXGK_ENGINE_TYPE_3D) continue; + if (!NT_SUCCESS(D3DKMTQueryAdapterInfo(&queryAdapterInfo))) + { + FF_DEBUG("No more nodes to query (index %lu)", nodeIdx); + break; // Windows 10 and later + } + if (nodeMetadata.NodeData.EngineType != DXGK_ENGINE_TYPE_3D) + { + FF_DEBUG("Skipping node %lu (not 3D engine)", nodeIdx); + continue; + } D3DKMT_QUERYSTATISTICS queryStatistics = { .Type = D3DKMT_QUERYSTATISTICS_NODE2, @@ -269,18 +391,29 @@ const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist* if (NT_SUCCESS(D3DKMTQueryStatistics(&queryStatistics))) // Windows 11 (22H2) and later { gpu->frequency = (uint32_t) (queryStatistics.QueryResult.NodeInformation.NodePerfData.MaxFrequency / 1000 / 1000); + FF_DEBUG("Found GPU frequency: %u MHz", gpu->frequency); break; } + else + { + FF_DEBUG("Failed to query node statistics for node %lu", nodeIdx); + } } } D3DKMT_CLOSEADAPTER closeAdapter = { .hAdapter = openAdapterFromLuid.hAdapter }; (void) D3DKMTCloseAdapter(&closeAdapter); openAdapterFromLuid.hAdapter = 0; + FF_DEBUG("Closed adapter handle"); + } + else + { + FF_DEBUG("Failed to open adapter from LUID"); } if (options->temp && gpu->temperature != gpu->temperature) { + FF_DEBUG("Trying to get GPU temperature"); D3DKMT_QUERYSTATISTICS queryStatistics = { .Type = D3DKMT_QUERYSTATISTICS_PHYSICAL_ADAPTER, .AdapterLuid = *(LUID*)&adapterLuid, @@ -288,20 +421,49 @@ const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist* }; if (NT_SUCCESS(D3DKMTQueryStatistics(&queryStatistics)) && queryStatistics.QueryResult.PhysAdapterInformation.AdapterPerfData.Temperature != 0) + { gpu->temperature = queryStatistics.QueryResult.PhysAdapterInformation.AdapterPerfData.Temperature / 10.0; + FF_DEBUG("Found GPU temperature: %.1f°C", gpu->temperature); + } + else + { + FF_DEBUG("Failed to get GPU temperature or temperature is 0"); + } } } + else + { + FF_DEBUG("D3DKMTOpenAdapterFromLuid not available"); + } + } + else + { + FF_DEBUG("Failed to get gdi32.dll module handle"); } } if (gpu->type == FF_GPU_TYPE_UNKNOWN) { + FF_DEBUG("Using fallback GPU type detection"); if (gpu->vendor.chars == FF_GPU_VENDOR_NAME_INTEL) + { gpu->type = gpu->deviceId == 20 ? FF_GPU_TYPE_INTEGRATED : FF_GPU_TYPE_DISCRETE; + FF_DEBUG("Intel GPU type determined: %s", gpu->type == FF_GPU_TYPE_INTEGRATED ? "Integrated" : "Discrete"); + } else if (gpu->dedicated.total != FF_GPU_VMEM_SIZE_UNSET) + { gpu->type = gpu->dedicated.total >= 1024 * 1024 * 1024 ? FF_GPU_TYPE_DISCRETE : FF_GPU_TYPE_INTEGRATED; + FF_DEBUG("GPU type determined by memory size (%llu bytes): %s", gpu->dedicated.total, gpu->type == FF_GPU_TYPE_DISCRETE ? "Discrete" : "Integrated"); + } + else + { + FF_DEBUG("Unable to determine GPU type"); + } } + + FF_DEBUG("Completed processing GPU #%d - Vendor: %s, Name: %s, Type: %d", deviceCount, gpu->vendor.chars, gpu->name.chars, gpu->type); } + FF_DEBUG("GPU detection completed, found %d devices", deviceCount); return NULL; } From 7446828866ca4ec2c7575b3e356437cbe1d05580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 13 Aug 2025 15:59:19 +0800 Subject: [PATCH 73/83] GPU (macOS): don't set `platformApi` to `Metal` when Metal API is not used --- src/detection/gpu/gpu_apple.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/detection/gpu/gpu_apple.c b/src/detection/gpu/gpu_apple.c index 026f9acad..bad4f9293 100644 --- a/src/detection/gpu/gpu_apple.c +++ b/src/detection/gpu/gpu_apple.c @@ -1,6 +1,4 @@ #include "gpu.h" -#include "common/library.h" -#include "detection/cpu/cpu.h" #include "util/apple/cf_helpers.h" #include "util/apple/smc_temps.h" @@ -109,7 +107,7 @@ const char* ffDetectGPUImpl(const FFGPUOptions* options, FFlist* gpus) gpu->type = FF_GPU_TYPE_UNKNOWN; gpu->frequency = FF_GPU_FREQUENCY_UNSET; IORegistryEntryGetRegistryEntryID(registryEntry, &gpu->deviceId); - ffStrbufInitStatic(&gpu->platformApi, "Metal"); + ffStrbufInitStatic(&gpu->platformApi, "IOKit"); ffStrbufInit(&gpu->driver); // Ok for both Apple and Intel ffCfDictGetString(properties, CFSTR("CFBundleIdentifier"), &gpu->driver); From 61f28239032e82dfdeced61d8e195404612ed4cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 14 Aug 2025 09:47:14 +0800 Subject: [PATCH 74/83] Global: fixes `-ffast-math` compatibility Unifies unset double handling using `-DBL_MAX` sentinel Fixes #1894 --- src/common/format.c | 4 ++-- src/common/percent.c | 6 ++--- src/common/temps.c | 2 +- src/detection/battery/battery.h | 2 +- src/detection/battery/battery_android.c | 7 +++--- src/detection/battery/battery_linux.c | 8 +++++-- src/detection/battery/battery_windows.c | 2 +- src/detection/brightness/brightness_linux.c | 4 ++-- src/detection/cpu/cpu.h | 2 +- src/detection/cpu/cpu_linux.c | 23 +++++++++++-------- src/detection/gpu/gpu.h | 4 ++-- src/detection/gpu/gpu_windows.c | 2 +- src/detection/physicaldisk/physicaldisk.h | 2 +- .../poweradapter/poweradapter_linux.c | 4 ++-- .../terminalfont/terminalfont_windows.c | 2 +- src/detection/wifi/wifi_android.c | 6 ++--- src/detection/wifi/wifi_apple.m | 12 +++++----- src/detection/wifi/wifi_bsd.c | 6 ++--- src/detection/wifi/wifi_linux.c | 14 +++++------ src/detection/wifi/wifi_nbsd.c | 6 ++--- src/detection/wifi/wifi_obsd.c | 6 ++--- src/detection/wifi/wifi_windows.c | 6 ++--- src/detection/zpool/zpool_linux.c | 2 +- src/modules/battery/battery.c | 7 ++++-- src/modules/cpu/cpu.c | 7 ++++-- src/modules/gpu/gpu.c | 16 +++++++++---- src/modules/physicaldisk/physicaldisk.c | 7 ++++-- src/modules/wifi/wifi.c | 19 +++++++++++---- src/modules/zpool/zpool.c | 5 +++- src/util/FFstrbuf.c | 4 ++-- src/util/FFstrbuf.h | 2 +- src/util/windows/wmi.cpp | 2 +- tests/strbuf.c | 2 +- 33 files changed, 119 insertions(+), 84 deletions(-) diff --git a/src/common/format.c b/src/common/format.c index fa9199204..d2ec98178 100644 --- a/src/common/format.c +++ b/src/common/format.c @@ -113,8 +113,8 @@ static inline void appendInvalidPlaceholder(FFstrbuf* buffer, const char* start, static inline bool formatArgSet(const FFformatarg* arg) { return arg->value != NULL && ( - (arg->type == FF_FORMAT_ARG_TYPE_DOUBLE && *(double*)arg->value > 0.0) || //Also is false for NaN - (arg->type == FF_FORMAT_ARG_TYPE_FLOAT && *(float*)arg->value > 0.0) || //Also is false for NaN + (arg->type == FF_FORMAT_ARG_TYPE_DOUBLE && *(double*)arg->value > 0.0) || + (arg->type == FF_FORMAT_ARG_TYPE_FLOAT && *(float*)arg->value > 0.0) || (arg->type == FF_FORMAT_ARG_TYPE_INT && *(int*)arg->value > 0) || (arg->type == FF_FORMAT_ARG_TYPE_STRBUF && ((FFstrbuf*)arg->value)->length > 0) || (arg->type == FF_FORMAT_ARG_TYPE_STRING && ffStrSet((char*)arg->value)) || diff --git a/src/common/percent.c b/src/common/percent.c index f10bea32f..e14c62a8d 100644 --- a/src/common/percent.c +++ b/src/common/percent.c @@ -72,9 +72,9 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFPercentageModuleConf ffStrbufAppend(buffer, &options->barBorderLeft); } - if (percent != percent) + if (percent == -DBL_MAX) { - // No color config for NaN, use total color for simplification + // Use total color for simplification if(!options->pipe && options->barColorTotal.length > 0) ffStrbufAppendS(buffer, "\e[" FF_COLOR_FG_LIGHT_BLACK "m"); @@ -187,7 +187,7 @@ void ffPercentAppendNum(FFstrbuf* buffer, double percent, FFPercentageModuleConf const char* colorYellow = options->percentColorYellow.chars; const char* colorRed = options->percentColorRed.chars; - if(percent != percent) + if(percent == -DBL_MAX) ffStrbufAppendS(buffer, "\e[" FF_COLOR_FG_LIGHT_BLACK "m"); else if(green <= yellow) { diff --git a/src/common/temps.c b/src/common/temps.c index 002ee6f48..d524a79a1 100644 --- a/src/common/temps.c +++ b/src/common/temps.c @@ -5,7 +5,7 @@ void ffTempsAppendNum(double celsius, FFstrbuf* buffer, FFColorRangeConfig config, const FFModuleArgs* module) { - if (celsius != celsius) // ignores NaN + if (celsius == -DBL_MAX) // ignores invalid value return; const FFOptionsDisplay* options = &instance.config.display; diff --git a/src/detection/battery/battery.h b/src/detection/battery/battery.h index 807ccdf0d..ddeb7c6e7 100644 --- a/src/detection/battery/battery.h +++ b/src/detection/battery/battery.h @@ -3,7 +3,7 @@ #include "fastfetch.h" #include "modules/battery/option.h" -#define FF_BATTERY_TEMP_UNSET (0/0.0) +#define FF_BATTERY_TEMP_UNSET (-DBL_MAX) typedef struct FFBatteryResult { diff --git a/src/detection/battery/battery_android.c b/src/detection/battery/battery_android.c index da2cb8f21..26b8e571d 100644 --- a/src/detection/battery/battery_android.c +++ b/src/detection/battery/battery_android.c @@ -96,6 +96,7 @@ static const char* parseDumpsys(FFBatteryOptions* options, FFlist* results) battery->temperature = FF_BATTERY_TEMP_UNSET; battery->cycleCount = 0; battery->timeRemaining = -1; + battery->capacity = 0; ffStrbufInit(&battery->manufacturer); ffStrbufInit(&battery->modelName); ffStrbufInit(&battery->status); @@ -124,11 +125,11 @@ static const char* parseDumpsys(FFBatteryOptions* options, FFlist* results) { double level = 0, scale = 0; if (ffParsePropLines(start, "level: ", &temp)) - level = ffStrbufToDouble(&temp); + level = ffStrbufToDouble(&temp, -DBL_MAX); ffStrbufClear(&temp); if (ffParsePropLines(start, "scale: ", &temp)) - scale = ffStrbufToDouble(&temp); + scale = ffStrbufToDouble(&temp, -DBL_MAX); ffStrbufClear(&temp); if (level > 0 && scale > 0) @@ -138,7 +139,7 @@ static const char* parseDumpsys(FFBatteryOptions* options, FFlist* results) if(options->temp) { if (ffParsePropLines(start, "temperature: ", &temp)) - battery->temperature = ffStrbufToDouble(&temp); + battery->temperature = ffStrbufToDouble(&temp, FF_BATTERY_TEMP_UNSET); ffStrbufClear(&temp); } diff --git a/src/detection/battery/battery_linux.c b/src/detection/battery/battery_linux.c index 8a9b2c641..d6987bc35 100644 --- a/src/detection/battery/battery_linux.c +++ b/src/detection/battery/battery_linux.c @@ -45,7 +45,7 @@ static void parseBattery(int dfd, const char* id, FFBatteryOptions* options, FFl return; FFBatteryResult* result = ffListAdd(results); - result->capacity = ffStrbufToDouble(&tmpBuffer); + result->capacity = ffStrbufToDouble(&tmpBuffer, 0); //At this point, we have a battery. Try to get as much values as possible. @@ -154,7 +154,11 @@ static void parseBattery(int dfd, const char* id, FFBatteryOptions* options, FFl if (options->temp) { if (ffReadFileBufferRelative(dfd, "temp", &tmpBuffer)) - result->temperature = ffStrbufToDouble(&tmpBuffer) / 10; + { + result->temperature = ffStrbufToDouble(&tmpBuffer, FF_BATTERY_TEMP_UNSET); + if (result->temperature != FF_BATTERY_TEMP_UNSET) + result->temperature /= 10; + } } } diff --git a/src/detection/battery/battery_windows.c b/src/detection/battery/battery_windows.c index dde78d217..9730664a0 100644 --- a/src/detection/battery/battery_windows.c +++ b/src/detection/battery/battery_windows.c @@ -103,7 +103,7 @@ static const char* detectWithCmApi(FFBatteryOptions* options, FFlist* results) battery->cycleCount = bi.CycleCount; - battery->temperature = 0.0/0.0; + battery->temperature = FF_BATTERY_TEMP_UNSET; if(options->temp) { bqi.InformationLevel = BatteryTemperature; diff --git a/src/detection/brightness/brightness_linux.c b/src/detection/brightness/brightness_linux.c index 602649c3c..678c89a6a 100644 --- a/src/detection/brightness/brightness_linux.c +++ b/src/detection/brightness/brightness_linux.c @@ -32,7 +32,7 @@ static const char* detectWithBacklight(FFlist* result) ffStrbufAppendS(&backlightDir, "/brightness"); if(ffReadFileBuffer(backlightDir.chars, &buffer)) { - double actualBrightness = ffStrbufToDouble(&buffer); + double actualBrightness = ffStrbufToDouble(&buffer, 0); ffStrbufSubstrBefore(&backlightDir, backlightDirLength); ffStrbufAppendS(&backlightDir, entry->d_name); ffStrbufAppendS(&backlightDir, "/max_brightness"); @@ -71,7 +71,7 @@ static const char* detectWithBacklight(FFlist* result) } else ffStrbufInitS(&brightness->name, entry->d_name); - brightness->max = ffStrbufToDouble(&buffer); + brightness->max = ffStrbufToDouble(&buffer, 0); brightness->min = 0; brightness->current = actualBrightness; brightness->builtin = true; diff --git a/src/detection/cpu/cpu.h b/src/detection/cpu/cpu.h index 06ce87f9f..4f07b9779 100644 --- a/src/detection/cpu/cpu.h +++ b/src/detection/cpu/cpu.h @@ -3,7 +3,7 @@ #include "fastfetch.h" #include "modules/cpu/option.h" -#define FF_CPU_TEMP_UNSET (0/0.0) +#define FF_CPU_TEMP_UNSET (-DBL_MAX) typedef struct FFCPUCore { diff --git a/src/detection/cpu/cpu_linux.c b/src/detection/cpu/cpu_linux.c index 46ab37b78..411c1f0d5 100644 --- a/src/detection/cpu/cpu_linux.c +++ b/src/detection/cpu/cpu_linux.c @@ -28,19 +28,19 @@ static double parseHwmonDir(FFstrbuf* dir, FFstrbuf* buffer) ffStrbufAppendS(dir, "temp1_input"); if(!ffReadFileBuffer(dir->chars, buffer)) - return 0.0/0.0; + return FF_CPU_TEMP_UNSET; } ffStrbufSubstrBefore(dir, dirLength); - double value = ffStrbufToDouble(buffer);// millidegree Celsius + double value = ffStrbufToDouble(buffer, FF_CPU_TEMP_UNSET);// millidegree Celsius - if(value != value) - return 0.0/0.0; + if(value == FF_CPU_TEMP_UNSET) + return FF_CPU_TEMP_UNSET; ffStrbufAppendS(dir, "name"); if (!ffReadFileBuffer(dir->chars, buffer)) - return 0.0/0.0; + return FF_CPU_TEMP_UNSET; ffStrbufTrimRightSpace(buffer); @@ -51,14 +51,17 @@ static double parseHwmonDir(FFstrbuf* dir, FFstrbuf* buffer) ffStrbufEqualS(buffer, "coretemp") // Intel ) return value / 1000.; - return 0.0/0.0; + return FF_CPU_TEMP_UNSET; } static double detectTZTemp(FFstrbuf* buffer) { if (ffReadFileBuffer("/sys/class/thermal/thermal_zone0/temp", buffer)) - return ffStrbufToDouble(buffer) / 1000.; - return 0.0/0.0; + { + double value = ffStrbufToDouble(buffer, FF_CPU_TEMP_UNSET);// millidegree Celsius + return value != FF_CPU_TEMP_UNSET ? value / 1000. : FF_CPU_TEMP_UNSET; + } + return FF_CPU_TEMP_UNSET; } static double detectCPUTemp(void) @@ -72,7 +75,7 @@ static double detectCPUTemp(void) FF_AUTO_CLOSE_DIR DIR* dirp = opendir(baseDir.chars); if(dirp == NULL) - return 0.0/0.0; + return FF_CPU_TEMP_UNSET; struct dirent* entry; while((entry = readdir(dirp)) != NULL) @@ -84,7 +87,7 @@ static double detectCPUTemp(void) ffStrbufAppendC(&baseDir, '/'); double result = parseHwmonDir(&baseDir, &buffer); - if (result == result) + if (result != FF_CPU_TEMP_UNSET) return result; ffStrbufSubstrBefore(&baseDir, baseDirLength); diff --git a/src/detection/gpu/gpu.h b/src/detection/gpu/gpu.h index 7d641a0a0..bad28d928 100644 --- a/src/detection/gpu/gpu.h +++ b/src/detection/gpu/gpu.h @@ -3,11 +3,11 @@ #include "fastfetch.h" #include "modules/gpu/option.h" -#define FF_GPU_TEMP_UNSET (0/0.0) +#define FF_GPU_TEMP_UNSET (-DBL_MAX) #define FF_GPU_CORE_COUNT_UNSET -1 #define FF_GPU_VMEM_SIZE_UNSET ((uint64_t)-1) #define FF_GPU_FREQUENCY_UNSET 0 -#define FF_GPU_CORE_USAGE_UNSET (0/0.0) +#define FF_GPU_CORE_USAGE_UNSET (-DBL_MAX) #define FF_GPU_INDEX_UNSET ((uint32_t)-1) extern const char* FF_GPU_VENDOR_NAME_APPLE; diff --git a/src/detection/gpu/gpu_windows.c b/src/detection/gpu/gpu_windows.c index 0c4aea174..d32b60004 100644 --- a/src/detection/gpu/gpu_windows.c +++ b/src/detection/gpu/gpu_windows.c @@ -411,7 +411,7 @@ const char* ffDetectGPUImpl(FF_MAYBE_UNUSED const FFGPUOptions* options, FFlist* FF_DEBUG("Failed to open adapter from LUID"); } - if (options->temp && gpu->temperature != gpu->temperature) + if (options->temp && gpu->temperature == FF_GPU_TEMP_UNSET) { FF_DEBUG("Trying to get GPU temperature"); D3DKMT_QUERYSTATISTICS queryStatistics = { diff --git a/src/detection/physicaldisk/physicaldisk.h b/src/detection/physicaldisk/physicaldisk.h index 793d19975..d0b84d37e 100644 --- a/src/detection/physicaldisk/physicaldisk.h +++ b/src/detection/physicaldisk/physicaldisk.h @@ -1,7 +1,7 @@ #include "fastfetch.h" #include "modules/physicaldisk/option.h" -#define FF_PHYSICALDISK_TEMP_UNSET (0/0.0) +#define FF_PHYSICALDISK_TEMP_UNSET (-DBL_MAX) typedef enum __attribute__((__packed__)) FFPhysicalDiskType { diff --git a/src/detection/poweradapter/poweradapter_linux.c b/src/detection/poweradapter/poweradapter_linux.c index 2dd03e73c..0aba7e4dd 100644 --- a/src/detection/poweradapter/poweradapter_linux.c +++ b/src/detection/poweradapter/poweradapter_linux.c @@ -31,13 +31,13 @@ static void parsePowerAdapter(int dfd, FF_MAYBE_UNUSED const char* id, FFlist* r return; //input_power_limit must exist and be not empty - if (!ffReadFileBufferRelative(dfd, "input_power_limit", &tmpBuffer)) + if (!ffReadFileBufferRelative(dfd, "input_power_limit", &tmpBuffer) || tmpBuffer.length == 0) return; FFPowerAdapterResult* result = ffListAdd(results); ffStrbufInit(&result->name); ffStrbufInit(&result->description); - result->watts = (int) (ffStrbufToDouble(&tmpBuffer) / 1e6 + 0.5); + result->watts = (int) (ffStrbufToDouble(&tmpBuffer, 0) / 1e6 + 0.5); ffStrbufInit(&result->manufacturer); ffStrbufInit(&result->modelName); ffStrbufInit(&result->serial); diff --git a/src/detection/terminalfont/terminalfont_windows.c b/src/detection/terminalfont/terminalfont_windows.c index b6866a7b4..8c541603e 100644 --- a/src/detection/terminalfont/terminalfont_windows.c +++ b/src/detection/terminalfont/terminalfont_windows.c @@ -44,7 +44,7 @@ static inline void wrapYyjsonFree(yyjson_doc** doc) static const char* detectFromWTImpl(FFstrbuf* content, FFstrbuf* name, double* size) { - yyjson_doc* __attribute__((__cleanup__(wrapYyjsonFree))) doc = yyjson_read_opts(content->chars, content->length, YYJSON_READ_ALLOW_COMMENTS | YYJSON_READ_ALLOW_TRAILING_COMMAS | YYJSON_READ_ALLOW_INF_AND_NAN, NULL, NULL); + yyjson_doc* __attribute__((__cleanup__(wrapYyjsonFree))) doc = yyjson_read_opts(content->chars, content->length, YYJSON_READ_ALLOW_COMMENTS | YYJSON_READ_ALLOW_TRAILING_COMMAS, NULL, NULL); if (!doc) return "Failed to parse WT JSON config file"; diff --git a/src/detection/wifi/wifi_android.c b/src/detection/wifi/wifi_android.c index 92510afc2..e74a96b37 100644 --- a/src/detection/wifi/wifi_android.c +++ b/src/detection/wifi/wifi_android.c @@ -40,9 +40,9 @@ const char* ffDetectWifi(FFlist* result) ffStrbufInit(&item->conn.bssid); ffStrbufInit(&item->conn.protocol); ffStrbufInit(&item->conn.security); - item->conn.signalQuality = 0.0/0.0; - item->conn.rxRate = 0.0/0.0; - item->conn.txRate = 0.0/0.0; + item->conn.signalQuality = -DBL_MAX; + item->conn.rxRate = -DBL_MAX; + item->conn.txRate = -DBL_MAX; item->conn.channel = 0; item->conn.frequency = 0; diff --git a/src/detection/wifi/wifi_apple.m b/src/detection/wifi/wifi_apple.m index 4451eb6b8..02521294f 100644 --- a/src/detection/wifi/wifi_apple.m +++ b/src/detection/wifi/wifi_apple.m @@ -139,9 +139,9 @@ static const char* detectByWdutil(FFlist* result) ffStrbufInit(&item->conn.bssid); ffStrbufInit(&item->conn.protocol); ffStrbufInit(&item->conn.security); - item->conn.signalQuality = 0.0/0.0; - item->conn.rxRate = 0.0/0.0; - item->conn.txRate = 0.0/0.0; + item->conn.signalQuality = -DBL_MAX; + item->conn.rxRate = -DBL_MAX; + item->conn.txRate = -DBL_MAX; item->conn.channel = 0; item->conn.frequency = 0; @@ -245,9 +245,9 @@ static const char* detectByCoreWlan(FFlist* result) ffStrbufInit(&item->conn.bssid); ffStrbufInit(&item->conn.protocol); ffStrbufInit(&item->conn.security); - item->conn.signalQuality = 0.0/0.0; - item->conn.rxRate = 0.0/0.0; - item->conn.txRate = 0.0/0.0; + item->conn.signalQuality = -DBL_MAX; + item->conn.rxRate = -DBL_MAX; + item->conn.txRate = -DBL_MAX; item->conn.channel = 0; item->conn.frequency = 0; diff --git a/src/detection/wifi/wifi_bsd.c b/src/detection/wifi/wifi_bsd.c index 458957b6d..860b66bc2 100644 --- a/src/detection/wifi/wifi_bsd.c +++ b/src/detection/wifi/wifi_bsd.c @@ -35,9 +35,9 @@ const char* ffDetectWifi(FFlist* result) ffStrbufInit(&item->conn.bssid); ffStrbufInit(&item->conn.protocol); ffStrbufInit(&item->conn.security); - item->conn.signalQuality = 0.0/0.0; - item->conn.rxRate = 0.0/0.0; - item->conn.txRate = 0.0/0.0; + item->conn.signalQuality = -DBL_MAX; + item->conn.rxRate = -DBL_MAX; + item->conn.txRate = -DBL_MAX; item->conn.channel = 0; item->conn.frequency = 0; diff --git a/src/detection/wifi/wifi_linux.c b/src/detection/wifi/wifi_linux.c index 34c3d9f08..b76ebc82a 100644 --- a/src/detection/wifi/wifi_linux.c +++ b/src/detection/wifi/wifi_linux.c @@ -76,7 +76,7 @@ static const char* detectWifiWithNm(FFWifiResult* item, FFstrbuf* buffer) dbus.lib->ffdbus_message_unref(device); } - if (item->conn.txRate != item->conn.txRate) + if (item->conn.txRate == -DBL_MAX) { FF_DEBUG("Getting bitrate from NetworkManager"); uint32_t bitrate; @@ -162,7 +162,7 @@ static const char* detectWifiWithNm(FFWifiResult* item, FFstrbuf* buffer) } else if (ffStrEquals(key, "Strength")) { - if (item->conn.signalQuality != item->conn.signalQuality) + if (item->conn.signalQuality == -DBL_MAX) { FF_DEBUG("Found Strength property"); uint32_t strengthPercent; @@ -314,14 +314,14 @@ static const char* detectWifiWithIw(FFWifiResult* item, FFstrbuf* buffer) ffStrbufClear(buffer); if(ffParsePropLines(output.chars, "rx bitrate: ", buffer)) { - item->conn.rxRate = ffStrbufToDouble(buffer); + item->conn.rxRate = ffStrbufToDouble(buffer, -DBL_MAX); FF_DEBUG("RX bitrate: %.2f Mbps", item->conn.rxRate); } ffStrbufClear(buffer); if(ffParsePropLines(output.chars, "tx bitrate: ", buffer)) { - item->conn.txRate = ffStrbufToDouble(buffer); + item->conn.txRate = ffStrbufToDouble(buffer, -DBL_MAX); FF_DEBUG("TX bitrate: %.2f Mbps (raw: %s)", item->conn.txRate, buffer->chars); if(ffStrbufContainS(buffer, " EHT-MCS ")) @@ -548,9 +548,9 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED FFlist* result) ffStrbufInit(&item->conn.bssid); ffStrbufInit(&item->conn.protocol); ffStrbufInit(&item->conn.security); - item->conn.signalQuality = 0.0/0.0; - item->conn.rxRate = 0.0/0.0; - item->conn.txRate = 0.0/0.0; + item->conn.signalQuality = -DBL_MAX; + item->conn.rxRate = -DBL_MAX; + item->conn.txRate = -DBL_MAX; item->conn.channel = 0; item->conn.frequency = 0; diff --git a/src/detection/wifi/wifi_nbsd.c b/src/detection/wifi/wifi_nbsd.c index 6bb9df8ac..2f0db6523 100644 --- a/src/detection/wifi/wifi_nbsd.c +++ b/src/detection/wifi/wifi_nbsd.c @@ -45,9 +45,9 @@ const char* ffDetectWifi(FFlist* result) ffStrbufInit(&item->conn.bssid); ffStrbufInit(&item->conn.protocol); ffStrbufInit(&item->conn.security); - item->conn.signalQuality = 0.0/0.0; - item->conn.rxRate = 0.0/0.0; - item->conn.txRate = 0.0/0.0; + item->conn.signalQuality = -DBL_MAX; + item->conn.rxRate = -DBL_MAX; + item->conn.txRate = -DBL_MAX; item->conn.channel = 0; item->conn.frequency = 0; diff --git a/src/detection/wifi/wifi_obsd.c b/src/detection/wifi/wifi_obsd.c index 969df8780..f811b585c 100644 --- a/src/detection/wifi/wifi_obsd.c +++ b/src/detection/wifi/wifi_obsd.c @@ -35,9 +35,9 @@ const char* ffDetectWifi(FFlist* result) ffStrbufInit(&item->conn.bssid); ffStrbufInit(&item->conn.protocol); ffStrbufInit(&item->conn.security); - item->conn.signalQuality = 0.0/0.0; - item->conn.rxRate = 0.0/0.0; - item->conn.txRate = 0.0/0.0; + item->conn.signalQuality = -DBL_MAX; + item->conn.rxRate = -DBL_MAX; + item->conn.txRate = -DBL_MAX; item->conn.channel = 0; item->conn.frequency = 0; diff --git a/src/detection/wifi/wifi_windows.c b/src/detection/wifi/wifi_windows.c index f3128a9d1..e93b56d79 100644 --- a/src/detection/wifi/wifi_windows.c +++ b/src/detection/wifi/wifi_windows.c @@ -80,9 +80,9 @@ const char* ffDetectWifi(FFlist* result) ffStrbufInit(&item->conn.bssid); ffStrbufInit(&item->conn.protocol); ffStrbufInit(&item->conn.security); - item->conn.signalQuality = 0.0/0.0; - item->conn.rxRate = 0.0/0.0; - item->conn.txRate = 0.0/0.0; + item->conn.signalQuality = -DBL_MAX; + item->conn.rxRate = -DBL_MAX; + item->conn.txRate = -DBL_MAX; item->conn.channel = 0; item->conn.frequency = 0; diff --git a/src/detection/zpool/zpool_linux.c b/src/detection/zpool/zpool_linux.c index 6c28def6d..d03082bd2 100644 --- a/src/detection/zpool/zpool_linux.c +++ b/src/detection/zpool/zpool_linux.c @@ -74,7 +74,7 @@ static int enumZpoolCallback(zpool_handle_t* zpool, void* param) item->total = data->ffzpool_get_prop_int(zpool, ZPOOL_PROP_SIZE, &source); item->used = item->total - data->ffzpool_get_prop_int(zpool, ZPOOL_PROP_FREE, &source); uint64_t fragmentation = data->ffzpool_get_prop_int(zpool, ZPOOL_PROP_FRAGMENTATION, &source); - item->fragmentation = fragmentation == UINT64_MAX ? 0.0/0.0 : (double) fragmentation; + item->fragmentation = fragmentation == UINT64_MAX ? -DBL_MAX : (double) fragmentation; return 0; } diff --git a/src/modules/battery/battery.c b/src/modules/battery/battery.c index 75158bd86..99bf86873 100644 --- a/src/modules/battery/battery.c +++ b/src/modules/battery/battery.c @@ -72,7 +72,7 @@ static void printBattery(FFBatteryOptions* options, FFBatteryResult* result, uin ffStrbufAppend(&str, &result->status); } - if(result->temperature == result->temperature) //FF_BATTERY_TEMP_UNSET + if(result->temperature != FF_BATTERY_TEMP_UNSET) { if(str.length > 0) ffStrbufAppendS(&str, " - "); @@ -221,7 +221,10 @@ void ffGenerateBatteryJsonResult(FFBatteryOptions* options, yyjson_mut_doc* doc, yyjson_mut_obj_add_strbuf(doc, obj, "status", &battery->status); yyjson_mut_obj_add_strbuf(doc, obj, "technology", &battery->technology); yyjson_mut_obj_add_strbuf(doc, obj, "serial", &battery->serial); - yyjson_mut_obj_add_real(doc, obj, "temperature", battery->temperature); + if (battery->temperature != FF_BATTERY_TEMP_UNSET) + yyjson_mut_obj_add_real(doc, obj, "temperature", battery->temperature); + else + yyjson_mut_obj_add_null(doc, obj, "temperature"); yyjson_mut_obj_add_uint(doc, obj, "cycleCount", battery->cycleCount); if (battery->timeRemaining > 0) yyjson_mut_obj_add_int(doc, obj, "timeRemaining", battery->timeRemaining); diff --git a/src/modules/cpu/cpu.c b/src/modules/cpu/cpu.c index 23216f1f9..857cdd2ab 100644 --- a/src/modules/cpu/cpu.c +++ b/src/modules/cpu/cpu.c @@ -81,7 +81,7 @@ void ffPrintCPU(FFCPUOptions* options) ffFreqAppendNum(freq, &str); } - if(cpu.temperature == cpu.temperature) //FF_CPU_TEMP_UNSET + if(cpu.temperature != FF_CPU_TEMP_UNSET) { ffStrbufAppendS(&str, " - "); ffTempsAppendNum(cpu.temperature, &str, options->tempConfig, &options->moduleArgs); @@ -201,7 +201,10 @@ void ffGenerateCPUJsonResult(FFCPUOptions* options, yyjson_mut_doc* doc, yyjson_ yyjson_mut_obj_add_uint(doc, core, "freq", cpu.coreTypes[i].freq); } - yyjson_mut_obj_add_real(doc, obj, "temperature", cpu.temperature); + if (cpu.temperature != FF_CPU_TEMP_UNSET) + yyjson_mut_obj_add_real(doc, obj, "temperature", cpu.temperature); + else + yyjson_mut_obj_add_null(doc, obj, "temperature"); } ffStrbufDestroy(&cpu.name); diff --git a/src/modules/gpu/gpu.c b/src/modules/gpu/gpu.c index 22267ae35..d128ac6fb 100644 --- a/src/modules/gpu/gpu.c +++ b/src/modules/gpu/gpu.c @@ -46,7 +46,7 @@ static void printGPUResult(FFGPUOptions* options, uint8_t index, const FFGPUResu ffFreqAppendNum(gpu->frequency, &output); } - if(gpu->temperature == gpu->temperature) //FF_GPU_TEMP_UNSET + if(gpu->temperature != FF_GPU_TEMP_UNSET) { ffStrbufAppendS(&output, " - "); ffTempsAppendNum(gpu->temperature, &output, options->tempConfig, &options->moduleArgs); @@ -126,7 +126,7 @@ static void printGPUResult(FFGPUOptions* options, uint8_t index, const FFGPUResu FF_STRBUF_AUTO_DESTROY coreUsageNum = ffStrbufCreate(); FF_STRBUF_AUTO_DESTROY coreUsageBar = ffStrbufCreate(); - if (gpu->coreUsage == gpu->coreUsage) //FF_GPU_CORE_USAGE_UNSET + if (gpu->coreUsage != FF_GPU_CORE_USAGE_UNSET) { if (percentType & FF_PERCENTAGE_TYPE_NUM_BIT) ffPercentAppendNum(&coreUsageNum, gpu->coreUsage, options->percent, false, &options->moduleArgs); @@ -338,7 +338,10 @@ void ffGenerateGPUJsonResult(FFGPUOptions* options, yyjson_mut_doc* doc, yyjson_ else yyjson_mut_obj_add_null(doc, obj, "coreCount"); - yyjson_mut_obj_add_real(doc, obj, "coreUsage", gpu->coreUsage); + if (gpu->coreUsage != FF_GPU_CORE_USAGE_UNSET) + yyjson_mut_obj_add_real(doc, obj, "coreUsage", gpu->coreUsage); + else + yyjson_mut_obj_add_null(doc, obj, "coreUsage"); yyjson_mut_val* memoryObj = yyjson_mut_obj_add_obj(doc, obj, "memory"); @@ -371,7 +374,7 @@ void ffGenerateGPUJsonResult(FFGPUOptions* options, yyjson_mut_doc* doc, yyjson_ yyjson_mut_obj_add_strbuf(doc, obj, "driver", &gpu->driver); yyjson_mut_obj_add_strbuf(doc, obj, "name", &gpu->name); - if(gpu->temperature == gpu->temperature) //FF_GPU_TEMP_UNSET + if(gpu->temperature != FF_GPU_TEMP_UNSET) yyjson_mut_obj_add_real(doc, obj, "temperature", gpu->temperature); else yyjson_mut_obj_add_null(doc, obj, "temperature"); @@ -389,7 +392,10 @@ void ffGenerateGPUJsonResult(FFGPUOptions* options, yyjson_mut_doc* doc, yyjson_ yyjson_mut_obj_add_strbuf(doc, obj, "platformApi", &gpu->platformApi); - yyjson_mut_obj_add_uint(doc, obj, "frequency", gpu->frequency); + if (gpu->frequency != FF_GPU_FREQUENCY_UNSET) + yyjson_mut_obj_add_uint(doc, obj, "frequency", gpu->frequency); + else + yyjson_mut_obj_add_null(doc, obj, "frequency"); yyjson_mut_obj_add_uint(doc, obj, "deviceId", gpu->deviceId); } diff --git a/src/modules/physicaldisk/physicaldisk.c b/src/modules/physicaldisk/physicaldisk.c index 601ecd723..72ffe85f0 100644 --- a/src/modules/physicaldisk/physicaldisk.c +++ b/src/modules/physicaldisk/physicaldisk.c @@ -92,7 +92,7 @@ void ffPrintPhysicalDisk(FFPhysicalDiskOptions* options) ffStrbufAppendC(&buffer, ']'); } - if (dev->temperature == dev->temperature) //FF_PHYSICALDISK_TEMP_UNSET + if (dev->temperature != FF_PHYSICALDISK_TEMP_UNSET) { if(buffer.length > 0) ffStrbufAppendS(&buffer, " - "); @@ -209,7 +209,10 @@ void ffGeneratePhysicalDiskJsonResult(FFPhysicalDiskOptions* options, yyjson_mut yyjson_mut_obj_add_strbuf(doc, obj, "revision", &dev->revision); - yyjson_mut_obj_add_real(doc, obj, "temperature", dev->temperature); + if (dev->temperature != FF_PHYSICALDISK_TEMP_UNSET) + yyjson_mut_obj_add_real(doc, obj, "temperature", dev->temperature); + else + yyjson_mut_obj_add_null(doc, obj, "temperature"); } FF_LIST_FOR_EACH(FFPhysicalDiskResult, dev, result) diff --git a/src/modules/wifi/wifi.c b/src/modules/wifi/wifi.c index a06cd1eda..69df42cf5 100644 --- a/src/modules/wifi/wifi.c +++ b/src/modules/wifi/wifi.c @@ -55,7 +55,7 @@ void ffPrintWifi(FFWifiOptions* options) FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate(); if(item->conn.ssid.length) { - if(item->conn.signalQuality == item->conn.signalQuality) + if(item->conn.signalQuality != -DBL_MAX) { if(percentType & FF_PERCENTAGE_TYPE_BAR_BIT) { @@ -86,7 +86,7 @@ void ffPrintWifi(FFWifiOptions* options) ffStrbufAppendC(&buffer, ' '); } - if(item->conn.signalQuality == item->conn.signalQuality) + if(item->conn.signalQuality != -DBL_MAX) { if(percentType & FF_PERCENTAGE_TYPE_NUM_BIT) ffPercentAppendNum(&buffer, item->conn.signalQuality, options->percent, buffer.length > 0, &options->moduleArgs); @@ -184,9 +184,18 @@ void ffGenerateWifiJsonResult(FF_MAYBE_UNUSED FFWifiOptions* options, yyjson_mut yyjson_mut_obj_add_strbuf(doc, conn, "bssid", &wifi->conn.bssid); yyjson_mut_obj_add_strbuf(doc, conn, "protocol", &wifi->conn.protocol); yyjson_mut_obj_add_strbuf(doc, conn, "security", &wifi->conn.security); - yyjson_mut_obj_add_real(doc, conn, "signalQuality", wifi->conn.signalQuality); - yyjson_mut_obj_add_real(doc, conn, "rxRate", wifi->conn.rxRate); - yyjson_mut_obj_add_real(doc, conn, "txRate", wifi->conn.txRate); + if (wifi->conn.signalQuality != -DBL_MAX) + yyjson_mut_obj_add_real(doc, conn, "signalQuality", wifi->conn.signalQuality); + else + yyjson_mut_obj_add_null(doc, conn, "signalQuality"); + if (wifi->conn.rxRate != -DBL_MAX) + yyjson_mut_obj_add_real(doc, conn, "rxRate", wifi->conn.rxRate); + else + yyjson_mut_obj_add_null(doc, conn, "rxRate"); + if (wifi->conn.txRate != -DBL_MAX) + yyjson_mut_obj_add_real(doc, conn, "txRate", wifi->conn.txRate); + else + yyjson_mut_obj_add_null(doc, conn, "txRate"); yyjson_mut_obj_add_uint(doc, conn, "channel", wifi->conn.channel); yyjson_mut_obj_add_uint(doc, conn, "frequency", wifi->conn.frequency); } diff --git a/src/modules/zpool/zpool.c b/src/modules/zpool/zpool.c index 7eefe0240..9efddacdb 100644 --- a/src/modules/zpool/zpool.c +++ b/src/modules/zpool/zpool.c @@ -151,7 +151,10 @@ void ffGenerateZpoolJsonResult(FF_MAYBE_UNUSED FFZpoolOptions* options, yyjson_m yyjson_mut_obj_add_uint(doc, obj, "used", zpool->used); yyjson_mut_obj_add_uint(doc, obj, "total", zpool->total); yyjson_mut_obj_add_uint(doc, obj, "version", zpool->version); - yyjson_mut_obj_add_real(doc, obj, "fragmentation", zpool->fragmentation); + if (zpool->fragmentation != -DBL_MAX) + yyjson_mut_obj_add_real(doc, obj, "fragmentation", zpool->fragmentation); + else + yyjson_mut_obj_add_null(doc, obj, "fragmentation"); } FF_LIST_FOR_EACH(FFZpoolResult, zpool, results) diff --git a/src/util/FFstrbuf.c b/src/util/FFstrbuf.c index 8a462aac6..6e0db579b 100644 --- a/src/util/FFstrbuf.c +++ b/src/util/FFstrbuf.c @@ -521,11 +521,11 @@ void ffStrbufPutTo(const FFstrbuf* strbuf, FILE* file) fputc('\n', file); } -double ffStrbufToDouble(const FFstrbuf* strbuf) +double ffStrbufToDouble(const FFstrbuf* strbuf, double defaultValue) { char* str_end; double result = strtod(strbuf->chars, &str_end); - return str_end == strbuf->chars ? 0.0/0.0 : result; + return str_end == strbuf->chars ? defaultValue : result; } uint64_t ffStrbufToUInt(const FFstrbuf* strbuf, uint64_t defaultValue) diff --git a/src/util/FFstrbuf.h b/src/util/FFstrbuf.h index a91ea8ee7..44498d3e9 100644 --- a/src/util/FFstrbuf.h +++ b/src/util/FFstrbuf.h @@ -84,7 +84,7 @@ bool ffStrbufEnsureEndsWithC(FFstrbuf* strbuf, char c); void ffStrbufWriteTo(const FFstrbuf* strbuf, FILE* file); void ffStrbufPutTo(const FFstrbuf* strbuf, FILE* file); -FF_C_NODISCARD double ffStrbufToDouble(const FFstrbuf* strbuf); +FF_C_NODISCARD double ffStrbufToDouble(const FFstrbuf* strbuf, double defaultValue); FF_C_NODISCARD int64_t ffStrbufToSInt(const FFstrbuf* strbuf, int64_t defaultValue); FF_C_NODISCARD uint64_t ffStrbufToUInt(const FFstrbuf* strbuf, uint64_t defaultValue); diff --git a/src/util/windows/wmi.cpp b/src/util/windows/wmi.cpp index 9f9a4384f..68d560013 100644 --- a/src/util/windows/wmi.cpp +++ b/src/util/windows/wmi.cpp @@ -230,7 +230,7 @@ bool FFWmiRecord::getReal(const wchar_t* key, double* real) case VT_R4: *real = vtProp.fltVal; break; case VT_R8: *real = vtProp.dblVal; break; case VT_BOOL: *real = vtProp.boolVal != VARIANT_FALSE; break; - default: *real = NAN; result = false; + default: *real = -DBL_MAX; result = false; } } return result; diff --git a/tests/strbuf.c b/tests/strbuf.c index 94addc466..456b9c330 100644 --- a/tests/strbuf.c +++ b/tests/strbuf.c @@ -136,7 +136,7 @@ int main(void) //toNumber - VERIFY(ffStrbufToDouble(&strbuf) == 123456789.0); + VERIFY(ffStrbufToDouble(&strbuf, -DBL_MAX) == 123456789.0); VERIFY(ffStrbufToUInt(&strbuf, 999) == 123456789); //countC From 78530b4e347d0343c69ad3288ed1cd22eb20e2bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 14 Aug 2025 10:20:05 +0800 Subject: [PATCH 75/83] Release: v2.50.0 --- CHANGELOG.md | 2 ++ CMakeLists.txt | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb4b15870..c26db9184 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,8 @@ Bugfixes: * Fix gpu driver detection when DRM is used (GPU, FreeBSD) * Fix default route detection on DragonFly BSD (LocalIP, DFBSD) * Fix lliurex detection (#1882, OS, Linux) +* Fix compatibility with `-ffast-math` (#1894) +* Fix physical GPU being ignored sometimes (#1896, GPU, Windows) Logos: * Add ObsidianOS (#1890) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b359e340..4c1fb94b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.12.0) # target_link_libraries with OBJECT libs & project homepage url project(fastfetch - VERSION 2.49.0 + VERSION 2.50.0 LANGUAGES C DESCRIPTION "Fast neofetch-like system information tool" HOMEPAGE_URL "https://github.com/fastfetch-cli/fastfetch" From 5d8edc0c8bbbf031c79c889bdfb5fb21c7c1f58a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 14 Aug 2025 10:26:51 +0800 Subject: [PATCH 76/83] Doc: update changelog [ci skip] --- CHANGELOG.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c26db9184..5043b6c4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ Changes: * Keys in JSON configuration files are now case-sensitive, as stated in v2.49.0 * This is a breaking change, but it should not affect most users as long as your config file passes JSON schema validation. -* All module config flags are removed, as stated in v2.49.0 +* All module config flags have been removed, as stated in v2.49.0 * Percent bar config `display.bar.*` options have been replaced with a more organized, nested object structure. * `display.bar.charElapsed` has been renamed to `display.bar.char.elapsed`. * `display.bar.charTotal` has been renamed to `display.bar.char.total`. @@ -11,29 +11,29 @@ Changes: * `display.bar.borderRight` has been renamed to `display.bar.border.right`. Features: -* Add `display.bar.border.{leftElapsed,rightElapsed}` for using border as parts of bar content. (#1875) +* Added `display.bar.border.{leftElapsed,rightElapsed}` for using border as parts of bar content. (#1875) * `display.bar.border: null` has been added as a shorthand to disable bar borders. -* Add `display.bar.color.{elapsed,total,border}` to customize the color of the elapsed, total and border sections of the percent bar. +* Added `display.bar.color.{elapsed,total,border}` to customize the color of the elapsed, total and border sections of the percent bar. * `display.bar.color: null` has been added as a shorthand to disable bar colors. -* Improve Bedrock linux detection (#1881, OS / Disk, Linux) -* Add command flag `--gen-config-full` which generates a JSON config file that contains all optional module options. -* Default IP address shown when `localip.showAllIPs` is not set is improved (LocalIP) +* Improved Bedrock linux detection (#1881, OS / Disk, Linux) +* Added command flag `--gen-config-full` which generates a JSON config file that contains all optional module options. +* Improved default IP address display when `localip.showAllIPs` is not set (LocalIP) * For IPv4, preferred source address (if detected) is shown - * For IPv6, first GUA or ULA that is not deprecated nor temporary is shown -* Support interface speed detection on SunOS (LocalIP, SunOS) -* Detect Xlibre (#1888, WM, Linux) -* Improve accuracy of color detection (Cursor, macOS) + * For IPv6, first GUA or ULA that is not deprecated or temporary is shown +* Added support for interface speed detection on SunOS (LocalIP, SunOS) +* Added detection for Xlibre (#1888, WM, Linux) +* Improved accuracy of color detection (Cursor, macOS) Bugfixes: -* Fix possible segfault when parsing color strings in JSON config (#1878) -* Fix gpu driver detection when DRM is used (GPU, FreeBSD) -* Fix default route detection on DragonFly BSD (LocalIP, DFBSD) -* Fix lliurex detection (#1882, OS, Linux) -* Fix compatibility with `-ffast-math` (#1894) -* Fix physical GPU being ignored sometimes (#1896, GPU, Windows) +* Fixed possible segfault when parsing color strings in JSON config (#1878) +* Fixed GPU driver detection when DRM is used (GPU, FreeBSD) +* Fixed default route detection on DragonFly BSD (LocalIP, DFBSD) +* Fixed lliurex detection (#1882, OS, Linux) +* Fixed compatibility with `-ffast-math` (#1894) +* Fixed physical GPU being ignored sometimes (#1896, GPU, Windows) Logos: -* Add ObsidianOS (#1890) +* Added ObsidianOS (#1890) # 2.49.0 From 9ebff9fd22804b326328ffef76646cb8812dc6be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 14 Aug 2025 10:42:15 +0800 Subject: [PATCH 77/83] Chore: removes undocumented flag `--load-config` --- CHANGELOG.md | 2 ++ src/fastfetch.c | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5043b6c4c..8021644dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ Changes: * `display.bar.charTotal` has been renamed to `display.bar.char.total`. * `display.bar.borderLeft` has been renamed to `display.bar.border.left`. * `display.bar.borderRight` has been renamed to `display.bar.border.right`. +* Undocumented flag `--load-config` has been removed + * `--config` or `-c` should be used instead. Features: * Added `display.bar.border.{leftElapsed,rightElapsed}` for using border as parts of bar content. (#1875) diff --git a/src/fastfetch.c b/src/fastfetch.c index b0c7b3367..b9362c10f 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -3,7 +3,6 @@ #include "common/init.h" #include "common/io/io.h" #include "common/jsonconfig.h" -#include "common/printing.h" #include "detection/version/version.h" #include "logo/logo.h" #include "util/stringUtils.h" @@ -609,7 +608,7 @@ static void parseCommand(FFdata* data, char* key, char* value) generateConfigFile(false, value, true); else if(ffStrEqualsIgnCase(key, "--gen-config-full-force")) generateConfigFile(true, value, true); - else if(ffStrEqualsIgnCase(key, "-c") || ffStrEqualsIgnCase(key, "--load-config") || ffStrEqualsIgnCase(key, "--config")) + else if(ffStrEqualsIgnCase(key, "-c") || ffStrEqualsIgnCase(key, "--config")) optionParseConfigFile(data, key, value); else if(ffStrEqualsIgnCase(key, "--format")) { From d4773212b738580c61026640f3519f76198a3ffa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 14 Aug 2025 10:50:39 +0800 Subject: [PATCH 78/83] Fastfetch: adds support for reading JSON config from stdin --- CHANGELOG.md | 2 ++ src/fastfetch.c | 27 +++++++++++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8021644dd..3181816c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Changes: * Keys in JSON configuration files are now case-sensitive, as stated in v2.49.0 * This is a breaking change, but it should not affect most users as long as your config file passes JSON schema validation. * All module config flags have been removed, as stated in v2.49.0 + * To configure modules at command line, `echo '{"modules": [{"type":"custom","format":"Hello Fastfetch!"}]}' | fastfetch -c -` should be used instead. * Percent bar config `display.bar.*` options have been replaced with a more organized, nested object structure. * `display.bar.charElapsed` has been renamed to `display.bar.char.elapsed`. * `display.bar.charTotal` has been renamed to `display.bar.char.total`. @@ -13,6 +14,7 @@ Changes: * `--config` or `-c` should be used instead. Features: +* Added support for reading JSON config from stdin using `--config -` or `-c -` * Added `display.bar.border.{leftElapsed,rightElapsed}` for using border as parts of bar content. (#1875) * `display.bar.border: null` has been added as a shorthand to disable bar borders. * Added `display.bar.color.{elapsed,total,border}` to customize the color of the elapsed, total and border sections of the percent bar. diff --git a/src/fastfetch.c b/src/fastfetch.c index b9362c10f..56818ca87 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -382,16 +382,25 @@ static bool parseJsoncFile(const char* path, bool strictJson) { yyjson_read_err error; - instance.state.configDoc = yyjson_read_file(path, strictJson ? 0 : YYJSON_READ_ALLOW_COMMENTS | YYJSON_READ_ALLOW_TRAILING_COMMAS, NULL, &error); + yyjson_read_flag flg = strictJson ? 0 : YYJSON_READ_ALLOW_COMMENTS | YYJSON_READ_ALLOW_TRAILING_COMMAS; + instance.state.configDoc = path + ? yyjson_read_file(path, flg, NULL, &error) + : yyjson_read_fp(stdin, flg, NULL, &error); if (!instance.state.configDoc) { if (error.code != YYJSON_READ_ERROR_FILE_OPEN) { - size_t row = 0, col = error.pos; - FF_STRBUF_AUTO_DESTROY content = ffStrbufCreate(); - if (ffAppendFileBuffer(path, &content)) - yyjson_locate_pos(content.chars, content.length, error.pos, &row, &col, NULL); - fprintf(stderr, "Error: failed to parse JSON config file `%s` at (%zu, %zu): %s\n", path, row, col, error.msg); + if (path) + { + size_t row = 0, col = error.pos; + FF_STRBUF_AUTO_DESTROY content = ffStrbufCreate(); + if (ffAppendFileBuffer(path, &content)) + yyjson_locate_pos(content.chars, content.length, error.pos, &row, &col, NULL); + fprintf(stderr, "Error: failed to parse JSON config file `%s` at (%zu, %zu): %s\n", path, row, col, error.msg); + } + else + fprintf(stderr, "Error: failed to parse JSON from stdin at %zu: %s\n", error.pos, error.msg); + exit(477); } return false; @@ -461,6 +470,12 @@ static void optionParseConfigFile(FFdata* data, const char* key, const char* val if (value[0] == '\0' || ffStrEqualsIgnCase(value, "none")) return; + if (value[0] == '-' && value[1] == '\0') + { + parseJsoncFile(NULL, false); + return; + } + //Try to load as an absolute path FF_STRBUF_AUTO_DESTROY absolutePath = ffStrbufCreateS(value); From e80bb480c496cc8d40342b97c2279a878fd1a59d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 14 Aug 2025 11:03:26 +0800 Subject: [PATCH 79/83] Doc: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3181816c1..987e190ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ Features: * Improved accuracy of color detection (Cursor, macOS) Bugfixes: +* Fixed custom object inherits key from previous custom object if key is blank (#1477) * Fixed possible segfault when parsing color strings in JSON config (#1878) * Fixed GPU driver detection when DRM is used (GPU, FreeBSD) * Fixed default route detection on DragonFly BSD (LocalIP, DFBSD) From 0fe3db419e45f1ad22e9e39b927dfb3b1e5f25f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 14 Aug 2025 13:30:02 +0800 Subject: [PATCH 80/83] Separator: honors FQDN settings in Title module --- src/common/init.c | 1 + src/fastfetch.h | 1 + src/modules/separator/separator.c | 3 +-- src/modules/title/title.c | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/common/init.c b/src/common/init.c index 078402aac..220dbae05 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -25,6 +25,7 @@ static void initState(FFstate* state) state->logoHeight = 0; state->keysHeight = 0; state->terminalLightTheme = false; + state->titleFqdn = false; ffPlatformInit(&state->platform); state->configDoc = NULL; diff --git a/src/fastfetch.h b/src/fastfetch.h index cf0c1bd9f..ea4d14621 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -49,6 +49,7 @@ typedef struct FFstate uint32_t logoHeight; uint32_t keysHeight; bool terminalLightTheme; + bool titleFqdn; FFPlatform platform; yyjson_doc* configDoc; diff --git a/src/modules/separator/separator.c b/src/modules/separator/separator.c index 0eec28119..4e31590c7 100644 --- a/src/modules/separator/separator.c +++ b/src/modules/separator/separator.c @@ -56,7 +56,6 @@ void ffPrintSeparator(FFSeparatorOptions* options) { setlocale(LC_CTYPE, ""); mbstate_t state = {}; - bool fqdn = true; // TODO: Make this configurable const FFPlatform* platform = &instance.state.platform; FF_AUTO_FREE wchar_t* wstr = malloc((max( @@ -64,7 +63,7 @@ void ffPrintSeparator(FFSeparatorOptions* options) uint32_t titleLength = 1 // @ + getWcsWidth(&platform->userName, wstr, &state) // user name - + (fqdn ? platform->hostName.length : ffStrbufFirstIndexC(&platform->hostName, '.')); // host name + + (instance.state.titleFqdn ? platform->hostName.length : ffStrbufFirstIndexC(&platform->hostName, '.')); // host name if(__builtin_expect(options->string.length == 1, 1)) { diff --git a/src/modules/title/title.c b/src/modules/title/title.c index c5a12b0a1..d05a86b62 100644 --- a/src/modules/title/title.c +++ b/src/modules/title/title.c @@ -2,7 +2,6 @@ #include "common/jsonconfig.h" #include "modules/title/title.h" #include "util/textModifier.h" -#include "util/stringUtils.h" static void appendText(FFstrbuf* output, const FFstrbuf* text, const FFstrbuf* color) { @@ -30,6 +29,7 @@ void ffPrintTitle(FFTitleOptions* options) FF_STRBUF_AUTO_DESTROY hostName = ffStrbufCreateCopy(&instance.state.platform.hostName); if (!options->fqdn) ffStrbufSubstrBeforeFirstC(&hostName, '.'); + instance.state.titleFqdn = options->fqdn; FF_STRBUF_AUTO_DESTROY hostNameColored = ffStrbufCreate(); appendText(&hostNameColored, &hostName, &options->colorHost); From bd5b385909e8a025370ddc8c9280db7fe0ff43e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 14 Aug 2025 13:32:21 +0800 Subject: [PATCH 81/83] Flashfetch: disable decimal digits in Disk module --- src/flashfetch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/flashfetch.c b/src/flashfetch.c index aef4bc510..f4256cff6 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -10,7 +10,7 @@ int main(void) // Modify global config here if needed instance.config.display.sizeMaxPrefix = 2; // MB - instance.config.display.sizeNdigits = 2; + instance.config.display.sizeNdigits = 0; instance.config.display.freqNdigits = 3; instance.config.display.freqSpaceBeforeUnit = FF_SPACE_BEFORE_UNIT_NEVER; instance.config.display.sizeSpaceBeforeUnit = FF_SPACE_BEFORE_UNIT_NEVER; From bc3703140b0fadc12c810d39e9ca9769b358af74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 14 Aug 2025 13:58:21 +0800 Subject: [PATCH 82/83] Doc: update changelog --- CHANGELOG.md | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 987e190ac..e63e06310 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,41 +1,43 @@ # 2.50.0 Changes: -* Keys in JSON configuration files are now case-sensitive, as stated in v2.49.0 +* Keys in JSON configuration files are now case-sensitive, as stated in v2.49.0. * This is a breaking change, but it should not affect most users as long as your config file passes JSON schema validation. -* All module config flags have been removed, as stated in v2.49.0 - * To configure modules at command line, `echo '{"modules": [{"type":"custom","format":"Hello Fastfetch!"}]}' | fastfetch -c -` should be used instead. -* Percent bar config `display.bar.*` options have been replaced with a more organized, nested object structure. +* All module config flags have been removed, as stated in v2.49.0. + * To configure modules via the command line, use: `echo '{"modules": [{"type":"custom","format":"Hello Fastfetch!"}]}' | fastfetch -c -`. +* The percent bar config `display.bar.*` options have been replaced with a more organized, nested object structure. * `display.bar.charElapsed` has been renamed to `display.bar.char.elapsed`. * `display.bar.charTotal` has been renamed to `display.bar.char.total`. * `display.bar.borderLeft` has been renamed to `display.bar.border.left`. * `display.bar.borderRight` has been renamed to `display.bar.border.right`. -* Undocumented flag `--load-config` has been removed - * `--config` or `-c` should be used instead. +* The undocumented flag `--load-config` has been removed. + * Use `--config` or `-c` instead. +* Flashfetch, a simplified fastfetch variant that used a hardcoded module list with direct function calls to reduce startup overhead, has been changed to a version that aims to match neofetch's behavior as closely as possible, for demonstration purposes. + * Flashfetch is intended to be built from source (like [st](https://st.suckless.org/)). We do not provide prebuilt binaries in distributions. Features: -* Added support for reading JSON config from stdin using `--config -` or `-c -` -* Added `display.bar.border.{leftElapsed,rightElapsed}` for using border as parts of bar content. (#1875) +* Added support for reading JSON config from stdin using `--config -` or `-c -`. +* Added `display.bar.border.{leftElapsed,rightElapsed}` for using the border as part of the bar content. (#1875) * `display.bar.border: null` has been added as a shorthand to disable bar borders. -* Added `display.bar.color.{elapsed,total,border}` to customize the color of the elapsed, total and border sections of the percent bar. +* Added `display.bar.color.{elapsed,total,border}` to customize the color of the elapsed, total, and border sections of the percent bar. * `display.bar.color: null` has been added as a shorthand to disable bar colors. -* Improved Bedrock linux detection (#1881, OS / Disk, Linux) -* Added command flag `--gen-config-full` which generates a JSON config file that contains all optional module options. -* Improved default IP address display when `localip.showAllIPs` is not set (LocalIP) - * For IPv4, preferred source address (if detected) is shown - * For IPv6, first GUA or ULA that is not deprecated or temporary is shown +* Improved Bedrock Linux detection (#1881, OS / Disk, Linux) +* Added the command flag `--gen-config-full`, which generates a JSON config file containing all optional module options. +* Improved the default IP address display when `localip.showAllIPs` is not set (LocalIP) + * For IPv4, the preferred source address (if detected) is shown. + * For IPv6, the first GUA or ULA that is not deprecated or temporary is shown. * Added support for interface speed detection on SunOS (LocalIP, SunOS) -* Added detection for Xlibre (#1888, WM, Linux) -* Improved accuracy of color detection (Cursor, macOS) +* Added detection support for Xlibre (#1888, WM, Linux) +* Improved the accuracy of color detection (Cursor, macOS) Bugfixes: -* Fixed custom object inherits key from previous custom object if key is blank (#1477) -* Fixed possible segfault when parsing color strings in JSON config (#1878) +* Fixed custom object inheriting a key from the previous custom object if the key is blank (#1477) +* Fixed a possible segfault when parsing color strings in the JSON config (#1878) * Fixed GPU driver detection when DRM is used (GPU, FreeBSD) * Fixed default route detection on DragonFly BSD (LocalIP, DFBSD) * Fixed lliurex detection (#1882, OS, Linux) * Fixed compatibility with `-ffast-math` (#1894) -* Fixed physical GPU being ignored sometimes (#1896, GPU, Windows) +* Fixed physical GPU sometimes being ignored (#1896, GPU, Windows) Logos: * Added ObsidianOS (#1890) From 40921156b80d687af5c183e54deacd8cd1f72f0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Thu, 14 Aug 2025 14:23:37 +0800 Subject: [PATCH 83/83] Doc: update changelog [ci skip] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e63e06310..1fcb19563 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ Features: * Added support for interface speed detection on SunOS (LocalIP, SunOS) * Added detection support for Xlibre (#1888, WM, Linux) * Improved the accuracy of color detection (Cursor, macOS) +* Improved the proformance of `Nix` package manager detection on macOS by porting optimizations form Linux port (#1893, Packages, macOS) Bugfixes: * Fixed custom object inheriting a key from the previous custom object if the key is blank (#1477)