Compare commits

..

63 Commits

Author SHA1 Message Date
Carter Li 855fd6edee Merge pull request #890 from fastfetch-cli/dev
Release v2.11.4
2024-05-06 20:06:58 +08:00
李通洲 d4bd4401a8 Release: v2.11.4 2024-05-06 19:45:45 +08:00
李通洲 689feb39a4 OS (Linux): don't detect debian version on debian derived distros 2024-05-06 18:42:19 +08:00
Carter Li 0f64e2830a OS (Linux): detect pve & armbian 2024-05-06 16:46:27 +08:00
Carter Li 3e24cdc752 CMake: add option CUSTOM_OS_RELEASE_PATH
And remove `--os-file`
2024-05-06 16:25:08 +08:00
李通洲 dc9c285a0b Doc: update README
Who cares how people install a package...

Close #883
2024-05-06 15:56:46 +08:00
李通洲 1d03c9c85e Logo (Builtin): add armbian
Fix #842
2024-05-06 15:22:43 +08:00
李通洲 4eae11df64 Presets: fix neofetch 2024-05-06 15:09:12 +08:00
李通洲 eba13d5485 JsonConfig: fix setting size.ndigits doesn't work
Silly copy & paste error
2024-05-06 15:08:58 +08:00
apocelipes 16b875ef5a Fastfetch: fix memory leaks when passing informative options
Informative options (e.g. "--help", "--list-module") make fastfetch
exit before calling ffDestroyInstance. Using "atexit" to avoid this
kind of leak.
2024-05-06 14:40:27 +08:00
李通洲 366138e1bd CI: try fixing Linux armv7 2024-05-06 14:08:29 +08:00
李通洲 7fe18a5b7c CI: build armv7 package using ubuntu22.04
Hopefully make it usable on RaspberryPi

