mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-09-13 02:42:09 +02:00
Compare commits
345 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 215029ea27 | |||
| 533f54fb73 | |||
| a6212c5b01 | |||
| ba76b18367 | |||
| 4290efb49d | |||
| 30b85fc169 | |||
| dc94ac8d0c | |||
| 1d9e612262 | |||
| be1791e386 | |||
| 3b8c2d6ee6 | |||
| c661e55053 | |||
| 56403bab5c | |||
| caef317ade | |||
| 131e01f35b | |||
| c8e3c6882a | |||
| c985bdbbfd | |||
| b80eb47ecd | |||
| 68942c1d3f | |||
| b36b74448f | |||
| 217bb6657e | |||
| df2862996b | |||
| df6ab6427e | |||
| 82d848727c | |||
| d0d6323b1f | |||
| 6439921f85 | |||
| d28907ee9d | |||
| 41f0971570 | |||
| ab0bd79bb8 | |||
| 07747aa819 | |||
| 68efcdd0dd | |||
| fef3100fd7 | |||
| 08a940bfd4 | |||
| d6a99c631e | |||
| 3d4077c2d0 | |||
| ce6b595421 | |||
| 7d8c085254 | |||
| ec0af17fb5 | |||
| 2accfbc894 | |||
| 01d2fa1228 | |||
| f16843d60f | |||
| acc77ebddd | |||
| 7eb145fb7f | |||
| 34a6eb13c6 | |||
| 0f5e746fe2 | |||
| b62ad16aa6 | |||
| f79498e4b5 | |||
| 31c433b353 | |||
| 852c6abf2e | |||
| df3fa6f8a8 | |||
| 738daa1c77 | |||
| 4204cfc500 | |||
| 9cb08d115a | |||
| 459f159b1b | |||
| 2880536513 | |||
| 64cb1bfdfd | |||
| b80c30ace3 | |||
| 19b8849bfc | |||
| 8f457f047c | |||
| 299bc7468f | |||
| c213b0769b | |||
| 260c883d07 | |||
| da0db042fa | |||
| ae5732e2a8 | |||
| 1f05a33807 | |||
| f090951abc | |||
| 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 | |||
| 757e6271ff | |||
| c5c846aa22 | |||
| 23a59a15ec | |||
| 4798c619d0 | |||
| 023e767237 | |||
| 688d9b00ab | |||
| c2fe2f70dc | |||
| 3430c10ec2 | |||
| 9afcc00201 | |||
| cd783d1267 | |||
| 81480532e2 | |||
| 982e8a0117 | |||
| 8af88a3376 | |||
| 9ed2f13c78 | |||
| d7ea774d71 | |||
| a4b9784c48 | |||
| 3fe2d8091a | |||
| 78c903c403 | |||
| c42711ee26 | |||
| 367264e549 | |||
| 36a0c273f9 | |||
| 418106c485 | |||
| 1058e876a7 | |||
| 8721cc1ab5 | |||
| e12642e0b9 | |||
| 315bbb3020 | |||
| 0576d4ca26 | |||
| c309dbb844 | |||
| c71b04ba93 | |||
| f3417b1b05 | |||
| c597b7ec3a | |||
| 8b4586b914 | |||
| b65a0e2543 | |||
| 6e15a44168 | |||
| 6bd3d2c434 | |||
| 29644ef904 | |||
| 39dfcb6f10 | |||
| 882b17834c | |||
| bdd2908e6a | |||
| d4a402f4dd | |||
| 115b293ff5 | |||
| 6831c095ec | |||
| 81fb146869 | |||
| 35b54fd064 | |||
| 866e65749e | |||
| e157b9a51f | |||
| 74c89cc03f | |||
| 229c6674a4 | |||
| ab8ad7ffc0 | |||
| 6805cb16fb | |||
| e596d76430 | |||
| de4afb6507 | |||
| beb5f479d9 | |||
| e660e61027 | |||
| e3cdecdb14 | |||
| 40320e5efa | |||
| c2fd057126 | |||
| ea1ef0f347 | |||
| 04456d9807 | |||
| 18240524dc | |||
| 42b7d567a1 | |||
| 2790493cba | |||
| 8eabc49e12 | |||
| 3252812699 | |||
| 3fa308386f | |||
| 84ee7cef7c | |||
| 57f6aff2de | |||
| d745d7afef | |||
| 510a1f57f8 | |||
| a1c9b24755 | |||
| 75e6f48dfd | |||
| ed7b12e733 | |||
| 9c56839c97 | |||
| 6647980ce3 | |||
| 80f8b086ca | |||
| 8c2dd1aeac | |||
| ae3c6f1e63 | |||
| 7cc381339c | |||
| aa58a0999d | |||
| 4580f3fd54 | |||
| 6c0c4fa2cf | |||
| 526324be38 | |||
| efb0f335e1 | |||
| 9b23ce94ab | |||
| 47000f2aaf | |||
| cb3ca73f60 | |||
| fd0b35f21a | |||
| 0e7dda4043 | |||
| 5f7b9d2473 | |||
| f8cbe4c008 | |||
| 41df915f29 | |||
| ef440a015d | |||
| 180cbce3a2 | |||
| 64ec76f5a6 | |||
| 9860fb67d4 | |||
| 08cbba1d9d | |||
| 095149a4e9 | |||
| a561a96a5f | |||
| 073d6a9337 | |||
| 6851c9cc1a | |||
| 2862f466f3 | |||
| 5e3fdc6c33 | |||
| 03fe5803de | |||
| 6d36ec55c5 | |||
| f098cdbf69 | |||
| 07d3fe3044 | |||
| 636b6fc43d | |||
| ccfba6786c | |||
| 7c2c631807 | |||
| 6769410753 | |||
| 40b9af6c36 | |||
| e63dfdd8b1 | |||
| a6639d7211 | |||
| 3e251f602a | |||
| ec25ca9fc7 | |||
| 396d20f2da | |||
| 49181fd0bf | |||
| 5eb1dbe7bf | |||
| 690e988cab | |||
| fd41770d6e | |||
| fb26cb1394 | |||
| 4e4efa67e6 | |||
| 0dfb1b6bb1 | |||
| bcbca38b1e | |||
| 3f0ccf802c | |||
| 691cb4ac24 | |||
| 282939f548 | |||
| 6f35b2f382 | |||
| 6700f63091 | |||
| 5c37ebec70 | |||
| 28a419d252 | |||
| 95128ee95f | |||
| c94180b3d2 | |||
| 12ca1a0cf7 | |||
| 67564dfa2c | |||
| a1e79a9522 | |||
| e16f8ef349 | |||
| fd1a2072b3 | |||
| aa45e70910 | |||
| 5374feb24b | |||
| 12ac0ac7a9 | |||
| 3d78666ed3 | |||
| dd2cc116bd | |||
| ba2636dc1a | |||
| 69589f1ad5 | |||
| 39da11de8e | |||
| 8b7a4daeda | |||
| 82af7a5b52 | |||
| a2d99695fd | |||
| 3a2786a89f | |||
| a6cb30d6c8 | |||
| de6b1f9542 | |||
| 77431671bb | |||
| 4430b7145e | |||
| 898859cc7a | |||
| 43b96df112 | |||
| bb97893bd0 | |||
| 9b21ec6e1f | |||
| ffac354368 | |||
| a9aab51764 | |||
| 4d1fc9ceb1 | |||
| e897a98153 | |||
| 0a8056d835 | |||
| 9681e176b3 | |||
| 1f8be43881 | |||
| 30813551be | |||
| beb564f374 | |||
| 5c97c012a9 | |||
| 50da7cabd6 | |||
| a6528cdfd6 | |||
| 588201fe46 | |||
| 6184b5ee96 | |||
| 5e7baa9d0a | |||
| 79ae650c58 | |||
| 44107f289e | |||
| 75927a87b2 | |||
| 85da30ccf5 | |||
| f73c3b85c2 | |||
| 66bef2fc19 | |||
| 7c5eb021ee | |||
| f902e3b3d8 | |||
| 553124ab5b | |||
| 6c6d93370d | |||
| 55ae3a7dbd | |||
| 586874080f | |||
| d5b91a8983 | |||
| 72fee13112 | |||
| 20ae897f39 | |||
| 6f756d103f | |||
| c9dd858ce3 | |||
| 2e201eaaf7 | |||
| 7c54dcba69 | |||
| a107395707 | |||
| 8a9fe22855 | |||
| 7e04e23528 | |||
| 8d779f68f3 | |||
| 98ba08c1a0 | |||
| a1499b82f8 | |||
| c6c866d78a | |||
| 7a6999bd20 | |||
| 1084cf3523 | |||
| ed5f2a3968 | |||
| 17e1d4b72d | |||
| 912f6c4f3c | |||
| 77d71b5fef | |||
| 6938a73a8a | |||
| cee9df189d | |||
| 2a125e226b | |||
| 4a7e60ef57 | |||
| 0a6140346e | |||
| 01862ebc04 | |||
| 3185299214 | |||
| 5b6ebe4f11 | |||
| 6274ef591b | |||
| 7acdaebee4 | |||
| 6dcfb6b88f | |||
| 064972aecd |
@@ -13,6 +13,7 @@ assignees: ''
|
|||||||
|
|
||||||
* What happened:
|
* What happened:
|
||||||
* What should happen:
|
* What should happen:
|
||||||
|
* Fastfetch version used: <!-- please use the latest version, if possible -->
|
||||||
* Did it work in an older version: <!-- if yes, which version -->
|
* Did it work in an older version: <!-- if yes, which version -->
|
||||||
* Where did you get the binary: <!-- Github Release / Github Actions / Installed with a package manager (What package manager) / Built from source yourself -->
|
* Where did you get the binary: <!-- Github Release / Github Actions / Installed with a package manager (What package manager) / Built from source yourself -->
|
||||||
* Does this issue still occurs in [the latest dev build](https://github.com/fastfetch-cli/fastfetch/actions/)?
|
* Does this issue still occurs in [the latest dev build](https://github.com/fastfetch-cli/fastfetch/actions/)?
|
||||||
@@ -41,22 +42,27 @@ Output of `fastfetch --list-features`:
|
|||||||
//paste here
|
//paste here
|
||||||
```
|
```
|
||||||
|
|
||||||
## If fastfatch crashed
|
## If fastfatch crashed or freezed
|
||||||
|
|
||||||
Paste the stacktrace here. You may get it with:
|
Paste the stacktrace here. You may get it with:
|
||||||
|
|
||||||
```
|
```shell
|
||||||
$ gdb -q -ex 'set confirm off' -ex run -ex 'bt full' -ex quit --args /path/to/fastfetch
|
# You may need Ctrl+C to stop the process if it freezes
|
||||||
|
gdb -q -ex 'set confirm off' -ex run -ex 'bt full' -ex quit --args /path/to/fastfetch
|
||||||
```
|
```
|
||||||
|
|
||||||
If you are able to identify which module crashed, the strace can be helpful too
|
If you are able to identify which module crashed, the strace can be helpful too
|
||||||
|
|
||||||
```
|
```shell
|
||||||
$ strace /path/to/fastfetch --multithreading false --structure {MODULE} --pipe
|
strace /path/to/fastfetch --multithreading false -s {MODULE} --pipe
|
||||||
```
|
```
|
||||||
|
|
||||||
If you cannot do the instructions above, please upload the core dump file:
|
If you cannot do the instructions above, please upload the core dump file:
|
||||||
|
|
||||||
|
## If fastfetch is slow
|
||||||
|
|
||||||
|
Use `time fastfetch --stat` to show time usage for each module.
|
||||||
|
|
||||||
## If my image logo didn't show / work
|
## If my image logo didn't show / work
|
||||||
|
|
||||||
<!-- Please make sure the terminal does support the image protocol you used. Note Gnome terminal doesn't support any image protocols -->
|
<!-- Please make sure the terminal does support the image protocol you used. Note Gnome terminal doesn't support any image protocols -->
|
||||||
|
|||||||
@@ -7,10 +7,28 @@ assignees: ''
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- Before requesting a new feature, please try `fastfetch -c all.jsonc` to see if it has been supported -->
|
## Before requesting a new feature
|
||||||
|
|
||||||
# Current state:
|
* A lot of features are not enabled by default. Please try `fastfetch --list-modules` and `fastfetch -c all.jsonc` to see if it has been supported
|
||||||
|
* Fastfetch supports `Command` module, which can be used to grab output from a custom shell script. Please check if it fits your needs
|
||||||
|
|
||||||
# Wanted state:
|
```jsonc
|
||||||
|
// ~/.config/fastfetch/fastfetch.jsonc
|
||||||
|
{
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"type": "command",
|
||||||
|
"text": "/path/to/your/script",
|
||||||
|
"key": "Feature Title"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
# Why the change is sensible:
|
## Wanted features:
|
||||||
|
|
||||||
|
<!-- Your features here -->
|
||||||
|
|
||||||
|
## Motivation:
|
||||||
|
|
||||||
|
<!-- Your motivation here -->
|
||||||
|
|||||||
@@ -7,9 +7,11 @@ assignees: ''
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
Tip: A logo can be displayed by fastfetch without getting into fastfetch's official repo. For highly customized logo for personal use, it's recommended to keep it locally. Please refer to https://github.com/fastfetch-cli/fastfetch/wiki/Migrate-Neofetch-Logo-To-Fastfetch
|
||||||
|
|
||||||
# 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
|
||||||
|
|||||||
+134
-92
@@ -14,66 +14,16 @@ jobs:
|
|||||||
|
|
||||||
- name: Install codespell
|
- name: Install codespell
|
||||||
shell: bash
|
shell: bash
|
||||||
run: sudo apt update && sudo apt install -y codespell
|
run: |
|
||||||
|
sudo apt-get update || true
|
||||||
|
sudo apt-get install -y codespell
|
||||||
|
|
||||||
- name: Run Spellchecker
|
- name: Run Spellchecker
|
||||||
run: codespell
|
run: codespell
|
||||||
|
|
||||||
linux-buildtest:
|
no-features-test:
|
||||||
name: Linux build test
|
name: No-features-test
|
||||||
permissions:
|
runs-on: ubuntu-latest
|
||||||
contents: read
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
compiler: [
|
|
||||||
{ cc: gcc, cxx: "g++" },
|
|
||||||
{ cc: clang, cxx: "clang++" },
|
|
||||||
{ cc: "musl-gcc", cxx: "musl-g++" }
|
|
||||||
]
|
|
||||||
enableFeatures: [ON, OFF]
|
|
||||||
exclude:
|
|
||||||
# The feature libraries are all build against glibc, so they can't be used with musl
|
|
||||||
- compiler: { cc: "musl-gcc", cxx: "musl-g++" }
|
|
||||||
enableFeatures: ON
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
steps:
|
|
||||||
- name: checkout repository
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: uname -a
|
|
||||||
run: uname -a
|
|
||||||
|
|
||||||
- name: install required packages
|
|
||||||
run: sudo apt-get update && sudo apt-get install -y musl-dev musl-tools linux-headers-generic 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 libddcutil-dev libchafa-dev libdrm-dev directx-headers-dev
|
|
||||||
|
|
||||||
- name: configure project
|
|
||||||
env:
|
|
||||||
CC: ${{ matrix.compiler.cc }}
|
|
||||||
CXX: ${{ matrix.compiler.cxx }}
|
|
||||||
run: cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_VULKAN=${{ matrix.enableFeatures }} -DENABLE_WAYLAND=${{ matrix.enableFeatures }} -DENABLE_XCB_RANDR=${{ matrix.enableFeatures }} -DENABLE_XCB=${{ matrix.enableFeatures }} -DENABLE_XRANDR=${{ matrix.enableFeatures }} -DENABLE_X11=${{ matrix.enableFeatures }} -DENABLE_GIO=${{ matrix.enableFeatures }} -DENABLE_DCONF=${{ matrix.enableFeatures }} -DENABLE_DBUS=${{ matrix.enableFeatures }} -DENABLE_XFCONF=${{ matrix.enableFeatures }} -DENABLE_SQLITE3=${{ matrix.enableFeatures }} -DENABLE_RPM=${{ matrix.enableFeatures }} -DENABLE_IMAGEMAGICK7=${{ matrix.enableFeatures }} -DENABLE_IMAGEMAGICK6=${{ matrix.enableFeatures }} -DENABLE_CHAFA=${{ matrix.enableFeatures }} -DENABLE_ZLIB=${{ matrix.enableFeatures }} -DENABLE_EGL=${{ matrix.enableFeatures }} -DENABLE_GLX=${{ matrix.enableFeatures }} -DENABLE_OSMESA=${{ matrix.enableFeatures }} -DENABLE_OPENCL=${{ matrix.enableFeatures }} -DENABLE_LIBNM=${{ matrix.enableFeatures }} -DENABLE_PULSE=${{ matrix.enableFeatures }} -DENABLE_DIRECTX_HEADERS=${{ matrix.enableFeatures }} -DENABLE_DRM=${{ matrix.enableFeatures }} -DENABLE_DDCUTIL=${{ matrix.enableFeatures }} -DENABLE_CHAFA=${{ matrix.enableFeatures }} .
|
|
||||||
|
|
||||||
- name: build project
|
|
||||||
run: cmake --build . --verbose -j4
|
|
||||||
|
|
||||||
- name: run tests
|
|
||||||
run: ctest
|
|
||||||
|
|
||||||
- name: run fastfetch --list-features
|
|
||||||
run: ./fastfetch --list-features
|
|
||||||
|
|
||||||
- name: run fastfetch
|
|
||||||
run: time ./fastfetch -c presets/ci.jsonc
|
|
||||||
|
|
||||||
- name: run fastfetch --format json
|
|
||||||
run: time ./fastfetch -c presets/ci.jsonc --format json
|
|
||||||
|
|
||||||
- name: run flashfetch
|
|
||||||
run: time ./flashfetch
|
|
||||||
|
|
||||||
Linux-old-amd64:
|
|
||||||
name: Linux-old-amd64
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
permissions:
|
permissions:
|
||||||
security-events: write
|
security-events: write
|
||||||
contents: read
|
contents: read
|
||||||
@@ -84,28 +34,12 @@ jobs:
|
|||||||
- name: uname -a
|
- name: uname -a
|
||||||
run: uname -a
|
run: uname -a
|
||||||
|
|
||||||
- name: install required packages
|
|
||||||
run: sudo apt-get update && sudo apt-get install -y 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
|
|
||||||
|
|
||||||
- name: install linuxbrew packages
|
|
||||||
run: |
|
|
||||||
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
||||||
/home/linuxbrew/.linuxbrew/bin/brew install imagemagick chafa ddcutil --ignore-dependencies
|
|
||||||
|
|
||||||
- name: Initialize CodeQL
|
|
||||||
uses: github/codeql-action/init@v3
|
|
||||||
with:
|
|
||||||
languages: c
|
|
||||||
|
|
||||||
- name: configure project
|
- name: configure project
|
||||||
run: PKG_CONFIG_PATH=/home/linuxbrew/.linuxbrew/lib/pkgconfig:$PKG_CONFIG_PATH cmake -DSET_TWEAK=Off -DBUILD_TESTS=On -DCMAKE_INSTALL_PREFIX=/usr .
|
run: cmake -DSET_TWEAK=Off -DBUILD_TESTS=On -DCMAKE_INSTALL_PREFIX=/usr . -DENABLE_VULKAN=OFF -DENABLE_WAYLAND=OFF -DENABLE_XCB_RANDR=OFF -DENABLE_XCB=OFF -DENABLE_XRANDR=OFF -DENABLE_X11=OFF -DENABLE_DRM=OFF -DENABLE_GIO=OFF -DENABLE_DCONF=OFF -DENABLE_DBUS=OFF -DENABLE_XFCONF=OFF -DENABLE_SQLITE3=OFF -DENABLE_RPM=OFF -DENABLE_IMAGEMAGICK7=OFF -DENABLE_IMAGEMAGICK6=OFF -DENABLE_CHAFA=OFF -DENABLE_ZLIB=OFF -DENABLE_EGL=OFF -DENABLE_GLX=OFF -DENABLE_OSMESA=OFF -DENABLE_OPENCL=OFF -DENABLE_LIBNM=OFF -DENABLE_FREETYPE=OFF -DENABLE_PULSE=OFF -DENABLE_DDCUTIL=OFF -DENABLE_DIRECTX_HEADERS=OFF -DENABLE_THREADS=OFF
|
||||||
|
|
||||||
- name: build project
|
- name: build project
|
||||||
run: cmake --build . --target package --verbose -j4
|
run: cmake --build . --target package --verbose -j4
|
||||||
|
|
||||||
- name: perform CodeQL analysis
|
|
||||||
uses: github/codeql-action/analyze@v3
|
|
||||||
|
|
||||||
- name: list features
|
- name: list features
|
||||||
run: ./fastfetch --list-features
|
run: ./fastfetch --list-features
|
||||||
|
|
||||||
@@ -124,15 +58,9 @@ jobs:
|
|||||||
- name: run tests
|
- name: run tests
|
||||||
run: ctest
|
run: ctest
|
||||||
|
|
||||||
- name: upload artifacts
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: fastfetch-linux-old-amd64
|
|
||||||
path: ./fastfetch-*.*
|
|
||||||
|
|
||||||
linux-amd64:
|
linux-amd64:
|
||||||
name: Linux-amd64
|
name: Linux-amd64
|
||||||
runs-on: ubuntu-22.04 # Ubuntu 22.04 uses Glibc 2.35. Should be fine with Debian 12, which uses Glibc 2.36 (https://packages.debian.org/source/bookworm/glibc)
|
runs-on: ubuntu-20.04
|
||||||
permissions:
|
permissions:
|
||||||
security-events: write
|
security-events: write
|
||||||
contents: read
|
contents: read
|
||||||
@@ -146,12 +74,12 @@ jobs:
|
|||||||
run: uname -a
|
run: uname -a
|
||||||
|
|
||||||
- name: install required packages
|
- name: install required packages
|
||||||
run: sudo apt-get update && sudo apt-get install -y 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
|
run: sudo apt-get update && sudo apt-get install -y 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
|
||||||
|
|
||||||
- name: install linuxbrew packages
|
- name: install linuxbrew packages
|
||||||
run: |
|
run: |
|
||||||
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||||
/home/linuxbrew/.linuxbrew/bin/brew install imagemagick --ignore-dependencies
|
/home/linuxbrew/.linuxbrew/bin/brew install imagemagick chafa ddcutil --ignore-dependencies
|
||||||
|
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v3
|
uses: github/codeql-action/init@v3
|
||||||
@@ -230,9 +158,126 @@ jobs:
|
|||||||
name: fastfetch-linux-aarch64
|
name: fastfetch-linux-aarch64
|
||||||
path: ./fastfetch-*.*
|
path: ./fastfetch-*.*
|
||||||
|
|
||||||
|
linux-armv7:
|
||||||
|
name: Linux-armv7
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
permissions:
|
||||||
|
security-events: write
|
||||||
|
contents: read
|
||||||
|
steps:
|
||||||
|
- name: checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: run VM
|
||||||
|
uses: uraimo/run-on-arch-action@v2
|
||||||
|
id: runcmd
|
||||||
|
with:
|
||||||
|
arch: armv7
|
||||||
|
distro: ubuntu20.04
|
||||||
|
githubToken: ${{ github.token }}
|
||||||
|
run: |
|
||||||
|
uname -a
|
||||||
|
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 --build . --target package --verbose -j4
|
||||||
|
./fastfetch --list-features
|
||||||
|
time ./fastfetch -c presets/ci.jsonc
|
||||||
|
time ./fastfetch -c presets/ci.jsonc --format json
|
||||||
|
time ./flashfetch
|
||||||
|
ldd fastfetch
|
||||||
|
ctest
|
||||||
|
|
||||||
|
- name: upload artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: fastfetch-linux-armv7
|
||||||
|
path: ./fastfetch-*.*
|
||||||
|
|
||||||
|
musl-amd64:
|
||||||
|
name: Musl-amd64
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: setup alpine linux
|
||||||
|
uses: jirutka/setup-alpine@master
|
||||||
|
|
||||||
|
- name: install dependencies
|
||||||
|
run: |
|
||||||
|
cat /etc/alpine-release
|
||||||
|
uname -a
|
||||||
|
apk add cmake samurai vulkan-loader-dev libxcb-dev wayland-dev libdrm-dev dconf-dev imagemagick-dev chafa-dev zlib-dev dbus-dev mesa-dev opencl-dev xfconf-dev sqlite-dev networkmanager-dev pulseaudio-dev ddcutil-dev gcc g++
|
||||||
|
shell: alpine.sh --root {0}
|
||||||
|
|
||||||
|
- name: build
|
||||||
|
run: |
|
||||||
|
cmake -DSET_TWEAK=Off -DBUILD_TESTS=On -DCMAKE_INSTALL_PREFIX=/usr -DIS_MUSL=ON -GNinja .
|
||||||
|
cmake --build . --target package --verbose -j4
|
||||||
|
shell: alpine.sh {0}
|
||||||
|
|
||||||
|
- name: run
|
||||||
|
run: |
|
||||||
|
./fastfetch --list-features
|
||||||
|
time ./fastfetch -c presets/ci.jsonc
|
||||||
|
time ./fastfetch -c presets/ci.jsonc --format json
|
||||||
|
time ./flashfetch
|
||||||
|
ldd fastfetch
|
||||||
|
ctest
|
||||||
|
shell: alpine.sh {0}
|
||||||
|
|
||||||
|
- name: upload artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: fastfetch-musl-amd64
|
||||||
|
path: ./fastfetch-*.*
|
||||||
|
|
||||||
|
musl-aarch64:
|
||||||
|
name: Musl-aarch64
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: setup alpine linux
|
||||||
|
uses: jirutka/setup-alpine@master
|
||||||
|
with:
|
||||||
|
arch: aarch64
|
||||||
|
|
||||||
|
- name: install dependencies
|
||||||
|
run: |
|
||||||
|
cat /etc/alpine-release
|
||||||
|
uname -a
|
||||||
|
apk add cmake samurai vulkan-loader-dev libxcb-dev wayland-dev libdrm-dev dconf-dev imagemagick-dev chafa-dev zlib-dev dbus-dev mesa-dev opencl-dev xfconf-dev sqlite-dev networkmanager-dev pulseaudio-dev ddcutil-dev gcc g++
|
||||||
|
shell: alpine.sh --root {0}
|
||||||
|
|
||||||
|
- name: build
|
||||||
|
run: |
|
||||||
|
cmake -DSET_TWEAK=Off -DBUILD_TESTS=On -DCMAKE_INSTALL_PREFIX=/usr -DIS_MUSL=ON -GNinja .
|
||||||
|
cmake --build . --target package --verbose -j4
|
||||||
|
shell: alpine.sh {0}
|
||||||
|
|
||||||
|
- name: run
|
||||||
|
run: |
|
||||||
|
./fastfetch --list-features
|
||||||
|
time ./fastfetch -c presets/ci.jsonc
|
||||||
|
time ./fastfetch -c presets/ci.jsonc --format json
|
||||||
|
time ./flashfetch
|
||||||
|
ldd fastfetch
|
||||||
|
ctest
|
||||||
|
shell: alpine.sh {0}
|
||||||
|
|
||||||
|
- name: upload artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: fastfetch-musl-aarch64
|
||||||
|
path: ./fastfetch-*.*
|
||||||
|
|
||||||
macos-universal:
|
macos-universal:
|
||||||
name: macOS-universal
|
name: macOS-universal
|
||||||
runs-on: macos-latest
|
runs-on: macos-12
|
||||||
permissions:
|
permissions:
|
||||||
security-events: write
|
security-events: write
|
||||||
contents: read
|
contents: read
|
||||||
@@ -245,8 +290,7 @@ jobs:
|
|||||||
|
|
||||||
- name: install required packages
|
- name: install required packages
|
||||||
run: |
|
run: |
|
||||||
brew update
|
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 brew install --overwrite vulkan-loader vulkan-headers molten-vk imagemagick chafa
|
||||||
HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 brew install vulkan-loader vulkan-headers molten-vk imagemagick chafa
|
|
||||||
|
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v3
|
uses: github/codeql-action/init@v3
|
||||||
@@ -378,7 +422,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
msystem: CLANG64
|
msystem: CLANG64
|
||||||
update: true
|
update: true
|
||||||
install: git mingw-w64-clang-x86_64-7zip mingw-w64-clang-x86_64-cmake mingw-w64-clang-x86_64-clang mingw-w64-clang-x86_64-vulkan-loader mingw-w64-clang-x86_64-opencl-icd
|
install: git mingw-w64-clang-x86_64-7zip mingw-w64-clang-x86_64-cmake mingw-w64-clang-x86_64-clang mingw-w64-clang-x86_64-vulkan-loader mingw-w64-clang-x86_64-vulkan-headers mingw-w64-clang-x86_64-opencl-icd
|
||||||
|
|
||||||
- name: print msys version
|
- name: print msys version
|
||||||
run: uname -a
|
run: uname -a
|
||||||
@@ -440,7 +484,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
msystem: CLANG32
|
msystem: CLANG32
|
||||||
update: true
|
update: true
|
||||||
install: git mingw-w64-clang-i686-7zip mingw-w64-clang-i686-cmake mingw-w64-clang-i686-clang mingw-w64-clang-i686-vulkan-loader mingw-w64-clang-i686-opencl-icd
|
install: git mingw-w64-clang-i686-7zip mingw-w64-clang-i686-cmake mingw-w64-clang-i686-clang mingw-w64-clang-i686-vulkan-loader mingw-w64-clang-i686-vulkan-headers mingw-w64-clang-i686-opencl-icd
|
||||||
|
|
||||||
- name: print msys version
|
- name: print msys version
|
||||||
run: uname -a
|
run: uname -a
|
||||||
@@ -496,6 +540,9 @@ jobs:
|
|||||||
needs:
|
needs:
|
||||||
- linux-amd64
|
- linux-amd64
|
||||||
- linux-aarch64
|
- linux-aarch64
|
||||||
|
- linux-armv7
|
||||||
|
- musl-amd64
|
||||||
|
- musl-aarch64
|
||||||
- macos-universal
|
- macos-universal
|
||||||
- freebsd-amd64
|
- freebsd-amd64
|
||||||
- freebsd-aarch64
|
- freebsd-aarch64
|
||||||
@@ -514,11 +561,6 @@ jobs:
|
|||||||
if: needs.linux-amd64.outputs.ffversion != steps.get_version_release.outputs.release
|
if: needs.linux-amd64.outputs.ffversion != steps.get_version_release.outputs.release
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v4
|
||||||
|
|
||||||
- name: rm old artifacts
|
|
||||||
if: needs.linux-amd64.outputs.ffversion != steps.get_version_release.outputs.release
|
|
||||||
run: |
|
|
||||||
rm -rf fastfetch-*-old-*
|
|
||||||
|
|
||||||
- name: create release
|
- name: create release
|
||||||
if: needs.linux-amd64.outputs.ffversion != steps.get_version_release.outputs.release
|
if: needs.linux-amd64.outputs.ffversion != steps.get_version_release.outputs.release
|
||||||
uses: ncipollo/release-action@v1
|
uses: ncipollo/release-action@v1
|
||||||
|
|||||||
+6
-6
@@ -1,9 +1,9 @@
|
|||||||
**/build/
|
build/
|
||||||
**/.vscode/
|
.vs/
|
||||||
**/.cache/
|
.vscode/
|
||||||
**/.kdev4/
|
.cache/
|
||||||
**/.DS_Store
|
.kdev4/
|
||||||
/.vs
|
.DS_Store
|
||||||
cscope.*
|
cscope.*
|
||||||
tags
|
tags
|
||||||
fastfetch.kdev4
|
fastfetch.kdev4
|
||||||
|
|||||||
+264
@@ -1,3 +1,267 @@
|
|||||||
|
# 2.12.0
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
* The long deprecated flag based config files are removed.
|
||||||
|
* They can still be used with `xargs fastfetch < /path/to/config.conf`
|
||||||
|
* `--gen-config` can be used to migrate them to json based config files
|
||||||
|
* The long deprecated options `--set` and `--set-keyless` are removed.
|
||||||
|
* `Kernel` module now prints kernel name by default
|
||||||
|
|
||||||
|
Features:
|
||||||
|
* Support `st` terminal font detection for font configuration compiled in `st` binary (TerminalFont, Linux)
|
||||||
|
* Add option `--color-output` to change output color of all modules except `Title`, `Separator`
|
||||||
|
* `display.color.output` in JSONC config file
|
||||||
|
* Add option `--<module>-output-color` to change output color of one specified module, which overrides the global option `--color-output`
|
||||||
|
* Add option `--publicip-ipv6` to print IPv6 address (PublicIP)
|
||||||
|
* Add new module `Loadavg` to print load averages (Loadavg)
|
||||||
|
* Add new module `PhysicalMemory` to print information of physical memory devices (PhysicalMemory)
|
||||||
|
* Requires root permission to work on Linux and FreeBSD
|
||||||
|
* Support specifying `--logo-width` only for `--kitty-direct` and `--iterm` (Logo)
|
||||||
|
* Add option `--localip-show-all-ips` to show all IPs assigned to the same interface (LocalIP)
|
||||||
|
* Default to `false`
|
||||||
|
* Improve compatibility with `(*term)` (#909, Terminal, macOS)
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
* Rename option `--temperature-unit` to `--temp-unit` as documented in help messages
|
||||||
|
* Fix alternate logo doesn't work with `{ "type": "builtin" }` (#914, Logo)
|
||||||
|
|
||||||
|
Logos:
|
||||||
|
* Fix DahliaOS detection
|
||||||
|
* Add openSUSE Slowroll
|
||||||
|
* Add macOS3
|
||||||
|
* Add Quirinux
|
||||||
|
|
||||||
|
# 2.11.5
|
||||||
|
|
||||||
|
Bugfix:
|
||||||
|
* Fix logo printing for OpenMandriva (#896)
|
||||||
|
* Remove `--os-file` in help messages
|
||||||
|
|
||||||
|
# 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.
|
||||||
|
* Use `--pipe -l none` to get the old beheavior
|
||||||
|
* `--os-file` was removed and CMake option `-DCUSTOM_OS_RELEASE_PATH=/path/to/os-release` was introduced for configuring at compile time by package managers if needed. This option should not used in most cases.
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
* Fix possible out-of-bound memory access (#868)
|
||||||
|
* Fix Apple Terminal detection (#878, macOS, Terminal)
|
||||||
|
* Fix deprecation warning for macOS 14.0 hopefully (#860, macOS, Camera)
|
||||||
|
* Fix memory leaks when passing informative options (#888)
|
||||||
|
* 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
|
||||||
|
|
||||||
|
Hotfix for Android
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
* Fix uninitialized variables which can cause crashes (#760 #838, Battery, Android)
|
||||||
|
* Don't detect hyfetch as shell when used as backend of [hyfetch](https://github.com/hykilpikonna/hyfetch)
|
||||||
|
* Fix incorrect information in man page (#828)
|
||||||
|
|
||||||
|
Features:
|
||||||
|
* Support sorcery package manager detection (Packages, Linux)
|
||||||
|
* Make `--custom-format` optional (Custom)
|
||||||
|
* Make `/` an alias of `C:\` for `--disk-folders` (Disk, Windows)
|
||||||
|
* Build for Linux armv7
|
||||||
|
|
||||||
|
Logo:
|
||||||
|
* Fix colors of Source Mage logo
|
||||||
|
|
||||||
|
# 2.11.0
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
* Default `hideCursor` to false. It doesn't make much difference but makes user's terminal unusable if fastfetch is not exited correctly.
|
||||||
|
* Linux amd64 binaries are built with Ubuntu 20.04 again (#808)
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
* Fix swap usage detection in x86-32 build (Windows, Swap)
|
||||||
|
* Fix minimum cmake version support (#810)
|
||||||
|
* Fix wifi detection on platforms that don't use NetworkManager (#811, Wifi, Linux)
|
||||||
|
* Fix NixOS wrapped process name (#814, Terminal, Linux)
|
||||||
|
* Fix GPU type detection for AMD cards (#816, GPU, Linux)
|
||||||
|
* Silence system deprecation warnings (#822, Camera, macOS)
|
||||||
|
|
||||||
|
Features:
|
||||||
|
* Add basic support DE detection support for UKUI (DE, Linux)
|
||||||
|
* Support printing total number of nix / flatpak / brew packages (Packages)
|
||||||
|
* See `fastfetch -h packages-format` for detail
|
||||||
|
* Better max CPU frequency detection support with `CPUID / 16H` instruction (CPU, Windows)
|
||||||
|
* This requires Intel Core I Gen 6 or newer, and with `Virtual Machine Platform` Windows feature disabled. X86 only.
|
||||||
|
* Improve performance of nix packages detection (Packages, Linux)
|
||||||
|
* Make config specified in JSONC overridable by command line flags
|
||||||
|
* Note this change only make global config overridable; module configs are still not
|
||||||
|
* Suggest increasing `--processing-timeout` when child process timeouts
|
||||||
|
* Only detect folders that specified by `--disk-folders`
|
||||||
|
* Previously `--disk-folders` only omits unmatched disks from output
|
||||||
|
* This option can be used to improve detection performance by ignoring slow network drives
|
||||||
|
|
||||||
|
# 2.10.2
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
* Fix a regression that detect x11 as wayland (#805, WM, Linux)
|
||||||
|
|
||||||
|
# 2.10.1
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
* Fix build with `-DENABLE_DBUS=OFF` (Linux)
|
||||||
|
|
||||||
|
# 2.10.0
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
* We now always detect max frequency of GPUs for consistent, instead of current frequency
|
||||||
|
|
||||||
|
Features:
|
||||||
|
* Improve display detection for wlroots based WMs. Fastfetch now correctly reports fractional scale factors in hyprland (Display, Linux)
|
||||||
|
* Improve GPU detection on Linux (GPU, Linux)
|
||||||
|
* Support GPU memory usage detection for AMD GPUs
|
||||||
|
* Support GPU frequency detection for Intel GPUs
|
||||||
|
* Improve performance of Gnome version detection (DE, Linux)
|
||||||
|
* Improve performance of kitty version detection (Terminal, Linux)
|
||||||
|
* Detect refresh rate when using `--ds-force-drm sysfs-only` (Display, Linux)
|
||||||
|
* Add option `--ts-version` to disable terminal and shell version detection. Mainly for benchmarking purposes
|
||||||
|
* Improve performance of detecting WSL version (Host, Linux)
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
* Correctly detect `/bin/sh` as current shell if it's used as default shell (#798, Shell, Linux)
|
||||||
|
* Work around an issue which CPU module reports incorrect CPU frequency that is too high (#800, CPU, Linux)
|
||||||
|
* Don't print ANSI escape codes in `--pipe` mode
|
||||||
|
|
||||||
|
# 2.9.2
|
||||||
|
|
||||||
|
Changes:
|
||||||
|
* To make use of the newly introduced `yyjson` flag `YYJSON_WRITE_NEWLINE_AT_END`, fastfetch now requires `yyjson` 0.9.0 or later
|
||||||
|
|
||||||
|
Features:
|
||||||
|
* Always add a final new-line when generating JSON output
|
||||||
|
* Detect partition create time, which can be used as OS installation time (Disk)
|
||||||
|
* Print time string when generating JSON result instead of UNIX epoch time number, which is more human-readable
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
* Fix a memory leak
|
||||||
|
* Better portable mode detection of Windows Terminal (TerminalFont, Windows)
|
||||||
|
* Fix parsing of option `--packages-disabled` (Packages)
|
||||||
|
* Don't use command `time` as a shell (Shell)
|
||||||
|
|
||||||
|
Logos:
|
||||||
|
* Add openSUSE MicroOS
|
||||||
|
* Fix color of AOSC OS
|
||||||
|
|
||||||
|
# 2.9.1
|
||||||
|
|
||||||
|
Features:
|
||||||
|
* Support weston-terminal (missed commit in v2.9.0) (TerminalFont, Linux)
|
||||||
|
* Support hyprcursor detection (#776, Cursor, Linux)
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
* Fix `fastfetch --gen-config` raises SIGSEGV when `~/.config/fastfetch` doesn't exist. Regression of `2.9.0` (#778)
|
||||||
|
|
||||||
|
# 2.9.0
|
||||||
|
|
||||||
|
Features:
|
||||||
|
* Support Lxterminal version detection (Terminal, Linux)
|
||||||
|
* Support weston-terminal version detection (Terminal, Linux)
|
||||||
|
* Support `am` package manager detection (#771, Packages, Linux)
|
||||||
|
* Support network prefix length detection for IPv6 (LocalIP)
|
||||||
|
* Display all IPs when multiple IPs are assigned to the same interface (LocalIP)
|
||||||
|
* Add option `--localip-show-prefix-len` to show network prefix length for both IPv4 and IPv6. Defaults to `true` (LocalIP)
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
* Fix network prefix length detection when the value is greater than 24 (#773, LocalIP, Linux)
|
||||||
|
* For xfce4-terminal, use system mono font if no config file is found (TerminalFont, Linux)
|
||||||
|
|
||||||
|
# 2.8.10
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
* Don't display 0.00 GHz (CPU, FreeBSD)
|
||||||
|
* Don't detect manufactor of Qualcomm as ARM (CPU, Android)
|
||||||
|
* Ignore `chezmoi` (Terminal, Linux)
|
||||||
|
* Trim trailing possible whitespaces (PublicIP)
|
||||||
|
* Fix detection compatibility for KDE 6 (Font, Linux)
|
||||||
|
* Always use Metal API to detect vmem size (GPU, macOS)
|
||||||
|
|
||||||
|
Features:
|
||||||
|
* Improve stability; print more useful error message; avoid misuse (PublicIP / Weather)
|
||||||
|
* Use MS-DOS device name as mountFrom result, instead of useless GUID volume name (Windows, Disk)
|
||||||
|
* Some adjustments to Terminal detection (Terminal, Windows)
|
||||||
|
* Don't pretty print CMD
|
||||||
|
* Print conhost as Windows Console
|
||||||
|
* Don't detect `wininit` as Terminal
|
||||||
|
|
||||||
|
Logo:
|
||||||
|
* Fix color of Arco Linux
|
||||||
|
|
||||||
|
# 2.8.9
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
* Don't detect `SessionLeader` as terminal, actually (Terminal, Linux)
|
||||||
|
* Fix blurry chafa result when specifying both width and height (#757, Logo)
|
||||||
|
|
||||||
|
Features:
|
||||||
|
* Support new MacBook Air (Host, macOS)
|
||||||
|
* Distinguish min frequency and base frequency (CPU)
|
||||||
|
|
||||||
|
Logo:
|
||||||
|
* Fix proxmox
|
||||||
|
|
||||||
|
# 2.8.8
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
* Fix old fish version compatibility (#744)
|
||||||
|
* Fix truncated texts in `--help format` (#745)
|
||||||
|
* Fix old vulkan-header and libdrm library compatibility (#748, Linux)
|
||||||
|
* Fix possible segfaults in `--help *-format` (#749)
|
||||||
|
* Fix invalid resolution detection when using libdrm (Linux, Display)
|
||||||
|
* Fix segfault when `/sys/devices/system/cpu/cpufreq/` doesn't exist (#750, CPU, Linux)
|
||||||
|
* Don't detect `SessionLeader` as terminal (Terminal, Linux)
|
||||||
|
* Fix detection of client IP (Users, Linux)
|
||||||
|
|
||||||
# 2.8.7
|
# 2.8.7
|
||||||
|
|
||||||
Bugfixes:
|
Bugfixes:
|
||||||
|
|||||||
+69
-16
@@ -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.8.7
|
VERSION 2.12.0
|
||||||
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"
|
||||||
@@ -75,9 +75,12 @@ option(ENABLE_ASAN "Build fastfetch with ASAN (address sanitizer)" OFF)
|
|||||||
option(ENABLE_PROPRIETARY_GPU_DRIVER_API "Enable proprietary GPU driver API (NVML, IGCL and AGS)" ON)
|
option(ENABLE_PROPRIETARY_GPU_DRIVER_API "Enable proprietary GPU driver API (NVML, IGCL and AGS)" ON)
|
||||||
option(BUILD_TESTS "Build tests" OFF) # Also create test executables
|
option(BUILD_TESTS "Build tests" OFF) # Also create test executables
|
||||||
option(SET_TWEAK "Add tweak to project version" ON) # This is set to off by github actions for release builds
|
option(SET_TWEAK "Add tweak to project version" ON) # This is set to off by github actions for release builds
|
||||||
|
option(IS_MUSL "Build with musl libc" OFF) # Used by Github Actions
|
||||||
|
|
||||||
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()
|
||||||
|
|
||||||
####################
|
####################
|
||||||
@@ -254,7 +257,7 @@ file(GLOB LOGO_FILES "src/logo/ascii/*.txt")
|
|||||||
set(LOGO_BUILTIN_H "#pragma once\n#pragma GCC diagnostic ignored \"-Wtrigraphs\"\n\n")
|
set(LOGO_BUILTIN_H "#pragma once\n#pragma GCC diagnostic ignored \"-Wtrigraphs\"\n\n")
|
||||||
foreach(file ${LOGO_FILES})
|
foreach(file ${LOGO_FILES})
|
||||||
fastfetch_load_text("${file}" content)
|
fastfetch_load_text("${file}" content)
|
||||||
get_filename_component(file "${file}" NAME_WLE)
|
get_filename_component(file "${file}" NAME_WE)
|
||||||
string(TOUPPER "${file}" file)
|
string(TOUPPER "${file}" file)
|
||||||
string(REGEX REPLACE "\\$\\{c([0-9]+)\\}" "$\\1" content "${content}")
|
string(REGEX REPLACE "\\$\\{c([0-9]+)\\}" "$\\1" content "${content}")
|
||||||
set(LOGO_BUILTIN_H "${LOGO_BUILTIN_H}#define FASTFETCH_DATATEXT_LOGO_${file} ${content}\n")
|
set(LOGO_BUILTIN_H "${LOGO_BUILTIN_H}#define FASTFETCH_DATATEXT_LOGO_${file} ${content}\n")
|
||||||
@@ -294,6 +297,7 @@ set(LIBFASTFETCH_SRC
|
|||||||
src/detection/opencl/opencl.c
|
src/detection/opencl/opencl.c
|
||||||
src/detection/os/os.c
|
src/detection/os/os.c
|
||||||
src/detection/packages/packages.c
|
src/detection/packages/packages.c
|
||||||
|
src/detection/physicalmemory/physicalmemory.c
|
||||||
src/detection/publicip/publicip.c
|
src/detection/publicip/publicip.c
|
||||||
src/detection/terminaltheme/terminaltheme.c
|
src/detection/terminaltheme/terminaltheme.c
|
||||||
src/detection/terminalfont/terminalfont.c
|
src/detection/terminalfont/terminalfont.c
|
||||||
@@ -331,6 +335,7 @@ set(LIBFASTFETCH_SRC
|
|||||||
src/modules/gamepad/gamepad.c
|
src/modules/gamepad/gamepad.c
|
||||||
src/modules/kernel/kernel.c
|
src/modules/kernel/kernel.c
|
||||||
src/modules/lm/lm.c
|
src/modules/lm/lm.c
|
||||||
|
src/modules/loadavg/loadavg.c
|
||||||
src/modules/locale/locale.c
|
src/modules/locale/locale.c
|
||||||
src/modules/localip/localip.c
|
src/modules/localip/localip.c
|
||||||
src/modules/memory/memory.c
|
src/modules/memory/memory.c
|
||||||
@@ -341,6 +346,7 @@ set(LIBFASTFETCH_SRC
|
|||||||
src/modules/os/os.c
|
src/modules/os/os.c
|
||||||
src/modules/packages/packages.c
|
src/modules/packages/packages.c
|
||||||
src/modules/physicaldisk/physicaldisk.c
|
src/modules/physicaldisk/physicaldisk.c
|
||||||
|
src/modules/physicalmemory/physicalmemory.c
|
||||||
src/modules/processes/processes.c
|
src/modules/processes/processes.c
|
||||||
src/modules/player/player.c
|
src/modules/player/player.c
|
||||||
src/modules/poweradapter/poweradapter.c
|
src/modules/poweradapter/poweradapter.c
|
||||||
@@ -396,10 +402,14 @@ if(LINUX)
|
|||||||
src/detection/bluetooth/bluetooth_linux.c
|
src/detection/bluetooth/bluetooth_linux.c
|
||||||
src/detection/disk/disk_linux.c
|
src/detection/disk/disk_linux.c
|
||||||
src/detection/physicaldisk/physicaldisk_linux.c
|
src/detection/physicaldisk/physicaldisk_linux.c
|
||||||
|
src/detection/physicalmemory/physicalmemory_linux.c
|
||||||
src/detection/diskio/diskio_linux.c
|
src/detection/diskio/diskio_linux.c
|
||||||
src/detection/displayserver/linux/displayserver_linux.c
|
src/detection/displayserver/linux/displayserver_linux.c
|
||||||
src/detection/displayserver/linux/drm.c
|
src/detection/displayserver/linux/drm.c
|
||||||
src/detection/displayserver/linux/wayland.c
|
src/detection/displayserver/linux/wayland/wayland.c
|
||||||
|
src/detection/displayserver/linux/wayland/global-output.c
|
||||||
|
src/detection/displayserver/linux/wayland/zwlr-output.c
|
||||||
|
src/detection/displayserver/linux/wayland/wlr-output-management-unstable-v1-protocol.c
|
||||||
src/detection/displayserver/linux/wmde.c
|
src/detection/displayserver/linux/wmde.c
|
||||||
src/detection/displayserver/linux/xcb.c
|
src/detection/displayserver/linux/xcb.c
|
||||||
src/detection/displayserver/linux/xlib.c
|
src/detection/displayserver/linux/xlib.c
|
||||||
@@ -411,6 +421,7 @@ if(LINUX)
|
|||||||
src/detection/icons/icons_linux.c
|
src/detection/icons/icons_linux.c
|
||||||
src/detection/libc/libc_linux.c
|
src/detection/libc/libc_linux.c
|
||||||
src/detection/lm/lm_linux.c
|
src/detection/lm/lm_linux.c
|
||||||
|
src/detection/loadavg/loadavg_linux.c
|
||||||
src/detection/locale/locale_linux.c
|
src/detection/locale/locale_linux.c
|
||||||
src/detection/localip/localip_linux.c
|
src/detection/localip/localip_linux.c
|
||||||
src/detection/gamepad/gamepad_linux.c
|
src/detection/gamepad/gamepad_linux.c
|
||||||
@@ -458,6 +469,7 @@ elseif(ANDROID)
|
|||||||
src/detection/cpuusage/cpuusage_linux.c
|
src/detection/cpuusage/cpuusage_linux.c
|
||||||
src/detection/disk/disk_linux.c
|
src/detection/disk/disk_linux.c
|
||||||
src/detection/physicaldisk/physicaldisk_linux.c
|
src/detection/physicaldisk/physicaldisk_linux.c
|
||||||
|
src/detection/physicalmemory/physicalmemory_nosupport.c
|
||||||
src/detection/diskio/diskio_linux.c
|
src/detection/diskio/diskio_linux.c
|
||||||
src/detection/displayserver/displayserver_android.c
|
src/detection/displayserver/displayserver_android.c
|
||||||
src/detection/font/font_nosupport.c
|
src/detection/font/font_nosupport.c
|
||||||
@@ -466,6 +478,7 @@ elseif(ANDROID)
|
|||||||
src/detection/icons/icons_nosupport.c
|
src/detection/icons/icons_nosupport.c
|
||||||
src/detection/libc/libc_android.c
|
src/detection/libc/libc_android.c
|
||||||
src/detection/lm/lm_nosupport.c
|
src/detection/lm/lm_nosupport.c
|
||||||
|
src/detection/loadavg/loadavg_linux.c
|
||||||
src/detection/locale/locale_linux.c
|
src/detection/locale/locale_linux.c
|
||||||
src/detection/localip/localip_linux.c
|
src/detection/localip/localip_linux.c
|
||||||
src/detection/gamepad/gamepad_nosupport.c
|
src/detection/gamepad/gamepad_nosupport.c
|
||||||
@@ -514,10 +527,14 @@ elseif(BSD)
|
|||||||
src/detection/cursor/cursor_linux.c
|
src/detection/cursor/cursor_linux.c
|
||||||
src/detection/disk/disk_bsd.c
|
src/detection/disk/disk_bsd.c
|
||||||
src/detection/physicaldisk/physicaldisk_bsd.c
|
src/detection/physicaldisk/physicaldisk_bsd.c
|
||||||
|
src/detection/physicalmemory/physicalmemory_linux.c
|
||||||
src/detection/diskio/diskio_bsd.c
|
src/detection/diskio/diskio_bsd.c
|
||||||
src/detection/displayserver/linux/displayserver_linux.c
|
src/detection/displayserver/linux/displayserver_linux.c
|
||||||
src/detection/displayserver/linux/drm.c
|
src/detection/displayserver/linux/drm.c
|
||||||
src/detection/displayserver/linux/wayland.c
|
src/detection/displayserver/linux/wayland/wayland.c
|
||||||
|
src/detection/displayserver/linux/wayland/global-output.c
|
||||||
|
src/detection/displayserver/linux/wayland/zwlr-output.c
|
||||||
|
src/detection/displayserver/linux/wayland/wlr-output-management-unstable-v1-protocol.c
|
||||||
src/detection/displayserver/linux/wmde.c
|
src/detection/displayserver/linux/wmde.c
|
||||||
src/detection/displayserver/linux/xcb.c
|
src/detection/displayserver/linux/xcb.c
|
||||||
src/detection/displayserver/linux/xlib.c
|
src/detection/displayserver/linux/xlib.c
|
||||||
@@ -529,6 +546,7 @@ elseif(BSD)
|
|||||||
src/detection/lm/lm_linux.c
|
src/detection/lm/lm_linux.c
|
||||||
src/detection/icons/icons_linux.c
|
src/detection/icons/icons_linux.c
|
||||||
src/detection/libc/libc_bsd.c
|
src/detection/libc/libc_bsd.c
|
||||||
|
src/detection/loadavg/loadavg_bsd.c
|
||||||
src/detection/locale/locale_linux.c
|
src/detection/locale/locale_linux.c
|
||||||
src/detection/localip/localip_linux.c
|
src/detection/localip/localip_linux.c
|
||||||
src/detection/gamepad/gamepad_bsd.c
|
src/detection/gamepad/gamepad_bsd.c
|
||||||
@@ -577,14 +595,16 @@ elseif(APPLE)
|
|||||||
src/detection/cursor/cursor_apple.m
|
src/detection/cursor/cursor_apple.m
|
||||||
src/detection/disk/disk_bsd.c
|
src/detection/disk/disk_bsd.c
|
||||||
src/detection/physicaldisk/physicaldisk_apple.c
|
src/detection/physicaldisk/physicaldisk_apple.c
|
||||||
|
src/detection/physicalmemory/physicalmemory_apple.m
|
||||||
src/detection/diskio/diskio_apple.c
|
src/detection/diskio/diskio_apple.c
|
||||||
src/detection/displayserver/displayserver_apple.c
|
src/detection/displayserver/displayserver_apple.c
|
||||||
src/detection/font/font_apple.m
|
src/detection/font/font_apple.m
|
||||||
src/detection/gpu/gpu_apple.c
|
src/detection/gpu/gpu_apple.c
|
||||||
src/detection/gpu/gpu_apple.m
|
src/detection/gpu/gpu_apple.m
|
||||||
src/detection/host/host_apple.c
|
src/detection/host/host_apple.c
|
||||||
src/detection/lm/lm_nosupport.c
|
|
||||||
src/detection/icons/icons_nosupport.c
|
src/detection/icons/icons_nosupport.c
|
||||||
|
src/detection/lm/lm_nosupport.c
|
||||||
|
src/detection/loadavg/loadavg_bsd.c
|
||||||
src/detection/libc/libc_apple.c
|
src/detection/libc/libc_apple.c
|
||||||
src/detection/locale/locale_linux.c
|
src/detection/locale/locale_linux.c
|
||||||
src/detection/localip/localip_linux.c
|
src/detection/localip/localip_linux.c
|
||||||
@@ -642,11 +662,13 @@ elseif(WIN32)
|
|||||||
src/detection/icons/icons_windows.c
|
src/detection/icons/icons_windows.c
|
||||||
src/detection/libc/libc_windows.cpp
|
src/detection/libc/libc_windows.cpp
|
||||||
src/detection/lm/lm_nosupport.c
|
src/detection/lm/lm_nosupport.c
|
||||||
|
src/detection/loadavg/loadavg_nosupport.c
|
||||||
src/detection/locale/locale_windows.c
|
src/detection/locale/locale_windows.c
|
||||||
src/detection/localip/localip_windows.c
|
src/detection/localip/localip_windows.c
|
||||||
src/detection/gamepad/gamepad_windows.c
|
src/detection/gamepad/gamepad_windows.c
|
||||||
src/detection/media/media_nosupport.c
|
src/detection/media/media_nosupport.c
|
||||||
src/detection/memory/memory_windows.c
|
src/detection/memory/memory_windows.c
|
||||||
|
src/detection/physicalmemory/physicalmemory_linux.c
|
||||||
src/detection/monitor/monitor_windows.c
|
src/detection/monitor/monitor_windows.c
|
||||||
src/detection/netio/netio_windows.c
|
src/detection/netio/netio_windows.c
|
||||||
src/detection/opengl/opengl_windows.c
|
src/detection/opengl/opengl_windows.c
|
||||||
@@ -699,6 +721,9 @@ check_function_exists(wcwidth HAVE_WCWIDTH)
|
|||||||
if(NOT HAVE_WCWIDTH)
|
if(NOT HAVE_WCWIDTH)
|
||||||
list(APPEND LIBFASTFETCH_SRC src/3rdparty/mk_wcwidch/wcwidth.c)
|
list(APPEND LIBFASTFETCH_SRC src/3rdparty/mk_wcwidch/wcwidth.c)
|
||||||
endif()
|
endif()
|
||||||
|
if(LINUX)
|
||||||
|
check_function_exists(statx HAVE_STATX)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(ENABLE_SYSTEM_YYJSON)
|
if(ENABLE_SYSTEM_YYJSON)
|
||||||
find_package(yyjson)
|
find_package(yyjson)
|
||||||
@@ -755,13 +780,17 @@ if(BSD AND EXISTS "/usr/local/bin/objdump")
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_compile_definitions(libfastfetch PUBLIC _GNU_SOURCE _XOPEN_SOURCE __STDC_WANT_LIB_EXT1__=1)
|
target_compile_definitions(libfastfetch PUBLIC _GNU_SOURCE _XOPEN_SOURCE __STDC_WANT_LIB_EXT1__=1 _FILE_OFFSET_BITS=64)
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
target_compile_definitions(libfastfetch PUBLIC WIN32_LEAN_AND_MEAN=1)
|
target_compile_definitions(libfastfetch PUBLIC WIN32_LEAN_AND_MEAN=1)
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
target_compile_definitions(libfastfetch PUBLIC _DARWIN_C_SOURCE)
|
target_compile_definitions(libfastfetch PUBLIC _DARWIN_C_SOURCE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(HAVE_STATX)
|
||||||
|
target_compile_definitions(libfastfetch PRIVATE FF_HAVE_STATX)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(HAVE_WCWIDTH)
|
if(HAVE_WCWIDTH)
|
||||||
target_compile_definitions(libfastfetch PRIVATE FF_HAVE_WCWIDTH)
|
target_compile_definitions(libfastfetch PRIVATE FF_HAVE_WCWIDTH)
|
||||||
endif()
|
endif()
|
||||||
@@ -770,6 +799,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})
|
||||||
@@ -919,10 +956,6 @@ if(ENABLE_THREADS)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(ENABLE_PCI_MEMORY)
|
|
||||||
target_compile_definitions(libfastfetch PRIVATE FF_USE_PCI_MEMORY)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(LINUX)
|
if(LINUX)
|
||||||
target_link_libraries(libfastfetch
|
target_link_libraries(libfastfetch
|
||||||
PRIVATE "m"
|
PRIVATE "m"
|
||||||
@@ -1124,17 +1157,37 @@ else() # We don't use this in Windows
|
|||||||
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
|
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
|
||||||
set(CMAKE_SYSTEM_PROCESSOR "amd64")
|
set(CMAKE_SYSTEM_PROCESSOR "amd64")
|
||||||
endif()
|
endif()
|
||||||
string(TOLOWER "${CMAKE_PROJECT_NAME}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}" CPACK_PACKAGE_FILE_NAME)
|
if(IS_MUSL)
|
||||||
|
string(TOLOWER "${CMAKE_PROJECT_NAME}-musl-${CMAKE_SYSTEM_PROCESSOR}" CPACK_PACKAGE_FILE_NAME)
|
||||||
|
else()
|
||||||
|
string(TOLOWER "${CMAKE_PROJECT_NAME}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}" CPACK_PACKAGE_FILE_NAME)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(LINUX)
|
if(LINUX)
|
||||||
set(CPACK_GENERATOR "${CPACK_GENERATOR};DEB;RPM")
|
find_program(HAVE_DPKG "dpkg")
|
||||||
|
if(HAVE_DPKG)
|
||||||
|
set(CPACK_GENERATOR "${CPACK_GENERATOR};DEB")
|
||||||
|
|
||||||
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")
|
|
||||||
|
|
||||||
set(CPACK_RPM_PACKAGE_LICENSE "MIT")
|
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()
|
||||||
|
|
||||||
|
find_program(HAVE_RPMBUILD "rpmbuild")
|
||||||
|
if(HAVE_RPMBUILD)
|
||||||
|
set(CPACK_GENERATOR "${CPACK_GENERATOR};RPM")
|
||||||
|
|
||||||
|
set(CPACK_RPM_PACKAGE_LICENSE "MIT")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(CPACK_SET_DESTDIR ON)
|
set(CPACK_SET_DESTDIR ON)
|
||||||
|
|||||||
@@ -0,0 +1,133 @@
|
|||||||
|
|
||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
We as members, contributors, and leaders pledge to make participation in our
|
||||||
|
community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||||
|
identity and expression, level of experience, education, socio-economic status,
|
||||||
|
nationality, personal appearance, race, caste, color, religion, or sexual
|
||||||
|
identity and orientation.
|
||||||
|
|
||||||
|
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||||
|
diverse, inclusive, and healthy community.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to a positive environment for our
|
||||||
|
community include:
|
||||||
|
|
||||||
|
* Demonstrating empathy and kindness toward other people
|
||||||
|
* Being respectful of differing opinions, viewpoints, and experiences
|
||||||
|
* Giving and gracefully accepting constructive feedback
|
||||||
|
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||||
|
and learning from the experience
|
||||||
|
* Focusing on what is best not just for us as individuals, but for the overall
|
||||||
|
community
|
||||||
|
|
||||||
|
Examples of unacceptable behavior include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery, and sexual attention or advances of
|
||||||
|
any kind
|
||||||
|
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or email address,
|
||||||
|
without their explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Enforcement Responsibilities
|
||||||
|
|
||||||
|
Community leaders are responsible for clarifying and enforcing our standards of
|
||||||
|
acceptable behavior and will take appropriate and fair corrective action in
|
||||||
|
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||||
|
or harmful.
|
||||||
|
|
||||||
|
Community leaders have the right and responsibility to remove, edit, or reject
|
||||||
|
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||||
|
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||||
|
decisions when appropriate.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies within all community spaces, and also applies when
|
||||||
|
an individual is officially representing the community in public spaces.
|
||||||
|
Examples of representing our community include using an official email address,
|
||||||
|
posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported to the community leaders responsible for enforcement at
|
||||||
|
[INSERT CONTACT METHOD].
|
||||||
|
All complaints will be reviewed and investigated promptly and fairly.
|
||||||
|
|
||||||
|
All community leaders are obligated to respect the privacy and security of the
|
||||||
|
reporter of any incident.
|
||||||
|
|
||||||
|
## Enforcement Guidelines
|
||||||
|
|
||||||
|
Community leaders will follow these Community Impact Guidelines in determining
|
||||||
|
the consequences for any action they deem in violation of this Code of Conduct:
|
||||||
|
|
||||||
|
### 1. Correction
|
||||||
|
|
||||||
|
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||||
|
unprofessional or unwelcome in the community.
|
||||||
|
|
||||||
|
**Consequence**: A private, written warning from community leaders, providing
|
||||||
|
clarity around the nature of the violation and an explanation of why the
|
||||||
|
behavior was inappropriate. A public apology may be requested.
|
||||||
|
|
||||||
|
### 2. Warning
|
||||||
|
|
||||||
|
**Community Impact**: A violation through a single incident or series of
|
||||||
|
actions.
|
||||||
|
|
||||||
|
**Consequence**: A warning with consequences for continued behavior. No
|
||||||
|
interaction with the people involved, including unsolicited interaction with
|
||||||
|
those enforcing the Code of Conduct, for a specified period of time. This
|
||||||
|
includes avoiding interactions in community spaces as well as external channels
|
||||||
|
like social media. Violating these terms may lead to a temporary or permanent
|
||||||
|
ban.
|
||||||
|
|
||||||
|
### 3. Temporary Ban
|
||||||
|
|
||||||
|
**Community Impact**: A serious violation of community standards, including
|
||||||
|
sustained inappropriate behavior.
|
||||||
|
|
||||||
|
**Consequence**: A temporary ban from any sort of interaction or public
|
||||||
|
communication with the community for a specified period of time. No public or
|
||||||
|
private interaction with the people involved, including unsolicited interaction
|
||||||
|
with those enforcing the Code of Conduct, is allowed during this period.
|
||||||
|
Violating these terms may lead to a permanent ban.
|
||||||
|
|
||||||
|
### 4. Permanent Ban
|
||||||
|
|
||||||
|
**Community Impact**: Demonstrating a pattern of violation of community
|
||||||
|
standards, including sustained inappropriate behavior, harassment of an
|
||||||
|
individual, or aggression toward or disparagement of classes of individuals.
|
||||||
|
|
||||||
|
**Consequence**: A permanent ban from any sort of public interaction within the
|
||||||
|
community.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||||
|
version 2.1, available at
|
||||||
|
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
|
||||||
|
|
||||||
|
Community Impact Guidelines were inspired by
|
||||||
|
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
|
||||||
|
|
||||||
|
For answers to common questions about this code of conduct, see the FAQ at
|
||||||
|
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
|
||||||
|
[https://www.contributor-covenant.org/translations][translations].
|
||||||
|
|
||||||
|
[homepage]: https://www.contributor-covenant.org
|
||||||
|
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
|
||||||
|
[Mozilla CoC]: https://github.com/mozilla/diversity
|
||||||
|
[FAQ]: https://www.contributor-covenant.org/faq
|
||||||
|
[translations]: https://www.contributor-covenant.org/translations
|
||||||
@@ -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
|
|
||||||
@@ -27,9 +27,11 @@ There are [screenshots on different platforms](https://github.com/fastfetch-cli/
|
|||||||
|
|
||||||
### Linux
|
### Linux
|
||||||
|
|
||||||
* Ubuntu: `ppa:zhangsongcui3371/fastfetch`
|
Some distros packaged an outdated fastfetch version. Older version is not supported, please always ensure that the latest version is used.
|
||||||
* 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`
|
|
||||||
* Arch Linux: `sudo pacman -S fastfetch`. You can also find fastfetch [on the AUR](https://aur.archlinux.org/packages/fastfetch-git).
|
* Ubuntu: [`ppa:zhangsongcui3371/fastfetch`](https://launchpad.net/~zhangsongcui3371/+archive/ubuntu/fastfetch) (for Ubuntu 22.04 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`
|
||||||
* Fedora: `sudo dnf install fastfetch`
|
* Fedora: `sudo dnf install fastfetch`
|
||||||
* Gentoo: `sudo emerge --ask app-misc/fastfetch`
|
* Gentoo: `sudo emerge --ask app-misc/fastfetch`
|
||||||
* Alpine: `apk add --upgrade fastfetch`
|
* Alpine: `apk add --upgrade fastfetch`
|
||||||
@@ -39,7 +41,9 @@ There are [screenshots on different platforms](https://github.com/fastfetch-cli/
|
|||||||
|
|
||||||
Replace sudo with doas depending on what you use.
|
Replace sudo with doas depending on what you use.
|
||||||
|
|
||||||
[See also if fastfetch has been packaged for your favorite Linux distro](#Packaging)
|
[See also if fastfetch has been packaged for your favorite Linux distro](#Packaging).
|
||||||
|
|
||||||
|
If fastfetch is not packaged for your distro or an outdated version is packaged, [linuxbrew](https://brew.sh/) is a good alternate: `brew install fastfetch`
|
||||||
|
|
||||||
### macOS
|
### macOS
|
||||||
|
|
||||||
|
|||||||
@@ -191,7 +191,6 @@ __fastfetch_completion()
|
|||||||
"--escape-bedrock"
|
"--escape-bedrock"
|
||||||
"--pipe"
|
"--pipe"
|
||||||
"--title-fqdn"
|
"--title-fqdn"
|
||||||
"--escape-bedrock"
|
|
||||||
"--disk-folders"
|
"--disk-folders"
|
||||||
"--disk-show-external"
|
"--disk-show-external"
|
||||||
"--disk-show-hidden"
|
"--disk-show-hidden"
|
||||||
@@ -227,8 +226,6 @@ __fastfetch_completion()
|
|||||||
"--separator"
|
"--separator"
|
||||||
"-s"
|
"-s"
|
||||||
"--structure"
|
"--structure"
|
||||||
"--set"
|
|
||||||
"--set-keyless"
|
|
||||||
"--player-name"
|
"--player-name"
|
||||||
"--percent-type"
|
"--percent-type"
|
||||||
"--publicip-url"
|
"--publicip-url"
|
||||||
@@ -360,7 +357,6 @@ __fastfetch_completion()
|
|||||||
local FF_OPTIONS_PATH=(
|
local FF_OPTIONS_PATH=(
|
||||||
"-c"
|
"-c"
|
||||||
"--config"
|
"--config"
|
||||||
"--os-file"
|
|
||||||
"--lib-pci"
|
"--lib-pci"
|
||||||
"--lib-vulkan"
|
"--lib-vulkan"
|
||||||
"--lib-wayland"
|
"--lib-wayland"
|
||||||
|
|||||||
Vendored
+30
@@ -1,3 +1,33 @@
|
|||||||
|
fastfetch (2.9.2) jammy; urgency=medium
|
||||||
|
|
||||||
|
* Update to 2.9.2
|
||||||
|
|
||||||
|
-- Carter Li <zhangsongcui@live.cn> Tue, 16 Apr 2024 16:32:40 +0800
|
||||||
|
|
||||||
|
fastfetch (2.9.1) jammy; urgency=medium
|
||||||
|
|
||||||
|
* Update to 2.9.1
|
||||||
|
|
||||||
|
-- Carter Li <zhangsongcui@live.cn> Mon, 08 Apr 2024 09:34:30 +0800
|
||||||
|
|
||||||
|
fastfetch (2.8.10) jammy; urgency=medium
|
||||||
|
|
||||||
|
* Update to 2.8.10
|
||||||
|
|
||||||
|
-- Carter Li <zhangsongcui@live.cn> Mon, 25 Mar 2024 15:01:53 +0800
|
||||||
|
|
||||||
|
fastfetch (2.8.9) jammy; urgency=medium
|
||||||
|
|
||||||
|
* Update to 2.8.9
|
||||||
|
|
||||||
|
-- Carter Li <zhangsongcui@live.cn> Fri, 15 Mar 2024 10:49:42 +0800
|
||||||
|
|
||||||
|
fastfetch (2.8.8) jammy; urgency=medium
|
||||||
|
|
||||||
|
* Update to 2.8.8
|
||||||
|
|
||||||
|
-- Carter Li <zhangsongcui@live.cn> Fri, 08 Mar 2024 09:59:41 +0800
|
||||||
|
|
||||||
fastfetch (2.8.6) jammy; urgency=medium
|
fastfetch (2.8.6) jammy; urgency=medium
|
||||||
|
|
||||||
* Update to 2.8.6
|
* Update to 2.8.6
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1 +1 @@
|
|||||||
fastfetch_2.8.6_source.buildinfo universe/utils optional
|
fastfetch_2.9.2_source.buildinfo universe/utils optional
|
||||||
|
|||||||
+5
-8
@@ -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,10 +122,7 @@ 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,
|
Fastfetch provides some default presets. List them with \fB\-\-list\-presets\fR.
|
||||||
the '.jsonc' file is preferred.
|
|
||||||
|
|
||||||
Fastfetch provides some default presets. List them with \fB \-\-print\-available\-presets\fR.
|
|
||||||
|
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
.BR neofetch (1)
|
.BR neofetch (1)
|
||||||
|
|||||||
+197
-17
@@ -4,9 +4,8 @@
|
|||||||
"colors": {
|
"colors": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"enum": [
|
||||||
"reset_", "bright_", "dim_",
|
"reset_", "bright_", "dim_", "italic_", "underline_", "blink_", "inverse_", "hidden_", "strike_", "light_",
|
||||||
"black", "red", "green", "yellow", "blue", "magenta", "cyan", "white", "default",
|
"black", "red", "green", "yellow", "blue", "magenta", "cyan", "white", "default"
|
||||||
"bright_black", "bright_red", "bright_green", "bright_yellow", "bright_blue", "bright_magenta", "bright_cyan", "bright_white"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"key": {
|
"key": {
|
||||||
@@ -24,9 +23,13 @@
|
|||||||
"default": 0
|
"default": 0
|
||||||
},
|
},
|
||||||
"format": {
|
"format": {
|
||||||
"description": "Output format of the module",
|
"description": "Output format of the module. See `-h <module>-format` for detail",
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"description": "Output color of the module. Left empty to use `display.color.output`",
|
||||||
|
"$ref": "#/$defs/colors"
|
||||||
|
},
|
||||||
"percent": {
|
"percent": {
|
||||||
"description": "Threshold of percentage colors",
|
"description": "Threshold of percentage colors",
|
||||||
"type": "object",
|
"type": "object",
|
||||||
@@ -294,10 +297,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": [
|
||||||
@@ -384,6 +383,10 @@
|
|||||||
"title": {
|
"title": {
|
||||||
"description": "Set the color of the title",
|
"description": "Set the color of the title",
|
||||||
"$ref": "#/$defs/colors"
|
"$ref": "#/$defs/colors"
|
||||||
|
},
|
||||||
|
"output": {
|
||||||
|
"description": "Set the color of the module output",
|
||||||
|
"$ref": "#/$defs/colors"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -549,6 +552,11 @@
|
|||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"description": "Whether to disable the stdout application buffer",
|
"description": "Whether to disable the stdout application buffer",
|
||||||
"default": false
|
"default": false
|
||||||
|
},
|
||||||
|
"tsVersion": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Whether to detect and display the version of terminal and shell. Mainly for benchmarking",
|
||||||
|
"default": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -674,6 +682,7 @@
|
|||||||
"board",
|
"board",
|
||||||
"break",
|
"break",
|
||||||
"brightness",
|
"brightness",
|
||||||
|
"camera",
|
||||||
"chassis",
|
"chassis",
|
||||||
"cpu",
|
"cpu",
|
||||||
"cpuusage",
|
"cpuusage",
|
||||||
@@ -692,6 +701,7 @@
|
|||||||
"icons",
|
"icons",
|
||||||
"kernel",
|
"kernel",
|
||||||
"lm",
|
"lm",
|
||||||
|
"loadavg",
|
||||||
"locale",
|
"locale",
|
||||||
"localip",
|
"localip",
|
||||||
"media",
|
"media",
|
||||||
@@ -730,7 +740,6 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
|
||||||
"description": "Run module with custom configurations",
|
"description": "Run module with custom configurations",
|
||||||
"required": [
|
"required": [
|
||||||
"type"
|
"type"
|
||||||
@@ -768,6 +777,10 @@
|
|||||||
"const": "board",
|
"const": "board",
|
||||||
"description": "Print mather board name and other info"
|
"description": "Print mather board name and other info"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"const": "camera",
|
||||||
|
"description": "Print available cameras"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"const": "cursor",
|
"const": "cursor",
|
||||||
"description": "Print cursor style name"
|
"description": "Print cursor style name"
|
||||||
@@ -888,6 +901,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -922,6 +938,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -953,6 +972,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -979,6 +1001,21 @@
|
|||||||
"minimum": 0,
|
"minimum": 0,
|
||||||
"maximum": 400,
|
"maximum": 400,
|
||||||
"default": 10
|
"default": 10
|
||||||
|
},
|
||||||
|
"key": {
|
||||||
|
"$ref": "#/$defs/key"
|
||||||
|
},
|
||||||
|
"keyColor": {
|
||||||
|
"$ref": "#/$defs/keyColor"
|
||||||
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
|
"keyWidth": {
|
||||||
|
"$ref": "#/$defs/keyWidth"
|
||||||
|
},
|
||||||
|
"format": {
|
||||||
|
"$ref": "#/$defs/format"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -997,6 +1034,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1030,6 +1070,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1108,6 +1151,9 @@
|
|||||||
"maxItems": 2
|
"maxItems": 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"key": {
|
||||||
|
"$ref": "#/$defs/key"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1134,6 +1180,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1158,6 +1207,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1165,10 +1217,7 @@
|
|||||||
"description": "Text to print",
|
"description": "Text to print",
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"required": [
|
|
||||||
"format"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": "Display",
|
"title": "Display",
|
||||||
@@ -1210,6 +1259,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1229,7 +1281,7 @@
|
|||||||
},
|
},
|
||||||
"folders": {
|
"folders": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "A colon (semicolon on Windows) separated list of folder paths for the disk output\nDefault: auto detection using mount-points"
|
"description": "A colon (semicolon on Windows) separated list of folder paths for the disk output\nDefault: auto detection using mount-points\nThis option overrides other `show*` options"
|
||||||
},
|
},
|
||||||
"showExternal": {
|
"showExternal": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
@@ -1270,6 +1322,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1302,6 +1357,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1330,6 +1388,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1356,6 +1417,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1401,6 +1465,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1438,6 +1505,16 @@
|
|||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": false
|
"default": false
|
||||||
},
|
},
|
||||||
|
"showPrefixLen": {
|
||||||
|
"description": "Show network prefix length (/N)",
|
||||||
|
"type": "boolean",
|
||||||
|
"default": true
|
||||||
|
},
|
||||||
|
"showAllIps": {
|
||||||
|
"description": "Show all IPs bound to the same interface.\nBy default only the first IP is shown",
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
"compact": {
|
"compact": {
|
||||||
"description": "Show all IPs in one line",
|
"description": "Show all IPs in one line",
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
@@ -1458,6 +1535,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1484,6 +1564,42 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
|
"keyWidth": {
|
||||||
|
"$ref": "#/$defs/keyWidth"
|
||||||
|
},
|
||||||
|
"format": {
|
||||||
|
"$ref": "#/$defs/format"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Loadavg",
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"const": "loadavg",
|
||||||
|
"description": "Print system load averages"
|
||||||
|
},
|
||||||
|
"ndigits": {
|
||||||
|
"type": "integer",
|
||||||
|
"description": "Set the number of digits to keep after the decimal point",
|
||||||
|
"minimum": 0,
|
||||||
|
"maximum": 9,
|
||||||
|
"default": 2
|
||||||
|
},
|
||||||
|
"key": {
|
||||||
|
"$ref": "#/$defs/key"
|
||||||
|
},
|
||||||
|
"keyColor": {
|
||||||
|
"$ref": "#/$defs/keyColor"
|
||||||
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1521,6 +1637,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1554,6 +1673,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1572,9 +1694,35 @@
|
|||||||
"description": "List installed package managers and count of installed packages"
|
"description": "List installed package managers and count of installed packages"
|
||||||
},
|
},
|
||||||
"disabled": {
|
"disabled": {
|
||||||
"description": "A colon separated list of package managers to be disabled when detecting",
|
"description": "List of package managers to be disabled when detecting",
|
||||||
"type": "string",
|
"type": "array",
|
||||||
"default": "winget"
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"am",
|
||||||
|
"apk",
|
||||||
|
"brew",
|
||||||
|
"choco",
|
||||||
|
"dpkg",
|
||||||
|
"emerge",
|
||||||
|
"eopkg",
|
||||||
|
"flatpak",
|
||||||
|
"macports",
|
||||||
|
"nix",
|
||||||
|
"opkg",
|
||||||
|
"pacman",
|
||||||
|
"paludis",
|
||||||
|
"pkg",
|
||||||
|
"pkgtool",
|
||||||
|
"rpm",
|
||||||
|
"scoop",
|
||||||
|
"snap",
|
||||||
|
"winget",
|
||||||
|
"xbps"
|
||||||
|
],
|
||||||
|
"uniqueItems": true
|
||||||
|
},
|
||||||
|
"default": ["winget"]
|
||||||
},
|
},
|
||||||
"key": {
|
"key": {
|
||||||
"$ref": "#/$defs/key"
|
"$ref": "#/$defs/key"
|
||||||
@@ -1582,6 +1730,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1612,6 +1763,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1641,12 +1795,20 @@
|
|||||||
"minimum": 0,
|
"minimum": 0,
|
||||||
"default": "disabled (0)"
|
"default": "disabled (0)"
|
||||||
},
|
},
|
||||||
|
"ipv6": {
|
||||||
|
"description": "Whether to use IPv6 for public IP detection server",
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
"key": {
|
"key": {
|
||||||
"$ref": "#/$defs/key"
|
"$ref": "#/$defs/key"
|
||||||
},
|
},
|
||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1668,6 +1830,9 @@
|
|||||||
"description": "Set the string to be printed",
|
"description": "Set the string to be printed",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"default": "-"
|
"default": "-"
|
||||||
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1699,6 +1864,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1725,6 +1893,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1772,6 +1943,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1810,6 +1984,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
@@ -1838,6 +2015,9 @@
|
|||||||
"keyColor": {
|
"keyColor": {
|
||||||
"$ref": "#/$defs/keyColor"
|
"$ref": "#/$defs/keyColor"
|
||||||
},
|
},
|
||||||
|
"outputColor": {
|
||||||
|
"$ref": "#/$defs/outputColor"
|
||||||
|
},
|
||||||
"keyWidth": {
|
"keyWidth": {
|
||||||
"$ref": "#/$defs/keyWidth"
|
"$ref": "#/$defs/keyWidth"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
"chassis",
|
"chassis",
|
||||||
"kernel",
|
"kernel",
|
||||||
"uptime",
|
"uptime",
|
||||||
|
"loadavg",
|
||||||
"processes",
|
"processes",
|
||||||
"packages",
|
"packages",
|
||||||
"shell",
|
"shell",
|
||||||
@@ -33,6 +34,7 @@
|
|||||||
"cpuusage",
|
"cpuusage",
|
||||||
"gpu",
|
"gpu",
|
||||||
"memory",
|
"memory",
|
||||||
|
"physicalmemory",
|
||||||
"swap",
|
"swap",
|
||||||
"disk",
|
"disk",
|
||||||
"battery",
|
"battery",
|
||||||
|
|||||||
@@ -0,0 +1,84 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"type": "title",
|
||||||
|
"key": "User",
|
||||||
|
"format": "{1}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "title",
|
||||||
|
"key": "Hostname",
|
||||||
|
"format": "{2}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "host",
|
||||||
|
"key": "Model"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "os",
|
||||||
|
"format": "{3} {9} {12}"
|
||||||
|
},
|
||||||
|
"kernel",
|
||||||
|
"uptime",
|
||||||
|
{
|
||||||
|
"type": "loadavg",
|
||||||
|
"key": "Load Average"
|
||||||
|
},
|
||||||
|
"processes",
|
||||||
|
{
|
||||||
|
"type": "wm",
|
||||||
|
"key": "Window Manager"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "de",
|
||||||
|
"key": "Desktop Environment"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "shell",
|
||||||
|
"format": "{7}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "terminal",
|
||||||
|
"format": "{5} {6} \u001b[37m█\u001b[97m█ \u001b[36m█\u001b[96m█ \u001b[35m█\u001b[95m█ \u001b[34m█\u001b[94m█ \u001b[33m█\u001b[93m█ \u001b[32m█\u001b[92m█ \u001b[31m█\u001b[91m█ \u001b[30m█\u001b[90m█"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "packages",
|
||||||
|
"format": "{1}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "cpu",
|
||||||
|
"key": "Temperature",
|
||||||
|
"temp": true,
|
||||||
|
"format": "{8}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "cpu",
|
||||||
|
"key": "CPU",
|
||||||
|
"format": "{4} x {1}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "gpu",
|
||||||
|
"format": "{2}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "memory",
|
||||||
|
"key": "RAM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "disk",
|
||||||
|
"key": "Disk",
|
||||||
|
"folders": "/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "localip",
|
||||||
|
"key": "LAN IP",
|
||||||
|
"showIpv6": true,
|
||||||
|
"showPrefixLen": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "publicip",
|
||||||
|
"key": "WAN IP"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
"showErrors": true,
|
"showErrors": true,
|
||||||
"noBuffer": true
|
"noBuffer": true
|
||||||
},
|
},
|
||||||
|
"logo": null,
|
||||||
"modules": [
|
"modules": [
|
||||||
"title",
|
"title",
|
||||||
"separator",
|
"separator",
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
"chassis",
|
"chassis",
|
||||||
"kernel",
|
"kernel",
|
||||||
"uptime",
|
"uptime",
|
||||||
|
"loadavg",
|
||||||
"processes",
|
"processes",
|
||||||
"packages",
|
"packages",
|
||||||
"shell",
|
"shell",
|
||||||
@@ -39,6 +41,7 @@
|
|||||||
"cpuusage",
|
"cpuusage",
|
||||||
"gpu",
|
"gpu",
|
||||||
"memory",
|
"memory",
|
||||||
|
"physicalmemory",
|
||||||
"swap",
|
"swap",
|
||||||
"disk",
|
"disk",
|
||||||
"battery",
|
"battery",
|
||||||
|
|||||||
@@ -84,17 +84,17 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "host",
|
"type": "host",
|
||||||
"key": " PC",
|
"key": " PC",
|
||||||
"keyColor": "green"
|
"keyColor": "green"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "cpu",
|
"type": "cpu",
|
||||||
"key": "│ ├",
|
"key": "│ ├",
|
||||||
"keyColor": "green"
|
"keyColor": "green"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "gpu",
|
"type": "gpu",
|
||||||
"key": "│ ├",
|
"key": "│ ├",
|
||||||
"keyColor": "green"
|
"keyColor": "green"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "file:///C:/msys64/home/zhang/fastfetch/doc/json_schema.json",
|
"$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
|
||||||
"logo": {
|
"logo": {
|
||||||
"type": "small"
|
"type": "small"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -0,0 +1,104 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
|
||||||
|
"logo": {
|
||||||
|
"type": "none"
|
||||||
|
},
|
||||||
|
"display": {
|
||||||
|
"separator": "-> "
|
||||||
|
},
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"type": "title",
|
||||||
|
"format": " {6}{7}{8}"
|
||||||
|
},
|
||||||
|
"break",
|
||||||
|
{
|
||||||
|
"type": "custom",
|
||||||
|
"format": "┌───────────────────────────── \u001b[1mSystem Information\u001b[0m ─────────────────────────────┐" // `\u001b` is `\033`, or `\e`
|
||||||
|
},
|
||||||
|
"break",
|
||||||
|
{
|
||||||
|
"key": " OS ",
|
||||||
|
"keyColor": "red",
|
||||||
|
"type": "os"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": " Machine ",
|
||||||
|
"keyColor": "green",
|
||||||
|
"type": "host"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": " Kernel ",
|
||||||
|
"keyColor": "magenta",
|
||||||
|
"type": "kernel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": " Uptime ",
|
||||||
|
"keyColor": "red",
|
||||||
|
"type": "uptime"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": " Resolution ",
|
||||||
|
"keyColor": "yellow",
|
||||||
|
"type": "display",
|
||||||
|
"compactType": "original-with-refresh-rate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": " WM ",
|
||||||
|
"keyColor": "blue",
|
||||||
|
"type": "wm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": " DE ",
|
||||||
|
"keyColor": "green",
|
||||||
|
"type": "de"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": " Shell ",
|
||||||
|
"keyColor": "cyan",
|
||||||
|
"type": "shell"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": " Terminal ",
|
||||||
|
"keyColor": "red",
|
||||||
|
"type": "terminal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": " CPU ",
|
||||||
|
"keyColor": "yellow",
|
||||||
|
"type": "cpu"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": " GPU ",
|
||||||
|
"keyColor": "blue",
|
||||||
|
"type": "gpu"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": " Memory ",
|
||||||
|
"keyColor": "magenta",
|
||||||
|
"type": "memory"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": " Local IP ",
|
||||||
|
"keyColor": "red",
|
||||||
|
"type": "localip",
|
||||||
|
"compact": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": " Public IP ",
|
||||||
|
"keyColor": "cyan",
|
||||||
|
"type": "publicip"
|
||||||
|
},
|
||||||
|
"break",
|
||||||
|
{
|
||||||
|
"type": "custom",
|
||||||
|
"format": "└──────────────────────────────────────────────────────────────────────────────┘" // `\u001b` is `\033`, or `\e`
|
||||||
|
},
|
||||||
|
"break",
|
||||||
|
{
|
||||||
|
"type": "colors",
|
||||||
|
"paddingLeft": 34,
|
||||||
|
"symbol": "circle"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
|
||||||
|
"logo": {
|
||||||
|
"type": "small",
|
||||||
|
"padding": {
|
||||||
|
"top": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"display": {
|
||||||
|
"separator": "",
|
||||||
|
"keyWidth": 15
|
||||||
|
},
|
||||||
|
"modules": [
|
||||||
|
{
|
||||||
|
"key": "╭───────────╮",
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// draw borders first to make colors of left and right border consistant
|
||||||
|
"key": "│ │\u001b[11D\u001b[31m user",
|
||||||
|
"type": "title",
|
||||||
|
"format": "{1}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "│ │\u001b[11D\u001b[32m hname",
|
||||||
|
"type": "title",
|
||||||
|
"format": "{2}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "│ │\u001b[11D\u001b[33m uptime",
|
||||||
|
"type": "uptime"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "│ │\u001b[11D\u001b[34m distro",
|
||||||
|
"type": "os"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "│ │\u001b[11D\u001b[35m kernel",
|
||||||
|
"type": "kernel"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "│ │\u001b[11D\u001b[36m desktop",
|
||||||
|
"type": "de"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "│ │\u001b[11D\u001b[31m term",
|
||||||
|
"type": "terminal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "│ │\u001b[11D\u001b[32m shell",
|
||||||
|
"type": "shell"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "│ │\u001b[11D\u001b[33m cpu",
|
||||||
|
"type": "cpu"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "│ │\u001b[11D\u001b[34m disk",
|
||||||
|
"type": "disk",
|
||||||
|
"folders": "/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "│ │\u001b[11D\u001b[35m memory",
|
||||||
|
"type": "memory"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "│ │\u001b[11D\u001b[36m network",
|
||||||
|
"type": "localip",
|
||||||
|
"format": "{1} ({4})"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "├───────────┤",
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "│ │\u001b[11D\u001b[m colors",
|
||||||
|
"type": "colors",
|
||||||
|
"symbol": "circle"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "╰───────────╯",
|
||||||
|
"type": "custom"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -19,15 +19,15 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "host",
|
"type": "host",
|
||||||
"key": " "
|
"key": " "
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "cpu",
|
"type": "cpu",
|
||||||
"key": " "
|
"key": " "
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "gpu",
|
"type": "gpu",
|
||||||
"key": " "
|
"key": " "
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "disk",
|
"type": "disk",
|
||||||
|
|||||||
@@ -9,13 +9,11 @@
|
|||||||
"modules": [
|
"modules": [
|
||||||
{
|
{
|
||||||
"type": "theme",
|
"type": "theme",
|
||||||
"key": "T",
|
"key": "T"
|
||||||
"format": "{7}"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "icons",
|
"type": "icons",
|
||||||
"key": "I",
|
"key": "I"
|
||||||
"format": "{5}"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "font",
|
"type": "font",
|
||||||
|
|||||||
@@ -15,17 +15,17 @@
|
|||||||
"modules": [
|
"modules": [
|
||||||
{
|
{
|
||||||
"type": "host",
|
"type": "host",
|
||||||
"key": "╭─",
|
"key": "╭─",
|
||||||
"keyColor": "green"
|
"keyColor": "green"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "cpu",
|
"type": "cpu",
|
||||||
"key": "├─",
|
"key": "├─",
|
||||||
"keyColor": "green"
|
"keyColor": "green"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "gpu",
|
"type": "gpu",
|
||||||
"key": "├─",
|
"key": "├─",
|
||||||
"keyColor": "green"
|
"keyColor": "green"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -77,17 +77,17 @@
|
|||||||
"break",
|
"break",
|
||||||
{
|
{
|
||||||
"type": "host",
|
"type": "host",
|
||||||
"key": " PC",
|
"key": " PC",
|
||||||
"keyColor": "green"
|
"keyColor": "green"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "cpu",
|
"type": "cpu",
|
||||||
"key": "├",
|
"key": "├",
|
||||||
"keyColor": "green"
|
"keyColor": "green"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "gpu",
|
"type": "gpu",
|
||||||
"key": "├",
|
"key": "├",
|
||||||
"keyColor": "green"
|
"keyColor": "green"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "memory",
|
"type": "memory",
|
||||||
"key": ""
|
"key": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "packages",
|
"type": "packages",
|
||||||
|
|||||||
+25
-13
@@ -1,25 +1,37 @@
|
|||||||
{
|
{
|
||||||
"$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",
|
||||||
"logo": {
|
|
||||||
"type": "builtin",
|
|
||||||
"source": "arch"
|
|
||||||
},
|
|
||||||
"modules": [
|
"modules": [
|
||||||
"host",
|
{
|
||||||
"display",
|
"type": "host",
|
||||||
|
"format": "{?2}{2}{?}{?5} ({5}){?}"
|
||||||
|
},
|
||||||
|
"chassis",
|
||||||
|
{
|
||||||
|
"type": "board",
|
||||||
|
"format": "{?1}{1}{?}{?2} ({2}){?}"
|
||||||
|
},
|
||||||
"cpu",
|
"cpu",
|
||||||
"gpu",
|
|
||||||
{
|
{
|
||||||
"type": "memory",
|
"type": "memory",
|
||||||
"format": "{?2}{2}{?}"
|
"format": "{?2}{2}{?}"
|
||||||
},
|
},
|
||||||
{
|
"physicaldisk",
|
||||||
"type": "disk",
|
"gpu",
|
||||||
"format": "{?2}{2}{?}"
|
"display",
|
||||||
},
|
"monitor",
|
||||||
|
{
|
||||||
|
"type": "wifi",
|
||||||
|
"format": "{?1}{1}{?}{?6} - {6}{?}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "sound",
|
||||||
|
"format": "{?2}{2}{?}"
|
||||||
|
},
|
||||||
|
"camera",
|
||||||
{
|
{
|
||||||
"type": "battery",
|
"type": "battery",
|
||||||
"format": "{?1}{1} {?}{?2}{2} {?}{?3}({3}){?}"
|
"format": "{?1}{1}{?}{?2} {2}{?}{?3} ({3}){?}"
|
||||||
}
|
},
|
||||||
|
"poweradapter"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
+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",
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
"uptime",
|
"uptime",
|
||||||
{
|
{
|
||||||
"type": "battery",
|
"type": "battery",
|
||||||
"format": "{/4}{-}{/}{4}%{?5} [{5}]{?}"
|
"format": "{/4}{-}{/}{4}{?5} [{5}]{?}"
|
||||||
},
|
},
|
||||||
"break",
|
"break",
|
||||||
"packages",
|
"packages",
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 341 KiB |
Vendored
+257
@@ -1229,6 +1229,18 @@ typedef struct _ctl_lda_args_t ctl_lda_args_t;
|
|||||||
/// @brief Forward-declare ctl_dce_args_t
|
/// @brief Forward-declare ctl_dce_args_t
|
||||||
typedef struct _ctl_dce_args_t ctl_dce_args_t;
|
typedef struct _ctl_dce_args_t ctl_dce_args_t;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Forward-declare ctl_wire_format_t
|
||||||
|
typedef struct _ctl_wire_format_t ctl_wire_format_t;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Forward-declare ctl_get_set_wire_format_config_t
|
||||||
|
typedef struct _ctl_get_set_wire_format_config_t ctl_get_set_wire_format_config_t;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Forward-declare ctl_display_settings_t
|
||||||
|
typedef struct _ctl_display_settings_t ctl_display_settings_t;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief Forward-declare ctl_engine_properties_t
|
/// @brief Forward-declare ctl_engine_properties_t
|
||||||
typedef struct _ctl_engine_properties_t ctl_engine_properties_t;
|
typedef struct _ctl_engine_properties_t ctl_engine_properties_t;
|
||||||
@@ -2029,6 +2041,8 @@ typedef enum _ctl_std_display_feature_flag_t
|
|||||||
CTL_STD_DISPLAY_FEATURE_FLAG_VESA_COMPRESSION = CTL_BIT(4), ///< [out] Is display compression (VESA DSC) supported
|
CTL_STD_DISPLAY_FEATURE_FLAG_VESA_COMPRESSION = CTL_BIT(4), ///< [out] Is display compression (VESA DSC) supported
|
||||||
CTL_STD_DISPLAY_FEATURE_FLAG_HDR = CTL_BIT(5), ///< [out] Is HDR supported
|
CTL_STD_DISPLAY_FEATURE_FLAG_HDR = CTL_BIT(5), ///< [out] Is HDR supported
|
||||||
CTL_STD_DISPLAY_FEATURE_FLAG_HDMI_QMS = CTL_BIT(6), ///< [out] Is HDMI QMS supported
|
CTL_STD_DISPLAY_FEATURE_FLAG_HDMI_QMS = CTL_BIT(6), ///< [out] Is HDMI QMS supported
|
||||||
|
CTL_STD_DISPLAY_FEATURE_FLAG_HDR10_PLUS_CERTIFIED = CTL_BIT(7), ///< [out] Is HDR10+ certified
|
||||||
|
CTL_STD_DISPLAY_FEATURE_FLAG_VESA_HDR_CERTIFIED = CTL_BIT(8), ///< [out] Is VESA HDR certified - for future use
|
||||||
CTL_STD_DISPLAY_FEATURE_FLAG_MAX = 0x80000000
|
CTL_STD_DISPLAY_FEATURE_FLAG_MAX = 0x80000000
|
||||||
|
|
||||||
} ctl_std_display_feature_flag_t;
|
} ctl_std_display_feature_flag_t;
|
||||||
@@ -2042,6 +2056,7 @@ typedef enum _ctl_intel_display_feature_flag_t
|
|||||||
CTL_INTEL_DISPLAY_FEATURE_FLAG_DPST = CTL_BIT(0), ///< [out] Is DPST supported
|
CTL_INTEL_DISPLAY_FEATURE_FLAG_DPST = CTL_BIT(0), ///< [out] Is DPST supported
|
||||||
CTL_INTEL_DISPLAY_FEATURE_FLAG_LACE = CTL_BIT(1), ///< [out] Is LACE supported
|
CTL_INTEL_DISPLAY_FEATURE_FLAG_LACE = CTL_BIT(1), ///< [out] Is LACE supported
|
||||||
CTL_INTEL_DISPLAY_FEATURE_FLAG_DRRS = CTL_BIT(2), ///< [out] Is DRRS supported
|
CTL_INTEL_DISPLAY_FEATURE_FLAG_DRRS = CTL_BIT(2), ///< [out] Is DRRS supported
|
||||||
|
CTL_INTEL_DISPLAY_FEATURE_FLAG_ARC_ADAPTIVE_SYNC_CERTIFIED = CTL_BIT(3),///< [out] Is Intel Arc certified adaptive sync display
|
||||||
CTL_INTEL_DISPLAY_FEATURE_FLAG_MAX = 0x80000000
|
CTL_INTEL_DISPLAY_FEATURE_FLAG_MAX = 0x80000000
|
||||||
|
|
||||||
} ctl_intel_display_feature_flag_t;
|
} ctl_intel_display_feature_flag_t;
|
||||||
@@ -4398,6 +4413,232 @@ ctlGetSetDynamicContrastEnhancement(
|
|||||||
ctl_dce_args_t* pDceArgs ///< [in,out] Dynamic Contrast Enhancement arguments
|
ctl_dce_args_t* pDceArgs ///< [in,out] Dynamic Contrast Enhancement arguments
|
||||||
);
|
);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Color model
|
||||||
|
typedef enum _ctl_wire_format_color_model_t
|
||||||
|
{
|
||||||
|
CTL_WIRE_FORMAT_COLOR_MODEL_RGB = 0, ///< Color model RGB
|
||||||
|
CTL_WIRE_FORMAT_COLOR_MODEL_YCBCR_420 = 1, ///< Color model YCBCR 420
|
||||||
|
CTL_WIRE_FORMAT_COLOR_MODEL_YCBCR_422 = 2, ///< Color model YCBCR 422
|
||||||
|
CTL_WIRE_FORMAT_COLOR_MODEL_YCBCR_444 = 3, ///< Color model YCBCR 444
|
||||||
|
CTL_WIRE_FORMAT_COLOR_MODEL_MAX
|
||||||
|
|
||||||
|
} ctl_wire_format_color_model_t;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Operation type
|
||||||
|
typedef enum _ctl_wire_format_operation_type_t
|
||||||
|
{
|
||||||
|
CTL_WIRE_FORMAT_OPERATION_TYPE_GET = 0, ///< Get request
|
||||||
|
CTL_WIRE_FORMAT_OPERATION_TYPE_SET = 1, ///< Set request
|
||||||
|
CTL_WIRE_FORMAT_OPERATION_TYPE_RESTORE_DEFAULT = 2, ///< Restore to default values
|
||||||
|
CTL_WIRE_FORMAT_OPERATION_TYPE_MAX
|
||||||
|
|
||||||
|
} ctl_wire_format_operation_type_t;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Wire Format
|
||||||
|
typedef struct _ctl_wire_format_t
|
||||||
|
{
|
||||||
|
uint32_t Size; ///< [in] size of this structure
|
||||||
|
uint8_t Version; ///< [in] version of this structure
|
||||||
|
ctl_wire_format_color_model_t ColorModel; ///< [in,out] Color model
|
||||||
|
ctl_output_bpc_flags_t ColorDepth; ///< [in,out] Color Depth
|
||||||
|
|
||||||
|
} ctl_wire_format_t;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
#ifndef CTL_MAX_WIREFORMAT_COLOR_MODELS_SUPPORTED
|
||||||
|
/// @brief Maximum Wire Formats Supported
|
||||||
|
#define CTL_MAX_WIREFORMAT_COLOR_MODELS_SUPPORTED 4
|
||||||
|
#endif // CTL_MAX_WIREFORMAT_COLOR_MODELS_SUPPORTED
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Get Set Wire Format
|
||||||
|
typedef struct _ctl_get_set_wire_format_config_t
|
||||||
|
{
|
||||||
|
uint32_t Size; ///< [in] size of this structure
|
||||||
|
uint8_t Version; ///< [in] version of this structure
|
||||||
|
ctl_wire_format_operation_type_t Operation; ///< [in] Get/Set Operation
|
||||||
|
ctl_wire_format_t SupportedWireFormat[CTL_MAX_WIREFORMAT_COLOR_MODELS_SUPPORTED]; ///< [out] Array of WireFormats supported
|
||||||
|
ctl_wire_format_t WireFormat; ///< [in,out] Current/Requested WireFormat based on Operation. During SET
|
||||||
|
///< Operation, if multiple bpc is set, the MIN bpc will be applied
|
||||||
|
|
||||||
|
} ctl_get_set_wire_format_config_t;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Get/Set Color Format and Color Depth
|
||||||
|
///
|
||||||
|
/// @details
|
||||||
|
/// - Get and Set the Color Format and Color Depth of a target
|
||||||
|
///
|
||||||
|
/// @returns
|
||||||
|
/// - CTL_RESULT_SUCCESS
|
||||||
|
/// - CTL_RESULT_ERROR_UNINITIALIZED
|
||||||
|
/// - CTL_RESULT_ERROR_DEVICE_LOST
|
||||||
|
/// - CTL_RESULT_ERROR_INVALID_NULL_HANDLE
|
||||||
|
/// + `nullptr == hDisplayOutput`
|
||||||
|
/// - CTL_RESULT_ERROR_INVALID_NULL_POINTER
|
||||||
|
/// + `nullptr == pGetSetWireFormatSetting`
|
||||||
|
/// - ::CTL_RESULT_ERROR_UNSUPPORTED_VERSION - "Unsupported version"
|
||||||
|
/// - ::CTL_RESULT_ERROR_INVALID_ARGUMENT - "Invalid data passed as argument, WireFormat is not supported"
|
||||||
|
/// - ::CTL_RESULT_ERROR_DISPLAY_NOT_ACTIVE - "Display not active"
|
||||||
|
/// - ::CTL_RESULT_ERROR_INVALID_OPERATION_TYPE - "Invalid operation type"
|
||||||
|
/// - ::CTL_RESULT_ERROR_NULL_OS_DISPLAY_OUTPUT_HANDLE - "Null OS display output handle"
|
||||||
|
/// - ::CTL_RESULT_ERROR_NULL_OS_INTERFACE - "Null OS interface"
|
||||||
|
/// - ::CTL_RESULT_ERROR_NULL_OS_ADAPATER_HANDLE - "Null OS adapter handle"
|
||||||
|
CTL_APIEXPORT ctl_result_t CTL_APICALL
|
||||||
|
ctlGetSetWireFormat(
|
||||||
|
ctl_display_output_handle_t hDisplayOutput, ///< [in][release] Handle to display output
|
||||||
|
ctl_get_set_wire_format_config_t* pGetSetWireFormatSetting ///< [in][release] Get/Set Wire Format settings to be fetched/applied
|
||||||
|
);
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Various display settings
|
||||||
|
typedef uint32_t ctl_display_setting_flags_t;
|
||||||
|
typedef enum _ctl_display_setting_flag_t
|
||||||
|
{
|
||||||
|
CTL_DISPLAY_SETTING_FLAG_LOW_LATENCY = CTL_BIT(0), ///< Low latency
|
||||||
|
CTL_DISPLAY_SETTING_FLAG_SOURCE_TM = CTL_BIT(1),///< Source tone mapping
|
||||||
|
CTL_DISPLAY_SETTING_FLAG_CONTENT_TYPE = CTL_BIT(2), ///< Content type
|
||||||
|
CTL_DISPLAY_SETTING_FLAG_QUANTIZATION_RANGE = CTL_BIT(3), ///< Quantization range, full range or limited range
|
||||||
|
CTL_DISPLAY_SETTING_FLAG_PICTURE_AR = CTL_BIT(4), ///< Picture aspect ratio
|
||||||
|
CTL_DISPLAY_SETTING_FLAG_AUDIO = CTL_BIT(5), ///< Audio settings
|
||||||
|
CTL_DISPLAY_SETTING_FLAG_MAX = 0x80000000
|
||||||
|
|
||||||
|
} ctl_display_setting_flag_t;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Low latency setting
|
||||||
|
typedef enum _ctl_display_setting_low_latency_t
|
||||||
|
{
|
||||||
|
CTL_DISPLAY_SETTING_LOW_LATENCY_DEFAULT = 0, ///< Default
|
||||||
|
CTL_DISPLAY_SETTING_LOW_LATENCY_DISABLED = 1, ///< Disabled
|
||||||
|
CTL_DISPLAY_SETTING_LOW_LATENCY_ENABLED = 2, ///< Enabled
|
||||||
|
CTL_DISPLAY_SETTING_LOW_LATENCY_MAX
|
||||||
|
|
||||||
|
} ctl_display_setting_low_latency_t;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Source tone mapping setting
|
||||||
|
typedef enum _ctl_display_setting_sourcetm_t
|
||||||
|
{
|
||||||
|
CTL_DISPLAY_SETTING_SOURCETM_DEFAULT = 0, ///< Default
|
||||||
|
CTL_DISPLAY_SETTING_SOURCETM_DISABLED = 1, ///< Disabled
|
||||||
|
CTL_DISPLAY_SETTING_SOURCETM_ENABLED = 2, ///< Enabled
|
||||||
|
CTL_DISPLAY_SETTING_SOURCETM_MAX
|
||||||
|
|
||||||
|
} ctl_display_setting_sourcetm_t;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Content type settings
|
||||||
|
typedef enum _ctl_display_setting_content_type_t
|
||||||
|
{
|
||||||
|
CTL_DISPLAY_SETTING_CONTENT_TYPE_DEFAULT = 0, ///< Default content type used by driver. Driver will use internal
|
||||||
|
///< techniques to determine content type and indicate to panel
|
||||||
|
CTL_DISPLAY_SETTING_CONTENT_TYPE_DISABLED = 1, ///< Content type indication is disabled
|
||||||
|
CTL_DISPLAY_SETTING_CONTENT_TYPE_DESKTOP = 2, ///< Typical desktop with a mix of text and graphics
|
||||||
|
CTL_DISPLAY_SETTING_CONTENT_TYPE_MEDIA = 3, ///< Video or media content
|
||||||
|
CTL_DISPLAY_SETTING_CONTENT_TYPE_GAMING = 4, ///< Gaming content
|
||||||
|
CTL_DISPLAY_SETTING_CONTENT_TYPE_MAX
|
||||||
|
|
||||||
|
} ctl_display_setting_content_type_t;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Quantization range
|
||||||
|
typedef enum _ctl_display_setting_quantization_range_t
|
||||||
|
{
|
||||||
|
CTL_DISPLAY_SETTING_QUANTIZATION_RANGE_DEFAULT = 0, ///< Default based on video format
|
||||||
|
CTL_DISPLAY_SETTING_QUANTIZATION_RANGE_LIMITED_RANGE = 1, ///< Limited range
|
||||||
|
CTL_DISPLAY_SETTING_QUANTIZATION_RANGE_FULL_RANGE = 2, ///< Full range
|
||||||
|
CTL_DISPLAY_SETTING_QUANTIZATION_RANGE_MAX
|
||||||
|
|
||||||
|
} ctl_display_setting_quantization_range_t;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Picture aspect ratio
|
||||||
|
typedef uint32_t ctl_display_setting_picture_ar_flags_t;
|
||||||
|
typedef enum _ctl_display_setting_picture_ar_flag_t
|
||||||
|
{
|
||||||
|
CTL_DISPLAY_SETTING_PICTURE_AR_FLAG_DEFAULT = CTL_BIT(0), ///< Default picture aspect ratio
|
||||||
|
CTL_DISPLAY_SETTING_PICTURE_AR_FLAG_DISABLED = CTL_BIT(1), ///< Picture aspect ratio indication is explicitly disabled
|
||||||
|
CTL_DISPLAY_SETTING_PICTURE_AR_FLAG_AR_4_3 = CTL_BIT(2),///< Aspect ratio of 4:3
|
||||||
|
CTL_DISPLAY_SETTING_PICTURE_AR_FLAG_AR_16_9 = CTL_BIT(3), ///< Aspect ratio of 16:9
|
||||||
|
CTL_DISPLAY_SETTING_PICTURE_AR_FLAG_AR_64_27 = CTL_BIT(4), ///< Aspect ratio of 64:27 or 21:9 anamorphic
|
||||||
|
CTL_DISPLAY_SETTING_PICTURE_AR_FLAG_AR_256_135 = CTL_BIT(5),///< Aspect ratio of 256:135
|
||||||
|
CTL_DISPLAY_SETTING_PICTURE_AR_FLAG_MAX = 0x80000000
|
||||||
|
|
||||||
|
} ctl_display_setting_picture_ar_flag_t;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Audio settings
|
||||||
|
typedef enum _ctl_display_setting_audio_t
|
||||||
|
{
|
||||||
|
CTL_DISPLAY_SETTING_AUDIO_DEFAULT = 0, ///< Default audio settings, always enumerated and enabled if display
|
||||||
|
///< supports it
|
||||||
|
CTL_DISPLAY_SETTING_AUDIO_DISABLED = 1, ///< Forcefully disable display audio end point enumeration to OS
|
||||||
|
CTL_DISPLAY_SETTING_AUDIO_MAX
|
||||||
|
|
||||||
|
} ctl_display_setting_audio_t;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Get/Set end display settings
|
||||||
|
typedef struct _ctl_display_settings_t
|
||||||
|
{
|
||||||
|
uint32_t Size; ///< [in] size of this structure
|
||||||
|
uint8_t Version; ///< [in] version of this structure
|
||||||
|
bool Set; ///< [in] Flag to indicate Set or Get operation. Default option for all
|
||||||
|
///< features are reserved for Set=true calls, which will reset the setting
|
||||||
|
///< to driver defaults.
|
||||||
|
ctl_display_setting_flags_t SupportedFlags; ///< [out] Display setting flags supported by the display.
|
||||||
|
ctl_display_setting_flags_t ControllableFlags; ///< [out] Display setting flags which can be controlled by the caller.
|
||||||
|
///< Features which doesn't have this flag set cannot be changed by caller.
|
||||||
|
ctl_display_setting_flags_t ValidFlags; ///< [in,out] Display setting flags which caller can use to indicate the
|
||||||
|
///< features it's interested in. This cannot have a bit set which is not
|
||||||
|
///< supported by SupportedFlags and ControllableFlags.
|
||||||
|
ctl_display_setting_low_latency_t LowLatency; ///< [in,out] Low latency state of panel. For HDR10+ Gaming this need to be
|
||||||
|
///< in ENABLED state.
|
||||||
|
ctl_display_setting_sourcetm_t SourceTM; ///< [in,out] Source tone mapping state known to panel. For HDR10+ Gaming
|
||||||
|
///< this need to be in ENABLED state.
|
||||||
|
ctl_display_setting_content_type_t ContentType; ///< [in,out] Source content type known to panel.
|
||||||
|
ctl_display_setting_quantization_range_t QuantizationRange; ///< [in,out] Quantization range
|
||||||
|
ctl_display_setting_picture_ar_flags_t SupportedPictureAR; ///< [out] Supported Picture aspect ratios
|
||||||
|
ctl_display_setting_picture_ar_flag_t PictureAR;///< [in,out] Picture aspect ratio
|
||||||
|
ctl_display_setting_audio_t AudioSettings; ///< [in,out] Audio settings
|
||||||
|
uint32_t Reserved[25]; ///< [out] Reserved fields for future enumerations
|
||||||
|
|
||||||
|
} ctl_display_settings_t;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Get/Set Display settings
|
||||||
|
///
|
||||||
|
/// @details
|
||||||
|
/// - To get/set end display settings like low latency, HDR10+ signaling
|
||||||
|
/// etc. which are controlled via info-frames/secondary data packets
|
||||||
|
///
|
||||||
|
/// @returns
|
||||||
|
/// - CTL_RESULT_SUCCESS
|
||||||
|
/// - CTL_RESULT_ERROR_UNINITIALIZED
|
||||||
|
/// - CTL_RESULT_ERROR_DEVICE_LOST
|
||||||
|
/// - CTL_RESULT_ERROR_INVALID_NULL_HANDLE
|
||||||
|
/// + `nullptr == hDisplayOutput`
|
||||||
|
/// - CTL_RESULT_ERROR_INVALID_NULL_POINTER
|
||||||
|
/// + `nullptr == pDisplaySettings`
|
||||||
|
/// - ::CTL_RESULT_ERROR_UNSUPPORTED_VERSION - "Unsupported version"
|
||||||
|
/// - ::CTL_RESULT_ERROR_NULL_OS_DISPLAY_OUTPUT_HANDLE - "Null OS display output handle"
|
||||||
|
/// - ::CTL_RESULT_ERROR_NULL_OS_INTERFACE - "Null OS interface"
|
||||||
|
/// - ::CTL_RESULT_ERROR_NULL_OS_ADAPATER_HANDLE - "Null OS adapter handle"
|
||||||
|
/// - ::CTL_RESULT_ERROR_KMD_CALL - "Kernel mode driver call failure"
|
||||||
|
/// - ::CTL_RESULT_ERROR_INVALID_NULL_HANDLE - "Invalid or Null handle passed"
|
||||||
|
/// - ::CTL_RESULT_ERROR_INVALID_NULL_POINTER - "Invalid null pointer"
|
||||||
|
/// - ::CTL_RESULT_ERROR_INVALID_OPERATION_TYPE - "Invalid operation type"
|
||||||
|
/// - ::CTL_RESULT_ERROR_INVALID_ARGUMENT - "Invalid combination of parameters"
|
||||||
|
CTL_APIEXPORT ctl_result_t CTL_APICALL
|
||||||
|
ctlGetSetDisplaySettings(
|
||||||
|
ctl_display_output_handle_t hDisplayOutput, ///< [in] Handle to display output
|
||||||
|
ctl_display_settings_t* pDisplaySettings ///< [in,out] End display capabilities
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
#if !defined(__GNUC__)
|
#if !defined(__GNUC__)
|
||||||
#pragma endregion // display
|
#pragma endregion // display
|
||||||
@@ -7229,6 +7470,22 @@ typedef ctl_result_t (CTL_APICALL *ctl_pfnGetSetDynamicContrastEnhancement_t)(
|
|||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Function-pointer for ctlGetSetWireFormat
|
||||||
|
typedef ctl_result_t (CTL_APICALL *ctl_pfnGetSetWireFormat_t)(
|
||||||
|
ctl_display_output_handle_t,
|
||||||
|
ctl_get_set_wire_format_config_t*
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief Function-pointer for ctlGetSetDisplaySettings
|
||||||
|
typedef ctl_result_t (CTL_APICALL *ctl_pfnGetSetDisplaySettings_t)(
|
||||||
|
ctl_display_output_handle_t,
|
||||||
|
ctl_display_settings_t*
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief Function-pointer for ctlEnumEngineGroups
|
/// @brief Function-pointer for ctlEnumEngineGroups
|
||||||
typedef ctl_result_t (CTL_APICALL *ctl_pfnEnumEngineGroups_t)(
|
typedef ctl_result_t (CTL_APICALL *ctl_pfnEnumEngineGroups_t)(
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"home": "https://github.com/intel/drivers.gpu.control-library",
|
"home": "https://github.com/intel/drivers.gpu.control-library",
|
||||||
"license": "./LICENSE",
|
"license": "./LICENSE",
|
||||||
"version": "e1776b7be2ceead1296204371447b27860d25a66",
|
"version": "v184",
|
||||||
"author": "Intel Corporation"
|
"author": "Intel Corporation"
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+740
-25
@@ -153,6 +153,27 @@ typedef struct nvmlDevice_st* nvmlDevice_t;
|
|||||||
*/
|
*/
|
||||||
#define NVML_DEVICE_PCI_BUS_ID_BUFFER_V2_SIZE 16
|
#define NVML_DEVICE_PCI_BUS_ID_BUFFER_V2_SIZE 16
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PCI information about a GPU device.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned int version; //!< The version number of this struct
|
||||||
|
unsigned int domain; //!< The PCI domain on which the device's bus resides, 0 to 0xffffffff
|
||||||
|
unsigned int bus; //!< The bus on which the device resides, 0 to 0xff
|
||||||
|
unsigned int device; //!< The device's id on the bus, 0 to 31
|
||||||
|
|
||||||
|
unsigned int pciDeviceId; //!< The combined 16-bit device id and 16-bit vendor id
|
||||||
|
unsigned int pciSubSystemId; //!< The 32-bit Sub System Device ID
|
||||||
|
|
||||||
|
unsigned int baseClass; //!< The 8-bit PCI base class code
|
||||||
|
unsigned int subClass; //!< The 8-bit PCI sub class code
|
||||||
|
|
||||||
|
char busId[NVML_DEVICE_PCI_BUS_ID_BUFFER_SIZE]; //!< The tuple domain:bus:device.function PCI identifier (& NULL terminator)
|
||||||
|
} nvmlPciInfoExt_v1_t;
|
||||||
|
typedef nvmlPciInfoExt_v1_t nvmlPciInfoExt_t;
|
||||||
|
#define nvmlPciInfoExt_v1 NVML_STRUCT_VERSION(PciInfoExt, 1)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PCI information about a GPU device.
|
* PCI information about a GPU device.
|
||||||
*/
|
*/
|
||||||
@@ -482,11 +503,16 @@ typedef enum nvmlGpuP2PStatus_enum
|
|||||||
typedef enum nvmlGpuP2PCapsIndex_enum
|
typedef enum nvmlGpuP2PCapsIndex_enum
|
||||||
{
|
{
|
||||||
NVML_P2P_CAPS_INDEX_READ = 0,
|
NVML_P2P_CAPS_INDEX_READ = 0,
|
||||||
NVML_P2P_CAPS_INDEX_WRITE,
|
NVML_P2P_CAPS_INDEX_WRITE = 1,
|
||||||
NVML_P2P_CAPS_INDEX_NVLINK,
|
NVML_P2P_CAPS_INDEX_NVLINK = 2,
|
||||||
NVML_P2P_CAPS_INDEX_ATOMICS,
|
NVML_P2P_CAPS_INDEX_ATOMICS = 3,
|
||||||
NVML_P2P_CAPS_INDEX_PROP,
|
NVML_P2P_CAPS_INDEX_PCI = 4,
|
||||||
NVML_P2P_CAPS_INDEX_UNKNOWN
|
/*
|
||||||
|
* DO NOT USE! NVML_P2P_CAPS_INDEX_PROP is deprecated.
|
||||||
|
* Use NVML_P2P_CAPS_INDEX_PCI instead.
|
||||||
|
*/
|
||||||
|
NVML_P2P_CAPS_INDEX_PROP = NVML_P2P_CAPS_INDEX_PCI,
|
||||||
|
NVML_P2P_CAPS_INDEX_UNKNOWN = 5,
|
||||||
}nvmlGpuP2PCapsIndex_t;
|
}nvmlGpuP2PCapsIndex_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -526,6 +552,8 @@ typedef enum nvmlSamplingType_enum
|
|||||||
NVML_PROCESSOR_CLK_SAMPLES = 5, //!< To represent processor clock samples
|
NVML_PROCESSOR_CLK_SAMPLES = 5, //!< To represent processor clock samples
|
||||||
NVML_MEMORY_CLK_SAMPLES = 6, //!< To represent memory clock samples
|
NVML_MEMORY_CLK_SAMPLES = 6, //!< To represent memory clock samples
|
||||||
NVML_MODULE_POWER_SAMPLES = 7, //!< To represent module power samples for total module starting Grace Hopper
|
NVML_MODULE_POWER_SAMPLES = 7, //!< To represent module power samples for total module starting Grace Hopper
|
||||||
|
NVML_JPG_UTILIZATION_SAMPLES = 8, //!< To represent percent of time during which NVJPG remains busy
|
||||||
|
NVML_OFA_UTILIZATION_SAMPLES = 9, //!< To represent percent of time during which NVOFA remains busy
|
||||||
|
|
||||||
// Keep this last
|
// Keep this last
|
||||||
NVML_SAMPLINGTYPE_COUNT
|
NVML_SAMPLINGTYPE_COUNT
|
||||||
@@ -1005,6 +1033,7 @@ typedef enum nvmlReturn_enum
|
|||||||
NVML_ERROR_DEPRECATED = 26, //!< The requested functionality has been deprecated
|
NVML_ERROR_DEPRECATED = 26, //!< The requested functionality has been deprecated
|
||||||
NVML_ERROR_NOT_READY = 27, //!< The system is not ready for the request
|
NVML_ERROR_NOT_READY = 27, //!< The system is not ready for the request
|
||||||
NVML_ERROR_GPU_NOT_FOUND = 28, //!< No GPUs were found
|
NVML_ERROR_GPU_NOT_FOUND = 28, //!< No GPUs were found
|
||||||
|
NVML_ERROR_INVALID_STATE = 29, //!< Resource not in correct state to perform requested operation
|
||||||
NVML_ERROR_UNKNOWN = 999 //!< An internal driver error occurred
|
NVML_ERROR_UNKNOWN = 999 //!< An internal driver error occurred
|
||||||
} nvmlReturn_t;
|
} nvmlReturn_t;
|
||||||
|
|
||||||
@@ -1150,11 +1179,14 @@ typedef enum nvmlVgpuDriverCapability_enum
|
|||||||
*/
|
*/
|
||||||
typedef enum nvmlDeviceVgpuCapability_enum
|
typedef enum nvmlDeviceVgpuCapability_enum
|
||||||
{
|
{
|
||||||
NVML_DEVICE_VGPU_CAP_FRACTIONAL_MULTI_VGPU = 0, //!< Fractional vGPU profiles on this GPU can be used in multi-vGPU configurations
|
NVML_DEVICE_VGPU_CAP_FRACTIONAL_MULTI_VGPU = 0, //!< Query if the fractional vGPU profiles on this GPU can be used in multi-vGPU configurations
|
||||||
NVML_DEVICE_VGPU_CAP_HETEROGENEOUS_TIMESLICE_PROFILES = 1, //!< Supports concurrent execution of timesliced vGPU profiles of differing types
|
NVML_DEVICE_VGPU_CAP_HETEROGENEOUS_TIMESLICE_PROFILES = 1, //!< Query if the GPU support concurrent execution of timesliced vGPU profiles of differing types
|
||||||
NVML_DEVICE_VGPU_CAP_HETEROGENEOUS_TIMESLICE_SIZES = 2, //!< Supports concurrent execution of timesliced vGPU profiles of differing framebuffer sizes
|
NVML_DEVICE_VGPU_CAP_HETEROGENEOUS_TIMESLICE_SIZES = 2, //!< Query if the GPU support concurrent execution of timesliced vGPU profiles of differing framebuffer sizes
|
||||||
NVML_DEVICE_VGPU_CAP_READ_DEVICE_BUFFER_BW = 3, //!< GPU device's read_device_buffer expected bandwidth capacity in megabytes per second
|
NVML_DEVICE_VGPU_CAP_READ_DEVICE_BUFFER_BW = 3, //!< Query the GPU's read_device_buffer expected bandwidth capacity in megabytes per second
|
||||||
NVML_DEVICE_VGPU_CAP_WRITE_DEVICE_BUFFER_BW = 4, //!< GPU device's write_device_buffer expected bandwidth capacity in megabytes per second
|
NVML_DEVICE_VGPU_CAP_WRITE_DEVICE_BUFFER_BW = 4, //!< Query the GPU's write_device_buffer expected bandwidth capacity in megabytes per second
|
||||||
|
NVML_DEVICE_VGPU_CAP_DEVICE_STREAMING = 5, //!< Query if vGPU profiles on the GPU supports migration data streaming
|
||||||
|
NVML_DEVICE_VGPU_CAP_MINI_QUARTER_GPU = 6, //!< Set/Get support for mini-quarter vGPU profiles
|
||||||
|
NVML_DEVICE_VGPU_CAP_COMPUTE_MEDIA_ENGINE_GPU = 7, //!< Set/Get support for compute media engine vGPU profiles
|
||||||
// Keep this last
|
// Keep this last
|
||||||
NVML_DEVICE_VGPU_CAP_COUNT
|
NVML_DEVICE_VGPU_CAP_COUNT
|
||||||
} nvmlDeviceVgpuCapability_t;
|
} nvmlDeviceVgpuCapability_t;
|
||||||
@@ -1181,6 +1213,8 @@ typedef enum nvmlDeviceVgpuCapability_enum
|
|||||||
|
|
||||||
#define INVALID_GPU_INSTANCE_ID 0xFFFFFFFF
|
#define INVALID_GPU_INSTANCE_ID 0xFFFFFFFF
|
||||||
|
|
||||||
|
#define NVML_INVALID_VGPU_PLACEMENT_ID 0xFFFF
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Macros for vGPU instance's virtualization capabilities bitfield.
|
* Macros for vGPU instance's virtualization capabilities bitfield.
|
||||||
*/
|
*/
|
||||||
@@ -1207,6 +1241,41 @@ typedef unsigned int nvmlVgpuTypeId_t;
|
|||||||
|
|
||||||
typedef unsigned int nvmlVgpuInstance_t;
|
typedef unsigned int nvmlVgpuInstance_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure to store the vGPU heterogeneous mode of device -- version 1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned int version; //!< The version number of this struct
|
||||||
|
unsigned int mode; //!< The vGPU heterogeneous mode
|
||||||
|
} nvmlVgpuHeterogeneousMode_v1_t;
|
||||||
|
typedef nvmlVgpuHeterogeneousMode_v1_t nvmlVgpuHeterogeneousMode_t;
|
||||||
|
#define nvmlVgpuHeterogeneousMode_v1 NVML_STRUCT_VERSION(VgpuHeterogeneousMode, 1)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure to store the placement ID of vGPU instance -- version 1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned int version; //!< The version number of this struct
|
||||||
|
unsigned int placementId; //!< Placement ID of the active vGPU instance
|
||||||
|
} nvmlVgpuPlacementId_v1_t;
|
||||||
|
typedef nvmlVgpuPlacementId_v1_t nvmlVgpuPlacementId_t;
|
||||||
|
#define nvmlVgpuPlacementId_v1 NVML_STRUCT_VERSION(VgpuPlacementId, 1)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure to store the list of vGPU placements -- version 1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned int version; //!< The version number of this struct
|
||||||
|
unsigned int placementSize; //!< The number of slots occupied by the vGPU type
|
||||||
|
unsigned int count; //!< Count of placement IDs fetched
|
||||||
|
unsigned int *placementIds; //!< Placement IDs for the vGPU type
|
||||||
|
} nvmlVgpuPlacementList_v1_t;
|
||||||
|
typedef nvmlVgpuPlacementList_v1_t nvmlVgpuPlacementList_t;
|
||||||
|
#define nvmlVgpuPlacementList_v1 NVML_STRUCT_VERSION(VgpuPlacementList, 1)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Structure to store Utilization Value and vgpuInstance
|
* Structure to store Utilization Value and vgpuInstance
|
||||||
*/
|
*/
|
||||||
@@ -1220,6 +1289,35 @@ typedef struct nvmlVgpuInstanceUtilizationSample_st
|
|||||||
nvmlValue_t decUtil; //!< Decoder Util Value
|
nvmlValue_t decUtil; //!< Decoder Util Value
|
||||||
} nvmlVgpuInstanceUtilizationSample_t;
|
} nvmlVgpuInstanceUtilizationSample_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure to store Utilization Value and vgpuInstance Info -- Version 1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned long long timeStamp; //!< CPU Timestamp in microseconds
|
||||||
|
nvmlVgpuInstance_t vgpuInstance; //!< vGPU Instance
|
||||||
|
nvmlValue_t smUtil; //!< SM (3D/Compute) Util Value
|
||||||
|
nvmlValue_t memUtil; //!< Frame Buffer Memory Util Value
|
||||||
|
nvmlValue_t encUtil; //!< Encoder Util Value
|
||||||
|
nvmlValue_t decUtil; //!< Decoder Util Value
|
||||||
|
nvmlValue_t jpgUtil; //!< Jpeg Util Value
|
||||||
|
nvmlValue_t ofaUtil; //!< Ofa Util Value
|
||||||
|
} nvmlVgpuInstanceUtilizationInfo_v1_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure to store recent utilization for vGPU instances running on a device -- version 1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned int version; //!< The version number of this struct
|
||||||
|
nvmlValueType_t sampleValType; //!< Hold the type of returned sample values
|
||||||
|
unsigned int vgpuInstanceCount; //!< Hold the number of vGPU instances
|
||||||
|
unsigned long long lastSeenTimeStamp; //!< Return only samples with timestamp greater than lastSeenTimeStamp
|
||||||
|
nvmlVgpuInstanceUtilizationInfo_v1_t *vgpuUtilArray; //!< The array (allocated by caller) in which vGPU utilization are returned
|
||||||
|
} nvmlVgpuInstancesUtilizationInfo_v1_t;
|
||||||
|
typedef nvmlVgpuInstancesUtilizationInfo_v1_t nvmlVgpuInstancesUtilizationInfo_t;
|
||||||
|
#define nvmlVgpuInstancesUtilizationInfo_v1 NVML_STRUCT_VERSION(VgpuInstancesUtilizationInfo, 1)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Structure to store Utilization Value, vgpuInstance and subprocess information
|
* Structure to store Utilization Value, vgpuInstance and subprocess information
|
||||||
*/
|
*/
|
||||||
@@ -1235,6 +1333,36 @@ typedef struct nvmlVgpuProcessUtilizationSample_st
|
|||||||
unsigned int decUtil; //!< Decoder Util Value
|
unsigned int decUtil; //!< Decoder Util Value
|
||||||
} nvmlVgpuProcessUtilizationSample_t;
|
} nvmlVgpuProcessUtilizationSample_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure to store Utilization Value, vgpuInstance and subprocess information for process running on vGPU instance -- version 1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char processName[NVML_VGPU_NAME_BUFFER_SIZE]; //!< Name of process running within the vGPU VM
|
||||||
|
unsigned long long timeStamp; //!< CPU Timestamp in microseconds
|
||||||
|
nvmlVgpuInstance_t vgpuInstance; //!< vGPU Instance
|
||||||
|
unsigned int pid; //!< PID of process running within the vGPU VM
|
||||||
|
unsigned int smUtil; //!< SM (3D/Compute) Util Value
|
||||||
|
unsigned int memUtil; //!< Frame Buffer Memory Util Value
|
||||||
|
unsigned int encUtil; //!< Encoder Util Value
|
||||||
|
unsigned int decUtil; //!< Decoder Util Value
|
||||||
|
unsigned int jpgUtil; //!< Jpeg Util Value
|
||||||
|
unsigned int ofaUtil; //!< Ofa Util Value
|
||||||
|
} nvmlVgpuProcessUtilizationInfo_v1_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure to store recent utilization, vgpuInstance and subprocess information for processes running on vGPU instances active on a device -- version 1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned int version; //!< The version number of this struct
|
||||||
|
unsigned int vgpuProcessCount; //!< Hold the number of processes running on vGPU instances
|
||||||
|
unsigned long long lastSeenTimeStamp; //!< Return only samples with timestamp greater than lastSeenTimeStamp
|
||||||
|
nvmlVgpuProcessUtilizationInfo_v1_t *vgpuProcUtilArray; //!< The array (allocated by caller) in which utilization of processes running on vGPU instances are returned
|
||||||
|
} nvmlVgpuProcessesUtilizationInfo_v1_t;
|
||||||
|
typedef nvmlVgpuProcessesUtilizationInfo_v1_t nvmlVgpuProcessesUtilizationInfo_t;
|
||||||
|
#define nvmlVgpuProcessesUtilizationInfo_v1 NVML_STRUCT_VERSION(VgpuProcessesUtilizationInfo, 1)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* vGPU scheduler policies
|
* vGPU scheduler policies
|
||||||
*/
|
*/
|
||||||
@@ -1392,6 +1520,34 @@ typedef struct nvmlProcessUtilizationSample_st
|
|||||||
unsigned int decUtil; //!< Decoder Util Value
|
unsigned int decUtil; //!< Decoder Util Value
|
||||||
} nvmlProcessUtilizationSample_t;
|
} nvmlProcessUtilizationSample_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure to store utilization value and process Id -- version 1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned long long timeStamp; //!< CPU Timestamp in microseconds
|
||||||
|
unsigned int pid; //!< PID of process
|
||||||
|
unsigned int smUtil; //!< SM (3D/Compute) Util Value
|
||||||
|
unsigned int memUtil; //!< Frame Buffer Memory Util Value
|
||||||
|
unsigned int encUtil; //!< Encoder Util Value
|
||||||
|
unsigned int decUtil; //!< Decoder Util Value
|
||||||
|
unsigned int jpgUtil; //!< Jpeg Util Value
|
||||||
|
unsigned int ofaUtil; //!< Ofa Util Value
|
||||||
|
} nvmlProcessUtilizationInfo_v1_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure to store utilization and process ID for each running process -- version 1
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned int version; //!< The version number of this struct
|
||||||
|
unsigned int processSamplesCount; //!< Caller-supplied array size, and returns number of processes running
|
||||||
|
unsigned long long lastSeenTimeStamp; //!< Return only samples with timestamp greater than lastSeenTimeStamp
|
||||||
|
nvmlProcessUtilizationInfo_v1_t *procUtilArray; //!< The array (allocated by caller) of the utilization of GPU SM, framebuffer, video encoder, video decoder, JPEG, and OFA
|
||||||
|
} nvmlProcessesUtilizationInfo_v1_t;
|
||||||
|
typedef nvmlProcessesUtilizationInfo_v1_t nvmlProcessesUtilizationInfo_t;
|
||||||
|
#define nvmlProcessesUtilizationInfo_v1 NVML_STRUCT_VERSION(ProcessesUtilizationInfo, 1)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Structure to store license expiry date and time values
|
* Structure to store license expiry date and time values
|
||||||
*/
|
*/
|
||||||
@@ -1429,6 +1585,29 @@ typedef struct nvmlGridLicensableFeatures_st
|
|||||||
nvmlGridLicensableFeature_t gridLicensableFeatures[NVML_GRID_LICENSE_FEATURE_MAX_COUNT]; //!< Array of vGPU software licensable features.
|
nvmlGridLicensableFeature_t gridLicensableFeatures[NVML_GRID_LICENSE_FEATURE_MAX_COUNT]; //!< Array of vGPU software licensable features.
|
||||||
} nvmlGridLicensableFeatures_t;
|
} nvmlGridLicensableFeatures_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Structure to store SRAM uncorrectable error counters
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned int version; //!< the API version number
|
||||||
|
unsigned long long aggregateUncParity; //!< aggregate uncorrectable parity error count
|
||||||
|
unsigned long long aggregateUncSecDed; //!< aggregate uncorrectable SEC-DED error count
|
||||||
|
unsigned long long aggregateCor; //!< aggregate correctable error count
|
||||||
|
unsigned long long volatileUncParity; //!< volatile uncorrectable parity error count
|
||||||
|
unsigned long long volatileUncSecDed; //!< volatile uncorrectable SEC-DED error count
|
||||||
|
unsigned long long volatileCor; //!< volatile correctable error count
|
||||||
|
unsigned long long aggregateUncBucketL2; //!< aggregate uncorrectable error count for L2 cache bucket
|
||||||
|
unsigned long long aggregateUncBucketSm; //!< aggregate uncorrectable error count for SM bucket
|
||||||
|
unsigned long long aggregateUncBucketPcie; //!< aggregate uncorrectable error count for PCIE bucket
|
||||||
|
unsigned long long aggregateUncBucketMcu; //!< aggregate uncorrectable error count for Microcontroller bucket
|
||||||
|
unsigned long long aggregateUncBucketOther; //!< aggregate uncorrectable error count for Other bucket
|
||||||
|
unsigned int bThresholdExceeded; //!< if the error threshold of field diag is exceeded
|
||||||
|
} nvmlEccSramErrorStatus_v1_t;
|
||||||
|
|
||||||
|
typedef nvmlEccSramErrorStatus_v1_t nvmlEccSramErrorStatus_t;
|
||||||
|
#define nvmlEccSramErrorStatus_v1 NVML_STRUCT_VERSION(EccSramErrorStatus, 1)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GSP firmware
|
* GSP firmware
|
||||||
*/
|
*/
|
||||||
@@ -1837,7 +2016,9 @@ typedef struct nvmlGpuDynamicPstatesInfo_st
|
|||||||
#define NVML_FI_DEV_TEMPERATURE_MEM_MAX_TLIMIT 195 //!< T.Limit temperature after which GPU may begin SW slowdown due to memory temperature
|
#define NVML_FI_DEV_TEMPERATURE_MEM_MAX_TLIMIT 195 //!< T.Limit temperature after which GPU may begin SW slowdown due to memory temperature
|
||||||
#define NVML_FI_DEV_TEMPERATURE_GPU_MAX_TLIMIT 196 //!< T.Limit temperature after which GPU may be throttled below base clock
|
#define NVML_FI_DEV_TEMPERATURE_GPU_MAX_TLIMIT 196 //!< T.Limit temperature after which GPU may be throttled below base clock
|
||||||
|
|
||||||
#define NVML_FI_MAX 197 //!< One greater than the largest field ID defined above
|
#define NVML_FI_DEV_IS_MIG_MODE_INDEPENDENT_MIG_QUERY_CAPABLE 199 //!< MIG mode independent, MIG query capable device. 1=yes. 0=no.
|
||||||
|
|
||||||
|
#define NVML_FI_MAX 200 //!< One greater than the largest field ID defined above
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Information for a Field Value Sample
|
* Information for a Field Value Sample
|
||||||
@@ -2248,9 +2429,10 @@ typedef struct nvmlAccountingStats_st {
|
|||||||
*/
|
*/
|
||||||
typedef enum nvmlEncoderQueryType_enum
|
typedef enum nvmlEncoderQueryType_enum
|
||||||
{
|
{
|
||||||
NVML_ENCODER_QUERY_H264 = 0, //!< H264 encoder
|
NVML_ENCODER_QUERY_H264 = 0x00, //!< H264 encoder
|
||||||
NVML_ENCODER_QUERY_HEVC = 1, //!< HEVC encoder
|
NVML_ENCODER_QUERY_HEVC = 0x01, //!< HEVC encoder
|
||||||
NVML_ENCODER_QUERY_AV1 = 2 //!< AV1 encoder
|
NVML_ENCODER_QUERY_AV1 = 0x02, //!< AV1 encoder
|
||||||
|
NVML_ENCODER_QUERY_UNKNOWN = 0xFF //!< Unknown encoder
|
||||||
}nvmlEncoderType_t;
|
}nvmlEncoderType_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2399,6 +2581,26 @@ typedef struct nvmlConfComputeSystemState_st {
|
|||||||
unsigned int devToolsMode;
|
unsigned int devToolsMode;
|
||||||
} nvmlConfComputeSystemState_t;
|
} nvmlConfComputeSystemState_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Confidential Compute Multigpu mode values
|
||||||
|
*/
|
||||||
|
#define NVML_CC_SYSTEM_MULTIGPU_NONE 0
|
||||||
|
#define NVML_CC_SYSTEM_MULTIGPU_PROTECTED_PCIE 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Confidential Compute System settings
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
unsigned int version;
|
||||||
|
unsigned int environment;
|
||||||
|
unsigned int ccFeature;
|
||||||
|
unsigned int devToolsMode;
|
||||||
|
unsigned int multiGpuMode;
|
||||||
|
} nvmlSystemConfComputeSettings_v1_t;
|
||||||
|
|
||||||
|
typedef nvmlSystemConfComputeSettings_v1_t nvmlSystemConfComputeSettings_t;
|
||||||
|
#define nvmlSystemConfComputeSettings_v1 NVML_STRUCT_VERSION(SystemConfComputeSettings, 1)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Protected memory size
|
* Protected memory size
|
||||||
*/
|
*/
|
||||||
@@ -2436,6 +2638,8 @@ typedef struct nvmlConfComputeGpuCertificate_st {
|
|||||||
#define NVML_CC_GPU_CEC_ATTESTATION_REPORT_SIZE 0x1000
|
#define NVML_CC_GPU_CEC_ATTESTATION_REPORT_SIZE 0x1000
|
||||||
#define NVML_CC_CEC_ATTESTATION_REPORT_NOT_PRESENT 0
|
#define NVML_CC_CEC_ATTESTATION_REPORT_NOT_PRESENT 0
|
||||||
#define NVML_CC_CEC_ATTESTATION_REPORT_PRESENT 1
|
#define NVML_CC_CEC_ATTESTATION_REPORT_PRESENT 1
|
||||||
|
#define NVML_CC_KEY_ROTATION_THRESHOLD_ATTACKER_ADVANTAGE_MIN 50
|
||||||
|
#define NVML_CC_KEY_ROTATION_THRESHOLD_ATTACKER_ADVANTAGE_MAX 75
|
||||||
|
|
||||||
typedef struct nvmlConfComputeGpuAttestationReport_st {
|
typedef struct nvmlConfComputeGpuAttestationReport_st {
|
||||||
unsigned int isCecAttestationReportPresent;
|
unsigned int isCecAttestationReportPresent;
|
||||||
@@ -2446,6 +2650,24 @@ typedef struct nvmlConfComputeGpuAttestationReport_st {
|
|||||||
unsigned char cecAttestationReport[NVML_CC_GPU_CEC_ATTESTATION_REPORT_SIZE];
|
unsigned char cecAttestationReport[NVML_CC_GPU_CEC_ATTESTATION_REPORT_SIZE];
|
||||||
} nvmlConfComputeGpuAttestationReport_t;
|
} nvmlConfComputeGpuAttestationReport_t;
|
||||||
|
|
||||||
|
typedef struct nvmlConfComputeSetKeyRotationThresholdInfo_st {
|
||||||
|
unsigned int version;
|
||||||
|
unsigned long long maxAttackerAdvantage;
|
||||||
|
} nvmlConfComputeSetKeyRotationThresholdInfo_v1_t;
|
||||||
|
|
||||||
|
typedef nvmlConfComputeSetKeyRotationThresholdInfo_v1_t nvmlConfComputeSetKeyRotationThresholdInfo_t;
|
||||||
|
#define nvmlConfComputeSetKeyRotationThresholdInfo_v1 \
|
||||||
|
NVML_STRUCT_VERSION(ConfComputeSetKeyRotationThresholdInfo, 1)
|
||||||
|
|
||||||
|
typedef struct nvmlConfComputeGetKeyRotationThresholdInfo_st {
|
||||||
|
unsigned int version;
|
||||||
|
unsigned long long attackerAdvantage;
|
||||||
|
} nvmlConfComputeGetKeyRotationThresholdInfo_v1_t;
|
||||||
|
|
||||||
|
typedef nvmlConfComputeGetKeyRotationThresholdInfo_v1_t nvmlConfComputeGetKeyRotationThresholdInfo_t;
|
||||||
|
#define nvmlConfComputeGetKeyRotationThresholdInfo_v1 \
|
||||||
|
NVML_STRUCT_VERSION(ConfComputeGetKeyRotationThresholdInfo, 1)
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
#define NVML_GPU_FABRIC_UUID_LEN 16
|
#define NVML_GPU_FABRIC_UUID_LEN 16
|
||||||
@@ -2464,6 +2686,55 @@ typedef struct {
|
|||||||
nvmlGpuFabricState_t state; //!< Current state of GPU registration process
|
nvmlGpuFabricState_t state; //!< Current state of GPU registration process
|
||||||
} nvmlGpuFabricInfo_t;
|
} nvmlGpuFabricInfo_t;
|
||||||
|
|
||||||
|
#define NVML_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_NOT_SUPPORTED 0
|
||||||
|
#define NVML_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_TRUE 1
|
||||||
|
#define NVML_GPU_FABRIC_HEALTH_MASK_DEGRADED_BW_FALSE 2
|
||||||
|
|
||||||
|
#define NVML_GPU_FABRIC_HEALTH_MASK_SHIFT_DEGRADED_BW 0
|
||||||
|
#define NVML_GPU_FABRIC_HEALTH_MASK_WIDTH_DEGRADED_BW 0x11
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GPU Fabric Health Status Mask for various fields can be obtained
|
||||||
|
* using the below macro.
|
||||||
|
* Ex - NVML_GPU_FABRIC_HEALTH_GET(var, _DEGRADED_BW)
|
||||||
|
*/
|
||||||
|
#define NVML_GPU_FABRIC_HEALTH_GET(var, type) \
|
||||||
|
(((var) >> NVML_GPU_FABRIC_HEALTH_MASK_SHIFT##type) & \
|
||||||
|
(NVML_GPU_FABRIC_HEALTH_MASK_WIDTH##type))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GPU Fabric Health Status Mask for various fields can be tested
|
||||||
|
* using the below macro.
|
||||||
|
* Ex - NVML_GPU_FABRIC_HEALTH_TEST(var, _DEGRADED_BW, _TRUE)
|
||||||
|
*/
|
||||||
|
#define NVML_GPU_FABRIC_HEALTH_TEST(var, type, val) \
|
||||||
|
(NVML_GPU_FABRIC_HEALTH_GET(var, type) == \
|
||||||
|
NVML_GPU_FABRIC_HEALTH_MASK##type##val)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GPU Fabric information (v2).
|
||||||
|
*
|
||||||
|
* Version 2 adds the \ref nvmlGpuFabricInfo_v2_t.version field
|
||||||
|
* to the start of the structure, and the \ref nvmlGpuFabricInfo_v2_t.healthMask
|
||||||
|
* field to the end. This structure is not backwards-compatible with
|
||||||
|
* \ref nvmlGpuFabricInfo_t.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
unsigned int version; //!< Structure version identifier (set to \ref nvmlGpuFabricInfo_v2)
|
||||||
|
unsigned char clusterUuid[NVML_GPU_FABRIC_UUID_LEN]; //!< Uuid of the cluster to which this GPU belongs
|
||||||
|
nvmlReturn_t status; //!< Error status, if any. Must be checked only if state returns "complete".
|
||||||
|
unsigned int cliqueId; //!< ID of the fabric clique to which this GPU belongs
|
||||||
|
nvmlGpuFabricState_t state; //!< Current state of GPU registration process
|
||||||
|
unsigned int healthMask; //!< GPU Fabric health Status Mask
|
||||||
|
} nvmlGpuFabricInfo_v2_t;
|
||||||
|
|
||||||
|
typedef nvmlGpuFabricInfo_v2_t nvmlGpuFabricInfoV_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Version identifier value for \ref nvmlGpuFabricInfo_v2_t.version.
|
||||||
|
*/
|
||||||
|
#define nvmlGpuFabricInfo_v2 NVML_STRUCT_VERSION(GpuFabricInfo, 2)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Device Scope - This is useful to retrieve the telemetry at GPU and module (e.g. GPU + CPU) level
|
* Device Scope - This is useful to retrieve the telemetry at GPU and module (e.g. GPU + CPU) level
|
||||||
*/
|
*/
|
||||||
@@ -3414,6 +3685,19 @@ nvmlReturn_t DECLDIR nvmlDeviceSetCpuAffinity(nvmlDevice_t device);
|
|||||||
*/
|
*/
|
||||||
nvmlReturn_t DECLDIR nvmlDeviceClearCpuAffinity(nvmlDevice_t device);
|
nvmlReturn_t DECLDIR nvmlDeviceClearCpuAffinity(nvmlDevice_t device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the NUMA node of the given GPU device.
|
||||||
|
* This only applies to platforms where the GPUs are NUMA nodes.
|
||||||
|
*
|
||||||
|
* @param[in] device The device handle
|
||||||
|
* @param[out] node NUMA node ID of the device
|
||||||
|
*
|
||||||
|
* @returns
|
||||||
|
* - \ref NVML_SUCCESS if the NUMA node is retrieved successfully
|
||||||
|
* - \ref NVML_ERROR_NOT_SUPPORTED if request is not supported on the current platform
|
||||||
|
* - \ref NVML_ERROR_INVALID_ARGUMENT if \a device \a node is invalid
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlDeviceGetNumaNodeId(nvmlDevice_t device, unsigned int *node);
|
||||||
/**
|
/**
|
||||||
* Retrieve the common ancestor for two devices
|
* Retrieve the common ancestor for two devices
|
||||||
* For all products.
|
* For all products.
|
||||||
@@ -3726,6 +4010,25 @@ nvmlReturn_t DECLDIR nvmlDeviceGetDisplayActive(nvmlDevice_t device, nvmlEnableS
|
|||||||
*/
|
*/
|
||||||
nvmlReturn_t DECLDIR nvmlDeviceGetPersistenceMode(nvmlDevice_t device, nvmlEnableState_t *mode);
|
nvmlReturn_t DECLDIR nvmlDeviceGetPersistenceMode(nvmlDevice_t device, nvmlEnableState_t *mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves PCI attributes of this device.
|
||||||
|
*
|
||||||
|
* For all products.
|
||||||
|
*
|
||||||
|
* See \ref nvmlPciInfoExt_t for details on the available PCI info.
|
||||||
|
*
|
||||||
|
* @param device The identifier of the target device
|
||||||
|
* @param pci Reference in which to return the PCI info
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - \ref NVML_SUCCESS if \a pci has been populated
|
||||||
|
* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized
|
||||||
|
* - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a pci is NULL
|
||||||
|
* - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible
|
||||||
|
* - \ref NVML_ERROR_UNKNOWN on any unexpected error
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlDeviceGetPciInfoExt(nvmlDevice_t device, nvmlPciInfoExt_t *pci);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the PCI attributes of this device.
|
* Retrieves the PCI attributes of this device.
|
||||||
*
|
*
|
||||||
@@ -5423,7 +5726,7 @@ nvmlReturn_t DECLDIR nvmlDeviceGetMPSComputeRunningProcesses_v3(nvmlDevice_t dev
|
|||||||
*
|
*
|
||||||
* To determine the size of the @ref plist->procArray array to allocate, call the function with
|
* To determine the size of the @ref plist->procArray array to allocate, call the function with
|
||||||
* @ref plist->numProcArrayEntries set to zero and @ref plist->procArray set to NULL. The return
|
* @ref plist->numProcArrayEntries set to zero and @ref plist->procArray set to NULL. The return
|
||||||
* code will be either NVML_ERROR_INSUFFICIENT_SIZE (if there are valid processes of type
|
* code will be either NVML_ERROR_INSUFFICIENT_SIZE (if there are valid processes of type
|
||||||
* @ref plist->mode to report on, in which case the @ref plist->numProcArrayEntries field will
|
* @ref plist->mode to report on, in which case the @ref plist->numProcArrayEntries field will
|
||||||
* indicate the required number of entries in the array) or NVML_SUCCESS (if no processes of type
|
* indicate the required number of entries in the array) or NVML_SUCCESS (if no processes of type
|
||||||
* @ref plist->mode exist).
|
* @ref plist->mode exist).
|
||||||
@@ -5708,7 +6011,7 @@ nvmlReturn_t DECLDIR nvmlDeviceGetPcieSpeed(nvmlDevice_t device, unsigned int *p
|
|||||||
*
|
*
|
||||||
* @param device The identifier of the target device
|
* @param device The identifier of the target device
|
||||||
* @param adaptiveClockStatus The current adaptive clocking status, either
|
* @param adaptiveClockStatus The current adaptive clocking status, either
|
||||||
* @ref NVML_ADAPTIVE_CLOCKING_INFO_STATUS_DISABLED
|
* @ref NVML_ADAPTIVE_CLOCKING_INFO_STATUS_DISABLED
|
||||||
* or @ref NVML_ADAPTIVE_CLOCKING_INFO_STATUS_ENABLED
|
* or @ref NVML_ADAPTIVE_CLOCKING_INFO_STATUS_ENABLED
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
@@ -5735,7 +6038,10 @@ nvmlReturn_t DECLDIR nvmlDeviceGetAdaptiveClockInfoStatus(nvmlDevice_t device, u
|
|||||||
*/
|
*/
|
||||||
nvmlReturn_t DECLDIR nvmlDeviceGetBusType(nvmlDevice_t device, nvmlBusType_t *type);
|
nvmlReturn_t DECLDIR nvmlDeviceGetBusType(nvmlDevice_t device, nvmlBusType_t *type);
|
||||||
|
|
||||||
/**
|
|
||||||
|
/**
|
||||||
|
* Deprecated: Will be deprecated in a future release. Use \ref nvmlDeviceGetGpuFabricInfoV instead
|
||||||
|
*
|
||||||
* Get fabric information associated with the device.
|
* Get fabric information associated with the device.
|
||||||
*
|
*
|
||||||
* %HOPPER_OR_NEWER%
|
* %HOPPER_OR_NEWER%
|
||||||
@@ -5746,6 +6052,7 @@ nvmlReturn_t DECLDIR nvmlDeviceGetBusType(nvmlDevice_t device, nvmlBusType_t *ty
|
|||||||
* This API reports the current state of the GPU in the NVLink fabric
|
* This API reports the current state of the GPU in the NVLink fabric
|
||||||
* along with other useful information.
|
* along with other useful information.
|
||||||
*
|
*
|
||||||
|
*
|
||||||
* @param device The identifier of the target device
|
* @param device The identifier of the target device
|
||||||
* @param gpuFabricInfo Information about GPU fabric state
|
* @param gpuFabricInfo Information about GPU fabric state
|
||||||
*
|
*
|
||||||
@@ -5755,6 +6062,30 @@ nvmlReturn_t DECLDIR nvmlDeviceGetBusType(nvmlDevice_t device, nvmlBusType_t *ty
|
|||||||
*/
|
*/
|
||||||
nvmlReturn_t DECLDIR nvmlDeviceGetGpuFabricInfo(nvmlDevice_t device, nvmlGpuFabricInfo_t *gpuFabricInfo);
|
nvmlReturn_t DECLDIR nvmlDeviceGetGpuFabricInfo(nvmlDevice_t device, nvmlGpuFabricInfo_t *gpuFabricInfo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Versioned wrapper around \ref nvmlDeviceGetGpuFabricInfo that accepts a versioned
|
||||||
|
* \ref nvmlGpuFabricInfo_v2_t or later output structure.
|
||||||
|
*
|
||||||
|
* @note The caller must set the \ref nvmlGpuFabricInfoV_t.version field to the
|
||||||
|
* appropriate version prior to calling this function. For example:
|
||||||
|
* \code
|
||||||
|
* nvmlGpuFabricInfoV_t fabricInfo =
|
||||||
|
* { .version = nvmlGpuFabricInfo_v2 };
|
||||||
|
* nvmlReturn_t result = nvmlDeviceGetGpuFabricInfoV(device,&fabricInfo);
|
||||||
|
* \endcode
|
||||||
|
*
|
||||||
|
* %HOPPER_OR_NEWER%
|
||||||
|
*
|
||||||
|
* @param device The identifier of the target device
|
||||||
|
* @param gpuFabricInfo Information about GPU fabric state
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - \ref NVML_SUCCESS Upon success
|
||||||
|
* - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't support gpu fabric
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlDeviceGetGpuFabricInfoV(nvmlDevice_t device,
|
||||||
|
nvmlGpuFabricInfoV_t *gpuFabricInfo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Conf Computing System capabilities.
|
* Get Conf Computing System capabilities.
|
||||||
*
|
*
|
||||||
@@ -5877,6 +6208,42 @@ nvmlReturn_t DECLDIR nvmlDeviceGetConfComputeGpuCertificate(nvmlDevice_t device,
|
|||||||
*/
|
*/
|
||||||
nvmlReturn_t DECLDIR nvmlDeviceGetConfComputeGpuAttestationReport(nvmlDevice_t device,
|
nvmlReturn_t DECLDIR nvmlDeviceGetConfComputeGpuAttestationReport(nvmlDevice_t device,
|
||||||
nvmlConfComputeGpuAttestationReport_t *gpuAtstReport);
|
nvmlConfComputeGpuAttestationReport_t *gpuAtstReport);
|
||||||
|
/**
|
||||||
|
* Get Conf Computing key rotation threshold detail.
|
||||||
|
*
|
||||||
|
* %HOPPER_OR_NEWER%
|
||||||
|
* Supported on Linux, Windows TCC.
|
||||||
|
*
|
||||||
|
* @param pKeyRotationThrInfo Reference in which to return the key rotation threshold data
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - \ref NVML_SUCCESS if \a gpu key rotation threshold info has been populated
|
||||||
|
* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized
|
||||||
|
* - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a memory is NULL
|
||||||
|
* - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device
|
||||||
|
* - \ref NVML_ERROR_UNKNOWN on any unexpected error
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlSystemGetConfComputeKeyRotationThresholdInfo(
|
||||||
|
nvmlConfComputeGetKeyRotationThresholdInfo_t *pKeyRotationThrInfo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Conf Computing System Settings.
|
||||||
|
*
|
||||||
|
* %HOPPER_OR_NEWER%
|
||||||
|
* Supported on Linux, Windows TCC.
|
||||||
|
*
|
||||||
|
* @param settings System CC settings
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - \ref NVML_SUCCESS if the query is success
|
||||||
|
* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized
|
||||||
|
* - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a counters is NULL
|
||||||
|
* - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature
|
||||||
|
* - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible
|
||||||
|
* - \ref NVML_ERROR_ARGUMENT_VERSION_MISMATCH if the provided version is invalid/unsupported
|
||||||
|
* - \ref NVML_ERROR_UNKNOWN on any unexpected error
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlSystemGetConfComputeSettings(nvmlSystemConfComputeSettings_t *settings);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve GSP firmware version.
|
* Retrieve GSP firmware version.
|
||||||
@@ -6241,6 +6608,52 @@ nvmlReturn_t DECLDIR nvmlDeviceGetClkMonStatus(nvmlDevice_t device, nvmlClkMonSt
|
|||||||
nvmlReturn_t DECLDIR nvmlDeviceGetProcessUtilization(nvmlDevice_t device, nvmlProcessUtilizationSample_t *utilization,
|
nvmlReturn_t DECLDIR nvmlDeviceGetProcessUtilization(nvmlDevice_t device, nvmlProcessUtilizationSample_t *utilization,
|
||||||
unsigned int *processSamplesCount, unsigned long long lastSeenTimeStamp);
|
unsigned int *processSamplesCount, unsigned long long lastSeenTimeStamp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the recent utilization and process ID for all running processes
|
||||||
|
*
|
||||||
|
* For Maxwell &tm; or newer fully supported devices.
|
||||||
|
*
|
||||||
|
* Reads recent utilization of GPU SM (3D/Compute), framebuffer, video encoder, and video decoder, jpeg decoder, OFA (Optical Flow Accelerator)
|
||||||
|
* for all running processes. Utilization values are returned as an array of utilization sample structures in the caller-supplied buffer pointed at
|
||||||
|
* by \a procesesUtilInfo->procUtilArray. One utilization sample structure is returned per process running, that had some non-zero utilization
|
||||||
|
* during the last sample period. It includes the CPU timestamp at which the samples were recorded. Individual utilization values
|
||||||
|
* are returned as "unsigned int" values.
|
||||||
|
*
|
||||||
|
* The caller should allocate a buffer of size processSamplesCount * sizeof(nvmlProcessUtilizationInfo_t). If the buffer is too small, the API will
|
||||||
|
* return \a NVML_ERROR_INSUFFICIENT_SIZE, with the recommended minimal buffer size at \a procesesUtilInfo->processSamplesCount. The caller should
|
||||||
|
* invoke the function again with the allocated buffer passed in \a procesesUtilInfo->procUtilArray, and \a procesesUtilInfo->processSamplesCount
|
||||||
|
* set to the number no less than the recommended value by the previous API return.
|
||||||
|
*
|
||||||
|
* On successful return, the function updates \a procesesUtilInfo->processSamplesCount with the number of process utilization info structures
|
||||||
|
* that were actually written. This may differ from a previously read value as instances are created or destroyed.
|
||||||
|
*
|
||||||
|
* \a procesesUtilInfo->lastSeenTimeStamp represents the CPU timestamp in microseconds at which utilization samples were last read. Set it to 0
|
||||||
|
* to read utilization based on all the samples maintained by the driver's internal sample buffer. Set \a procesesUtilInfo->lastSeenTimeStamp
|
||||||
|
* to a timeStamp retrieved from a previous query to read utilization since the previous query.
|
||||||
|
*
|
||||||
|
* \a procesesUtilInfo->version is the version number of the structure nvmlProcessesUtilizationInfo_t, the caller should set the correct version
|
||||||
|
* number to retrieve the specific version of processes utilization information.
|
||||||
|
*
|
||||||
|
* @note On MIG-enabled GPUs, querying process utilization is not currently supported.
|
||||||
|
*
|
||||||
|
* @param device The identifier of the target device
|
||||||
|
* @param procesesUtilInfo Pointer to the caller-provided structure of nvmlProcessesUtilizationInfo_t.
|
||||||
|
|
||||||
|
* @return
|
||||||
|
* - \ref NVML_SUCCESS if \a procesesUtilInfo->procUtilArray has been populated
|
||||||
|
* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized
|
||||||
|
* - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a procesesUtilInfo is NULL
|
||||||
|
* - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature
|
||||||
|
* - \ref NVML_ERROR_NOT_FOUND if sample entries are not found
|
||||||
|
* - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible
|
||||||
|
* - \ref NVML_ERROR_VERSION_MISMATCH if the version of \a procesesUtilInfo is invalid
|
||||||
|
* - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a procesesUtilInfo->procUtilArray is NULL, or the buffer size of procesesUtilInfo->procUtilArray is too small.
|
||||||
|
* The caller should check the minimul array size from the returned procesesUtilInfo->processSamplesCount, and call
|
||||||
|
* the function again with a buffer no smaller than procesesUtilInfo->processSamplesCount * sizeof(nvmlProcessUtilizationInfo_t)
|
||||||
|
* - \ref NVML_ERROR_UNKNOWN on any unexpected error
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlDeviceGetProcessesUtilizationInfo(nvmlDevice_t device, nvmlProcessesUtilizationInfo_t *procesesUtilInfo);
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
/***************************************************************************************************/
|
/***************************************************************************************************/
|
||||||
@@ -6960,6 +7373,30 @@ nvmlReturn_t DECLDIR nvmlDeviceSetConfComputeUnprotectedMemSize(nvmlDevice_t dev
|
|||||||
*/
|
*/
|
||||||
nvmlReturn_t DECLDIR nvmlSystemSetConfComputeGpusReadyState(unsigned int isAcceptingWork);
|
nvmlReturn_t DECLDIR nvmlSystemSetConfComputeGpusReadyState(unsigned int isAcceptingWork);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set Conf Computing key rotation threshold.
|
||||||
|
*
|
||||||
|
* %HOPPER_OR_NEWER%
|
||||||
|
* Supported on Linux, Windows TCC.
|
||||||
|
*
|
||||||
|
* This function is to set the confidential compute key rotation threshold parameters.
|
||||||
|
* @ref pKeyRotationThrInfo->maxAttackerAdvantage should be in the range from
|
||||||
|
* NVML_CC_KEY_ROTATION_THRESHOLD_ATTACKER_ADVANTAGE_MIN to NVML_CC_KEY_ROTATION_THRESHOLD_ATTACKER_ADVANTAGE_MAX.
|
||||||
|
* Default value is 60.
|
||||||
|
*
|
||||||
|
* @param pKeyRotationThrInfo Reference to the key rotation threshold data
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - \ref NVML_SUCCESS if \a key rotation threashold max attacker advantage has been set
|
||||||
|
* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized
|
||||||
|
* - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a memory is NULL
|
||||||
|
* - \ref NVML_ERROR_INVALID_STATE if confidential compute GPU ready state is enabled
|
||||||
|
* - \ref NVML_ERROR_NOT_SUPPORTED if this query is not supported by the device
|
||||||
|
* - \ref NVML_ERROR_UNKNOWN on any unexpected error
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlSystemSetConfComputeKeyRotationThresholdInfo(
|
||||||
|
nvmlConfComputeSetKeyRotationThresholdInfo_t *pKeyRotationThrInfo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
@@ -7648,15 +8085,180 @@ nvmlReturn_t DECLDIR nvmlDeviceGetHostVgpuMode(nvmlDevice_t device, nvmlHostVgpu
|
|||||||
* @param virtualMode virtualization mode. One of NVML_GPU_VIRTUALIZATION_?
|
* @param virtualMode virtualization mode. One of NVML_GPU_VIRTUALIZATION_?
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
* - \ref NVML_SUCCESS if \a pVirtualMode is set
|
* - \ref NVML_SUCCESS if \a virtualMode is set
|
||||||
* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized
|
* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized
|
||||||
* - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a pVirtualMode is NULL
|
* - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a virtualMode is NULL
|
||||||
* - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible
|
* - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible
|
||||||
* - \ref NVML_ERROR_NOT_SUPPORTED if setting of virtualization mode is not supported.
|
* - \ref NVML_ERROR_NOT_SUPPORTED if setting of virtualization mode is not supported.
|
||||||
* - \ref NVML_ERROR_NO_PERMISSION if setting of virtualization mode is not allowed for this client.
|
* - \ref NVML_ERROR_NO_PERMISSION if setting of virtualization mode is not allowed for this client.
|
||||||
*/
|
*/
|
||||||
nvmlReturn_t DECLDIR nvmlDeviceSetVirtualizationMode(nvmlDevice_t device, nvmlGpuVirtualizationMode_t virtualMode);
|
nvmlReturn_t DECLDIR nvmlDeviceSetVirtualizationMode(nvmlDevice_t device, nvmlGpuVirtualizationMode_t virtualMode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the vGPU heterogeneous mode for the device.
|
||||||
|
*
|
||||||
|
* When in heterogeneous mode, a vGPU can concurrently host timesliced vGPUs with differing framebuffer sizes.
|
||||||
|
*
|
||||||
|
* On successful return, the function returns \a pHeterogeneousMode->mode with the current vGPU heterogeneous mode.
|
||||||
|
* \a pHeterogeneousMode->version is the version number of the structure nvmlVgpuHeterogeneousMode_t, the caller should
|
||||||
|
* set the correct version number to retrieve the vGPU heterogeneous mode.
|
||||||
|
* \a pHeterogeneousMode->mode can either be \ref NVML_FEATURE_ENABLED or \ref NVML_FEATURE_DISABLED.
|
||||||
|
*
|
||||||
|
* @param device The identifier of the target device
|
||||||
|
* @param pHeterogeneousMode Pointer to the caller-provided structure of nvmlVgpuHeterogeneousMode_t
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - \ref NVML_SUCCESS Upon success
|
||||||
|
* - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized
|
||||||
|
* - \ref NVML_ERROR_INVALID_ARGUMENT If \a device is invalid or \a pHeterogeneousMode is NULL
|
||||||
|
* - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't support this feature
|
||||||
|
* - \ref NVML_ERROR_VERSION_MISMATCH If the version of \a pHeterogeneousMode is invalid
|
||||||
|
* - \ref NVML_ERROR_UNKNOWN On any unexpected error
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlDeviceGetVgpuHeterogeneousMode(nvmlDevice_t device, nvmlVgpuHeterogeneousMode_t *pHeterogeneousMode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable or disable vGPU heterogeneous mode for the device.
|
||||||
|
*
|
||||||
|
* When in heterogeneous mode, a vGPU can concurrently host timesliced vGPUs with differing framebuffer sizes.
|
||||||
|
*
|
||||||
|
* API would return an appropriate error code upon unsuccessful activation. For example, the heterogeneous mode
|
||||||
|
* set will fail with error \ref NVML_ERROR_IN_USE if any vGPU instance is active on the device. The caller of this API
|
||||||
|
* is expected to shutdown the vGPU VMs and retry setting the \a mode.
|
||||||
|
* On successful return, the function updates the vGPU heterogeneous mode with the user provided \a pHeterogeneousMode->mode.
|
||||||
|
* \a pHeterogeneousMode->version is the version number of the structure nvmlVgpuHeterogeneousMode_t, the caller should
|
||||||
|
* set the correct version number to set the vGPU heterogeneous mode.
|
||||||
|
*
|
||||||
|
* @param device Identifier of the target device
|
||||||
|
* @param pHeterogeneousMode Pointer to the caller-provided structure of nvmlVgpuHeterogeneousMode_t
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - \ref NVML_SUCCESS Upon success
|
||||||
|
* - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized
|
||||||
|
* - \ref NVML_ERROR_INVALID_ARGUMENT If \a device or \a pHeterogeneousMode is NULL or \a pHeterogeneousMode->mode is invalid
|
||||||
|
* - \ref NVML_ERROR_IN_USE If the \a device is in use
|
||||||
|
* - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation
|
||||||
|
* - \ref NVML_ERROR_NOT_SUPPORTED If MIG is enabled or \a device doesn't support this feature
|
||||||
|
* - \ref NVML_ERROR_VERSION_MISMATCH If the version of \a pHeterogeneousMode is invalid
|
||||||
|
* - \ref NVML_ERROR_UNKNOWN On any unexpected error
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlDeviceSetVgpuHeterogeneousMode(nvmlDevice_t device, const nvmlVgpuHeterogeneousMode_t *pHeterogeneousMode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query the placement ID of active vGPU instance.
|
||||||
|
*
|
||||||
|
* When in vGPU heterogeneous mode, this function returns a valid placement ID as \a pPlacement->placementId
|
||||||
|
* else NVML_INVALID_VGPU_PLACEMENT_ID is returned.
|
||||||
|
* \a pPlacement->version is the version number of the structure nvmlVgpuPlacementId_t, the caller should
|
||||||
|
* set the correct version number to get placement id of the vGPU instance \a vgpuInstance.
|
||||||
|
*
|
||||||
|
* @param vgpuInstance Identifier of the target vGPU instance
|
||||||
|
* @param pPlacement Pointer to vGPU placement ID structure \a nvmlVgpuPlacementId_t
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - \ref NVML_SUCCESS If information is successfully retrieved
|
||||||
|
* - \ref NVML_ERROR_NOT_FOUND If \a vgpuInstance does not match a valid active vGPU instance
|
||||||
|
* - \ref NVML_ERROR_INVALID_ARGUMENT If \a vgpuInstance is invalid or \a pPlacement is NULL
|
||||||
|
* - \ref NVML_ERROR_VERSION_MISMATCH If the version of \a pPlacement is invalid
|
||||||
|
* - \ref NVML_ERROR_UNKNOWN On any unexpected error
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlVgpuInstanceGetPlacementId(nvmlVgpuInstance_t vgpuInstance, nvmlVgpuPlacementId_t *pPlacement);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query the supported vGPU placement ID of the vGPU type.
|
||||||
|
*
|
||||||
|
* An array of supported vGPU placement IDs for the vGPU type ID indicated by \a vgpuTypeId is returned in the
|
||||||
|
* caller-supplied buffer of \a pPlacementList->placementIds. Memory needed for the placementIds array should be
|
||||||
|
* allocated based on maximum instances of a vGPU type which can be queried via \ref nvmlVgpuTypeGetMaxInstances().
|
||||||
|
*
|
||||||
|
* This function will return supported placement IDs even if GPU is not in vGPU heterogeneous mode.
|
||||||
|
*
|
||||||
|
* @param device Identifier of the target device
|
||||||
|
* @param vgpuTypeId Handle to vGPU type. The vGPU type ID
|
||||||
|
* @param pPlacementList Pointer to the vGPU placement structure \a nvmlVgpuPlacementList_t
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - \ref NVML_SUCCESS Upon success
|
||||||
|
* - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized
|
||||||
|
* - \ref NVML_ERROR_INVALID_ARGUMENT If \a device or \a vgpuTypeId is invalid or \a pPlacementList is NULL
|
||||||
|
* - \ref NVML_ERROR_NOT_SUPPORTED If \a device or \a vgpuTypeId isn't supported
|
||||||
|
* - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation
|
||||||
|
* - \ref NVML_ERROR_VERSION_MISMATCH If the version of \a pPlacementList is invalid
|
||||||
|
* - \ref NVML_ERROR_UNKNOWN On any unexpected error
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlDeviceGetVgpuTypeSupportedPlacements(nvmlDevice_t device, nvmlVgpuTypeId_t vgpuTypeId, nvmlVgpuPlacementList_t *pPlacementList);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query the creatable vGPU placement ID of the vGPU type.
|
||||||
|
*
|
||||||
|
* An array of creatable vGPU placement IDs for the vGPU type ID indicated by \a vgpuTypeId is returned in the
|
||||||
|
* caller-supplied buffer of \a pPlacementList->placementIds. Memory needed for the placementIds array should be
|
||||||
|
* allocated based on maximum instances of a vGPU type which can be queried via \ref nvmlVgpuTypeGetMaxInstances().
|
||||||
|
* The creatable vGPU placement IDs may differ over time, as there may be restrictions on what type of vGPU the
|
||||||
|
* vGPU instance is running.
|
||||||
|
*
|
||||||
|
* The function will return \ref NVML_ERROR_NOT_SUPPORTED if the \a device is not in vGPU heterogeneous mode.
|
||||||
|
*
|
||||||
|
* @param device The identifier of the target device
|
||||||
|
* @param vgpuTypeId Handle to vGPU type. The vGPU type ID
|
||||||
|
* @param pPlacementList Pointer to the list of vGPU placement structure \a nvmlVgpuPlacementList_t
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - \ref NVML_SUCCESS Upon success
|
||||||
|
* - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized
|
||||||
|
* - \ref NVML_ERROR_INVALID_ARGUMENT If \a device or \a vgpuTypeId is invalid or \a pPlacementList is NULL
|
||||||
|
* - \ref NVML_ERROR_NOT_SUPPORTED If \a device or \a vgpuTypeId isn't supported
|
||||||
|
* - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation
|
||||||
|
* - \ref NVML_ERROR_VERSION_MISMATCH If the version of \a pPlacementList is invalid
|
||||||
|
* - \ref NVML_ERROR_UNKNOWN On any unexpected error
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlDeviceGetVgpuTypeCreatablePlacements(nvmlDevice_t device, nvmlVgpuTypeId_t vgpuTypeId, nvmlVgpuPlacementList_t *pPlacementList);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the static GSP heap size of the vGPU type in bytes
|
||||||
|
*
|
||||||
|
* @param vgpuTypeId Handle to vGPU type
|
||||||
|
* @param gspHeapSize Reference to return the GSP heap size value
|
||||||
|
* @return
|
||||||
|
* - \ref NVML_SUCCESS Successful completion
|
||||||
|
* - \ref NVML_ERROR_UNINITIALIZED If the library has not been successfully initialized
|
||||||
|
* - \ref NVML_ERROR_INVALID_ARGUMENT If \a vgpuTypeId is invalid, or \a gspHeapSize is NULL
|
||||||
|
* - \ref NVML_ERROR_UNKNOWN On any unexpected error
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlVgpuTypeGetGspHeapSize(nvmlVgpuTypeId_t vgpuTypeId, unsigned long long *gspHeapSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve the static framebuffer reservation of the vGPU type in bytes
|
||||||
|
*
|
||||||
|
* @param vgpuTypeId Handle to vGPU type
|
||||||
|
* @param fbReservation Reference to return the framebuffer reservation
|
||||||
|
* @return
|
||||||
|
* - \ref NVML_SUCCESS Successful completion
|
||||||
|
* - \ref NVML_ERROR_UNINITIALIZED If the library has not been successfully initialized
|
||||||
|
* - \ref NVML_ERROR_INVALID_ARGUMENT If \a vgpuTypeId is invalid, or \a fbReservation is NULL
|
||||||
|
* - \ref NVML_ERROR_UNKNOWN On any unexpected error
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlVgpuTypeGetFbReservation(nvmlVgpuTypeId_t vgpuTypeId, unsigned long long *fbReservation);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the desirable vGPU capability of a device
|
||||||
|
*
|
||||||
|
* Refer to the \a nvmlDeviceVgpuCapability_t structure for the specific capabilities that can be set.
|
||||||
|
* See \ref nvmlEnableState_t for available state.
|
||||||
|
*
|
||||||
|
* @param device The identifier of the target device
|
||||||
|
* @param capability Specifies the \a nvmlDeviceVgpuCapability_t to be set
|
||||||
|
* @param state The target capability mode
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - \ref NVML_SUCCESS Successful completion
|
||||||
|
* - \ref NVML_ERROR_UNINITIALIZED If the library has not been successfully initialized
|
||||||
|
* - \ref NVML_ERROR_INVALID_ARGUMENT If \a device is invalid, or \a capability is invalid, or \a state is invalid
|
||||||
|
* - \ref NVML_ERROR_NOT_SUPPORTED The API is not supported in current state, or \a device not in vGPU mode
|
||||||
|
* - \ref NVML_ERROR_UNKNOWN On any unexpected error
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlDeviceSetVgpuCapabilities(nvmlDevice_t device, nvmlDeviceVgpuCapability_t capability, nvmlEnableState_t state);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the vGPU Software licensable features.
|
* Retrieve the vGPU Software licensable features.
|
||||||
*
|
*
|
||||||
@@ -8774,6 +9376,52 @@ nvmlReturn_t DECLDIR nvmlDeviceGetVgpuUtilization(nvmlDevice_t device, unsigned
|
|||||||
nvmlValueType_t *sampleValType, unsigned int *vgpuInstanceSamplesCount,
|
nvmlValueType_t *sampleValType, unsigned int *vgpuInstanceSamplesCount,
|
||||||
nvmlVgpuInstanceUtilizationSample_t *utilizationSamples);
|
nvmlVgpuInstanceUtilizationSample_t *utilizationSamples);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves recent utilization for vGPU instances running on a physical GPU (device).
|
||||||
|
*
|
||||||
|
* For Kepler &tm; or newer fully supported devices.
|
||||||
|
*
|
||||||
|
* Reads recent utilization of GPU SM (3D/Compute), framebuffer, video encoder, video decoder, jpeg decoder, and OFA for vGPU
|
||||||
|
* instances running on a device. Utilization values are returned as an array of utilization sample structures in the caller-supplied
|
||||||
|
* buffer pointed at by \a vgpuUtilInfo->vgpuUtilArray. One utilization sample structure is returned per vGPU instance, and includes the
|
||||||
|
* CPU timestamp at which the samples were recorded. Individual utilization values are returned as "unsigned int" values
|
||||||
|
* in nvmlValue_t unions. The function sets the caller-supplied \a vgpuUtilInfo->sampleValType to NVML_VALUE_TYPE_UNSIGNED_INT to
|
||||||
|
* indicate the returned value type.
|
||||||
|
*
|
||||||
|
* To read utilization values, first determine the size of buffer required to hold the samples by invoking the function with
|
||||||
|
* \a vgpuUtilInfo->vgpuUtilArray set to NULL. The function will return NVML_ERROR_INSUFFICIENT_SIZE, with the current vGPU instance
|
||||||
|
* count in \a vgpuUtilInfo->vgpuInstanceCount, or NVML_SUCCESS if the current vGPU instance count is zero. The caller should allocate
|
||||||
|
* a buffer of size vgpuUtilInfo->vgpuInstanceCount * sizeof(nvmlVgpuInstanceUtilizationInfo_t). Invoke the function again with
|
||||||
|
* the allocated buffer passed in \a vgpuUtilInfo->vgpuUtilArray, and \a vgpuUtilInfo->vgpuInstanceCount set to the number of entries the
|
||||||
|
* buffer is sized for.
|
||||||
|
*
|
||||||
|
* On successful return, the function updates \a vgpuUtilInfo->vgpuInstanceCount with the number of vGPU utilization sample
|
||||||
|
* structures that were actually written. This may differ from a previously read value as vGPU instances are created or
|
||||||
|
* destroyed.
|
||||||
|
*
|
||||||
|
* \a vgpuUtilInfo->lastSeenTimeStamp represents the CPU timestamp in microseconds at which utilization samples were last read. Set it to 0
|
||||||
|
* to read utilization based on all the samples maintained by the driver's internal sample buffer. Set \a vgpuUtilInfo->lastSeenTimeStamp
|
||||||
|
* to a timeStamp retrieved from a previous query to read utilization since the previous query.
|
||||||
|
*
|
||||||
|
* @param device The identifier for the target device
|
||||||
|
* @param vgpuUtilInfo Pointer to the caller-provided structure of nvmlVgpuInstancesUtilizationInfo_t
|
||||||
|
|
||||||
|
* @return
|
||||||
|
* - \ref NVML_SUCCESS if utilization samples are successfully retrieved
|
||||||
|
* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized
|
||||||
|
* - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, \a vgpuUtilInfo is NULL, or \a vgpuUtilInfo->vgpuInstanceCount is 0
|
||||||
|
* - \ref NVML_ERROR_NOT_SUPPORTED if vGPU is not supported by the device
|
||||||
|
* - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible
|
||||||
|
* - \ref NVML_ERROR_VERSION_MISMATCH if the version of \a vgpuUtilInfo is invalid
|
||||||
|
* - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a vgpuUtilInfo->vgpuUtilArray is NULL, or the buffer size of vgpuUtilInfo->vgpuInstanceCount is too small.
|
||||||
|
* The caller should check the current vGPU instance count from the returned vgpuUtilInfo->vgpuInstanceCount, and call
|
||||||
|
* the function again with a buffer of size vgpuUtilInfo->vgpuInstanceCount * sizeof(nvmlVgpuInstanceUtilizationInfo_t)
|
||||||
|
* - \ref NVML_ERROR_NOT_FOUND if sample entries are not found
|
||||||
|
* - \ref NVML_ERROR_UNKNOWN on any unexpected error
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlDeviceGetVgpuInstancesUtilizationInfo(nvmlDevice_t device,
|
||||||
|
nvmlVgpuInstancesUtilizationInfo_t *vgpuUtilInfo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves current utilization for processes running on vGPUs on a physical GPU (device).
|
* Retrieves current utilization for processes running on vGPUs on a physical GPU (device).
|
||||||
*
|
*
|
||||||
@@ -8820,6 +9468,52 @@ nvmlReturn_t DECLDIR nvmlDeviceGetVgpuUtilization(nvmlDevice_t device, unsigned
|
|||||||
nvmlReturn_t DECLDIR nvmlDeviceGetVgpuProcessUtilization(nvmlDevice_t device, unsigned long long lastSeenTimeStamp,
|
nvmlReturn_t DECLDIR nvmlDeviceGetVgpuProcessUtilization(nvmlDevice_t device, unsigned long long lastSeenTimeStamp,
|
||||||
unsigned int *vgpuProcessSamplesCount,
|
unsigned int *vgpuProcessSamplesCount,
|
||||||
nvmlVgpuProcessUtilizationSample_t *utilizationSamples);
|
nvmlVgpuProcessUtilizationSample_t *utilizationSamples);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves recent utilization for processes running on vGPU instances on a physical GPU (device).
|
||||||
|
*
|
||||||
|
* For Maxwell &tm; or newer fully supported devices.
|
||||||
|
*
|
||||||
|
* Reads recent utilization of GPU SM (3D/Compute), framebuffer, video encoder, video decoder, jpeg decoder, and OFA for processes running
|
||||||
|
* on vGPU instances active on a device. Utilization values are returned as an array of utilization sample structures in the caller-supplied
|
||||||
|
* buffer pointed at by \a vgpuProcUtilInfo->vgpuProcUtilArray. One utilization sample structure is returned per process running
|
||||||
|
* on vGPU instances, that had some non-zero utilization during the last sample period. It includes the CPU timestamp at which
|
||||||
|
* the samples were recorded. Individual utilization values are returned as "unsigned int" values.
|
||||||
|
*
|
||||||
|
* To read utilization values, first determine the size of buffer required to hold the samples by invoking the function with
|
||||||
|
* \a vgpuProcUtilInfo->vgpuProcUtilArray set to NULL. The function will return NVML_ERROR_INSUFFICIENT_SIZE, with the current processes' count
|
||||||
|
* running on vGPU instances in \a vgpuProcUtilInfo->vgpuProcessCount. The caller should allocate a buffer of size
|
||||||
|
* vgpuProcUtilInfo->vgpuProcessCount * sizeof(nvmlVgpuProcessUtilizationSample_t). Invoke the function again with the allocated buffer passed
|
||||||
|
* in \a vgpuProcUtilInfo->vgpuProcUtilArray, and \a vgpuProcUtilInfo->vgpuProcessCount set to the number of entries the buffer is sized for.
|
||||||
|
*
|
||||||
|
* On successful return, the function updates \a vgpuProcUtilInfo->vgpuProcessCount with the number of vGPU sub process utilization sample
|
||||||
|
* structures that were actually written. This may differ from a previously read value depending on the number of processes that are active
|
||||||
|
* in any given sample period.
|
||||||
|
*
|
||||||
|
* vgpuProcUtilInfo->lastSeenTimeStamp represents the CPU timestamp in microseconds at which utilization samples were last read. Set it to 0
|
||||||
|
* to read utilization based on all the samples maintained by the driver's internal sample buffer. Set vgpuProcUtilInfo->lastSeenTimeStamp
|
||||||
|
* to a timeStamp retrieved from a previous query to read utilization since the previous query.
|
||||||
|
*
|
||||||
|
* @param device The identifier for the target device
|
||||||
|
* @param vgpuProcUtilInfo Pointer to the caller-provided structure of nvmlVgpuProcessesUtilizationInfo_t
|
||||||
|
|
||||||
|
* @return
|
||||||
|
* - \ref NVML_SUCCESS if utilization samples are successfully retrieved
|
||||||
|
* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized
|
||||||
|
* - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid, or \a vgpuProcUtilInfo is null
|
||||||
|
* - \ref NVML_ERROR_VERSION_MISMATCH if the version of \a vgpuProcUtilInfo is invalid
|
||||||
|
* - \ref NVML_ERROR_INSUFFICIENT_SIZE if \a vgpuProcUtilInfo->vgpuProcUtilArray is null, or supplied \a vgpuProcUtilInfo->vgpuProcessCount
|
||||||
|
* is too small to return samples for all processes on vGPU instances currently executing on the device.
|
||||||
|
* The caller should check the current processes count from the returned \a vgpuProcUtilInfo->vgpuProcessCount,
|
||||||
|
* and call the function again with a buffer of size
|
||||||
|
* vgpuProcUtilInfo->vgpuProcessCount * sizeof(nvmlVgpuProcessUtilizationSample_t)
|
||||||
|
* - \ref NVML_ERROR_NOT_SUPPORTED if vGPU is not supported by the device
|
||||||
|
* - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible
|
||||||
|
* - \ref NVML_ERROR_NOT_FOUND if sample entries are not found
|
||||||
|
* - \ref NVML_ERROR_UNKNOWN on any unexpected error
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlDeviceGetVgpuProcessesUtilizationInfo(nvmlDevice_t device, nvmlVgpuProcessesUtilizationInfo_t *vgpuProcUtilInfo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Queries the state of per process accounting mode on vGPU.
|
* Queries the state of per process accounting mode on vGPU.
|
||||||
*
|
*
|
||||||
@@ -9304,7 +9998,7 @@ nvmlReturn_t DECLDIR nvmlDeviceSetMigMode(nvmlDevice_t device, unsigned int mode
|
|||||||
nvmlReturn_t DECLDIR nvmlDeviceGetMigMode(nvmlDevice_t device, unsigned int *currentMode, unsigned int *pendingMode);
|
nvmlReturn_t DECLDIR nvmlDeviceGetMigMode(nvmlDevice_t device, unsigned int *currentMode, unsigned int *pendingMode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get GPU instance profile information.
|
* Get GPU instance profile information
|
||||||
*
|
*
|
||||||
* Information provided by this API is immutable throughout the lifetime of a MIG mode.
|
* Information provided by this API is immutable throughout the lifetime of a MIG mode.
|
||||||
*
|
*
|
||||||
@@ -9319,7 +10013,7 @@ nvmlReturn_t DECLDIR nvmlDeviceGetMigMode(nvmlDevice_t device, unsigned int *cur
|
|||||||
* - \ref NVML_SUCCESS Upon success
|
* - \ref NVML_SUCCESS Upon success
|
||||||
* - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized
|
* - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized
|
||||||
* - \ref NVML_ERROR_INVALID_ARGUMENT If \a device, \a profile or \a info are invalid
|
* - \ref NVML_ERROR_INVALID_ARGUMENT If \a device, \a profile or \a info are invalid
|
||||||
* - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't have MIG mode enabled or \a profile isn't supported
|
* - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't support MIG or \a profile isn't supported
|
||||||
* - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation
|
* - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation
|
||||||
*/
|
*/
|
||||||
nvmlReturn_t DECLDIR nvmlDeviceGetGpuInstanceProfileInfo(nvmlDevice_t device, unsigned int profile,
|
nvmlReturn_t DECLDIR nvmlDeviceGetGpuInstanceProfileInfo(nvmlDevice_t device, unsigned int profile,
|
||||||
@@ -9360,7 +10054,7 @@ nvmlReturn_t DECLDIR nvmlDeviceGetGpuInstanceProfileInfoV(nvmlDevice_t device, u
|
|||||||
* Get GPU instance placements.
|
* Get GPU instance placements.
|
||||||
*
|
*
|
||||||
* A placement represents the location of a GPU instance within a device. This API only returns all the possible
|
* A placement represents the location of a GPU instance within a device. This API only returns all the possible
|
||||||
* placements for the given profile.
|
* placements for the given profile regardless of whether MIG is enabled or not.
|
||||||
* A created GPU instance occupies memory slices described by its placement. Creation of new GPU instance will
|
* A created GPU instance occupies memory slices described by its placement. Creation of new GPU instance will
|
||||||
* fail if there is overlap with the already occupied memory slices.
|
* fail if there is overlap with the already occupied memory slices.
|
||||||
*
|
*
|
||||||
@@ -9379,7 +10073,7 @@ nvmlReturn_t DECLDIR nvmlDeviceGetGpuInstanceProfileInfoV(nvmlDevice_t device, u
|
|||||||
* - \ref NVML_SUCCESS Upon success
|
* - \ref NVML_SUCCESS Upon success
|
||||||
* - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized
|
* - \ref NVML_ERROR_UNINITIALIZED If library has not been successfully initialized
|
||||||
* - \ref NVML_ERROR_INVALID_ARGUMENT If \a device, \a profileId or \a count are invalid
|
* - \ref NVML_ERROR_INVALID_ARGUMENT If \a device, \a profileId or \a count are invalid
|
||||||
* - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't have MIG mode enabled or \a profileId isn't supported
|
* - \ref NVML_ERROR_NOT_SUPPORTED If \a device doesn't support MIG or \a profileId isn't supported
|
||||||
* - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation
|
* - \ref NVML_ERROR_NO_PERMISSION If user doesn't have permission to perform the operation
|
||||||
*/
|
*/
|
||||||
nvmlReturn_t DECLDIR nvmlDeviceGetGpuInstancePossiblePlacements_v2(nvmlDevice_t device, unsigned int profileId,
|
nvmlReturn_t DECLDIR nvmlDeviceGetGpuInstancePossiblePlacements_v2(nvmlDevice_t device, unsigned int profileId,
|
||||||
@@ -10287,7 +10981,7 @@ nvmlReturn_t DECLDIR nvmlSystemGetNvlinkBwMode(unsigned int *nvlinkBwMode);
|
|||||||
* - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible
|
* - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible
|
||||||
* - \ref NVML_ERROR_UNKNOWN on any unexpected error
|
* - \ref NVML_ERROR_UNKNOWN on any unexpected error
|
||||||
*
|
*
|
||||||
* @see NVML_FI_DEV_POWER_AVERAGE
|
* @see NVML_FI_DEV_POWER_AVERAGE
|
||||||
* @see NVML_FI_DEV_POWER_INSTANT
|
* @see NVML_FI_DEV_POWER_INSTANT
|
||||||
* @see NVML_FI_DEV_POWER_MIN_LIMIT
|
* @see NVML_FI_DEV_POWER_MIN_LIMIT
|
||||||
* @see NVML_FI_DEV_POWER_MAX_LIMIT
|
* @see NVML_FI_DEV_POWER_MAX_LIMIT
|
||||||
@@ -10295,7 +10989,28 @@ nvmlReturn_t DECLDIR nvmlSystemGetNvlinkBwMode(unsigned int *nvlinkBwMode);
|
|||||||
*/
|
*/
|
||||||
nvmlReturn_t DECLDIR nvmlDeviceSetPowerManagementLimit_v2(nvmlDevice_t device, nvmlPowerValue_v2_t *powerValue);
|
nvmlReturn_t DECLDIR nvmlDeviceSetPowerManagementLimit_v2(nvmlDevice_t device, nvmlPowerValue_v2_t *powerValue);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get SRAM ECC error status of this device.
|
||||||
|
*
|
||||||
|
* For Ampere &tm; or newer fully supported devices.
|
||||||
|
* Requires root/admin permissions.
|
||||||
|
*
|
||||||
|
* See \ref nvmlEccSramErrorStatus_v1_t for more information on the struct.
|
||||||
|
*
|
||||||
|
* @param device The identifier of the target device
|
||||||
|
* @param status Returns SRAM ECC error status
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* - \ref NVML_SUCCESS if \a limit has been set
|
||||||
|
* - \ref NVML_ERROR_UNINITIALIZED if the library has not been successfully initialized
|
||||||
|
* - \ref NVML_ERROR_INVALID_ARGUMENT if \a device is invalid or \a counters is NULL
|
||||||
|
* - \ref NVML_ERROR_NOT_SUPPORTED if the device does not support this feature
|
||||||
|
* - \ref NVML_ERROR_GPU_IS_LOST if the target GPU has fallen off the bus or is otherwise inaccessible
|
||||||
|
* - \ref NVML_ERROR_VERSION_MISMATCH if the version of \a nvmlEccSramErrorStatus_t is invalid
|
||||||
|
* - \ref NVML_ERROR_UNKNOWN on any unexpected error
|
||||||
|
*/
|
||||||
|
nvmlReturn_t DECLDIR nvmlDeviceGetSramEccErrorStatus(nvmlDevice_t device,
|
||||||
|
nvmlEccSramErrorStatus_t *status);
|
||||||
/**
|
/**
|
||||||
* NVML API versioning support
|
* NVML API versioning support
|
||||||
*/
|
*/
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"home": "https://github.com/NVIDIA/nvidia-settings/blob/main/src/nvml.h",
|
"home": "https://github.com/NVIDIA/nvidia-settings/blob/main/src/nvml.h",
|
||||||
"license": "Embed in source",
|
"license": "Embed in source",
|
||||||
"version": "545.23.06",
|
"version": "550.54.14",
|
||||||
"author": "NVIDIA Corporation"
|
"author": "NVIDIA Corporation"
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"home": "https://github.com/ibireme/yyjson",
|
"home": "https://github.com/ibireme/yyjson",
|
||||||
"license": "MIT ( embed in source )",
|
"license": "MIT ( embed in source )",
|
||||||
"version": "0.8.0",
|
"version": "0.9.0",
|
||||||
"author": "ibireme"
|
"author": "ibireme"
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+31
-5
@@ -1407,6 +1407,7 @@ bool yyjson_mut_doc_set_val_pool_size(yyjson_mut_doc *doc, size_t count) {
|
|||||||
void yyjson_mut_doc_free(yyjson_mut_doc *doc) {
|
void yyjson_mut_doc_free(yyjson_mut_doc *doc) {
|
||||||
if (doc) {
|
if (doc) {
|
||||||
yyjson_alc alc = doc->alc;
|
yyjson_alc alc = doc->alc;
|
||||||
|
memset(&doc->alc, 0, sizeof(alc));
|
||||||
unsafe_yyjson_str_pool_release(&doc->str_pool, &alc);
|
unsafe_yyjson_str_pool_release(&doc->str_pool, &alc);
|
||||||
unsafe_yyjson_val_pool_release(&doc->val_pool, &alc);
|
unsafe_yyjson_val_pool_release(&doc->val_pool, &alc);
|
||||||
alc.free(alc.ctx, doc);
|
alc.free(alc.ctx, doc);
|
||||||
@@ -8309,13 +8310,15 @@ static_inline u8 *yyjson_write_single(yyjson_val *val,
|
|||||||
bool cpy = (enc_table == enc_table_cpy);
|
bool cpy = (enc_table == enc_table_cpy);
|
||||||
bool esc = has_write_flag(ESCAPE_UNICODE) != 0;
|
bool esc = has_write_flag(ESCAPE_UNICODE) != 0;
|
||||||
bool inv = has_write_flag(ALLOW_INVALID_UNICODE) != 0;
|
bool inv = has_write_flag(ALLOW_INVALID_UNICODE) != 0;
|
||||||
|
bool newline = has_write_flag(NEWLINE_AT_END) != 0;
|
||||||
|
const usize end_len = 2; /* '\n' and '\0' */
|
||||||
|
|
||||||
switch (unsafe_yyjson_get_type(val)) {
|
switch (unsafe_yyjson_get_type(val)) {
|
||||||
case YYJSON_TYPE_RAW:
|
case YYJSON_TYPE_RAW:
|
||||||
str_len = unsafe_yyjson_get_len(val);
|
str_len = unsafe_yyjson_get_len(val);
|
||||||
str_ptr = (const u8 *)unsafe_yyjson_get_str(val);
|
str_ptr = (const u8 *)unsafe_yyjson_get_str(val);
|
||||||
check_str_len(str_len);
|
check_str_len(str_len);
|
||||||
incr_len(str_len + 1);
|
incr_len(str_len + end_len);
|
||||||
cur = write_raw(cur, str_ptr, str_len);
|
cur = write_raw(cur, str_ptr, str_len);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -8323,7 +8326,7 @@ static_inline u8 *yyjson_write_single(yyjson_val *val,
|
|||||||
str_len = unsafe_yyjson_get_len(val);
|
str_len = unsafe_yyjson_get_len(val);
|
||||||
str_ptr = (const u8 *)unsafe_yyjson_get_str(val);
|
str_ptr = (const u8 *)unsafe_yyjson_get_str(val);
|
||||||
check_str_len(str_len);
|
check_str_len(str_len);
|
||||||
incr_len(str_len * 6 + 4);
|
incr_len(str_len * 6 + 2 + end_len);
|
||||||
if (likely(cpy) && unsafe_yyjson_get_subtype(val)) {
|
if (likely(cpy) && unsafe_yyjson_get_subtype(val)) {
|
||||||
cur = write_string_noesc(cur, str_ptr, str_len);
|
cur = write_string_noesc(cur, str_ptr, str_len);
|
||||||
} else {
|
} else {
|
||||||
@@ -8333,7 +8336,7 @@ static_inline u8 *yyjson_write_single(yyjson_val *val,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case YYJSON_TYPE_NUM:
|
case YYJSON_TYPE_NUM:
|
||||||
incr_len(32);
|
incr_len(32 + end_len);
|
||||||
cur = write_number(cur, val, flg);
|
cur = write_number(cur, val, flg);
|
||||||
if (unlikely(!cur)) goto fail_num;
|
if (unlikely(!cur)) goto fail_num;
|
||||||
break;
|
break;
|
||||||
@@ -8349,13 +8352,13 @@ static_inline u8 *yyjson_write_single(yyjson_val *val,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case YYJSON_TYPE_ARR:
|
case YYJSON_TYPE_ARR:
|
||||||
incr_len(4);
|
incr_len(2 + end_len);
|
||||||
byte_copy_2(cur, "[]");
|
byte_copy_2(cur, "[]");
|
||||||
cur += 2;
|
cur += 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case YYJSON_TYPE_OBJ:
|
case YYJSON_TYPE_OBJ:
|
||||||
incr_len(4);
|
incr_len(2 + end_len);
|
||||||
byte_copy_2(cur, "{}");
|
byte_copy_2(cur, "{}");
|
||||||
cur += 2;
|
cur += 2;
|
||||||
break;
|
break;
|
||||||
@@ -8364,6 +8367,7 @@ static_inline u8 *yyjson_write_single(yyjson_val *val,
|
|||||||
goto fail_type;
|
goto fail_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (newline) *cur++ = '\n';
|
||||||
*cur = '\0';
|
*cur = '\0';
|
||||||
*dat_len = (usize)(cur - hdr);
|
*dat_len = (usize)(cur - hdr);
|
||||||
memset(err, 0, sizeof(yyjson_write_err));
|
memset(err, 0, sizeof(yyjson_write_err));
|
||||||
@@ -8436,6 +8440,7 @@ static_inline u8 *yyjson_write_minify(const yyjson_val *root,
|
|||||||
bool cpy = (enc_table == enc_table_cpy);
|
bool cpy = (enc_table == enc_table_cpy);
|
||||||
bool esc = has_write_flag(ESCAPE_UNICODE) != 0;
|
bool esc = has_write_flag(ESCAPE_UNICODE) != 0;
|
||||||
bool inv = has_write_flag(ALLOW_INVALID_UNICODE) != 0;
|
bool inv = has_write_flag(ALLOW_INVALID_UNICODE) != 0;
|
||||||
|
bool newline = has_write_flag(NEWLINE_AT_END) != 0;
|
||||||
|
|
||||||
alc_len = root->uni.ofs / sizeof(yyjson_val);
|
alc_len = root->uni.ofs / sizeof(yyjson_val);
|
||||||
alc_len = alc_len * YYJSON_WRITER_ESTIMATED_MINIFY_RATIO + 64;
|
alc_len = alc_len * YYJSON_WRITER_ESTIMATED_MINIFY_RATIO + 64;
|
||||||
@@ -8542,6 +8547,11 @@ ctn_end:
|
|||||||
}
|
}
|
||||||
|
|
||||||
doc_end:
|
doc_end:
|
||||||
|
if (newline) {
|
||||||
|
incr_len(2);
|
||||||
|
*(cur - 1) = '\n';
|
||||||
|
cur++;
|
||||||
|
}
|
||||||
*--cur = '\0';
|
*--cur = '\0';
|
||||||
*dat_len = (usize)(cur - hdr);
|
*dat_len = (usize)(cur - hdr);
|
||||||
memset(err, 0, sizeof(yyjson_write_err));
|
memset(err, 0, sizeof(yyjson_write_err));
|
||||||
@@ -8615,6 +8625,7 @@ static_inline u8 *yyjson_write_pretty(const yyjson_val *root,
|
|||||||
bool esc = has_write_flag(ESCAPE_UNICODE) != 0;
|
bool esc = has_write_flag(ESCAPE_UNICODE) != 0;
|
||||||
bool inv = has_write_flag(ALLOW_INVALID_UNICODE) != 0;
|
bool inv = has_write_flag(ALLOW_INVALID_UNICODE) != 0;
|
||||||
usize spaces = has_write_flag(PRETTY_TWO_SPACES) ? 2 : 4;
|
usize spaces = has_write_flag(PRETTY_TWO_SPACES) ? 2 : 4;
|
||||||
|
bool newline = has_write_flag(NEWLINE_AT_END) != 0;
|
||||||
|
|
||||||
alc_len = root->uni.ofs / sizeof(yyjson_val);
|
alc_len = root->uni.ofs / sizeof(yyjson_val);
|
||||||
alc_len = alc_len * YYJSON_WRITER_ESTIMATED_PRETTY_RATIO + 64;
|
alc_len = alc_len * YYJSON_WRITER_ESTIMATED_PRETTY_RATIO + 64;
|
||||||
@@ -8745,6 +8756,10 @@ ctn_end:
|
|||||||
}
|
}
|
||||||
|
|
||||||
doc_end:
|
doc_end:
|
||||||
|
if (newline) {
|
||||||
|
incr_len(2);
|
||||||
|
*cur++ = '\n';
|
||||||
|
}
|
||||||
*cur = '\0';
|
*cur = '\0';
|
||||||
*dat_len = (usize)(cur - hdr);
|
*dat_len = (usize)(cur - hdr);
|
||||||
memset(err, 0, sizeof(yyjson_write_err));
|
memset(err, 0, sizeof(yyjson_write_err));
|
||||||
@@ -8977,6 +8992,7 @@ static_inline u8 *yyjson_mut_write_minify(const yyjson_mut_val *root,
|
|||||||
bool cpy = (enc_table == enc_table_cpy);
|
bool cpy = (enc_table == enc_table_cpy);
|
||||||
bool esc = has_write_flag(ESCAPE_UNICODE) != 0;
|
bool esc = has_write_flag(ESCAPE_UNICODE) != 0;
|
||||||
bool inv = has_write_flag(ALLOW_INVALID_UNICODE) != 0;
|
bool inv = has_write_flag(ALLOW_INVALID_UNICODE) != 0;
|
||||||
|
bool newline = has_write_flag(NEWLINE_AT_END) != 0;
|
||||||
|
|
||||||
alc_len = estimated_val_num * YYJSON_WRITER_ESTIMATED_MINIFY_RATIO + 64;
|
alc_len = estimated_val_num * YYJSON_WRITER_ESTIMATED_MINIFY_RATIO + 64;
|
||||||
alc_len = size_align_up(alc_len, sizeof(yyjson_mut_write_ctx));
|
alc_len = size_align_up(alc_len, sizeof(yyjson_mut_write_ctx));
|
||||||
@@ -9087,6 +9103,11 @@ ctn_end:
|
|||||||
}
|
}
|
||||||
|
|
||||||
doc_end:
|
doc_end:
|
||||||
|
if (newline) {
|
||||||
|
incr_len(2);
|
||||||
|
*(cur - 1) = '\n';
|
||||||
|
cur++;
|
||||||
|
}
|
||||||
*--cur = '\0';
|
*--cur = '\0';
|
||||||
*dat_len = (usize)(cur - hdr);
|
*dat_len = (usize)(cur - hdr);
|
||||||
err->code = YYJSON_WRITE_SUCCESS;
|
err->code = YYJSON_WRITE_SUCCESS;
|
||||||
@@ -9162,6 +9183,7 @@ static_inline u8 *yyjson_mut_write_pretty(const yyjson_mut_val *root,
|
|||||||
bool esc = has_write_flag(ESCAPE_UNICODE) != 0;
|
bool esc = has_write_flag(ESCAPE_UNICODE) != 0;
|
||||||
bool inv = has_write_flag(ALLOW_INVALID_UNICODE) != 0;
|
bool inv = has_write_flag(ALLOW_INVALID_UNICODE) != 0;
|
||||||
usize spaces = has_write_flag(PRETTY_TWO_SPACES) ? 2 : 4;
|
usize spaces = has_write_flag(PRETTY_TWO_SPACES) ? 2 : 4;
|
||||||
|
bool newline = has_write_flag(NEWLINE_AT_END) != 0;
|
||||||
|
|
||||||
alc_len = estimated_val_num * YYJSON_WRITER_ESTIMATED_PRETTY_RATIO + 64;
|
alc_len = estimated_val_num * YYJSON_WRITER_ESTIMATED_PRETTY_RATIO + 64;
|
||||||
alc_len = size_align_up(alc_len, sizeof(yyjson_mut_write_ctx));
|
alc_len = size_align_up(alc_len, sizeof(yyjson_mut_write_ctx));
|
||||||
@@ -9296,6 +9318,10 @@ ctn_end:
|
|||||||
}
|
}
|
||||||
|
|
||||||
doc_end:
|
doc_end:
|
||||||
|
if (newline) {
|
||||||
|
incr_len(2);
|
||||||
|
*cur++ = '\n';
|
||||||
|
}
|
||||||
*cur = '\0';
|
*cur = '\0';
|
||||||
*dat_len = (usize)(cur - hdr);
|
*dat_len = (usize)(cur - hdr);
|
||||||
err->code = YYJSON_WRITE_SUCCESS;
|
err->code = YYJSON_WRITE_SUCCESS;
|
||||||
|
|||||||
Vendored
+35
-21
@@ -527,16 +527,16 @@ extern "C" {
|
|||||||
#define YYJSON_VERSION_MAJOR 0
|
#define YYJSON_VERSION_MAJOR 0
|
||||||
|
|
||||||
/** The minor version of yyjson. */
|
/** The minor version of yyjson. */
|
||||||
#define YYJSON_VERSION_MINOR 8
|
#define YYJSON_VERSION_MINOR 9
|
||||||
|
|
||||||
/** The patch version of yyjson. */
|
/** The patch version of yyjson. */
|
||||||
#define YYJSON_VERSION_PATCH 0
|
#define YYJSON_VERSION_PATCH 0
|
||||||
|
|
||||||
/** The version of yyjson in hex: `(major << 16) | (minor << 8) | (patch)`. */
|
/** The version of yyjson in hex: `(major << 16) | (minor << 8) | (patch)`. */
|
||||||
#define YYJSON_VERSION_HEX 0x000800
|
#define YYJSON_VERSION_HEX 0x000900
|
||||||
|
|
||||||
/** The version string of yyjson. */
|
/** The version string of yyjson. */
|
||||||
#define YYJSON_VERSION_STRING "0.8.0"
|
#define YYJSON_VERSION_STRING "0.9.0"
|
||||||
|
|
||||||
/** The version of yyjson in hex, same as `YYJSON_VERSION_HEX`. */
|
/** The version of yyjson in hex, same as `YYJSON_VERSION_HEX`. */
|
||||||
yyjson_api uint32_t yyjson_version(void);
|
yyjson_api uint32_t yyjson_version(void);
|
||||||
@@ -738,7 +738,7 @@ typedef uint32_t yyjson_read_flag;
|
|||||||
- Report error if double number is infinity.
|
- Report error if double number is infinity.
|
||||||
- Report error if string contains invalid UTF-8 character or BOM.
|
- Report error if string contains invalid UTF-8 character or BOM.
|
||||||
- Report error on trailing commas, comments, inf and nan literals. */
|
- Report error on trailing commas, comments, inf and nan literals. */
|
||||||
static const yyjson_read_flag YYJSON_READ_NOFLAG = 0 << 0;
|
static const yyjson_read_flag YYJSON_READ_NOFLAG = 0;
|
||||||
|
|
||||||
/** Read the input data in-situ.
|
/** Read the input data in-situ.
|
||||||
This option allows the reader to modify and use input data to store string
|
This option allows the reader to modify and use input data to store string
|
||||||
@@ -1067,7 +1067,7 @@ typedef uint32_t yyjson_write_flag;
|
|||||||
- Report error on inf or nan number.
|
- Report error on inf or nan number.
|
||||||
- Report error on invalid UTF-8 string.
|
- Report error on invalid UTF-8 string.
|
||||||
- Do not escape unicode or slash. */
|
- Do not escape unicode or slash. */
|
||||||
static const yyjson_write_flag YYJSON_WRITE_NOFLAG = 0 << 0;
|
static const yyjson_write_flag YYJSON_WRITE_NOFLAG = 0;
|
||||||
|
|
||||||
/** Write JSON pretty with 4 space indent. */
|
/** Write JSON pretty with 4 space indent. */
|
||||||
static const yyjson_write_flag YYJSON_WRITE_PRETTY = 1 << 0;
|
static const yyjson_write_flag YYJSON_WRITE_PRETTY = 1 << 0;
|
||||||
@@ -1096,6 +1096,10 @@ static const yyjson_write_flag YYJSON_WRITE_ALLOW_INVALID_UNICODE = 1 << 5;
|
|||||||
This flag will override `YYJSON_WRITE_PRETTY` flag. */
|
This flag will override `YYJSON_WRITE_PRETTY` flag. */
|
||||||
static const yyjson_write_flag YYJSON_WRITE_PRETTY_TWO_SPACES = 1 << 6;
|
static const yyjson_write_flag YYJSON_WRITE_PRETTY_TWO_SPACES = 1 << 6;
|
||||||
|
|
||||||
|
/** Adds a newline character `\n` at the end of the JSON.
|
||||||
|
This can be helpful for text editors or NDJSON. */
|
||||||
|
static const yyjson_write_flag YYJSON_WRITE_NEWLINE_AT_END = 1 << 7;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** Result code for JSON writer */
|
/** Result code for JSON writer */
|
||||||
@@ -3695,7 +3699,7 @@ yyjson_api_inline bool yyjson_mut_obj_add_strcpy(yyjson_mut_doc *doc,
|
|||||||
The `len` should be the length of the `val`, in bytes.
|
The `len` should be the length of the `val`, in bytes.
|
||||||
This function allows duplicated key in one object.
|
This function allows duplicated key in one object.
|
||||||
|
|
||||||
@warning The key/value strings are not copied, you should keep these strings
|
@warning The key strings are not copied, you should keep these strings
|
||||||
unmodified for the lifetime of this JSON document. */
|
unmodified for the lifetime of this JSON document. */
|
||||||
yyjson_api_inline bool yyjson_mut_obj_add_strncpy(yyjson_mut_doc *doc,
|
yyjson_api_inline bool yyjson_mut_obj_add_strncpy(yyjson_mut_doc *doc,
|
||||||
yyjson_mut_val *obj,
|
yyjson_mut_val *obj,
|
||||||
@@ -4829,6 +4833,7 @@ yyjson_api_inline size_t yyjson_doc_get_val_count(yyjson_doc *doc) {
|
|||||||
yyjson_api_inline void yyjson_doc_free(yyjson_doc *doc) {
|
yyjson_api_inline void yyjson_doc_free(yyjson_doc *doc) {
|
||||||
if (doc) {
|
if (doc) {
|
||||||
yyjson_alc alc = doc->alc;
|
yyjson_alc alc = doc->alc;
|
||||||
|
memset(&doc->alc, 0, sizeof(alc));
|
||||||
if (doc->str_pool) alc.free(alc.ctx, doc->str_pool);
|
if (doc->str_pool) alc.free(alc.ctx, doc->str_pool);
|
||||||
alc.free(alc.ctx, doc);
|
alc.free(alc.ctx, doc);
|
||||||
}
|
}
|
||||||
@@ -5668,6 +5673,7 @@ yyjson_api_inline yyjson_mut_val *yyjson_mut_bool(yyjson_mut_doc *doc,
|
|||||||
if (yyjson_likely(doc)) {
|
if (yyjson_likely(doc)) {
|
||||||
yyjson_mut_val *val = unsafe_yyjson_mut_val(doc, 1);
|
yyjson_mut_val *val = unsafe_yyjson_mut_val(doc, 1);
|
||||||
if (yyjson_likely(val)) {
|
if (yyjson_likely(val)) {
|
||||||
|
_val = !!_val;
|
||||||
val->tag = YYJSON_TYPE_BOOL | (uint8_t)((uint8_t)_val << 3);
|
val->tag = YYJSON_TYPE_BOOL | (uint8_t)((uint8_t)_val << 3);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
@@ -5920,7 +5926,8 @@ yyjson_api_inline yyjson_mut_val *yyjson_mut_arr(yyjson_mut_doc *doc) {
|
|||||||
yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_bool(
|
yyjson_api_inline yyjson_mut_val *yyjson_mut_arr_with_bool(
|
||||||
yyjson_mut_doc *doc, const bool *vals, size_t count) {
|
yyjson_mut_doc *doc, const bool *vals, size_t count) {
|
||||||
yyjson_mut_arr_with_func({
|
yyjson_mut_arr_with_func({
|
||||||
val->tag = YYJSON_TYPE_BOOL | (uint8_t)((uint8_t)vals[i] << 3);
|
bool _val = !!vals[i];
|
||||||
|
val->tag = YYJSON_TYPE_BOOL | (uint8_t)((uint8_t)_val << 3);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6872,6 +6879,7 @@ yyjson_api_inline bool yyjson_mut_obj_add_bool(yyjson_mut_doc *doc,
|
|||||||
const char *_key,
|
const char *_key,
|
||||||
bool _val) {
|
bool _val) {
|
||||||
yyjson_mut_obj_add_func({
|
yyjson_mut_obj_add_func({
|
||||||
|
_val = !!_val;
|
||||||
val->tag = YYJSON_TYPE_BOOL | (uint8_t)((uint8_t)(_val) << 3);
|
val->tag = YYJSON_TYPE_BOOL | (uint8_t)((uint8_t)(_val) << 3);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -7730,33 +7738,39 @@ yyjson_api_inline bool yyjson_ptr_get_bool(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Set provided `value` if the JSON Pointer (RFC 6901) exists and is type uint.
|
Set provided `value` if the JSON Pointer (RFC 6901) exists and is an integer
|
||||||
Returns true if value at `ptr` exists and is the correct type, otherwise false.
|
that fits in `uint64_t`. Returns true if successful, otherwise false.
|
||||||
*/
|
*/
|
||||||
yyjson_api_inline bool yyjson_ptr_get_uint(
|
yyjson_api_inline bool yyjson_ptr_get_uint(
|
||||||
yyjson_val *root, const char *ptr, uint64_t *value) {
|
yyjson_val *root, const char *ptr, uint64_t *value) {
|
||||||
yyjson_val *val = yyjson_ptr_get(root, ptr);
|
yyjson_val *val = yyjson_ptr_get(root, ptr);
|
||||||
if (value && yyjson_is_uint(val)) {
|
if (value && val) {
|
||||||
*value = unsafe_yyjson_get_uint(val);
|
uint64_t ret = val->uni.u64;
|
||||||
return true;
|
if (unsafe_yyjson_is_uint(val) ||
|
||||||
} else {
|
(unsafe_yyjson_is_sint(val) && !(ret >> 63))) {
|
||||||
return false;
|
*value = ret;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Set provided `value` if the JSON Pointer (RFC 6901) exists and is type sint.
|
Set provided `value` if the JSON Pointer (RFC 6901) exists and is an integer
|
||||||
Returns true if value at `ptr` exists and is the correct type, otherwise false.
|
that fits in `int64_t`. Returns true if successful, otherwise false.
|
||||||
*/
|
*/
|
||||||
yyjson_api_inline bool yyjson_ptr_get_sint(
|
yyjson_api_inline bool yyjson_ptr_get_sint(
|
||||||
yyjson_val *root, const char *ptr, int64_t *value) {
|
yyjson_val *root, const char *ptr, int64_t *value) {
|
||||||
yyjson_val *val = yyjson_ptr_get(root, ptr);
|
yyjson_val *val = yyjson_ptr_get(root, ptr);
|
||||||
if (value && yyjson_is_sint(val)) {
|
if (value && val) {
|
||||||
*value = unsafe_yyjson_get_sint(val);
|
int64_t ret = val->uni.i64;
|
||||||
return true;
|
if (unsafe_yyjson_is_sint(val) ||
|
||||||
} else {
|
(unsafe_yyjson_is_uint(val) && ret >= 0)) {
|
||||||
return false;
|
*value = ret;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
@@ -79,30 +79,11 @@ static void genJsonResult(FFModuleBaseInfo* baseInfo, yyjson_mut_doc* doc)
|
|||||||
|
|
||||||
static void parseStructureCommand(
|
static void parseStructureCommand(
|
||||||
const char* line,
|
const char* line,
|
||||||
FFlist* customValues,
|
|
||||||
void (*fn)(FFModuleBaseInfo *baseInfo, yyjson_mut_doc* jsonDoc),
|
void (*fn)(FFModuleBaseInfo *baseInfo, yyjson_mut_doc* jsonDoc),
|
||||||
yyjson_mut_doc* jsonDoc
|
yyjson_mut_doc* jsonDoc
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// handle `--set` and `--set-keyless`
|
if(ffCharIsEnglishAlphabet(line[0]))
|
||||||
FF_LIST_FOR_EACH(FFCustomValue, customValue, *customValues)
|
|
||||||
{
|
|
||||||
if (ffStrbufEqualS(&customValue->key, line))
|
|
||||||
{
|
|
||||||
__attribute__((__cleanup__(ffDestroyCustomOptions))) FFCustomOptions options;
|
|
||||||
ffInitCustomOptions(&options);
|
|
||||||
if (customValue->printKey)
|
|
||||||
ffStrbufAppend(&options.moduleArgs.key, &customValue->key);
|
|
||||||
ffStrbufAppend(&options.moduleArgs.outputFormat, &customValue->value);
|
|
||||||
if (__builtin_expect(jsonDoc != NULL, false))
|
|
||||||
fn((FFModuleBaseInfo*) &options, jsonDoc);
|
|
||||||
else
|
|
||||||
ffPrintCustom(&options);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(isalpha(line[0]))
|
|
||||||
{
|
{
|
||||||
for (FFModuleBaseInfo** modules = ffModuleInfos[toupper(line[0]) - 'A']; *modules; ++modules)
|
for (FFModuleBaseInfo** modules = ffModuleInfos[toupper(line[0]) - 'A']; *modules; ++modules)
|
||||||
{
|
{
|
||||||
@@ -118,7 +99,7 @@ static void parseStructureCommand(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ffPrintErrorString(line, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "<no implementation provided>");
|
ffPrintError(line, 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "<no implementation provided>");
|
||||||
}
|
}
|
||||||
|
|
||||||
void ffPrintCommandOption(FFdata* data, yyjson_mut_doc* jsonDoc)
|
void ffPrintCommandOption(FFdata* data, yyjson_mut_doc* jsonDoc)
|
||||||
@@ -134,7 +115,7 @@ void ffPrintCommandOption(FFdata* data, yyjson_mut_doc* jsonDoc)
|
|||||||
if(instance.config.display.stat)
|
if(instance.config.display.stat)
|
||||||
ms = ffTimeGetTick();
|
ms = ffTimeGetTick();
|
||||||
|
|
||||||
parseStructureCommand(data->structure.chars + startIndex, &data->customValues, genJsonResult, jsonDoc);
|
parseStructureCommand(data->structure.chars + startIndex, genJsonResult, jsonDoc);
|
||||||
|
|
||||||
if(instance.config.display.stat)
|
if(instance.config.display.stat)
|
||||||
{
|
{
|
||||||
@@ -177,7 +158,7 @@ void ffMigrateCommandOptionToJsonc(FFdata* data, yyjson_mut_doc* jsonDoc)
|
|||||||
uint32_t colonIndex = ffStrbufNextIndexC(&data->structure, startIndex, ':');
|
uint32_t colonIndex = ffStrbufNextIndexC(&data->structure, startIndex, ':');
|
||||||
data->structure.chars[colonIndex] = '\0';
|
data->structure.chars[colonIndex] = '\0';
|
||||||
|
|
||||||
parseStructureCommand(data->structure.chars + startIndex, &data->customValues, genJsonConfig, jsonDoc);
|
parseStructureCommand(data->structure.chars + startIndex, genJsonConfig, jsonDoc);
|
||||||
|
|
||||||
startIndex = colonIndex + 1;
|
startIndex = colonIndex + 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,18 +2,10 @@
|
|||||||
|
|
||||||
#include "fastfetch.h"
|
#include "fastfetch.h"
|
||||||
|
|
||||||
typedef struct FFCustomValue
|
|
||||||
{
|
|
||||||
bool printKey;
|
|
||||||
FFstrbuf key;
|
|
||||||
FFstrbuf value;
|
|
||||||
} FFCustomValue;
|
|
||||||
|
|
||||||
// Things only needed by fastfetch
|
// Things only needed by fastfetch
|
||||||
typedef struct FFdata
|
typedef struct FFdata
|
||||||
{
|
{
|
||||||
FFstrbuf structure;
|
FFstrbuf structure;
|
||||||
FFlist customValues; // List of FFCustomValue
|
|
||||||
bool configLoaded;
|
bool configLoaded;
|
||||||
} FFdata;
|
} FFdata;
|
||||||
|
|
||||||
|
|||||||
+6
-4
@@ -181,22 +181,24 @@ DBusMessage* ffDBusGetProperty(FFDBusData* dbus, const char* busName, const char
|
|||||||
return reply;
|
return reply;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ffDBusGetPropertyString(FFDBusData* dbus, const char* busName, const char* objectPath, const char* interface, const char* property, FFstrbuf* result)
|
bool ffDBusGetPropertyString(FFDBusData* dbus, const char* busName, const char* objectPath, const char* interface, const char* property, FFstrbuf* result)
|
||||||
{
|
{
|
||||||
DBusMessage* reply = ffDBusGetProperty(dbus, busName, objectPath, interface, property);
|
DBusMessage* reply = ffDBusGetProperty(dbus, busName, objectPath, interface, property);
|
||||||
if(reply == NULL)
|
if(reply == NULL)
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
DBusMessageIter rootIterator;
|
DBusMessageIter rootIterator;
|
||||||
if(!dbus->lib->ffdbus_message_iter_init(reply, &rootIterator))
|
if(!dbus->lib->ffdbus_message_iter_init(reply, &rootIterator))
|
||||||
{
|
{
|
||||||
dbus->lib->ffdbus_message_unref(reply);
|
dbus->lib->ffdbus_message_unref(reply);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ffDBusGetValue(dbus, &rootIterator, result);
|
bool ret = ffDBusGetValue(dbus, &rootIterator, result);
|
||||||
|
|
||||||
dbus->lib->ffdbus_message_unref(reply);
|
dbus->lib->ffdbus_message_unref(reply);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //FF_HAVE_DBUS
|
#endif //FF_HAVE_DBUS
|
||||||
|
|||||||
+1
-1
@@ -48,6 +48,6 @@ bool ffDBusGetBool(FFDBusData* dbus, DBusMessageIter* iter, bool* result);
|
|||||||
bool ffDBusGetByte(FFDBusData* dbus, DBusMessageIter* iter, uint8_t* result);
|
bool ffDBusGetByte(FFDBusData* dbus, DBusMessageIter* iter, uint8_t* result);
|
||||||
DBusMessage* ffDBusGetMethodReply(FFDBusData* dbus, const char* busName, const char* objectPath, const char* interface, const char* method);
|
DBusMessage* ffDBusGetMethodReply(FFDBusData* dbus, const char* busName, const char* objectPath, const char* interface, const char* method);
|
||||||
DBusMessage* ffDBusGetProperty(FFDBusData* dbus, const char* busName, const char* objectPath, const char* interface, const char* property);
|
DBusMessage* ffDBusGetProperty(FFDBusData* dbus, const char* busName, const char* objectPath, const char* interface, const char* property);
|
||||||
void ffDBusGetPropertyString(FFDBusData* dbus, const char* busName, const char* objectPath, const char* interface, const char* property, FFstrbuf* result);
|
bool ffDBusGetPropertyString(FFDBusData* dbus, const char* busName, const char* objectPath, const char* interface, const char* property, FFstrbuf* result);
|
||||||
|
|
||||||
#endif // FF_HAVE_DBUS
|
#endif // FF_HAVE_DBUS
|
||||||
|
|||||||
+19
-44
@@ -2,6 +2,7 @@
|
|||||||
#include "common/font.h"
|
#include "common/font.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
void ffFontInit(FFfont* font)
|
void ffFontInit(FFfont* font)
|
||||||
{
|
{
|
||||||
@@ -66,59 +67,33 @@ void ffFontInitQt(FFfont* font, const char* data)
|
|||||||
//See https://doc.qt.io/qt-5/qfont.html#toString
|
//See https://doc.qt.io/qt-5/qfont.html#toString
|
||||||
|
|
||||||
//Family
|
//Family
|
||||||
while(*data != ',' && *data != '\0')
|
data = ffStrbufAppendSUntilC(&font->name, data, ',');
|
||||||
{
|
|
||||||
ffStrbufAppendC(&font->name, *data);
|
|
||||||
++data;
|
|
||||||
}
|
|
||||||
if(*data != '\0')
|
|
||||||
++data;
|
|
||||||
ffStrbufTrim(&font->name, ' ');
|
ffStrbufTrim(&font->name, ' ');
|
||||||
|
if (!data) goto exit;
|
||||||
|
data++;
|
||||||
|
|
||||||
//Size
|
//Size
|
||||||
while(*data != ',' && *data != '\0')
|
data = ffStrbufAppendSUntilC(&font->size, data, ',');
|
||||||
{
|
|
||||||
ffStrbufAppendC(&font->size, *data);
|
|
||||||
++data;
|
|
||||||
}
|
|
||||||
if(*data != '\0')
|
|
||||||
++data;
|
|
||||||
ffStrbufTrim(&font->size, ' ');
|
ffStrbufTrim(&font->size, ' ');
|
||||||
|
if (!data) goto exit;
|
||||||
|
data++;
|
||||||
|
|
||||||
#define FF_FONT_QT_SKIP_VALUE \
|
//Style
|
||||||
while(*data != ',' && *data != '\0') \
|
data = strrchr(data, ',');
|
||||||
++data; \
|
if (!data) goto exit;
|
||||||
if(*data != '\0') \
|
data++;
|
||||||
++data;
|
if (isalpha(*data))
|
||||||
|
|
||||||
FF_FONT_QT_SKIP_VALUE //Pixel size
|
|
||||||
FF_FONT_QT_SKIP_VALUE //Style hint
|
|
||||||
FF_FONT_QT_SKIP_VALUE //Font weight
|
|
||||||
FF_FONT_QT_SKIP_VALUE //Font style
|
|
||||||
FF_FONT_QT_SKIP_VALUE //Underline
|
|
||||||
FF_FONT_QT_SKIP_VALUE //Strike out
|
|
||||||
FF_FONT_QT_SKIP_VALUE //Fixed pitch
|
|
||||||
FF_FONT_QT_SKIP_VALUE //Always 0
|
|
||||||
|
|
||||||
#undef FF_FONT_QT_SKIP_VALUE
|
|
||||||
|
|
||||||
while(*data != '\0')
|
|
||||||
{
|
{
|
||||||
while(*data == ' ')
|
do
|
||||||
++data;
|
|
||||||
|
|
||||||
if(*data == '\0')
|
|
||||||
break;
|
|
||||||
|
|
||||||
FFstrbuf* style = ffListAdd(&font->styles);
|
|
||||||
ffStrbufInit(style);
|
|
||||||
while(*data != ' ' && *data != '\0')
|
|
||||||
{
|
{
|
||||||
ffStrbufAppendC(style, *data);
|
FFstrbuf* style = ffListAdd(&font->styles);
|
||||||
++data;
|
ffStrbufInit(style);
|
||||||
}
|
data = ffStrbufAppendSUntilC(style, data, ' ');
|
||||||
|
if (data) data++;
|
||||||
|
} while (data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
fontInitPretty(font);
|
fontInitPretty(font);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,3 +24,7 @@ typedef struct FFformatarg
|
|||||||
|
|
||||||
void ffFormatAppendFormatArg(FFstrbuf* buffer, const FFformatarg* formatarg);
|
void ffFormatAppendFormatArg(FFstrbuf* buffer, const FFformatarg* formatarg);
|
||||||
void ffParseFormatString(FFstrbuf* buffer, const FFstrbuf* formatstr, uint32_t numArgs, const FFformatarg* arguments);
|
void ffParseFormatString(FFstrbuf* buffer, const FFstrbuf* formatstr, uint32_t numArgs, const FFformatarg* arguments);
|
||||||
|
#define FF_PARSE_FORMAT_STRING_CHECKED(buffer, formatstr, numArgs, arguments) do {\
|
||||||
|
static_assert(sizeof(arguments) / sizeof(*(arguments)) == (numArgs), "Invalid number of format arguments");\
|
||||||
|
ffParseFormatString((buffer), (formatstr), (numArgs), (arguments));\
|
||||||
|
} while (0)
|
||||||
|
|||||||
+5
-5
@@ -238,9 +238,6 @@ void ffListFeatures(void)
|
|||||||
#ifdef FF_HAVE_DDCUTIL
|
#ifdef FF_HAVE_DDCUTIL
|
||||||
"libddcutil\n"
|
"libddcutil\n"
|
||||||
#endif
|
#endif
|
||||||
#if __has_include(<linux/videodev2.h>)
|
|
||||||
"videodev2\n"
|
|
||||||
#endif
|
|
||||||
#ifdef FF_HAVE_DIRECTX_HEADERS
|
#ifdef FF_HAVE_DIRECTX_HEADERS
|
||||||
"Directx Headers\n"
|
"Directx Headers\n"
|
||||||
#endif
|
#endif
|
||||||
@@ -250,8 +247,11 @@ void ffListFeatures(void)
|
|||||||
#ifdef FF_USE_SYSTEM_YYJSON
|
#ifdef FF_USE_SYSTEM_YYJSON
|
||||||
"System yyjson\n"
|
"System yyjson\n"
|
||||||
#endif
|
#endif
|
||||||
#ifdef FF_USE_PCI_MEMORY
|
#if __has_include(<linux/videodev2.h>)
|
||||||
"PCI memory\n"
|
"linux/videodev2\n"
|
||||||
|
#endif
|
||||||
|
#if __has_include(<linux/wireless.h>)
|
||||||
|
"linux/wireless\n"
|
||||||
#endif
|
#endif
|
||||||
""
|
""
|
||||||
, stdout);
|
, stdout);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#include "io.h"
|
#include "io.h"
|
||||||
|
#include "fastfetch.h"
|
||||||
#include "util/stringUtils.h"
|
#include "util/stringUtils.h"
|
||||||
#include "util/unused.h"
|
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
@@ -133,6 +133,9 @@ bool ffPathExpandEnv(FF_MAYBE_UNUSED const char* in, FF_MAYBE_UNUSED FFstrbuf* o
|
|||||||
|
|
||||||
const char* ffGetTerminalResponse(const char* request, const char* format, ...)
|
const char* ffGetTerminalResponse(const char* request, const char* format, ...)
|
||||||
{
|
{
|
||||||
|
if (instance.config.display.pipe)
|
||||||
|
return "Not supported in --pipe mode";
|
||||||
|
|
||||||
struct termios oldTerm, newTerm;
|
struct termios oldTerm, newTerm;
|
||||||
if(tcgetattr(STDIN_FILENO, &oldTerm) == -1)
|
if(tcgetattr(STDIN_FILENO, &oldTerm) == -1)
|
||||||
return "tcgetattr(STDIN_FILENO, &oldTerm) failed";
|
return "tcgetattr(STDIN_FILENO, &oldTerm) failed";
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "io.h"
|
#include "io.h"
|
||||||
|
#include "fastfetch.h"
|
||||||
#include "util/stringUtils.h"
|
#include "util/stringUtils.h"
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
@@ -174,6 +175,9 @@ void ffListFilesRecursively(const char* path, bool pretty)
|
|||||||
|
|
||||||
const char* ffGetTerminalResponse(const char* request, const char* format, ...)
|
const char* ffGetTerminalResponse(const char* request, const char* format, ...)
|
||||||
{
|
{
|
||||||
|
if (instance.config.display.pipe)
|
||||||
|
return "Not supported in --pipe mode";
|
||||||
|
|
||||||
HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
|
HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
|
||||||
DWORD prev_mode;
|
DWORD prev_mode;
|
||||||
GetConsoleMode(hInput, &prev_mode);
|
GetConsoleMode(hInput, &prev_mode);
|
||||||
|
|||||||
@@ -22,6 +22,11 @@ bool ffJsonConfigParseModuleArgs(const char* key, yyjson_val* val, FFModuleArgs*
|
|||||||
ffStrbufSetNS(&moduleArgs->outputFormat, (uint32_t) yyjson_get_len(val), yyjson_get_str(val));
|
ffStrbufSetNS(&moduleArgs->outputFormat, (uint32_t) yyjson_get_len(val), yyjson_get_str(val));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if(ffStrEqualsIgnCase(key, "outputColor"))
|
||||||
|
{
|
||||||
|
ffOptionParseColor(yyjson_get_str(val), &moduleArgs->outputColor);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else if(ffStrEqualsIgnCase(key, "keyColor"))
|
else if(ffStrEqualsIgnCase(key, "keyColor"))
|
||||||
{
|
{
|
||||||
ffOptionParseColor(yyjson_get_str(val), &moduleArgs->keyColor);
|
ffOptionParseColor(yyjson_get_str(val), &moduleArgs->keyColor);
|
||||||
@@ -94,7 +99,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)
|
||||||
{
|
{
|
||||||
@@ -235,6 +240,6 @@ void ffPrintJsonConfig(bool prepare, yyjson_mut_doc* jsonDoc)
|
|||||||
yyjson_mut_doc_set_root(jsonDoc, obj);
|
yyjson_mut_doc_set_root(jsonDoc, obj);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ffPrintErrorString("JsonConfig", 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "%s", error);
|
ffPrintError("JsonConfig", 0, NULL, FF_PRINT_TYPE_NO_CUSTOM_KEY, "%s", error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
//Clang doesn't define __SANITIZE_ADDRESS__ but defines __has_feature(address_sanitizer)
|
//Clang doesn't define __SANITIZE_ADDRESS__ but defines __has_feature(address_sanitizer)
|
||||||
#if defined(__has_feature)
|
#if !defined(__SANITIZE_ADDRESS__) && defined(__has_feature)
|
||||||
#if __has_feature(address_sanitizer)
|
#if __has_feature(address_sanitizer)
|
||||||
#define __SANITIZE_ADDRESS__
|
#define __SANITIZE_ADDRESS__
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ static FFModuleBaseInfo* K[] = {
|
|||||||
|
|
||||||
static FFModuleBaseInfo* L[] = {
|
static FFModuleBaseInfo* L[] = {
|
||||||
(void*) &instance.config.modules.lm,
|
(void*) &instance.config.modules.lm,
|
||||||
|
(void*) &instance.config.modules.loadavg,
|
||||||
(void*) &instance.config.modules.locale,
|
(void*) &instance.config.modules.locale,
|
||||||
(void*) &instance.config.modules.localIP,
|
(void*) &instance.config.modules.localIP,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -98,6 +99,7 @@ static FFModuleBaseInfo* O[] = {
|
|||||||
static FFModuleBaseInfo* P[] = {
|
static FFModuleBaseInfo* P[] = {
|
||||||
(void*) &instance.config.modules.packages,
|
(void*) &instance.config.modules.packages,
|
||||||
(void*) &instance.config.modules.physicalDisk,
|
(void*) &instance.config.modules.physicalDisk,
|
||||||
|
(void*) &instance.config.modules.physicalMemory,
|
||||||
(void*) &instance.config.modules.player,
|
(void*) &instance.config.modules.player,
|
||||||
(void*) &instance.config.modules.powerAdapter,
|
(void*) &instance.config.modules.powerAdapter,
|
||||||
(void*) &instance.config.modules.processes,
|
(void*) &instance.config.modules.processes,
|
||||||
|
|||||||
+5
-10
@@ -20,15 +20,10 @@ typedef struct FFNetworkingState {
|
|||||||
FFThreadType thread;
|
FFThreadType thread;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
uint32_t timeout;
|
||||||
|
bool ipv6;
|
||||||
} FFNetworkingState;
|
} FFNetworkingState;
|
||||||
|
|
||||||
bool ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, const char* path, const char* headers);
|
const char* ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, const char* path, const char* headers);
|
||||||
bool ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer, uint32_t timeout);
|
const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer);
|
||||||
|
|
||||||
static inline bool ffNetworkingGetHttp(const char* host, const char* path, uint32_t timeout, const char* headers, FFstrbuf* buffer)
|
|
||||||
{
|
|
||||||
FFNetworkingState state;
|
|
||||||
if(ffNetworkingSendHttpRequest(&state, host, path, headers))
|
|
||||||
return ffNetworkingRecvHttpResponse(&state, buffer, timeout);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -5,30 +5,50 @@
|
|||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
#include <netinet/in.h> // For FreeBSD
|
||||||
|
#include <netinet/tcp.h>
|
||||||
|
|
||||||
static void connectAndSend(FFNetworkingState* state)
|
static const char* connectAndSend(FFNetworkingState* state)
|
||||||
{
|
{
|
||||||
struct addrinfo hints = {
|
const char* ret = NULL;
|
||||||
.ai_family = AF_INET,
|
|
||||||
.ai_socktype = SOCK_STREAM,
|
|
||||||
};
|
|
||||||
|
|
||||||
struct addrinfo* addr;
|
struct addrinfo* addr;
|
||||||
|
|
||||||
if(getaddrinfo(state->host.chars, "80", &hints, &addr) != 0)
|
if(getaddrinfo(state->host.chars, "80", &(struct addrinfo) {
|
||||||
|
.ai_family = state->ipv6 ? AF_INET6 : AF_INET,
|
||||||
|
.ai_socktype = SOCK_STREAM,
|
||||||
|
}, &addr) != 0)
|
||||||
|
{
|
||||||
|
ret = "getaddrinfo() failed";
|
||||||
goto error;
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
state->sockfd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
|
state->sockfd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
|
||||||
if(state->sockfd == -1)
|
if(state->sockfd == -1)
|
||||||
{
|
{
|
||||||
freeaddrinfo(addr);
|
freeaddrinfo(addr);
|
||||||
|
ret = "socket() failed";
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (state->timeout > 0)
|
||||||
|
{
|
||||||
|
FF_MAYBE_UNUSED uint32_t sec = state->timeout / 1000;
|
||||||
|
if (sec == 0) sec = 1;
|
||||||
|
|
||||||
|
#ifdef TCP_CONNECTIONTIMEOUT
|
||||||
|
setsockopt(state->sockfd, IPPROTO_TCP, TCP_CONNECTIONTIMEOUT, &sec, sizeof(sec));
|
||||||
|
#elif defined(TCP_KEEPINIT)
|
||||||
|
setsockopt(state->sockfd, IPPROTO_TCP, TCP_KEEPINIT, &sec, sizeof(sec));
|
||||||
|
#elif defined(TCP_USER_TIMEOUT)
|
||||||
|
setsockopt(state->sockfd, IPPROTO_TCP, TCP_USER_TIMEOUT, &state->timeout, sizeof(state->timeout));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
if(connect(state->sockfd, addr->ai_addr, addr->ai_addrlen) == -1)
|
if(connect(state->sockfd, addr->ai_addr, addr->ai_addrlen) == -1)
|
||||||
{
|
{
|
||||||
close(state->sockfd);
|
close(state->sockfd);
|
||||||
freeaddrinfo(addr);
|
freeaddrinfo(addr);
|
||||||
|
ret = "connect() failed";
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,6 +57,7 @@ static void connectAndSend(FFNetworkingState* state)
|
|||||||
if(send(state->sockfd, state->command.chars, state->command.length, 0) < 0)
|
if(send(state->sockfd, state->command.chars, state->command.length, 0) < 0)
|
||||||
{
|
{
|
||||||
close(state->sockfd);
|
close(state->sockfd);
|
||||||
|
ret = "send() failed";
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,11 +69,13 @@ error:
|
|||||||
exit:
|
exit:
|
||||||
ffStrbufDestroy(&state->host);
|
ffStrbufDestroy(&state->host);
|
||||||
ffStrbufDestroy(&state->command);
|
ffStrbufDestroy(&state->command);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
FF_THREAD_ENTRY_DECL_WRAPPER(connectAndSend, FFNetworkingState*);
|
FF_THREAD_ENTRY_DECL_WRAPPER(connectAndSend, FFNetworkingState*);
|
||||||
|
|
||||||
bool ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, const char* path, const char* headers)
|
const char* ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, const char* path, const char* headers)
|
||||||
{
|
{
|
||||||
ffStrbufInitS(&state->host, host);
|
ffStrbufInitS(&state->host, host);
|
||||||
|
|
||||||
@@ -66,22 +89,30 @@ bool ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, con
|
|||||||
ffStrbufAppendS(&state->command, "\r\n");
|
ffStrbufAppendS(&state->command, "\r\n");
|
||||||
|
|
||||||
#ifdef FF_HAVE_THREADS
|
#ifdef FF_HAVE_THREADS
|
||||||
|
if (instance.config.general.multithreading)
|
||||||
|
{
|
||||||
state->thread = ffThreadCreate(connectAndSendThreadMain, state);
|
state->thread = ffThreadCreate(connectAndSendThreadMain, state);
|
||||||
return !!state->thread;
|
return state->thread ? NULL : "ffThreadCreate(connectAndSend) failed";
|
||||||
#else
|
}
|
||||||
connectAndSend(state);
|
|
||||||
return state->sockfd != -1;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
return connectAndSend(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer, uint32_t timeout)
|
const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer)
|
||||||
{
|
{
|
||||||
|
uint32_t timeout = state->timeout;
|
||||||
|
|
||||||
#ifdef FF_HAVE_THREADS
|
#ifdef FF_HAVE_THREADS
|
||||||
|
if (instance.config.general.multithreading)
|
||||||
|
{
|
||||||
if (!ffThreadJoin(state->thread, timeout))
|
if (!ffThreadJoin(state->thread, timeout))
|
||||||
return false;
|
return "ffThreadJoin() failed or timeout";
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(state->sockfd == -1)
|
if(state->sockfd == -1)
|
||||||
return false;
|
return "ffNetworkingSendHttpRequest() failed";
|
||||||
|
|
||||||
if(timeout > 0)
|
if(timeout > 0)
|
||||||
{
|
{
|
||||||
@@ -91,14 +122,15 @@ bool ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer, ui
|
|||||||
setsockopt(state->sockfd, SOL_SOCKET, SO_RCVTIMEO, &timev, sizeof(timev));
|
setsockopt(state->sockfd, SOL_SOCKET, SO_RCVTIMEO, &timev, sizeof(timev));
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, ffStrbufGetFree(buffer), 0);
|
uint32_t recvStart;
|
||||||
|
do {
|
||||||
if(received > 0)
|
recvStart = buffer->length;
|
||||||
{
|
ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, ffStrbufGetFree(buffer), 0);
|
||||||
|
if (received <= 0) break;
|
||||||
buffer->length += (uint32_t) received;
|
buffer->length += (uint32_t) received;
|
||||||
buffer->chars[buffer->length] = '\0';
|
buffer->chars[buffer->length] = '\0';
|
||||||
}
|
} while (ffStrbufGetFree(buffer) > 0 && strstr(buffer->chars + recvStart, "\r\n\r\n") == NULL);
|
||||||
|
|
||||||
close(state->sockfd);
|
close(state->sockfd);
|
||||||
return ffStrbufStartsWithS(buffer, "HTTP/1.1 200 OK\r\n");
|
return ffStrbufStartsWithS(buffer, "HTTP/1.1 200 OK\r\n") ? NULL : "Invalid response";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,48 +33,48 @@ static const char* initWsaData(WSADATA* wsaData)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, const char* path, const char* headers)
|
const char* ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, const char* path, const char* headers)
|
||||||
{
|
{
|
||||||
static WSADATA wsaData;
|
static WSADATA wsaData;
|
||||||
if (wsaData.wVersion == 0)
|
if (wsaData.wVersion == 0)
|
||||||
{
|
{
|
||||||
if (initWsaData(&wsaData) != NULL)
|
const char* error = initWsaData(&wsaData);
|
||||||
|
if (error != NULL)
|
||||||
{
|
{
|
||||||
wsaData.wVersion = (WORD) -1;
|
wsaData.wVersion = (WORD) -1;
|
||||||
return false;
|
return error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (wsaData.wVersion == (WORD) -1)
|
else if (wsaData.wVersion == (WORD) -1)
|
||||||
return false;
|
return "initWsaData() failed before";
|
||||||
|
|
||||||
memset(state, 0, sizeof(*state));
|
|
||||||
|
|
||||||
struct addrinfo* addr;
|
struct addrinfo* addr;
|
||||||
|
|
||||||
if(getaddrinfo(host, "80", &(struct addrinfo) {
|
if(getaddrinfo(host, "80", &(struct addrinfo) {
|
||||||
.ai_family = AF_INET,
|
.ai_family = state->ipv6 ? AF_INET6 : AF_INET,
|
||||||
.ai_socktype = SOCK_STREAM,
|
.ai_socktype = SOCK_STREAM,
|
||||||
}, &addr) != 0)
|
}, &addr) != 0)
|
||||||
return false;
|
return "getaddrinfo() failed";
|
||||||
|
|
||||||
state->sockfd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
|
state->sockfd = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
|
||||||
if(state->sockfd == INVALID_SOCKET)
|
if(state->sockfd == INVALID_SOCKET)
|
||||||
{
|
{
|
||||||
freeaddrinfo(addr);
|
freeaddrinfo(addr);
|
||||||
return false;
|
return "socket() failed";
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
//ConnectEx requires the socket to be initially bound
|
//ConnectEx requires the socket to be initially bound
|
||||||
struct sockaddr_in addr = {
|
if(bind(state->sockfd, (SOCKADDR *) &(struct sockaddr_in) {
|
||||||
.sin_family = AF_INET,
|
.sin_family = AF_INET,
|
||||||
.sin_addr.s_addr = INADDR_ANY,
|
.sin_addr.s_addr = INADDR_ANY,
|
||||||
.sin_port = 0,
|
.sin_port = 0,
|
||||||
};
|
}, sizeof(struct sockaddr_in)) != 0)
|
||||||
if(bind(state->sockfd, (SOCKADDR *)&addr, sizeof(addr)) != 0)
|
|
||||||
{
|
{
|
||||||
printf("bind %d\n", WSAGetLastError());
|
closesocket(state->sockfd);
|
||||||
return false;
|
freeaddrinfo(addr);
|
||||||
|
state->sockfd = INVALID_SOCKET;
|
||||||
|
return "bind() failed";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,35 +93,52 @@ bool ffNetworkingSendHttpRequest(FFNetworkingState* state, const char* host, con
|
|||||||
if(!result && WSAGetLastError() != WSA_IO_PENDING)
|
if(!result && WSAGetLastError() != WSA_IO_PENDING)
|
||||||
{
|
{
|
||||||
closesocket(state->sockfd);
|
closesocket(state->sockfd);
|
||||||
return false;
|
freeaddrinfo(addr);
|
||||||
|
state->sockfd = INVALID_SOCKET;
|
||||||
|
return "ConnectEx() failed";
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer, uint32_t timeout)
|
const char* ffNetworkingRecvHttpResponse(FFNetworkingState* state, FFstrbuf* buffer)
|
||||||
{
|
{
|
||||||
|
if (state->sockfd == INVALID_SOCKET)
|
||||||
|
return "ffNetworkingSendHttpRequest() failed";
|
||||||
|
|
||||||
|
uint32_t timeout = state->timeout;
|
||||||
|
if (timeout > 0)
|
||||||
|
{
|
||||||
|
if (WaitForSingleObject((HANDLE) state->sockfd, timeout) != WAIT_OBJECT_0)
|
||||||
|
{
|
||||||
|
CancelIo((HANDLE) state->sockfd);
|
||||||
|
closesocket(state->sockfd);
|
||||||
|
return "WaitForSingleObject(state->sockfd) failed or timeout";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DWORD transfer, flags;
|
DWORD transfer, flags;
|
||||||
if (!WSAGetOverlappedResult(state->sockfd, &state->overlapped, &transfer, TRUE, &flags))
|
if (!WSAGetOverlappedResult(state->sockfd, &state->overlapped, &transfer, TRUE, &flags))
|
||||||
{
|
{
|
||||||
closesocket(state->sockfd);
|
closesocket(state->sockfd);
|
||||||
return false;
|
return "WSAGetOverlappedResult() failed";
|
||||||
}
|
}
|
||||||
|
|
||||||
if(timeout > 0)
|
if(timeout > 0)
|
||||||
{
|
{
|
||||||
//https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
|
//https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-setsockopt
|
||||||
setsockopt(state->sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout));
|
setsockopt(state->sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*) &timeout, sizeof(timeout));
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, (int)ffStrbufGetFree(buffer), 0);
|
uint32_t recvStart;
|
||||||
|
do {
|
||||||
if(received > 0)
|
recvStart = buffer->length;
|
||||||
{
|
ssize_t received = recv(state->sockfd, buffer->chars + buffer->length, (int) ffStrbufGetFree(buffer), 0);
|
||||||
buffer->length += (uint32_t) received;
|
if (received <= 0) break;
|
||||||
|
buffer->length = recvStart + (uint32_t) received;
|
||||||
buffer->chars[buffer->length] = '\0';
|
buffer->chars[buffer->length] = '\0';
|
||||||
}
|
} while (ffStrbufGetFree(buffer) > 0 && strstr(buffer->chars + recvStart, "\r\n\r\n") == NULL);
|
||||||
|
|
||||||
closesocket(state->sockfd);
|
closesocket(state->sockfd);
|
||||||
return ffStrbufStartsWithS(buffer, "HTTP/1.1 200 OK\r\n");
|
return ffStrbufStartsWithS(buffer, "HTTP/1.1 200 OK\r\n") ? NULL : "Invalid response";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,16 @@ bool ffOptionParseModuleArgs(const char* argumentKey, const char* subKey, const
|
|||||||
ffOptionParseString(argumentKey, value, &result->outputFormat);
|
ffOptionParseString(argumentKey, value, &result->outputFormat);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if(ffStrEqualsIgnCase(subKey, "output-color"))
|
||||||
|
{
|
||||||
|
if(value == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error: usage: %s <str>\n", argumentKey);
|
||||||
|
exit(477);
|
||||||
|
}
|
||||||
|
ffOptionParseColor(value, &result->outputColor);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else if(ffStrEqualsIgnCase(subKey, "key-color"))
|
else if(ffStrEqualsIgnCase(subKey, "key-color"))
|
||||||
{
|
{
|
||||||
if(value == NULL)
|
if(value == NULL)
|
||||||
@@ -148,6 +158,12 @@ void ffOptionParseColor(const char* value, FFstrbuf* buffer)
|
|||||||
FF_APPEND_COLOR_CODE_COND(reset_, FF_COLOR_MODE_RESET)
|
FF_APPEND_COLOR_CODE_COND(reset_, FF_COLOR_MODE_RESET)
|
||||||
else FF_APPEND_COLOR_CODE_COND(bright_, FF_COLOR_MODE_BOLD)
|
else FF_APPEND_COLOR_CODE_COND(bright_, FF_COLOR_MODE_BOLD)
|
||||||
else FF_APPEND_COLOR_CODE_COND(dim_, FF_COLOR_MODE_DIM)
|
else FF_APPEND_COLOR_CODE_COND(dim_, FF_COLOR_MODE_DIM)
|
||||||
|
else FF_APPEND_COLOR_CODE_COND(italic_, FF_COLOR_MODE_ITALIC)
|
||||||
|
else FF_APPEND_COLOR_CODE_COND(underline_, FF_COLOR_MODE_UNDERLINE)
|
||||||
|
else FF_APPEND_COLOR_CODE_COND(blink_, FF_COLOR_MODE_BLINK)
|
||||||
|
else FF_APPEND_COLOR_CODE_COND(inverse_, FF_COLOR_MODE_INVERSE)
|
||||||
|
else FF_APPEND_COLOR_CODE_COND(hidden_, FF_COLOR_MODE_HIDDEN)
|
||||||
|
else FF_APPEND_COLOR_CODE_COND(strike_, FF_COLOR_MODE_STRIKETHROUGH)
|
||||||
else FF_APPEND_COLOR_CODE_COND(black, FF_COLOR_FG_BLACK)
|
else FF_APPEND_COLOR_CODE_COND(black, FF_COLOR_FG_BLACK)
|
||||||
else FF_APPEND_COLOR_CODE_COND(red, FF_COLOR_FG_RED)
|
else FF_APPEND_COLOR_CODE_COND(red, FF_COLOR_FG_RED)
|
||||||
else FF_APPEND_COLOR_CODE_COND(green, FF_COLOR_FG_GREEN)
|
else FF_APPEND_COLOR_CODE_COND(green, FF_COLOR_FG_GREEN)
|
||||||
@@ -180,6 +196,7 @@ void ffOptionInitModuleArg(FFModuleArgs* args)
|
|||||||
ffStrbufInit(&args->key);
|
ffStrbufInit(&args->key);
|
||||||
ffStrbufInit(&args->keyColor);
|
ffStrbufInit(&args->keyColor);
|
||||||
ffStrbufInit(&args->outputFormat);
|
ffStrbufInit(&args->outputFormat);
|
||||||
|
ffStrbufInit(&args->outputColor);
|
||||||
args->keyWidth = 0;
|
args->keyWidth = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,4 +205,5 @@ void ffOptionDestroyModuleArg(FFModuleArgs* args)
|
|||||||
ffStrbufDestroy(&args->key);
|
ffStrbufDestroy(&args->key);
|
||||||
ffStrbufDestroy(&args->keyColor);
|
ffStrbufDestroy(&args->keyColor);
|
||||||
ffStrbufDestroy(&args->outputFormat);
|
ffStrbufDestroy(&args->outputFormat);
|
||||||
|
ffStrbufDestroy(&args->outputColor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ typedef struct FFModuleArgs
|
|||||||
FFstrbuf key;
|
FFstrbuf key;
|
||||||
FFstrbuf keyColor;
|
FFstrbuf keyColor;
|
||||||
FFstrbuf outputFormat;
|
FFstrbuf outputFormat;
|
||||||
|
FFstrbuf outputColor;
|
||||||
uint32_t keyWidth;
|
uint32_t keyWidth;
|
||||||
} FFModuleArgs;
|
} FFModuleArgs;
|
||||||
|
|
||||||
|
|||||||
@@ -100,19 +100,19 @@ void ffParseGTK(FFstrbuf* buffer, const FFstrbuf* gtk2, const FFstrbuf* gtk3, co
|
|||||||
{
|
{
|
||||||
if(gtk2->length > 0 && gtk3->length > 0 && gtk4->length > 0)
|
if(gtk2->length > 0 && gtk3->length > 0 && gtk4->length > 0)
|
||||||
{
|
{
|
||||||
if((ffStrbufIgnCaseComp(gtk2, gtk3) == 0) && (ffStrbufIgnCaseComp(gtk2, gtk4) == 0))
|
if((ffStrbufIgnCaseEqual(gtk2, gtk3)) && (ffStrbufIgnCaseEqual(gtk2, gtk4)))
|
||||||
{
|
{
|
||||||
ffStrbufAppend(buffer, gtk4);
|
ffStrbufAppend(buffer, gtk4);
|
||||||
ffStrbufAppendS(buffer, " [GTK2/3/4]");
|
ffStrbufAppendS(buffer, " [GTK2/3/4]");
|
||||||
}
|
}
|
||||||
else if(ffStrbufIgnCaseComp(gtk2, gtk3) == 0)
|
else if(ffStrbufIgnCaseEqual(gtk2, gtk3))
|
||||||
{
|
{
|
||||||
ffStrbufAppend(buffer, gtk3);
|
ffStrbufAppend(buffer, gtk3);
|
||||||
ffStrbufAppendS(buffer, " [GTK2/3], ");
|
ffStrbufAppendS(buffer, " [GTK2/3], ");
|
||||||
ffStrbufAppend(buffer, gtk4);
|
ffStrbufAppend(buffer, gtk4);
|
||||||
ffStrbufAppendS(buffer, " [GTK4]");
|
ffStrbufAppendS(buffer, " [GTK4]");
|
||||||
}
|
}
|
||||||
else if(ffStrbufIgnCaseComp(gtk3, gtk4) == 0)
|
else if(ffStrbufIgnCaseEqual(gtk3, gtk4))
|
||||||
{
|
{
|
||||||
ffStrbufAppend(buffer, gtk2);
|
ffStrbufAppend(buffer, gtk2);
|
||||||
ffStrbufAppendS(buffer, " [GTK2], ");
|
ffStrbufAppendS(buffer, " [GTK2], ");
|
||||||
@@ -131,7 +131,7 @@ void ffParseGTK(FFstrbuf* buffer, const FFstrbuf* gtk2, const FFstrbuf* gtk3, co
|
|||||||
}
|
}
|
||||||
else if(gtk2->length > 0 && gtk3->length > 0)
|
else if(gtk2->length > 0 && gtk3->length > 0)
|
||||||
{
|
{
|
||||||
if(ffStrbufIgnCaseComp(gtk2, gtk3) == 0)
|
if(ffStrbufIgnCaseEqual(gtk2, gtk3))
|
||||||
{
|
{
|
||||||
ffStrbufAppend(buffer, gtk3);
|
ffStrbufAppend(buffer, gtk3);
|
||||||
ffStrbufAppendS(buffer, " [GTK2/3]");
|
ffStrbufAppendS(buffer, " [GTK2/3]");
|
||||||
@@ -146,7 +146,7 @@ void ffParseGTK(FFstrbuf* buffer, const FFstrbuf* gtk2, const FFstrbuf* gtk3, co
|
|||||||
}
|
}
|
||||||
else if(gtk3->length > 0 && gtk4->length > 0)
|
else if(gtk3->length > 0 && gtk4->length > 0)
|
||||||
{
|
{
|
||||||
if(ffStrbufIgnCaseComp(gtk3, gtk4) == 0)
|
if(ffStrbufIgnCaseEqual(gtk3, gtk4))
|
||||||
{
|
{
|
||||||
ffStrbufAppend(buffer, gtk4);
|
ffStrbufAppend(buffer, gtk4);
|
||||||
ffStrbufAppendS(buffer, " [GTK3/4]");
|
ffStrbufAppendS(buffer, " [GTK3/4]");
|
||||||
|
|||||||
+15
-3
@@ -6,7 +6,15 @@
|
|||||||
#include "util/textModifier.h"
|
#include "util/textModifier.h"
|
||||||
#include "util/stringUtils.h"
|
#include "util/stringUtils.h"
|
||||||
|
|
||||||
void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFColorRangeConfig config)
|
static void appendOutputColor(FFstrbuf* buffer, const FFModuleArgs* module)
|
||||||
|
{
|
||||||
|
if (module->outputColor.length)
|
||||||
|
ffStrbufAppendF(buffer, "\e[%sm", module->outputColor.chars);
|
||||||
|
else if (instance.config.display.colorOutput.length)
|
||||||
|
ffStrbufAppendF(buffer, "\e[%sm", instance.config.display.colorOutput.chars);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFColorRangeConfig config, const FFModuleArgs* module)
|
||||||
{
|
{
|
||||||
uint8_t green = config.green, yellow = config.yellow;
|
uint8_t green = config.green, yellow = config.yellow;
|
||||||
assert(green <= 100 && yellow <= 100);
|
assert(green <= 100 && yellow <= 100);
|
||||||
@@ -66,16 +74,19 @@ void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFColorRangeConfig con
|
|||||||
if(options->barBorder)
|
if(options->barBorder)
|
||||||
{
|
{
|
||||||
if(!options->pipe)
|
if(!options->pipe)
|
||||||
ffStrbufAppendS(buffer, "\e[" FF_COLOR_FG_LIGHT_WHITE "m ]");
|
ffStrbufAppendS(buffer, "\e[" FF_COLOR_FG_LIGHT_WHITE "m ]");\
|
||||||
else
|
else
|
||||||
ffStrbufAppendS(buffer, " ]");
|
ffStrbufAppendS(buffer, " ]");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!options->pipe)
|
if(!options->pipe)
|
||||||
|
{
|
||||||
ffStrbufAppendS(buffer, FASTFETCH_TEXT_MODIFIER_RESET);
|
ffStrbufAppendS(buffer, FASTFETCH_TEXT_MODIFIER_RESET);
|
||||||
|
appendOutputColor(buffer, module);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ffPercentAppendNum(FFstrbuf* buffer, double percent, FFColorRangeConfig config, bool parentheses)
|
void ffPercentAppendNum(FFstrbuf* buffer, double percent, FFColorRangeConfig config, bool parentheses, const FFModuleArgs* module)
|
||||||
{
|
{
|
||||||
uint8_t green = config.green, yellow = config.yellow;
|
uint8_t green = config.green, yellow = config.yellow;
|
||||||
assert(green <= 100 && yellow <= 100);
|
assert(green <= 100 && yellow <= 100);
|
||||||
@@ -120,6 +131,7 @@ void ffPercentAppendNum(FFstrbuf* buffer, double percent, FFColorRangeConfig con
|
|||||||
if (colored && !options->pipe)
|
if (colored && !options->pipe)
|
||||||
{
|
{
|
||||||
ffStrbufAppendS(buffer, FASTFETCH_TEXT_MODIFIER_RESET);
|
ffStrbufAppendS(buffer, FASTFETCH_TEXT_MODIFIER_RESET);
|
||||||
|
appendOutputColor(buffer, module);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parentheses)
|
if (parentheses)
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "util/FFstrbuf.h"
|
#include "util/FFstrbuf.h"
|
||||||
#include "common/parsing.h"
|
#include "common/parsing.h"
|
||||||
|
#include "common/option.h"
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
@@ -21,8 +22,8 @@ enum
|
|||||||
// [yellow, green): print yellow
|
// [yellow, green): print yellow
|
||||||
// [0, yellow): print red
|
// [0, yellow): print red
|
||||||
|
|
||||||
void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFColorRangeConfig config);
|
void ffPercentAppendBar(FFstrbuf* buffer, double percent, FFColorRangeConfig config, const FFModuleArgs* module);
|
||||||
void ffPercentAppendNum(FFstrbuf* buffer, double percent, FFColorRangeConfig config, bool parentheses);
|
void ffPercentAppendNum(FFstrbuf* buffer, double percent, FFColorRangeConfig config, bool parentheses, const FFModuleArgs* module);
|
||||||
|
|
||||||
typedef struct yyjson_val yyjson_val;
|
typedef struct yyjson_val yyjson_val;
|
||||||
typedef struct yyjson_mut_doc yyjson_mut_doc;
|
typedef struct yyjson_mut_doc yyjson_mut_doc;
|
||||||
|
|||||||
+10
-13
@@ -37,9 +37,9 @@ void ffPrintLogoAndKey(const char* moduleName, uint8_t moduleIndex, const FFModu
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
FF_STRBUF_AUTO_DESTROY key = ffStrbufCreate();
|
FF_STRBUF_AUTO_DESTROY key = ffStrbufCreate();
|
||||||
ffParseFormatString(&key, &moduleArgs->key, 1, (FFformatarg[]){
|
FF_PARSE_FORMAT_STRING_CHECKED(&key, &moduleArgs->key, 1, ((FFformatarg[]){
|
||||||
{FF_FORMAT_ARG_TYPE_UINT8, &moduleIndex}
|
{FF_FORMAT_ARG_TYPE_UINT8, &moduleIndex}
|
||||||
});
|
}));
|
||||||
ffStrbufWriteTo(&key, stdout);
|
ffStrbufWriteTo(&key, stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,8 +49,13 @@ void ffPrintLogoAndKey(const char* moduleName, uint8_t moduleIndex, const FFModu
|
|||||||
ffStrbufWriteTo(&instance.config.display.keyValueSeparator, stdout);
|
ffStrbufWriteTo(&instance.config.display.keyValueSeparator, stdout);
|
||||||
|
|
||||||
if(!instance.config.display.pipe)
|
if(!instance.config.display.pipe)
|
||||||
|
{
|
||||||
fputs(FASTFETCH_TEXT_MODIFIER_RESET, stdout);
|
fputs(FASTFETCH_TEXT_MODIFIER_RESET, stdout);
|
||||||
|
if (moduleArgs->outputColor.length)
|
||||||
|
ffPrintColor(&moduleArgs->outputColor);
|
||||||
|
else if (instance.config.display.colorOutput.length)
|
||||||
|
ffPrintColor(&instance.config.display.colorOutput);
|
||||||
|
}
|
||||||
|
|
||||||
if (!instance.config.display.pipe && !(printType & FF_PRINT_TYPE_NO_CUSTOM_KEY_WIDTH))
|
if (!instance.config.display.pipe && !(printType & FF_PRINT_TYPE_NO_CUSTOM_KEY_WIDTH))
|
||||||
{
|
{
|
||||||
@@ -60,7 +65,7 @@ void ffPrintLogoAndKey(const char* moduleName, uint8_t moduleIndex, const FFModu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ffPrintFormatString(const char* moduleName, uint8_t moduleIndex, const FFModuleArgs* moduleArgs, FFPrintType printType, uint32_t numArgs, const FFformatarg* arguments)
|
void ffPrintFormat(const char* moduleName, uint8_t moduleIndex, const FFModuleArgs* moduleArgs, FFPrintType printType, uint32_t numArgs, const FFformatarg* arguments)
|
||||||
{
|
{
|
||||||
FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate();
|
FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate();
|
||||||
if (moduleArgs)
|
if (moduleArgs)
|
||||||
@@ -93,7 +98,7 @@ static void printError(const char* moduleName, uint8_t moduleIndex, const FFModu
|
|||||||
putchar('\n');
|
putchar('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
void ffPrintErrorString(const char* moduleName, uint8_t moduleIndex, const FFModuleArgs* moduleArgs, FFPrintType printType, const char* message, ...)
|
void ffPrintError(const char* moduleName, uint8_t moduleIndex, const FFModuleArgs* moduleArgs, FFPrintType printType, const char* message, ...)
|
||||||
{
|
{
|
||||||
va_list arguments;
|
va_list arguments;
|
||||||
va_start(arguments, message);
|
va_start(arguments, message);
|
||||||
@@ -101,14 +106,6 @@ void ffPrintErrorString(const char* moduleName, uint8_t moduleIndex, const FFMod
|
|||||||
va_end(arguments);
|
va_end(arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ffPrintError(const char* moduleName, uint8_t moduleIndex, const FFModuleArgs* moduleArgs, const char* message, ...)
|
|
||||||
{
|
|
||||||
va_list arguments;
|
|
||||||
va_start(arguments, message);
|
|
||||||
printError(moduleName, moduleIndex, moduleArgs, FF_PRINT_TYPE_DEFAULT, message, arguments);
|
|
||||||
va_end(arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ffPrintColor(const FFstrbuf* colorValue)
|
void ffPrintColor(const FFstrbuf* colorValue)
|
||||||
{
|
{
|
||||||
//If the color is not set, this would reset in \033[m, which resets everything.
|
//If the color is not set, this would reset in \033[m, which resets everything.
|
||||||
|
|||||||
+10
-7
@@ -12,14 +12,17 @@ typedef enum FFPrintType {
|
|||||||
} FFPrintType;
|
} FFPrintType;
|
||||||
|
|
||||||
void ffPrintLogoAndKey(const char* moduleName, uint8_t moduleIndex, const FFModuleArgs* moduleArgs, FFPrintType printType);
|
void ffPrintLogoAndKey(const char* moduleName, uint8_t moduleIndex, const FFModuleArgs* moduleArgs, FFPrintType printType);
|
||||||
void ffPrintFormatString(const char* moduleName, uint8_t moduleIndex, const FFModuleArgs* moduleArgs, FFPrintType printType, uint32_t numArgs, const FFformatarg* arguments);
|
void ffPrintFormat(const char* moduleName, uint8_t moduleIndex, const FFModuleArgs* moduleArgs, FFPrintType printType, uint32_t numArgs, const FFformatarg* arguments);
|
||||||
static inline void ffPrintFormat(const char* moduleName, uint8_t moduleIndex, const FFModuleArgs* moduleArgs, uint32_t numArgs, const FFformatarg* arguments)
|
#define FF_PRINT_FORMAT_CHECKED(moduleName, moduleIndex, moduleArgs, printType, numArgs, arguments) do {\
|
||||||
{
|
static_assert(sizeof(arguments) / sizeof(*(arguments)) == (numArgs), "Invalid number of format arguments");\
|
||||||
ffPrintFormatString(moduleName, moduleIndex, moduleArgs, FF_PRINT_TYPE_DEFAULT, numArgs, arguments);
|
ffPrintFormat((moduleName), (moduleIndex), (moduleArgs), (printType), (numArgs), (arguments));\
|
||||||
}
|
} while (0)
|
||||||
FF_C_PRINTF(5, 6) void ffPrintErrorString(const char* moduleName, uint8_t moduleIndex, const FFModuleArgs* moduleArgs, FFPrintType printType, const char* message, ...);
|
FF_C_PRINTF(5, 6) void ffPrintError(const char* moduleName, uint8_t moduleIndex, const FFModuleArgs* moduleArgs, FFPrintType printType, const char* message, ...);
|
||||||
FF_C_PRINTF(4, 5) void ffPrintError(const char* moduleName, uint8_t moduleIndex, const FFModuleArgs* moduleArgs, const char* message, ...);
|
|
||||||
void ffPrintColor(const FFstrbuf* colorValue);
|
void ffPrintColor(const FFstrbuf* colorValue);
|
||||||
void ffPrintCharTimes(char c, uint32_t times);
|
void ffPrintCharTimes(char c, uint32_t times);
|
||||||
|
|
||||||
void ffPrintModuleFormatHelp(const char* name, const char* def, uint32_t numArgs, const char* args[]);
|
void ffPrintModuleFormatHelp(const char* name, const char* def, uint32_t numArgs, const char* args[]);
|
||||||
|
#define FF_PRINT_MODULE_FORMAT_HELP_CHECKED(moduleName, def, numArgs, args) do {\
|
||||||
|
static_assert(sizeof(args) / sizeof(*(args)) == (numArgs), "Invalid number of format arguments");\
|
||||||
|
ffPrintModuleFormatHelp((moduleName), (def), (numArgs), (args));\
|
||||||
|
} while (0)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ const char* ffProcessAppendOutput(FFstrbuf* buffer, char* const argv[], bool use
|
|||||||
{
|
{
|
||||||
kill(childPid, SIGTERM);
|
kill(childPid, SIGTERM);
|
||||||
waitpid(childPid, NULL, 0);
|
waitpid(childPid, NULL, 0);
|
||||||
return "poll(&pollfd, 1, timeout) timeout";
|
return "poll(&pollfd, 1, timeout) timeout (try increasing --processing-timeout)";
|
||||||
}
|
}
|
||||||
else if (pollfd.revents & POLLERR)
|
else if (pollfd.revents & POLLERR)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ const char* ffProcessAppendOutput(FFstrbuf* buffer, char* const argv[], bool use
|
|||||||
{
|
{
|
||||||
CancelIo(hChildPipeRead);
|
CancelIo(hChildPipeRead);
|
||||||
TerminateProcess(hProcess, 1);
|
TerminateProcess(hProcess, 1);
|
||||||
return "WaitForSingleObject(hChildPipeRead) failed or timeout";
|
return "WaitForSingleObject(hChildPipeRead) failed or timeout (try increasing --processing-timeout)";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!GetOverlappedResult(hChildPipeRead, &overlapped, &nRead, FALSE))
|
if (!GetOverlappedResult(hChildPipeRead, &overlapped, &nRead, FALSE))
|
||||||
|
|||||||
+29
-36
@@ -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;
|
||||||
@@ -154,16 +150,13 @@ bool ffParsePropFileListValues(const FFlist* list, const char* relativeFile, uin
|
|||||||
{
|
{
|
||||||
bool foundAFile = false;
|
bool foundAFile = false;
|
||||||
|
|
||||||
FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreateA(64);
|
|
||||||
|
|
||||||
FF_LIST_FOR_EACH(FFstrbuf, dirPrefix, *list)
|
FF_LIST_FOR_EACH(FFstrbuf, dirPrefix, *list)
|
||||||
{
|
{
|
||||||
//We need to copy the dir each time, because it used by multiple threads, so we can't directly write to it.
|
const uint32_t dirPrefixLength = dirPrefix->length;
|
||||||
ffStrbufSet(&baseDir, dirPrefix);
|
ffStrbufAppendS(dirPrefix, relativeFile);
|
||||||
ffStrbufAppendS(&baseDir, relativeFile);
|
if(ffParsePropFileValues(dirPrefix->chars, numQueries, queries))
|
||||||
|
|
||||||
if(ffParsePropFileValues(baseDir.chars, numQueries, queries))
|
|
||||||
foundAFile = true;
|
foundAFile = true;
|
||||||
|
ffStrbufSubstrBefore(dirPrefix, dirPrefixLength);
|
||||||
|
|
||||||
bool allSet = true;
|
bool allSet = true;
|
||||||
for(uint32_t k = 0; k < numQueries; k++)
|
for(uint32_t k = 0; k < numQueries; k++)
|
||||||
|
|||||||
+8
-2
@@ -3,7 +3,7 @@
|
|||||||
#include "util/textModifier.h"
|
#include "util/textModifier.h"
|
||||||
#include "util/stringUtils.h"
|
#include "util/stringUtils.h"
|
||||||
|
|
||||||
void ffTempsAppendNum(double celsius, FFstrbuf* buffer, FFColorRangeConfig config)
|
void ffTempsAppendNum(double celsius, FFstrbuf* buffer, FFColorRangeConfig config, const FFModuleArgs* module)
|
||||||
{
|
{
|
||||||
if (celsius != celsius) // ignores NaN
|
if (celsius != celsius) // ignores NaN
|
||||||
return;
|
return;
|
||||||
@@ -37,7 +37,7 @@ void ffTempsAppendNum(double celsius, FFstrbuf* buffer, FFColorRangeConfig confi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (options->temperatureUnit)
|
switch (options->tempUnit)
|
||||||
{
|
{
|
||||||
case FF_TEMPERATURE_UNIT_CELSIUS:
|
case FF_TEMPERATURE_UNIT_CELSIUS:
|
||||||
ffStrbufAppendF(buffer, "%.*f°C", options->tempNdigits, celsius);
|
ffStrbufAppendF(buffer, "%.*f°C", options->tempNdigits, celsius);
|
||||||
@@ -51,7 +51,13 @@ void ffTempsAppendNum(double celsius, FFstrbuf* buffer, FFColorRangeConfig confi
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!options->pipe)
|
if (!options->pipe)
|
||||||
|
{
|
||||||
ffStrbufAppendS(buffer, FASTFETCH_TEXT_MODIFIER_RESET);
|
ffStrbufAppendS(buffer, FASTFETCH_TEXT_MODIFIER_RESET);
|
||||||
|
if (module->outputColor.length)
|
||||||
|
ffStrbufAppendF(buffer, "\e[%sm", module->outputColor.chars);
|
||||||
|
else if (instance.config.display.colorOutput.length)
|
||||||
|
ffStrbufAppendF(buffer, "\e[%sm", instance.config.display.colorOutput.chars);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ffTempsParseCommandOptions(const char* key, const char* subkey, const char* value, bool* useTemp, FFColorRangeConfig* config)
|
bool ffTempsParseCommandOptions(const char* key, const char* subkey, const char* value, bool* useTemp, FFColorRangeConfig* config)
|
||||||
|
|||||||
+2
-1
@@ -1,8 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "common/parsing.h"
|
#include "common/parsing.h"
|
||||||
|
#include "common/option.h"
|
||||||
|
|
||||||
void ffTempsAppendNum(double celsius, FFstrbuf* buffer, FFColorRangeConfig config);
|
void ffTempsAppendNum(double celsius, FFstrbuf* buffer, FFColorRangeConfig config, const FFModuleArgs* module);
|
||||||
bool ffTempsParseCommandOptions(const char* key, const char* subkey, const char* value, bool* useTemp, FFColorRangeConfig* config);
|
bool ffTempsParseCommandOptions(const char* key, const char* subkey, const char* value, bool* useTemp, FFColorRangeConfig* config);
|
||||||
bool ffTempsParseJsonObject(const char* key, yyjson_val* value, bool* useTemp, FFColorRangeConfig* config);
|
bool ffTempsParseJsonObject(const char* key, yyjson_val* value, bool* useTemp, FFColorRangeConfig* config);
|
||||||
void ffTempsGenerateJsonConfig(yyjson_mut_doc* doc, yyjson_mut_val* module, FF_MAYBE_UNUSED bool defaultTemp, FFColorRangeConfig defaultConfig, bool temp, FFColorRangeConfig config);
|
void ffTempsGenerateJsonConfig(yyjson_mut_doc* doc, yyjson_mut_val* module, FF_MAYBE_UNUSED bool defaultTemp, FFColorRangeConfig defaultConfig, bool temp, FFColorRangeConfig config);
|
||||||
|
|||||||
+36
-2
@@ -1,12 +1,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdio.h>
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <synchapi.h>
|
#include <synchapi.h>
|
||||||
#include <profileapi.h>
|
#include <profileapi.h>
|
||||||
#include <sysinfoapi.h>
|
#include <sysinfoapi.h>
|
||||||
#else
|
|
||||||
#include <time.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline uint64_t ffTimeGetTick() //In msec
|
static inline uint64_t ffTimeGetTick() //In msec
|
||||||
@@ -45,3 +45,37 @@ static inline void ffTimeSleep(uint32_t msec)
|
|||||||
nanosleep(&(struct timespec){ msec / 1000, (long) (msec % 1000) * 1000000 }, NULL);
|
nanosleep(&(struct timespec){ msec / 1000, (long) (msec % 1000) * 1000000 }, NULL);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wformat"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Not thread-safe
|
||||||
|
static inline const char* ffTimeToFullStr(uint64_t msec)
|
||||||
|
{
|
||||||
|
if (msec == 0) return "";
|
||||||
|
time_t tsec = (time_t) (msec / 1000);
|
||||||
|
const struct tm* tm = localtime(&tsec);
|
||||||
|
|
||||||
|
static char buf[32];
|
||||||
|
strftime(buf, __builtin_strlen("0000-00-00T00:00:00") + 1, "%FT%T", tm);
|
||||||
|
snprintf(buf + __builtin_strlen("0000-00-00T00:00:00"), __builtin_strlen(".000") + 1, ".%03u", (unsigned) (msec % 1000));
|
||||||
|
strftime(buf + __builtin_strlen("0000-00-00T00:00:00.000"), __builtin_strlen("+0000") + 1, "%z", tm);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not thread-safe
|
||||||
|
static inline const char* ffTimeToShortStr(uint64_t msec)
|
||||||
|
{
|
||||||
|
if (msec == 0) return "";
|
||||||
|
time_t tsec = (time_t) (msec / 1000);
|
||||||
|
|
||||||
|
static char buf[32];
|
||||||
|
strftime(buf, sizeof(buf), "%F %T", localtime(&tsec));
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|||||||
+68
-23
@@ -436,7 +436,7 @@
|
|||||||
{
|
{
|
||||||
"long": "color-keys",
|
"long": "color-keys",
|
||||||
"desc": "Set the color of the keys",
|
"desc": "Set the color of the keys",
|
||||||
"remark": "See `-h color` for the list of available colors",
|
"remark": "Doesn't affect module Title, Separator and Colors. See `-h color` for the list of available colors",
|
||||||
"arg": {
|
"arg": {
|
||||||
"type": "color"
|
"type": "color"
|
||||||
}
|
}
|
||||||
@@ -449,6 +449,14 @@
|
|||||||
"type": "color"
|
"type": "color"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"long": "color-output",
|
||||||
|
"desc": "Set the color of module output",
|
||||||
|
"remark": "See `-h color` for the list of available colors",
|
||||||
|
"arg": {
|
||||||
|
"type": "color"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"long": "color",
|
"long": "color",
|
||||||
"desc": "Set the color of both the keys and title",
|
"desc": "Set the color of both the keys and title",
|
||||||
@@ -481,22 +489,6 @@
|
|||||||
"default": ": "
|
"default": ": "
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"long": "set",
|
|
||||||
"desc": "Hard set the value of a key",
|
|
||||||
"remark": "Deprecated. Use \"Custom\" module instead",
|
|
||||||
"arg": {
|
|
||||||
"type": "key=value"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"long": "set-keyless",
|
|
||||||
"desc": "Hard set the value of a key, but don't print the key or the separator",
|
|
||||||
"remark": "Deprecated. Use \"Custom\" module instead",
|
|
||||||
"arg": {
|
|
||||||
"type": "key=value"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"long": "show-errors",
|
"long": "show-errors",
|
||||||
"desc": "Print occurring errors",
|
"desc": "Print occurring errors",
|
||||||
@@ -521,7 +513,7 @@
|
|||||||
"arg": {
|
"arg": {
|
||||||
"type": "bool",
|
"type": "bool",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"default": true
|
"default": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -702,6 +694,16 @@
|
|||||||
"type": "color",
|
"type": "color",
|
||||||
"default": "light_red"
|
"default": "light_red"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"long": "ts-version",
|
||||||
|
"desc": "Whether to detect and display the version of terminal and shell",
|
||||||
|
"remark": "Mainly for benchmarking",
|
||||||
|
"arg": {
|
||||||
|
"type": "bool",
|
||||||
|
"optional": true,
|
||||||
|
"default": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"Library path": [
|
"Library path": [
|
||||||
@@ -928,16 +930,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"long": "os-file",
|
"long": "separator-output-color",
|
||||||
"desc": "Set the additional file path which containing OS information",
|
"desc": "Set the color of the separator module",
|
||||||
"remark": "Linux only",
|
|
||||||
"arg": {
|
"arg": {
|
||||||
"type": "path"
|
"type": "color",
|
||||||
|
"default": "default"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"long": "disk-folders",
|
"long": "disk-folders",
|
||||||
"desc": "A colon (semicolon on Windows) separated list of folder paths for the disk output",
|
"desc": "A colon (semicolon on Windows) separated list of folder paths to be detected",
|
||||||
|
"remark": "On Windows, a drive latter must be upper cased and end with \"\\\". \"/\" is used as an alias of the system drive. This option overrides other disk-show-* options",
|
||||||
"arg": {
|
"arg": {
|
||||||
"type": "path",
|
"type": "path",
|
||||||
"default": "Auto detection using mount-points"
|
"default": "Auto detection using mount-points"
|
||||||
@@ -1225,6 +1228,14 @@
|
|||||||
"default": false
|
"default": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"long": "loadavg-ndigits",
|
||||||
|
"desc": "Set the number of digits to keep after the decimal point when printing load average",
|
||||||
|
"arg": {
|
||||||
|
"type": "num",
|
||||||
|
"default": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"long": "localip-show-ipv4",
|
"long": "localip-show-ipv4",
|
||||||
"desc": "Show IPv4 addresses in local ip module",
|
"desc": "Show IPv4 addresses in local ip module",
|
||||||
@@ -1261,6 +1272,15 @@
|
|||||||
"default": false
|
"default": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"long": "localip-show-prefix-len",
|
||||||
|
"desc": "Show network prefix length (/N) in local ip module",
|
||||||
|
"arg": {
|
||||||
|
"type": "bool",
|
||||||
|
"optional": true,
|
||||||
|
"default": true
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"long": "localip-name-prefix",
|
"long": "localip-name-prefix",
|
||||||
"desc": "Show interfaces with given interface name prefix only",
|
"desc": "Show interfaces with given interface name prefix only",
|
||||||
@@ -1278,6 +1298,15 @@
|
|||||||
"default": true
|
"default": true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"long": "localip-show-all-ips",
|
||||||
|
"desc": "Show all IPs bound to the same interface. By default only the first IP is shown",
|
||||||
|
"arg": {
|
||||||
|
"type": "bool",
|
||||||
|
"optional": true,
|
||||||
|
"default": false
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"long": "localip-compact",
|
"long": "localip-compact",
|
||||||
"desc": "Show all IPs in one line",
|
"desc": "Show all IPs in one line",
|
||||||
@@ -1328,6 +1357,14 @@
|
|||||||
"type": "str"
|
"type": "str"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"long": "publicip-ipv6",
|
||||||
|
"desc": "Whether to use IPv6 for public IP detection server",
|
||||||
|
"arg": {
|
||||||
|
"type": "bool",
|
||||||
|
"default": false
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"long": "weather-location",
|
"long": "weather-location",
|
||||||
"desc": "Set the location to be used",
|
"desc": "Set the location to be used",
|
||||||
@@ -1502,6 +1539,14 @@
|
|||||||
},
|
},
|
||||||
"pseudo": true
|
"pseudo": true
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"long": "<module>-output-color",
|
||||||
|
"desc": "Override the global \"--color-output\" option for each specific module",
|
||||||
|
"arg": {
|
||||||
|
"type": "color"
|
||||||
|
},
|
||||||
|
"pseudo": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"long": "<module>-key-width",
|
"long": "<module>-key-width",
|
||||||
"desc": "Override the global \"--key-width\" option for each specific module",
|
"desc": "Override the global \"--key-width\" option for each specific module",
|
||||||
|
|||||||
@@ -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 underline_green` is also supported
|
||||||
|
--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.
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ static const char* parseTermuxApi(FFBatteryOptions* options, FFlist* results)
|
|||||||
ffStrbufInit(&battery->modelName);
|
ffStrbufInit(&battery->modelName);
|
||||||
ffStrbufInit(&battery->status);
|
ffStrbufInit(&battery->status);
|
||||||
ffStrbufInit(&battery->technology);
|
ffStrbufInit(&battery->technology);
|
||||||
|
ffStrbufInit(&battery->serial);
|
||||||
ffStrbufInit(&battery->manufactureDate);
|
ffStrbufInit(&battery->manufactureDate);
|
||||||
|
|
||||||
battery->capacity = yyjson_get_num(yyjson_obj_get(root, "percentage"));
|
battery->capacity = yyjson_get_num(yyjson_obj_get(root, "percentage"));
|
||||||
@@ -77,6 +78,8 @@ static const char* parseDumpsys(FFBatteryOptions* options, FFlist* results)
|
|||||||
ffStrbufInit(&battery->modelName);
|
ffStrbufInit(&battery->modelName);
|
||||||
ffStrbufInit(&battery->status);
|
ffStrbufInit(&battery->status);
|
||||||
ffStrbufInit(&battery->technology);
|
ffStrbufInit(&battery->technology);
|
||||||
|
ffStrbufInit(&battery->serial);
|
||||||
|
ffStrbufInit(&battery->manufactureDate);
|
||||||
|
|
||||||
if (ffParsePropLines(start, "AC powered: ", &temp) && ffStrbufEqualS(&temp, "true"))
|
if (ffParsePropLines(start, "AC powered: ", &temp) && ffStrbufEqualS(&temp, "true"))
|
||||||
ffStrbufAppendS(&battery->status, "AC powered");
|
ffStrbufAppendS(&battery->status, "AC powered");
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -157,8 +154,6 @@ static const char* detectWithSetupApi(FFBatteryOptions* options, FFlist* results
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct FFSmbiosPortableBattery
|
typedef struct FFSmbiosPortableBattery
|
||||||
{
|
{
|
||||||
FFSmbiosHeader Header;
|
FFSmbiosHeader Header;
|
||||||
@@ -181,11 +176,18 @@ typedef struct FFSmbiosPortableBattery
|
|||||||
uint8_t SbdsDeviceChemistry; // string
|
uint8_t SbdsDeviceChemistry; // string
|
||||||
uint8_t DesignCapacityMultiplier; // varies
|
uint8_t DesignCapacityMultiplier; // varies
|
||||||
uint16_t OEMSpecific; // varies
|
uint16_t OEMSpecific; // varies
|
||||||
} FFSmbiosPortableBattery;
|
} __attribute__((__packed__)) FFSmbiosPortableBattery;
|
||||||
|
|
||||||
|
static_assert(offsetof(FFSmbiosPortableBattery, OEMSpecific) == 0x16,
|
||||||
|
"FFSmbiosPortableBattery: Wrong struct alignment");
|
||||||
|
|
||||||
const char* detectBySmbios(FFBatteryResult* battery)
|
const char* detectBySmbios(FFBatteryResult* battery)
|
||||||
{
|
{
|
||||||
const FFSmbiosPortableBattery* data = (const FFSmbiosPortableBattery*) (*ffGetSmbiosHeaderTable())[FF_SMBIOS_TYPE_PORTABLE_BATTERY];
|
const FFSmbiosHeaderTable* smbiosTable = ffGetSmbiosHeaderTable();
|
||||||
|
if (!smbiosTable)
|
||||||
|
return "Failed to get SMBIOS data";
|
||||||
|
|
||||||
|
const FFSmbiosPortableBattery* data = (const FFSmbiosPortableBattery*) (*smbiosTable)[FF_SMBIOS_TYPE_PORTABLE_BATTERY];
|
||||||
if (!data)
|
if (!data)
|
||||||
return "Portable battery section is not found in SMBIOS data";
|
return "Portable battery section is not found in SMBIOS data";
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ typedef struct FFSmbiosBios
|
|||||||
uint16_t BiosStartingAddressSegment; // varies
|
uint16_t BiosStartingAddressSegment; // varies
|
||||||
uint8_t BiosReleaseDate; // string
|
uint8_t BiosReleaseDate; // string
|
||||||
uint8_t BiosRomSize; // string
|
uint8_t BiosRomSize; // string
|
||||||
uint32_t BiosCharacteristics; // bit field
|
uint64_t BiosCharacteristics; // bit field
|
||||||
|
|
||||||
// 2.4+
|
// 2.4+
|
||||||
uint8_t BiosCharacteristicsExtensionBytes[2]; // bit field
|
uint8_t BiosCharacteristicsExtensionBytes[2]; // bit field
|
||||||
@@ -46,11 +46,18 @@ typedef struct FFSmbiosBios
|
|||||||
|
|
||||||
// 3.1+
|
// 3.1+
|
||||||
uint16_t ExtendedBiosRomSize; // bit field
|
uint16_t ExtendedBiosRomSize; // bit field
|
||||||
} FFSmbiosBios;
|
} __attribute__((__packed__)) FFSmbiosBios;
|
||||||
|
|
||||||
|
static_assert(offsetof(FFSmbiosBios, ExtendedBiosRomSize) == 0x18,
|
||||||
|
"FFSmbiosBios: Wrong struct alignment");
|
||||||
|
|
||||||
const char* ffDetectBios(FFBiosResult* bios)
|
const char* ffDetectBios(FFBiosResult* bios)
|
||||||
{
|
{
|
||||||
const FFSmbiosBios* data = (const FFSmbiosBios*) (*ffGetSmbiosHeaderTable())[FF_SMBIOS_TYPE_BIOS];
|
const FFSmbiosHeaderTable* smbiosTable = ffGetSmbiosHeaderTable();
|
||||||
|
if (!smbiosTable)
|
||||||
|
return "Failed to get SMBIOS data";
|
||||||
|
|
||||||
|
const FFSmbiosBios* data = (const FFSmbiosBios*) (*smbiosTable)[FF_SMBIOS_TYPE_BIOS];
|
||||||
if (!data)
|
if (!data)
|
||||||
return "BIOS section is not found in SMBIOS data";
|
return "BIOS section is not found in SMBIOS data";
|
||||||
|
|
||||||
|
|||||||
@@ -14,13 +14,20 @@ typedef struct FFSmbiosBaseboard
|
|||||||
uint8_t LocationInChassis; // string
|
uint8_t LocationInChassis; // string
|
||||||
uint16_t ChassisHandle; // varies
|
uint16_t ChassisHandle; // varies
|
||||||
uint8_t BoardType; // enum
|
uint8_t BoardType; // enum
|
||||||
uint8_t NumberOfContainedObjectHandle; // varies
|
uint8_t NumberOfContainedObjectHandles; // varies
|
||||||
uint16_t ContainedObjectHandle[]; // varies
|
uint16_t ContainedObjectHandles[]; // varies
|
||||||
} FFSmbiosBaseboard;
|
} __attribute__((__packed__)) FFSmbiosBaseboard;
|
||||||
|
|
||||||
|
static_assert(offsetof(FFSmbiosBaseboard, ContainedObjectHandles) == 0x0F,
|
||||||
|
"FFSmbiosBaseboard: Wrong struct alignment");
|
||||||
|
|
||||||
const char* ffDetectBoard(FFBoardResult* board)
|
const char* ffDetectBoard(FFBoardResult* board)
|
||||||
{
|
{
|
||||||
const FFSmbiosBaseboard* data = (const FFSmbiosBaseboard*) (*ffGetSmbiosHeaderTable())[FF_SMBIOS_TYPE_BASEBOARD_INFO];
|
const FFSmbiosHeaderTable* smbiosTable = ffGetSmbiosHeaderTable();
|
||||||
|
if (!smbiosTable)
|
||||||
|
return "Failed to get SMBIOS data";
|
||||||
|
|
||||||
|
const FFSmbiosBaseboard* data = (const FFSmbiosBaseboard*) (*smbiosTable)[FF_SMBIOS_TYPE_BASEBOARD_INFO];
|
||||||
if (!data)
|
if (!data)
|
||||||
return "Baseboard information section is not found in SMBIOS data";
|
return "Baseboard information section is not found in SMBIOS data";
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,31 @@
|
|||||||
#include "camera.h"
|
#include "camera.h"
|
||||||
|
#include "common/io/io.h"
|
||||||
|
|
||||||
#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)
|
||||||
{
|
{
|
||||||
AVCaptureDeviceDiscoverySession* session = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera] mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionUnspecified];
|
FF_SUPPRESS_IO(); // #822
|
||||||
|
|
||||||
|
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
|
||||||
|
position:AVCaptureDevicePositionUnspecified];
|
||||||
if (!session)
|
if (!session)
|
||||||
return "Failed to create AVCaptureDeviceDiscoverySession";
|
return "Failed to create AVCaptureDeviceDiscoverySession";
|
||||||
|
|
||||||
|
|||||||
@@ -25,11 +25,18 @@ typedef struct FFSmbiosSystemEnclosure
|
|||||||
uint8_t ContainedElementCount; // varies
|
uint8_t ContainedElementCount; // varies
|
||||||
uint8_t ContainedRecordLength; // varies
|
uint8_t ContainedRecordLength; // varies
|
||||||
uint8_t ContainedElements[]; // varies
|
uint8_t ContainedElements[]; // varies
|
||||||
} FFSmbiosSystemEnclosure;
|
} __attribute__((__packed__)) FFSmbiosSystemEnclosure;
|
||||||
|
|
||||||
|
static_assert(offsetof(FFSmbiosSystemEnclosure, ContainedElements) == 0x15,
|
||||||
|
"FFSmbiosSystemEnclosure: Wrong struct alignment");
|
||||||
|
|
||||||
const char* ffDetectChassis(FFChassisResult* result)
|
const char* ffDetectChassis(FFChassisResult* result)
|
||||||
{
|
{
|
||||||
const FFSmbiosSystemEnclosure* data = (const FFSmbiosSystemEnclosure*) (*ffGetSmbiosHeaderTable())[FF_SMBIOS_TYPE_SYSTEM_ENCLOSURE];
|
const FFSmbiosHeaderTable* smbiosTable = ffGetSmbiosHeaderTable();
|
||||||
|
if (!smbiosTable)
|
||||||
|
return "Failed to get SMBIOS data";
|
||||||
|
|
||||||
|
const FFSmbiosSystemEnclosure* data = (const FFSmbiosSystemEnclosure*) (*smbiosTable)[FF_SMBIOS_TYPE_SYSTEM_ENCLOSURE];
|
||||||
if (!data)
|
if (!data)
|
||||||
return "System enclosure is not found in SMBIOS data";
|
return "System enclosure is not found in SMBIOS data";
|
||||||
|
|
||||||
|
|||||||
@@ -18,3 +18,24 @@ const char* ffDetectCPU(const FFCPUOptions* options, FFCPUResult* cpu)
|
|||||||
ffStrbufTrimRight(&cpu->name, ' '); //If we removed the @ in previous step there was most likely a space before it
|
ffStrbufTrimRight(&cpu->name, ' '); //If we removed the @ in previous step there was most likely a space before it
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* ffCPUAppleCodeToName(uint32_t code)
|
||||||
|
{
|
||||||
|
// https://github.com/AsahiLinux/docs/wiki/Codenames
|
||||||
|
switch (code)
|
||||||
|
{
|
||||||
|
case 8103: return "Apple M1";
|
||||||
|
case 6000: return "Apple M1 Pro";
|
||||||
|
case 6001: return "Apple M1 Max";
|
||||||
|
case 6002: return "Apple M1 Ultra";
|
||||||
|
case 8112: return "Apple M2";
|
||||||
|
case 6020: return "Apple M2 Pro";
|
||||||
|
case 6021: return "Apple M2 Max";
|
||||||
|
case 6022: return "Apple M2 Ultra";
|
||||||
|
case 8122: return "Apple M3";
|
||||||
|
case 6030: return "Apple M3 Pro";
|
||||||
|
case 6031:
|
||||||
|
case 6034: return "Apple M3 Max";
|
||||||
|
default: return "Apple Silicon";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -13,10 +13,13 @@ typedef struct FFCPUResult
|
|||||||
uint16_t coresLogical;
|
uint16_t coresLogical;
|
||||||
uint16_t coresOnline;
|
uint16_t coresOnline;
|
||||||
|
|
||||||
double frequencyMin; // GHz
|
double frequencyBase; // GHz
|
||||||
double frequencyMax; // GHz
|
double frequencyMax; // GHz
|
||||||
|
double frequencyMin; // GHz
|
||||||
|
|
||||||
double temperature;
|
double temperature;
|
||||||
} FFCPUResult;
|
} FFCPUResult;
|
||||||
|
|
||||||
|
const char* ffCPUDetectByCpuid(FFCPUResult* cpu);
|
||||||
const char* ffDetectCPU(const FFCPUOptions* options, FFCPUResult* cpu);
|
const char* ffDetectCPU(const FFCPUOptions* options, FFCPUResult* cpu);
|
||||||
|
const char* ffCPUAppleCodeToName(uint32_t code);
|
||||||
|
|||||||
@@ -60,14 +60,13 @@ static const char* detectFrequency(FFCPUResult* cpu)
|
|||||||
ffCfDictGetData(properties, CFSTR("voltage-states5-sram"), pCoreLength - 8, 4, (uint8_t*) &aMax, NULL);
|
ffCfDictGetData(properties, CFSTR("voltage-states5-sram"), pCoreLength - 8, 4, (uint8_t*) &aMax, NULL);
|
||||||
cpu->frequencyMax = aMax / (1000.0 * 1000 * 1000);
|
cpu->frequencyMax = aMax / (1000.0 * 1000 * 1000);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
cpu->frequencyMax = 0.0;
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static const char* detectFrequency(FFCPUResult* cpu)
|
static const char* detectFrequency(FFCPUResult* cpu)
|
||||||
{
|
{
|
||||||
|
cpu->frequencyBase = ffSysctlGetInt64("hw.cpufrequency", 0) / 1000.0 / 1000.0 / 1000.0;
|
||||||
cpu->frequencyMin = ffSysctlGetInt64("hw.cpufrequency_min", 0) / 1000.0 / 1000.0 / 1000.0;
|
cpu->frequencyMin = ffSysctlGetInt64("hw.cpufrequency_min", 0) / 1000.0 / 1000.0 / 1000.0;
|
||||||
cpu->frequencyMax = ffSysctlGetInt64("hw.cpufrequency_max", 0);
|
cpu->frequencyMax = ffSysctlGetInt64("hw.cpufrequency_max", 0);
|
||||||
if(cpu->frequencyMax > 0.0)
|
if(cpu->frequencyMax > 0.0)
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu)
|
|||||||
cpu->coresLogical = cpu->coresPhysical;
|
cpu->coresLogical = cpu->coresPhysical;
|
||||||
cpu->coresOnline = cpu->coresPhysical;
|
cpu->coresOnline = cpu->coresPhysical;
|
||||||
|
|
||||||
cpu->frequencyMin = ffSysctlGetInt("hw.clockrate", 0) / 1000.0;
|
int clockRate = ffSysctlGetInt("hw.clockrate", 0);
|
||||||
cpu->frequencyMax = cpu->frequencyMin;
|
cpu->frequencyBase = clockRate <= 0 ? 0.0/0.0 : clockRate / 1000.0;
|
||||||
cpu->temperature = FF_CPU_TEMP_UNSET;
|
cpu->temperature = FF_CPU_TEMP_UNSET;
|
||||||
|
|
||||||
if (options->temp)
|
if (options->temp)
|
||||||
|
|||||||
@@ -17,7 +17,10 @@
|
|||||||
static void detectAndroid(FFCPUResult* cpu)
|
static void detectAndroid(FFCPUResult* cpu)
|
||||||
{
|
{
|
||||||
if (cpu->name.length == 0)
|
if (cpu->name.length == 0)
|
||||||
|
{
|
||||||
ffSettingsGetAndroidProperty("ro.soc.model", &cpu->name);
|
ffSettingsGetAndroidProperty("ro.soc.model", &cpu->name);
|
||||||
|
ffStrbufClear(&cpu->vendor); // We usually detect the vendor of CPU core as ARM, but instead we want the vendor of SOC
|
||||||
|
}
|
||||||
if (cpu->vendor.length == 0)
|
if (cpu->vendor.length == 0)
|
||||||
{
|
{
|
||||||
if (!ffSettingsGetAndroidProperty("ro.soc.manufacturer", &cpu->vendor))
|
if (!ffSettingsGetAndroidProperty("ro.soc.manufacturer", &cpu->vendor))
|
||||||
@@ -94,11 +97,14 @@ static double getFrequency(FFstrbuf* basePath, const char* cpuinfoFileName, cons
|
|||||||
if (ok)
|
if (ok)
|
||||||
return ffStrbufToDouble(buffer) / 1e6;
|
return ffStrbufToDouble(buffer) / 1e6;
|
||||||
|
|
||||||
ffStrbufAppendS(basePath, scalingFileName);
|
if (scalingFileName)
|
||||||
ok = ffReadFileBuffer(basePath->chars, buffer);
|
{
|
||||||
ffStrbufSubstrBefore(basePath, baseLen);
|
ffStrbufAppendS(basePath, scalingFileName);
|
||||||
if (ok)
|
ok = ffReadFileBuffer(basePath->chars, buffer);
|
||||||
return ffStrbufToDouble(buffer) / 1e6;
|
ffStrbufSubstrBefore(basePath, baseLen);
|
||||||
|
if (ok)
|
||||||
|
return ffStrbufToDouble(buffer) / 1e6;
|
||||||
|
}
|
||||||
|
|
||||||
return 0.0/0.0;
|
return 0.0/0.0;
|
||||||
}
|
}
|
||||||
@@ -107,9 +113,10 @@ static bool detectFrequency(FFCPUResult* cpu)
|
|||||||
{
|
{
|
||||||
FF_STRBUF_AUTO_DESTROY path = ffStrbufCreateS("/sys/devices/system/cpu/cpufreq/");
|
FF_STRBUF_AUTO_DESTROY path = ffStrbufCreateS("/sys/devices/system/cpu/cpufreq/");
|
||||||
FF_AUTO_CLOSE_DIR DIR* dir = opendir(path.chars);
|
FF_AUTO_CLOSE_DIR DIR* dir = opendir(path.chars);
|
||||||
|
if (!dir) return false;
|
||||||
|
|
||||||
FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate();
|
FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate();
|
||||||
uint32_t baseLen = path.length;
|
uint32_t baseLen = path.length;
|
||||||
bool flag = false;
|
|
||||||
|
|
||||||
struct dirent* entry;
|
struct dirent* entry;
|
||||||
while((entry = readdir(dir)) != NULL)
|
while((entry = readdir(dir)) != NULL)
|
||||||
@@ -117,26 +124,34 @@ static bool detectFrequency(FFCPUResult* cpu)
|
|||||||
if (ffStrStartsWith(entry->d_name, "policy") && isdigit(entry->d_name[strlen("policy")]))
|
if (ffStrStartsWith(entry->d_name, "policy") && isdigit(entry->d_name[strlen("policy")]))
|
||||||
{
|
{
|
||||||
ffStrbufAppendS(&path, entry->d_name);
|
ffStrbufAppendS(&path, entry->d_name);
|
||||||
double fmin = getFrequency(&path, "/cpuinfo_min_freq", "/scaling_min_freq", &buffer);
|
double fbase = getFrequency(&path, "/base_frequency", NULL, &buffer);
|
||||||
if (fmin != fmin) continue;
|
if (fbase == fbase)
|
||||||
double fmax = getFrequency(&path, "/cpuinfo_max_freq", "/scaling_max_freq", &buffer);
|
|
||||||
if (fmax != fmax) continue;
|
|
||||||
|
|
||||||
if (flag)
|
|
||||||
{
|
{
|
||||||
cpu->frequencyMin = cpu->frequencyMin < fmin ? cpu->frequencyMin : fmin;
|
if (cpu->frequencyBase == cpu->frequencyBase)
|
||||||
cpu->frequencyMax = cpu->frequencyMax > fmax ? cpu->frequencyMax : fmax;
|
cpu->frequencyBase = cpu->frequencyBase > fbase ? cpu->frequencyBase : fbase;
|
||||||
|
else
|
||||||
|
cpu->frequencyBase = fbase;
|
||||||
}
|
}
|
||||||
else
|
double fmax = getFrequency(&path, "/cpuinfo_max_freq", "/scaling_max_freq", &buffer);
|
||||||
|
if (fmax == fmax)
|
||||||
{
|
{
|
||||||
cpu->frequencyMin = fmin;
|
if (cpu->frequencyMax == cpu->frequencyMax)
|
||||||
cpu->frequencyMax = fmax;
|
cpu->frequencyMax = cpu->frequencyMax > fmax ? cpu->frequencyMax : fmax;
|
||||||
flag = true;
|
else
|
||||||
|
cpu->frequencyMax = fmax;
|
||||||
|
}
|
||||||
|
double fmin = getFrequency(&path, "/cpuinfo_min_freq", "/scaling_min_freq", &buffer);
|
||||||
|
if (fmin == fmin)
|
||||||
|
{
|
||||||
|
if (cpu->frequencyMin == cpu->frequencyMin)
|
||||||
|
cpu->frequencyMin = cpu->frequencyMin < fmin ? cpu->frequencyMin : fmin;
|
||||||
|
else
|
||||||
|
cpu->frequencyMin = fmin;
|
||||||
}
|
}
|
||||||
ffStrbufSubstrBefore(&path, baseLen);
|
ffStrbufSubstrBefore(&path, baseLen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return flag;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static double detectCPUTemp(void)
|
static double detectCPUTemp(void)
|
||||||
@@ -195,23 +210,8 @@ void detectAsahi(FFCPUResult* cpu)
|
|||||||
char* modelName = memchr(content, '\0', (size_t) length) + 1;
|
char* modelName = memchr(content, '\0', (size_t) length) + 1;
|
||||||
if (modelName - content < length && ffStrStartsWith(modelName, "apple,t"))
|
if (modelName - content < length && ffStrStartsWith(modelName, "apple,t"))
|
||||||
{
|
{
|
||||||
// https://github.com/AsahiLinux/docs/wiki/Codenames
|
uint32_t deviceId = (uint32_t) strtoul(modelName + strlen("apple,t"), NULL, 10);
|
||||||
switch (strtoul(modelName + strlen("apple,t"), NULL, 10))
|
ffStrbufSetStatic(&cpu->name, ffCPUAppleCodeToName(deviceId));
|
||||||
{
|
|
||||||
case 8103: ffStrbufSetStatic(&cpu->name, "Apple M1"); break;
|
|
||||||
case 6000: ffStrbufSetStatic(&cpu->name, "Apple M1 Pro"); break;
|
|
||||||
case 6001: ffStrbufSetStatic(&cpu->name, "Apple M1 Max"); break;
|
|
||||||
case 6002: ffStrbufSetStatic(&cpu->name, "Apple M1 Ultra"); break;
|
|
||||||
case 8112: ffStrbufSetStatic(&cpu->name, "Apple M2"); break;
|
|
||||||
case 6020: ffStrbufSetStatic(&cpu->name, "Apple M2 Pro"); break;
|
|
||||||
case 6021: ffStrbufSetStatic(&cpu->name, "Apple M2 Max"); break;
|
|
||||||
case 6022: ffStrbufSetStatic(&cpu->name, "Apple M2 Ultra"); break;
|
|
||||||
case 8122: ffStrbufSetStatic(&cpu->name, "Apple M3"); break;
|
|
||||||
case 6030: ffStrbufSetStatic(&cpu->name, "Apple M3 Pro"); break;
|
|
||||||
case 6031:
|
|
||||||
case 6034: ffStrbufSetStatic(&cpu->name, "Apple M3 Max"); break;
|
|
||||||
default: ffStrbufSetStatic(&cpu->name, "Apple Silicon"); break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -232,8 +232,8 @@ const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu)
|
|||||||
cpu->coresOnline = (uint16_t) get_nprocs();
|
cpu->coresOnline = (uint16_t) get_nprocs();
|
||||||
cpu->coresPhysical = (uint16_t) ffStrbufToUInt(&physicalCoresBuffer, cpu->coresLogical);
|
cpu->coresPhysical = (uint16_t) ffStrbufToUInt(&physicalCoresBuffer, cpu->coresLogical);
|
||||||
|
|
||||||
if (!detectFrequency(cpu))
|
if (!detectFrequency(cpu) || cpu->frequencyBase != cpu->frequencyBase)
|
||||||
cpu->frequencyMin = cpu->frequencyMax = ffStrbufToDouble(&cpuMHz) / 1000;
|
cpu->frequencyBase = ffStrbufToDouble(&cpuMHz) / 1000;
|
||||||
|
|
||||||
if(cpuUarch.length > 0)
|
if(cpuUarch.length > 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -48,11 +48,43 @@ typedef struct FFSmbiosProcessorInfo
|
|||||||
|
|
||||||
// 3.6+
|
// 3.6+
|
||||||
uint16_t ThreadEnabled; // varies
|
uint16_t ThreadEnabled; // varies
|
||||||
} FFSmbiosProcessorInfo;
|
} __attribute__((__packed__)) FFSmbiosProcessorInfo;
|
||||||
|
|
||||||
|
static_assert(offsetof(FFSmbiosProcessorInfo, ThreadEnabled) == 0x30,
|
||||||
|
"FFSmbiosProcessorInfo: Wrong struct alignment");
|
||||||
|
|
||||||
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
|
|
||||||
|
#include <cpuid.h>
|
||||||
|
|
||||||
|
inline static const char* detectSpeedByCpuid(FFCPUResult* cpu)
|
||||||
|
{
|
||||||
|
uint32_t base = 0, max = 0, bus = 0, unused = 0;
|
||||||
|
if (!__get_cpuid(0x16, &base, &max, &bus, &unused))
|
||||||
|
return "Unsupported instruction";
|
||||||
|
|
||||||
|
// cpuid returns 0 MHz when hyper-v is enabled
|
||||||
|
if (base) cpu->frequencyBase = base / 1000.0;
|
||||||
|
if (max) cpu->frequencyMax = max / 1000.0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
inline static const char* detectSpeedByCpuid(FF_MAYBE_UNUSED FFCPUResult* cpu)
|
||||||
|
{
|
||||||
|
return "Unsupported platform";
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static const char* detectMaxSpeedBySmbios(FFCPUResult* cpu)
|
static const char* detectMaxSpeedBySmbios(FFCPUResult* cpu)
|
||||||
{
|
{
|
||||||
const FFSmbiosProcessorInfo* data = (const FFSmbiosProcessorInfo*) (*ffGetSmbiosHeaderTable())[FF_SMBIOS_TYPE_PROCESSOR_INFO];
|
const FFSmbiosHeaderTable* smbiosTable = ffGetSmbiosHeaderTable();
|
||||||
|
if (!smbiosTable)
|
||||||
|
return "Failed to get SMBIOS data";
|
||||||
|
|
||||||
|
const FFSmbiosProcessorInfo* data = (const FFSmbiosProcessorInfo*) (*smbiosTable)[FF_SMBIOS_TYPE_PROCESSOR_INFO];
|
||||||
|
|
||||||
if (!data)
|
if (!data)
|
||||||
return "Processor information is not found in SMBIOS data";
|
return "Processor information is not found in SMBIOS data";
|
||||||
@@ -64,75 +96,89 @@ static const char* detectMaxSpeedBySmbios(FFCPUResult* cpu)
|
|||||||
return "No active CPU is found in SMBIOS data";
|
return "No active CPU is found in SMBIOS data";
|
||||||
}
|
}
|
||||||
|
|
||||||
double speed;
|
double speed = data->MaxSpeed / 1000.0;
|
||||||
if (data->MaxSpeed > 0 && data->MaxSpeed < 30000) // VMware reports weird values
|
// Sometimes SMBIOS reports invalid value. We assume that max speed is small than 2x of base
|
||||||
speed = data->MaxSpeed / 1000.0;
|
if (speed < cpu->frequencyBase || speed > cpu->frequencyBase * 2)
|
||||||
else
|
return "Possible invalid CPU max speed in SMBIOS data. See #800";
|
||||||
speed = data->CurrentSpeed / 1000.0;
|
|
||||||
|
|
||||||
if (cpu->frequencyMax < speed)
|
cpu->frequencyMax = speed;
|
||||||
cpu->frequencyMax = speed;
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* detectByOS(FFCPUResult* cpu)
|
static const char* detectNCores(FFCPUResult* cpu)
|
||||||
{
|
{
|
||||||
|
DWORD length = 0;
|
||||||
|
GetLogicalProcessorInformationEx(RelationAll, NULL, &length);
|
||||||
|
if (length == 0)
|
||||||
|
return "GetLogicalProcessorInformationEx(RelationAll, NULL, &length) failed";
|
||||||
|
|
||||||
|
SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX* FF_AUTO_FREE
|
||||||
|
pProcessorInfo = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*)malloc(length);
|
||||||
|
|
||||||
|
if (!pProcessorInfo || !GetLogicalProcessorInformationEx(RelationAll, pProcessorInfo, &length))
|
||||||
|
return "GetLogicalProcessorInformationEx(RelationAll, pProcessorInfo, &length) failed";
|
||||||
|
|
||||||
|
for(
|
||||||
|
SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX* ptr = pProcessorInfo;
|
||||||
|
(uint8_t*)ptr < ((uint8_t*)pProcessorInfo) + length;
|
||||||
|
ptr = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*)(((uint8_t*)ptr) + ptr->Size)
|
||||||
|
)
|
||||||
{
|
{
|
||||||
DWORD length = 0;
|
if(ptr->Relationship == RelationProcessorCore)
|
||||||
GetLogicalProcessorInformationEx(RelationAll, NULL, &length);
|
++cpu->coresPhysical;
|
||||||
if (length == 0)
|
else if(ptr->Relationship == RelationGroup)
|
||||||
return "GetLogicalProcessorInformationEx(RelationAll, NULL, &length) failed";
|
|
||||||
|
|
||||||
SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX* FF_AUTO_FREE
|
|
||||||
pProcessorInfo = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*)malloc(length);
|
|
||||||
|
|
||||||
if (pProcessorInfo && GetLogicalProcessorInformationEx(RelationAll, pProcessorInfo, &length))
|
|
||||||
{
|
{
|
||||||
for(
|
for (uint32_t index = 0; index < ptr->Group.ActiveGroupCount; ++index)
|
||||||
SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX* ptr = pProcessorInfo;
|
|
||||||
(uint8_t*)ptr < ((uint8_t*)pProcessorInfo) + length;
|
|
||||||
ptr = (SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX*)(((uint8_t*)ptr) + ptr->Size)
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
if(ptr->Relationship == RelationProcessorCore)
|
cpu->coresOnline += ptr->Group.GroupInfo[index].ActiveProcessorCount;
|
||||||
++cpu->coresPhysical;
|
cpu->coresLogical += ptr->Group.GroupInfo[index].MaximumProcessorCount;
|
||||||
else if(ptr->Relationship == RelationGroup)
|
|
||||||
{
|
|
||||||
cpu->coresOnline += ptr->Group.GroupInfo->ActiveProcessorCount;
|
|
||||||
cpu->coresLogical += ptr->Group.GroupInfo->MaximumProcessorCount;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
return "GetLogicalProcessorInformationEx(RelationAll, pProcessorInfo, &length) failed";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char* detectByRegistry(FFCPUResult* cpu)
|
||||||
|
{
|
||||||
FF_HKEY_AUTO_DESTROY hKey = NULL;
|
FF_HKEY_AUTO_DESTROY hKey = NULL;
|
||||||
if(!ffRegOpenKeyForRead(HKEY_LOCAL_MACHINE, L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", &hKey, NULL))
|
if(!ffRegOpenKeyForRead(HKEY_LOCAL_MACHINE, L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", &hKey, NULL))
|
||||||
return "ffRegOpenKeyForRead(HKEY_LOCAL_MACHINE, L\"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\", &hKey, NULL) failed";
|
return "ffRegOpenKeyForRead(HKEY_LOCAL_MACHINE, L\"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\", &hKey, NULL) failed";
|
||||||
|
|
||||||
|
if (detectSpeedByCpuid(cpu) != NULL || cpu->frequencyBase != cpu->frequencyBase)
|
||||||
{
|
{
|
||||||
uint32_t mhz;
|
uint32_t mhz;
|
||||||
if(ffRegReadUint(hKey, L"~MHz", &mhz, NULL))
|
if(ffRegReadUint(hKey, L"~MHz", &mhz, NULL))
|
||||||
cpu->frequencyMin = cpu->frequencyMax = mhz / 1000.0;
|
cpu->frequencyBase = mhz / 1000.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ffRegReadStrbuf(hKey, L"ProcessorNameString", &cpu->name, NULL);
|
ffRegReadStrbuf(hKey, L"ProcessorNameString", &cpu->name, NULL);
|
||||||
ffRegReadStrbuf(hKey, L"VendorIdentifier", &cpu->vendor, NULL);
|
ffRegReadStrbuf(hKey, L"VendorIdentifier", &cpu->vendor, NULL);
|
||||||
|
|
||||||
|
if (cpu->coresLogical == 0)
|
||||||
|
{
|
||||||
|
DWORD cores;
|
||||||
|
if (RegQueryInfoKeyW(HKEY_LOCAL_MACHINE, L"HARDWARE\\DESCRIPTION\\System\\CentralProcessor", NULL, NULL, &cores, NULL, NULL, NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
|
||||||
|
cpu->coresOnline = cpu->coresPhysical = cpu->coresLogical = (uint16_t) cores;
|
||||||
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu)
|
const char* ffDetectCPUImpl(const FFCPUOptions* options, FFCPUResult* cpu)
|
||||||
{
|
{
|
||||||
const char* error = detectByOS(cpu);
|
detectNCores(cpu);
|
||||||
|
|
||||||
|
const char* error = detectByRegistry(cpu);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
if (cpu->frequencyMax != cpu->frequencyMax)
|
||||||
|
detectMaxSpeedBySmbios(cpu);
|
||||||
|
|
||||||
if(options->temp)
|
if(options->temp)
|
||||||
ffDetectSmbiosTemp(&cpu->temperature, NULL);
|
ffDetectSmbiosTemp(&cpu->temperature, NULL);
|
||||||
|
|
||||||
detectMaxSpeedBySmbios(cpu);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,18 +68,33 @@ static bool detectCursorFromEnv(FFCursorResult* result)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool detectCursorHyprcursor(FFCursorResult* result)
|
||||||
|
{
|
||||||
|
const char* hyprcursor_theme = getenv("HYPRCURSOR_THEME");
|
||||||
|
|
||||||
|
if(!ffStrSet(hyprcursor_theme))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ffStrbufAppendS(&result->theme, hyprcursor_theme);
|
||||||
|
ffStrbufAppendS(&result->size, getenv("HYPRCURSOR_SIZE"));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void ffDetectCursor(FFCursorResult* result)
|
void ffDetectCursor(FFCursorResult* result)
|
||||||
{
|
{
|
||||||
const FFDisplayServerResult* wmde = ffConnectDisplayServer();
|
const FFDisplayServerResult* wmde = ffConnectDisplayServer();
|
||||||
|
|
||||||
if(ffStrbufCompS(&wmde->wmPrettyName, FF_WM_PRETTY_WSLG) == 0)
|
if(ffStrbufEqualS(&wmde->wmPrettyName, FF_WM_PRETTY_WSLG))
|
||||||
ffStrbufAppendS(&result->error, "WSLg uses native windows cursor");
|
ffStrbufAppendS(&result->error, "WSLg uses native windows cursor");
|
||||||
else if(ffStrbufIgnCaseCompS(&wmde->wmProtocolName, FF_WM_PROTOCOL_TTY) == 0)
|
else if(ffStrbufIgnCaseEqualS(&wmde->wmProtocolName, FF_WM_PROTOCOL_TTY))
|
||||||
ffStrbufAppendS(&result->error, "Cursor isn't supported in TTY");
|
ffStrbufAppendS(&result->error, "Cursor isn't supported in TTY");
|
||||||
else if(ffStrbufIgnCaseCompS(&wmde->dePrettyName, FF_DE_PRETTY_PLASMA) == 0)
|
else if(ffStrbufIgnCaseEqualS(&wmde->dePrettyName, FF_DE_PRETTY_PLASMA))
|
||||||
detectCursorFromConfigFile("kcminputrc", "cursorTheme =", "Breeze", "cursorSize =", "24", result);
|
detectCursorFromConfigFile("kcminputrc", "cursorTheme =", "Breeze", "cursorSize =", "24", result);
|
||||||
else if(ffStrbufStartsWithIgnCaseS(&wmde->dePrettyName, FF_DE_PRETTY_LXQT))
|
else if(ffStrbufIgnCaseEqualS(&wmde->dePrettyName, FF_DE_PRETTY_LXQT))
|
||||||
detectCursorFromConfigFile("lxqt/session.conf", "cursor_theme =", "Adwaita", "cursor_size =", "24", result);
|
detectCursorFromConfigFile("lxqt/session.conf", "cursor_theme =", "Adwaita", "cursor_size =", "24", result);
|
||||||
|
else if(ffStrbufIgnCaseEqualS(&wmde->wmPrettyName, FF_WM_PRETTY_HYPRLAND) && detectCursorHyprcursor(result))
|
||||||
|
return;
|
||||||
else if(
|
else if(
|
||||||
!detectCursorGTK(result) &&
|
!detectCursorGTK(result) &&
|
||||||
!detectCursorFromEnv(result) &&
|
!detectCursorFromEnv(result) &&
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include "de.h"
|
#include "de.h"
|
||||||
|
|
||||||
|
#include "common/dbus.h"
|
||||||
#include "common/io/io.h"
|
#include "common/io/io.h"
|
||||||
#include "common/library.h"
|
#include "common/library.h"
|
||||||
#include "common/parsing.h"
|
#include "common/parsing.h"
|
||||||
@@ -12,19 +13,20 @@
|
|||||||
|
|
||||||
static void getKDE(FFstrbuf* result, FFDEOptions* options)
|
static void getKDE(FFstrbuf* result, FFDEOptions* options)
|
||||||
{
|
{
|
||||||
ffParsePropFileValues(FASTFETCH_TARGET_DIR_USR "/share/xsessions/plasmax11.desktop", 1, (FFpropquery[]) {
|
ffParsePropFileValues(FASTFETCH_TARGET_DIR_USR "/share/wayland-sessions/plasma.desktop", 1, (FFpropquery[]) {
|
||||||
{"X-KDE-PluginInfo-Version =", result}
|
{"X-KDE-PluginInfo-Version =", result}
|
||||||
});
|
});
|
||||||
|
if(result->length == 0)
|
||||||
|
{
|
||||||
|
ffParsePropFileValues(FASTFETCH_TARGET_DIR_USR "/share/xsessions/plasmax11.desktop", 1, (FFpropquery[]) {
|
||||||
|
{"X-KDE-PluginInfo-Version =", result}
|
||||||
|
});
|
||||||
|
}
|
||||||
if(result->length == 0)
|
if(result->length == 0)
|
||||||
ffParsePropFileData("xsessions/plasma.desktop", "X-KDE-PluginInfo-Version =", result);
|
ffParsePropFileData("xsessions/plasma.desktop", "X-KDE-PluginInfo-Version =", result);
|
||||||
if(result->length == 0)
|
if(result->length == 0)
|
||||||
ffParsePropFileData("xsessions/plasma5.desktop", "X-KDE-PluginInfo-Version =", result);
|
ffParsePropFileData("xsessions/plasma5.desktop", "X-KDE-PluginInfo-Version =", result);
|
||||||
if(result->length == 0)
|
|
||||||
{
|
|
||||||
ffParsePropFileValues(FASTFETCH_TARGET_DIR_USR "/share/wayland-sessions/plasma.desktop", 1, (FFpropquery[]) {
|
|
||||||
{"X-KDE-PluginInfo-Version =", result}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if(result->length == 0)
|
if(result->length == 0)
|
||||||
ffParsePropFileData("wayland-sessions/plasmawayland.desktop", "X-KDE-PluginInfo-Version =", result);
|
ffParsePropFileData("wayland-sessions/plasmawayland.desktop", "X-KDE-PluginInfo-Version =", result);
|
||||||
if(result->length == 0)
|
if(result->length == 0)
|
||||||
@@ -41,11 +43,25 @@ static void getKDE(FFstrbuf* result, FFDEOptions* options)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char* getGnomeByDbus(FF_MAYBE_UNUSED FFstrbuf* result)
|
||||||
|
{
|
||||||
|
#ifdef FF_HAVE_DBUS
|
||||||
|
FFDBusData dbus;
|
||||||
|
if (ffDBusLoadData(DBUS_BUS_SESSION, &dbus) != NULL)
|
||||||
|
return "ffDBusLoadData() failed";
|
||||||
|
|
||||||
|
ffDBusGetPropertyString(&dbus, "org.gnome.Shell", "/org/gnome/Shell", "org.gnome.Shell", "ShellVersion", result);
|
||||||
|
return NULL;
|
||||||
|
#else // FF_HAVE_DBUS
|
||||||
|
return "ffDBusLoadData() failed: dbus support not compiled in";
|
||||||
|
#endif // FF_HAVE_DBUS
|
||||||
|
}
|
||||||
|
|
||||||
static void getGnome(FFstrbuf* result, FF_MAYBE_UNUSED FFDEOptions* options)
|
static void getGnome(FFstrbuf* result, FF_MAYBE_UNUSED FFDEOptions* options)
|
||||||
{
|
{
|
||||||
ffParsePropFileData("gnome-shell/org.gnome.Extensions", "version :", result);
|
getGnomeByDbus(result);
|
||||||
|
|
||||||
if (result->length == 0)
|
if (result->length == 0 && options->slowVersionDetection)
|
||||||
{
|
{
|
||||||
if (ffProcessAppendStdOut(result, (char* const[]){
|
if (ffProcessAppendStdOut(result, (char* const[]){
|
||||||
"gnome-shell",
|
"gnome-shell",
|
||||||
|
|||||||
@@ -1,6 +1,29 @@
|
|||||||
#include "disk.h"
|
#include "disk.h"
|
||||||
|
|
||||||
const char* ffDetectDisksImpl(FFlist* disks);
|
bool ffDiskMatchMountpoint(FFDiskOptions* options, const char* mountpoint)
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
const char separator = ';';
|
||||||
|
#else
|
||||||
|
const char separator = ':';
|
||||||
|
#endif
|
||||||
|
|
||||||
|
uint32_t mountpointLength = (uint32_t) strlen(mountpoint);
|
||||||
|
|
||||||
|
uint32_t startIndex = 0;
|
||||||
|
while(startIndex < options->folders.length)
|
||||||
|
{
|
||||||
|
uint32_t colonIndex = ffStrbufNextIndexC(&options->folders, startIndex, separator);
|
||||||
|
|
||||||
|
uint32_t folderLength = colonIndex - startIndex;
|
||||||
|
if (folderLength == mountpointLength && memcmp(options->folders.chars + startIndex, mountpoint, mountpointLength) == 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
startIndex = colonIndex + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static int compareDisks(const FFDisk* disk1, const FFDisk* disk2)
|
static int compareDisks(const FFDisk* disk1, const FFDisk* disk2)
|
||||||
{
|
{
|
||||||
@@ -9,7 +32,7 @@ static int compareDisks(const FFDisk* disk1, const FFDisk* disk2)
|
|||||||
|
|
||||||
const char* ffDetectDisks(FFDiskOptions* options, FFlist* disks)
|
const char* ffDetectDisks(FFDiskOptions* options, FFlist* disks)
|
||||||
{
|
{
|
||||||
const char* error = ffDetectDisksImpl(disks);
|
const char* error = ffDetectDisksImpl(options, disks);
|
||||||
|
|
||||||
if (error) return error;
|
if (error) return error;
|
||||||
if (disks->length == 0) return "No disks found";
|
if (disks->length == 0) return "No disks found";
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ typedef struct FFDisk
|
|||||||
|
|
||||||
uint32_t filesUsed;
|
uint32_t filesUsed;
|
||||||
uint32_t filesTotal;
|
uint32_t filesTotal;
|
||||||
|
|
||||||
|
uint64_t createTime;
|
||||||
} FFDisk;
|
} FFDisk;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -24,3 +26,6 @@ typedef struct FFDisk
|
|||||||
* If error is not set, disks contains at least one disk.
|
* If error is not set, disks contains at least one disk.
|
||||||
*/
|
*/
|
||||||
const char* ffDetectDisks(FFDiskOptions* options, FFlist* disks /* list of FFDisk */);
|
const char* ffDetectDisks(FFDiskOptions* options, FFlist* disks /* list of FFDisk */);
|
||||||
|
|
||||||
|
const char* ffDetectDisksImpl(FFDiskOptions* options, FFlist* disks);
|
||||||
|
bool ffDiskMatchMountpoint(FFDiskOptions* options, const char* mountpoint);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "util/stringUtils.h"
|
#include "util/stringUtils.h"
|
||||||
|
|
||||||
#include <sys/mount.h>
|
#include <sys/mount.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
#include <libgeom.h>
|
#include <libgeom.h>
|
||||||
@@ -89,7 +90,7 @@ void detectFsInfo(struct statfs* fs, FFDisk* disk)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char* ffDetectDisksImpl(FFlist* disks)
|
const char* ffDetectDisksImpl(FFDiskOptions* options, FFlist* disks)
|
||||||
{
|
{
|
||||||
int size = getfsstat(NULL, 0, MNT_WAIT);
|
int size = getfsstat(NULL, 0, MNT_WAIT);
|
||||||
|
|
||||||
@@ -102,7 +103,12 @@ const char* ffDetectDisksImpl(FFlist* disks)
|
|||||||
|
|
||||||
for(struct statfs* fs = buf; fs < buf + size; ++fs)
|
for(struct statfs* fs = buf; fs < buf + size; ++fs)
|
||||||
{
|
{
|
||||||
if(!ffStrStartsWith(fs->f_mntfromname, "/dev/") && !ffStrEquals(fs->f_fstypename, "zfs"))
|
if(__builtin_expect(options->folders.length, 0))
|
||||||
|
{
|
||||||
|
if(!ffDiskMatchMountpoint(options, fs->f_mntonname))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if(!ffStrStartsWith(fs->f_mntfromname, "/dev/") && !ffStrEquals(fs->f_fstypename, "zfs"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
@@ -130,6 +136,10 @@ const char* ffDetectDisksImpl(FFlist* disks)
|
|||||||
|
|
||||||
if(fs->f_flags & MNT_RDONLY)
|
if(fs->f_flags & MNT_RDONLY)
|
||||||
disk->type |= FF_DISK_VOLUME_TYPE_READONLY_BIT;
|
disk->type |= FF_DISK_VOLUME_TYPE_READONLY_BIT;
|
||||||
|
|
||||||
|
struct stat st;
|
||||||
|
if(stat(fs->f_mntonname, &st) == 0)
|
||||||
|
disk->createTime = (uint64_t)((st.st_birthtimespec.tv_sec * 1000) + (st.st_birthtimespec.tv_nsec / 1000000));
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
@@ -6,9 +6,9 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
#include <mntent.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/statvfs.h>
|
#include <sys/statvfs.h>
|
||||||
#include <mntent.h>
|
|
||||||
#include <sys/mount.h>
|
#include <sys/mount.h>
|
||||||
|
|
||||||
#ifdef __USE_LARGEFILE64
|
#ifdef __USE_LARGEFILE64
|
||||||
@@ -31,7 +31,7 @@ static bool isPhysicalDevice(const struct mntent* device)
|
|||||||
|
|
||||||
//DrvFs is a filesystem plugin to WSL that was designed to support interop between WSL and the Windows filesystem.
|
//DrvFs is a filesystem plugin to WSL that was designed to support interop between WSL and the Windows filesystem.
|
||||||
if(ffStrEquals(device->mnt_type, "9p"))
|
if(ffStrEquals(device->mnt_type, "9p"))
|
||||||
return true;
|
return ffStrContains(device->mnt_opts, "aname=drvfs");
|
||||||
|
|
||||||
//ZFS pool
|
//ZFS pool
|
||||||
if(ffStrEquals(device->mnt_type, "zfs"))
|
if(ffStrEquals(device->mnt_type, "zfs"))
|
||||||
@@ -241,9 +241,16 @@ static void detectStats(FFDisk* disk)
|
|||||||
|
|
||||||
if(fs.f_flag & ST_RDONLY)
|
if(fs.f_flag & ST_RDONLY)
|
||||||
disk->type |= FF_DISK_VOLUME_TYPE_READONLY_BIT;
|
disk->type |= FF_DISK_VOLUME_TYPE_READONLY_BIT;
|
||||||
|
|
||||||
|
disk->createTime = 0;
|
||||||
|
#ifdef FF_HAVE_STATX
|
||||||
|
struct statx stx;
|
||||||
|
if (statx(0, disk->mountpoint.chars, 0, STATX_BTIME, &stx) == 0 && (stx.stx_mask & STATX_BTIME))
|
||||||
|
disk->createTime = (uint64_t)((stx.stx_btime.tv_sec * 1000) + (stx.stx_btime.tv_nsec / 1000000));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* ffDetectDisksImpl(FFlist* disks)
|
const char* ffDetectDisksImpl(FFDiskOptions* options, FFlist* disks)
|
||||||
{
|
{
|
||||||
FILE* mountsFile = setmntent("/proc/mounts", "r");
|
FILE* mountsFile = setmntent("/proc/mounts", "r");
|
||||||
if(mountsFile == NULL)
|
if(mountsFile == NULL)
|
||||||
@@ -253,7 +260,12 @@ const char* ffDetectDisksImpl(FFlist* disks)
|
|||||||
|
|
||||||
while((device = getmntent(mountsFile)))
|
while((device = getmntent(mountsFile)))
|
||||||
{
|
{
|
||||||
if(!isPhysicalDevice(device))
|
if (__builtin_expect(options->folders.length, 0))
|
||||||
|
{
|
||||||
|
if (!ffDiskMatchMountpoint(options, device->mnt_dir))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if(!isPhysicalDevice(device))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
//We have a valid device, add it to the list
|
//We have a valid device, add it to the list
|
||||||
|
|||||||
@@ -1,60 +1,102 @@
|
|||||||
#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>
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
const char* ffDetectDisksImpl(FFlist* disks)
|
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)
|
||||||
{
|
{
|
||||||
wchar_t buf[MAX_PATH + 1];
|
wchar_t buf[MAX_PATH + 1];
|
||||||
uint32_t length = GetLogicalDriveStringsW(sizeof(buf) / sizeof(*buf), buf);
|
uint32_t length = GetLogicalDriveStringsW(sizeof(buf) / sizeof(*buf), buf);
|
||||||
if (length == 0 || length >= sizeof(buf) / sizeof(*buf))
|
if (length == 0 || length >= sizeof(buf) / sizeof(*buf))
|
||||||
return "GetLogicalDriveStringsW(sizeof(buf) / sizeof(*buf), buf) failed";
|
return "GetLogicalDriveStringsW(sizeof(buf) / sizeof(*buf), buf) failed";
|
||||||
|
|
||||||
|
FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate();
|
||||||
|
|
||||||
|
// For cross-platform portability; used by `presets/examples/13.jsonc`
|
||||||
|
if (__builtin_expect(options->folders.length == 1 && options->folders.chars[0] == '/', 0))
|
||||||
|
{
|
||||||
|
wchar_t path[MAX_PATH + 1];
|
||||||
|
GetSystemWindowsDirectoryW(path, sizeof(path) / sizeof(*path));
|
||||||
|
ffStrbufSetF(&options->folders, "%c:\\", (char) path[0]);
|
||||||
|
}
|
||||||
|
|
||||||
for(uint32_t i = 0; i < length; i++)
|
for(uint32_t i = 0; i < length; i++)
|
||||||
{
|
{
|
||||||
const wchar_t* mountpoint = buf + i;
|
wchar_t* mountpoint = buf + i;
|
||||||
|
|
||||||
|
ffStrbufSetWS(&buffer, mountpoint);
|
||||||
|
i += buffer.length;
|
||||||
|
|
||||||
UINT driveType = GetDriveTypeW(mountpoint);
|
UINT driveType = GetDriveTypeW(mountpoint);
|
||||||
if(driveType == DRIVE_NO_ROOT_DIR)
|
|
||||||
|
if (__builtin_expect((long) options->folders.length, 0))
|
||||||
{
|
{
|
||||||
i += (uint32_t)wcslen(mountpoint);
|
if (!ffDiskMatchMountpoint(options, buffer.chars))
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
else if(driveType == DRIVE_NO_ROOT_DIR)
|
||||||
|
continue;
|
||||||
|
|
||||||
FFDisk* disk = ffListAdd(disks);
|
FFDisk* disk = ffListAdd(disks);
|
||||||
ffStrbufInitWS(&disk->mountpoint, mountpoint);
|
|
||||||
|
|
||||||
wchar_t volumeName[64];
|
disk->filesUsed = 0;
|
||||||
if(GetVolumeNameForVolumeMountPointW(mountpoint, volumeName, sizeof(volumeName) / sizeof(*volumeName)))
|
disk->filesTotal = 0;
|
||||||
ffStrbufInitWS(&disk->mountFrom, volumeName);
|
disk->bytesTotal = 0;
|
||||||
else
|
disk->bytesFree = 0;
|
||||||
ffStrbufInit(&disk->mountFrom);
|
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(!GetDiskFreeSpaceExW(
|
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
|
||||||
@@ -78,11 +120,9 @@ const char* ffDetectDisksImpl(FFlist* disks)
|
|||||||
disk->type |= FF_DISK_VOLUME_TYPE_READONLY_BIT;
|
disk->type |= FF_DISK_VOLUME_TYPE_READONLY_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Unsupported
|
WIN32_FILE_ATTRIBUTE_DATA data;
|
||||||
disk->filesUsed = 0;
|
if(GetFileAttributesExW(mountpoint, GetFileExInfoStandard, &data) && data.ftCreationTime.dwHighDateTime > 0)
|
||||||
disk->filesTotal = 0;
|
disk->createTime = (*(uint64_t*) &data.ftCreationTime - 116444736000000000ull) / 10000ull;
|
||||||
|
|
||||||
i += disk->mountpoint.length;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
#define FF_DE_PRETTY_BUDGIE "Budgie"
|
#define FF_DE_PRETTY_BUDGIE "Budgie"
|
||||||
#define FF_DE_PRETTY_CDE "CDE"
|
#define FF_DE_PRETTY_CDE "CDE"
|
||||||
#define FF_DE_PRETTY_UNITY "Unity"
|
#define FF_DE_PRETTY_UNITY "Unity"
|
||||||
|
#define FF_DE_PRETTY_UKUI "UKUI"
|
||||||
|
|
||||||
#define FF_WM_PRETTY_KWIN "KWin"
|
#define FF_WM_PRETTY_KWIN "KWin"
|
||||||
#define FF_WM_PRETTY_MUTTER "Mutter"
|
#define FF_WM_PRETTY_MUTTER "Mutter"
|
||||||
@@ -21,6 +22,7 @@
|
|||||||
#define FF_WM_PRETTY_XFWM4 "Xfwm4"
|
#define FF_WM_PRETTY_XFWM4 "Xfwm4"
|
||||||
#define FF_WM_PRETTY_OPENBOX "Openbox"
|
#define FF_WM_PRETTY_OPENBOX "Openbox"
|
||||||
#define FF_WM_PRETTY_I3 "i3"
|
#define FF_WM_PRETTY_I3 "i3"
|
||||||
|
#define FF_WM_PRETTY_HYPRLAND "Hyprland"
|
||||||
#define FF_WM_PRETTY_WAYFIRE "Wayfire"
|
#define FF_WM_PRETTY_WAYFIRE "Wayfire"
|
||||||
#define FF_WM_PRETTY_SWAY "Sway"
|
#define FF_WM_PRETTY_SWAY "Sway"
|
||||||
#define FF_WM_PRETTY_BSPWM "bspwm"
|
#define FF_WM_PRETTY_BSPWM "bspwm"
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
#include "displayserver_linux.h"
|
#include "displayserver_linux.h"
|
||||||
|
#include "common/io/io.h"
|
||||||
|
#include "util/edidHelper.h"
|
||||||
|
#include "util/stringUtils.h"
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
@@ -57,3 +60,43 @@ void ffConnectDisplayServerImpl(FFDisplayServerResult* ds)
|
|||||||
//This fills in missing information about WM / DE by using env vars and iterating processes
|
//This fills in missing information about WM / DE by using env vars and iterating processes
|
||||||
ffdsDetectWMDE(ds);
|
ffdsDetectWMDE(ds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ffdsMatchDrmConnector(const char* connName, FFstrbuf* edidName)
|
||||||
|
{
|
||||||
|
// https://wayland.freedesktop.org/docs/html/apa.html#protocol-spec-wl_output-event-name
|
||||||
|
// The doc says that "do not assume that the name is a reflection of an underlying DRM connector, X11 connection, etc."
|
||||||
|
// However I can't find a better method to get the edid data
|
||||||
|
const char* drmDirPath = "/sys/class/drm/";
|
||||||
|
|
||||||
|
DIR* dirp = opendir(drmDirPath);
|
||||||
|
if(dirp == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
struct dirent* entry;
|
||||||
|
while((entry = readdir(dirp)) != NULL)
|
||||||
|
{
|
||||||
|
const char* plainName = entry->d_name;
|
||||||
|
if (ffStrStartsWith(plainName, "card"))
|
||||||
|
{
|
||||||
|
const char* tmp = strchr(plainName + strlen("card"), '-');
|
||||||
|
if (tmp) plainName = tmp + 1;
|
||||||
|
}
|
||||||
|
if (ffStrEquals(plainName, connName))
|
||||||
|
{
|
||||||
|
ffStrbufAppendF(edidName, "%s%s/edid", drmDirPath, entry->d_name);
|
||||||
|
|
||||||
|
uint8_t edidData[128];
|
||||||
|
if(ffReadFileData(edidName->chars, sizeof(edidData), edidData) == sizeof(edidData))
|
||||||
|
{
|
||||||
|
ffStrbufClear(edidName);
|
||||||
|
ffEdidGetName(edidData, edidName);
|
||||||
|
closedir(dirp);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ffStrbufClear(edidName);
|
||||||
|
closedir(dirp);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,6 +5,9 @@
|
|||||||
|
|
||||||
#include "detection/displayserver/displayserver.h"
|
#include "detection/displayserver/displayserver.h"
|
||||||
|
|
||||||
|
bool ffdsMatchDrmConnector(const char* connName, FFstrbuf* edidName);
|
||||||
|
|
||||||
|
const char* ffdsConnectWlroots(FFDisplayServerResult* result);
|
||||||
void ffdsConnectWayland(FFDisplayServerResult* result);
|
void ffdsConnectWayland(FFDisplayServerResult* result);
|
||||||
|
|
||||||
void ffdsConnectXcbRandr(FFDisplayServerResult* result);
|
void ffdsConnectXcbRandr(FFDisplayServerResult* result);
|
||||||
|
|||||||
@@ -36,31 +36,28 @@ static const char* drmParseSysfs(FFDisplayServerResult* result)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ffStrbufSubstrBefore(&drmDir, drmDirWithDnameLength);
|
|
||||||
ffStrbufAppendS(&drmDir, "/modes");
|
|
||||||
|
|
||||||
char modes[32];
|
|
||||||
if (ffReadFileData(drmDir.chars, sizeof(modes), modes) < 3)
|
|
||||||
{
|
|
||||||
ffStrbufSubstrBefore(&drmDir, drmDirLength);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned width = 0, height = 0;
|
unsigned width = 0, height = 0;
|
||||||
|
double refreshRate = 0;
|
||||||
|
FF_STRBUF_AUTO_DESTROY name = ffStrbufCreate();
|
||||||
|
|
||||||
int scanned = sscanf(modes, "%ux%u", &width, &height);
|
ffStrbufSubstrBefore(&drmDir, drmDirWithDnameLength);
|
||||||
if(scanned == 2 && width > 0 && height > 0)
|
ffStrbufAppendS(&drmDir, "/edid");
|
||||||
|
|
||||||
|
uint8_t edidData[128];
|
||||||
|
if(ffReadFileData(drmDir.chars, sizeof(edidData), edidData) == sizeof(edidData))
|
||||||
{
|
{
|
||||||
ffStrbufSubstrBefore(&drmDir, drmDirLength);
|
ffEdidGetName(edidData, &name);
|
||||||
ffStrbufAppendS(&drmDir, entry->d_name);
|
ffEdidGetPreferredResolutionAndRefreshRate(edidData, &width, &height, &refreshRate);
|
||||||
ffStrbufAppendS(&drmDir, "/edid");
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ffStrbufSubstrBefore(&drmDir, drmDirWithDnameLength);
|
||||||
|
ffStrbufAppendS(&drmDir, "/modes");
|
||||||
|
|
||||||
FF_STRBUF_AUTO_DESTROY name = ffStrbufCreate();
|
char modes[32];
|
||||||
uint8_t edidData[128];
|
if (ffReadFileData(drmDir.chars, sizeof(modes), modes) >= 3)
|
||||||
if(ffReadFileData(drmDir.chars, sizeof(edidData), edidData) == sizeof(edidData))
|
|
||||||
ffEdidGetName(edidData, &name);
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
|
sscanf(modes, "%ux%u", &width, &height);
|
||||||
const char* plainName = entry->d_name;
|
const char* plainName = entry->d_name;
|
||||||
if (ffStrStartsWith(plainName, "card"))
|
if (ffStrStartsWith(plainName, "card"))
|
||||||
{
|
{
|
||||||
@@ -69,20 +66,20 @@ static const char* drmParseSysfs(FFDisplayServerResult* result)
|
|||||||
}
|
}
|
||||||
ffStrbufAppendS(&name, plainName);
|
ffStrbufAppendS(&name, plainName);
|
||||||
}
|
}
|
||||||
|
|
||||||
ffdsAppendDisplay(
|
|
||||||
result,
|
|
||||||
width, height,
|
|
||||||
0,
|
|
||||||
0, 0,
|
|
||||||
0,
|
|
||||||
&name,
|
|
||||||
FF_DISPLAY_TYPE_UNKNOWN,
|
|
||||||
false,
|
|
||||||
0
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ffdsAppendDisplay(
|
||||||
|
result,
|
||||||
|
width, height,
|
||||||
|
refreshRate,
|
||||||
|
0, 0,
|
||||||
|
0,
|
||||||
|
&name,
|
||||||
|
FF_DISPLAY_TYPE_UNKNOWN,
|
||||||
|
false,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
ffStrbufSubstrBefore(&drmDir, drmDirLength);
|
ffStrbufSubstrBefore(&drmDir, drmDirLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,7 +140,7 @@ static inline const char* drmType2Name(uint32_t connector_type)
|
|||||||
return "DPI";
|
return "DPI";
|
||||||
case DRM_MODE_CONNECTOR_WRITEBACK:
|
case DRM_MODE_CONNECTOR_WRITEBACK:
|
||||||
return "Writeback";
|
return "Writeback";
|
||||||
case DRM_MODE_CONNECTOR_SPI:
|
case 19 /*DRM_MODE_CONNECTOR_SPI*/:
|
||||||
return "SPI";
|
return "SPI";
|
||||||
case 20 /*DRM_MODE_CONNECTOR_USB*/:
|
case 20 /*DRM_MODE_CONNECTOR_USB*/:
|
||||||
return "USB";
|
return "USB";
|
||||||
@@ -250,8 +247,8 @@ static const char* drmConnectLibdrm(FFDisplayServerResult* result)
|
|||||||
drmModeCrtc* crtc = ffdrmModeGetCrtc(fd, encoder->crtc_id);
|
drmModeCrtc* crtc = ffdrmModeGetCrtc(fd, encoder->crtc_id);
|
||||||
if (crtc)
|
if (crtc)
|
||||||
{
|
{
|
||||||
width = crtc->mode.vdisplay;
|
width = crtc->mode.hdisplay;
|
||||||
height = crtc->mode.hdisplay;
|
height = crtc->mode.vdisplay;
|
||||||
refreshRate = crtc->mode.vrefresh;
|
refreshRate = crtc->mode.vrefresh;
|
||||||
if (refreshRate == 0)
|
if (refreshRate == 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,352 +0,0 @@
|
|||||||
#include "displayserver_linux.h"
|
|
||||||
#include "util/stringUtils.h"
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#ifdef FF_HAVE_WAYLAND
|
|
||||||
#include "common/library.h"
|
|
||||||
#include "common/io/io.h"
|
|
||||||
#include "common/thread.h"
|
|
||||||
#include "util/edidHelper.h"
|
|
||||||
#include <wayland-client.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
|
|
||||||
typedef struct WaylandData
|
|
||||||
{
|
|
||||||
FFDisplayServerResult* result;
|
|
||||||
FF_LIBRARY_SYMBOL(wl_proxy_marshal_constructor_versioned)
|
|
||||||
FF_LIBRARY_SYMBOL(wl_proxy_add_listener)
|
|
||||||
FF_LIBRARY_SYMBOL(wl_proxy_destroy)
|
|
||||||
FF_LIBRARY_SYMBOL(wl_display_roundtrip)
|
|
||||||
struct wl_display* display;
|
|
||||||
const struct wl_interface* ffwl_output_interface;
|
|
||||||
} WaylandData;
|
|
||||||
|
|
||||||
typedef struct WaylandDisplay
|
|
||||||
{
|
|
||||||
int32_t width;
|
|
||||||
int32_t height;
|
|
||||||
int32_t refreshRate;
|
|
||||||
int32_t scale;
|
|
||||||
enum wl_output_transform transform;
|
|
||||||
FFDisplayType type;
|
|
||||||
FFstrbuf name;
|
|
||||||
FFstrbuf description;
|
|
||||||
FFstrbuf vendorAndModelId;
|
|
||||||
FFstrbuf edidName;
|
|
||||||
} WaylandDisplay;
|
|
||||||
|
|
||||||
#ifndef __FreeBSD__
|
|
||||||
static void waylandDetectWM(int fd, FFDisplayServerResult* result)
|
|
||||||
{
|
|
||||||
struct ucred ucred;
|
|
||||||
socklen_t len = sizeof(struct ucred);
|
|
||||||
if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &ucred, &len) == -1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
FF_STRBUF_AUTO_DESTROY procPath = ffStrbufCreate();
|
|
||||||
ffStrbufAppendF(&procPath, "/proc/%d/cmdline", ucred.pid); //We check the cmdline for the process name, because it is not trimmed.
|
|
||||||
ffReadFileBuffer(procPath.chars, &result->wmProcessName);
|
|
||||||
ffStrbufTrimRightSpace(&result->wmProcessName);
|
|
||||||
ffStrbufSubstrBeforeFirstC(&result->wmProcessName, '\0'); //Trim the arguments
|
|
||||||
ffStrbufSubstrAfterLastC(&result->wmProcessName, '/'); //Trim the path
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void waylandDetectWM(int fd, FFDisplayServerResult* result)
|
|
||||||
{
|
|
||||||
FF_UNUSED(fd, result);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void stubListener(void* data, ...)
|
|
||||||
{
|
|
||||||
(void) data;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void waylandOutputModeListener(void* data, FF_MAYBE_UNUSED struct wl_output* output, uint32_t flags, int32_t width, int32_t height, int32_t refreshRate)
|
|
||||||
{
|
|
||||||
if(!(flags & WL_OUTPUT_MODE_CURRENT))
|
|
||||||
return;
|
|
||||||
|
|
||||||
WaylandDisplay* display = data;
|
|
||||||
display->width = width;
|
|
||||||
display->height = height;
|
|
||||||
display->refreshRate = refreshRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void waylandOutputScaleListener(void* data, FF_MAYBE_UNUSED struct wl_output* output, int32_t scale)
|
|
||||||
{
|
|
||||||
WaylandDisplay* display = data;
|
|
||||||
display->scale = scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void waylandOutputGeometryListener(void *data,
|
|
||||||
FF_MAYBE_UNUSED struct wl_output *output,
|
|
||||||
FF_MAYBE_UNUSED int32_t x,
|
|
||||||
FF_MAYBE_UNUSED int32_t y,
|
|
||||||
FF_MAYBE_UNUSED int32_t physical_width,
|
|
||||||
FF_MAYBE_UNUSED int32_t physical_height,
|
|
||||||
FF_MAYBE_UNUSED int32_t subpixel,
|
|
||||||
const char *make,
|
|
||||||
const char *model,
|
|
||||||
int32_t transform)
|
|
||||||
{
|
|
||||||
WaylandDisplay* display = data;
|
|
||||||
display->transform = (enum wl_output_transform) transform;
|
|
||||||
if (make && !ffStrEqualsIgnCase(make, "unknown") && model && !ffStrEqualsIgnCase(model, "unknown"))
|
|
||||||
{
|
|
||||||
ffStrbufAppendS(&display->vendorAndModelId, make);
|
|
||||||
ffStrbufAppendS(&display->vendorAndModelId, model);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool matchDrmConnector(const char* wlName, FFstrbuf* edidName)
|
|
||||||
{
|
|
||||||
// https://wayland.freedesktop.org/docs/html/apa.html#protocol-spec-wl_output-event-name
|
|
||||||
// The doc says that "do not assume that the name is a reflection of an underlying DRM connector, X11 connection, etc."
|
|
||||||
// However I can't find a better method to get the edid data
|
|
||||||
const char* drmDirPath = "/sys/class/drm/";
|
|
||||||
|
|
||||||
DIR* dirp = opendir(drmDirPath);
|
|
||||||
if(dirp == NULL)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
struct dirent* entry;
|
|
||||||
while((entry = readdir(dirp)) != NULL)
|
|
||||||
{
|
|
||||||
const char* plainName = entry->d_name;
|
|
||||||
if (ffStrStartsWith(plainName, "card"))
|
|
||||||
{
|
|
||||||
const char* tmp = strchr(plainName + strlen("card"), '-');
|
|
||||||
if (tmp) plainName = tmp + 1;
|
|
||||||
}
|
|
||||||
if (ffStrEquals(plainName, wlName))
|
|
||||||
{
|
|
||||||
ffStrbufAppendF(edidName, "%s%s/edid", drmDirPath, entry->d_name);
|
|
||||||
|
|
||||||
uint8_t edidData[128];
|
|
||||||
if(ffReadFileData(edidName->chars, sizeof(edidData), edidData) == sizeof(edidData))
|
|
||||||
{
|
|
||||||
ffStrbufClear(edidName);
|
|
||||||
ffEdidGetName(edidData, edidName);
|
|
||||||
closedir(dirp);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ffStrbufClear(edidName);
|
|
||||||
closedir(dirp);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void waylandOutputNameListener(void *data, FF_MAYBE_UNUSED struct wl_output *output, const char *name)
|
|
||||||
{
|
|
||||||
WaylandDisplay* display = data;
|
|
||||||
if(ffStrStartsWith(name, "eDP-"))
|
|
||||||
display->type = FF_DISPLAY_TYPE_BUILTIN;
|
|
||||||
else if(ffStrStartsWith(name, "HDMI-"))
|
|
||||||
display->type = FF_DISPLAY_TYPE_EXTERNAL;
|
|
||||||
matchDrmConnector(name, &display->edidName);
|
|
||||||
ffStrbufAppendS(&display->name, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void waylandOutputDescriptionListener(void* data, FF_MAYBE_UNUSED struct wl_output* wl_output, const char* description)
|
|
||||||
{
|
|
||||||
WaylandDisplay* display = data;
|
|
||||||
while (*description == ' ') ++description;
|
|
||||||
if (!ffStrEquals(description, "Unknown Display"))
|
|
||||||
ffStrbufAppendS(&display->description, description);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void waylandOutputHandler(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version)
|
|
||||||
{
|
|
||||||
struct wl_proxy* output = wldata->ffwl_proxy_marshal_constructor_versioned((struct wl_proxy*) registry, WL_REGISTRY_BIND, wldata->ffwl_output_interface, version, name, wldata->ffwl_output_interface->name, version, NULL);
|
|
||||||
if(output == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
WaylandDisplay display = {
|
|
||||||
.width = 0,
|
|
||||||
.height = 0,
|
|
||||||
.refreshRate = 0,
|
|
||||||
.scale = 1,
|
|
||||||
.transform = WL_OUTPUT_TRANSFORM_NORMAL,
|
|
||||||
.type = FF_DISPLAY_TYPE_UNKNOWN,
|
|
||||||
};
|
|
||||||
ffStrbufInit(&display.name);
|
|
||||||
ffStrbufInit(&display.description);
|
|
||||||
ffStrbufInit(&display.vendorAndModelId);
|
|
||||||
ffStrbufInit(&display.edidName);
|
|
||||||
|
|
||||||
// Dirty hack for #477
|
|
||||||
// The order of these callbacks MUST follow `struct wl_output_listener`
|
|
||||||
void* outputListener[] = {
|
|
||||||
waylandOutputGeometryListener, // geometry
|
|
||||||
waylandOutputModeListener, // mode
|
|
||||||
stubListener, // done
|
|
||||||
waylandOutputScaleListener, // scale
|
|
||||||
waylandOutputNameListener, // name
|
|
||||||
waylandOutputDescriptionListener, // description
|
|
||||||
};
|
|
||||||
static_assert(
|
|
||||||
sizeof(outputListener) >= sizeof(struct wl_output_listener),
|
|
||||||
"sizeof(outputListener) is too small. Please report it to fastfetch github issue"
|
|
||||||
);
|
|
||||||
|
|
||||||
wldata->ffwl_proxy_add_listener(output, (void(**)(void)) &outputListener, &display);
|
|
||||||
wldata->ffwl_display_roundtrip(wldata->display);
|
|
||||||
wldata->ffwl_proxy_destroy(output);
|
|
||||||
|
|
||||||
if(display.width <= 0 || display.height <= 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch(display.transform)
|
|
||||||
{
|
|
||||||
case WL_OUTPUT_TRANSFORM_90:
|
|
||||||
case WL_OUTPUT_TRANSFORM_270:
|
|
||||||
case WL_OUTPUT_TRANSFORM_FLIPPED_90:
|
|
||||||
case WL_OUTPUT_TRANSFORM_FLIPPED_270: {
|
|
||||||
int32_t temp = display.width;
|
|
||||||
display.width = display.height;
|
|
||||||
display.height = temp;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t rotation;
|
|
||||||
switch(display.transform)
|
|
||||||
{
|
|
||||||
case WL_OUTPUT_TRANSFORM_FLIPPED_90:
|
|
||||||
case WL_OUTPUT_TRANSFORM_90:
|
|
||||||
rotation = 90;
|
|
||||||
break;
|
|
||||||
case WL_OUTPUT_TRANSFORM_FLIPPED_180:
|
|
||||||
case WL_OUTPUT_TRANSFORM_180:
|
|
||||||
rotation = 180;
|
|
||||||
break;
|
|
||||||
case WL_OUTPUT_TRANSFORM_FLIPPED_270:
|
|
||||||
case WL_OUTPUT_TRANSFORM_270:
|
|
||||||
rotation = 270;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
rotation = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ffdsAppendDisplay(wldata->result,
|
|
||||||
(uint32_t) display.width,
|
|
||||||
(uint32_t) display.height,
|
|
||||||
display.refreshRate / 1000.0,
|
|
||||||
(uint32_t) (display.width / display.scale),
|
|
||||||
(uint32_t) (display.height / display.scale),
|
|
||||||
rotation,
|
|
||||||
display.edidName.length
|
|
||||||
? &display.edidName
|
|
||||||
: display.description.length
|
|
||||||
? &display.description
|
|
||||||
: display.vendorAndModelId.length
|
|
||||||
? &display.vendorAndModelId : &display.name,
|
|
||||||
display.type,
|
|
||||||
false,
|
|
||||||
0
|
|
||||||
);
|
|
||||||
|
|
||||||
ffStrbufDestroy(&display.description);
|
|
||||||
ffStrbufDestroy(&display.vendorAndModelId);
|
|
||||||
ffStrbufDestroy(&display.name);
|
|
||||||
ffStrbufDestroy(&display.edidName);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void waylandGlobalAddListener(void* data, struct wl_registry* registry, uint32_t name, const char* interface, uint32_t version)
|
|
||||||
{
|
|
||||||
WaylandData* wldata = data;
|
|
||||||
|
|
||||||
if(ffStrEquals(interface, wldata->ffwl_output_interface->name))
|
|
||||||
waylandOutputHandler(wldata, registry, name, version);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool detectWayland(FFDisplayServerResult* result)
|
|
||||||
{
|
|
||||||
FF_LIBRARY_LOAD(wayland, &instance.config.library.libWayland, false, "libwayland-client" FF_LIBRARY_EXTENSION, 1)
|
|
||||||
|
|
||||||
FF_LIBRARY_LOAD_SYMBOL(wayland, wl_display_connect, false)
|
|
||||||
FF_LIBRARY_LOAD_SYMBOL(wayland, wl_display_get_fd, false)
|
|
||||||
FF_LIBRARY_LOAD_SYMBOL(wayland, wl_display_dispatch, false)
|
|
||||||
FF_LIBRARY_LOAD_SYMBOL(wayland, wl_proxy_marshal_constructor, false)
|
|
||||||
FF_LIBRARY_LOAD_SYMBOL(wayland, wl_display_disconnect, false)
|
|
||||||
FF_LIBRARY_LOAD_SYMBOL(wayland, wl_registry_interface, false)
|
|
||||||
|
|
||||||
WaylandData data;
|
|
||||||
|
|
||||||
FF_LIBRARY_LOAD_SYMBOL_VAR(wayland, data, wl_proxy_marshal_constructor_versioned, false)
|
|
||||||
FF_LIBRARY_LOAD_SYMBOL_VAR(wayland, data, wl_proxy_add_listener, false)
|
|
||||||
FF_LIBRARY_LOAD_SYMBOL_VAR(wayland, data, wl_proxy_destroy, false)
|
|
||||||
FF_LIBRARY_LOAD_SYMBOL_VAR(wayland, data, wl_display_roundtrip, false)
|
|
||||||
FF_LIBRARY_LOAD_SYMBOL_VAR(wayland, data, wl_output_interface, false)
|
|
||||||
|
|
||||||
data.display = ffwl_display_connect(NULL);
|
|
||||||
if(data.display == NULL)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
waylandDetectWM(ffwl_display_get_fd(data.display), result);
|
|
||||||
|
|
||||||
struct wl_proxy* registry = ffwl_proxy_marshal_constructor((struct wl_proxy*) data.display, WL_DISPLAY_GET_REGISTRY, ffwl_registry_interface, NULL);
|
|
||||||
if(registry == NULL)
|
|
||||||
{
|
|
||||||
ffwl_display_disconnect(data.display);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
data.result = result;
|
|
||||||
|
|
||||||
struct wl_registry_listener registry_listener = {
|
|
||||||
.global = waylandGlobalAddListener,
|
|
||||||
.global_remove = (void*) stubListener
|
|
||||||
};
|
|
||||||
|
|
||||||
data.ffwl_proxy_add_listener(registry, (void(**)(void)) ®istry_listener, &data);
|
|
||||||
ffwl_display_dispatch(data.display);
|
|
||||||
data.ffwl_display_roundtrip(data.display);
|
|
||||||
|
|
||||||
data.ffwl_proxy_destroy(registry);
|
|
||||||
ffwl_display_disconnect(data.display);
|
|
||||||
|
|
||||||
//We successfully connected to wayland and detected the display.
|
|
||||||
//So we can set set the session type to wayland.
|
|
||||||
//This is used as an indicator that we are running wayland by the x11 backends.
|
|
||||||
ffStrbufSetS(&result->wmProtocolName, FF_WM_PROTOCOL_WAYLAND);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void ffdsConnectWayland(FFDisplayServerResult* result)
|
|
||||||
{
|
|
||||||
//Wayland requires this to be set
|
|
||||||
if(getenv("XDG_RUNTIME_DIR") == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
#ifdef FF_HAVE_WAYLAND
|
|
||||||
if(detectWayland(result))
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const char* xdgSessionType = getenv("XDG_SESSION_TYPE");
|
|
||||||
|
|
||||||
//If XDG_SESSION_TYPE is set, and doesn't contain "wayland", we are probably not running in a wayland session.
|
|
||||||
if(xdgSessionType != NULL && strcasecmp(xdgSessionType, "wayland") != 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
//If XDG_SESSION_TYPE is not set, check if WAYLAND_DISPLAY or WAYLAND_SOCKET is set.
|
|
||||||
//If not, there is no indicator for a wayland session
|
|
||||||
if(xdgSessionType == NULL && getenv("WAYLAND_DISPLAY") == NULL && getenv("WAYLAND_SOCKET") == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
//We are probably running a wayland compositor at this point,
|
|
||||||
//but fastfetch was compiled without the required library, or loading the library failed.
|
|
||||||
ffStrbufSetS(&result->wmProtocolName, FF_WM_PROTOCOL_WAYLAND);
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
#ifdef FF_HAVE_WAYLAND
|
||||||
|
|
||||||
|
#include "wayland.h"
|
||||||
|
#include "util/stringUtils.h"
|
||||||
|
|
||||||
|
static void waylandOutputModeListener(void* data, FF_MAYBE_UNUSED struct wl_output* output, uint32_t flags, int32_t width, int32_t height, int32_t refreshRate)
|
||||||
|
{
|
||||||
|
if(!(flags & WL_OUTPUT_MODE_CURRENT))
|
||||||
|
return;
|
||||||
|
|
||||||
|
WaylandDisplay* display = data;
|
||||||
|
display->width = width;
|
||||||
|
display->height = height;
|
||||||
|
display->refreshRate = refreshRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void waylandOutputScaleListener(void* data, FF_MAYBE_UNUSED struct wl_output* output, int32_t scale)
|
||||||
|
{
|
||||||
|
WaylandDisplay* display = data;
|
||||||
|
display->scale = scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void waylandOutputGeometryListener(void *data,
|
||||||
|
FF_MAYBE_UNUSED struct wl_output *output,
|
||||||
|
FF_MAYBE_UNUSED int32_t x,
|
||||||
|
FF_MAYBE_UNUSED int32_t y,
|
||||||
|
FF_MAYBE_UNUSED int32_t physical_width,
|
||||||
|
FF_MAYBE_UNUSED int32_t physical_height,
|
||||||
|
FF_MAYBE_UNUSED int32_t subpixel,
|
||||||
|
FF_MAYBE_UNUSED const char *make,
|
||||||
|
FF_MAYBE_UNUSED const char *model,
|
||||||
|
int32_t transform)
|
||||||
|
{
|
||||||
|
WaylandDisplay* display = data;
|
||||||
|
display->transform = (enum wl_output_transform) transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ffWaylandHandleGlobalOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version)
|
||||||
|
{
|
||||||
|
struct wl_proxy* output = wldata->ffwl_proxy_marshal_constructor_versioned((struct wl_proxy*) registry, WL_REGISTRY_BIND, wldata->ffwl_output_interface, version, name, wldata->ffwl_output_interface->name, version, NULL);
|
||||||
|
if(output == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
WaylandDisplay display = {
|
||||||
|
.parent = wldata,
|
||||||
|
.width = 0,
|
||||||
|
.height = 0,
|
||||||
|
.refreshRate = 0,
|
||||||
|
.scale = 1,
|
||||||
|
.transform = WL_OUTPUT_TRANSFORM_NORMAL,
|
||||||
|
.type = FF_DISPLAY_TYPE_UNKNOWN,
|
||||||
|
.name = ffStrbufCreate(),
|
||||||
|
.description = ffStrbufCreate(),
|
||||||
|
.edidName = ffStrbufCreate(),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Dirty hack for #477
|
||||||
|
// The order of these callbacks MUST follow `struct wl_output_listener`
|
||||||
|
void* outputListener[] = {
|
||||||
|
waylandOutputGeometryListener, // geometry
|
||||||
|
waylandOutputModeListener, // mode
|
||||||
|
stubListener, // done
|
||||||
|
waylandOutputScaleListener, // scale
|
||||||
|
ffWaylandOutputNameListener, // name
|
||||||
|
ffWaylandOutputDescriptionListener, // description
|
||||||
|
};
|
||||||
|
static_assert(
|
||||||
|
sizeof(outputListener) >= sizeof(struct wl_output_listener),
|
||||||
|
"sizeof(outputListener) is too small. Please report it to fastfetch github issue"
|
||||||
|
);
|
||||||
|
|
||||||
|
wldata->ffwl_proxy_add_listener(output, (void(**)(void)) &outputListener, &display);
|
||||||
|
wldata->ffwl_display_roundtrip(wldata->display);
|
||||||
|
wldata->ffwl_proxy_destroy(output);
|
||||||
|
|
||||||
|
if(display.width <= 0 || display.height <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
uint32_t rotation;
|
||||||
|
switch(display.transform)
|
||||||
|
{
|
||||||
|
case WL_OUTPUT_TRANSFORM_FLIPPED_90:
|
||||||
|
case WL_OUTPUT_TRANSFORM_90:
|
||||||
|
rotation = 90;
|
||||||
|
break;
|
||||||
|
case WL_OUTPUT_TRANSFORM_FLIPPED_180:
|
||||||
|
case WL_OUTPUT_TRANSFORM_180:
|
||||||
|
rotation = 180;
|
||||||
|
break;
|
||||||
|
case WL_OUTPUT_TRANSFORM_FLIPPED_270:
|
||||||
|
case WL_OUTPUT_TRANSFORM_270:
|
||||||
|
rotation = 270;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rotation = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(rotation)
|
||||||
|
{
|
||||||
|
case 90:
|
||||||
|
case 270: {
|
||||||
|
int32_t temp = display.width;
|
||||||
|
display.width = display.height;
|
||||||
|
display.height = temp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ffdsAppendDisplay(wldata->result,
|
||||||
|
(uint32_t) display.width,
|
||||||
|
(uint32_t) display.height,
|
||||||
|
display.refreshRate / 1000.0,
|
||||||
|
(uint32_t) (display.width / display.scale),
|
||||||
|
(uint32_t) (display.height / display.scale),
|
||||||
|
rotation,
|
||||||
|
display.edidName.length
|
||||||
|
? &display.edidName
|
||||||
|
: display.description.length && !ffStrbufEndsWithS(&display.description, "-unknown")
|
||||||
|
? &display.description
|
||||||
|
: &display.name,
|
||||||
|
display.type,
|
||||||
|
false,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
ffStrbufDestroy(&display.description);
|
||||||
|
ffStrbufDestroy(&display.name);
|
||||||
|
ffStrbufDestroy(&display.edidName);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,149 @@
|
|||||||
|
#include "../displayserver_linux.h"
|
||||||
|
#include "common/io/io.h"
|
||||||
|
#include "util/stringUtils.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef FF_HAVE_WAYLAND
|
||||||
|
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
#include "wayland.h"
|
||||||
|
#include "wlr-output-management-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
|
#ifndef __FreeBSD__
|
||||||
|
static void waylandDetectWM(int fd, FFDisplayServerResult* result)
|
||||||
|
{
|
||||||
|
struct ucred ucred;
|
||||||
|
socklen_t len = sizeof(struct ucred);
|
||||||
|
if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &ucred, &len) == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
FF_STRBUF_AUTO_DESTROY procPath = ffStrbufCreate();
|
||||||
|
ffStrbufAppendF(&procPath, "/proc/%d/cmdline", ucred.pid); //We check the cmdline for the process name, because it is not trimmed.
|
||||||
|
ffReadFileBuffer(procPath.chars, &result->wmProcessName);
|
||||||
|
ffStrbufTrimRightSpace(&result->wmProcessName);
|
||||||
|
ffStrbufSubstrBeforeFirstC(&result->wmProcessName, '\0'); //Trim the arguments
|
||||||
|
ffStrbufSubstrAfterLastC(&result->wmProcessName, '/'); //Trim the path
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static void waylandDetectWM(int fd, FFDisplayServerResult* result)
|
||||||
|
{
|
||||||
|
FF_UNUSED(fd, result);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void waylandGlobalAddListener(void* data, struct wl_registry* registry, uint32_t name, const char* interface, uint32_t version)
|
||||||
|
{
|
||||||
|
WaylandData* wldata = data;
|
||||||
|
|
||||||
|
if((wldata->protocolType == FF_WAYLAND_PROTOCOL_TYPE_NONE || wldata->protocolType == FF_WAYLAND_PROTOCOL_TYPE_GLOBAL) && ffStrEquals(interface, wldata->ffwl_output_interface->name))
|
||||||
|
{
|
||||||
|
wldata->protocolType = FF_WAYLAND_PROTOCOL_TYPE_GLOBAL;
|
||||||
|
ffWaylandHandleGlobalOutput(wldata, registry, name, version);
|
||||||
|
}
|
||||||
|
else if((wldata->protocolType == FF_WAYLAND_PROTOCOL_TYPE_NONE || wldata->protocolType == FF_WAYLAND_PROTOCOL_TYPE_ZWLR) && ffStrEquals(interface, zwlr_output_manager_v1_interface.name))
|
||||||
|
{
|
||||||
|
wldata->protocolType = FF_WAYLAND_PROTOCOL_TYPE_ZWLR;
|
||||||
|
ffWaylandHandleZwlrOutput(wldata, registry, name, version);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool detectWayland(FFDisplayServerResult* result)
|
||||||
|
{
|
||||||
|
FF_LIBRARY_LOAD(wayland, &instance.config.library.libWayland, false, "libwayland-client" FF_LIBRARY_EXTENSION, 1)
|
||||||
|
|
||||||
|
FF_LIBRARY_LOAD_SYMBOL(wayland, wl_display_connect, false)
|
||||||
|
FF_LIBRARY_LOAD_SYMBOL(wayland, wl_display_get_fd, false)
|
||||||
|
FF_LIBRARY_LOAD_SYMBOL(wayland, wl_proxy_marshal_constructor, false)
|
||||||
|
FF_LIBRARY_LOAD_SYMBOL(wayland, wl_display_disconnect, false)
|
||||||
|
FF_LIBRARY_LOAD_SYMBOL(wayland, wl_registry_interface, false)
|
||||||
|
|
||||||
|
WaylandData data = {};
|
||||||
|
|
||||||
|
FF_LIBRARY_LOAD_SYMBOL_VAR(wayland, data, wl_proxy_marshal_constructor_versioned, false)
|
||||||
|
FF_LIBRARY_LOAD_SYMBOL_VAR(wayland, data, wl_proxy_add_listener, false)
|
||||||
|
FF_LIBRARY_LOAD_SYMBOL_VAR(wayland, data, wl_proxy_destroy, false)
|
||||||
|
FF_LIBRARY_LOAD_SYMBOL_VAR(wayland, data, wl_display_roundtrip, false)
|
||||||
|
FF_LIBRARY_LOAD_SYMBOL_VAR(wayland, data, wl_output_interface, false)
|
||||||
|
|
||||||
|
data.display = ffwl_display_connect(NULL);
|
||||||
|
if(data.display == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
waylandDetectWM(ffwl_display_get_fd(data.display), result);
|
||||||
|
|
||||||
|
struct wl_proxy* registry = ffwl_proxy_marshal_constructor((struct wl_proxy*) data.display, WL_DISPLAY_GET_REGISTRY, ffwl_registry_interface, NULL);
|
||||||
|
if(registry == NULL)
|
||||||
|
{
|
||||||
|
ffwl_display_disconnect(data.display);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
data.result = result;
|
||||||
|
|
||||||
|
struct wl_registry_listener registry_listener = {
|
||||||
|
.global = waylandGlobalAddListener,
|
||||||
|
.global_remove = (void*) stubListener
|
||||||
|
};
|
||||||
|
|
||||||
|
data.ffwl_proxy_add_listener(registry, (void(**)(void)) ®istry_listener, &data);
|
||||||
|
data.ffwl_display_roundtrip(data.display);
|
||||||
|
|
||||||
|
data.ffwl_proxy_destroy(registry);
|
||||||
|
ffwl_display_disconnect(data.display);
|
||||||
|
|
||||||
|
//We successfully connected to wayland and detected the display.
|
||||||
|
//So we can set set the session type to wayland.
|
||||||
|
//This is used as an indicator that we are running wayland by the x11 backends.
|
||||||
|
ffStrbufSetS(&result->wmProtocolName, FF_WM_PROTOCOL_WAYLAND);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ffWaylandOutputNameListener(void* data, FF_MAYBE_UNUSED void* output, const char *name)
|
||||||
|
{
|
||||||
|
WaylandDisplay* display = data;
|
||||||
|
if(ffStrStartsWith(name, "eDP-"))
|
||||||
|
display->type = FF_DISPLAY_TYPE_BUILTIN;
|
||||||
|
else if(ffStrStartsWith(name, "HDMI-"))
|
||||||
|
display->type = FF_DISPLAY_TYPE_EXTERNAL;
|
||||||
|
ffdsMatchDrmConnector(name, &display->edidName);
|
||||||
|
ffStrbufAppendS(&display->name, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ffWaylandOutputDescriptionListener(void* data, FF_MAYBE_UNUSED void* output, const char* description)
|
||||||
|
{
|
||||||
|
WaylandDisplay* display = data;
|
||||||
|
while (*description == ' ') ++description;
|
||||||
|
if (!ffStrEquals(description, "Unknown Display") && !ffStrContains(description, "(null)"))
|
||||||
|
ffStrbufAppendS(&display->description, description);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void ffdsConnectWayland(FFDisplayServerResult* result)
|
||||||
|
{
|
||||||
|
//Wayland requires this to be set
|
||||||
|
if(getenv("XDG_RUNTIME_DIR") == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef FF_HAVE_WAYLAND
|
||||||
|
if(detectWayland(result))
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const char* xdgSessionType = getenv("XDG_SESSION_TYPE");
|
||||||
|
|
||||||
|
//If XDG_SESSION_TYPE is set, and doesn't contain "wayland", we are probably not running in a wayland session.
|
||||||
|
if(xdgSessionType != NULL && !ffStrEqualsIgnCase(xdgSessionType, "wayland"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
//If XDG_SESSION_TYPE is not set, check if WAYLAND_DISPLAY or WAYLAND_SOCKET is set.
|
||||||
|
//If not, there is no indicator for a wayland session
|
||||||
|
if(xdgSessionType == NULL && getenv("WAYLAND_DISPLAY") == NULL && getenv("WAYLAND_SOCKET") == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//We are probably running a wayland compositor at this point,
|
||||||
|
//but fastfetch was compiled without the required library, or loading the library failed.
|
||||||
|
ffStrbufSetS(&result->wmProtocolName, FF_WM_PROTOCOL_WAYLAND);
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef FF_HAVE_WAYLAND
|
||||||
|
|
||||||
|
#include "common/library.h"
|
||||||
|
#include "util/stringUtils.h"
|
||||||
|
|
||||||
|
#include <wayland-client.h>
|
||||||
|
|
||||||
|
#include "../displayserver_linux.h"
|
||||||
|
|
||||||
|
typedef enum WaylandProtocolType
|
||||||
|
{
|
||||||
|
FF_WAYLAND_PROTOCOL_TYPE_NONE,
|
||||||
|
FF_WAYLAND_PROTOCOL_TYPE_GLOBAL,
|
||||||
|
FF_WAYLAND_PROTOCOL_TYPE_ZWLR,
|
||||||
|
} WaylandProtocolType;
|
||||||
|
|
||||||
|
typedef struct WaylandData
|
||||||
|
{
|
||||||
|
FFDisplayServerResult* result;
|
||||||
|
FF_LIBRARY_SYMBOL(wl_proxy_marshal_constructor_versioned)
|
||||||
|
FF_LIBRARY_SYMBOL(wl_proxy_add_listener)
|
||||||
|
FF_LIBRARY_SYMBOL(wl_proxy_destroy)
|
||||||
|
FF_LIBRARY_SYMBOL(wl_display_roundtrip)
|
||||||
|
struct wl_display* display;
|
||||||
|
const struct wl_interface* ffwl_output_interface;
|
||||||
|
WaylandProtocolType protocolType;
|
||||||
|
} WaylandData;
|
||||||
|
|
||||||
|
typedef struct WaylandDisplay
|
||||||
|
{
|
||||||
|
WaylandData* parent;
|
||||||
|
int32_t width;
|
||||||
|
int32_t height;
|
||||||
|
int32_t refreshRate;
|
||||||
|
double scale;
|
||||||
|
enum wl_output_transform transform;
|
||||||
|
FFDisplayType type;
|
||||||
|
FFstrbuf name;
|
||||||
|
FFstrbuf description;
|
||||||
|
FFstrbuf edidName;
|
||||||
|
void* internal;
|
||||||
|
} WaylandDisplay;
|
||||||
|
|
||||||
|
inline static void stubListener(void* data, ...)
|
||||||
|
{
|
||||||
|
(void) data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ffWaylandOutputNameListener(void* data, FF_MAYBE_UNUSED void* output, const char *name);
|
||||||
|
void ffWaylandOutputDescriptionListener(void* data, FF_MAYBE_UNUSED void* output, const char* description);
|
||||||
|
|
||||||
|
void ffWaylandHandleGlobalOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version);
|
||||||
|
void ffWaylandHandleZwlrOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version);
|
||||||
|
|
||||||
|
#endif
|
||||||
+1298
File diff suppressed because it is too large
Load Diff
+160
@@ -0,0 +1,160 @@
|
|||||||
|
#ifdef FF_HAVE_WAYLAND
|
||||||
|
|
||||||
|
/* Generated by wayland-scanner 1.22.0 */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright © 2019 Purism SPC
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, distribute, and sell this
|
||||||
|
* software and its documentation for any purpose is hereby granted
|
||||||
|
* without fee, provided that the above copyright notice appear in
|
||||||
|
* all copies and that both that copyright notice and this permission
|
||||||
|
* notice appear in supporting documentation, and that the name of
|
||||||
|
* the copyright holders not be used in advertising or publicity
|
||||||
|
* pertaining to distribution of the software without specific,
|
||||||
|
* written prior permission. The copyright holders make no
|
||||||
|
* representations about the suitability of this software for any
|
||||||
|
* purpose. It is provided "as is" without express or implied
|
||||||
|
* warranty.
|
||||||
|
*
|
||||||
|
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
|
||||||
|
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||||
|
* FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
* SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
|
||||||
|
* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
||||||
|
* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
||||||
|
* THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <wayland-util.h>
|
||||||
|
|
||||||
|
#ifndef __has_attribute
|
||||||
|
# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4)
|
||||||
|
#define WL_PRIVATE __attribute__ ((visibility("hidden")))
|
||||||
|
#else
|
||||||
|
#define WL_PRIVATE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern const struct wl_interface zwlr_output_configuration_head_v1_interface;
|
||||||
|
extern const struct wl_interface zwlr_output_configuration_v1_interface;
|
||||||
|
extern const struct wl_interface zwlr_output_head_v1_interface;
|
||||||
|
extern const struct wl_interface zwlr_output_mode_v1_interface;
|
||||||
|
|
||||||
|
static const struct wl_interface *wlr_output_management_unstable_v1_types[] = {
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
&zwlr_output_configuration_v1_interface,
|
||||||
|
NULL,
|
||||||
|
&zwlr_output_head_v1_interface,
|
||||||
|
&zwlr_output_mode_v1_interface,
|
||||||
|
&zwlr_output_mode_v1_interface,
|
||||||
|
&zwlr_output_configuration_head_v1_interface,
|
||||||
|
&zwlr_output_head_v1_interface,
|
||||||
|
&zwlr_output_head_v1_interface,
|
||||||
|
&zwlr_output_mode_v1_interface,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message zwlr_output_manager_v1_requests[] = {
|
||||||
|
{ "create_configuration", "nu", wlr_output_management_unstable_v1_types + 3 },
|
||||||
|
{ "stop", "", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message zwlr_output_manager_v1_events[] = {
|
||||||
|
{ "head", "n", wlr_output_management_unstable_v1_types + 5 },
|
||||||
|
{ "done", "u", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "finished", "", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
WL_PRIVATE const struct wl_interface zwlr_output_manager_v1_interface = {
|
||||||
|
"zwlr_output_manager_v1", 4,
|
||||||
|
2, zwlr_output_manager_v1_requests,
|
||||||
|
3, zwlr_output_manager_v1_events,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message zwlr_output_head_v1_requests[] = {
|
||||||
|
{ "release", "3", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message zwlr_output_head_v1_events[] = {
|
||||||
|
{ "name", "s", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "description", "s", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "physical_size", "ii", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "mode", "n", wlr_output_management_unstable_v1_types + 6 },
|
||||||
|
{ "enabled", "i", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "current_mode", "o", wlr_output_management_unstable_v1_types + 7 },
|
||||||
|
{ "position", "ii", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "transform", "i", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "scale", "f", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "finished", "", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "make", "2s", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "model", "2s", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "serial_number", "2s", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "adaptive_sync", "4u", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
WL_PRIVATE const struct wl_interface zwlr_output_head_v1_interface = {
|
||||||
|
"zwlr_output_head_v1", 4,
|
||||||
|
1, zwlr_output_head_v1_requests,
|
||||||
|
14, zwlr_output_head_v1_events,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message zwlr_output_mode_v1_requests[] = {
|
||||||
|
{ "release", "3", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message zwlr_output_mode_v1_events[] = {
|
||||||
|
{ "size", "ii", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "refresh", "i", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "preferred", "", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "finished", "", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
WL_PRIVATE const struct wl_interface zwlr_output_mode_v1_interface = {
|
||||||
|
"zwlr_output_mode_v1", 3,
|
||||||
|
1, zwlr_output_mode_v1_requests,
|
||||||
|
4, zwlr_output_mode_v1_events,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message zwlr_output_configuration_v1_requests[] = {
|
||||||
|
{ "enable_head", "no", wlr_output_management_unstable_v1_types + 8 },
|
||||||
|
{ "disable_head", "o", wlr_output_management_unstable_v1_types + 10 },
|
||||||
|
{ "apply", "", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "test", "", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "destroy", "", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message zwlr_output_configuration_v1_events[] = {
|
||||||
|
{ "succeeded", "", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "failed", "", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "cancelled", "", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
WL_PRIVATE const struct wl_interface zwlr_output_configuration_v1_interface = {
|
||||||
|
"zwlr_output_configuration_v1", 4,
|
||||||
|
5, zwlr_output_configuration_v1_requests,
|
||||||
|
3, zwlr_output_configuration_v1_events,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct wl_message zwlr_output_configuration_head_v1_requests[] = {
|
||||||
|
{ "set_mode", "o", wlr_output_management_unstable_v1_types + 11 },
|
||||||
|
{ "set_custom_mode", "iii", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "set_position", "ii", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "set_transform", "i", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "set_scale", "f", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
{ "set_adaptive_sync", "4u", wlr_output_management_unstable_v1_types + 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
WL_PRIVATE const struct wl_interface zwlr_output_configuration_head_v1_interface = {
|
||||||
|
"zwlr_output_configuration_head_v1", 4,
|
||||||
|
6, zwlr_output_configuration_head_v1_requests,
|
||||||
|
0, NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,193 @@
|
|||||||
|
#ifdef FF_HAVE_WAYLAND
|
||||||
|
|
||||||
|
#include "wayland.h"
|
||||||
|
#include "wlr-output-management-unstable-v1-client-protocol.h"
|
||||||
|
|
||||||
|
static void waylandZwlrTransformListener(void* data, FF_MAYBE_UNUSED struct zwlr_output_head_v1 *zwlr_output_head_v1, int32_t transform)
|
||||||
|
{
|
||||||
|
WaylandDisplay* wldata = (WaylandDisplay*) data;
|
||||||
|
wldata->transform = (enum wl_output_transform) transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void waylandZwlrScaleListener(void* data, FF_MAYBE_UNUSED struct zwlr_output_head_v1 *zwlr_output_head_v1, wl_fixed_t scale)
|
||||||
|
{
|
||||||
|
WaylandDisplay* wldata = (WaylandDisplay*) data;
|
||||||
|
wldata->scale = wl_fixed_to_double(scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct WaylandZwlrMode
|
||||||
|
{
|
||||||
|
int32_t width;
|
||||||
|
int32_t height;
|
||||||
|
int32_t refreshRate;
|
||||||
|
struct zwlr_output_mode_v1* pMode;
|
||||||
|
} WaylandZwlrMode;
|
||||||
|
|
||||||
|
static void waylandZwlrSizeListener(void* data, FF_MAYBE_UNUSED struct zwlr_output_mode_v1 *zwlr_output_mode_v1, int32_t width, int32_t height)
|
||||||
|
{
|
||||||
|
WaylandZwlrMode* mode = (WaylandZwlrMode*) data;
|
||||||
|
mode->width = width;
|
||||||
|
mode->height = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void waylandZwlrRefreshListener(void* data, FF_MAYBE_UNUSED struct zwlr_output_mode_v1 *zwlr_output_mode_v1, int32_t rate)
|
||||||
|
{
|
||||||
|
WaylandZwlrMode* mode = (WaylandZwlrMode*) data;
|
||||||
|
mode->refreshRate = rate;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct zwlr_output_mode_v1_listener modeListener = {
|
||||||
|
.size = waylandZwlrSizeListener,
|
||||||
|
.refresh = waylandZwlrRefreshListener,
|
||||||
|
.preferred = (void*) stubListener,
|
||||||
|
.finished = (void*) stubListener,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void waylandZwlrModeListener(void* data, FF_MAYBE_UNUSED struct zwlr_output_head_v1 *zwlr_output_head_v1, struct zwlr_output_mode_v1 *mode)
|
||||||
|
{
|
||||||
|
WaylandDisplay* wldata = (WaylandDisplay*) data;
|
||||||
|
WaylandZwlrMode* newMode = ffListAdd((FFlist*) wldata->internal);
|
||||||
|
newMode->pMode = mode;
|
||||||
|
|
||||||
|
// Strangely, the listener is called only in this function, but not in `waylandZwlrCurrentModeListener`
|
||||||
|
wldata->parent->ffwl_proxy_add_listener((struct wl_proxy *) mode, (void (**)(void)) &modeListener, newMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void waylandZwlrCurrentModeListener(void* data, FF_MAYBE_UNUSED struct zwlr_output_head_v1 *zwlr_output_head_v1, struct zwlr_output_mode_v1 *mode)
|
||||||
|
{
|
||||||
|
// waylandZwlrModeListener is always run before this
|
||||||
|
WaylandDisplay* wldata = (WaylandDisplay*) data;
|
||||||
|
WaylandZwlrMode* current = NULL;
|
||||||
|
FF_LIST_FOR_EACH(WaylandZwlrMode, m, *(FFlist*) wldata->internal)
|
||||||
|
{
|
||||||
|
if (m->pMode == mode)
|
||||||
|
{
|
||||||
|
current = m;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wldata->width = current->width;
|
||||||
|
wldata->height = current->height;
|
||||||
|
wldata->refreshRate = current->refreshRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void waylandHandleZwlrHead(void *data, FF_MAYBE_UNUSED struct zwlr_output_manager_v1 *zwlr_output_manager_v1, struct zwlr_output_head_v1 *head)
|
||||||
|
{
|
||||||
|
WaylandData* wldata = data;
|
||||||
|
|
||||||
|
const struct zwlr_output_head_v1_listener headListener = {
|
||||||
|
.name = (void*) ffWaylandOutputNameListener,
|
||||||
|
.description = (void*) ffWaylandOutputDescriptionListener,
|
||||||
|
.physical_size = (void*) stubListener,
|
||||||
|
.mode = waylandZwlrModeListener,
|
||||||
|
.enabled = (void*) stubListener,
|
||||||
|
.current_mode = waylandZwlrCurrentModeListener,
|
||||||
|
.position = (void*) stubListener,
|
||||||
|
.transform = waylandZwlrTransformListener,
|
||||||
|
.scale = waylandZwlrScaleListener,
|
||||||
|
.finished = (void*) stubListener,
|
||||||
|
.make = (void*) stubListener,
|
||||||
|
.model = (void*) stubListener,
|
||||||
|
.serial_number = (void*) stubListener,
|
||||||
|
.adaptive_sync = (void*) stubListener,
|
||||||
|
};
|
||||||
|
|
||||||
|
FF_LIST_AUTO_DESTROY modes = ffListCreate(sizeof(WaylandZwlrMode));
|
||||||
|
WaylandDisplay display = {
|
||||||
|
.parent = wldata,
|
||||||
|
.width = 0,
|
||||||
|
.height = 0,
|
||||||
|
.refreshRate = 0,
|
||||||
|
.scale = 1,
|
||||||
|
.transform = WL_OUTPUT_TRANSFORM_NORMAL,
|
||||||
|
.type = FF_DISPLAY_TYPE_UNKNOWN,
|
||||||
|
.name = ffStrbufCreate(),
|
||||||
|
.description = ffStrbufCreate(),
|
||||||
|
.edidName = ffStrbufCreate(),
|
||||||
|
.internal = &modes,
|
||||||
|
};
|
||||||
|
|
||||||
|
wldata->ffwl_proxy_add_listener((struct wl_proxy*) head, (void(**)(void)) &headListener, &display);
|
||||||
|
wldata->ffwl_display_roundtrip(wldata->display);
|
||||||
|
|
||||||
|
if(display.width <= 0 || display.height <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
uint32_t rotation;
|
||||||
|
switch(display.transform)
|
||||||
|
{
|
||||||
|
case WL_OUTPUT_TRANSFORM_FLIPPED_90:
|
||||||
|
case WL_OUTPUT_TRANSFORM_90:
|
||||||
|
rotation = 90;
|
||||||
|
break;
|
||||||
|
case WL_OUTPUT_TRANSFORM_FLIPPED_180:
|
||||||
|
case WL_OUTPUT_TRANSFORM_180:
|
||||||
|
rotation = 180;
|
||||||
|
break;
|
||||||
|
case WL_OUTPUT_TRANSFORM_FLIPPED_270:
|
||||||
|
case WL_OUTPUT_TRANSFORM_270:
|
||||||
|
rotation = 270;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rotation = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(rotation)
|
||||||
|
{
|
||||||
|
case 90:
|
||||||
|
case 270: {
|
||||||
|
int32_t temp = display.width;
|
||||||
|
display.width = display.height;
|
||||||
|
display.height = temp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ffdsAppendDisplay(wldata->result,
|
||||||
|
(uint32_t) display.width,
|
||||||
|
(uint32_t) display.height,
|
||||||
|
display.refreshRate / 1000.0,
|
||||||
|
(uint32_t) (display.width / display.scale + 0.5),
|
||||||
|
(uint32_t) (display.height / display.scale + 0.5),
|
||||||
|
rotation,
|
||||||
|
display.edidName.length
|
||||||
|
? &display.edidName
|
||||||
|
: display.description.length
|
||||||
|
? &display.description
|
||||||
|
: &display.name,
|
||||||
|
display.type,
|
||||||
|
false,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
ffStrbufDestroy(&display.description);
|
||||||
|
ffStrbufDestroy(&display.name);
|
||||||
|
ffStrbufDestroy(&display.edidName);
|
||||||
|
|
||||||
|
// These must be released manually
|
||||||
|
FF_LIST_FOR_EACH(WaylandZwlrMode, m, modes)
|
||||||
|
wldata->ffwl_proxy_destroy((void*) m->pMode);
|
||||||
|
wldata->ffwl_proxy_destroy((void*) head);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ffWaylandHandleZwlrOutput(WaylandData* wldata, struct wl_registry* registry, uint32_t name, uint32_t version)
|
||||||
|
{
|
||||||
|
struct wl_proxy* output = wldata->ffwl_proxy_marshal_constructor_versioned((struct wl_proxy*) registry, WL_REGISTRY_BIND, &zwlr_output_manager_v1_interface, version, name, zwlr_output_manager_v1_interface.name, version, NULL);
|
||||||
|
if(output == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const struct zwlr_output_manager_v1_listener outputListener = {
|
||||||
|
.head = waylandHandleZwlrHead,
|
||||||
|
.done = (void*) stubListener,
|
||||||
|
.finished = (void*) stubListener,
|
||||||
|
};
|
||||||
|
|
||||||
|
wldata->ffwl_proxy_add_listener(output, (void(**)(void)) &outputListener, wldata);
|
||||||
|
wldata->ffwl_display_roundtrip(wldata->display);
|
||||||
|
wldata->ffwl_proxy_destroy(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user