mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-09-13 02:42:09 +02:00
Compare commits
63 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 855fd6edee | |||
| d4bd4401a8 | |||
| 689feb39a4 | |||
| 0f64e2830a | |||
| 3e24cdc752 | |||
| dc9c285a0b | |||
| 1d03c9c85e | |||
| 4eae11df64 | |||
| eba13d5485 | |||
| 16b875ef5a | |||
| 366138e1bd | |||
| 7fe18a5b7c | |||
| 39cd8cfb4c | |||
| 8b441c85e5 | |||
| f66e901c44 | |||
| 3815823a20 | |||
| 33ff4870dc | |||
| 479731f076 | |||
| d2f3f47457 | |||
| 5ea89ecba5 | |||
| 865f57bd76 | |||
| e98e2a3d52 | |||
| 6bb748869e | |||
| 654721b8c5 | |||
| 0542eac1b9 | |||
| b9faf8d77f | |||
| 61f848146a | |||
| 4175dfdc3a | |||
| 861d9006d7 | |||
| 7ba07bd2e0 | |||
| 9fee36a286 | |||
| 2fc9230b29 | |||
| 5fb1286e15 | |||
| a4cace4765 | |||
| c6d2467a83 | |||
| db0d38202e | |||
| 9fbb23b135 | |||
| 3a990e495b | |||
| 648530ee8f | |||
| b12a59cdaf | |||
| 83c1fe26e6 | |||
| 217f98a36c | |||
| 1011e21ba8 | |||
| 08c6a6e4cb | |||
| 5e9fcaf7ca | |||
| 8b838cef61 | |||
| 22d9d8e196 | |||
| a789b8330a | |||
| 903ecf37f7 | |||
| c4a876f6aa | |||
| 82285ebeb4 | |||
| 36dadcdc7f | |||
| 030c05429a | |||
| a462a12370 | |||
| b386365d95 | |||
| 158db9d7c7 | |||
| 407bfa8c95 | |||
| 1449290e9e | |||
| 4c0ea7354d | |||
| 71cba2451a | |||
| ef3b5df048 | |||
| 3e98034e55 | |||
| 1c89101522 |
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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")
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -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
@@ -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"
|
||||||
|
|||||||
@@ -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": [
|
||||||
|
|||||||
@@ -9,8 +9,7 @@
|
|||||||
"modules": [
|
"modules": [
|
||||||
{
|
{
|
||||||
"type": "theme",
|
"type": "theme",
|
||||||
"key": "T",
|
"key": "T"
|
||||||
"format": "{7}"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "icons",
|
"type": "icons",
|
||||||
|
|||||||
+9
-12
@@ -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",
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
@@ -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;
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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, '/');
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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",,," ",,,^
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
█ █ █ █ █ █ █ █ █ █ █
|
||||||
|
███████████████████████
|
||||||
|
▄▄██ ██▄▄
|
||||||
|
▄▄██ ███████████ ██▄▄
|
||||||
|
▄▄██ ██ ██ ██▄▄
|
||||||
|
▄▄██ ██ ██ ██▄▄
|
||||||
|
▄▄██ ██ ██ ██▄▄
|
||||||
|
▄▄██ █████████████ ██▄▄
|
||||||
|
▄▄██ ██ ██ ██▄▄
|
||||||
|
▄▄██ ██ ██ ██▄▄
|
||||||
|
▄▄██ ██ ██ ██▄▄
|
||||||
|
▄▄██ ██▄▄
|
||||||
|
███████████████████████
|
||||||
|
█ █ █ █ █ █ █ █ █ █ █
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
.''''....''''.
|
||||||
|
.''... ...''.
|
||||||
|
''.. ..''
|
||||||
|
'.. ..''
|
||||||
|
.'. .,,'.. .',,,' ..'.
|
||||||
|
.'. .,,,,' .,,,,,' .'.
|
||||||
|
.'. .,,,,' .,,,,,. .'.
|
||||||
|
'.. .,,,,'',,,,;. .''
|
||||||
|
.'. .,,,,,,,;;. ..'
|
||||||
|
.'. .,,,,;;;;;${c2}, ${c1}..'.
|
||||||
|
'.. .,;;;,${c2}';;;;;, ${c1}..'
|
||||||
|
.'. .;;${c2};;' .;;:::: ${c1}.,.
|
||||||
|
'.. ${c2}.;;;;' .::::::. ${c1}.,'
|
||||||
|
'.. ${c2}.;;;;' .::::::. ${c1}.,${c2}'${c1}
|
||||||
|
.'.. ${c2}.',.
|
||||||
|
${c1}',.. ${c2}.','
|
||||||
|
${c1}.,,... ${c2}..',,.
|
||||||
|
..,,''........',,,.
|
||||||
|
......
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
|
@@@@@@@@@@@@%*+--:------=+*%@@@@@@@@@@@@
|
||||||
|
@@@@@@@@@#=. .-+#%@@@@@%#*+--=#@@@@@@@@@
|
||||||
|
@@@@@@@+. .=%@@@@@@@@@@@@@@@@*-:+@@@@@@@
|
||||||
|
@@@@@*. *@@@@@@@@@@@@@@@@@@@@@%-.*@@@@@
|
||||||
|
@@@@- -@@@@@@@@@@@@@@@@@@@@@@@#: -@@@@
|
||||||
|
@@@: -@@@@@@@=.*@@@@@@@@@@@@%- = :@@@
|
||||||
|
@@= .@@@@@@@@%- :%@@@@@@@@@+ -%@# =@@
|
||||||
|
@% +@@@@@@@@@@#. =@@@@@@*. .*@@@@. %@
|
||||||
|
@+ *@@@@@@*..*@@+ *@@%- =@@@@@@- +@
|
||||||
|
@= *@@@@%- -%@@- := -%@@@@@@@: +@
|
||||||
|
@+ :@@@= +@@= .#@@@@@@@@% *@
|
||||||
|
@% +*. .: *@@#: +@@: @@
|
||||||
|
@@+ :%@- :- :: +@@
|
||||||
|
@@@- .=@@= -@@@
|
||||||
|
@@+. . +@@
|
||||||
|
%=..:.................::...........:..-%
|
||||||
|
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
||||||
@@ -18,4 +18,3 @@
|
|||||||
.:ooooooolc:. .ooooooooooo'
|
.:ooooooolc:. .ooooooooooo'
|
||||||
.':loooooo; ,oooooooooc
|
.':loooooo; ,oooooooooc
|
||||||
..';::c' .;loooo:'
|
..';::c' .;loooo:'
|
||||||
.
|
|
||||||
+53
-7
@@ -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
@@ -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
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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');
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user