From 02d7f2693b3d86a6676727b516b18a97eef75245 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sat, 29 Jun 2024 18:53:08 +0800 Subject: [PATCH 01/33] Doc: fix document of `--pipe` [ci skip] Fix #1058 --- src/data/help.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/help.json b/src/data/help.json index 8c4683e158..513724166f 100644 --- a/src/data/help.json +++ b/src/data/help.json @@ -441,7 +441,7 @@ }, { "long": "pipe", - "desc": "Disable logo and all escape sequences", + "desc": "Disable colors", "remark": "Auto detection based on isatty(1)", "arg": { "type": "bool", From 2781a0ab93e950365350d138e25cea51c96338e6 Mon Sep 17 00:00:00 2001 From: scarf Date: Sat, 29 Jun 2024 20:32:36 +0900 Subject: [PATCH 02/33] docs: document `--logo` `none` (#1059) --- src/data/help.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/help.json b/src/data/help.json index 513724166f..e7fe602976 100644 --- a/src/data/help.json +++ b/src/data/help.json @@ -154,7 +154,7 @@ { "short": "l", "long": "logo", - "desc": "Set the logo source", + "desc": "Set the logo source. Use \"none\" to disable the logo", "remark": "Should be the name of a builtin logo, or a path to an image file. See also https://github.com/fastfetch-cli/fastfetch/wiki/Logo-options", "arg": { "type": "logo" From 0e597a2ded2a241f0ec5c75a0a1b3f31501df580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sat, 29 Jun 2024 21:59:49 +0800 Subject: [PATCH 03/33] Battery: fix index format with multiple batteries --- src/modules/battery/battery.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/battery/battery.c b/src/modules/battery/battery.c index 7e1ff02d86..02a3a475d6 100644 --- a/src/modules/battery/battery.c +++ b/src/modules/battery/battery.c @@ -94,8 +94,8 @@ void ffPrintBattery(FFBatteryOptions* options) for(uint32_t i = 0; i < results.length; i++) { - FFBatteryResult* result = ffListGet(&results, i); - printBattery(options, result, (uint8_t) i); + FFBatteryResult* result = FF_LIST_GET(FFBatteryResult, results, i); + printBattery(options, result, results.length == 1 ? 0 : (uint8_t) (i + 1)); } FF_LIST_FOR_EACH(FFBatteryResult, result, results) From 2e1261bc215f63c7b3980543911a49fce5083f53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 30 Jun 2024 19:04:44 +0800 Subject: [PATCH 04/33] PhysicalMemory: fix incorrect size value for large memory sticks Fix #1061 (integer overflow) --- src/detection/physicalmemory/physicalmemory_linux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/detection/physicalmemory/physicalmemory_linux.c b/src/detection/physicalmemory/physicalmemory_linux.c index a773d3d93a..a1f0de70d1 100644 --- a/src/detection/physicalmemory/physicalmemory_linux.c +++ b/src/detection/physicalmemory/physicalmemory_linux.c @@ -100,11 +100,11 @@ const char* ffDetectPhysicalMemory(FFlist* result) if (data->Size != 0xFFFF) { if (data->Size == 0x7FFF) - device->size = (data->ExtendedSize & ~(1 << 31)) * 1024 * 1024; + device->size = (data->ExtendedSize & ~(1ULL << 31)) * 1024ULL * 1024ULL; else if (data->Size & (1 << 15)) { // in kB - device->size = (data->Size & ~(1u << 15)) * 1024ULL; + device->size = (data->Size & ~(1ULL << 15)) * 1024ULL; } else { From abd25222685d500ae545b8929a22518f4be98483 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 30 Jun 2024 20:01:57 +0800 Subject: [PATCH 05/33] JsonSchema: add formattion keys for CpuUsage module Fix #1060 --- doc/json_schema.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/doc/json_schema.json b/doc/json_schema.json index 648ef6bfa3..eded507e5a 100644 --- a/doc/json_schema.json +++ b/doc/json_schema.json @@ -1145,6 +1145,21 @@ "type": "boolean", "description": "Display CPU usage per CPU logical core, instead of an average result", "default": false + }, + "key": { + "$ref": "#/$defs/key" + }, + "keyColor": { + "$ref": "#/$defs/keyColor" + }, + "outputColor": { + "$ref": "#/$defs/outputColor" + }, + "keyWidth": { + "$ref": "#/$defs/keyWidth" + }, + "format": { + "$ref": "#/$defs/format" } } }, From ecd69370ab6654de34db8bde8c2d6cdf1625054f Mon Sep 17 00:00:00 2001 From: Carter Li Date: Tue, 25 Jun 2024 10:16:19 +0800 Subject: [PATCH 06/33] OS (Linux): prioritize `prettyName` over `name` --- src/modules/os/os.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/os/os.c b/src/modules/os/os.c index 5a6123f1d0..1e0d6842c1 100644 --- a/src/modules/os/os.c +++ b/src/modules/os/os.c @@ -12,10 +12,10 @@ static void buildOutputDefault(const FFOSResult* os, FFstrbuf* result) { //Create the basic output - if(os->name.length > 0) - ffStrbufAppend(result, &os->name); - else if(os->prettyName.length > 0) + if(os->prettyName.length > 0) ffStrbufAppend(result, &os->prettyName); + else if(os->name.length > 0) + ffStrbufAppend(result, &os->name); else if(os->id.length > 0) ffStrbufAppend(result, &os->id); else From d3e50fe5955a4d4524c01deec894c4f45a60f6e0 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Mon, 1 Jul 2024 08:56:58 +0800 Subject: [PATCH 07/33] Packaging: update debian stuff [ci skip] --- debian/changelog | 12 ++++++++++++ debian/files | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 417916b770..8040d8ed2e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,15 @@ +fastfetch (2.17.1) jammy; urgency=medium + + * Update to 2.17.1 + + -- Carter Li Mon, 01 Jul 2024 08:56:29 +0800 + +fastfetch (2.17.0) jammy; urgency=medium + + * Update to 2.17.0 + + -- Carter Li Fri, 28 Jun 2024 13:43:18 +0800 + fastfetch (2.16.0) jammy; urgency=medium * Update to 2.16.0 diff --git a/debian/files b/debian/files index 004f9b0531..1080958808 100644 --- a/debian/files +++ b/debian/files @@ -1 +1 @@ -fastfetch_2.16.0_source.buildinfo universe/utils optional +fastfetch_2.17.1_source.buildinfo universe/utils optional From 01d04a8fa2aae46cb6cc882cbd46c085ad09b8ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 1 Jul 2024 13:54:48 +0800 Subject: [PATCH 08/33] PhysicalMemory: remove an unused variable --- src/modules/physicalmemory/physicalmemory.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/modules/physicalmemory/physicalmemory.c b/src/modules/physicalmemory/physicalmemory.c index c629a38311..68d8d61dec 100644 --- a/src/modules/physicalmemory/physicalmemory.c +++ b/src/modules/physicalmemory/physicalmemory.c @@ -21,7 +21,6 @@ void ffPrintPhysicalMemory(FFPhysicalMemoryOptions* options) } FF_STRBUF_AUTO_DESTROY prettySize = ffStrbufCreate(); - FF_STRBUF_AUTO_DESTROY key = ffStrbufCreate(); uint32_t i = 0; FF_LIST_FOR_EACH(FFPhysicalMemoryResult, device, result) From 7aad0dc32f36b51eff6971dd0c3520633ee508f9 Mon Sep 17 00:00:00 2001 From: Diego Viola Date: Mon, 1 Jul 2024 03:38:29 -0300 Subject: [PATCH 09/33] Theme: Fix spelling of Qt (#1062) Signed-off-by: Diego Viola --- CHANGELOG.md | 4 ++-- presets/examples/19.jsonc | 2 +- src/detection/font/font.h | 2 +- src/detection/font/font_linux.c | 2 +- src/detection/icons/icons_linux.c | 2 +- src/detection/theme/theme_linux.c | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1724c0e710..6ecaabf6e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1107,7 +1107,7 @@ Bugfixes: * Fix Windows drives detection in WSL (Disk) Changes: -* In order to make Icons module consistent between different platforms, `--icons-format` no longer supports individual GTK / QT icon params. +* In order to make Icons module consistent between different platforms, `--icons-format` no longer supports individual GTK / Qt icon params. * `--theme-format` no longer supports individual GTK / plasma theme params. * `--local-ip-*` and `--public-ip-*` have been changed to `--localip-*` and `--publicip-*` * `--localip-compact-type` is no longer supported. Fastfetch now display IPs as `--localip-compat-type multiline` by default, with `--local-compact true` can be set as an alias of `--localip-compact-type oneline` @@ -1481,7 +1481,7 @@ Fixes build on android (#205) # 1.6.0 Features: -* Detect QT on more DEs than just KDE Plasma. The [Plasma] category was therefore renamed to [QT] +* Detect Qt on more DEs than just KDE Plasma. The [Plasma] category was therefore renamed to [Qt] * Alacritty font detection * Load `/etc/fastfetch/config.conf` before user config * Disk: print one decimal point if size < 100GB diff --git a/presets/examples/19.jsonc b/presets/examples/19.jsonc index 2663ea1598..a84a24f326 100644 --- a/presets/examples/19.jsonc +++ b/presets/examples/19.jsonc @@ -147,7 +147,7 @@ { "type": "font", "key": "FONT", - "format": "{?1}{1} [QT]{?}{/1}Unknown", // Remove "[QT]" if not using Qt + "format": "{?1}{1} [Qt]{?}{/1}Unknown", // Remove "[Qt]" if not using Qt "keyColor": "yellow" }, { diff --git a/src/detection/font/font.h b/src/detection/font/font.h index 411efde7a7..f0c59bba7c 100644 --- a/src/detection/font/font.h +++ b/src/detection/font/font.h @@ -7,7 +7,7 @@ typedef struct FFFontResult { /** - * Linux / BSD: QT, GTK2, GTK3, GTK4 + * Linux / BSD: Qt, GTK2, GTK3, GTK4 * MacOS: System, User, System Mono, User Mono * Windows: Caption, Menu, Message, Status * Other: Unset, Unset, Unset, Unset diff --git a/src/detection/font/font_linux.c b/src/detection/font/font_linux.c index 7cee52ccd3..7a7acfe43c 100644 --- a/src/detection/font/font_linux.c +++ b/src/detection/font/font_linux.c @@ -9,7 +9,7 @@ static void generateString(FFFontResult* font) if(font->fonts[0].length > 0) { ffStrbufAppend(&font->display, &font->fonts[0]); - ffStrbufAppendS(&font->display, " [QT]"); + ffStrbufAppendS(&font->display, " [Qt]"); for(uint8_t i = 1; i < sizeof(font->fonts) / sizeof(font->fonts[0]); i++) { diff --git a/src/detection/icons/icons_linux.c b/src/detection/icons/icons_linux.c index d83b7ab7f2..623e0813da 100644 --- a/src/detection/icons/icons_linux.c +++ b/src/detection/icons/icons_linux.c @@ -23,7 +23,7 @@ const char* ffDetectIcons(FFIconsResult* result) if(plasma->length > 0) { ffStrbufAppend(&result->icons1, plasma); - ffStrbufAppendS(&result->icons1, " [QT]"); + ffStrbufAppendS(&result->icons1, " [Qt]"); } return NULL; diff --git a/src/detection/theme/theme_linux.c b/src/detection/theme/theme_linux.c index 4b4637b883..4b4844286f 100644 --- a/src/detection/theme/theme_linux.c +++ b/src/detection/theme/theme_linux.c @@ -53,7 +53,7 @@ const char* ffDetectTheme(FFThemeResult* result) } if(plasma->widgetStyle.length > 0 || plasma->colorScheme.length > 0) - ffStrbufAppendS(&result->theme1, " [QT]"); + ffStrbufAppendS(&result->theme1, " [Qt]"); return NULL; } From 9042950ee8bb82226e64d7ea79f97b63c51c023d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 1 Jul 2024 15:04:51 +0800 Subject: [PATCH 10/33] Color: if value is already an ANSI escape code, use it --- src/common/option.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/common/option.c b/src/common/option.c index e0bf5fc3fb..a8fb48ec52 100644 --- a/src/common/option.c +++ b/src/common/option.c @@ -148,6 +148,14 @@ bool ffOptionParseBoolean(const char* str) void ffOptionParseColorNoClear(const char* value, FFstrbuf* buffer) { + // If value is already an ANSI escape code, use it + if (value[0] == '\e' && value[1] == '[') + { + ffStrbufAppendS(buffer, value + 2); + ffStrbufTrimRight(buffer, 'm'); + return; + } + ffStrbufEnsureFree(buffer, 63); while(*value != '\0') From 7ffed9e911d965f0d97872779d528af6a11dbd07 Mon Sep 17 00:00:00 2001 From: Diego Viola Date: Mon, 1 Jul 2024 05:00:35 -0300 Subject: [PATCH 11/33] DE: Fix spelling of LXQt (#1063) Signed-off-by: Diego Viola --- CHANGELOG.md | 2 +- src/detection/displayserver/displayserver.h | 2 +- src/detection/displayserver/linux/wmde.c | 2 +- src/detection/wmtheme/wmtheme_linux.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ecaabf6e6..262bbfa38e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1061,7 +1061,7 @@ Bugfixes: This release backports some changes from dev branch, and fixes 2 crashing issues Features: -* Support KDE / LXQT / MATE / Cinnamon wallpaper detection (Wallpaper, Linux) +* Support KDE / LXQt / MATE / Cinnamon wallpaper detection (Wallpaper, Linux) * Support QTerminal version & terminal font detection * Support MATE Terminal version & terminal font detection * Set `--pipe true` automatically if stdout is not a tty diff --git a/src/detection/displayserver/displayserver.h b/src/detection/displayserver/displayserver.h index dc223b79ac..13c6452f63 100644 --- a/src/detection/displayserver/displayserver.h +++ b/src/detection/displayserver/displayserver.h @@ -9,7 +9,7 @@ #define FF_DE_PRETTY_CINNAMON "Cinnamon" #define FF_DE_PRETTY_MATE "Mate" #define FF_DE_PRETTY_LXDE "LXDE" -#define FF_DE_PRETTY_LXQT "LXQT" +#define FF_DE_PRETTY_LXQT "LXQt" #define FF_DE_PRETTY_BUDGIE "Budgie" #define FF_DE_PRETTY_CDE "CDE" #define FF_DE_PRETTY_UNITY "Unity" diff --git a/src/detection/displayserver/linux/wmde.c b/src/detection/displayserver/linux/wmde.c index 32a599e175..22531bb4d3 100644 --- a/src/detection/displayserver/linux/wmde.c +++ b/src/detection/displayserver/linux/wmde.c @@ -207,7 +207,7 @@ static void applyPrettyNameIfDE(FFDisplayServerResult* result, const char* name) else if( ffStrEqualsIgnCase(name, "LXQt") || - ffStrEqualsIgnCase(name, "X-LXQT") || + ffStrEqualsIgnCase(name, "X-LXQt") || ffStrEqualsIgnCase(name, "lxqt-session") ) { ffStrbufSetS(&result->deProcessName, "lxqt-session"); diff --git a/src/detection/wmtheme/wmtheme_linux.c b/src/detection/wmtheme/wmtheme_linux.c index 7c382f32cc..6b737a1338 100644 --- a/src/detection/wmtheme/wmtheme_linux.c +++ b/src/detection/wmtheme/wmtheme_linux.c @@ -134,7 +134,7 @@ static bool detectOpenbox(const FFstrbuf* dePrettyName, FFstrbuf* themeOrError) { FF_STRBUF_AUTO_DESTROY absolutePath = ffStrbufCreateA(64); const char *configFileSubpath = "openbox/rc.xml"; - if (ffStrbufIgnCaseCompS(dePrettyName, "LXQT") == 0) + if (ffStrbufIgnCaseCompS(dePrettyName, "LXQt") == 0) configFileSubpath = "openbox/lxqt-rc.xml"; else if (ffStrbufIgnCaseCompS(dePrettyName, "LXDE") == 0) configFileSubpath = "openbox/lxde-rc.xml"; From 3b156e819bccd7b1d03888c266a3703104e7ff22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 1 Jul 2024 23:56:19 +0800 Subject: [PATCH 12/33] Terminal (Linux): support ptyxis version detection --- src/detection/terminalshell/terminalshell.c | 17 +++++++++++++++++ .../terminalshell/terminalshell_linux.c | 2 ++ 2 files changed, 19 insertions(+) diff --git a/src/detection/terminalshell/terminalshell.c b/src/detection/terminalshell/terminalshell.c index 28bd7c591d..f4e4ccdef8 100644 --- a/src/detection/terminalshell/terminalshell.c +++ b/src/detection/terminalshell/terminalshell.c @@ -499,6 +499,20 @@ static bool getTerminalVersionKitty(FFstrbuf* exe, FFstrbuf* version) //kitty 0.21.2 created by Kovid Goyal return getExeVersionGeneral(exe, version); } + +static bool getTerminalVersionPtyxis(FF_MAYBE_UNUSED FFstrbuf* exe, FFstrbuf* version) +{ + if(ffProcessAppendStdOut(version, (char* const[]) { + "ptyxis", + "--version", + NULL + }) != NULL) + return false; + + ffStrbufSubstrBeforeFirstC(version, '\n'); + ffStrbufSubstrAfterFirstC(version, ' '); + return true; +} #endif #ifdef _WIN32 @@ -595,6 +609,9 @@ bool fftsGetTerminalVersion(FFstrbuf* processName, FF_MAYBE_UNUSED FFstrbuf* exe ) return getTerminalVersionUrxvt(exe, version); + if(ffStrbufIgnCaseEqualS(processName, "ptyxis-agent")) + return getTerminalVersionPtyxis(exe, version); + #endif #ifdef _WIN32 diff --git a/src/detection/terminalshell/terminalshell_linux.c b/src/detection/terminalshell/terminalshell_linux.c index 40a1ee600d..61c05a82bb 100644 --- a/src/detection/terminalshell/terminalshell_linux.c +++ b/src/detection/terminalshell/terminalshell_linux.c @@ -331,6 +331,8 @@ static void setTerminalInfoDetails(FFTerminalResult* result) ffStrbufEqualS(&result->processName, "rxvt") ) ffStrbufInitStatic(&result->prettyName, "rxvt-unicode"); + else if(ffStrbufStartsWithS(&result->processName, "ptyxis-agent")) + ffStrbufInitStatic(&result->prettyName, "Ptyxis"); #elif defined(__APPLE__) From 4db6aebcc92b6f27f7f916f91ff54014be22d95a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Mon, 1 Jul 2024 23:56:53 +0800 Subject: [PATCH 13/33] TerminalFont (Linux): support Ptyxis --- .../terminalfont/terminalfont_linux.c | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/detection/terminalfont/terminalfont_linux.c b/src/detection/terminalfont/terminalfont_linux.c index f10bcd7355..e2bfd5327f 100644 --- a/src/detection/terminalfont/terminalfont_linux.c +++ b/src/detection/terminalfont/terminalfont_linux.c @@ -50,6 +50,26 @@ static void detectKgx(FFTerminalFontResult* terminalFont) } } +static void detectPtyxis(FFTerminalFontResult* terminalFont) +{ + if(!ffSettingsGet("/org/gnome/Ptyxis/use-system-font", "org.gnome.Ptyxis", NULL, "use-system-font", FF_VARIANT_TYPE_BOOL).boolValue) + { + FF_AUTO_FREE const char* fontName = ffSettingsGet("/org/gnome/Ptyxis/font-name", "org.gnome.Ptyxis", NULL, "font-name", FF_VARIANT_TYPE_STRING).strValue; + if(ffStrSet(fontName)) + ffFontInitPango(&terminalFont->font, fontName); + else + ffStrbufAppendF(&terminalFont->error, "Couldn't get terminal font from GSettings (org.gnome.Ptyxis::font-name)"); + } + else + { + FF_AUTO_FREE const char* fontName = getSystemMonospaceFont(); + if(ffStrSet(fontName)) + ffFontInitPango(&terminalFont->font, fontName); + else + ffStrbufAppendS(&terminalFont->error, "Couldn't get system monospace font name from GSettings / DConf"); + } +} + static void detectFromGSettings(const char* profilePath, const char* profileList, const char* profile, const char* defaultProfileKey, FFTerminalFontResult* terminalFont) { FF_AUTO_FREE const char* defaultProfile = ffSettingsGetGSettings(profileList, NULL, defaultProfileKey, FF_VARIANT_TYPE_STRING).strValue; @@ -386,6 +406,8 @@ void ffDetectTerminalFontPlatform(const FFTerminalResult* terminal, FFTerminalFo detectFromGSettings("/com/gexperts/Tilix/profiles/", "com.gexperts.Tilix.ProfilesList", "com.gexperts.Tilix.Profile", "default", terminalFont); else if(ffStrbufStartsWithIgnCaseS(&terminal->processName, "gnome-terminal")) detectFromGSettings("/org/gnome/terminal/legacy/profiles:/:", "org.gnome.Terminal.ProfilesList", "org.gnome.Terminal.Legacy.Profile", "default", terminalFont); + else if(ffStrbufStartsWithIgnCaseS(&terminal->processName, "ptyxis-agent")) + detectPtyxis(terminalFont); else if(ffStrbufIgnCaseEqualS(&terminal->processName, "kgx")) detectKgx(terminalFont); else if(ffStrbufIgnCaseEqualS(&terminal->processName, "mate-terminal")) From 2cd421fc2e46beb258bc3861664e3b123c09e413 Mon Sep 17 00:00:00 2001 From: LinuxOnTheDesktop <47056543+LinuxOnTheDesktop@users.noreply.github.com> Date: Tue, 2 Jul 2024 03:45:36 +0100 Subject: [PATCH 14/33] Doc: correct various errors of English (#1065) Including but not limited to: number agreement; punctuation --- README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 0efdf80f78..eac500b00f 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ [![latest packaged version(s)](https://repology.org/badge/latest-versions/fastfetch.svg)](https://repology.org/project/fastfetch/versions) [![Packaging status](https://repology.org/badge/tiny-repos/fastfetch.svg)](https://repology.org/project/fastfetch/versions) -Fastfetch is a [neofetch](https://github.com/dylanaraps/neofetch)-like tool for fetching system information and displaying them in a pretty way. It is written mainly in C, with performance and customizability in mind. Currently, Linux, Android, FreeBSD, macOS, SunOS and Windows 7+ are supported. +Fastfetch is a [neofetch](https://github.com/dylanaraps/neofetch)-like tool for fetching system information and displaying it prettily. It is written mainly in C, with performance and customizability in mind. Currently, Linux, Android, FreeBSD, macOS, SunOS and Windows 7+ are supported. @@ -21,13 +21,13 @@ Fastfetch is a [neofetch](https://github.com/dylanaraps/neofetch)-like tool for -There are [screenshots on different platforms](https://github.com/fastfetch-cli/fastfetch/wiki) +There are [screenshots on different platforms](https://github.com/fastfetch-cli/fastfetch/wiki). ## Installation ### Linux -Some distros packaged an outdated fastfetch version. Older version is not supported, please always ensure that the latest version is used. +Some distros packaged an outdated fastfetch version. Older version receive no support, so please try always to use the latest version. * Ubuntu: [`ppa:zhangsongcui3371/fastfetch`](https://launchpad.net/~zhangsongcui3371/+archive/ubuntu/fastfetch) (for Ubuntu 22.04 or newer) * Debian: `sudo apt install fastfetch` (for Debian 13 or newer) @@ -57,7 +57,7 @@ If fastfetch is not packaged for your distro or an outdated version is packaged, * [winget](https://github.com/microsoft/winget-pkgs/tree/master/manifests/f/Fastfetch-cli/Fastfetch): `winget install fastfetch` * [MSYS2 MinGW](https://github.com/msys2/MINGW-packages/tree/master/mingw-w64-fastfetch): `pacman -S mingw-w64---fastfetch` -You may also download it directly from [GitHub releases page](https://github.com/fastfetch-cli/fastfetch/releases/latest) and extract the archive. +You may also download the program directly from [the GitHub releases page](https://github.com/fastfetch-cli/fastfetch/releases/latest) in the form of an archive file. ### FreeBSD @@ -81,7 +81,7 @@ See Wiki: https://github.com/fastfetch-cli/fastfetch/wiki/Building ## Customization -Fastfetch uses the JSONC (or JSON with comments) for configuration. [See Wiki for detail](https://github.com/fastfetch-cli/fastfetch/wiki/Configuration). There are some premade config files in [`presets`](presets), including the ones used for the screenshots above. You can load them using `-c `. They may also serve as a good example for format arguments. +Fastfetch uses the JSONC (or JSON with comments) for configuration. [See Wiki for detail](https://github.com/fastfetch-cli/fastfetch/wiki/Configuration). There are some premade config files in [`presets`](presets), including the ones used for the screenshots above. You can load them using `-c `. Those files can serve as examples of the configuration syntax. Logos can be heavily customized too; see the [logo documentation](https://github.com/fastfetch-cli/fastfetch/wiki/Logo-options) for more information. @@ -103,10 +103,10 @@ Logos can be heavily customized too; see the [logo documentation](https://github 1. Fastfetch is actively maintained. 2. Fastfetch is faster. As the name suggests. -3. Fastfetch is more feature-rich. By default fastfetch only has a few modules enabled. Use `fastfetch -c all` to find what you want. -4. Fastfetch is more configurable. You can find more information in the Wiki: -5. Fastfetch is more polished. For example, neofetch prints `555MiB` in `Memory` module and `23G` in `Disk` module (notibily the difference of `MiB` and `G`), while fastfetch prints `555.00 MiB` and `22.97 GiB` respectively. -6. Fastfetch is more accurate. For example, [neofetch never actually supports Wayland protocol](https://github.com/dylanaraps/neofetch/pull/2395). +3. Fastfetch has a greater number of features, though by default fastfetch only has a few modules enabled; use `fastfetch -c all` to find what you want. +4. Fastfetch is more configurable. You can find more information in the Wiki: . +5. Fastfetch is more polished. For example, neofetch prints `555MiB` in `Memory` module and `23G` in `Disk` module, whereas fastfetch prints `555.00 MiB` and `22.97 GiB` respectively. +6. Fastfetch is more accurate. For example, [neofetch never actually supports the Wayland protocol](https://github.com/dylanaraps/neofetch/pull/2395). ### Q: Fastfetch shows my local IP address. It leaks my privacy! @@ -118,7 +118,7 @@ If you really don't like it, you can disable the `Local IP` module in `config.js ### Q: Where is the config file? I can't find it. -`Fastfetch` don't generate config file automatically. You can use `fastfetch --gen-config` to generate one. The config file will be saved in `~/.config/fastfetch/config.jsonc` by default. See [Wiki for detail](https://github.com/fastfetch-cli/fastfetch/wiki/Configuration). +`Fastfetch` does not generate config file automatically. You can use `fastfetch --gen-config` to generate one. The config file will be saved in `~/.config/fastfetch/config.jsonc` by default. See [Wiki for detail](https://github.com/fastfetch-cli/fastfetch/wiki/Configuration). ### Q: The configuration is so complex. Where is the documentation? @@ -132,7 +132,7 @@ Alternatively, you can refer to the presets in [`presets` directory](https://git ### Q: How can I customize the module output? -Fastfetch uses `format` to generate output. For example to make `GPU` module show GPU name only and ignore other information, you can use +Fastfetch uses `format` to generate output. For example, to make the `GPU` module show only the GPU name (leaving other information undisplayed), you can use ```jsonc { @@ -145,15 +145,15 @@ Fastfetch uses `format` to generate output. For example to make `GPU` module sho } ``` -which is equivalent to `fastfetch -s gpu --gpu-format '{2}'` +. . which is equivalent to `fastfetch -s gpu --gpu-format '{2}'` -See `fastfetch -h format` for basic usage. For module specific formattion, see `fastfetch -h -format` +See `fastfetch -h format` for information on basic usage. For module specific formattion, see `fastfetch -h -format` ### Q: I have my own ascii-art / image file. How can I show it with fastfetch? Try `fastfetch -l /path/to/logo`. See [logo documentation](https://github.com/fastfetch-cli/fastfetch/wiki/Logo-options) for detail. -If you just want to display distro name in [FIGlet text](https://github.com/pwaller/pyfiglet) +If you just want to display distro name in [FIGlet text](https://github.com/pwaller/pyfiglet): ```bash # install pyfiglet and jq first From a749014e7c7769b49578e49f2f8c50f8ed7780ff Mon Sep 17 00:00:00 2001 From: Carter Li Date: Tue, 2 Jul 2024 10:12:26 +0800 Subject: [PATCH 15/33] Kernel: code refactor --- src/detection/memory/memory_apple.c | 2 +- src/detection/memory/memory_bsd.c | 2 +- src/detection/memory/memory_sunos.c | 4 +- src/detection/swap/swap_bsd.c | 4 +- src/detection/swap/swap_sunos.c | 4 +- src/detection/swap/swap_windows.c | 2 +- src/detection/terminalshell/terminalshell.c | 2 +- src/detection/version/version.c | 76 +++++++++++++-------- src/detection/version/version.h | 3 +- src/fastfetch.c | 5 +- src/logo/logo.c | 2 +- src/modules/kernel/kernel.c | 37 ++++++---- src/modules/os/os.c | 14 ++-- src/modules/title/title.c | 1 - src/modules/version/version.c | 45 ++++++------ src/util/platform/FFPlatform.c | 42 +++++------- src/util/platform/FFPlatform.h | 21 +++--- src/util/platform/FFPlatform_unix.c | 22 +++--- src/util/platform/FFPlatform_windows.c | 53 +++++++------- 19 files changed, 182 insertions(+), 159 deletions(-) diff --git a/src/detection/memory/memory_apple.c b/src/detection/memory/memory_apple.c index 19e67f1a4c..cabdab267d 100644 --- a/src/detection/memory/memory_apple.c +++ b/src/detection/memory/memory_apple.c @@ -25,7 +25,7 @@ const char* ffDetectMemory(FFMemoryResult* ram) + vmstat.compressor_page_count - vmstat.purgeable_count - vmstat.external_page_count - ) * instance.state.platform.pageSize; + ) * instance.state.platform.sysinfo.pageSize; return NULL; } diff --git a/src/detection/memory/memory_bsd.c b/src/detection/memory/memory_bsd.c index 9af77cb70f..0db20527a2 100644 --- a/src/detection/memory/memory_bsd.c +++ b/src/detection/memory/memory_bsd.c @@ -12,7 +12,7 @@ const char* ffDetectMemory(FFMemoryResult* ram) + ffSysctlGetInt("vm.stats.vm.v_inactive_count", 0) + ffSysctlGetInt("vm.stats.vm.v_cache_count", 0); - ram->bytesUsed = ram->bytesTotal - (uint64_t) pagesFree * instance.state.platform.pageSize; + ram->bytesUsed = ram->bytesTotal - (uint64_t) pagesFree * instance.state.platform.sysinfo.pageSize; return NULL; } diff --git a/src/detection/memory/memory_sunos.c b/src/detection/memory/memory_sunos.c index 9e9f0f11ef..4633eb6c07 100644 --- a/src/detection/memory/memory_sunos.c +++ b/src/detection/memory/memory_sunos.c @@ -23,11 +23,11 @@ const char* ffDetectMemory(FFMemoryResult* ram) { kstat_named_t* kn = kstat_data_lookup(ks, "pagestotal"); - ram->bytesTotal = kn->value.ui64 * instance.state.platform.pageSize; + ram->bytesTotal = kn->value.ui64 * instance.state.platform.sysinfo.pageSize; } { kstat_named_t* kn = kstat_data_lookup(ks, "pagesfree"); - ram->bytesUsed = ram->bytesTotal - kn->value.ui64 * instance.state.platform.pageSize; + ram->bytesUsed = ram->bytesTotal - kn->value.ui64 * instance.state.platform.sysinfo.pageSize; } return NULL; diff --git a/src/detection/swap/swap_bsd.c b/src/detection/swap/swap_bsd.c index 6fa8fb3ea3..7cbb2a1fe8 100644 --- a/src/detection/swap/swap_bsd.c +++ b/src/detection/swap/swap_bsd.c @@ -25,8 +25,8 @@ const char* ffDetectSwap(FFSwapResult* swap) swap->bytesTotal += (uint64_t) xsw.xsw_nblks; } - swap->bytesUsed *= instance.state.platform.pageSize; - swap->bytesTotal *= instance.state.platform.pageSize; + swap->bytesUsed *= instance.state.platform.sysinfo.pageSize; + swap->bytesTotal *= instance.state.platform.sysinfo.pageSize; return NULL; } diff --git a/src/detection/swap/swap_sunos.c b/src/detection/swap/swap_sunos.c index f564e9929c..1866cdcd9c 100644 --- a/src/detection/swap/swap_sunos.c +++ b/src/detection/swap/swap_sunos.c @@ -26,8 +26,8 @@ const char* ffDetectSwap(FFSwapResult* swap) swap->bytesUsed += (uint64_t) table->swt_ent[i].ste_free; } swap->bytesUsed = swap->bytesTotal - swap->bytesUsed; - swap->bytesTotal *= instance.state.platform.pageSize; - swap->bytesUsed *= instance.state.platform.pageSize; + swap->bytesTotal *= instance.state.platform.sysinfo.pageSize; + swap->bytesUsed *= instance.state.platform.sysinfo.pageSize; return NULL; } diff --git a/src/detection/swap/swap_windows.c b/src/detection/swap/swap_windows.c index 5b3a15457d..322516fdbe 100644 --- a/src/detection/swap/swap_windows.c +++ b/src/detection/swap/swap_windows.c @@ -13,7 +13,7 @@ const char* ffDetectSwap(FFSwapResult* swap) if(!NT_SUCCESS(NtQuerySystemInformation(SystemPagefileInformation, pstart, size, &size))) return "NtQuerySystemInformation(SystemPagefileInformation, size) failed"; - uint32_t pageSize = instance.state.platform.pageSize; + uint32_t pageSize = instance.state.platform.sysinfo.pageSize; swap->bytesUsed = (uint64_t)pstart->TotalUsed * pageSize; swap->bytesTotal = (uint64_t)pstart->CurrentSize * pageSize; diff --git a/src/detection/terminalshell/terminalshell.c b/src/detection/terminalshell/terminalshell.c index f4e4ccdef8..57ccb6a89b 100644 --- a/src/detection/terminalshell/terminalshell.c +++ b/src/detection/terminalshell/terminalshell.c @@ -500,7 +500,7 @@ static bool getTerminalVersionKitty(FFstrbuf* exe, FFstrbuf* version) return getExeVersionGeneral(exe, version); } -static bool getTerminalVersionPtyxis(FF_MAYBE_UNUSED FFstrbuf* exe, FFstrbuf* version) +FF_MAYBE_UNUSED static bool getTerminalVersionPtyxis(FF_MAYBE_UNUSED FFstrbuf* exe, FFstrbuf* version) { if(ffProcessAppendStdOut(version, (char* const[]) { "ptyxis", diff --git a/src/detection/version/version.c b/src/detection/version/version.c index 3bb4f2f8a4..b6d6e7d777 100644 --- a/src/detection/version/version.c +++ b/src/detection/version/version.c @@ -20,43 +20,61 @@ #define FF_ARCHITECTURE "unknown" #endif + +#if defined(__linux__) + #define FF_SYSNAME "Linux" +#elif defined(__FreeBSD__) + #define FF_SYSNAME "FreeBSD" +#elif defined(__APPLE__) + #define FF_SYSNAME "Darwin" +#elif defined(_WIN32) + #define FF_SYSNAME "WIN32" +#elif defined(__sun) + #define FF_SYSNAME "SunOS" +#else + #define FF_SYSNAME "unknown" +#endif + #define FF_STR_INDIR(x) #x #define FF_STR(x) FF_STR_INDIR(x) -void ffDetectVersion(FFVersionResult* version) -{ - version->projectName = FASTFETCH_PROJECT_NAME; - version->architecture = FF_ARCHITECTURE; - version->version = FASTFETCH_PROJECT_VERSION; - version->versionTweak = FASTFETCH_PROJECT_VERSION_TWEAK; - version->cmakeBuiltType = FASTFETCH_PROJECT_CMAKE_BUILD_TYPE; - version->compileTime = __DATE__ ", " __TIME__; +FFVersionResult ffVersionResult = { + .projectName = FASTFETCH_PROJECT_NAME, + .sysName = FF_SYSNAME, + .architecture = FF_ARCHITECTURE, + .version = FASTFETCH_PROJECT_VERSION, + .versionTweak = FASTFETCH_PROJECT_VERSION_TWEAK, + .cmakeBuiltType = FASTFETCH_PROJECT_CMAKE_BUILD_TYPE, + .compileTime = __DATE__ ", " __TIME__, + .compiler = + #ifdef __clang__ - version->compiler = - #ifdef _MSC_VER - "clang-cl " ; - #elif defined(__APPLE__) && defined(__apple_build_version__) - "Apple clang " - #else - "clang " - #endif - - FF_STR(__clang_major__) "." FF_STR(__clang_minor__) "." FF_STR(__clang_patchlevel__) - - #if defined(__APPLE__) && defined(__apple_build_version__) - " (" FF_STR(__apple_build_version__) ")" - #endif - ; + #ifdef _MSC_VER + "clang-cl " ; + #elif defined(__APPLE__) && defined(__apple_build_version__) + "Apple clang " + #else + "clang " + #endif + + FF_STR(__clang_major__) "." FF_STR(__clang_minor__) "." FF_STR(__clang_patchlevel__) + + #if defined(__APPLE__) && defined(__apple_build_version__) + " (" FF_STR(__apple_build_version__) ")" + #endif + , #elif defined(__GNUC__) - version->compiler = "gcc " FF_STR(__GNUC__) "." FF_STR(__GNUC_MINOR__) "." FF_STR(__GNUC_PATCHLEVEL__); + "gcc " FF_STR(__GNUC__) "." FF_STR(__GNUC_MINOR__) "." FF_STR(__GNUC_PATCHLEVEL__), #elif defined(_MSC_VER) - version->compiler = "msvc " FF_STR(_MSC_VER); + "msvc " FF_STR(_MSC_VER), #else - version->compiler = "unknown"; + "unknown", #endif + + .debugMode = #ifndef NDEBUG - version->debugMode = true; + true, #else - version->debugMode = false; + false, #endif -} +}; diff --git a/src/detection/version/version.h b/src/detection/version/version.h index 5227561e0d..7bb9bd56d5 100644 --- a/src/detection/version/version.h +++ b/src/detection/version/version.h @@ -5,6 +5,7 @@ typedef struct FFVersionResult { const char* projectName; + const char* sysName; const char* architecture; const char* version; const char* versionTweak; @@ -14,4 +15,4 @@ typedef struct FFVersionResult bool debugMode; } FFVersionResult; -void ffDetectVersion(FFVersionResult* version); +extern FFVersionResult ffVersionResult; diff --git a/src/fastfetch.c b/src/fastfetch.c index 9d11507fa0..12de044e56 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -501,9 +501,8 @@ static void optionParseConfigFile(FFdata* data, const char* key, const char* val static void printVersion() { - FFVersionResult result = {}; - ffDetectVersion(&result); - printf("%s %s%s%s (%s)\n", result.projectName, result.version, result.versionTweak, result.debugMode ? "-debug" : "", result.architecture); + FFVersionResult* result = &ffVersionResult; + printf("%s %s%s%s (%s)\n", result->projectName, result->version, result->versionTweak, result->debugMode ? "-debug" : "", result->architecture); } static void parseCommand(FFdata* data, char* key, char* value) diff --git a/src/logo/logo.c b/src/logo/logo.c index 51b990aab0..9770fb0c1d 100644 --- a/src/logo/logo.c +++ b/src/logo/logo.c @@ -340,7 +340,7 @@ static const FFlogo* logoGetBuiltinDetected(FFLogoSize size) if(logo != NULL) return logo; - logo = logoGetBuiltin(&instance.state.platform.systemName, size); + logo = logoGetBuiltin(&instance.state.platform.sysinfo.name, size); if(logo != NULL) return logo; diff --git a/src/modules/kernel/kernel.c b/src/modules/kernel/kernel.c index 862ee19892..5e171faf54 100644 --- a/src/modules/kernel/kernel.c +++ b/src/modules/kernel/kernel.c @@ -3,29 +3,32 @@ #include "modules/kernel/kernel.h" #include "util/stringUtils.h" -#define FF_KERNEL_NUM_FORMAT_ARGS 5 +#define FF_KERNEL_NUM_FORMAT_ARGS 6 void ffPrintKernel(FFKernelOptions* options) { - const FFPlatform* platform = &instance.state.platform; + const FFPlatformSysinfo* info = &instance.state.platform.sysinfo; if(options->moduleArgs.outputFormat.length == 0) { ffPrintLogoAndKey(FF_KERNEL_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT); - printf("%s %s", platform->systemName.chars, platform->systemRelease.chars); + printf("%s %s", info->name.chars, info->release.chars); - if(platform->systemDisplayVersion.length > 0) - printf(" (%s)\n", platform->systemDisplayVersion.chars); + if(info->displayVersion.length > 0) + printf(" (%s)\n", info->displayVersion.chars); else putchar('\n'); } else { + FF_STRBUF_AUTO_DESTROY str = ffStrbufCreate(); + ffParseSize(info->pageSize, &str); FF_PRINT_FORMAT_CHECKED(FF_KERNEL_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, FF_KERNEL_NUM_FORMAT_ARGS, ((FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &platform->systemName, "sysname"}, - {FF_FORMAT_ARG_TYPE_STRBUF, &platform->systemRelease, "release"}, - {FF_FORMAT_ARG_TYPE_STRBUF, &platform->systemVersion, "version"}, - {FF_FORMAT_ARG_TYPE_STRBUF, &platform->systemArchitecture, "arch"}, - {FF_FORMAT_ARG_TYPE_STRBUF, &platform->systemDisplayVersion, "display-version"}, + {FF_FORMAT_ARG_TYPE_STRBUF, &info->name, "sysname"}, + {FF_FORMAT_ARG_TYPE_STRBUF, &info->release, "release"}, + {FF_FORMAT_ARG_TYPE_STRBUF, &info->version, "version"}, + {FF_FORMAT_ARG_TYPE_STRBUF, &info->architecture, "arch"}, + {FF_FORMAT_ARG_TYPE_STRBUF, &info->displayVersion, "display-version"}, + {FF_FORMAT_ARG_TYPE_STRBUF, &str, "page-size"}, })); } } @@ -67,12 +70,15 @@ void ffGenerateKernelJsonConfig(FFKernelOptions* options, yyjson_mut_doc* doc, y void ffGenerateKernelJsonResult(FF_MAYBE_UNUSED FFKernelOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { + const FFPlatformSysinfo* info = &instance.state.platform.sysinfo; + yyjson_mut_val* obj = yyjson_mut_obj_add_obj(doc, module, "result"); - yyjson_mut_obj_add_strbuf(doc, obj, "architecture", &instance.state.platform.systemArchitecture); - yyjson_mut_obj_add_strbuf(doc, obj, "name", &instance.state.platform.systemName); - yyjson_mut_obj_add_strbuf(doc, obj, "release", &instance.state.platform.systemRelease); - yyjson_mut_obj_add_strbuf(doc, obj, "version", &instance.state.platform.systemVersion); - yyjson_mut_obj_add_strbuf(doc, obj, "displayVersion", &instance.state.platform.systemDisplayVersion); + yyjson_mut_obj_add_strbuf(doc, obj, "architecture", &info->architecture); + yyjson_mut_obj_add_strbuf(doc, obj, "name", &info->name); + yyjson_mut_obj_add_strbuf(doc, obj, "release", &info->release); + yyjson_mut_obj_add_strbuf(doc, obj, "version", &info->version); + yyjson_mut_obj_add_strbuf(doc, obj, "displayVersion", &info->displayVersion); + yyjson_mut_obj_add_uint(doc, obj, "pageSize", info->pageSize); } void ffPrintKernelHelpFormat(void) @@ -83,6 +89,7 @@ void ffPrintKernelHelpFormat(void) "Version - version", "Architecture - arch", "Display version - display-version", + "Page size - page-size", })); } diff --git a/src/modules/os/os.c b/src/modules/os/os.c index 1e0d6842c1..3d1aadebd0 100644 --- a/src/modules/os/os.c +++ b/src/modules/os/os.c @@ -19,7 +19,7 @@ static void buildOutputDefault(const FFOSResult* os, FFstrbuf* result) else if(os->id.length > 0) ffStrbufAppend(result, &os->id); else - ffStrbufAppend(result, &instance.state.platform.systemName); + ffStrbufAppend(result, &instance.state.platform.sysinfo.name); //Append code name if it is missing if(os->codename.length > 0 && !ffStrbufContainIgnCase(result, &os->codename)) @@ -55,10 +55,10 @@ static void buildOutputDefault(const FFOSResult* os, FFstrbuf* result) } //Append architecture if it is missing - if(!ffStrbufContainIgnCase(result, &instance.state.platform.systemArchitecture)) + if(!ffStrbufContainIgnCase(result, &instance.state.platform.sysinfo.architecture)) { ffStrbufAppendC(result, ' '); - ffStrbufAppend(result, &instance.state.platform.systemArchitecture); + ffStrbufAppend(result, &instance.state.platform.sysinfo.architecture); } } @@ -80,10 +80,10 @@ static void buildOutputNixOS(const FFOSResult* os, FFstrbuf* result) ffStrbufAppendC(result, ')'); } - if(instance.state.platform.systemArchitecture.length > 0) + if(instance.state.platform.sysinfo.architecture.length > 0) { ffStrbufAppendC(result, ' '); - ffStrbufAppend(result, &instance.state.platform.systemArchitecture); + ffStrbufAppend(result, &instance.state.platform.sysinfo.architecture); } } @@ -112,7 +112,7 @@ void ffPrintOS(FFOSOptions* options) else { FF_PRINT_FORMAT_CHECKED(FF_OS_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, FF_OS_NUM_FORMAT_ARGS, ((FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &instance.state.platform.systemName, "sysname"}, + {FF_FORMAT_ARG_TYPE_STRBUF, &instance.state.platform.sysinfo.name, "sysname"}, {FF_FORMAT_ARG_TYPE_STRBUF, &os->name, "name"}, {FF_FORMAT_ARG_TYPE_STRBUF, &os->prettyName, "pretty-name"}, {FF_FORMAT_ARG_TYPE_STRBUF, &os->id, "id"}, @@ -123,7 +123,7 @@ void ffPrintOS(FFOSOptions* options) {FF_FORMAT_ARG_TYPE_STRBUF, &os->versionID, "version-id"}, {FF_FORMAT_ARG_TYPE_STRBUF, &os->codename, "codename"}, {FF_FORMAT_ARG_TYPE_STRBUF, &os->buildID, "build-id"}, - {FF_FORMAT_ARG_TYPE_STRBUF, &instance.state.platform.systemArchitecture, "arch"} + {FF_FORMAT_ARG_TYPE_STRBUF, &instance.state.platform.sysinfo.architecture, "arch"} })); } } diff --git a/src/modules/title/title.c b/src/modules/title/title.c index 115cd61e59..bc57067491 100644 --- a/src/modules/title/title.c +++ b/src/modules/title/title.c @@ -176,7 +176,6 @@ void ffGenerateTitleJsonResult(FF_MAYBE_UNUSED FFTitleOptions* options, yyjson_m yyjson_mut_obj_add_strbuf(doc, obj, "homeDir", &instance.state.platform.homeDir); yyjson_mut_obj_add_strbuf(doc, obj, "exePath", &instance.state.platform.exePath); yyjson_mut_obj_add_strbuf(doc, obj, "userShell", &instance.state.platform.userShell); - yyjson_mut_obj_add_uint(doc, obj, "pageSize", instance.state.platform.pageSize); } void ffPrintTitleHelpFormat(void) diff --git a/src/modules/version/version.c b/src/modules/version/version.c index 66a4f0fb73..c7c7296065 100644 --- a/src/modules/version/version.c +++ b/src/modules/version/version.c @@ -5,17 +5,16 @@ #include "modules/version/version.h" #include "util/stringUtils.h" -#define FF_VERSION_NUM_FORMAT_ARGS 9 +#define FF_VERSION_NUM_FORMAT_ARGS 10 void ffPrintVersion(FFVersionOptions* options) { - FFVersionResult result; - ffDetectVersion(&result); + FFVersionResult* result = &ffVersionResult; if(options->moduleArgs.outputFormat.length == 0) { ffPrintLogoAndKey(FF_VERSION_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT); - printf("%s %s%s%s (%s)\n", result.projectName, result.version, result.versionTweak, result.debugMode ? "-debug" : "", result.architecture); + printf("%s %s%s%s (%s)\n", result->projectName, result->version, result->versionTweak, result->debugMode ? "-debug" : "", result->architecture); } else { @@ -32,14 +31,15 @@ void ffPrintVersion(FFVersionOptions* options) } FF_PRINT_FORMAT_CHECKED(FF_VERSION_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, FF_VERSION_NUM_FORMAT_ARGS, ((FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRING, result.projectName, "project-name"}, - {FF_FORMAT_ARG_TYPE_STRING, result.version, "version"}, - {FF_FORMAT_ARG_TYPE_STRING, result.versionTweak, "version-tweak"}, - {FF_FORMAT_ARG_TYPE_STRING, result.debugMode ? "debug" : "release", "build-type"}, - {FF_FORMAT_ARG_TYPE_STRING, result.architecture, "arch"}, - {FF_FORMAT_ARG_TYPE_STRING, result.cmakeBuiltType, "cmake-built-type"}, - {FF_FORMAT_ARG_TYPE_STRING, result.compileTime, "compile-time"}, - {FF_FORMAT_ARG_TYPE_STRING, result.compiler, "compiler"}, + {FF_FORMAT_ARG_TYPE_STRING, result->projectName, "project-name"}, + {FF_FORMAT_ARG_TYPE_STRING, result->version, "version"}, + {FF_FORMAT_ARG_TYPE_STRING, result->versionTweak, "version-tweak"}, + {FF_FORMAT_ARG_TYPE_STRING, result->debugMode ? "debug" : "release", "build-type"}, + {FF_FORMAT_ARG_TYPE_STRING, result->sysName, "sysname"}, + {FF_FORMAT_ARG_TYPE_STRING, result->architecture, "arch"}, + {FF_FORMAT_ARG_TYPE_STRING, result->cmakeBuiltType, "cmake-built-type"}, + {FF_FORMAT_ARG_TYPE_STRING, result->compileTime, "compile-time"}, + {FF_FORMAT_ARG_TYPE_STRING, result->compiler, "compiler"}, {FF_FORMAT_ARG_TYPE_STRBUF, &buf, "libc-used"}, })); } @@ -82,18 +82,18 @@ void ffGenerateVersionJsonConfig(FFVersionOptions* options, yyjson_mut_doc* doc, void ffGenerateVersionJsonResult(FF_MAYBE_UNUSED FFVersionOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { - FFVersionResult result; - ffDetectVersion(&result); + FFVersionResult* result = &ffVersionResult; yyjson_mut_val* obj = yyjson_mut_obj_add_obj(doc, module, "result"); - yyjson_mut_obj_add_str(doc, obj, "projectName", result.projectName); - yyjson_mut_obj_add_str(doc, obj, "architecture", result.architecture); - yyjson_mut_obj_add_str(doc, obj, "version", result.version); - yyjson_mut_obj_add_str(doc, obj, "versionTweak", result.versionTweak); - yyjson_mut_obj_add_str(doc, obj, "cmakeBuiltType", result.cmakeBuiltType); - yyjson_mut_obj_add_str(doc, obj, "compileTime", result.compileTime); - yyjson_mut_obj_add_str(doc, obj, "compiler", result.compiler); - yyjson_mut_obj_add_bool(doc, obj, "debugMode", result.debugMode); + yyjson_mut_obj_add_str(doc, obj, "projectName", result->projectName); + yyjson_mut_obj_add_str(doc, obj, "sysName", result->sysName); + yyjson_mut_obj_add_str(doc, obj, "architecture", result->architecture); + yyjson_mut_obj_add_str(doc, obj, "version", result->version); + yyjson_mut_obj_add_str(doc, obj, "versionTweak", result->versionTweak); + yyjson_mut_obj_add_str(doc, obj, "cmakeBuiltType", result->cmakeBuiltType); + yyjson_mut_obj_add_str(doc, obj, "compileTime", result->compileTime); + yyjson_mut_obj_add_str(doc, obj, "compiler", result->compiler); + yyjson_mut_obj_add_bool(doc, obj, "debugMode", result->debugMode); FFLibcResult libcResult; if (ffDetectLibc(&libcResult)) @@ -119,6 +119,7 @@ void ffPrintVersionHelpFormat(void) "Version - version", "Version tweak - version-tweak", "Build type (debug or release) - build-type", + "System name - sysname", "Architecture - arch", "CMake build type when compiling (Debug, Release, RelWithDebInfo, MinSizeRel) - cmake-built-type", "Date time when compiling - compile-time", diff --git a/src/util/platform/FFPlatform.c b/src/util/platform/FFPlatform.c index 8ce979044e..cb044f7503 100644 --- a/src/util/platform/FFPlatform.c +++ b/src/util/platform/FFPlatform.c @@ -1,6 +1,7 @@ #include "FFPlatform_private.h" #include "util/stringUtils.h" #include "common/io/io.h" +#include "detection/version/version.h" void ffPlatformInit(FFPlatform* platform) { @@ -14,30 +15,20 @@ void ffPlatformInit(FFPlatform* platform) ffStrbufInit(&platform->hostName); ffStrbufInit(&platform->userShell); - ffStrbufInit(&platform->systemName); - ffStrbufInit(&platform->systemRelease); - ffStrbufInit(&platform->systemVersion); - ffStrbufInit(&platform->systemArchitecture); + FFPlatformSysinfo* info = &platform->sysinfo; + + ffStrbufInit(&info->name); + ffStrbufInit(&info->release); + ffStrbufInit(&info->version); + ffStrbufInit(&info->architecture); ffPlatformInitImpl(platform); - if(platform->systemName.length == 0) - { - #if defined(__linux__) - ffStrbufAppendS(&platform->systemName, "Linux"); - #elif defined(__FreeBSD__) - ffStrbufAppendS(&platform->systemName, "FreeBSD"); - #elif defined(__APPLE__) - ffStrbufAppendS(&platform->systemName, "Darwin"); - #elif defined(_WIN32) - ffStrbufAppendS(&platform->systemName, "Windows_NT"); - #else - ffStrbufAppendS(&platform->systemName, "Unknown"); - #endif - } + if(info->name.length == 0) + ffStrbufSetStatic(&info->name, ffVersionResult.sysName); - if(platform->systemArchitecture.length == 0) - ffStrbufAppendS(&platform->systemArchitecture, "Unknown"); + if(info->architecture.length == 0) + ffStrbufSetStatic(&info->architecture, ffVersionResult.architecture); } void ffPlatformDestroy(FFPlatform* platform) @@ -58,11 +49,12 @@ void ffPlatformDestroy(FFPlatform* platform) ffStrbufDestroy(&platform->hostName); ffStrbufDestroy(&platform->userShell); - ffStrbufDestroy(&platform->systemArchitecture); - ffStrbufDestroy(&platform->systemName); - ffStrbufDestroy(&platform->systemRelease); - ffStrbufDestroy(&platform->systemVersion); - ffStrbufDestroy(&platform->systemDisplayVersion); + FFPlatformSysinfo* info = &platform->sysinfo; + ffStrbufDestroy(&info->architecture); + ffStrbufDestroy(&info->name); + ffStrbufDestroy(&info->release); + ffStrbufDestroy(&info->version); + ffStrbufDestroy(&info->displayVersion); } void ffPlatformPathAddAbsolute(FFlist* dirs, const char* path) diff --git a/src/util/platform/FFPlatform.h b/src/util/platform/FFPlatform.h index 8594e2039c..5dd6c0efa6 100644 --- a/src/util/platform/FFPlatform.h +++ b/src/util/platform/FFPlatform.h @@ -3,7 +3,18 @@ #include "util/FFstrbuf.h" #include "util/FFlist.h" -typedef struct FFPlatform { +typedef struct FFPlatformSysinfo +{ + FFstrbuf name; + FFstrbuf release; + FFstrbuf version; + FFstrbuf architecture; + FFstrbuf displayVersion; + uint32_t pageSize; +} FFPlatformSysinfo; + +typedef struct FFPlatform +{ FFstrbuf homeDir; // Trailing slash included FFstrbuf cacheDir; // Trailing slash included FFlist configDirs; // List of FFstrbuf, trailing slash included @@ -14,13 +25,7 @@ typedef struct FFPlatform { FFstrbuf hostName; FFstrbuf userShell; - FFstrbuf systemName; - FFstrbuf systemRelease; - FFstrbuf systemVersion; - FFstrbuf systemArchitecture; - FFstrbuf systemDisplayVersion; - - uint32_t pageSize; + FFPlatformSysinfo sysinfo; } FFPlatform; void ffPlatformInit(FFPlatform* platform); diff --git a/src/util/platform/FFPlatform_unix.c b/src/util/platform/FFPlatform_unix.c index 4ba4d2a5f3..b442eed54f 100644 --- a/src/util/platform/FFPlatform_unix.c +++ b/src/util/platform/FFPlatform_unix.c @@ -169,13 +169,19 @@ static void getUserShell(FFPlatform* platform, const struct passwd* pwd) ffStrbufAppendS(&platform->userShell, shell); } -static void getPageSize(FFPlatform* platform) +static void getSysinfo(FFPlatformSysinfo* info, const struct utsname* uts) { + ffStrbufAppendS(&info->name, uts->sysname); + ffStrbufAppendS(&info->release, uts->release); + ffStrbufAppendS(&info->version, uts->version); + ffStrbufAppendS(&info->architecture, uts->machine); + ffStrbufInit(&info->displayVersion); + #if defined(__FreeBSD__) || defined(__APPLE__) - size_t length = sizeof(platform->pageSize); - sysctl((int[]){ CTL_HW, HW_PAGESIZE }, 2, &platform->pageSize, &length, NULL, 0); + size_t length = sizeof(info->pageSize); + sysctl((int[]){ CTL_HW, HW_PAGESIZE }, 2, &info->pageSize, &length, NULL, 0); #else - platform->pageSize = (uint32_t) sysconf(_SC_PAGESIZE); + info->pageSize = (uint32_t) sysconf(_SC_PAGESIZE); #endif } @@ -197,11 +203,5 @@ void ffPlatformInitImpl(FFPlatform* platform) getHostName(platform, &uts); getUserShell(platform, pwd); - ffStrbufAppendS(&platform->systemName, uts.sysname); - ffStrbufAppendS(&platform->systemRelease, uts.release); - ffStrbufAppendS(&platform->systemVersion, uts.version); - ffStrbufAppendS(&platform->systemArchitecture, uts.machine); - ffStrbufInit(&platform->systemDisplayVersion); - - getPageSize(platform); + getSysinfo(&platform->sysinfo, &uts); } diff --git a/src/util/platform/FFPlatform_windows.c b/src/util/platform/FFPlatform_windows.c index d5c690c633..961f88237a 100644 --- a/src/util/platform/FFPlatform_windows.c +++ b/src/util/platform/FFPlatform_windows.c @@ -159,7 +159,7 @@ static void getUserShell(FFPlatform* platform) ffStrbufReplaceAllC(&platform->userShell, '\\', '/'); } -static void getSystemReleaseAndVersion(FFPlatform* platform) +static void getSystemReleaseAndVersion(FFPlatformSysinfo* info) { RTL_OSVERSIONINFOW osVersion = { .dwOSVersionInfoSize = sizeof(osVersion) }; if (!NT_SUCCESS(RtlGetVersion(&osVersion))) @@ -172,39 +172,39 @@ static void getSystemReleaseAndVersion(FFPlatform* platform) uint32_t ubr = 0; ffRegReadUint(hKey, L"UBR", &ubr, NULL); - ffStrbufAppendF(&platform->systemRelease, + ffStrbufAppendF(&info->release, "%u.%u.%u.%u", (unsigned) osVersion.dwMajorVersion, (unsigned) osVersion.dwMinorVersion, (unsigned) osVersion.dwBuildNumber, (unsigned) ubr); - ffStrbufInit(&platform->systemDisplayVersion); - if(!ffRegReadStrbuf(hKey, L"DisplayVersion", &platform->systemDisplayVersion, NULL)) + ffStrbufInit(&info->displayVersion); + if(!ffRegReadStrbuf(hKey, L"DisplayVersion", &info->displayVersion, NULL)) { if (osVersion.szCSDVersion[0]) - ffStrbufSetWS(&platform->systemDisplayVersion, osVersion.szCSDVersion); + ffStrbufSetWS(&info->displayVersion, osVersion.szCSDVersion); else - ffRegReadStrbuf(hKey, L"ReleaseId", &platform->systemDisplayVersion, NULL); // For old Windows 10 + ffRegReadStrbuf(hKey, L"ReleaseId", &info->displayVersion, NULL); // For old Windows 10 } - ffRegReadStrbuf(hKey, L"BuildLabEx", &platform->systemVersion, NULL); + ffRegReadStrbuf(hKey, L"BuildLabEx", &info->version, NULL); switch (osVersion.dwPlatformId) { case VER_PLATFORM_WIN32s: - ffStrbufSetStatic(&platform->systemName, "WIN32s"); + ffStrbufSetStatic(&info->name, "WIN32s"); break; case VER_PLATFORM_WIN32_WINDOWS: - ffStrbufSetStatic(&platform->systemName, "WIN32_WINDOWS"); + ffStrbufSetStatic(&info->name, "WIN32_WINDOWS"); break; case VER_PLATFORM_WIN32_NT: - ffStrbufSetStatic(&platform->systemName, "WIN32_NT"); + ffStrbufSetStatic(&info->name, "WIN32_NT"); break; } } -static void getSystemArchitectureAndPageSize(FFPlatform* platform) +static void getSystemArchitectureAndPageSize(FFPlatformSysinfo* info) { SYSTEM_INFO sysInfo; GetNativeSystemInfo(&sysInfo); @@ -212,52 +212,53 @@ static void getSystemArchitectureAndPageSize(FFPlatform* platform) switch(sysInfo.wProcessorArchitecture) { case PROCESSOR_ARCHITECTURE_AMD64: - ffStrbufSetStatic(&platform->systemArchitecture, "x86_64"); + ffStrbufSetStatic(&info->architecture, "x86_64"); break; case PROCESSOR_ARCHITECTURE_IA64: - ffStrbufSetStatic(&platform->systemArchitecture, "ia64"); + ffStrbufSetStatic(&info->architecture, "ia64"); break; case PROCESSOR_ARCHITECTURE_INTEL: switch (sysInfo.wProcessorLevel) { case 4: - ffStrbufSetStatic(&platform->systemArchitecture, "i486"); + ffStrbufSetStatic(&info->architecture, "i486"); break; case 5: - ffStrbufSetStatic(&platform->systemArchitecture, "i586"); + ffStrbufSetStatic(&info->architecture, "i586"); break; case 6: - ffStrbufSetStatic(&platform->systemArchitecture, "i686"); + ffStrbufSetStatic(&info->architecture, "i686"); break; default: - ffStrbufSetStatic(&platform->systemArchitecture, "i386"); + ffStrbufSetStatic(&info->architecture, "i386"); break; } break; case PROCESSOR_ARCHITECTURE_ARM64: - ffStrbufSetStatic(&platform->systemArchitecture, "aarch64"); + ffStrbufSetStatic(&info->architecture, "aarch64"); break; case PROCESSOR_ARCHITECTURE_ARM: - ffStrbufSetStatic(&platform->systemArchitecture, "arm"); + ffStrbufSetStatic(&info->architecture, "arm"); break; case PROCESSOR_ARCHITECTURE_PPC: - ffStrbufSetStatic(&platform->systemArchitecture, "ppc"); + ffStrbufSetStatic(&info->architecture, "ppc"); break; case PROCESSOR_ARCHITECTURE_MIPS: - ffStrbufSetStatic(&platform->systemArchitecture, "mips"); + ffStrbufSetStatic(&info->architecture, "mips"); break; case PROCESSOR_ARCHITECTURE_ALPHA: - ffStrbufSetStatic(&platform->systemArchitecture, "alpha"); + ffStrbufSetStatic(&info->architecture, "alpha"); break; case PROCESSOR_ARCHITECTURE_ALPHA64: - ffStrbufSetStatic(&platform->systemArchitecture, "alpha64"); + ffStrbufSetStatic(&info->architecture, "alpha64"); break; case PROCESSOR_ARCHITECTURE_UNKNOWN: default: + ffStrbufSetStatic(&info->architecture, "unknown"); break; } - platform->pageSize = sysInfo.dwPageSize; + info->pageSize = sysInfo.dwPageSize; } void ffPlatformInitImpl(FFPlatform* platform) @@ -272,6 +273,6 @@ void ffPlatformInitImpl(FFPlatform* platform) getHostName(platform); getUserShell(platform); - getSystemReleaseAndVersion(platform); - getSystemArchitectureAndPageSize(platform); + getSystemReleaseAndVersion(&platform->sysinfo); + getSystemArchitectureAndPageSize(&platform->sysinfo); } From 9946a5d7587c7bb03fb029534cba4657db607cd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 2 Jul 2024 14:14:16 +0800 Subject: [PATCH 16/33] CI: add stale.yml [ci skip] --- .github/stale.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/stale.yml diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 0000000000..cc3c9869e9 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,21 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 60 + +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 + +# Issues with these labels will never be considered stale +exemptLabels: + - keepalive + +# Label to use when marking an issue as stale +staleLabel: stale + +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. + +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false From 9d2c4f52d26496118f230dc637d20c63c8bcb2d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 2 Jul 2024 15:00:39 +0800 Subject: [PATCH 17/33] CI: clean up --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8a3d7025dd..9e6c9a4f60 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -375,7 +375,6 @@ jobs: - name: checkout repository uses: actions/checkout@v4 - - uses: actions/checkout@v4 - name: run VM uses: vmactions/omnios-vm@v1 with: From fa5aaa692fe98f423e223c7abfa41e4de90419cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 2 Jul 2024 15:12:28 +0800 Subject: [PATCH 18/33] Doc: update copyright [ci skip] --- LICENSE | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index d4d2d2aacf..ac6f147eaf 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,7 @@ MIT License -Copyright (c) 2021 Linus Dierheimer +Copyright (c) 2021-2023 Linus Dierheimer +Copyright (c) 2022-2024 Carter Li Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 06f3b9a96d1fcb63bde8900f245747dc915664db Mon Sep 17 00:00:00 2001 From: Carter Li Date: Wed, 3 Jul 2024 09:09:06 +0800 Subject: [PATCH 19/33] DE (Linux): improve Cinnamon version detection Fix #1068 --- src/detection/de/de_linux.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/detection/de/de_linux.c b/src/detection/de/de_linux.c index ab6a93b7c6..7b31160ed4 100644 --- a/src/detection/de/de_linux.c +++ b/src/detection/de/de_linux.c @@ -74,7 +74,20 @@ static void getGnome(FFstrbuf* result, FF_MAYBE_UNUSED FFDEOptions* options) static void getCinnamon(FFstrbuf* result, FF_MAYBE_UNUSED FFDEOptions* options) { - ffParsePropFileData("applications/cinnamon.desktop", "X-GNOME-Bugzilla-Version =", result); + ffStrbufSetS(result, getenv("CINNAMON_VERSION")); + + if (result->length == 0) + ffParsePropFileData("applications/cinnamon.desktop", "X-GNOME-Bugzilla-Version =", result); + + if (!result->length == 0 && options->slowVersionDetection) + { + if (ffProcessAppendStdOut(result, (char* const[]){ + "cinnamon", + "--version", + NULL + }) == NULL) // Cinnamon 6.2.2 + ffStrbufSubstrAfterLastC(result, ' '); + } } static void getMate(FFstrbuf* result, FFDEOptions* options) From 58ebde422aca83e0e705b96dc0f959dc3bb1c5a0 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Wed, 3 Jul 2024 09:51:30 +0800 Subject: [PATCH 20/33] WMTheme: support cinnamon-wayland --- src/detection/displayserver/linux/wmde.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/detection/displayserver/linux/wmde.c b/src/detection/displayserver/linux/wmde.c index 22531bb4d3..9fda2f9d7a 100644 --- a/src/detection/displayserver/linux/wmde.c +++ b/src/detection/displayserver/linux/wmde.c @@ -86,7 +86,8 @@ static void applyPrettyNameIfWM(FFDisplayServerResult* result, const char* name) ffStrEqualsIgnCase(name, "Mutter") ) ffStrbufSetS(&result->wmPrettyName, FF_WM_PRETTY_MUTTER); else if( - ffStrEqualsIgnCase(name, "cinnamon-session") || + ffStrEqualsIgnCase(name, "cinnamon") || + ffStrStartsWithIgnCase(name, "cinnamon-") || ffStrEqualsIgnCase(name, "Muffin") || ffStrEqualsIgnCase(name, "Mutter (Muffin)") ) ffStrbufSetS(&result->wmPrettyName, FF_WM_PRETTY_MUFFIN); From 2bba2eaa16526c0579537f006f2324895ef8d2ef Mon Sep 17 00:00:00 2001 From: Carter Li Date: Wed, 3 Jul 2024 09:51:46 +0800 Subject: [PATCH 21/33] WM: minor code cleanup --- src/detection/displayserver/linux/wayland/wayland.c | 1 - src/detection/displayserver/linux/wmde.c | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/detection/displayserver/linux/wayland/wayland.c b/src/detection/displayserver/linux/wayland/wayland.c index 181a02b037..9628dcdd7a 100644 --- a/src/detection/displayserver/linux/wayland/wayland.c +++ b/src/detection/displayserver/linux/wayland/wayland.c @@ -23,7 +23,6 @@ static void waylandDetectWM(int fd, FFDisplayServerResult* result) FF_STRBUF_AUTO_DESTROY procPath = ffStrbufCreate(); ffStrbufAppendF(&procPath, "/proc/%d/cmdline", ucred.pid); //We check the cmdline for the process name, because it is not trimmed. ffReadFileBuffer(procPath.chars, &result->wmProcessName); - ffStrbufTrimRightSpace(&result->wmProcessName); ffStrbufSubstrBeforeFirstC(&result->wmProcessName, '\0'); //Trim the arguments ffStrbufSubstrAfterLastC(&result->wmProcessName, '/'); //Trim the path } diff --git a/src/detection/displayserver/linux/wmde.c b/src/detection/displayserver/linux/wmde.c index 9fda2f9d7a..0319cdd454 100644 --- a/src/detection/displayserver/linux/wmde.c +++ b/src/detection/displayserver/linux/wmde.c @@ -71,11 +71,8 @@ static void applyPrettyNameIfWM(FFDisplayServerResult* result, const char* name) return; if( - ffStrEqualsIgnCase(name, "kwin_wayland") || - ffStrEqualsIgnCase(name, "kwin_wayland_wrapper") || - ffStrEqualsIgnCase(name, "kwin_x11") || - ffStrEqualsIgnCase(name, "kwin_x11_wrapper") || ffStrEqualsIgnCase(name, "kwin") || + ffStrStartsWithIgnCase(name, "kwin_") || ffStrEndsWithIgnCase(name, "-kwin_wayland") || ffStrEndsWithIgnCase(name, "-kwin_x11") ) ffStrbufSetS(&result->wmPrettyName, FF_WM_PRETTY_KWIN); From 321d3e5574771fc2d2c4d8f2fe65eb443582fe39 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Wed, 3 Jul 2024 09:54:00 +0800 Subject: [PATCH 22/33] CMake: don't error out if we fail to detect glibc version --- CMakeLists.txt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 025e14acd1..1a475a2550 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1322,12 +1322,17 @@ if(LINUX) set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") if(NOT IS_MUSL) - EXECUTE_PROCESS ( + EXECUTE_PROCESS( COMMAND getconf GNU_LIBC_VERSION OUTPUT_VARIABLE GLIBC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) - STRING (REPLACE "glibc " "" GLIBC_VERSION ${GLIBC_VERSION}) - set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= ${GLIBC_VERSION})") + if(GLIBC_VERSION) + STRING(REPLACE "glibc " "" GLIBC_VERSION ${GLIBC_VERSION}) + set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= ${GLIBC_VERSION})") + message(STATUS "found glibc ${GLIBC_VERSION}") + else() + message(WARNING "Could not determine glibc version. If `musl` is used, `-DIS_MUSL=ON` should be set") + endif() endif() endif() From 96e7f65902dc61a275f4b39c6693dfdf849ace9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 3 Jul 2024 13:56:35 +0800 Subject: [PATCH 23/33] DE (Linux): fix silly bug --- src/detection/de/de_linux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/detection/de/de_linux.c b/src/detection/de/de_linux.c index 7b31160ed4..a0db88a924 100644 --- a/src/detection/de/de_linux.c +++ b/src/detection/de/de_linux.c @@ -79,7 +79,7 @@ static void getCinnamon(FFstrbuf* result, FF_MAYBE_UNUSED FFDEOptions* options) if (result->length == 0) ffParsePropFileData("applications/cinnamon.desktop", "X-GNOME-Bugzilla-Version =", result); - if (!result->length == 0 && options->slowVersionDetection) + if (result->length == 0 && options->slowVersionDetection) { if (ffProcessAppendStdOut(result, (char* const[]){ "cinnamon", From 84540250f790710761e2df2cde1e26286cfdac75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 3 Jul 2024 13:59:39 +0800 Subject: [PATCH 24/33] Editor: make `--ts-version false` disable version detection --- doc/json_schema.json | 2 +- src/data/help.json | 2 +- src/detection/editor/editor.c | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/json_schema.json b/doc/json_schema.json index eded507e5a..c8a317aa3d 100644 --- a/doc/json_schema.json +++ b/doc/json_schema.json @@ -576,7 +576,7 @@ }, "tsVersion": { "type": "boolean", - "description": "Whether to detect and display the version of terminal and shell. Mainly for benchmarking", + "description": "Whether to detect and display the version of terminal, shell and editor. Mainly for benchmarking", "default": true } } diff --git a/src/data/help.json b/src/data/help.json index e7fe602976..bdefdd8e26 100644 --- a/src/data/help.json +++ b/src/data/help.json @@ -728,7 +728,7 @@ }, { "long": "ts-version", - "desc": "Whether to detect and display the version of terminal and shell", + "desc": "Whether to detect and display the version of terminal, shell and editor", "remark": "Mainly for benchmarking", "arg": { "type": "bool", diff --git a/src/detection/editor/editor.c b/src/detection/editor/editor.c index c6a281c171..84b3b2632f 100644 --- a/src/detection/editor/editor.c +++ b/src/detection/editor/editor.c @@ -26,6 +26,8 @@ const char* ffDetectEditor(FFEditorResult* result) return "$VISUAL or $EDITOR not set"; } + if (!instance.config.display.tsVersion) return NULL; + #ifndef _WIN32 if (result->name.chars[0] != '/') { From 66e7924fa3213aabc4b9394d15ac5d74727a1e2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 3 Jul 2024 15:12:48 +0800 Subject: [PATCH 25/33] Logo (Image): fix building on SunOS --- src/logo/image/image.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/logo/image/image.c b/src/logo/image/image.c index d6f75c1926..36bdea2811 100644 --- a/src/logo/image/image.c +++ b/src/logo/image/image.c @@ -12,6 +12,8 @@ #include #elif __linux__ #include +#elif __sun + #include #endif // https://github.com/kostya/benchmarks/blob/master/base64/test-nolib.c#L145 From 64cdb3f058e38e1a491233e82ec2228d2f98a934 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 3 Jul 2024 15:26:53 +0800 Subject: [PATCH 26/33] LocalIP: silence compiler warnings --- src/detection/localip/localip_linux.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/detection/localip/localip_linux.c b/src/detection/localip/localip_linux.c index 924f830fdb..9939bbcd2e 100644 --- a/src/detection/localip/localip_linux.c +++ b/src/detection/localip/localip_linux.c @@ -95,7 +95,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) continue; struct sockaddr_in* ipv4 = (struct sockaddr_in*) ifa->ifa_addr; - char addressBuffer[INET_ADDRSTRLEN + 4]; + char addressBuffer[INET_ADDRSTRLEN + 16]; inet_ntop(AF_INET, &ipv4->sin_addr, addressBuffer, INET_ADDRSTRLEN); if (options->showType & FF_LOCALIP_TYPE_PREFIX_LEN_BIT) @@ -105,7 +105,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) if (cidr != 0) { size_t len = strlen(addressBuffer); - snprintf(addressBuffer + len, 4, "/%d", cidr); + snprintf(addressBuffer + len, 16, "/%d", cidr); } } @@ -117,7 +117,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) continue; struct sockaddr_in6* ipv6 = (struct sockaddr_in6 *)ifa->ifa_addr; - char addressBuffer[INET6_ADDRSTRLEN + 4]; + char addressBuffer[INET6_ADDRSTRLEN + 16]; inet_ntop(AF_INET6, &ipv6->sin6_addr, addressBuffer, INET6_ADDRSTRLEN); if (options->showType & FF_LOCALIP_TYPE_PREFIX_LEN_BIT) @@ -130,7 +130,7 @@ const char* ffDetectLocalIps(const FFLocalIpOptions* options, FFlist* results) if (cidr != 0) { size_t len = strlen(addressBuffer); - snprintf(addressBuffer + len, 4, "/%d", cidr); + snprintf(addressBuffer + len, 16, "/%d", cidr); } } From 7b2d4b7a0d481cf3dfd1009d12129eebc8c7d3bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 3 Jul 2024 15:27:06 +0800 Subject: [PATCH 27/33] Wifi: silence compiler warnings --- src/detection/wifi/wifi_nosupport.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/detection/wifi/wifi_nosupport.c b/src/detection/wifi/wifi_nosupport.c index ae1d62e09b..cbaa367002 100644 --- a/src/detection/wifi/wifi_nosupport.c +++ b/src/detection/wifi/wifi_nosupport.c @@ -1,6 +1,6 @@ #include "wifi.h" -const char* ffDetectWifi(FFlist* result) +const char* ffDetectWifi(FF_MAYBE_UNUSED FFlist* result) { return "Not support on this platform"; } From db9cf4ef29a77b778d91e5adaccbc6e7dbd52174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 3 Jul 2024 16:10:34 +0800 Subject: [PATCH 28/33] CMake: add option `ENABLE_LTO` --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a475a2550..832d67ad5d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -74,6 +74,7 @@ cmake_dependent_option(ENABLE_THREADS "Enable multithreading" ON "Threads_FOUND" option(ENABLE_SYSTEM_YYJSON "Use system provided (instead of fastfetch embedded) yyjson library" OFF) option(ENABLE_ASAN "Build fastfetch with ASAN (address sanitizer)" OFF) +option(ENABLE_LTO "Enable link-time optimization in release mode if supported" ON) option(BUILD_TESTS "Build tests" OFF) # Also create test executables option(SET_TWEAK "Add tweak to project version" ON) # This is set to off by github actions for release builds option(IS_MUSL "Build with musl libc" OFF) # Used by Github Actions @@ -139,7 +140,7 @@ if(NOT WIN32) set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -rdynamic") endif() -if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug") +if(ENABLE_LTO AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug") message(STATUS "Enabling LTO") include(CheckIPOSupported) check_ipo_supported(RESULT IPO_SUPPORTED) From b25ffda90b70f2568b2686a9fd041bae2ce43834 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 3 Jul 2024 16:24:17 +0800 Subject: [PATCH 29/33] PhysicalDisk: silence compiler warnings --- src/detection/physicaldisk/physicaldisk_nosupport.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/detection/physicaldisk/physicaldisk_nosupport.c b/src/detection/physicaldisk/physicaldisk_nosupport.c index 1ed823d9c1..1e4c2412e4 100644 --- a/src/detection/physicaldisk/physicaldisk_nosupport.c +++ b/src/detection/physicaldisk/physicaldisk_nosupport.c @@ -1,6 +1,6 @@ #include "physicaldisk.h" -const char* ffDetectPhysicalDisk(FFlist* result, FFPhysicalDiskOptions* options) +const char* ffDetectPhysicalDisk(FF_MAYBE_UNUSED FFlist* result, FF_MAYBE_UNUSED FFPhysicalDiskOptions* options) { return "Not supported on this platform"; } From 9df394bba3fc0faf19535b4cf753899df0003265 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 3 Jul 2024 16:37:51 +0800 Subject: [PATCH 30/33] Revert "OS (Linux): prioritize `prettyName` over `name`" This reverts commit ecd69370ab6654de34db8bde8c2d6cdf1625054f. --- src/modules/os/os.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/os/os.c b/src/modules/os/os.c index 3d1aadebd0..6a02dac3bc 100644 --- a/src/modules/os/os.c +++ b/src/modules/os/os.c @@ -12,10 +12,10 @@ static void buildOutputDefault(const FFOSResult* os, FFstrbuf* result) { //Create the basic output - if(os->prettyName.length > 0) - ffStrbufAppend(result, &os->prettyName); - else if(os->name.length > 0) + if(os->name.length > 0) ffStrbufAppend(result, &os->name); + else if(os->prettyName.length > 0) + ffStrbufAppend(result, &os->prettyName); else if(os->id.length > 0) ffStrbufAppend(result, &os->id); else From 14c6b6d7e22e74d1ed2c309d64d9fb645233bab0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 3 Jul 2024 16:42:55 +0800 Subject: [PATCH 31/33] Doc: update changelog --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 262bbfa38e..88e5214eb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +# 2.17.2 + +Bugfixes: +* Fix formattion with multiple batteries (Battery) +* Fix incorrect size value for large memory sticks (PhysicalMemory) +* Fix spelling of `Qt` and `LXQt` +* Fix building on SunOS if imagemagick support is enabled (Logo, SunOS) + +Features: +* Support Ptyxis terminal version and font detection (Terminal / TerminalFont, Linux) +* Improve Cinnamon version detection (DE) +* Support `cinnamon-wayland` (WMTheme) +* `--ts-version false` will disable editor version detection (Editor) + # 2.17.1 Hotfix for a regression that breaks Qt font detection From 060544b899d1d685c6082fa4a710cfb2642cf2b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 2 Jul 2024 20:04:41 +0800 Subject: [PATCH 32/33] Packages (Linux): detect flatpak-app only The runtime packages detection was inaccurate. The official `flatpak list` ignores some packages (notablily *.Locale) but the logic is currently unknown. --- CHANGELOG.md | 3 +++ src/detection/packages/packages_linux.c | 17 ++--------------- src/modules/packages/packages.c | 6 +++--- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 88e5214eb9..e1dcbc52f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # 2.17.2 +Changes: +* Flatpak package count no longer takes runtime packages into account (Packages, Linux) + Bugfixes: * Fix formattion with multiple batteries (Battery) * Fix incorrect size value for large memory sticks (PhysicalMemory) diff --git a/src/detection/packages/packages_linux.c b/src/detection/packages/packages_linux.c index 9ebfe45ad8..5af0226a3f 100644 --- a/src/detection/packages/packages_linux.c +++ b/src/detection/packages/packages_linux.c @@ -313,19 +313,6 @@ static uint32_t getSnap(FFstrbuf* baseDir) return result > 0 ? result - 1 : 0; } -static uint32_t getFlatpak(FFstrbuf* baseDir, const char* dirname) -{ - uint32_t baseDirLength = baseDir->length; - ffStrbufAppendS(baseDir, dirname); - - uint32_t result = - getNumElements(baseDir, "/app", DT_DIR) + - getNumElements(baseDir, "/runtime", DT_DIR); - - ffStrbufSubstrBefore(baseDir, baseDirLength); - return result; -} - #ifdef FF_HAVE_RPM #include "common/library.h" #include @@ -459,7 +446,7 @@ static void getPackageCounts(FFstrbuf* baseDir, FFPackagesResult* packageCounts, if (!(options->disabled & FF_PACKAGES_FLAG_LPKG_BIT)) packageCounts->lpkg += getNumStrings(baseDir, "/opt/Loc-OS-LPKG/installed-lpkg/Listinstalled-lpkg.list", "\n"); if (!(options->disabled & FF_PACKAGES_FLAG_EMERGE_BIT)) packageCounts->emerge += countFilesRecursive(baseDir, "/var/db/pkg", "SIZE"); if (!(options->disabled & FF_PACKAGES_FLAG_EOPKG_BIT)) packageCounts->eopkg += getNumElements(baseDir, "/var/lib/eopkg/package", DT_DIR); - if (!(options->disabled & FF_PACKAGES_FLAG_FLATPAK_BIT)) packageCounts->flatpakSystem += getFlatpak(baseDir, "/var/lib/flatpak"); + if (!(options->disabled & FF_PACKAGES_FLAG_FLATPAK_BIT)) packageCounts->flatpakSystem += getNumElements(baseDir, "/var/lib/flatpak/app", DT_DIR); if (!(options->disabled & FF_PACKAGES_FLAG_NIX_BIT)) { packageCounts->nixDefault += getNixPackages(baseDir, "/nix/var/nix/profiles/default"); @@ -587,5 +574,5 @@ void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) } if (!(options->disabled & FF_PACKAGES_FLAG_FLATPAK_BIT)) - result->flatpakUser = getFlatpak(&baseDir, "/.local/share/flatpak"); + result->flatpakUser = getNumElements(&baseDir, "/.local/share/flatpak/app", DT_DIR); } diff --git a/src/modules/packages/packages.c b/src/modules/packages/packages.c index f88390cb0c..e6cb5fb1ad 100644 --- a/src/modules/packages/packages.c +++ b/src/modules/packages/packages.c @@ -425,8 +425,8 @@ void ffPrintPackagesHelpFormat(void) "Number of nix-default packages - nix-default", "Number of apk packages - apk", "Number of pkg packages - pkg", - "Number of flatpak-system packages - flatpak-system", - "Number of flatpak-user packages - flatpak-user", + "Number of flatpak-system app packages - flatpak-system", + "Number of flatpak-user app packages - flatpak-user", "Number of snap packages - snap", "Number of brew packages - brew", "Number of brew-cask packages - brew-cask", @@ -445,7 +445,7 @@ void ffPrintPackagesHelpFormat(void) "Number of guix-user packages - guix-user", "Number of guix-home packages - guix-home", "Total number of all nix packages - nix-all", - "Total number of all flatpak packages - flatpak-all", + "Total number of all flatpak app packages - flatpak-all", "Total number of all brew packages - brew-all", "Total number of all guix packages - guix-all", })); From 3453b72f0c13ebb0b56fdd180e3aa69a86845a32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Wed, 3 Jul 2024 20:03:06 +0800 Subject: [PATCH 33/33] Release: v2.17.2 --- CHANGELOG.md | 1 + CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1dcbc52f8..551dec40b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ Bugfixes: * Fix incorrect size value for large memory sticks (PhysicalMemory) * Fix spelling of `Qt` and `LXQt` * Fix building on SunOS if imagemagick support is enabled (Logo, SunOS) +* Fix typos Features: * Support Ptyxis terminal version and font detection (Terminal / TerminalFont, Linux) diff --git a/CMakeLists.txt b/CMakeLists.txt index 832d67ad5d..e22b7edb31 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.17.1 + VERSION 2.17.2 LANGUAGES C DESCRIPTION "Fast neofetch-like system information tool" HOMEPAGE_URL "https://github.com/fastfetch-cli/fastfetch"