Fix #884
2024-05-06 09:33:58 +08:00
李通洲 39cd8cfb4c Camera: fix deprecation warning for macOS 14.0 hopefully
Fix #860
2024-05-06 09:25:06 +08:00
李通洲 8b441c85e5 Logo (Builtin): update ubuntu 2024-05-05 23:31:23 +08:00
李通洲 f66e901c44 Presets: remove unsupported format placeholders 2024-05-05 22:12:33 +08:00
李通洲 3815823a20 CMake: enforce glibc version 2024-05-05 21:29:49 +08:00
李通洲 33ff4870dc Fastfetch: enable pipe mode if $NO_COLOR is set 2024-05-05 20:16:43 +08:00
李通洲 479731f076 Custom: don't print ANSI escape code in pipe mode 2024-05-05 20:14:24 +08:00
李通洲 d2f3f47457 Colors: print non-colored blocks in pipe mode 2024-05-05 20:14:24 +08:00
李通洲 5ea89ecba5 Fastfetch: print non-colored logo in pipe mode 2024-05-05 20:14:23 +08:00
Carter Li 865f57bd76 Revert "FFstrbuf: avoid redundant checks (#881)" (#882)
This reverts commit e98e2a3d52.
2024-05-05 18:46:22 +08:00
Nour1248 e98e2a3d52 FFstrbuf: avoid redundant checks (#881) 2024-05-05 18:40:59 +08:00
Carter Li 6bb748869e Terminal (macOS): fix Apple Terminal detection
Fix #878
2024-05-05 13:36:14 +08:00
李通洲 654721b8c5 Doc: remove (kind of) outdated information
Fix #867
2024-05-05 08:39:51 +08:00
Carter Li 0542eac1b9 Doc: metion ANSI 256 colors
Fix #869
2024-05-05 07:33:32 +08:00
apocelipes b9faf8d77f fastfetch: fix #868 (#871)
Fix #868.
2024-05-05 07:10:51 +08:00
Carter Li 61f848146a Merge pull request #862 from fastfetch-cli/dev
Release: v2.11.3
2024-05-04 20:47:54 +08:00
李通洲 4175dfdc3a Doc: update changelog (ci skip) 2024-05-04 20:27:26 +08:00
李通洲 861d9006d7 Release: v2.11.3 2024-05-04 20:11:30 +08:00
李通洲 7ba07bd2e0 Logo (Image): partially revert 71cba24
Images in SSH session and tmux do work for me

Fix #861
2024-05-04 19:43:41 +08:00
李通洲 9fee36a286 Logo (Image): ensure line ending is printed when printing errors 2024-05-04 19:14:45 +08:00
李通洲 2fc9230b29 Disk (Windows): use sub thread to check accessiblity of remote volumes. 2024-05-04 15:15:00 +08:00
李通洲 5fb1286e15 Battery (Windows): simplify code 2024-05-04 12:11:42 +08:00
李通洲 a4cace4765 CMake: add CUSTOM_AMDGPU_IDS_PATH 2024-05-04 10:06:49 +08:00
李通洲 c6d2467a83 Merge remote-tracking branch 'upstream/master' into dev 2024-05-04 10:06:40 +08:00
AxeldeWater db0d38202e Update README.md again for same reason different location (#857)
Oversaw a place where it wasn't updated either
2024-05-04 07:13:38 +08:00
AxeldeWater 9fbb23b135 Update README.md about installing fastfetch on Debian/Ubuntu (#856)
Apparently the file naming standard was changed over time but this was not updated in the README
2024-05-04 00:00:44 +08:00
李通洲 3a990e495b PhysicalDisk: fix temp output in custom formation
I hate `void *`
2024-05-03 20:48:51 +08:00
李通洲 648530ee8f PhysicalDisk: fix doubled output in custom formation
Fix #852
2024-05-03 20:42:39 +08:00
Carter Li b12a59cdaf Merge pull request #851 from fastfetch-cli/dev
Release: v2.11.2
2024-05-03 14:36:04 +08:00
李通洲 83c1fe26e6 Doc: update changelog 2024-05-03 14:14:13 +08:00
李通洲 217f98a36c Global: tidy json result formats 2024-05-03 13:56:19 +08:00
李通洲 1011e21ba8 Processing: trim \r on Windows 2024-05-03 13:46:28 +08:00
李通洲 08c6a6e4cb OS (macOS): don't print build id
Remove special handling
2024-05-03 13:20:23 +08:00
李通洲 5e9fcaf7ca OS (Linux): don't use rolling as os version 2024-05-03 13:09:14 +08:00
李通洲 8b838cef61 OS (Linux): fix name detection for MX
Fix #847
2024-05-03 12:57:51 +08:00
李通洲 22d9d8e196 OS (Linux): fix OS detection for MX Linux (2nd attempt)
Ref: #847
2024-05-03 11:28:59 +08:00
李通洲 a789b8330a Doc: update logo_request.md 2024-05-03 10:10:13 +08:00
李通洲 903ecf37f7 Chore: silience some warnings 2024-05-03 10:07:16 +08:00
李通洲 c4a876f6aa OS (Linux): Prioritize lsb-release over os-release
Fix #847
2024-05-03 10:00:18 +08:00
李通洲 82285ebeb4 Release: 2.11.2 2024-05-03 10:00:18 +08:00
李通洲 36dadcdc7f Logo (Builtin): add MX2 & fix mx distro detection
Fix: #847
2024-05-03 09:11:59 +08:00
李通洲 030c05429a Logo (Builtin): add missing FF_LOGO_LINE_TYPE_SMALL_BIT flags 2024-05-03 09:11:59 +08:00
李通洲 a462a12370 Logo (Builtin): fix distro name of DraugerOS 2024-05-03 09:11:59 +08:00
李通洲 b386365d95 Logo (Builtin): fix ascii file name 2024-05-03 09:11:59 +08:00
李通洲 158db9d7c7 Logo (Builtin): add KernelOS
Fix #848
2024-05-03 09:11:59 +08:00
李通洲 407bfa8c95 Shell: don't try detecting version of raw sh shell
Fix #849
2024-05-03 09:11:59 +08:00
李通洲 1449290e9e GPU (Linux): check NULL returned by opendir
Fix #845
2024-05-03 09:11:59 +08:00
李通洲 4c0ea7354d Logo (Image): only print error if --show-error is specified 2024-05-03 09:11:59 +08:00
李通洲 71cba2451a Logo: disable image logos in ssh and tmux sessions 2024-05-03 01:10:04 +08:00
李通洲 ef3b5df048 Doc: update man page 2024-05-03 01:10:04 +08:00
Juan 3e98034e55 Packages (Linux): check xdg state home for nix user packages (#844)
Check $XDG_STATE_HOME/nix/profile if ~/.nix-profile is not found as addressed in #837.

Fix #837
2024-05-02 22:55:50 +08:00
李通洲 1c89101522 Doc: update changelog 2024-05-02 20:45:46 +08:00
58 changed files with 610 additions and 329 deletions
+1 -1
View File
@@ -11,7 +11,7 @@ Tip: A logo can be displayed by fastfetch without getting into fastfetch's offic
# OS # OS
``` ```
Paste content of /etc/os-release here. If this file doesn't exist, describe a way to identify the distro. Paste content of /etc/os-release and /etc/lsb-release here. If none of these files exist, describe a way to identify the distro
``` ```
# Ascii # Ascii
+6 -2
View File
@@ -173,11 +173,15 @@ jobs:
id: runcmd id: runcmd
with: with:
arch: armv7 arch: armv7
distro: ubuntu22.04 distro: ubuntu20.04
githubToken: ${{ github.token }} githubToken: ${{ github.token }}
run: | run: |
uname -a uname -a
apt-get update && apt-get install -y cmake make g++ libvulkan-dev libwayland-dev libxrandr-dev libxcb-randr0-dev libdconf-dev libdbus-1-dev libmagickcore-dev libxfconf-0-dev libsqlite3-dev librpm-dev libegl-dev libglx-dev libosmesa6-dev ocl-icd-opencl-dev libnm-dev libpulse-dev libdrm-dev libddcutil-dev libchafa-dev directx-headers-dev rpm apt-get update && apt-get install -y wget
# CMake installed by apt has bug `list sub-command REMOVE_ITEM requires two or more arguments`
wget --no-check-certificate https://apt.kitware.com/ubuntu/pool/main/c/cmake/{cmake_3.29.2-0kitware1ubuntu20.04.1_armhf.deb,cmake-data_3.29.2-0kitware1ubuntu20.04.1_all.deb}
dpkg -i *.deb
apt-get install -y make g++ libvulkan-dev libwayland-dev libxrandr-dev libxcb-randr0-dev libdconf-dev libdbus-1-dev libmagickcore-dev libxfconf-0-dev libsqlite3-dev librpm-dev libegl-dev libglx-dev libosmesa6-dev ocl-icd-opencl-dev libnm-dev libpulse-dev libdrm-dev directx-headers-dev rpm
cmake -DSET_TWEAK=Off -DBUILD_TESTS=On -DCMAKE_INSTALL_PREFIX=/usr . cmake -DSET_TWEAK=Off -DBUILD_TESTS=On -DCMAKE_INSTALL_PREFIX=/usr .
cmake --build . --target package --verbose -j4 cmake --build . --target package --verbose -j4
./fastfetch --list-features ./fastfetch --list-features
+66 -3
View File
@@ -1,21 +1,84 @@
# 2.11.4
Changes:
* Fastfetch will print a colorless ascii logo in `--pipe` mode for better `lolcat` compatibility. `fastfetch | lolcat` should work and no `--pipe false` needed.
* Previously the logo would be disabled in `--pipe` mode.
* `--os-file` was removed and CMake option `-DCUSTOM_OS_RELEASE_PATH=/path/to/os-release` was added. This option should not used in most cases.
Bugfixes:
* Fix possible out-of-bound memory access (#868)
* Fix Apple Terminal detection (macOS, Terminal)
* Fix doubled output in custom formation (#852)
* Fix deprecation warning for macOS 14.0 hopefully (#860, macOS, Camera)
* Fix memory leaks when passing informative options
* Fix JSON config `size.ndigits` doesn't work
Features:
* Enable `--pipe` mode if environment variable `$NO_COLOR` is set
* Support Armbian and Proxmox distro detection (OS, Linux)
Logo:
* Add Armbian
# 2.11.3
Hotfix for nix (https://github.com/NixOS/nixpkgs/issues/308849#issuecomment-2093962376)
Features:
* Add cmake option `CUSTOM_AMDGPU_IDS_PATH` for specifying custom path of `amdgpu.ids`
Bugfixes:
* Fix hanging when detecting disconnected network drive (Disk, Windows)
* Ensure line ending is printed when printing image logo errors (Logo)
* Revert image logo limitation change in 2.11.2; allow image logo in SSH session and tmux again (#861, Logo)
* Fix doubled output in custom formation (PhysicalDisk, Windows)
# 2.11.2
Hotfix for Debian 11
Changes:
* Error messages when trying to print image logo will only be printed with `--show-errors`
* When generating JSON output, fastfetch will generate an empty array when no result is detected, instead of an error.
Bugfixes:
* Fix segfault in Debian 11 and some old kernels. Regression introduced in 2.11.0 (#845, GPU, Linux)
* Don't try detecting version of raw `sh` shell (#849, Shell, Linux)
* Trim `\r` on Windows
Features:
* Check xdg state home for nix user packages (#837, Packages, Linux)
* Disable image logos in ssh and tmux sessions (#839)
* Support MX Linux distro detection (#847, OS, Linux)
Logo:
* Add KernelOS
* Fix name of DraugerOS
* Add missing `FF_LOGO_LINE_TYPE_SMALL_BIT` flags
* Add MX2
# 2.11.1 # 2.11.1
Hotfix for Android Hotfix for Android
Bugfixes: Bugfixes:
* Fix uninitialized variables which can cause crashes (#760 #838, Battery, Android) * Fix uninitialized variables which can cause crashes (#760 #838, Battery, Android)
* Don't detect hyfetch as shell when used as a backend of hyfetch * Don't detect hyfetch as shell when used as backend of [hyfetch](https://github.com/hykilpikonna/hyfetch)
* Fix incorrect information in man page * Fix incorrect information in man page (#828)
Features: Features:
* Support sorcery package manager detection (Packages, Linux) * Support sorcery package manager detection (Packages, Linux)
* Make `--custom-format` optional (Custom) * Make `--custom-format` optional (Custom)
* Make `/` an alias of `C:\` for `--disk-folders` (Disk, Windows) * Make `/` an alias of `C:\` for `--disk-folders` (Disk, Windows)
* Build for Linux armv7
Logo: Logo:
* Fix colors of Source Mage logo * Fix colors of Source Mage logo
# 2.11.0 # 2.11.0
Changes: Changes:
+20 -2
View File
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.12.0) # target_link_libraries with OBJECT libs & project homepage url cmake_minimum_required(VERSION 3.12.0) # target_link_libraries with OBJECT libs & project homepage url
project(fastfetch project(fastfetch
VERSION 2.11.1 VERSION 2.11.4
LANGUAGES C LANGUAGES C
DESCRIPTION "Fast neofetch-like system information tool" DESCRIPTION "Fast neofetch-like system information tool"
HOMEPAGE_URL "https://github.com/fastfetch-cli/fastfetch" HOMEPAGE_URL "https://github.com/fastfetch-cli/fastfetch"
@@ -79,6 +79,8 @@ option(IS_MUSL "Build with musl libc" OFF) # Used by Github Actions
if (LINUX) if (LINUX)
set(CUSTOM_PCI_IDS_PATH "" CACHE STRING "Custom path to file pci.ids, defaults to `/usr/share/hwdata/pci.ids`") set(CUSTOM_PCI_IDS_PATH "" CACHE STRING "Custom path to file pci.ids, defaults to `/usr/share/hwdata/pci.ids`")
set(CUSTOM_AMDGPU_IDS_PATH "" CACHE STRING "Custom path to file amdgpu.ids, defaults to `/usr/share/libdrm/amdgpu.ids`")
set(CUSTOM_OS_RELEASE_PATH "" CACHE STRING "Custom path to file os-release, defaults to `/etc/os-release`")
endif() endif()
#################### ####################
@@ -784,6 +786,14 @@ if(NOT "${CUSTOM_PCI_IDS_PATH}" STREQUAL "")
message(STATUS "Custom file path of pci.ids: ${CUSTOM_PCI_IDS_PATH}") message(STATUS "Custom file path of pci.ids: ${CUSTOM_PCI_IDS_PATH}")
target_compile_definitions(libfastfetch PRIVATE FF_CUSTOM_PCI_IDS_PATH=${CUSTOM_PCI_IDS_PATH}) target_compile_definitions(libfastfetch PRIVATE FF_CUSTOM_PCI_IDS_PATH=${CUSTOM_PCI_IDS_PATH})
endif() endif()
if(NOT "${CUSTOM_AMDGPU_IDS_PATH}" STREQUAL "")
message(STATUS "Custom file path of amdgpu.ids: ${CUSTOM_AMDGPU_IDS_PATH}")
target_compile_definitions(libfastfetch PRIVATE FF_CUSTOM_AMDGPU_IDS_PATH=${CUSTOM_AMDGPU_IDS_PATH})
endif()
if(NOT "${CUSTOM_OS_RELEASE_PATH}" STREQUAL "")
message(STATUS "Custom file path of os_release: ${CUSTOM_OS_RELEASE_PATH}")
target_compile_definitions(libfastfetch PRIVATE FF_CUSTOM_OS_RELEASE_PATH=${CUSTOM_OS_RELEASE_PATH})
endif()
function(ff_lib_enable VARNAME PKGCONFIG_NAMES CMAKE_NAME) function(ff_lib_enable VARNAME PKGCONFIG_NAMES CMAKE_NAME)
if(NOT ENABLE_${VARNAME}) if(NOT ENABLE_${VARNAME})
@@ -1148,7 +1158,15 @@ if(LINUX)
set(CPACK_DEBIAN_PACKAGE_SECTION, "utils") set(CPACK_DEBIAN_PACKAGE_SECTION, "utils")
set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional") set(CPACK_DEBIAN_PACKAGE_PRIORITY "optional")
set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6")
if(NOT IS_MUSL)
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})")
endif()
endif() endif()
find_program(HAVE_RPMBUILD "rpmbuild") find_program(HAVE_RPMBUILD "rpmbuild")
-34
View File
@@ -1,34 +0,0 @@
# Development help
This file is not an official documentation!
Here i just add things that are easy to forget.
## Features i am planning to implement
### Specific
- [ ] Split the project in different libs / executables, all linking static by default:
- `libffdetect`: contains all the detection stuff. To be used by anything that needs system information
- `libffprint`: contains the printing functions, logos, format etc
- `fastfetch` and `flashfetch`: Executables, that initialize the config of libffprint. Fist one at runtime, second one at compile time
- [ ] Make LocalIP module more configurable
- [ ] Automatic migrate old config files to newer versions
- [ ] ZSH completions
- [ ] Fish completions
- [ ] Make CPU usage detection much faster and more accurate
- [ ] Detect CPU usage in a common detection method and expose it both to the cpuUsage module and the cpu format string
- [ ] Per session caching
### General
- More presets
- More logos
- More package managers
- More DE detections
- More WM theme detections
- More terminal font detections
- Performance optimizations
- More module specific options
- Better error handling, especially the messages shown when using --show-errors
- Using package managers libraries for package count detection instead own. E.g. using libalpm instead of counting files in /var/lib/pacman/local
- Better documentation (especially default config file and the various --help options. Colored output?)
- General feature parity with neofetch, to demonstrate supremity of c
+1 -1
View File
@@ -30,7 +30,7 @@ There are [screenshots on different platforms](https://github.com/fastfetch-cli/
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 is not supported, please always ensure that the latest version is used.
* Ubuntu: [`ppa:zhangsongcui3371/fastfetch`](https://launchpad.net/~zhangsongcui3371/+archive/ubuntu/fastfetch) (for Ubuntu 22.04 or newer) * Ubuntu: [`ppa:zhangsongcui3371/fastfetch`](https://launchpad.net/~zhangsongcui3371/+archive/ubuntu/fastfetch) (for Ubuntu 22.04 or newer)
* Debian / Ubuntu: Download `fastfetch-<version>-Linux.deb` from [Github release page](https://github.com/fastfetch-cli/fastfetch/releases/latest) and `dpkg -i fastfetch-<version>-Linux.deb` (for Ubuntu 20.04 or newer and Debian 11 or newer). * Debian / Ubuntu: Download `fastfetch-linux-<proper architecture>.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: `sudo pacman -S fastfetch` * Arch Linux: `sudo pacman -S fastfetch`
* Fedora: `sudo dnf install fastfetch` * Fedora: `sudo dnf install fastfetch`
* Gentoo: `sudo emerge --ask app-misc/fastfetch` * Gentoo: `sudo emerge --ask app-misc/fastfetch`
+4 -7
View File
@@ -107,12 +107,12 @@ To list all available modules, use \fB \-\-list\-modules \fR
.SS "Config Files" .SS "Config Files"
fastfetch supports two types of config files. The legacy Fastfetch uses JSONC based format for configuration. Fastfetch doesn't generate
configuration files and a JSONC based format. config file automatically; it should be generated manually by \fB \-\-gen\-config\fR.
The config file will be saved in \fB~/.config/fastfetch/config.jsonc\fR by default.
A JSONC config file is a JSON file that also supports comments with (//). Those A JSONC config file is a JSON file that also supports comments with (//). Those
files must have the extension '.jsonc'. You can migrate a legacy config files must have the extension '.jsonc'.
file to the JSONC format by using \fB\-\-gen\-config\fR.
The specified configuration/preset files are searched in the following order: The specified configuration/preset files are searched in the following order:
@@ -122,9 +122,6 @@ The specified configuration/preset files are searched in the following order:
3. relative to /usr/share/fastfetch/presets/ 3. relative to /usr/share/fastfetch/presets/
When both a '.jsonc' and a '.conf' file with the same name is found,
the '.jsonc' file is preferred.
Fastfetch provides some default presets. List them with \fB\-\-list\-presets\fR. Fastfetch provides some default presets. List them with \fB\-\-list\-presets\fR.
.SH "SEE ALSO" .SH "SEE ALSO"
-4
View File
@@ -294,10 +294,6 @@
"type": "string", "type": "string",
"description": "The name of the player to use for module Media and Player. Linux only" "description": "The name of the player to use for module Media and Player. Linux only"
}, },
"osFile": {
"type": "string",
"description": "Set the path to the file containing OS information. Linux only"
},
"dsForceDrm": { "dsForceDrm": {
"description": "Force display detection to use DRM. Linux only", "description": "Force display detection to use DRM. Linux only",
"oneOf": [ "oneOf": [
+1 -2
View File
@@ -9,8 +9,7 @@
"modules": [ "modules": [
{ {
"type": "theme", "type": "theme",
"key": "T", "key": "T"
"format": "{7}"
}, },
{ {
"type": "icons", "type": "icons",
+9 -12
View File
@@ -1,16 +1,16 @@
{ {
"$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json", "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
"display": {
"size": {
"maxPrefix": "MB",
"ndigits": 0
}
},
"modules": [ "modules": [
"title", "title",
"separator", "separator",
{ "os",
"type": "os", "host",
"format": "{3} {12}"
},
{
"type": "host",
"format": "{/2}{-}{/}{2}{?3} {3}{?}"
},
"kernel", "kernel",
"uptime", "uptime",
"packages", "packages",
@@ -23,10 +23,7 @@
"de", "de",
"wm", "wm",
"wmtheme", "wmtheme",
{ "theme",
"type": "theme",
"format": "{?1}{1}{?3} {3}{?} [Plasma], {?}{7}"
},
"icons", "icons",
"terminal", "terminal",
{ {
+2 -2
View File
@@ -11,7 +11,7 @@
bool ffParseModuleOptions(const char* key, const char* value) bool ffParseModuleOptions(const char* key, const char* value)
{ {
if (!ffStrStartsWith(key, "--") || !isalpha(key[2])) return false; if (!ffStrStartsWith(key, "--") || !ffCharIsEnglishAlphabet(key[2])) return false;
for (FFModuleBaseInfo** modules = ffModuleInfos[toupper(key[2]) - 'A']; *modules; ++modules) for (FFModuleBaseInfo** modules = ffModuleInfos[toupper(key[2]) - 'A']; *modules; ++modules)
{ {
@@ -102,7 +102,7 @@ static void parseStructureCommand(
} }
} }
if(isalpha(line[0])) if(ffCharIsEnglishAlphabet(line[0]))
{ {
for (FFModuleBaseInfo** modules = ffModuleInfos[toupper(line[0]) - 'A']; *modules; ++modules) for (FFModuleBaseInfo** modules = ffModuleInfos[toupper(line[0]) - 'A']; *modules; ++modules)
{ {
+1 -1
View File
@@ -94,7 +94,7 @@ static inline void genJsonResult(FFModuleBaseInfo* baseInfo, yyjson_mut_doc* doc
static bool parseModuleJsonObject(const char* type, yyjson_val* jsonVal, yyjson_mut_doc* jsonDoc) static bool parseModuleJsonObject(const char* type, yyjson_val* jsonVal, yyjson_mut_doc* jsonDoc)
{ {
if(!isalpha(type[0])) return false; if(!ffCharIsEnglishAlphabet(type[0])) return false;
for (FFModuleBaseInfo** modules = ffModuleInfos[toupper(type[0]) - 'A']; *modules; ++modules) for (FFModuleBaseInfo** modules = ffModuleInfos[toupper(type[0]) - 'A']; *modules; ++modules)
{ {
+2 -8
View File
@@ -8,10 +8,7 @@ static inline const char* ffProcessAppendStdOut(FFstrbuf* buffer, char* const ar
{ {
const char* error = ffProcessAppendOutput(buffer, argv, false); const char* error = ffProcessAppendOutput(buffer, argv, false);
if (!error) if (!error)
{ ffStrbufTrimRightSpace(buffer);
ffStrbufTrimRight(buffer, '\n');
ffStrbufTrimRight(buffer, ' ');
}
return error; return error;
} }
@@ -19,9 +16,6 @@ static inline const char* ffProcessAppendStdErr(FFstrbuf* buffer, char* const ar
{ {
const char* error = ffProcessAppendOutput(buffer, argv, true); const char* error = ffProcessAppendOutput(buffer, argv, true);
if (!error) if (!error)
{ ffStrbufTrimRightSpace(buffer);
ffStrbufTrimRight(buffer, '\n');
ffStrbufTrimRight(buffer, ' ');
}
return error; return error;
} }
+25 -29
View File
@@ -1,5 +1,7 @@
#include "fastfetch.h" #include "fastfetch.h"
#include "common/properties.h" #include "common/properties.h"
#include "common/io/io.h"
#include "util/mallocHelper.h"
#include <stdlib.h> #include <stdlib.h>
#ifdef _WIN32 #ifdef _WIN32
@@ -95,50 +97,44 @@ bool ffParsePropLines(const char* lines, const char* start, FFstrbuf* buffer)
bool ffParsePropFileValues(const char* filename, uint32_t numQueries, FFpropquery* queries) bool ffParsePropFileValues(const char* filename, uint32_t numQueries, FFpropquery* queries)
{ {
FILE* file = fopen(filename, "r"); FF_AUTO_CLOSE_FILE FILE* file = fopen(filename, "r");
if(file == NULL) if (file == NULL)
return false; return false;
bool valueStorage[4]; bool valueStorage[32];
bool* unsetValues; bool* unsetValues = valueStorage;
if(numQueries > sizeof(valueStorage) / sizeof(valueStorage[0])) if (numQueries > sizeof(valueStorage) / sizeof(valueStorage[0]))
unsetValues = malloc(sizeof(bool) * numQueries); unsetValues = malloc(sizeof(bool) * numQueries);
else
unsetValues = valueStorage;
bool allSet = true; bool allSet = true;
for(uint32_t i = 0; i < numQueries; i++) for (uint32_t i = 0; i < numQueries; i++)
{ {
if((unsetValues[i] = queries[i].buffer->length == 0)) unsetValues[i] = queries[i].buffer->length == 0;
if (unsetValues[i])
allSet = false; allSet = false;
} }
if(allSet) if (!allSet)
goto done;
char* line = NULL;
size_t len = 0;
while (getline(&line, &len, file) != -1)
{ {
for(uint32_t i = 0; i < numQueries; i++) FF_AUTO_FREE char* line = NULL;
{ size_t len = 0;
if(!unsetValues[i])
continue;
uint32_t currentLength = queries[i].buffer->length; while (getline(&line, &len, file) != -1)
queries[i].buffer->length = 0; {
if(!ffParsePropLine(line, queries[i].start, queries[i].buffer)) for(uint32_t i = 0; i < numQueries; i++)
queries[i].buffer->length = currentLength; {
if(!unsetValues[i])
continue;
uint32_t currentLength = queries[i].buffer->length;
queries[i].buffer->length = 0;
if(!ffParsePropLine(line, queries[i].start, queries[i].buffer))
queries[i].buffer->length = currentLength;
}
} }
} }
if(line != NULL)
free(line);
done:
fclose(file);
if(unsetValues != valueStorage) if(unsetValues != valueStorage)
free(unsetValues); free(unsetValues);
return true; return true;
+4 -3
View File
@@ -3,7 +3,8 @@ Usage: fastfetch --color <color>
<color> must be a color encoding as ANSI escape sequences. It is inserted between "ESC[" and "m". <color> must be a color encoding as ANSI escape sequences. It is inserted between "ESC[" and "m".
Infos about them can be found here: https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters. Infos about them can be found here: https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_(Select_Graphic_Rendition)_parameters.
Examples: Examples:
--color 35: sets the color to magenta. `--color magenta` is also supported --color 35: sets the color to magenta. `--color magenta` is also supported
--color 4;92: sets the color to bright Green with underline --color 38;5;38: sets the color to 38th color of ANSI 256 colors
--color 5;104: blinking text on a blue background --color 4;92: sets the color to bright Green with underline
--color 5;104: blinking text on a blue background
If no color is set, the main color of the logo will be used. If no color is set, the main color of the logo will be used.
-3
View File
@@ -170,8 +170,5 @@ const char* ffDetectBattery(FFBatteryOptions* options, FFlist* results)
ffStrbufSubstrBefore(&baseDir, baseDirLength); ffStrbufSubstrBefore(&baseDir, baseDirLength);
} }
if(results->length == 0)
return "\"/sys/class/power_supply/\" doesn't contain any battery folder";
return NULL; return NULL;
} }
+3 -6
View File
@@ -1,4 +1,6 @@
#include "battery.h" #include "battery.h"
#include "common/io/io.h"
#include "util/windows/unicode.h" #include "util/windows/unicode.h"
#include "util/mallocHelper.h" #include "util/mallocHelper.h"
#include "util/smbiosHelper.h" #include "util/smbiosHelper.h"
@@ -20,11 +22,6 @@ NtPowerInformation(
OUT PVOID OutputBuffer OPTIONAL, OUT PVOID OutputBuffer OPTIONAL,
IN ULONG OutputBufferLength); IN ULONG OutputBufferLength);
static inline void wrapCloseHandle(HANDLE* handle)
{
if(*handle)
CloseHandle(*handle);
}
static inline void wrapSetupDiDestroyDeviceInfoList(HDEVINFO* hdev) static inline void wrapSetupDiDestroyDeviceInfoList(HDEVINFO* hdev)
{ {
if(*hdev) if(*hdev)
@@ -52,7 +49,7 @@ static const char* detectWithSetupApi(FFBatteryOptions* options, FFlist* results
if(!SetupDiGetDeviceInterfaceDetailW(hdev, &did, pdidd, cbRequired, &cbRequired, NULL)) if(!SetupDiGetDeviceInterfaceDetailW(hdev, &did, pdidd, cbRequired, &cbRequired, NULL))
continue; continue;
HANDLE __attribute__((__cleanup__(wrapCloseHandle))) hBattery = HANDLE FF_AUTO_CLOSE_FD hBattery =
CreateFileW(pdidd->DevicePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); CreateFileW(pdidd->DevicePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hBattery == INVALID_HANDLE_VALUE) if(hBattery == INVALID_HANDLE_VALUE)
+18 -1
View File
@@ -3,10 +3,27 @@
#import <AVFoundation/AVCaptureDevice.h> #import <AVFoundation/AVCaptureDevice.h>
// warning: 'AVCaptureDeviceTypeExternalUnknown' is deprecated
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
const char* ffDetectCamera(FFlist* result) const char* ffDetectCamera(FFlist* result)
{ {
FF_SUPPRESS_IO(); // #822 FF_SUPPRESS_IO(); // #822
AVCaptureDeviceDiscoverySession* session = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera, AVCaptureDeviceTypeExternalUnknown]
AVCaptureDeviceType deviceType;
#ifdef MAC_OS_VERSION_14_0
if (@available(macOS 14.0, *))
{
deviceType = AVCaptureDeviceTypeExternal;
}
else
#endif
{
deviceType = AVCaptureDeviceTypeExternalUnknown;
}
AVCaptureDeviceDiscoverySession* session = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera, deviceType]
mediaType:AVMediaTypeVideo mediaType:AVMediaTypeVideo
position:AVCaptureDevicePositionUnspecified]; position:AVCaptureDevicePositionUnspecified];
if (!session) if (!session)
+51 -34
View File
@@ -1,10 +1,24 @@
#include "disk.h" #include "disk.h"
#include "common/io/io.h" #include "common/io/io.h"
#include "common/thread.h"
#include "util/windows/unicode.h" #include "util/windows/unicode.h"
#include <windows.h> #include <windows.h>
#include <winioctl.h> #include <winioctl.h>
static unsigned __stdcall testRemoteVolumeAccessable(void* mountpoint)
{
FF_AUTO_CLOSE_FD HANDLE handle = CreateFileW(
(wchar_t*) mountpoint,
READ_CONTROL,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL);
return 0;
}
const char* ffDetectDisksImpl(FFDiskOptions* options, FFlist* disks) const char* ffDetectDisksImpl(FFDiskOptions* options, FFlist* disks)
{ {
wchar_t buf[MAX_PATH + 1]; wchar_t buf[MAX_PATH + 1];
@@ -41,28 +55,48 @@ const char* ffDetectDisksImpl(FFDiskOptions* options, FFlist* disks)
FFDisk* disk = ffListAdd(disks); FFDisk* disk = ffListAdd(disks);
if(!GetDiskFreeSpaceExW( disk->filesUsed = 0;
disk->filesTotal = 0;
disk->bytesTotal = 0;
disk->bytesFree = 0;
disk->bytesUsed = 0; // To be filled in ./disk.c
disk->bytesAvailable = 0;
disk->createTime = 0;
ffStrbufInit(&disk->filesystem);
ffStrbufInit(&disk->name);
ffStrbufInitMove(&disk->mountpoint, &buffer);
ffStrbufInit(&disk->mountFrom);
disk->type = driveType == DRIVE_REMOVABLE || driveType == DRIVE_REMOTE || driveType == DRIVE_CDROM
? FF_DISK_VOLUME_TYPE_EXTERNAL_BIT
: driveType == DRIVE_FIXED
? FF_DISK_VOLUME_TYPE_REGULAR_BIT
: FF_DISK_VOLUME_TYPE_HIDDEN_BIT;
if (mountpoint[2] == L'\\' && mountpoint[3] == L'\0')
{
wchar_t volumeName[MAX_PATH + 1];
mountpoint[2] = L'\0';
if(QueryDosDeviceW(mountpoint, volumeName, sizeof(volumeName) / sizeof(*volumeName)))
ffStrbufSetWS(&disk->mountFrom, volumeName);
mountpoint[2] = L'\\';
}
#ifdef FF_HAVE_THREADS
if (driveType == DRIVE_REMOTE)
{
FFThreadType thread = ffThreadCreate(testRemoteVolumeAccessable, mountpoint);
if (!ffThreadJoin(thread, 500))
continue;
}
#endif
GetDiskFreeSpaceExW(
mountpoint, mountpoint,
(PULARGE_INTEGER)&disk->bytesAvailable, (PULARGE_INTEGER)&disk->bytesAvailable,
(PULARGE_INTEGER)&disk->bytesTotal, (PULARGE_INTEGER)&disk->bytesTotal,
(PULARGE_INTEGER)&disk->bytesFree (PULARGE_INTEGER)&disk->bytesFree
)) );
{
disk->bytesTotal = 0;
disk->bytesFree = 0;
disk->bytesAvailable = 0;
}
disk->bytesUsed = 0; // To be filled in ./disk.c
if(driveType == DRIVE_REMOVABLE || driveType == DRIVE_REMOTE || driveType == DRIVE_CDROM)
disk->type = FF_DISK_VOLUME_TYPE_EXTERNAL_BIT;
else if(driveType == DRIVE_FIXED)
disk->type = FF_DISK_VOLUME_TYPE_REGULAR_BIT;
else
disk->type = FF_DISK_VOLUME_TYPE_HIDDEN_BIT;
ffStrbufInit(&disk->filesystem);
ffStrbufInit(&disk->name);
wchar_t diskName[MAX_PATH + 1], diskFileSystem[MAX_PATH + 1]; wchar_t diskName[MAX_PATH + 1], diskFileSystem[MAX_PATH + 1];
//https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getvolumeinformationa#remarks //https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getvolumeinformationa#remarks
@@ -89,23 +123,6 @@ const char* ffDetectDisksImpl(FFDiskOptions* options, FFlist* disks)
WIN32_FILE_ATTRIBUTE_DATA data; WIN32_FILE_ATTRIBUTE_DATA data;
if(GetFileAttributesExW(mountpoint, GetFileExInfoStandard, &data) && data.ftCreationTime.dwHighDateTime > 0) if(GetFileAttributesExW(mountpoint, GetFileExInfoStandard, &data) && data.ftCreationTime.dwHighDateTime > 0)
disk->createTime = (*(uint64_t*) &data.ftCreationTime - 116444736000000000ull) / 10000ull; disk->createTime = (*(uint64_t*) &data.ftCreationTime - 116444736000000000ull) / 10000ull;
else
disk->createTime = 0;
ffStrbufInitMove(&disk->mountpoint, &buffer);
if (mountpoint[2] == L'\\' && mountpoint[3] == L'\0')
{
wchar_t volumeName[MAX_PATH + 1];
mountpoint[2] = L'\0';
if(QueryDosDeviceW(mountpoint, volumeName, sizeof(volumeName) / sizeof(*volumeName)))
ffStrbufInitWS(&disk->mountFrom, volumeName);
else
ffStrbufInit(&disk->mountFrom);
}
//Unsupported
disk->filesUsed = 0;
disk->filesTotal = 0;
} }
return NULL; return NULL;
+13 -4
View File
@@ -46,6 +46,8 @@ static void pciDetectAmdSpecific(const FFGPUOptions* options, FFGPUResult* gpu,
ffStrbufAppendS(pciDir, "/hwmon/"); ffStrbufAppendS(pciDir, "/hwmon/");
FF_AUTO_CLOSE_DIR DIR* dirp = opendir(pciDir->chars); FF_AUTO_CLOSE_DIR DIR* dirp = opendir(pciDir->chars);
if (!dirp) return;
struct dirent* entry; struct dirent* entry;
while ((entry = readdir(dirp)) != NULL) while ((entry = readdir(dirp)) != NULL)
{ {
@@ -121,9 +123,11 @@ static void pciDetectIntelSpecific(FFGPUResult* gpu, FFstrbuf* pciDir, FFstrbuf*
static bool loadPciIds(FFstrbuf* pciids) static bool loadPciIds(FFstrbuf* pciids)
{ {
#ifdef FF_CUSTOM_PCI_IDS_PATH #ifdef FF_CUSTOM_PCI_IDS_PATH
ffReadFileBuffer(FF_STR(FF_CUSTOM_PCI_IDS_PATH), pciids); ffReadFileBuffer(FF_STR(FF_CUSTOM_PCI_IDS_PATH), pciids);
if (pciids->length > 0) return true; if (pciids->length > 0) return true;
#endif
#else
ffReadFileBuffer(FASTFETCH_TARGET_DIR_USR "/share/hwdata/pci.ids", pciids); ffReadFileBuffer(FASTFETCH_TARGET_DIR_USR "/share/hwdata/pci.ids", pciids);
if (pciids->length > 0) return true; if (pciids->length > 0) return true;
@@ -134,6 +138,8 @@ static bool loadPciIds(FFstrbuf* pciids)
ffReadFileBuffer(FASTFETCH_TARGET_DIR_USR "/local/share/hwdata/pci.ids", pciids); ffReadFileBuffer(FASTFETCH_TARGET_DIR_USR "/local/share/hwdata/pci.ids", pciids);
if (pciids->length > 0) return true; if (pciids->length > 0) return true;
#endif
return false; return false;
} }
@@ -186,7 +192,11 @@ static const char* detectPci(const FFGPUOptions* options, FFlist* gpus, FFstrbuf
{ {
char query[32]; char query[32];
snprintf(query, sizeof(query), "%X,\t%X,", (unsigned) deviceId, (unsigned) revision); snprintf(query, sizeof(query), "%X,\t%X,", (unsigned) deviceId, (unsigned) revision);
#ifdef FF_CUSTOM_AMDGPU_IDS_PATH
ffParsePropFile(FF_STR(FF_CUSTOM_AMDGPU_IDS_PATH), query, &gpu->name);
#else
ffParsePropFileData("libdrm/amdgpu.ids", query, &gpu->name); ffParsePropFileData("libdrm/amdgpu.ids", query, &gpu->name);
#endif
} }
} }
ffStrbufSubstrBefore(drmDir, drmDirPathLength); ffStrbufSubstrBefore(drmDir, drmDirPathLength);
@@ -200,8 +210,7 @@ static const char* detectPci(const FFGPUOptions* options, FFlist* gpus, FFstrbuf
ffStrbufInit(&pciids); ffStrbufInit(&pciids);
loadPciIds(&pciids); loadPciIds(&pciids);
} }
if (pciids.length) ffGPUParsePciIds(&pciids, subclassId, (uint16_t) vendorId, (uint16_t) deviceId, gpu);
ffGPUParsePciIds(&pciids, subclassId, (uint16_t) vendorId, (uint16_t) deviceId, gpu);
} }
pciDetectDriver(gpu, drmDir, buffer); pciDetectDriver(gpu, drmDir, buffer);
@@ -256,7 +265,7 @@ FF_MAYBE_UNUSED static const char* detectAsahi(FFlist* gpus, FFstrbuf* buffer, F
{ {
uint32_t index = ffStrbufFirstIndexS(buffer, "apple,agx-t"); uint32_t index = ffStrbufFirstIndexS(buffer, "apple,agx-t");
if (index == buffer->length) return "display-subsystem?"; if (index == buffer->length) return "display-subsystem?";
index += strlen("apple,agx-t"); index += (uint32_t) strlen("apple,agx-t");
FFGPUResult* gpu = (FFGPUResult*)ffListAdd(gpus); FFGPUResult* gpu = (FFGPUResult*)ffListAdd(gpus);
gpu->deviceId = strtoul(buffer->chars + index, NULL, 10); gpu->deviceId = strtoul(buffer->chars + index, NULL, 10);
+80 -23
View File
@@ -2,11 +2,15 @@
#include "common/properties.h" #include "common/properties.h"
#include "common/parsing.h" #include "common/parsing.h"
#include "common/io/io.h" #include "common/io/io.h"
#include "common/processing.h"
#include "util/stringUtils.h" #include "util/stringUtils.h"
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#define FF_STR_INDIR(x) #x
#define FF_STR(x) FF_STR_INDIR(x)
static inline bool allRelevantValuesSet(const FFOSResult* result) static inline bool allRelevantValuesSet(const FFOSResult* result)
{ {
return result->id.length > 0 return result->id.length > 0
@@ -15,18 +19,25 @@ static inline bool allRelevantValuesSet(const FFOSResult* result)
; ;
} }
static bool parseFile(const char* fileName, FFOSResult* result) static bool parseLsbRelease(const char* fileName, FFOSResult* result)
{ {
return ffParsePropFileValues(fileName, 13, (FFpropquery[]) { return ffParsePropFileValues(fileName, 4, (FFpropquery[]) {
{"NAME =", &result->name},
{"DISTRIB_DESCRIPTION =", &result->prettyName},
{"PRETTY_NAME =", &result->prettyName},
{"DISTRIB_ID =", &result->id}, {"DISTRIB_ID =", &result->id},
{"DISTRIB_DESCRIPTION =", &result->prettyName},
{"DISTRIB_RELEASE =", &result->version},
{"DISTRIB_CODENAME =", &result->codename},
});
}
static bool parseOsRelease(const char* fileName, FFOSResult* result)
{
return ffParsePropFileValues(fileName, 10, (FFpropquery[]) {
{"PRETTY_NAME =", &result->prettyName},
{"NAME =", &result->name},
{"ID =", &result->id}, {"ID =", &result->id},
{"ID_LIKE =", &result->idLike}, {"ID_LIKE =", &result->idLike},
{"VARIANT =", &result->variant}, {"VARIANT =", &result->variant},
{"VARIANT_ID =", &result->variantID}, {"VARIANT_ID =", &result->variantID},
{"DISTRIB_RELEASE =", &result->version},
{"VERSION =", &result->version}, {"VERSION =", &result->version},
{"VERSION_ID =", &result->versionID}, {"VERSION_ID =", &result->versionID},
{"VERSION_CODENAME =", &result->codename}, {"VERSION_CODENAME =", &result->codename},
@@ -132,15 +143,48 @@ static void getDebianVersion(FFOSResult* result)
ffStrbufSet(&result->versionID, &debianVersion); ffStrbufSet(&result->versionID, &debianVersion);
} }
static bool detectDebianDerived(FFOSResult* result)
{
if (ffStrbufStartsWithS(&result->prettyName, "Armbian ")) // Armbian 24.2.1 bookworm
{
ffStrbufSetS(&result->name, "Armbian");
ffStrbufSetS(&result->id, "armbian");
ffStrbufSetS(&result->idLike, "debian");
ffStrbufClear(&result->versionID);
uint32_t versionStart = ffStrbufFirstIndexC(&result->prettyName, ' ') + 1;
uint32_t versionEnd = ffStrbufNextIndexC(&result->prettyName, versionStart, ' ');
ffStrbufSetNS(&result->versionID, versionEnd - versionStart, result->prettyName.chars + versionStart);
return true;
}
else if (ffPathExists("/usr/bin/pveversion", FF_PATHTYPE_FILE))
{
ffStrbufSetS(&result->id, "pve");
ffStrbufSetS(&result->idLike, "debian");
ffStrbufSetS(&result->name, "Proxmox VE");
ffStrbufClear(&result->versionID);
if (ffProcessAppendStdOut(&result->versionID, (char* const[]) {
"/usr/bin/pveversion",
NULL,
}) == NULL) // pve-manager/8.2.2/9355359cd7afbae4 (running kernel: 6.8.4-2-pve)
{
ffStrbufSubstrBeforeLastC(&result->versionID, '/');
ffStrbufSubstrAfterFirstC(&result->versionID, '/');
}
ffStrbufSetF(&result->prettyName, "Proxmox VE %s", result->versionID.chars);
return true;
}
return false;
}
static void detectOS(FFOSResult* os) static void detectOS(FFOSResult* os)
{ {
if(instance.config.general.osFile.length > 0) #ifdef FF_CUSTOM_OS_RELEASE_PATH
{ parseOsRelease(FF_STR(FF_CUSTOM_OS_RELEASE_PATH), os);
parseFile(instance.config.general.osFile.chars, os); parseLsbRelease(FF_STR(FF_CUSTOM_OS_RELEASE_PATH), os);
return; return;
} #endif
if(instance.config.general.escapeBedrock && parseFile(FASTFETCH_TARGET_DIR_ROOT"/bedrock"FASTFETCH_TARGET_DIR_ETC"/bedrock-release", os)) if(instance.config.general.escapeBedrock && parseOsRelease(FASTFETCH_TARGET_DIR_ROOT "/bedrock" FASTFETCH_TARGET_DIR_ETC "/bedrock-release", os))
{ {
if(os->id.length == 0) if(os->id.length == 0)
ffStrbufAppendS(&os->id, "bedrock"); ffStrbufAppendS(&os->id, "bedrock");
@@ -150,22 +194,32 @@ static void detectOS(FFOSResult* os)
if(os->prettyName.length == 0) if(os->prettyName.length == 0)
ffStrbufAppendS(&os->prettyName, "Bedrock Linux"); ffStrbufAppendS(&os->prettyName, "Bedrock Linux");
parseFile("/bedrock"FASTFETCH_TARGET_DIR_ETC"/os-release", os);
if(allRelevantValuesSet(os)) if(parseOsRelease("/bedrock" FASTFETCH_TARGET_DIR_ETC "/os-release", os) && allRelevantValuesSet(os))
return; return;
} }
parseFile(FASTFETCH_TARGET_DIR_ETC"/os-release", os); // Refer: https://gist.github.com/natefoo/814c5bf936922dad97ff
if(allRelevantValuesSet(os))
// Hack for MX Linux. See #847
if(parseLsbRelease(FASTFETCH_TARGET_DIR_ETC "/lsb-release", os))
{
if (ffStrbufEqualS(&os->id, "MX"))
{
ffStrbufSetStatic(&os->name, "MX");
ffStrbufSetStatic(&os->idLike, "debian");
return;
}
// For archlinux
if (ffStrbufEqualS(&os->version, "rolling"))
ffStrbufClear(&os->version);
}
if(parseOsRelease(FASTFETCH_TARGET_DIR_ETC "/os-release", os) && allRelevantValuesSet(os))
return; return;
parseFile(FASTFETCH_TARGET_DIR_USR"/lib/os-release", os); parseOsRelease(FASTFETCH_TARGET_DIR_USR "/lib/os-release", os);
if(allRelevantValuesSet(os))
return;
parseFile(FASTFETCH_TARGET_DIR_ETC"/lsb-release", os);
} }
void ffDetectOSImpl(FFOSResult* os) void ffDetectOSImpl(FFOSResult* os)
@@ -175,5 +229,8 @@ void ffDetectOSImpl(FFOSResult* os)
if(ffStrbufIgnCaseEqualS(&os->id, "ubuntu")) if(ffStrbufIgnCaseEqualS(&os->id, "ubuntu"))
getUbuntuFlavour(os); getUbuntuFlavour(os);
else if(ffStrbufIgnCaseEqualS(&os->id, "debian")) else if(ffStrbufIgnCaseEqualS(&os->id, "debian"))
getDebianVersion(os); {
if (!detectDebianDerived(os))
getDebianVersion(os);
}
} }
+30 -1
View File
@@ -502,7 +502,36 @@ void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options)
ffStrbufSet(&baseDir, &instance.state.platform.homeDir); ffStrbufSet(&baseDir, &instance.state.platform.homeDir);
if (!(options->disabled & FF_PACKAGES_FLAG_NIX_BIT)) if (!(options->disabled & FF_PACKAGES_FLAG_NIX_BIT))
result->nixUser = getNixPackages(&baseDir, "/.nix-profile"); {
// check if ~/.nix-profile exists
FF_STRBUF_AUTO_DESTROY profilePath = ffStrbufCreateCopy(&baseDir);
ffStrbufAppendS(&profilePath, ".nix-profile");
if (ffPathExists(profilePath.chars, FF_PATHTYPE_DIRECTORY))
{
result->nixUser = getNixPackages(&baseDir, ".nix-profile");
}
// check if $XDG_STATE_HOME/nix/profile exists
else
{
FF_STRBUF_AUTO_DESTROY stateDir = ffStrbufCreate();
const char* stateHome = getenv("XDG_STATE_HOME");
if(ffStrSet(stateHome))
{
ffStrbufSetS(&stateDir, stateHome);
ffStrbufEnsureEndsWithC(&stateDir, '/');
}
else
{
ffStrbufSet(&stateDir, &instance.state.platform.homeDir);
ffStrbufAppendS(&stateDir, ".local/state/");
}
ffStrbufSet(&profilePath, &stateDir);
ffStrbufAppendS(&profilePath, "nix/profile");
result->nixUser = getNixPackages(&stateDir, "nix/profile");
}
}
if (!(options->disabled & FF_PACKAGES_FLAG_FLATPAK_BIT)) if (!(options->disabled & FF_PACKAGES_FLAG_FLATPAK_BIT))
result->flatpakUser = getFlatpak(&baseDir, "/.local/share/flatpak"); result->flatpakUser = getFlatpak(&baseDir, "/.local/share/flatpak");
} }
+1 -1
View File
@@ -28,7 +28,7 @@ void ffPreparePublicIp(FFPublicIpOptions* options)
fputs("Error: only http: protocol is supported. Use `Command` module with `curl` if needed\n", stderr); fputs("Error: only http: protocol is supported. Use `Command` module with `curl` if needed\n", stderr);
exit(1); exit(1);
} }
ffStrbufSubstrAfter(&host, hostStartIndex + (strlen("://") - 1)); ffStrbufSubstrAfter(&host, hostStartIndex + (uint32_t) (strlen("://") - 1));
} }
uint32_t pathStartIndex = ffStrbufFirstIndexC(&host, '/'); uint32_t pathStartIndex = ffStrbufFirstIndexC(&host, '/');
+4 -1
View File
@@ -228,7 +228,10 @@ bool fftsGetShellVersion(FFstrbuf* exe, const char* exeName, FFstrbuf* version)
{ {
if (!instance.config.display.tsVersion) return false; if (!instance.config.display.tsVersion) return false;
if(strcasecmp(exeName, "bash") == 0 || strcasecmp(exeName, "sh") == 0) if(ffStrEqualsIgnCase(exeName, "sh")) // #849
return false;
if(strcasecmp(exeName, "bash") == 0)
return getShellVersionBash(exe, version); return getShellVersionBash(exe, version);
if(strcasecmp(exeName, "zsh") == 0) if(strcasecmp(exeName, "zsh") == 0)
return getExeVersionGeneral(exe, version); //zsh 5.9 (arm-apple-darwin21.3.0) return getExeVersionGeneral(exe, version); //zsh 5.9 (arm-apple-darwin21.3.0)
@@ -519,6 +519,11 @@ static void setTerminalInfoDetails(FFTerminalResult* result)
else if(ffStrbufEqualS(&result->processName, "iTerm.app") || ffStrbufStartsWithS(&result->processName, "iTermServer-")) else if(ffStrbufEqualS(&result->processName, "iTerm.app") || ffStrbufStartsWithS(&result->processName, "iTermServer-"))
ffStrbufInitStatic(&result->prettyName, "iTerm"); ffStrbufInitStatic(&result->prettyName, "iTerm");
else if(ffStrbufEndsWithS(&result->exePath, "Terminal.app/Contents/MacOS/Terminal"))
{
ffStrbufSetStatic(&result->processName, "Apple_Terminal"); // for terminal font detection
ffStrbufInitStatic(&result->prettyName, "Apple Terminal");
}
else if(ffStrbufEqualS(&result->processName, "Apple_Terminal")) else if(ffStrbufEqualS(&result->processName, "Apple_Terminal"))
ffStrbufInitStatic(&result->prettyName, "Apple Terminal"); ffStrbufInitStatic(&result->prettyName, "Apple Terminal");
else if(ffStrbufEqualS(&result->processName, "WarpTerminal")) else if(ffStrbufEqualS(&result->processName, "WarpTerminal"))
+2 -3
View File
@@ -249,7 +249,7 @@ static void printCommandHelp(const char* command)
puts(FASTFETCH_DATATEXT_HELP_COLOR); puts(FASTFETCH_DATATEXT_HELP_COLOR);
else if(ffStrEqualsIgnCase(command, "format")) else if(ffStrEqualsIgnCase(command, "format"))
puts(FASTFETCH_DATATEXT_HELP_FORMAT); puts(FASTFETCH_DATATEXT_HELP_FORMAT);
else if(isalpha(command[0]) && ffStrEndsWithIgnCase(command, "-format")) // <module>-format else if(ffCharIsEnglishAlphabet(command[0]) && ffStrEndsWithIgnCase(command, "-format")) // <module>-format
printCommandFormatHelp(command); printCommandFormatHelp(command);
else if(!printSpecificCommandHelp(command)) else if(!printSpecificCommandHelp(command))
fprintf(stderr, "Error: No specific help for command '%s' provided\n", command); fprintf(stderr, "Error: No specific help for command '%s' provided\n", command);
@@ -863,6 +863,7 @@ static void writeConfigFile(FFdata* data, const FFstrbuf* filename)
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
ffInitInstance(); ffInitInstance();
atexit(ffDestroyInstance);
//Data stores things only needed for the configuration of fastfetch //Data stores things only needed for the configuration of fastfetch
FFdata data = { FFdata data = {
@@ -888,6 +889,4 @@ int main(int argc, char** argv)
ffStrbufDestroy(&customValue->value); ffStrbufDestroy(&customValue->value);
} }
ffListDestroy(&data.customValues); ffListDestroy(&data.customValues);
ffDestroyInstance();
} }
+22
View File
@@ -0,0 +1,22 @@
..
`:]x**j-,'
.,+t***********z\<"
?******************;
'*n` .'`^,;;,^`'. ,cc.
-<. .[l
// ^^ ^^ \\
!^ $2^^$1 ":
'tt}` $2!~]rj_$1 ")t/.
Itttt?' $2~~]rr]$1 `{tttt,
\tttttt!""I$2_]r($1"""~tttttt1
'_tttttttttttt$2)f$1tttttttttttti.
\*ztttttttttttttttttttttttttf**[
l**c)tttttttttttttttttttttttt(z**,
.z*x.`tttttttttttttttttttttttt.`u*n
>` (tttttttttttttttttttttt] "I
,tttttttttttttttttttttt`
./ttttt$2f$1tttttttt$2f$1ttttt(
'I)$2))(\()($1tt$2))|\()($1{;'
$2.~~~~~~~|)~~~~~~~<$1
'$2[)))))1$1|($2)))))))$1?
$2",,," ",,,^
+14
View File
@@ -0,0 +1,14 @@
█ █ █ █ █ █ █ █ █ █ █
███████████████████████
▄▄██ ██▄▄
▄▄██ ███████████ ██▄▄
▄▄██ ██ ██ ██▄▄
▄▄██ ██ ██ ██▄▄
▄▄██ ██ ██ ██▄▄
▄▄██ █████████████ ██▄▄
▄▄██ ██ ██ ██▄▄
▄▄██ ██ ██ ██▄▄
▄▄██ ██ ██ ██▄▄
▄▄██ ██▄▄
███████████████████████
█ █ █ █ █ █ █ █ █ █ █
+19
View File
@@ -0,0 +1,19 @@
.''''....''''.
.''... ...''.
''.. ..''
'.. ..''
.'. .,,'.. .',,,' ..'.
.'. .,,,,' .,,,,,' .'.
.'. .,,,,' .,,,,,. .'.
'.. .,,,,'',,,,;. .''
.'. .,,,,,,,;;. ..'
.'. .,,,,;;;;;${c2}, ${c1}..'.
'.. .,;;;,${c2}';;;;;, ${c1}..'
.'. .;;${c2};;' .;;:::: ${c1}.,.
'.. ${c2}.;;;;' .::::::. ${c1}.,'
'.. ${c2}.;;;;' .::::::. ${c1}.,${c2}'${c1}
.'.. ${c2}.',.
${c1}',.. ${c2}.','
${c1}.,,... ${c2}..',,.
..,,''........',,,.
......
+18
View File
@@ -0,0 +1,18 @@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@%*+--:------=+*%@@@@@@@@@@@@
@@@@@@@@@#=. .-+#%@@@@@%#*+--=#@@@@@@@@@
@@@@@@@+. .=%@@@@@@@@@@@@@@@@*-:+@@@@@@@
@@@@@*. *@@@@@@@@@@@@@@@@@@@@@%-.*@@@@@
@@@@- -@@@@@@@@@@@@@@@@@@@@@@@#: -@@@@
@@@: -@@@@@@@=.*@@@@@@@@@@@@%- = :@@@
@@= .@@@@@@@@%- :%@@@@@@@@@+ -%@# =@@
@% +@@@@@@@@@@#. =@@@@@@*. .*@@@@. %@
@+ *@@@@@@*..*@@+ *@@%- =@@@@@@- +@
@= *@@@@%- -%@@- := -%@@@@@@@: +@
@+ :@@@= +@@= .#@@@@@@@@% *@
@% +*. .: *@@#: +@@: @@
@@+ :%@- :- :: +@@
@@@- .=@@= -@@@
@@+. . +@@
%=..:.................::...........:..-%
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-1
View File
@@ -18,4 +18,3 @@
.:ooooooolc:. .ooooooooooo' .:ooooooolc:. .ooooooooooo'
.':loooooo; ,oooooooooc .':loooooo; ,oooooooooc
..';::c' .;loooo:' ..';::c' .;loooo:'
.
+53 -7
View File
@@ -209,6 +209,7 @@ static const FFlogo A[] = {
// AoscOsRetro_small // AoscOsRetro_small
{ {
.names = {"Aosc OS/Retro_small", "aoscosretro_small"}, .names = {"Aosc OS/Retro_small", "aoscosretro_small"},
.type = FF_LOGO_LINE_TYPE_SMALL_BIT,
.lines = FASTFETCH_DATATEXT_LOGO_AOSCOSRETRO_SMALL, .lines = FASTFETCH_DATATEXT_LOGO_AOSCOSRETRO_SMALL,
.colors = { .colors = {
FF_COLOR_FG_BLUE, FF_COLOR_FG_BLUE,
@@ -375,6 +376,24 @@ static const FFlogo A[] = {
.colorKeys = FF_COLOR_FG_CYAN, .colorKeys = FF_COLOR_FG_CYAN,
.colorTitle = FF_COLOR_FG_CYAN, .colorTitle = FF_COLOR_FG_CYAN,
}, },
// Armbian
{
.names = {"Armbian"},
.lines = FASTFETCH_DATATEXT_LOGO_ARMBIAN,
.colors = {
FF_COLOR_FG_WHITE,
FF_COLOR_FG_RED,
},
},
// Armbian2
{
.names = {"Armbian2"},
.type = FF_LOGO_LINE_TYPE_ALTER_BIT,
.lines = FASTFETCH_DATATEXT_LOGO_ARMBIAN2,
.colors = {
FF_COLOR_FG_RED,
},
},
// Artix // Artix
{ {
.names = {"artix", "artixlinux", "artix-linux"}, .names = {"artix", "artixlinux", "artix-linux"},
@@ -764,6 +783,7 @@ static const FFlogo C[] = {
// CalinixOSSmall // CalinixOSSmall
{ {
.names = {"Calinix_small", "calinixos_small"}, .names = {"Calinix_small", "calinixos_small"},
.type = FF_LOGO_LINE_TYPE_SMALL_BIT,
.lines = FASTFETCH_DATATEXT_LOGO_CALINIXOS_SMALL, .lines = FASTFETCH_DATATEXT_LOGO_CALINIXOS_SMALL,
.colors = { .colors = {
FF_COLOR_FG_MAGENTA, FF_COLOR_FG_MAGENTA,
@@ -875,7 +895,7 @@ static const FFlogo C[] = {
// Chimera Linux // Chimera Linux
{ {
.names = {"Chimera Linux"}, .names = {"Chimera Linux"},
.lines = FASTFETCH_DATATEXT_LOGO_CHIMERALINUX, .lines = FASTFETCH_DATATEXT_LOGO_CHIMERA_LINUX,
.colors = { .colors = {
FF_COLOR_FG_RED, FF_COLOR_FG_RED,
FF_COLOR_FG_MAGENTA, FF_COLOR_FG_MAGENTA,
@@ -1241,9 +1261,9 @@ static const FFlogo D[] = {
.colorKeys = FF_COLOR_FG_RED, .colorKeys = FF_COLOR_FG_RED,
.colorTitle = FF_COLOR_FG_WHITE, .colorTitle = FF_COLOR_FG_WHITE,
}, },
// Drauger // DraugerOS
{ {
.names = {"Drauger"}, .names = {"DraugerOS", "Drauger"},
.lines = FASTFETCH_DATATEXT_LOGO_DRAUGER, .lines = FASTFETCH_DATATEXT_LOGO_DRAUGER,
.colors = { .colors = {
FF_COLOR_FG_RED, FF_COLOR_FG_RED,
@@ -1336,8 +1356,8 @@ static const FFlogo E[] = {
// EndeavourSmall // EndeavourSmall
{ {
.names = {"Endeavour_small", "endeavour-linux_small", "endeavouros_small", "endeavouros-linux_small"}, .names = {"Endeavour_small", "endeavour-linux_small", "endeavouros_small", "endeavouros-linux_small"},
.lines = FASTFETCH_DATATEXT_LOGO_ENDEAVOUR_SMALL,
.type = FF_LOGO_LINE_TYPE_SMALL_BIT, .type = FF_LOGO_LINE_TYPE_SMALL_BIT,
.lines = FASTFETCH_DATATEXT_LOGO_ENDEAVOUR_SMALL,
.colors = { .colors = {
FF_COLOR_FG_RED, FF_COLOR_FG_RED,
FF_COLOR_FG_MAGENTA, FF_COLOR_FG_MAGENTA,
@@ -1823,6 +1843,7 @@ static const FFlogo G[] = {
// GuixSmall // GuixSmall
{ {
.names = {"Guix_small"}, .names = {"Guix_small"},
.type = FF_LOGO_LINE_TYPE_SMALL_BIT,
.lines = FASTFETCH_DATATEXT_LOGO_GUIX_SMALL, .lines = FASTFETCH_DATATEXT_LOGO_GUIX_SMALL,
.colors = { .colors = {
FF_COLOR_FG_YELLOW, FF_COLOR_FG_YELLOW,
@@ -2089,6 +2110,15 @@ static const FFlogo K[] = {
.colorKeys = FF_COLOR_FG_BLUE, .colorKeys = FF_COLOR_FG_BLUE,
.colorTitle = FF_COLOR_FG_WHITE, .colorTitle = FF_COLOR_FG_WHITE,
}, },
// KernelOS
{
.names = {"KernelOS"},
.lines = FASTFETCH_DATATEXT_LOGO_KERNELOS,
.colors = {
FF_COLOR_FG_RED,
FF_COLOR_FG_MAGENTA,
}
},
// KDENeon // KDENeon
{ {
.names = {"KDE", "kde-neon"}, .names = {"KDE", "kde-neon"},
@@ -2462,6 +2492,7 @@ static const FFlogo M[] = {
// MageiaSmall // MageiaSmall
{ {
.names = {"Mageia_small"}, .names = {"Mageia_small"},
.type = FF_LOGO_LINE_TYPE_SMALL_BIT,
.lines = FASTFETCH_DATATEXT_LOGO_MAGEIA_SMALL, .lines = FASTFETCH_DATATEXT_LOGO_MAGEIA_SMALL,
.colors = { .colors = {
FF_COLOR_FG_CYAN, FF_COLOR_FG_CYAN,
@@ -2649,7 +2680,7 @@ static const FFlogo M[] = {
}, },
// MX // MX
{ {
.names = {"MX"}, .names = {"MX", "MX Linux"},
.lines = FASTFETCH_DATATEXT_LOGO_MX, .lines = FASTFETCH_DATATEXT_LOGO_MX,
.colors = { .colors = {
FF_COLOR_FG_WHITE, FF_COLOR_FG_WHITE,
@@ -2659,7 +2690,8 @@ static const FFlogo M[] = {
}, },
// MXSmall // MXSmall
{ {
.names = {"MX_small", "mx-small"}, .names = {"MX_small", "mx linux_small"},
.type = FF_LOGO_LINE_TYPE_SMALL_BIT,
.lines = FASTFETCH_DATATEXT_LOGO_MX_SMALL, .lines = FASTFETCH_DATATEXT_LOGO_MX_SMALL,
.colors = { .colors = {
FF_COLOR_FG_WHITE, FF_COLOR_FG_WHITE,
@@ -2667,6 +2699,17 @@ static const FFlogo M[] = {
.colorKeys = FF_COLOR_FG_BLUE, .colorKeys = FF_COLOR_FG_BLUE,
.colorTitle = FF_COLOR_FG_CYAN, .colorTitle = FF_COLOR_FG_CYAN,
}, },
// MX2
{
.names = {"MX2"},
.type = FF_LOGO_LINE_TYPE_ALTER_BIT,
.lines = FASTFETCH_DATATEXT_LOGO_MX2,
.colors = {
FF_COLOR_FG_WHITE,
},
.colorKeys = FF_COLOR_FG_BLUE,
.colorTitle = FF_COLOR_FG_CYAN,
},
// LAST // LAST
{}, {},
}; };
@@ -2730,6 +2773,7 @@ static const FFlogo N[] = {
// NixOSSmall // NixOSSmall
{ {
.names = {"NixOS_small", "nix_small", "nixos-linux-small", "nix-linux-small"}, .names = {"NixOS_small", "nix_small", "nixos-linux-small", "nix-linux-small"},
.type = FF_LOGO_LINE_TYPE_SMALL_BIT,
.lines = FASTFETCH_DATATEXT_LOGO_NIXOS_SMALL, .lines = FASTFETCH_DATATEXT_LOGO_NIXOS_SMALL,
.colors = { .colors = {
FF_COLOR_FG_BLUE, FF_COLOR_FG_BLUE,
@@ -3301,6 +3345,7 @@ static const FFlogo P[] = {
// PostMarketOSSmall // PostMarketOSSmall
{ {
.names = {"PostMarketOS_small"}, .names = {"PostMarketOS_small"},
.type = FF_LOGO_LINE_TYPE_SMALL_BIT,
.lines = FASTFETCH_DATATEXT_LOGO_POSTMARKETOS_SMALL, .lines = FASTFETCH_DATATEXT_LOGO_POSTMARKETOS_SMALL,
.colors = { .colors = {
FF_COLOR_FG_GREEN, FF_COLOR_FG_GREEN,
@@ -3309,7 +3354,7 @@ static const FFlogo P[] = {
}, },
// Proxmox // Proxmox
{ {
.names = {"proxmox"}, .names = {"Proxmox", "pve"},
.lines = FASTFETCH_DATATEXT_LOGO_PROXMOX, .lines = FASTFETCH_DATATEXT_LOGO_PROXMOX,
.colors = { .colors = {
FF_COLOR_FG_WHITE, FF_COLOR_FG_WHITE,
@@ -3560,6 +3605,7 @@ static const FFlogo R[] = {
// RockyLinuxSmall // RockyLinuxSmall
{ {
.names = {"rocky_small", "rocky-linux_small", "rockylinux_small"}, .names = {"rocky_small", "rocky-linux_small", "rockylinux_small"},
.type = FF_LOGO_LINE_TYPE_SMALL_BIT,
.lines = FASTFETCH_DATATEXT_LOGO_ROCKY_SMALL, .lines = FASTFETCH_DATATEXT_LOGO_ROCKY_SMALL,
.colors = { .colors = {
FF_COLOR_FG_GREEN, FF_COLOR_FG_GREEN,
+32 -7
View File
@@ -1,6 +1,7 @@
#include "image.h" #include "image.h"
#include "common/io/io.h" #include "common/io/io.h"
#include "common/printing.h" #include "common/printing.h"
#include "util/stringUtils.h"
#include <limits.h> #include <limits.h>
#include <math.h> #include <math.h>
@@ -53,13 +54,14 @@ static FFstrbuf base64Encode(const FFstrbuf* in)
return out; return out;
} }
static bool printImageIterm(void) static bool printImageIterm(bool printError)
{ {
const FFOptionsLogo* options = &instance.config.logo; const FFOptionsLogo* options = &instance.config.logo;
FF_STRBUF_AUTO_DESTROY buf = ffStrbufCreate(); FF_STRBUF_AUTO_DESTROY buf = ffStrbufCreate();
if(!ffAppendFileBuffer(options->source.chars, &buf)) if(!ffAppendFileBuffer(options->source.chars, &buf))
{ {
fputs("Logo: Failed to load image file\n", stderr); if (printError)
fputs("Logo (iterm): Failed to load image file\n", stderr);
return false; return false;
} }
@@ -134,9 +136,17 @@ static bool printImageIterm(void)
return true; return true;
} }
static bool printImageKittyDirect(void) static bool printImageKittyDirect(bool printError)
{ {
const FFOptionsLogo* options = &instance.config.logo; const FFOptionsLogo* options = &instance.config.logo;
if (!ffPathExists(options->source.chars, FF_PATHTYPE_FILE))
{
if (printError)
fputs("Logo (kitty-direct): Failed to load image file\n", stderr);
return false;
}
FF_STRBUF_AUTO_DESTROY base64 = base64Encode(&options->source); FF_STRBUF_AUTO_DESTROY base64 = base64Encode(&options->source);
if (!options->width || !options->height) if (!options->width || !options->height)
@@ -771,7 +781,7 @@ static bool printImageIfExistsSlowPath(FFLogoType type, bool printError)
if(!getCharacterPixelDimensions(&requestData)) if(!getCharacterPixelDimensions(&requestData))
{ {
if(printError) if(printError)
fputs("Logo: getCharacterPixelDimensions() failed", stderr); fputs("Logo: getCharacterPixelDimensions() failed\n", stderr);
return false; return false;
} }
@@ -788,7 +798,7 @@ static bool printImageIfExistsSlowPath(FFLogoType type, bool printError)
//We can safely return here, because if realpath failed, we surely won't be able to read the file //We can safely return here, because if realpath failed, we surely won't be able to read the file
ffStrbufDestroy(&requestData.cacheDir); ffStrbufDestroy(&requestData.cacheDir);
if(printError) if(printError)
fputs("Logo: Querying realpath of the image source failed", stderr); fputs("Logo: Querying realpath of the image source failed\n", stderr);
return false; return false;
} }
ffStrbufRecalculateLength(&requestData.cacheDir); ffStrbufRecalculateLength(&requestData.cacheDir);
@@ -832,6 +842,13 @@ static bool printImageIfExistsSlowPath(FFLogoType type, bool printError)
bool ffLogoPrintImageIfExists(FFLogoType type, bool printError) bool ffLogoPrintImageIfExists(FFLogoType type, bool printError)
{ {
if(instance.config.display.pipe)
{
if(printError)
fputs("Logo: Image logo is not supported in pipe mode\n", stderr);
return false;
}
if(!ffPathExists(instance.config.logo.source.chars, FF_PATHTYPE_FILE)) if(!ffPathExists(instance.config.logo.source.chars, FF_PATHTYPE_FILE))
{ {
if(printError) if(printError)
@@ -839,11 +856,19 @@ bool ffLogoPrintImageIfExists(FFLogoType type, bool printError)
return false; return false;
} }
const char* term = getenv("TERM");
if((term && ffStrEquals(term, "screen")) || getenv("ZELLIJ"))
{
if(printError)
fputs("Logo: Image logo is not supported in terminal multiplexers\n", stderr);
return false;
}
if(type == FF_LOGO_TYPE_IMAGE_ITERM) if(type == FF_LOGO_TYPE_IMAGE_ITERM)
return printImageIterm(); return printImageIterm(printError);
if(type == FF_LOGO_TYPE_IMAGE_KITTY_DIRECT) if(type == FF_LOGO_TYPE_IMAGE_KITTY_DIRECT)
return printImageKittyDirect(); return printImageKittyDirect(printError);
#if !defined(FF_HAVE_CHAFA) #if !defined(FF_HAVE_CHAFA)
if(type == FF_LOGO_TYPE_IMAGE_CHAFA) if(type == FF_LOGO_TYPE_IMAGE_CHAFA)
+26 -16
View File
@@ -61,7 +61,7 @@ void ffLogoPrintChars(const char* data, bool doColorReplacement)
FF_STRBUF_AUTO_DESTROY result = ffStrbufCreateA(2048); FF_STRBUF_AUTO_DESTROY result = ffStrbufCreateA(2048);
if (instance.config.display.brightColor) if (!instance.config.display.pipe && instance.config.display.brightColor)
ffStrbufAppendS(&result, FASTFETCH_TEXT_MODIFIER_BOLT); ffStrbufAppendS(&result, FASTFETCH_TEXT_MODIFIER_BOLT);
ffStrbufAppendNC(&result, options->paddingTop, '\n'); ffStrbufAppendNC(&result, options->paddingTop, '\n');
@@ -70,7 +70,7 @@ void ffLogoPrintChars(const char* data, bool doColorReplacement)
instance.state.logoHeight = options->paddingTop; instance.state.logoHeight = options->paddingTop;
//Use logoColor[0] as the default color //Use logoColor[0] as the default color
if(doColorReplacement) if(doColorReplacement && !instance.config.display.pipe)
ffStrbufAppendF(&result, "\e[%sm", options->colors[0].chars); ffStrbufAppendF(&result, "\e[%sm", options->colors[0].chars);
while(*data != '\0') while(*data != '\0')
@@ -143,19 +143,27 @@ void ffLogoPrintChars(const char* data, bool doColorReplacement)
continue; continue;
} }
//Map the number to an array index, so that '1' -> 0, '2' -> 1, etc. if(!instance.config.display.pipe)
int index = ((int) *data) - 49;
//If the index is valid, print the color. Otherwise continue as normal
if(index < 0 || index >= FASTFETCH_LOGO_MAX_COLORS)
{ {
ffStrbufAppendC(&result, '$'); //Map the number to an array index, so that '1' -> 0, '2' -> 1, etc.
++currentlineLength; int index = ((int) *data) - 49;
//Don't continue here, we want to print the current char as unicode
//If the index is valid, print the color. Otherwise continue as normal
if(index < 0 || index >= FASTFETCH_LOGO_MAX_COLORS)
{
ffStrbufAppendC(&result, '$');
++currentlineLength;
//Don't continue here, we want to print the current char as unicode
}
else
{
ffStrbufAppendF(&result, "\e[%sm", options->colors[index].chars);
++data;
continue;
}
} }
else else
{ {
ffStrbufAppendF(&result, "\e[%sm", options->colors[index].chars);
++data; ++data;
continue; continue;
} }
@@ -188,7 +196,8 @@ void ffLogoPrintChars(const char* data, bool doColorReplacement)
} }
} }
ffStrbufAppendS(&result, FASTFETCH_TEXT_MODIFIER_RESET); if(!instance.config.display.pipe)
ffStrbufAppendS(&result, FASTFETCH_TEXT_MODIFIER_RESET);
if(!options->separate) if(!options->separate)
{ {
@@ -393,7 +402,8 @@ static bool logoPrintFileIfExists(bool doColorReplacement, bool raw)
: !ffAppendFileBuffer(options->source.chars, &content) : !ffAppendFileBuffer(options->source.chars, &content)
) )
{ {
fprintf(stderr, "Logo: Failed to load file content from logo source: %s \n", options->source.chars); if (instance.config.display.showErrors)
fprintf(stderr, "Logo: Failed to load file content from logo source: %s \n", options->source.chars);
return false; return false;
} }
@@ -448,7 +458,7 @@ static bool logoTryKnownType(void)
if(options->type == FF_LOGO_TYPE_IMAGE_RAW) if(options->type == FF_LOGO_TYPE_IMAGE_RAW)
return logoPrintFileIfExists(false, true); return logoPrintFileIfExists(false, true);
return logoPrintImageIfExists(options->type, true); return logoPrintImageIfExists(options->type, instance.config.display.showErrors);
} }
static void logoPrintKnownType(void) static void logoPrintKnownType(void)
@@ -459,10 +469,10 @@ static void logoPrintKnownType(void)
void ffLogoPrint(void) void ffLogoPrint(void)
{ {
//In pipe mode, we don't have a logo or padding. //When generate JSON result, we don't have a logo or padding.
//We also don't need to set main color, because it won't be printed anyway. //We also don't need to set main color, because it won't be printed anyway.
//So we can return quickly here. //So we can return quickly here.
if(instance.config.display.pipe || instance.state.resultDoc) if(instance.state.resultDoc)
{ {
instance.state.logoHeight = 0; instance.state.logoHeight = 0;
instance.state.logoWidth = 0; instance.state.logoWidth = 0;
+19 -14
View File
@@ -84,23 +84,28 @@ void ffPrintBattery(FFBatteryOptions* options)
if (error) if (error)
{ {
ffPrintError(FF_BATTERY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "%s", error); ffPrintError(FF_BATTERY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "%s", error);
return;
} }
else if(results.length == 0)
{ {
for(uint8_t i = 0; i < (uint8_t) results.length; i++) ffPrintError(FF_BATTERY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "%s", "No batteries found");
{ return;
FFBatteryResult* result = ffListGet(&results, i); }
printBattery(options, result, i);
ffStrbufDestroy(&result->manufacturer); for(uint32_t i = 0; i < results.length; i++)
ffStrbufDestroy(&result->modelName); {
ffStrbufDestroy(&result->technology); FFBatteryResult* result = ffListGet(&results, i);
ffStrbufDestroy(&result->status); printBattery(options, result, (uint8_t) i);
ffStrbufDestroy(&result->serial); }
ffStrbufDestroy(&result->manufactureDate);
} FF_LIST_FOR_EACH(FFBatteryResult, result, results)
if(results.length == 0) {
ffPrintError(FF_BATTERY_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "No batteries found"); ffStrbufDestroy(&result->manufacturer);
ffStrbufDestroy(&result->modelName);
ffStrbufDestroy(&result->technology);
ffStrbufDestroy(&result->status);
ffStrbufDestroy(&result->serial);
ffStrbufDestroy(&result->manufactureDate);
} }
} }
+10 -12
View File
@@ -150,19 +150,17 @@ void ffGenerateBluetoothJsonResult(FF_MAYBE_UNUSED FFBluetoothOptions* options,
yyjson_mut_obj_add_str(doc, module, "error", error); yyjson_mut_obj_add_str(doc, module, "error", error);
return; return;
} }
else
{
yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result");
FF_LIST_FOR_EACH(FFBluetoothResult, item, results) yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result");
{
yyjson_mut_val* obj = yyjson_mut_arr_add_obj(doc, arr); FF_LIST_FOR_EACH(FFBluetoothResult, item, results)
yyjson_mut_obj_add_strbuf(doc, obj, "address", &item->address); {
yyjson_mut_obj_add_uint(doc, obj, "battery", item->battery); yyjson_mut_val* obj = yyjson_mut_arr_add_obj(doc, arr);
yyjson_mut_obj_add_bool(doc, obj, "connected", item->connected); yyjson_mut_obj_add_strbuf(doc, obj, "address", &item->address);
yyjson_mut_obj_add_strbuf(doc, obj, "name", &item->name); yyjson_mut_obj_add_uint(doc, obj, "battery", item->battery);
yyjson_mut_obj_add_strbuf(doc, obj, "type", &item->type); yyjson_mut_obj_add_bool(doc, obj, "connected", item->connected);
} yyjson_mut_obj_add_strbuf(doc, obj, "name", &item->name);
yyjson_mut_obj_add_strbuf(doc, obj, "type", &item->type);
} }
FF_LIST_FOR_EACH(FFBluetoothResult, device, results) FF_LIST_FOR_EACH(FFBluetoothResult, device, results)
-6
View File
@@ -154,12 +154,6 @@ void ffGenerateBrightnessJsonResult(FF_MAYBE_UNUSED FFBrightnessOptions* options
return; return;
} }
if(result.length == 0)
{
yyjson_mut_obj_add_str(doc, module, "error", "No result is detected.");
return;
}
yyjson_mut_val* arr = yyjson_mut_arr(doc); yyjson_mut_val* arr = yyjson_mut_arr(doc);
yyjson_mut_obj_add_val(doc, module, "result", arr); yyjson_mut_obj_add_val(doc, module, "result", arr);
+8 -7
View File
@@ -16,9 +16,6 @@ static inline uint8_t max(uint8_t a, uint8_t b)
void ffPrintColors(FFColorsOptions* options) void ffPrintColors(FFColorsOptions* options)
{ {
if(instance.config.display.pipe)
return;
bool flag = false; bool flag = false;
FF_STRBUF_AUTO_DESTROY result = ffStrbufCreateA(128); FF_STRBUF_AUTO_DESTROY result = ffStrbufCreateA(128);
@@ -28,7 +25,8 @@ void ffPrintColors(FFColorsOptions* options)
// 3%d: Set the foreground color // 3%d: Set the foreground color
for(uint8_t i = options->block.range[0]; i <= min(options->block.range[1], 7); i++) for(uint8_t i = options->block.range[0]; i <= min(options->block.range[1], 7); i++)
{ {
ffStrbufAppendF(&result, "\e[3%dm", i); if(!instance.config.display.pipe)
ffStrbufAppendF(&result, "\e[3%dm", i);
for (uint8_t j = 0; j < options->block.width; j++) for (uint8_t j = 0; j < options->block.width; j++)
ffStrbufAppendS(&result, ""); ffStrbufAppendS(&result, "");
} }
@@ -40,7 +38,8 @@ void ffPrintColors(FFColorsOptions* options)
if(options->paddingLeft > 0) if(options->paddingLeft > 0)
ffPrintCharTimes(' ', options->paddingLeft); ffPrintCharTimes(' ', options->paddingLeft);
ffStrbufAppendS(&result, FASTFETCH_TEXT_MODIFIER_RESET); if(!instance.config.display.pipe)
ffStrbufAppendS(&result, FASTFETCH_TEXT_MODIFIER_RESET);
ffStrbufPutTo(&result, stdout); ffStrbufPutTo(&result, stdout);
ffStrbufClear(&result); ffStrbufClear(&result);
} }
@@ -49,7 +48,8 @@ void ffPrintColors(FFColorsOptions* options)
// 9%d: Set the foreground to the bright color // 9%d: Set the foreground to the bright color
for(uint8_t i = max(options->block.range[0], 8); i <= options->block.range[1]; i++) for(uint8_t i = max(options->block.range[0], 8); i <= options->block.range[1]; i++)
{ {
ffStrbufAppendF(&result, "\e[1;9%dm", i - 8); if(!instance.config.display.pipe)
ffStrbufAppendF(&result, "\e[1;9%dm", i - 8);
for (uint8_t j = 0; j < options->block.width; j++) for (uint8_t j = 0; j < options->block.width; j++)
ffStrbufAppendS(&result, ""); ffStrbufAppendS(&result, "");
} }
@@ -82,7 +82,8 @@ void ffPrintColors(FFColorsOptions* options)
if(options->paddingLeft > 0) if(options->paddingLeft > 0)
ffPrintCharTimes(' ', options->paddingLeft); ffPrintCharTimes(' ', options->paddingLeft);
ffStrbufAppendS(&result, FASTFETCH_TEXT_MODIFIER_RESET); if(!instance.config.display.pipe)
ffStrbufAppendS(&result, FASTFETCH_TEXT_MODIFIER_RESET);
ffStrbufPutTo(&result, stdout); ffStrbufPutTo(&result, stdout);
} }
+2 -1
View File
@@ -8,7 +8,8 @@ void ffPrintCustom(FFCustomOptions* options)
{ {
ffPrintLogoAndKey(FF_CUSTOM_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT); ffPrintLogoAndKey(FF_CUSTOM_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT);
ffStrbufWriteTo(&options->moduleArgs.outputFormat, stdout); ffStrbufWriteTo(&options->moduleArgs.outputFormat, stdout);
puts(FASTFETCH_TEXT_MODIFIER_RESET); if(!instance.config.display.pipe)
puts(FASTFETCH_TEXT_MODIFIER_RESET);
} }
bool ffParseCustomCommandOptions(FFCustomOptions* options, const char* key, const char* value) bool ffParseCustomCommandOptions(FFCustomOptions* options, const char* key, const char* value)
+1 -1
View File
@@ -152,7 +152,7 @@ void ffGenerateDateTimeJsonConfig(FFDateTimeOptions* options, yyjson_mut_doc* do
void ffGenerateDateTimeJsonResult(FF_MAYBE_UNUSED FFDateTimeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) void ffGenerateDateTimeJsonResult(FF_MAYBE_UNUSED FFDateTimeOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module)
{ {
yyjson_mut_obj_add_uint(doc, module, "result", ffTimeGetNow()); yyjson_mut_obj_add_strcpy(doc, module, "result", ffTimeToFullStr(ffTimeGetNow()));
} }
void ffPrintDateTimeHelpFormat(void) void ffPrintDateTimeHelpFormat(void)
+2
View File
@@ -406,6 +406,8 @@ void ffGenerateDiskJsonResult(FFDiskOptions* options, yyjson_mut_doc* doc, yyjso
yyjson_mut_arr_add_str(doc, typeArr, "Hidden"); yyjson_mut_arr_add_str(doc, typeArr, "Hidden");
if(item->type & FF_DISK_VOLUME_TYPE_READONLY_BIT) if(item->type & FF_DISK_VOLUME_TYPE_READONLY_BIT)
yyjson_mut_arr_add_str(doc, typeArr, "Read-only"); yyjson_mut_arr_add_str(doc, typeArr, "Read-only");
if(item->type & FF_DISK_VOLUME_TYPE_UNKNOWN_BIT)
yyjson_mut_arr_add_str(doc, typeArr, "Unknown");
const char* pstr = ffTimeToFullStr(item->createTime); const char* pstr = ffTimeToFullStr(item->createTime);
if (*pstr) if (*pstr)
+1
View File
@@ -279,6 +279,7 @@ void ffGenerateDisplayJsonResult(FF_MAYBE_UNUSED FFDisplayOptions* options, yyjs
yyjson_mut_obj_add_str(doc, module, "error", "Couldn't detect display"); yyjson_mut_obj_add_str(doc, module, "error", "Couldn't detect display");
return; return;
} }
yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result"); yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result");
FF_LIST_FOR_EACH(FFDisplayResult, item, dsResult->displays) FF_LIST_FOR_EACH(FFDisplayResult, item, dsResult->displays)
{ {
-6
View File
@@ -118,12 +118,6 @@ void ffGenerateGamepadJsonResult(FF_MAYBE_UNUSED FFGamepadOptions* options, yyjs
return; return;
} }
if(!result.length)
{
yyjson_mut_obj_add_str(doc, module, "error", "No devices detected");
return;
}
yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result"); yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result");
FF_LIST_FOR_EACH(FFGamepadDevice, device, result) FF_LIST_FOR_EACH(FFGamepadDevice, device, result)
{ {
+1 -8
View File
@@ -334,13 +334,7 @@ void ffGenerateLocalIpJsonResult(FF_MAYBE_UNUSED FFLocalIpOptions* options, yyjs
if(error) if(error)
{ {
yyjson_mut_obj_add_str(doc, module, "error", error); yyjson_mut_obj_add_str(doc, module, "error", error);
goto exit; return;
}
if(results.length == 0)
{
yyjson_mut_obj_add_str(doc, module, "error", "Failed to detect any IPs");
goto exit;
} }
yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result"); yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result");
@@ -354,7 +348,6 @@ void ffGenerateLocalIpJsonResult(FF_MAYBE_UNUSED FFLocalIpOptions* options, yyjs
yyjson_mut_obj_add_strbuf(doc, obj, "name", &ip->name); yyjson_mut_obj_add_strbuf(doc, obj, "name", &ip->name);
} }
exit:
FF_LIST_FOR_EACH(FFLocalIpResult, ip, results) FF_LIST_FOR_EACH(FFLocalIpResult, ip, results)
{ {
ffStrbufDestroy(&ip->name); ffStrbufDestroy(&ip->name);
+1 -9
View File
@@ -22,7 +22,7 @@ static void buildOutputDefault(const FFOSResult* os, FFstrbuf* result)
ffStrbufAppend(result, &instance.state.platform.systemName); ffStrbufAppend(result, &instance.state.platform.systemName);
//Append code name if it is missing //Append code name if it is missing
if(os->codename.length > 0 && !ffStrbufContain(result, &os->versionID)) if(os->codename.length > 0 && !ffStrbufContain(result, &os->codename))
{ {
ffStrbufAppendC(result, ' '); ffStrbufAppendC(result, ' ');
ffStrbufAppend(result, &os->codename); ffStrbufAppend(result, &os->codename);
@@ -40,14 +40,6 @@ static void buildOutputDefault(const FFOSResult* os, FFstrbuf* result)
ffStrbufAppend(result, &os->version); ffStrbufAppend(result, &os->version);
} }
#ifdef __APPLE__
if(os->buildID.length > 0)
{
ffStrbufAppendC(result, ' ');
ffStrbufAppend(result, &os->buildID);
}
#endif
//Append variant if it is missing //Append variant if it is missing
if(os->variant.length > 0 && ffStrbufFirstIndex(result, &os->variant) == result->length) if(os->variant.length > 0 && ffStrbufFirstIndex(result, &os->variant) == result->length)
{ {
+2 -3
View File
@@ -107,7 +107,6 @@ void ffPrintPhysicalDisk(FFPhysicalDiskOptions* options)
ffTempsAppendNum(dev->temperature, &tempStr, options->tempConfig); ffTempsAppendNum(dev->temperature, &tempStr, options->tempConfig);
if (dev->type & FF_PHYSICALDISK_TYPE_READWRITE) if (dev->type & FF_PHYSICALDISK_TYPE_READWRITE)
readOnlyType = "Read-write"; readOnlyType = "Read-write";
ffParseSize(dev->size, &buffer);
FF_PRINT_FORMAT_CHECKED(key.chars, 0, &options->moduleArgs, FF_PRINT_TYPE_NO_CUSTOM_KEY, FF_PHYSICALDISK_NUM_FORMAT_ARGS, ((FFformatarg[]){ FF_PRINT_FORMAT_CHECKED(key.chars, 0, &options->moduleArgs, FF_PRINT_TYPE_NO_CUSTOM_KEY, FF_PHYSICALDISK_NUM_FORMAT_ARGS, ((FFformatarg[]){
{FF_FORMAT_ARG_TYPE_STRBUF, &buffer}, {FF_FORMAT_ARG_TYPE_STRBUF, &buffer},
{FF_FORMAT_ARG_TYPE_STRBUF, &dev->name}, {FF_FORMAT_ARG_TYPE_STRBUF, &dev->name},
@@ -118,7 +117,7 @@ void ffPrintPhysicalDisk(FFPhysicalDiskOptions* options)
{FF_FORMAT_ARG_TYPE_STRING, removableType}, {FF_FORMAT_ARG_TYPE_STRING, removableType},
{FF_FORMAT_ARG_TYPE_STRING, readOnlyType}, {FF_FORMAT_ARG_TYPE_STRING, readOnlyType},
{FF_FORMAT_ARG_TYPE_STRBUF, &dev->revision}, {FF_FORMAT_ARG_TYPE_STRBUF, &dev->revision},
{FF_FORMAT_ARG_TYPE_DOUBLE, &tempStr}, {FF_FORMAT_ARG_TYPE_STRBUF, &tempStr},
})); }));
} }
++index; ++index;
@@ -252,7 +251,7 @@ void ffGeneratePhysicalDiskJsonResult(FFPhysicalDiskOptions* options, yyjson_mut
void ffPrintPhysicalDiskHelpFormat(void) void ffPrintPhysicalDiskHelpFormat(void)
{ {
FF_PRINT_MODULE_FORMAT_HELP_CHECKED(FF_PHYSICALDISK_MODULE_NAME, "{1}", FF_PHYSICALDISK_NUM_FORMAT_ARGS, ((const char* []) { FF_PRINT_MODULE_FORMAT_HELP_CHECKED(FF_PHYSICALDISK_MODULE_NAME, "{1} [{6}, {7}, {8}]", FF_PHYSICALDISK_NUM_FORMAT_ARGS, ((const char* []) {
"Device size (formatted)", "Device size (formatted)",
"Device name", "Device name",
"Device interconnect type", "Device interconnect type",
+18 -14
View File
@@ -101,24 +101,28 @@ void ffGeneratePowerAdapterJsonResult(FF_MAYBE_UNUSED FFPowerAdapterOptions* opt
if (error) if (error)
{ {
yyjson_mut_obj_add_str(doc, module, "error", error); yyjson_mut_obj_add_str(doc, module, "error", error);
return;
} }
else if(results.length == 0)
yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result");
FF_LIST_FOR_EACH(FFPowerAdapterResult, item, results)
{ {
yyjson_mut_obj_add_str(doc, module, "error", "No power adapters found"); yyjson_mut_val* obj = yyjson_mut_arr_add_obj(doc, arr);
yyjson_mut_obj_add_strbuf(doc, obj, "description", &item->description);
yyjson_mut_obj_add_strbuf(doc, obj, "manufacturer", &item->manufacturer);
yyjson_mut_obj_add_strbuf(doc, obj, "modelName", &item->modelName);
yyjson_mut_obj_add_strbuf(doc, obj, "name", &item->name);
yyjson_mut_obj_add_strbuf(doc, obj, "serial", &item->serial);
yyjson_mut_obj_add_int(doc, obj, "watts", item->watts);
} }
else
FF_LIST_FOR_EACH(FFPowerAdapterResult, item, results)
{ {
yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result"); ffStrbufDestroy(&item->manufacturer);
FF_LIST_FOR_EACH(FFPowerAdapterResult, item, results) ffStrbufDestroy(&item->description);
{ ffStrbufDestroy(&item->modelName);
yyjson_mut_val* obj = yyjson_mut_arr_add_obj(doc, arr); ffStrbufDestroy(&item->name);
yyjson_mut_obj_add_strbuf(doc, obj, "description", &item->description); ffStrbufDestroy(&item->serial);
yyjson_mut_obj_add_strbuf(doc, obj, "manufacturer", &item->manufacturer);
yyjson_mut_obj_add_strbuf(doc, obj, "modelName", &item->modelName);
yyjson_mut_obj_add_strbuf(doc, obj, "name", &item->name);
yyjson_mut_obj_add_strbuf(doc, obj, "serial", &item->serial);
yyjson_mut_obj_add_int(doc, obj, "watts", item->watts);
}
} }
} }
-6
View File
@@ -200,12 +200,6 @@ void ffGenerateSoundJsonResult(FF_MAYBE_UNUSED FFSoundOptions* options, yyjson_m
return; return;
} }
if(result.length == 0)
{
yyjson_mut_obj_add_str(doc, module, "error", "No active sound devices found");
return;
}
yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result"); yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result");
FF_LIST_FOR_EACH(FFSoundDevice, item, result) FF_LIST_FOR_EACH(FFSoundDevice, item, result)
{ {
+1 -2
View File
@@ -146,7 +146,7 @@ void ffGenerateUsersJsonResult(FF_MAYBE_UNUSED FFUsersOptions* options, yyjson_m
if(error) if(error)
{ {
yyjson_mut_obj_add_str(doc, module, "error", error); yyjson_mut_obj_add_str(doc, module, "error", error);
goto exit; return;
} }
yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result"); yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result");
@@ -164,7 +164,6 @@ void ffGenerateUsersJsonResult(FF_MAYBE_UNUSED FFUsersOptions* options, yyjson_m
yyjson_mut_obj_add_null(doc, obj, "loginTime"); yyjson_mut_obj_add_null(doc, obj, "loginTime");
} }
exit:
FF_LIST_FOR_EACH(FFUserResult, user, results) FF_LIST_FOR_EACH(FFUserResult, user, results)
{ {
ffStrbufDestroy(&user->clientIp); ffStrbufDestroy(&user->clientIp);
-5
View File
@@ -114,11 +114,6 @@ void ffGenerateWifiJsonResult(FF_MAYBE_UNUSED FFWifiOptions* options, yyjson_mut
yyjson_mut_obj_add_str(doc, module, "error", error); yyjson_mut_obj_add_str(doc, module, "error", error);
return; return;
} }
if(!result.length)
{
yyjson_mut_obj_add_str(doc, module, "error", "No Wifi interfaces found");
return;
}
yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result"); yyjson_mut_val* arr = yyjson_mut_obj_add_arr(doc, module, "result");
FF_LIST_FOR_EACH(FFWifiResult, wifi, result) FF_LIST_FOR_EACH(FFWifiResult, wifi, result)
+2 -2
View File
@@ -92,7 +92,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va
} }
yyjson_val* ndigits = yyjson_obj_get(val, "ndigits"); yyjson_val* ndigits = yyjson_obj_get(val, "ndigits");
if (ndigits) options->percentNdigits = (uint8_t) yyjson_get_uint(ndigits); if (ndigits) options->sizeNdigits = (uint8_t) yyjson_get_uint(ndigits);
} }
else if (ffStrEqualsIgnCase(key, "temp")) else if (ffStrEqualsIgnCase(key, "temp"))
{ {
@@ -350,7 +350,7 @@ void ffOptionsInitDisplay(FFOptionsDisplay* options)
ffStrbufInitStatic(&options->keyValueSeparator, ": "); ffStrbufInitStatic(&options->keyValueSeparator, ": ");
options->showErrors = false; options->showErrors = false;
options->pipe = !isatty(STDOUT_FILENO); options->pipe = !isatty(STDOUT_FILENO) || !!getenv("NO_COLOR");
#ifdef NDEBUG #ifdef NDEBUG
options->disableLinewrap = !options->pipe; options->disableLinewrap = !options->pipe;
+1 -1
View File
@@ -27,7 +27,7 @@ typedef struct FFOptionsDisplay
FFstrbuf keyValueSeparator; FFstrbuf keyValueSeparator;
bool stat; bool stat;
bool pipe; //disables logo and all escape sequences bool pipe; //disables all escape sequences
bool showErrors; bool showErrors;
bool disableLinewrap; bool disableLinewrap;
bool hideCursor; bool hideCursor;
-9
View File
@@ -27,8 +27,6 @@ const char* ffOptionsParseGeneralJsonConfig(FFOptionsGeneral* options, yyjson_va
options->escapeBedrock = yyjson_get_bool(val); options->escapeBedrock = yyjson_get_bool(val);
else if (ffStrEqualsIgnCase(key, "playerName")) else if (ffStrEqualsIgnCase(key, "playerName"))
ffStrbufSetS(&options->playerName, yyjson_get_str(val)); ffStrbufSetS(&options->playerName, yyjson_get_str(val));
else if (ffStrEqualsIgnCase(key, "osFile"))
ffStrbufSetS(&options->osFile, yyjson_get_str(val));
else if (ffStrEqualsIgnCase(key, "dsForceDrm")) else if (ffStrEqualsIgnCase(key, "dsForceDrm"))
{ {
if (yyjson_is_str(val)) if (yyjson_is_str(val))
@@ -79,8 +77,6 @@ bool ffOptionsParseGeneralCommandLine(FFOptionsGeneral* options, const char* key
options->escapeBedrock = ffOptionParseBoolean(value); options->escapeBedrock = ffOptionParseBoolean(value);
else if(ffStrEqualsIgnCase(key, "--player-name")) else if(ffStrEqualsIgnCase(key, "--player-name"))
ffOptionParseString(key, value, &options->playerName); ffOptionParseString(key, value, &options->playerName);
else if (ffStrEqualsIgnCase(key, "--os-file"))
ffOptionParseString(key, value, &options->osFile);
else if(ffStrEqualsIgnCase(key, "--ds-force-drm")) else if(ffStrEqualsIgnCase(key, "--ds-force-drm"))
{ {
if (ffOptionParseBoolean(value)) if (ffOptionParseBoolean(value))
@@ -109,7 +105,6 @@ void ffOptionsInitGeneral(FFOptionsGeneral* options)
#if defined(__linux__) || defined(__FreeBSD__) #if defined(__linux__) || defined(__FreeBSD__)
options->escapeBedrock = true; options->escapeBedrock = true;
ffStrbufInit(&options->playerName); ffStrbufInit(&options->playerName);
ffStrbufInit(&options->osFile);
options->dsForceDrm = FF_DS_FORCE_DRM_TYPE_FALSE; options->dsForceDrm = FF_DS_FORCE_DRM_TYPE_FALSE;
#elif defined(_WIN32) #elif defined(_WIN32)
options->wmiTimeout = 5000; options->wmiTimeout = 5000;
@@ -120,7 +115,6 @@ void ffOptionsDestroyGeneral(FF_MAYBE_UNUSED FFOptionsGeneral* options)
{ {
#if defined(__linux__) || defined(__FreeBSD__) #if defined(__linux__) || defined(__FreeBSD__)
ffStrbufDestroy(&options->playerName); ffStrbufDestroy(&options->playerName);
ffStrbufDestroy(&options->osFile);
#endif #endif
} }
@@ -145,9 +139,6 @@ void ffOptionsGenerateGeneralJsonConfig(FFOptionsGeneral* options, yyjson_mut_do
if (!ffStrbufEqual(&options->playerName, &defaultOptions.playerName)) 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 (!ffStrbufEqual(&options->osFile, &defaultOptions.osFile))
yyjson_mut_obj_add_strbuf(doc, obj, "osFile", &options->osFile);
if (options->dsForceDrm != defaultOptions.dsForceDrm) if (options->dsForceDrm != defaultOptions.dsForceDrm)
{ {
switch (options->dsForceDrm) switch (options->dsForceDrm)
-1
View File
@@ -17,7 +17,6 @@ typedef struct FFOptionsGeneral
// Module options that cannot be put in module option structure // Module options that cannot be put in module option structure
#if defined(__linux__) || defined(__FreeBSD__) #if defined(__linux__) || defined(__FreeBSD__)
FFstrbuf playerName; FFstrbuf playerName;
FFstrbuf osFile;
bool escapeBedrock; bool escapeBedrock;
FFDsForceDrmType dsForceDrm; FFDsForceDrmType dsForceDrm;
#elif defined(_WIN32) #elif defined(_WIN32)
+2 -2
View File
@@ -73,8 +73,8 @@ void ffEdidGetSerialAndManufactureDate(const uint8_t edid[128], uint32_t* serial
{ {
if (edid[17] > 0 && edid[17] < 0xFF) if (edid[17] > 0 && edid[17] < 0xFF)
{ {
*year = edid[17] + 1990; *year = (uint16_t) edid[17] + 1990;
*week = edid[16]; *week = (uint16_t) edid[16];
if (*week == 0xFF) *week = 0; if (*week == 0xFF) *week = 0;
} }
else else
+5
View File
@@ -69,3 +69,8 @@ static inline bool ffStrContainsC(const char* str, char compareTo)
{ {
return strchr(str, compareTo) != NULL; return strchr(str, compareTo) != NULL;
} }
static inline bool ffCharIsEnglishAlphabet(char c)
{
return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
}
+1 -1
View File
@@ -5,6 +5,6 @@
#define FASTFETCH_TEXT_MODIFIER_BOLT "\033[1m" #define FASTFETCH_TEXT_MODIFIER_BOLT "\033[1m"
#define FASTFETCH_TEXT_MODIFIER_ERROR "\033[1;31m" #define FASTFETCH_TEXT_MODIFIER_ERROR "\033[1;31m"
#define FASTFETCH_TEXT_MODIFIER_RESET "\033[0m" #define FASTFETCH_TEXT_MODIFIER_RESET "\033[m"
#endif #endif