mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-09-12 10:22:12 +02:00
Compare commits
133 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| be60eaf7c8 | |||
| 2235c3e8e4 | |||
| 68ae9248a6 | |||
| b9742642fc | |||
| 356c905703 | |||
| 47a5473a35 | |||
| 96bca6888a | |||
| bbf31c1a95 | |||
| 42b8c1b429 | |||
| 77fde11039 | |||
| e13f04e80f | |||
| ad026f6105 | |||
| 9107d0e107 | |||
| ee876c54bf | |||
| 4af44a40bf | |||
| 399cfe2fbc | |||
| 71d0cdbfce | |||
| aae740472f | |||
| 8f9beb2789 | |||
| 77b93a904f | |||
| 7934c16bca | |||
| 941ddee2fc | |||
| 16113bf330 | |||
| 505182428b | |||
| 3c2a84ff78 | |||
| 8a3346b650 | |||
| 5b63fb1362 | |||
| 393857b067 | |||
| cb8a9c0796 | |||
| 036752763f | |||
| 3a90af1f44 | |||
| 772de0ff97 | |||
| 53a61a8e58 | |||
| a37328c1aa | |||
| 782325395c | |||
| e13d554433 | |||
| 15c72c04af | |||
| b797246607 | |||
| d54bb4fd16 | |||
| 0a946e3976 | |||
| a339f00d83 | |||
| de15866c9a | |||
| 24ee87720e | |||
| 7310b3ed09 | |||
| bb6cdc7bb0 | |||
| 4a2d20fb74 | |||
| b136b86300 | |||
| d4a7ae8b34 | |||
| 04da7cebdb | |||
| ccb227e694 | |||
| 9c7b868227 | |||
| f333937b35 | |||
| e4f6f15d70 | |||
| 5ae8ef1cb3 | |||
| d863652e1b | |||
| ac540d73b7 | |||
| 37b9da7337 | |||
| 93c0dbde0d | |||
| aa236b4da0 | |||
| 2fd3643632 | |||
| 24f9247c54 | |||
| d312b752a1 | |||
| 1b476757a0 | |||
| c78a8f6317 | |||
| 24c3788055 | |||
| a644762a60 | |||
| 3185d92fb5 | |||
| 2c629bc821 | |||
| 1a6c38bc26 | |||
| 589f9aa8f3 | |||
| 70e5d0b235 | |||
| aa81d80578 | |||
| 7bc6676680 | |||
| ab9b10824f | |||
| f5931e80e7 | |||
| bf4f86b4f6 | |||
| 7f59f22cf4 | |||
| 14f4817381 | |||
| e821468bb0 | |||
| d9315d2332 | |||
| a2b4be388e | |||
| 35e06642f9 | |||
| 92de3e4f30 | |||
| 5b65e182e9 | |||
| a7896c39f0 | |||
| 4f19bf9a18 | |||
| c379c65960 | |||
| 1ae0a83880 | |||
| 77f7c813f4 | |||
| bfec8b5634 | |||
| 15a43a6b11 | |||
| c9e3c34ce1 | |||
| b99b3ad982 | |||
| f4ce5c4143 | |||
| bb4bf63621 | |||
| 60c1a552bb | |||
| 0a979ddd1e | |||
| e45c4b49fd | |||
| b89ace7aae | |||
| 424ca923fc | |||
| e837e1e1d1 | |||
| aea0986928 | |||
| dc2a3492f0 | |||
| 8cf033002c | |||
| 4d7cb25aa6 | |||
| 60cf3ec861 | |||
| 4fd82b16e8 | |||
| 26feccc0e4 | |||
| 9a1bc66dfc | |||
| 24a3783d7c | |||
| 7e072c395f | |||
| 94e1ed1d7e | |||
| 94e6f4040d | |||
| d570e59818 | |||
| 0e9d48fff0 | |||
| e690d73434 | |||
| 8f2b3c6b69 | |||
| 3c0b2fc910 | |||
| 7d0a1c8987 | |||
| 757d947446 | |||
| 4ced4f9631 | |||
| c6859d7edd | |||
| 94cf9a89cc | |||
| bd8d78427b | |||
| e40d4b9b68 | |||
| 4a07485a19 | |||
| 71614e0b0c | |||
| d5b6c14bdf | |||
| 9509718b0e | |||
| c0ca022ac2 | |||
| 708b4a8981 | |||
| 8006b0ca4f | |||
| cc2286f056 |
@@ -1,3 +1,55 @@
|
||||
# 1.11.3
|
||||
|
||||
Bugfixes:
|
||||
* Fix a segfault bug, regression of `1.11.1` (Linux, wmtheme, #467)
|
||||
|
||||
# 1.11.2
|
||||
|
||||
This release should be the last version of fastfetch 1.x (if no serious bugs found, hopefully)
|
||||
|
||||
Features:
|
||||
* Support display name, type, rotation detection on Wayland (Linux, Display)
|
||||
* Print more useful display name instead of intel_backlight (Linux, Brightness)
|
||||
* Icons module supports Windows (Windows, Icons)
|
||||
* Add Wallpaper module which shows the current wallpaper image path
|
||||
* Add mac address detection `--localip-show-mac` (LocalIP, #451)
|
||||
|
||||
Bugfixes:
|
||||
* Fix Gnome version detection on Fedora (DE)
|
||||
* Fix Windows drives detection in WSL (Disk)
|
||||
|
||||
Changes:
|
||||
* In order to make Icons module consistant between different platforms, `--icons-format` no longer supports individual GTK / QT icon params.
|
||||
* `--theme-format` no longer supports individual GTK / plasma theme params.
|
||||
* `--local-ip-*` and `--public-ip-*` have been changed to `--localip-*` and `--publicip-*`
|
||||
* `--localip-compact-type` is no longer supported. Fastfetch now display IPs as `--localip-compat-type multiline` by default, with `--local-compact true` can be set as an alias of `--localip-compact-type oneline`
|
||||
* `--localip-v6first` is no longer supported.
|
||||
|
||||
# 1.11.1
|
||||
|
||||
Features:
|
||||
* Support xonsh detection (TerminalShell)
|
||||
* Support Tabby version / terminal font detection (TerminalFont)
|
||||
|
||||
Bugfixes:
|
||||
* Fix name of Pro Controller (Gamepad, Windows)
|
||||
* Fix compile error with imagemagick enabled (Windows)
|
||||
* Fix copy-and-paste errors (Gamepad)
|
||||
* Flatpak: Fix user package count
|
||||
* Flatpak: Count runtime packages too (#441)
|
||||
* Fix flatpak package count (#441)
|
||||
* Don't print white color blocks with `--pipe` (#450)
|
||||
* Fix iTerm being detected as iTermServer-* sometimes
|
||||
* Fix sound device volume being incorrectly detected as muted sometimes (Sound)
|
||||
* Fix memleaks reported by LeakSanitizer (Linux)
|
||||
* Fix potential memory curruption bug in unicode.c (Windows)
|
||||
|
||||
Logo:
|
||||
* Update Windows 11 ASCII logo to look more visually consistent (#445)
|
||||
* Add another font color index to arch icon (#446)
|
||||
* Add SteamOS
|
||||
* Add macOS small / small2
|
||||
|
||||
# 1.11.0
|
||||
|
||||
Features:
|
||||
|
||||
+24
-9
@@ -1,7 +1,7 @@
|
||||
cmake_minimum_required(VERSION 3.12.0) # target_link_libraries with OBJECT libs & project homepage url
|
||||
|
||||
project(fastfetch
|
||||
VERSION 1.11.0
|
||||
VERSION 1.11.3
|
||||
LANGUAGES C
|
||||
DESCRIPTION "Fast system information tool"
|
||||
HOMEPAGE_URL "https://github.com/LinusDierheimer/fastfetch"
|
||||
@@ -57,7 +57,7 @@ cmake_dependent_option(ENABLE_GIO "Enable gio-2.0" ON "LINUX OR BSD" OFF)
|
||||
cmake_dependent_option(ENABLE_DCONF "Enable dconf" ON "LINUX OR BSD" OFF)
|
||||
cmake_dependent_option(ENABLE_DBUS "Enable dbus-1" ON "LINUX OR BSD" OFF)
|
||||
cmake_dependent_option(ENABLE_XFCONF "Enable libxfconf-0" ON "LINUX OR BSD" OFF)
|
||||
cmake_dependent_option(ENABLE_SQLITE3 "Enable sqlite3" ON "LINUX OR BSD" OFF)
|
||||
cmake_dependent_option(ENABLE_SQLITE3 "Enable sqlite3" ON "LINUX OR BSD OR APPLE" OFF)
|
||||
cmake_dependent_option(ENABLE_RPM "Enable rpm" ON "LINUX" OFF)
|
||||
cmake_dependent_option(ENABLE_IMAGEMAGICK7 "Enable imagemagick 7" ON "LINUX OR BSD OR APPLE OR WIN32" OFF)
|
||||
cmake_dependent_option(ENABLE_IMAGEMAGICK6 "Enable imagemagick 6" ON "LINUX OR BSD OR APPLE" OFF)
|
||||
@@ -73,7 +73,6 @@ cmake_dependent_option(ENABLE_PULSE "Enable pulse" ON "LINUX OR BSD" OFF)
|
||||
cmake_dependent_option(ENABLE_LIBCJSON "Enable libcjson" ON "LINUX OR WIN32" OFF)
|
||||
cmake_dependent_option(ENABLE_THREADS "Enable multithreading" ON "Threads_FOUND" OFF)
|
||||
cmake_dependent_option(ENABLE_BUFFER "Enable stdout buffer" ON "LINUX OR APPLE OR BSD OR WIN32 OR ANDROID" OFF)
|
||||
cmake_dependent_option(USE_WIN_NTAPI "Allow using internal NTAPI" ON "WIN32" OFF)
|
||||
|
||||
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
|
||||
@@ -248,6 +247,7 @@ set(LIBFASTFETCH_SRC
|
||||
src/detection/host/host.c
|
||||
src/detection/locale/locale.c
|
||||
src/detection/media/media.c
|
||||
src/detection/opencl/opencl.c
|
||||
src/detection/os/os.c
|
||||
src/detection/packages/packages.c
|
||||
src/detection/terminalfont/terminalfont.c
|
||||
@@ -296,6 +296,7 @@ set(LIBFASTFETCH_SRC
|
||||
src/modules/separator.c
|
||||
src/modules/shell.c
|
||||
src/modules/sound.c
|
||||
src/modules/swap.c
|
||||
src/modules/media.c
|
||||
src/modules/terminal.c
|
||||
src/modules/terminalfont.c
|
||||
@@ -305,6 +306,7 @@ set(LIBFASTFETCH_SRC
|
||||
src/modules/uptime.c
|
||||
src/modules/users.c
|
||||
src/modules/vulkan.c
|
||||
src/modules/wallpaper.c
|
||||
src/modules/weather.c
|
||||
src/modules/wifi.c
|
||||
src/modules/wm.c
|
||||
@@ -341,6 +343,7 @@ if(LINUX)
|
||||
src/detection/gpu/gpu_linux.c
|
||||
src/detection/gtk_qt/gtk.c
|
||||
src/detection/host/host_linux.c
|
||||
src/detection/icons/icons_linux.c
|
||||
src/detection/localip/localip_linux.c
|
||||
src/detection/gamepad/gamepad_linux.c
|
||||
src/detection/media/media_linux.c
|
||||
@@ -356,8 +359,10 @@ if(LINUX)
|
||||
src/detection/temps/temps_linux.c
|
||||
src/detection/terminalfont/terminalfont_linux.c
|
||||
src/detection/terminalshell/terminalshell_linux.c
|
||||
src/detection/theme/theme_linux.c
|
||||
src/detection/uptime/uptime_linux.c
|
||||
src/detection/users/users_linux.c
|
||||
src/detection/wallpaper/wallpaper_linux.c
|
||||
src/detection/wifi/wifi_linux.c
|
||||
src/detection/wmtheme/wmtheme_linux.c
|
||||
src/util/platform/FFPlatform_unix.c
|
||||
@@ -381,6 +386,7 @@ elseif(ANDROID)
|
||||
src/detection/font/font_nosupport.c
|
||||
src/detection/gpu/gpu_nosupport.c
|
||||
src/detection/host/host_android.c
|
||||
src/detection/icons/icons_nosupport.c
|
||||
src/detection/localip/localip_linux.c
|
||||
src/detection/gamepad/gamepad_nosupport.c
|
||||
src/detection/media/media_nosupport.c
|
||||
@@ -395,8 +401,10 @@ elseif(ANDROID)
|
||||
src/detection/temps/temps_linux.c
|
||||
src/detection/terminalfont/terminalfont_android.c
|
||||
src/detection/terminalshell/terminalshell_linux.c
|
||||
src/detection/theme/theme_nosupport.c
|
||||
src/detection/uptime/uptime_linux.c
|
||||
src/detection/users/users_linux.c
|
||||
src/detection/wallpaper/wallpaper_nosupport.c
|
||||
src/detection/wifi/wifi_android.c
|
||||
src/detection/wmtheme/wmtheme_nosupport.c
|
||||
src/util/platform/FFPlatform_unix.c
|
||||
@@ -427,6 +435,7 @@ elseif(BSD)
|
||||
src/detection/gpu/gpu_linux.c
|
||||
src/detection/gtk_qt/gtk.c
|
||||
src/detection/host/host_bsd.c
|
||||
src/detection/icons/icons_linux.c
|
||||
src/detection/localip/localip_linux.c
|
||||
src/detection/gamepad/gamepad_nosupport.c
|
||||
src/detection/media/media_linux.c
|
||||
@@ -442,8 +451,10 @@ elseif(BSD)
|
||||
src/detection/temps/temps_linux.c
|
||||
src/detection/terminalfont/terminalfont_linux.c
|
||||
src/detection/terminalshell/terminalshell_linux.c
|
||||
src/detection/theme/theme_linux.c
|
||||
src/detection/uptime/uptime_bsd.c
|
||||
src/detection/users/users_linux.c
|
||||
src/detection/wallpaper/wallpaper_linux.c
|
||||
src/detection/wifi/wifi_nosupport.c
|
||||
src/detection/wmtheme/wmtheme_linux.c
|
||||
src/util/platform/FFPlatform_unix.c
|
||||
@@ -469,6 +480,7 @@ elseif(APPLE)
|
||||
src/detection/font/font_apple.m
|
||||
src/detection/gpu/gpu_apple.c
|
||||
src/detection/host/host_apple.c
|
||||
src/detection/icons/icons_nosupport.c
|
||||
src/detection/localip/localip_linux.c
|
||||
src/detection/gamepad/gamepad_apple.c
|
||||
src/detection/media/media_apple.m
|
||||
@@ -483,8 +495,10 @@ elseif(APPLE)
|
||||
src/detection/temps/temps_apple.c
|
||||
src/detection/terminalfont/terminalfont_apple.m
|
||||
src/detection/terminalshell/terminalshell_linux.c
|
||||
src/detection/theme/theme_nosupport.c
|
||||
src/detection/uptime/uptime_bsd.c
|
||||
src/detection/users/users_linux.c
|
||||
src/detection/wallpaper/wallpaper_apple.c
|
||||
src/detection/wifi/wifi_apple.m
|
||||
src/detection/wmtheme/wmtheme_apple.m
|
||||
src/util/apple/cf_helpers.c
|
||||
@@ -510,6 +524,7 @@ elseif(WIN32)
|
||||
src/detection/font/font_windows.c
|
||||
src/detection/gpu/gpu_windows.c
|
||||
src/detection/host/host_windows.c
|
||||
src/detection/icons/icons_windows.c
|
||||
src/detection/localip/localip_windows.c
|
||||
src/detection/gamepad/gamepad_windows.c
|
||||
src/detection/media/media_nosupport.c
|
||||
@@ -518,14 +533,16 @@ elseif(WIN32)
|
||||
src/detection/os/os_windows.cpp
|
||||
src/detection/packages/packages_windows.c
|
||||
src/detection/poweradapter/poweradapter_nosupport.c
|
||||
src/detection/processes/processes_windows.cpp
|
||||
src/detection/processes/processes_windows.c
|
||||
src/detection/sound/sound_windows.cpp
|
||||
src/detection/swap/swap_windows.cpp
|
||||
src/detection/swap/swap_windows.c
|
||||
src/detection/terminalfont/terminalfont_windows.c
|
||||
src/detection/terminalshell/terminalshell_windows.cpp
|
||||
src/detection/terminalshell/terminalshell_windows.c
|
||||
src/detection/temps/temps_windows.cpp
|
||||
src/detection/theme/theme_nosupport.c
|
||||
src/detection/uptime/uptime_windows.c
|
||||
src/detection/users/users_windows.c
|
||||
src/detection/wallpaper/wallpaper_windows.c
|
||||
src/detection/wifi/wifi_windows.c
|
||||
src/detection/wmtheme/wmtheme_windows.c
|
||||
src/util/windows/getline.c
|
||||
@@ -710,6 +727,7 @@ if(APPLE)
|
||||
PRIVATE "-framework IOKit"
|
||||
PRIVATE "-framework OpenGL"
|
||||
PRIVATE "-framework OpenCL"
|
||||
PRIVATE "-framework SystemConfiguration"
|
||||
PRIVATE "-weak_framework CoreDisplay"
|
||||
PRIVATE "-weak_framework DisplayServices -F /System/Library/PrivateFrameworks"
|
||||
PRIVATE "-weak_framework MediaRemote -F /System/Library/PrivateFrameworks"
|
||||
@@ -732,9 +750,6 @@ elseif(WIN32)
|
||||
PRIVATE "wtsapi32"
|
||||
PRIVATE "powrprof"
|
||||
)
|
||||
if(USE_WIN_NTAPI)
|
||||
target_compile_definitions(libfastfetch PRIVATE FF_USE_WIN_NTAPI)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
target_include_directories(libfastfetch
|
||||
|
||||
@@ -64,6 +64,7 @@ The following libraries are used if present at runtime:
|
||||
* [`MoltenVK`](https://github.com/KhronosGroup/MoltenVK): Vulkan driver for macOS. [`molten-vk`](https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/molten-vk.rb)
|
||||
* [`libmagickcore` (ImageMagick)](https://www.imagemagick.org/): Images in terminal using sixel graphics protocol. [`imagemagick`](https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/imagemagick.rb)
|
||||
* [`libchafa`](https://github.com/hpjansson/chafa): Image output as ascii art. [`chafa`](https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/chafa.rb)
|
||||
* [`libsqlite3`](https://www.sqlite.org/index.html): Used for fast wallpaper detection ( fallback to AppleScript )
|
||||
|
||||
For the image logo, iTerm with iterm image protocol should work. Apple Terminal is not supported.
|
||||
|
||||
@@ -89,12 +90,12 @@ All categories not listed here should work without needing a specific implementa
|
||||
|
||||
##### Available Modules
|
||||
```
|
||||
Battery, Bios, Bluetooth, Board, Break, Brightness, Colors, Command, CPU, CPUUsage, Cursor, Custom, Date, DateTime, DE, Disk, Display, Font, Gamepad, GPU, Host, Icons, Kernel, Locale, LocalIP, Media, Memory, OpenCL, OpenGL, Packages, Player, Power Adapter, Processes, PublicIP, Separator, OS, Shell, Sound, Swap, Terminal, Terminal Font, Theme, Time, Title, Uptime, Vulkan, Wifi, WM, WMTheme
|
||||
Battery, Bios, Bluetooth, Board, Break, Brightness, Colors, Command, CPU, CPUUsage, Cursor, Custom, Date, DateTime, DE, Disk, Display, Font, Gamepad, GPU, Host, Icons, Kernel, Locale, LocalIP, Media, Memory, OpenCL, OpenGL, Packages, Player, Power Adapter, Processes, PublicIP, Separator, OS, Shell, Sound, Swap, Terminal, Terminal Font, Theme, Time, Title, Uptime, Vulkan, Wallpaper, Wifi, WM, WMTheme
|
||||
```
|
||||
|
||||
##### Builtin logos
|
||||
```
|
||||
AlmaLinux, Alpine, Android, Arch, Arco, Artix, Bedrock, CachyOS, CentOS, CRUX, Crystal, Debian, Deepin, Devuan, Endeavour, Enso, Fedora, FreeBSD, Garuda, Gentoo, KDE Neon, KISS, Kubuntu, LangitKetujuh, Linux, MacOS, Manjaro, Mint, MSYS2, NixOS, Nobara, OpenSUSE, OpenSUSE LEAP, OpenSUSE Tumbleweed, Parabola, Pop!_OS, Raspbian, RebornOS, RedstarOS, Rocky, Rosa, Slackware, Solus, Ubuntu, Vanilla, Void, Windows, Windows 11, Windows 8, Zorin
|
||||
AlmaLinux, Alpine, Android, Arch, Arco, Artix, Bedrock, CachyOS, CentOS, CRUX, Crystal, Debian, Deepin, Devuan, Endeavour, Enso, Fedora, FreeBSD, Garuda, Gentoo, KDE Neon, KISS, Kubuntu, LangitKetujuh, Linux, MacOS, Manjaro, Mint, MSYS2, NixOS, Nobara, OpenSUSE, OpenSUSE LEAP, OpenSUSE Tumbleweed, Parabola, Pop!_OS, Raspbian, RebornOS, RedstarOS, Rocky, Rosa, Slackware, Solus, SteamOS, Ubuntu, Vanilla, Void, Windows, Windows 11, Windows 8, Zorin
|
||||
```
|
||||
|
||||
##### Package managers
|
||||
@@ -114,7 +115,7 @@ Budgie, Cinnamon, Gnome, KDE Plasma, LXQt, Mate, XFCE4
|
||||
|
||||
##### Terminal fonts
|
||||
```
|
||||
Alacritty, Apple Terminal, ConEmu, Deepin Terminal, foot, Gnome Terminal, iTerm2, Kitty, Konsole, LXTerminal, mintty, Terminator, Termux, Tilix, TTY, Warp, WezTerm, Windows Terminal, XFCE4 Terminal
|
||||
Alacritty, Apple Terminal, ConEmu, Deepin Terminal, foot, Gnome Terminal, iTerm2, Kitty, Konsole, LXTerminal, mintty, Tabby, Terminator, Termux, Tilix, TTY, Warp, WezTerm, Windows Terminal, XFCE4 Terminal
|
||||
```
|
||||
|
||||
## Building
|
||||
|
||||
+10
-10
@@ -32,8 +32,8 @@ __fastfetch_complete_help()
|
||||
"battery-format"
|
||||
"poweradapter-format"
|
||||
"locale-format"
|
||||
"local-ip-format"
|
||||
"public-ip-format"
|
||||
"localip-format"
|
||||
"publicip-format"
|
||||
"player-format"
|
||||
"media-format"
|
||||
"datetime-format"
|
||||
@@ -235,8 +235,8 @@ __fastfetch_completion()
|
||||
"--set-keyless"
|
||||
"--player-name"
|
||||
"--percent-type"
|
||||
"--public-ip-url"
|
||||
"--public-ip-timeout"
|
||||
"--publicip-url"
|
||||
"--publicip-timeout"
|
||||
"--weather-output-format"
|
||||
"--weather-timeout"
|
||||
"--os-key"
|
||||
@@ -317,12 +317,12 @@ __fastfetch_completion()
|
||||
"--locale-key"
|
||||
"--locale-format"
|
||||
"--locale-error"
|
||||
"--local-ip-key"
|
||||
"--local-ip-format"
|
||||
"--local-ip-error"
|
||||
"--public-ip-key"
|
||||
"--public-ip-format"
|
||||
"--public-ip-error"
|
||||
"--localip-key"
|
||||
"--localip-format"
|
||||
"--localip-error"
|
||||
"--publicip-key"
|
||||
"--publicip-format"
|
||||
"--publicip-error"
|
||||
"--wifi-key"
|
||||
"--wifi-format"
|
||||
"--wifi-error"
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
--structure Title:Separator:OS:Host:Bios:Board:Chassis:Kernel:Uptime:Processes:Packages:Shell:Display:Brightness:DE:WM:WMTheme:Theme:Icons:Font:Cursor:Terminal:TerminalFont:CPU:CPUUsage:GPU:Memory:Swap:Disk:Battery:PowerAdapter:Player:Media:PublicIP:LocalIP:Wifi:DateTime:Locale:Vulkan:OpenGL:OpenCL:Users:Bluetooth:Sound:Gamepad:Weather:Break:Colors
|
||||
--structure Title:Separator:OS:Host:Bios:Board:Chassis:Kernel:Uptime:Processes:Packages:Shell:Display:Brightness:DE:WM:WMTheme:Theme:Icons:Font:Cursor:Wallpaper:Terminal:TerminalFont:CPU:CPUUsage:GPU:Memory:Swap:Disk:Battery:PowerAdapter:Player:Media:PublicIP:LocalIP:Wifi:DateTime:Locale:Vulkan:OpenGL:OpenCL:Users:Bluetooth:Sound:Gamepad:Weather:Break:Colors
|
||||
|
||||
+5
-9
@@ -109,6 +109,7 @@ static void defaultConfig(FFinstance* instance)
|
||||
initModuleArg(&instance->config.date);
|
||||
initModuleArg(&instance->config.time);
|
||||
initModuleArg(&instance->config.vulkan);
|
||||
initModuleArg(&instance->config.wallpaper);
|
||||
initModuleArg(&instance->config.openGL);
|
||||
initModuleArg(&instance->config.openCL);
|
||||
initModuleArg(&instance->config.users);
|
||||
@@ -156,10 +157,7 @@ static void defaultConfig(FFinstance* instance)
|
||||
instance->config.titleFQDN = false;
|
||||
|
||||
ffStrbufInitA(&instance->config.diskFolders, 0);
|
||||
instance->config.diskShowRemovable = true;
|
||||
instance->config.diskShowHidden = false;
|
||||
instance->config.diskShowUnknown = false;
|
||||
instance->config.diskShowSubvolumes = false;
|
||||
instance->config.diskShowTypes = FF_DISK_TYPE_REGULAR_BIT | FF_DISK_TYPE_EXTERNAL_BIT;
|
||||
|
||||
instance->config.displayCompactType = FF_DISPLAY_COMPACT_TYPE_NONE;
|
||||
instance->config.displayDetectName = false;
|
||||
@@ -173,12 +171,8 @@ static void defaultConfig(FFinstance* instance)
|
||||
|
||||
ffStrbufInitA(&instance->config.separatorString, 0);
|
||||
|
||||
instance->config.localIpShowIpV4 = true;
|
||||
instance->config.localIpShowIpV6 = false;
|
||||
instance->config.localIpShowLoop = false;
|
||||
instance->config.localIpV6First = false;
|
||||
instance->config.localIpShowType = FF_LOCALIP_TYPE_IPV4_BIT;
|
||||
ffStrbufInit(&instance->config.localIpNamePrefix);
|
||||
instance->config.localIpCompactType = FF_LOCALIP_COMPACT_TYPE_NONE;
|
||||
|
||||
instance->config.publicIpTimeout = 0;
|
||||
ffStrbufInit(&instance->config.publicIpUrl);
|
||||
@@ -343,6 +337,7 @@ static void destroyConfig(FFinstance* instance)
|
||||
destroyModuleArg(&instance->config.host);
|
||||
destroyModuleArg(&instance->config.bios);
|
||||
destroyModuleArg(&instance->config.board);
|
||||
destroyModuleArg(&instance->config.chassis);
|
||||
destroyModuleArg(&instance->config.kernel);
|
||||
destroyModuleArg(&instance->config.uptime);
|
||||
destroyModuleArg(&instance->config.processes);
|
||||
@@ -369,6 +364,7 @@ static void destroyConfig(FFinstance* instance)
|
||||
destroyModuleArg(&instance->config.locale);
|
||||
destroyModuleArg(&instance->config.localIP);
|
||||
destroyModuleArg(&instance->config.publicIP);
|
||||
destroyModuleArg(&instance->config.wallpaper);
|
||||
destroyModuleArg(&instance->config.weather);
|
||||
destroyModuleArg(&instance->config.wifi);
|
||||
destroyModuleArg(&instance->config.player);
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
#ifndef FF_INCLUDED_parsing_h
|
||||
#define FF_INCLUDED_parsing_h
|
||||
|
||||
#include "fastfetch.h"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
typedef struct FFVersion
|
||||
|
||||
@@ -166,10 +166,10 @@ bool ffParsePropFileListValues(const FFlist* list, const char* relativeFile, uin
|
||||
FFstrbuf baseDir;
|
||||
ffStrbufInitA(&baseDir, 64);
|
||||
|
||||
for(uint32_t i = 0; i < list->length; i++)
|
||||
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.
|
||||
ffStrbufSet(&baseDir, ffListGet(list, i));
|
||||
ffStrbufSet(&baseDir, dirPrefix);
|
||||
ffStrbufAppendS(&baseDir, relativeFile);
|
||||
|
||||
if(ffParsePropFileValues(baseDir.chars, numQueries, queries))
|
||||
|
||||
+60
-8
@@ -57,23 +57,31 @@ typedef enum FFInitState
|
||||
|
||||
typedef struct GVariantGetters
|
||||
{
|
||||
FF_LIBRARY_SYMBOL(g_variant_get_string)
|
||||
FF_LIBRARY_SYMBOL(g_variant_dup_string)
|
||||
FF_LIBRARY_SYMBOL(g_variant_get_boolean)
|
||||
FF_LIBRARY_SYMBOL(g_variant_get_int32)
|
||||
FF_LIBRARY_SYMBOL(g_variant_unref)
|
||||
} GVariantGetters;
|
||||
|
||||
static FFvariant getGVariantValue(GVariant* variant, FFvarianttype type, const GVariantGetters* variantGetters)
|
||||
{
|
||||
FFvariant result;
|
||||
|
||||
if(variant == NULL)
|
||||
return FF_VARIANT_NULL;
|
||||
result = FF_VARIANT_NULL;
|
||||
else if(type == FF_VARIANT_TYPE_STRING)
|
||||
return (FFvariant) {.strValue = variantGetters->ffg_variant_get_string(variant, NULL)};
|
||||
result = (FFvariant) {.strValue = variantGetters->ffg_variant_dup_string(variant, NULL)}; // Dup string, so that variant itself can be freed
|
||||
else if(type == FF_VARIANT_TYPE_BOOL)
|
||||
return (FFvariant) {.boolValue = (bool) variantGetters->ffg_variant_get_boolean(variant), .boolValueSet = true};
|
||||
result = (FFvariant) {.boolValue = (bool) variantGetters->ffg_variant_get_boolean(variant), .boolValueSet = true};
|
||||
else if(type == FF_VARIANT_TYPE_INT)
|
||||
return (FFvariant) {.intValue = variantGetters->ffg_variant_get_int32(variant)};
|
||||
result = (FFvariant) {.intValue = variantGetters->ffg_variant_get_int32(variant)};
|
||||
else
|
||||
return FF_VARIANT_NULL;
|
||||
result = FF_VARIANT_NULL;
|
||||
|
||||
if(variant)
|
||||
variantGetters->ffg_variant_unref(variant);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
typedef struct GSettingsData
|
||||
@@ -102,9 +110,10 @@ static const GSettingsData* getGSettingsData(const FFinstance* instance)
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(g_settings_schema_source_get_default)
|
||||
|
||||
#define data data.variantGetters
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_get_string)
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_dup_string)
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_get_boolean)
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_get_int32)
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_unref);
|
||||
#undef data
|
||||
|
||||
data.schemaSource = data.ffg_settings_schema_source_get_default();
|
||||
@@ -169,9 +178,10 @@ static const DConfData* getDConfData(const FFinstance* instance)
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(dconf_client_new)
|
||||
|
||||
#define data data.variantGetters
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_get_string)
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_dup_string)
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_get_boolean)
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_get_int32)
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(g_variant_unref)
|
||||
#undef data
|
||||
|
||||
data.client = data.ffdconf_client_new();
|
||||
@@ -288,6 +298,7 @@ typedef struct SQLiteData
|
||||
FF_LIBRARY_SYMBOL(sqlite3_step)
|
||||
FF_LIBRARY_SYMBOL(sqlite3_data_count)
|
||||
FF_LIBRARY_SYMBOL(sqlite3_column_int)
|
||||
FF_LIBRARY_SYMBOL(sqlite3_column_text)
|
||||
FF_LIBRARY_SYMBOL(sqlite3_finalize)
|
||||
FF_LIBRARY_SYMBOL(sqlite3_close)
|
||||
} SQLiteData;
|
||||
@@ -301,6 +312,7 @@ static const SQLiteData* getSQLiteData(const FFinstance* instance)
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(sqlite3_step)
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(sqlite3_data_count)
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(sqlite3_column_int)
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(sqlite3_column_text)
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(sqlite3_finalize)
|
||||
FF_LIBRARY_DATA_LOAD_SYMBOL(sqlite3_close)
|
||||
|
||||
@@ -341,12 +353,52 @@ int ffSettingsGetSQLite3Int(const FFinstance* instance, const char* dbPath, cons
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool ffSettingsGetSQLite3String(const FFinstance* instance, const char* dbPath, const char* query, FFstrbuf* result)
|
||||
{
|
||||
if(!ffPathExists(dbPath, FF_PATHTYPE_FILE))
|
||||
return false;
|
||||
|
||||
const SQLiteData* data = getSQLiteData(instance);
|
||||
if(data == NULL)
|
||||
return false;
|
||||
|
||||
sqlite3* db;
|
||||
if(data->ffsqlite3_open_v2(dbPath, &db, SQLITE_OPEN_READONLY, NULL) != SQLITE_OK)
|
||||
return false;
|
||||
|
||||
sqlite3_stmt* stmt;
|
||||
if(data->ffsqlite3_prepare_v2(db, query, (int) strlen(query), &stmt, NULL) != SQLITE_OK)
|
||||
{
|
||||
data->ffsqlite3_close(db);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(data->ffsqlite3_step(stmt) != SQLITE_ROW || data->ffsqlite3_data_count(stmt) < 1)
|
||||
{
|
||||
data->ffsqlite3_finalize(stmt);
|
||||
data->ffsqlite3_close(db);
|
||||
return false;
|
||||
}
|
||||
|
||||
ffStrbufSetS(result, (const char *) data->ffsqlite3_column_text(stmt, 0));
|
||||
|
||||
data->ffsqlite3_finalize(stmt);
|
||||
data->ffsqlite3_close(db);
|
||||
|
||||
return true;
|
||||
}
|
||||
#else //FF_HAVE_SQLITE3
|
||||
int ffSettingsGetSQLite3Int(const FFinstance* instance, const char* dbPath, const char* query)
|
||||
{
|
||||
FF_UNUSED(instance, dbPath, query)
|
||||
return 0;
|
||||
}
|
||||
bool ffSettingsGetSQLite3String(const FFinstance* instance, const char* dbPath, const char* query, FFstrbuf* result)
|
||||
{
|
||||
FF_UNUSED(instance, dbPath, query, result)
|
||||
return false;
|
||||
}
|
||||
#endif //FF_HAVE_SQLITE3
|
||||
|
||||
#ifdef __ANDROID__
|
||||
|
||||
@@ -31,6 +31,7 @@ FFvariant ffSettingsGet(const FFinstance* instance, const char* dconfKey, const
|
||||
FFvariant ffSettingsGetXFConf(const FFinstance* instance, const char* channelName, const char* propertyName, FFvarianttype type);
|
||||
|
||||
int ffSettingsGetSQLite3Int(const FFinstance* instance, const char* dbPath, const char* query);
|
||||
bool ffSettingsGetSQLite3String(const FFinstance* instance, const char* dbPath, const char* query, FFstrbuf* result);
|
||||
|
||||
#ifdef __ANDROID__
|
||||
void ffSettingsGetAndroidProperty(const char* propName, FFstrbuf* result);
|
||||
|
||||
@@ -168,13 +168,13 @@
|
||||
# Sets the URL of public IP detection server to be used.
|
||||
# Only HTTP protocol is supported, and the value should not contain "http://" prefix.
|
||||
# Default is "ipinfo.io/ip".
|
||||
#--public-ip-url "ipinfo.io/ip"
|
||||
#--publicip-url "ipinfo.io/ip"
|
||||
|
||||
# Public IP timeout option:
|
||||
# Sets the time to wait for the public ip server to respond.
|
||||
# Must be a positive integer.
|
||||
# Default is 0 (disabled).
|
||||
#--public-ip-timeout 0
|
||||
#--publicip-timeout 0
|
||||
|
||||
# Weather output format option:
|
||||
# Sets the weather format to be used. It must be URI encoded.
|
||||
@@ -321,8 +321,8 @@
|
||||
#--battery-key Battery {1}
|
||||
#--poweradapter-key Power Adapter {1}
|
||||
#--locale-key Locale
|
||||
#--local-ip-key Local IP ({1})
|
||||
#--public-ip-key Public IP
|
||||
#--localip-key Local IP ({1})
|
||||
#--publicip-key Public IP
|
||||
#--wifi-key Wifi
|
||||
#--weather-key Weather
|
||||
#--player-key Media Player
|
||||
@@ -335,6 +335,7 @@
|
||||
#--bluetooth-key Bluetooth
|
||||
#--sound-key Sound
|
||||
#--gamepad-key Gamepad
|
||||
#--wallpaper-key Wallpaper
|
||||
|
||||
# Format options:
|
||||
# Sets the format string for module values.
|
||||
@@ -369,8 +370,8 @@
|
||||
#--battery-format
|
||||
#--poweradapter-format
|
||||
#--locale-format
|
||||
#--local-ip-format
|
||||
#--public-ip-format
|
||||
#--localip-format
|
||||
#--publicip-format
|
||||
#--weather-format
|
||||
#--player-format
|
||||
#--media-format
|
||||
@@ -382,6 +383,7 @@
|
||||
#--bluetooth-format
|
||||
#--sound-format
|
||||
#--gamepad-format
|
||||
#--wallpaper-format
|
||||
|
||||
# Error options:
|
||||
# Sets the format string to use if an error occured
|
||||
@@ -416,8 +418,8 @@
|
||||
#--battery-error
|
||||
#--poweradapter-error
|
||||
#--locale-error
|
||||
#--local-ip-error
|
||||
#--public-ip-error
|
||||
#--localip-error
|
||||
#--publicip-error
|
||||
#--weather-error
|
||||
#--player-error
|
||||
#--media-error
|
||||
@@ -429,6 +431,7 @@
|
||||
#--bluetooth-error
|
||||
#--sound-error
|
||||
#--gamepad-error
|
||||
#--wallpaper-error
|
||||
|
||||
# Library options:
|
||||
# Sets an user specific path to a library to load.
|
||||
|
||||
+5
-4
@@ -108,6 +108,7 @@ Module specific options:
|
||||
--shell-version <?value>: Set if shell version should be detected and printed
|
||||
--terminal-version <?value>: Set if terminal version should be detected and printed
|
||||
--disk-folders <folders>: A colon (semicolon on Windows) separated list of folder paths for the disk output. Default is "/:/home" ("C:\\;D:\\ ..." on Windows)
|
||||
--disk-show-regular <?value>: Set if regular volume should be printed. Default is true
|
||||
--disk-show-removable <?value>: Set if removable volume should be printed. Default is true
|
||||
--disk-show-hidden <?value>: Set if hidden volumes should be printed. Default is false
|
||||
--disk-show-subvolumes <?value>: Set if subvolumes should be printed. Default is false
|
||||
@@ -126,12 +127,12 @@ Module specific options:
|
||||
--battery-temp <?value>: Detect and display Battery temperature if supported. Default is false
|
||||
--localip-show-ipv4 <?value>: Show IPv4 addresses in local ip module. Default is true
|
||||
--localip-show-ipv6 <?value>: Show IPv6 addresses in local ip module. Default is false
|
||||
--localip-show-mac <?value>: Show mac addresses in local ip module. Default is false
|
||||
--localip-show-loop <?value>: Show loop back addresses (127.0.0.1) in local ip module. Default is false
|
||||
--localip-name-prefix <str>: Show IPs with given name prefix only. Default is empty
|
||||
--localip-compact-type <str>: Show IPs in one line. Should be either none, oneline, multiline. Default is none
|
||||
--localip-v6first <?value>: Set if ipv6 should be printed first. Default is false
|
||||
--public-ip-timeout: Time in milliseconds to wait for the public ip server to respond. Default is disabled (0)
|
||||
--public-ip-url: The URL of public IP detection server to be used.
|
||||
--localip-compact <?value>: Show all IPs in one line. Default is false
|
||||
--publicip-timeout: Time in milliseconds to wait for the public ip server to respond. Default is disabled (0)
|
||||
--publicip-url: The URL of public IP detection server to be used.
|
||||
--weather-timeout: Time in milliseconds to wait for the weather server to respond. Default is disabled (0)
|
||||
--weather-output-format: The output weather format to be used. It must be URI encoded.
|
||||
--player-name: The name of the player to use
|
||||
|
||||
@@ -9,18 +9,15 @@
|
||||
#include <devguid.h>
|
||||
#include <winternl.h>
|
||||
|
||||
#ifdef FF_USE_WIN_NTAPI
|
||||
NTSYSCALLAPI
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
NtPowerInformation(
|
||||
IN POWER_INFORMATION_LEVEL InformationLevel,
|
||||
IN PVOID InputBuffer OPTIONAL,
|
||||
IN ULONG InputBufferLength,
|
||||
OUT PVOID OutputBuffer OPTIONAL,
|
||||
IN ULONG OutputBufferLength);
|
||||
#define CallNtPowerInformation NtPowerInformation
|
||||
#endif
|
||||
NTSYSCALLAPI
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
NtPowerInformation(
|
||||
IN POWER_INFORMATION_LEVEL InformationLevel,
|
||||
IN PVOID InputBuffer OPTIONAL,
|
||||
IN ULONG InputBufferLength,
|
||||
OUT PVOID OutputBuffer OPTIONAL,
|
||||
IN ULONG OutputBufferLength);
|
||||
|
||||
static inline void wrapCloseHandle(HANDLE* handle)
|
||||
{
|
||||
@@ -147,7 +144,7 @@ const char* ffDetectBatteryImpl(FFinstance* instance, FFlist* results)
|
||||
else
|
||||
{
|
||||
SYSTEM_BATTERY_STATE info;
|
||||
if (NT_SUCCESS(CallNtPowerInformation(SystemBatteryState, NULL, 0, &info, sizeof(info))) && info.BatteryPresent)
|
||||
if (NT_SUCCESS(NtPowerInformation(SystemBatteryState, NULL, 0, &info, sizeof(info))) && info.BatteryPresent)
|
||||
{
|
||||
BatteryResult* battery = (BatteryResult*)ffListAdd(results);
|
||||
ffStrbufInit(&battery->modelName);
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "common/io/io.h"
|
||||
|
||||
#include <dirent.h>
|
||||
#include <ctype.h>
|
||||
|
||||
const char* ffDetectBrightness(FF_MAYBE_UNUSED FFlist* result)
|
||||
{
|
||||
@@ -12,13 +13,13 @@ const char* ffDetectBrightness(FF_MAYBE_UNUSED FFlist* result)
|
||||
if(dirp == NULL)
|
||||
return "Failed to open `/sys/class/backlight/`";
|
||||
|
||||
FFstrbuf backlightDir;
|
||||
FF_STRBUF_AUTO_DESTROY backlightDir;
|
||||
ffStrbufInitA(&backlightDir, 64);
|
||||
ffStrbufAppendS(&backlightDir, backlightDirPath);
|
||||
|
||||
uint32_t backlightDirLength = backlightDir.length;
|
||||
|
||||
FFstrbuf buffer;
|
||||
FF_STRBUF_AUTO_DESTROY buffer;
|
||||
ffStrbufInit(&buffer);
|
||||
|
||||
struct dirent* entry;
|
||||
@@ -38,18 +39,26 @@ const char* ffDetectBrightness(FF_MAYBE_UNUSED FFlist* result)
|
||||
if(ffReadFileBuffer(backlightDir.chars, &buffer))
|
||||
{
|
||||
FFBrightnessResult* display = (FFBrightnessResult*) ffListAdd(result);
|
||||
ffStrbufInitS(&display->name, entry->d_name);
|
||||
ffStrbufSubstrBeforeLastC(&backlightDir, '/');
|
||||
ffStrbufAppendS(&backlightDir, "/device");
|
||||
ffStrbufInitA(&display->name, PATH_MAX + 1);
|
||||
if(realpath(backlightDir.chars, display->name.chars))
|
||||
{
|
||||
ffStrbufRecalculateLength(&display->name);
|
||||
ffStrbufSubstrAfterLastC(&display->name, '/');
|
||||
if(ffStrbufStartsWithS(&display->name, "card") && isdigit(display->name.chars[4]))
|
||||
ffStrbufSubstrAfterFirstC(&display->name, '-');
|
||||
}
|
||||
else
|
||||
ffStrbufInitS(&display->name, entry->d_name);
|
||||
double maxBrightness = ffStrbufToDouble(&buffer);
|
||||
display->value = (float) (actualBrightness * 100 / maxBrightness);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
ffStrbufSubstrBefore(&backlightDir, backlightDirLength);
|
||||
}
|
||||
|
||||
closedir(dirp);
|
||||
ffStrbufDestroy(&backlightDir);
|
||||
ffStrbufDestroy(&buffer);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
#include "fastfetch.h"
|
||||
#include "cpuUsage.h"
|
||||
|
||||
#ifdef FF_USE_WIN_NTAPI
|
||||
|
||||
#include "util/mallocHelper.h"
|
||||
|
||||
#include <ntstatus.h>
|
||||
@@ -37,26 +35,3 @@ const char* ffGetCpuUsageInfo(uint64_t* inUseAll, uint64_t* totalAll)
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#include <processthreadsapi.h>
|
||||
|
||||
static inline uint64_t fileTimeToUint64(const FILETIME* ft) {
|
||||
return (((uint64_t)ft->dwHighDateTime) << 32) | ((uint64_t)ft->dwLowDateTime);
|
||||
}
|
||||
|
||||
const char* ffGetCpuUsageInfo(uint64_t* inUseAll, uint64_t* totalAll)
|
||||
{
|
||||
FILETIME idleTime, kernelTime, userTime;
|
||||
if(!GetSystemTimes(&idleTime, &kernelTime, &userTime))
|
||||
return "GetSystemTimes() failed";
|
||||
|
||||
// https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getsystemtimes
|
||||
// `kernelTime` also includes the amount of time the system has been idle.
|
||||
*totalAll = fileTimeToUint64(&userTime) + fileTimeToUint64(&kernelTime);
|
||||
*inUseAll = *totalAll - fileTimeToUint64(&idleTime);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -18,11 +18,18 @@ const FFDiskResult* ffDetectDisks()
|
||||
|
||||
if(result.disks.length == 0 && result.error.length == 0)
|
||||
ffStrbufAppendS(&result.error, "No disks found");
|
||||
|
||||
//We need to sort the disks, so that we can detect, which disk a path resides on
|
||||
// For example for /boot/efi/bootmgr we need to check /boot/efi before /boot
|
||||
//Note that we sort alphabetically here for a better ordering when printing the list,
|
||||
// so the check must be done in reverse order
|
||||
ffListSort(&result.disks, compareDisks);
|
||||
else
|
||||
{
|
||||
//We need to sort the disks, so that we can detect, which disk a path resides on
|
||||
// For example for /boot/efi/bootmgr we need to check /boot/efi before /boot
|
||||
//Note that we sort alphabetically here for a better ordering when printing the list,
|
||||
// so the check must be done in reverse order
|
||||
ffListSort(&result.disks, compareDisks);
|
||||
FF_LIST_FOR_EACH(FFDisk, disk, result.disks)
|
||||
{
|
||||
if(disk->bytesTotal == 0)
|
||||
disk->type |= FF_DISK_TYPE_UNKNOWN_BIT;
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -5,14 +5,6 @@
|
||||
|
||||
#include "fastfetch.h"
|
||||
|
||||
typedef enum FFDiskType
|
||||
{
|
||||
FF_DISK_TYPE_REGULAR,
|
||||
FF_DISK_TYPE_HIDDEN,
|
||||
FF_DISK_TYPE_EXTERNAL,
|
||||
FF_DISK_TYPE_SUBVOLUME
|
||||
} FFDiskType;
|
||||
|
||||
typedef struct FFDisk
|
||||
{
|
||||
FFstrbuf mountpoint;
|
||||
|
||||
@@ -7,11 +7,11 @@ void detectFsInfo(struct statfs* fs, FFDisk* disk)
|
||||
{
|
||||
// FreeBSD doesn't support these flags
|
||||
if(fs->f_flags & MNT_DONTBROWSE)
|
||||
disk->type = FF_DISK_TYPE_HIDDEN;
|
||||
disk->type = FF_DISK_TYPE_HIDDEN_BIT;
|
||||
else if(fs->f_flags & MNT_REMOVABLE)
|
||||
disk->type = FF_DISK_TYPE_EXTERNAL;
|
||||
disk->type = FF_DISK_TYPE_EXTERNAL_BIT;
|
||||
else
|
||||
disk->type = FF_DISK_TYPE_REGULAR;
|
||||
disk->type = FF_DISK_TYPE_REGULAR_BIT;
|
||||
|
||||
ffStrbufInitS(&disk->name, [NSFileManager.defaultManager displayNameAtPath:@(fs->f_mntonname)].UTF8String);
|
||||
}
|
||||
|
||||
@@ -13,11 +13,11 @@ static void detectFsInfo(struct statfs* fs, FFDisk* disk)
|
||||
ffStrbufStartsWithS(&disk->mountpoint, "/proc") ||
|
||||
ffStrbufStartsWithS(&disk->mountpoint, "/zroot")
|
||||
)
|
||||
disk->type = FF_DISK_TYPE_HIDDEN;
|
||||
disk->type = FF_DISK_TYPE_HIDDEN_BIT;
|
||||
else if((fs->f_flags & MNT_NOSUID) || !(fs->f_flags & MNT_LOCAL))
|
||||
disk->type = FF_DISK_TYPE_EXTERNAL;
|
||||
disk->type = FF_DISK_TYPE_EXTERNAL_BIT;
|
||||
else
|
||||
disk->type = FF_DISK_TYPE_REGULAR;
|
||||
disk->type = FF_DISK_TYPE_REGULAR_BIT;
|
||||
|
||||
ffStrbufInit(&disk->name);
|
||||
}
|
||||
|
||||
@@ -17,17 +17,6 @@
|
||||
|
||||
static bool isPhysicalDevice(FFstrbuf* device)
|
||||
{
|
||||
struct stat deviceStat;
|
||||
if(stat(device->chars, &deviceStat) != 0)
|
||||
return false;
|
||||
|
||||
//Ignore all devices that are not block devices
|
||||
if(!S_ISBLK(deviceStat.st_mode))
|
||||
return false;
|
||||
|
||||
//Ignore all devices that are not physical devices
|
||||
|
||||
|
||||
//DrvFs is a filesystem plugin to WSL that was designed to support interop between WSL and the Windows filesystem.
|
||||
if(ffStrbufEqualS(device, "drvfs"))
|
||||
return true;
|
||||
@@ -36,6 +25,14 @@ static bool isPhysicalDevice(FFstrbuf* device)
|
||||
if(ffStrbufStartsWithS(device, "rpool/"))
|
||||
return true;
|
||||
|
||||
struct stat deviceStat;
|
||||
if(stat(device->chars, &deviceStat) != 0)
|
||||
return false;
|
||||
|
||||
//Ignore all devices that are not block devices
|
||||
if(!S_ISBLK(deviceStat.st_mode))
|
||||
return false;
|
||||
|
||||
//Pseudo filesystems don't have a device in /dev
|
||||
if(!ffStrbufStartsWithS(device, "/dev/"))
|
||||
return false;
|
||||
@@ -115,7 +112,7 @@ static void detectName(FFDisk* disk, const FFstrbuf* device)
|
||||
if(stat(device->chars, &deviceStat) != 0)
|
||||
return;
|
||||
|
||||
FFstrbuf basePath;
|
||||
FF_STRBUF_AUTO_DESTROY basePath;
|
||||
ffStrbufInit(&basePath);
|
||||
|
||||
//Try partlabel first
|
||||
@@ -132,8 +129,6 @@ static void detectName(FFDisk* disk, const FFstrbuf* device)
|
||||
//Use the mountpoint as a last resort
|
||||
if(disk->name.length == 0)
|
||||
ffStrbufAppend(&disk->name, &disk->mountpoint);
|
||||
|
||||
ffStrbufDestroy(&basePath);
|
||||
}
|
||||
|
||||
#ifdef __ANDROID__
|
||||
@@ -141,11 +136,11 @@ static void detectName(FFDisk* disk, const FFstrbuf* device)
|
||||
static void detectType(FF_MAYBE_UNUSED const FFlist* devices, FFDisk* currentDisk, FF_MAYBE_UNUSED const char* options)
|
||||
{
|
||||
if(ffStrbufEqualS(¤tDisk->mountpoint, "/") || ffStrbufEqualS(¤tDisk->mountpoint, "/storage/emulated"))
|
||||
currentDisk->type = FF_DISK_TYPE_REGULAR;
|
||||
currentDisk->type = FF_DISK_TYPE_REGULAR_BIT;
|
||||
else if(ffStrbufStartsWithS(¤tDisk->mountpoint, "/mnt/media_rw/"))
|
||||
currentDisk->type = FF_DISK_TYPE_EXTERNAL;
|
||||
currentDisk->type = FF_DISK_TYPE_EXTERNAL_BIT;
|
||||
else
|
||||
currentDisk->type = FF_DISK_TYPE_HIDDEN;
|
||||
currentDisk->type = FF_DISK_TYPE_HIDDEN_BIT;
|
||||
}
|
||||
|
||||
#else
|
||||
@@ -174,13 +169,13 @@ static bool isSubvolume(const FFlist* devices)
|
||||
static void detectType(const FFlist* devices, FFDisk* currentDisk, const char* options)
|
||||
{
|
||||
if(isSubvolume(devices))
|
||||
currentDisk->type = FF_DISK_TYPE_SUBVOLUME;
|
||||
currentDisk->type = FF_DISK_TYPE_SUBVOLUME_BIT;
|
||||
else if(strstr(options, "nosuid") != NULL || strstr(options, "nodev") != NULL)
|
||||
currentDisk->type = FF_DISK_TYPE_EXTERNAL;
|
||||
currentDisk->type = FF_DISK_TYPE_EXTERNAL_BIT;
|
||||
else if(ffStrbufStartsWithS(¤tDisk->mountpoint, "/boot") || ffStrbufStartsWithS(¤tDisk->mountpoint, "/efi"))
|
||||
currentDisk->type = FF_DISK_TYPE_HIDDEN;
|
||||
currentDisk->type = FF_DISK_TYPE_HIDDEN_BIT;
|
||||
else
|
||||
currentDisk->type = FF_DISK_TYPE_REGULAR;
|
||||
currentDisk->type = FF_DISK_TYPE_REGULAR_BIT;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -207,7 +202,7 @@ void ffDetectDisksImpl(FFDiskResult* disks)
|
||||
return;
|
||||
}
|
||||
|
||||
FFlist devices;
|
||||
FF_LIST_AUTO_DESTROY devices;
|
||||
ffListInit(&devices, sizeof(FFstrbuf));
|
||||
|
||||
char* line = NULL;
|
||||
@@ -257,7 +252,6 @@ void ffDetectDisksImpl(FFDiskResult* disks)
|
||||
|
||||
FF_LIST_FOR_EACH(FFstrbuf, device, devices)
|
||||
ffStrbufDestroy(device);
|
||||
ffListDestroy(&devices);
|
||||
|
||||
fclose(mountsFile);
|
||||
}
|
||||
|
||||
@@ -1,35 +1,31 @@
|
||||
#include "disk.h"
|
||||
#include "util/windows/unicode.h"
|
||||
|
||||
#include <windows.h>
|
||||
#include <assert.h>
|
||||
|
||||
void ffDetectDisksImpl(FFDiskResult* disks)
|
||||
{
|
||||
uint32_t length = GetLogicalDriveStringsA(0, NULL);
|
||||
if(length == 0)
|
||||
{
|
||||
ffStrbufAppendS(&disks->error, "GetLogicalDriveStringsA failed");
|
||||
return;
|
||||
}
|
||||
|
||||
char* buf = malloc(length + 1);
|
||||
GetLogicalDriveStringsA(length, buf);
|
||||
wchar_t buf[MAX_PATH + 1];
|
||||
uint32_t length = GetLogicalDriveStringsW(sizeof(buf) / sizeof(*buf), buf);
|
||||
assert(length < sizeof(buf) / sizeof(*buf));
|
||||
|
||||
for(uint32_t i = 0; i < length; i++)
|
||||
{
|
||||
const char* mountpoint = buf + i;
|
||||
const wchar_t* mountpoint = buf + i;
|
||||
|
||||
UINT driveType = GetDriveTypeA(mountpoint);
|
||||
UINT driveType = GetDriveTypeW(mountpoint);
|
||||
if(driveType == DRIVE_NO_ROOT_DIR)
|
||||
{
|
||||
i += (uint32_t)strlen(mountpoint);
|
||||
i += (uint32_t)wcslen(mountpoint);
|
||||
continue;
|
||||
}
|
||||
|
||||
FFDisk* disk = ffListAdd(&disks->disks);
|
||||
ffStrbufInitS(&disk->mountpoint, mountpoint);
|
||||
ffStrbufInitWS(&disk->mountpoint, mountpoint);
|
||||
|
||||
uint64_t bytesFree;
|
||||
if(!GetDiskFreeSpaceExA(mountpoint, NULL, (PULARGE_INTEGER)&disk->bytesTotal, (PULARGE_INTEGER)&bytesFree))
|
||||
if(!GetDiskFreeSpaceExW(mountpoint, NULL, (PULARGE_INTEGER)&disk->bytesTotal, (PULARGE_INTEGER)&bytesFree))
|
||||
{
|
||||
disk->bytesTotal = 0;
|
||||
bytesFree = 0;
|
||||
@@ -37,26 +33,33 @@ void ffDetectDisksImpl(FFDiskResult* disks)
|
||||
disk->bytesUsed = disk->bytesTotal - bytesFree;
|
||||
|
||||
if(driveType == DRIVE_REMOVABLE || driveType == DRIVE_REMOTE || driveType == DRIVE_CDROM)
|
||||
disk->type = FF_DISK_TYPE_EXTERNAL;
|
||||
disk->type = FF_DISK_TYPE_EXTERNAL_BIT;
|
||||
else if(driveType == DRIVE_FIXED)
|
||||
disk->type = FF_DISK_TYPE_REGULAR;
|
||||
disk->type = FF_DISK_TYPE_REGULAR_BIT;
|
||||
else
|
||||
disk->type = FF_DISK_TYPE_HIDDEN;
|
||||
disk->type = FF_DISK_TYPE_HIDDEN_BIT;
|
||||
|
||||
ffStrbufInit(&disk->filesystem);
|
||||
ffStrbufInit(&disk->name);
|
||||
wchar_t diskName[MAX_PATH + 1], diskFileSystem[MAX_PATH + 1];
|
||||
|
||||
ffStrbufInitA(&disk->filesystem, MAX_PATH + 1);
|
||||
ffStrbufInitA(&disk->name, MAX_PATH + 1);
|
||||
//https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getvolumeinformationa#remarks
|
||||
UINT errorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
|
||||
GetVolumeInformationA(mountpoint,
|
||||
disk->name.chars, disk->name.allocated, //Volume name
|
||||
|
||||
BOOL result = GetVolumeInformationW(mountpoint,
|
||||
diskName, sizeof(diskName) / sizeof(*diskName), //Volume name
|
||||
NULL, //Serial number
|
||||
NULL, //Max component length
|
||||
NULL, //File system flags
|
||||
disk->filesystem.chars, disk->filesystem.allocated
|
||||
diskFileSystem, sizeof(diskFileSystem) / sizeof(*diskFileSystem)
|
||||
);
|
||||
SetErrorMode(errorMode);
|
||||
ffStrbufRecalculateLength(&disk->name);
|
||||
ffStrbufRecalculateLength(&disk->filesystem);
|
||||
|
||||
if(result)
|
||||
{
|
||||
ffStrbufSetWS(&disk->filesystem, diskFileSystem);
|
||||
ffStrbufSetWS(&disk->name, diskName);
|
||||
}
|
||||
|
||||
//TODO: implement
|
||||
disk->filesUsed = 0;
|
||||
@@ -64,6 +67,4 @@ void ffDetectDisksImpl(FFDiskResult* disks)
|
||||
|
||||
i += disk->mountpoint.length;
|
||||
}
|
||||
|
||||
free(buf);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "displayserver.h"
|
||||
#include "common/sysctl.h"
|
||||
#include "util/apple/cf_helpers.h"
|
||||
#include "util/mallocHelper.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
@@ -73,7 +74,7 @@ static void detectWMPlugin(FFstrbuf* name)
|
||||
u_int requestLength = sizeof(request) / sizeof(*request);
|
||||
|
||||
size_t length = 0;
|
||||
struct kinfo_proc* processes = ffSysctlGetData(request, requestLength, &length);
|
||||
FF_AUTO_FREE struct kinfo_proc* processes = ffSysctlGetData(request, requestLength, &length);
|
||||
if(processes == NULL)
|
||||
return;
|
||||
|
||||
@@ -94,8 +95,6 @@ static void detectWMPlugin(FFstrbuf* name)
|
||||
name->chars[0] = (char) toupper(name->chars[0]);
|
||||
break;
|
||||
}
|
||||
|
||||
free(processes);
|
||||
}
|
||||
|
||||
void ffConnectDisplayServerImpl(FFDisplayServerResult* ds, const FFinstance* instance)
|
||||
@@ -109,6 +108,7 @@ void ffConnectDisplayServerImpl(FFDisplayServerResult* ds, const FFinstance* ins
|
||||
if(instance->config.allowSlowOperations)
|
||||
{
|
||||
FF_STRBUF_AUTO_DESTROY name;
|
||||
ffStrbufInit(&name);
|
||||
detectWMPlugin(&name);
|
||||
if(name.length)
|
||||
ffStrbufAppendF(&ds->wmPrettyName, " (with %s)", name.chars);
|
||||
|
||||
@@ -5,27 +5,6 @@
|
||||
#include <dwmapi.h>
|
||||
#include <WinUser.h>
|
||||
|
||||
typedef struct
|
||||
{
|
||||
WCHAR* deviceName;
|
||||
uint32_t width;
|
||||
uint32_t height;
|
||||
} DataBundle;
|
||||
|
||||
|
||||
static CALLBACK WINBOOL enumMonitorProc(HMONITOR hMonitor, FF_MAYBE_UNUSED HDC hDC, FF_MAYBE_UNUSED LPRECT rc, LPARAM lparam)
|
||||
{
|
||||
DataBundle* data = (DataBundle*) lparam;
|
||||
MONITORINFOEXW mi = { .cbSize = sizeof(mi) };
|
||||
if(GetMonitorInfoW(hMonitor, (MONITORINFO *)&mi) && wcscmp(mi.szDevice, data->deviceName) == 0)
|
||||
{
|
||||
data->width = (uint32_t) (mi.rcMonitor.right - mi.rcMonitor.left);
|
||||
data->height = (uint32_t) (mi.rcMonitor.bottom - mi.rcMonitor.top);
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void detectDisplays(FFDisplayServerResult* ds, bool detectName)
|
||||
{
|
||||
DISPLAYCONFIG_PATH_INFO paths[128];
|
||||
@@ -45,8 +24,6 @@ static void detectDisplays(FFDisplayServerResult* ds, bool detectName)
|
||||
{
|
||||
DISPLAYCONFIG_PATH_INFO* path = &paths[i];
|
||||
|
||||
DataBundle data = {};
|
||||
|
||||
DISPLAYCONFIG_SOURCE_DEVICE_NAME sourceName = {
|
||||
.header = {
|
||||
.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME,
|
||||
@@ -55,10 +32,14 @@ static void detectDisplays(FFDisplayServerResult* ds, bool detectName)
|
||||
.id = path->sourceInfo.id,
|
||||
},
|
||||
};
|
||||
|
||||
uint32_t scaledWidth = 0, scaledHeight = 0;
|
||||
if (DisplayConfigGetDeviceInfo(&sourceName.header) == ERROR_SUCCESS)
|
||||
{
|
||||
data.deviceName = sourceName.viewGdiDeviceName;
|
||||
EnumDisplayMonitors(NULL, NULL, enumMonitorProc, (LPARAM) &data);
|
||||
HDC hdc = CreateICW(sourceName.viewGdiDeviceName, NULL, NULL, NULL);
|
||||
scaledWidth = (uint32_t) GetDeviceCaps(hdc, HORZRES);
|
||||
scaledHeight = (uint32_t) GetDeviceCaps(hdc, VERTRES);
|
||||
DeleteDC(hdc);
|
||||
}
|
||||
|
||||
FF_STRBUF_AUTO_DESTROY name;
|
||||
@@ -101,8 +82,8 @@ static void detectDisplays(FFDisplayServerResult* ds, bool detectName)
|
||||
width,
|
||||
height,
|
||||
path->targetInfo.refreshRate.Numerator / (double) path->targetInfo.refreshRate.Denominator,
|
||||
data.width,
|
||||
data.height,
|
||||
scaledWidth,
|
||||
scaledHeight,
|
||||
&name,
|
||||
path->targetInfo.outputTechnology == DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL ||
|
||||
path->targetInfo.outputTechnology == DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED ||
|
||||
|
||||
@@ -19,6 +19,7 @@ typedef struct WaylandData
|
||||
FF_LIBRARY_SYMBOL(wl_display_roundtrip)
|
||||
struct wl_display* display;
|
||||
const struct wl_interface* ffwl_output_interface;
|
||||
bool detectName;
|
||||
} WaylandData;
|
||||
|
||||
typedef struct WaylandDisplay
|
||||
@@ -27,6 +28,10 @@ typedef struct WaylandDisplay
|
||||
int32_t height;
|
||||
int32_t refreshRate;
|
||||
int32_t scale;
|
||||
enum wl_output_transform transform;
|
||||
FFDisplayType type;
|
||||
FFstrbuf name;
|
||||
bool detectName;
|
||||
} WaylandDisplay;
|
||||
|
||||
#ifndef __FreeBSD__
|
||||
@@ -57,10 +62,8 @@ static void stubListener(void* data, ...)
|
||||
(void) data;
|
||||
}
|
||||
|
||||
static void waylandOutputModeListener(void* data, struct wl_output* output, uint32_t flags, int32_t width, int32_t height, int32_t refreshRate)
|
||||
static void waylandOutputModeListener(void* data, FF_MAYBE_UNUSED struct wl_output* output, uint32_t flags, int32_t width, int32_t height, int32_t refreshRate)
|
||||
{
|
||||
FF_UNUSED(output);
|
||||
|
||||
if(!(flags & WL_OUTPUT_MODE_CURRENT))
|
||||
return;
|
||||
|
||||
@@ -70,16 +73,51 @@ static void waylandOutputModeListener(void* data, struct wl_output* output, uint
|
||||
display->refreshRate = refreshRate;
|
||||
}
|
||||
|
||||
#if WAYLAND_VERSION_MINOR >= 2
|
||||
static void waylandOutputScaleListener(void* data, struct wl_output* output, int32_t scale)
|
||||
#ifdef WL_OUTPUT_SCALE_SINCE_VERSION
|
||||
static void waylandOutputScaleListener(void* data, FF_MAYBE_UNUSED struct wl_output* output, int32_t scale)
|
||||
{
|
||||
FF_UNUSED(output);
|
||||
|
||||
WaylandDisplay* display = data;
|
||||
display->scale = scale;
|
||||
}
|
||||
#endif
|
||||
|
||||
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(display->detectName)
|
||||
{
|
||||
if(make && strcmp(make, "unknown") != 0)
|
||||
ffStrbufAppendS(&display->name, make);
|
||||
if(model && strcmp(model, "unknown") != 0)
|
||||
{
|
||||
if(display->name.length > 0)
|
||||
ffStrbufAppendC(&display->name, '-');
|
||||
ffStrbufAppendS(&display->name, model);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef WL_OUTPUT_NAME_SINCE_VERSION
|
||||
static void waylandOutputNameListener(void *data, FF_MAYBE_UNUSED struct wl_output *output, const char *name)
|
||||
{
|
||||
WaylandDisplay* display = data;
|
||||
if(strncmp(name, "eDP-", strlen("eDP-")) == 0)
|
||||
display->type = FF_DISPLAY_TYPE_BUILTIN;
|
||||
else if(strncmp(name, "HDMI-", strlen("HDMI-")) == 0 || strncmp(name, "DP-", strlen("DP-")) == 0)
|
||||
display->type = FF_DISPLAY_TYPE_EXTERNAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
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);
|
||||
@@ -87,25 +125,33 @@ static void waylandOutputHandler(WaylandData* wldata, struct wl_registry* regist
|
||||
return;
|
||||
|
||||
WaylandDisplay display = {
|
||||
.detectName = wldata->detectName,
|
||||
.width = 0,
|
||||
.height = 0,
|
||||
.refreshRate = 0,
|
||||
.scale = 1,
|
||||
.transform = WL_OUTPUT_TRANSFORM_NORMAL,
|
||||
.type = FF_DISPLAY_TYPE_UNKNOWN,
|
||||
};
|
||||
ffStrbufInit(&display.name);
|
||||
|
||||
struct wl_output_listener outputListener = {
|
||||
.mode = waylandOutputModeListener,
|
||||
.geometry = (void*) stubListener,
|
||||
.geometry = waylandOutputGeometryListener,
|
||||
|
||||
//https://lists.freedesktop.org/archives/wayland-devel/2013-July/010278.html
|
||||
#if WAYLAND_VERSION_MINOR >= 2
|
||||
#ifdef WL_OUTPUT_DONE_SINCE_VERSION
|
||||
.done = (void*) stubListener,
|
||||
#endif
|
||||
|
||||
#ifdef WL_OUTPUT_SCALE_SINCE_VERSION
|
||||
.scale = waylandOutputScaleListener,
|
||||
#endif
|
||||
|
||||
//https://lists.freedesktop.org/archives/wayland-devel/2021-December/042064.html
|
||||
#if WAYLAND_VERSION_MINOR >= 20
|
||||
.name = (void*) stubListener,
|
||||
#ifdef WL_OUTPUT_NAME_SINCE_VERSION
|
||||
.name = waylandOutputNameListener,
|
||||
#endif
|
||||
|
||||
#ifdef WL_OUTPUT_DESCRIPTION_SINCE_VERSION
|
||||
.description = (void*) stubListener,
|
||||
#endif
|
||||
};
|
||||
@@ -120,14 +166,29 @@ static void waylandOutputHandler(WaylandData* wldata, struct wl_registry* regist
|
||||
static FFThreadMutex mutex = FF_THREAD_MUTEX_INITIALIZER;
|
||||
ffThreadMutexLock(&mutex);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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),
|
||||
NULL,
|
||||
FF_DISPLAY_TYPE_UNKNOWN
|
||||
&display.name,
|
||||
display.type
|
||||
);
|
||||
|
||||
ffThreadMutexUnlock(&mutex);
|
||||
@@ -164,6 +225,8 @@ bool detectWayland(const FFinstance* instance, FFDisplayServerResult* result)
|
||||
if(data.display == NULL)
|
||||
return false;
|
||||
|
||||
data.detectName = instance->config.displayDetectName;
|
||||
|
||||
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);
|
||||
|
||||
@@ -141,6 +141,16 @@ static void getGnome(const FFinstance* instance, FFDisplayServerResult* result)
|
||||
ffStrbufSetS(&result->deProcessName, "gnome-shell");
|
||||
ffStrbufSetS(&result->dePrettyName, FF_DE_PRETTY_GNOME);
|
||||
ffParsePropFileData(instance, "gnome-shell/org.gnome.Extensions", "version :", &result->deVersion);
|
||||
|
||||
if (result->deVersion.length == 0)
|
||||
{
|
||||
if (ffProcessAppendStdOut(&result->deVersion, (char* const[]){
|
||||
"gnome-shell",
|
||||
"--version",
|
||||
NULL
|
||||
}) == NULL) // GNOME Shell 44.1
|
||||
ffStrbufSubstrAfterLastC(&result->deVersion, ' ');
|
||||
}
|
||||
}
|
||||
|
||||
static void getCinnamon(const FFinstance* instance, FFDisplayServerResult* result)
|
||||
|
||||
@@ -175,7 +175,7 @@ typedef struct XcbRandrData
|
||||
|
||||
static bool xcbRandrHandleModeInfo(XcbRandrData* data, xcb_randr_mode_info_t* modeInfo)
|
||||
{
|
||||
double refreshRate = modeInfo->dot_clock / (double) (modeInfo->htotal * modeInfo->vtotal);
|
||||
double refreshRate = (double) modeInfo->dot_clock / (double) (modeInfo->htotal * modeInfo->vtotal);
|
||||
|
||||
return ffdsAppendDisplay(
|
||||
data->result,
|
||||
|
||||
@@ -134,7 +134,7 @@ typedef struct XrandrData
|
||||
|
||||
static bool xrandrHandleModeInfo(XrandrData* data, XRRModeInfo* modeInfo)
|
||||
{
|
||||
double refreshRate = modeInfo->dotClock / (double) (modeInfo->hTotal * modeInfo->vTotal);
|
||||
double refreshRate = (double) modeInfo->dotClock / (double) (modeInfo->hTotal * modeInfo->vTotal);
|
||||
|
||||
return ffdsAppendDisplay(
|
||||
data->result,
|
||||
|
||||
@@ -9,6 +9,7 @@ static void detectFont(const FFinstance* instance, FFFontResult* font)
|
||||
|
||||
for(uint32_t i = 0; i < FF_DETECT_FONT_NUM_FONTS; ++i)
|
||||
ffStrbufInit(&font->fonts[i]);
|
||||
ffStrbufInit(&font->display);
|
||||
|
||||
ffDetectFontImpl(instance, font);
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ typedef struct FFFontResult
|
||||
* Other: Unset, Unset, Unset, Unset
|
||||
*/
|
||||
FFstrbuf fonts[FF_DETECT_FONT_NUM_FONTS];
|
||||
FFstrbuf display;
|
||||
} FFFontResult;
|
||||
|
||||
const FFFontResult* ffDetectFont(const FFinstance* instance);
|
||||
|
||||
@@ -4,6 +4,23 @@
|
||||
|
||||
#import <AppKit/NSFont.h>
|
||||
|
||||
static void generateString(FFFontResult* font)
|
||||
{
|
||||
if(font->fonts[0].length > 0)
|
||||
{
|
||||
ffStrbufAppend(&font->display, &font->fonts[0]);
|
||||
ffStrbufAppendS(&font->display, " [System]");
|
||||
if(font->fonts[1].length > 0)
|
||||
ffStrbufAppendS(&font->display, ", ");
|
||||
}
|
||||
|
||||
if(font->fonts[1].length > 0)
|
||||
{
|
||||
ffStrbufAppend(&font->display, &font->fonts[1]);
|
||||
ffStrbufAppendS(&font->display, " [User]");
|
||||
}
|
||||
}
|
||||
|
||||
void ffDetectFontImpl(const FFinstance* instance, FFFontResult* result)
|
||||
{
|
||||
FF_UNUSED(instance);
|
||||
@@ -11,4 +28,5 @@ void ffDetectFontImpl(const FFinstance* instance, FFFontResult* result)
|
||||
ffStrbufAppendS(&result->fonts[1], [NSFont userFontOfSize:12].familyName.UTF8String);
|
||||
ffStrbufAppendS(&result->fonts[2], [NSFont monospacedSystemFontOfSize:12 weight:400].familyName.UTF8String);
|
||||
ffStrbufAppendS(&result->fonts[3], [NSFont userFixedPitchFontOfSize:12].familyName.UTF8String);
|
||||
generateString(result);
|
||||
}
|
||||
|
||||
@@ -1,8 +1,29 @@
|
||||
#include "common/font.h"
|
||||
#include "common/parsing.h"
|
||||
#include "detection/displayserver/displayserver.h"
|
||||
#include "detection/gtk_qt/gtk_qt.h"
|
||||
#include "font.h"
|
||||
|
||||
static void generateString(FFFontResult* font)
|
||||
{
|
||||
if(font->fonts[0].length > 0)
|
||||
{
|
||||
ffStrbufAppend(&font->display, &font->fonts[0]);
|
||||
ffStrbufAppendS(&font->display, " [QT]");
|
||||
|
||||
for(uint8_t i = 1; i < sizeof(font->fonts) / sizeof(font->fonts[0]); i++)
|
||||
{
|
||||
if(font->fonts[i].length > 0)
|
||||
{
|
||||
ffStrbufAppendS(&font->display, ", ");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ffParseGTK(&font->display, &font->fonts[1], &font->fonts[2], &font->fonts[3]);
|
||||
}
|
||||
|
||||
void ffDetectFontImpl(const FFinstance* instance, FFFontResult* result)
|
||||
{
|
||||
const FFDisplayServerResult* wmde = ffConnectDisplayServer(instance);
|
||||
@@ -32,4 +53,6 @@ void ffDetectFontImpl(const FFinstance* instance, FFFontResult* result)
|
||||
ffFontInitPango(>k4, ffDetectGTK4(instance)->font.chars);
|
||||
ffStrbufAppend(&result->fonts[3], >k4.pretty);
|
||||
ffFontDestroy(>k4);
|
||||
|
||||
generateString(result);
|
||||
}
|
||||
|
||||
@@ -3,6 +3,26 @@
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
static void generateString(FFFontResult* font)
|
||||
{
|
||||
const char* types[] = { "Caption", "Menu", "Message", "Status" };
|
||||
for(uint32_t i = 0; i < sizeof(types) / sizeof(types[0]); ++i)
|
||||
{
|
||||
if(i == 0 || !ffStrbufEqual(&font->fonts[i - 1], &font->fonts[i]))
|
||||
{
|
||||
if(i > 0)
|
||||
ffStrbufAppendS(&font->display, "], ");
|
||||
ffStrbufAppendF(&font->display, "%s [%s", font->fonts[i].chars, types[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
ffStrbufAppendS(&font->display, " / ");
|
||||
ffStrbufAppendS(&font->display, types[i]);
|
||||
}
|
||||
}
|
||||
ffStrbufAppendC(&font->display, ']');
|
||||
}
|
||||
|
||||
void ffDetectFontImpl(const FFinstance* instance, FFFontResult* result)
|
||||
{
|
||||
FF_UNUSED(instance);
|
||||
@@ -19,4 +39,6 @@ void ffDetectFontImpl(const FFinstance* instance, FFFontResult* result)
|
||||
if(fonts[i]->lfHeight < 0)
|
||||
ffStrbufAppendF(&result->fonts[i], " (%dpt)", (int)-fonts[i]->lfHeight);
|
||||
}
|
||||
|
||||
generateString(result);
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ static const char* detectKnownGamepad(uint32_t vendorId, uint32_t productId)
|
||||
{
|
||||
case 0x2006: return "Nintendo Switch Joycon L";
|
||||
case 0x2007: return "Nintendo Switch Joycon R";
|
||||
case 0x2009: return "Nintendo Switch Pro";
|
||||
case 0x2009: return "Nintendo Switch Pro Controller";
|
||||
case 0x200E: return "Nintendo Switch Charging Grip";
|
||||
case 0x2017: return "Nintendo Switch SNES Controller";
|
||||
|
||||
@@ -117,8 +117,7 @@ const char* ffDetectGamepad(FF_MAYBE_UNUSED const FFinstance* instance, FFlist*
|
||||
continue;
|
||||
|
||||
FFGamepadDevice* device = (FFGamepadDevice*) ffListAdd(devices);
|
||||
ffStrbufInit(&device->identifier);
|
||||
ffStrbufSetWS(&device->identifier, devName);
|
||||
ffStrbufInitWS(&device->identifier, devName);
|
||||
ffStrbufInit(&device->name);
|
||||
|
||||
const char* knownGamepad = detectKnownGamepad(rdi.hid.dwVendorId, rdi.hid.dwProductId);
|
||||
|
||||
@@ -37,6 +37,7 @@ typedef struct FFGPUResult
|
||||
int coreCount;
|
||||
FFGPUMemory dedicated;
|
||||
FFGPUMemory shared;
|
||||
uint32_t vulkanDeviceId; // Only used for vulkan
|
||||
} FFGPUResult;
|
||||
|
||||
const FFlist* ffDetectGPU(const FFinstance* instance);
|
||||
|
||||
@@ -20,15 +20,13 @@ const char* ffDetectGPUImpl(FFlist* gpus, FF_MAYBE_UNUSED const FFinstance* inst
|
||||
|
||||
FFGPUResult* gpu = (FFGPUResult*)ffListAdd(gpus);
|
||||
ffStrbufInit(&gpu->vendor);
|
||||
ffStrbufInit(&gpu->name);
|
||||
ffStrbufInitWS(&gpu->name, displayDevice.DeviceString);
|
||||
ffStrbufInit(&gpu->driver);
|
||||
gpu->temperature = FF_GPU_TEMP_UNSET;
|
||||
gpu->coreCount = FF_GPU_CORE_COUNT_UNSET;
|
||||
gpu->type = FF_GPU_TYPE_UNKNOWN;
|
||||
gpu->dedicated.total = gpu->dedicated.used = gpu->shared.total = gpu->shared.used = FF_GPU_VMEM_SIZE_UNSET;
|
||||
|
||||
ffStrbufSetWS(&gpu->name, displayDevice.DeviceString);
|
||||
|
||||
if (deviceKeyLength == 100 && displayDevice.DeviceKey[deviceKeyPrefixLength - 1] == '{')
|
||||
{
|
||||
wmemcpy(regKey + regKeyPrefixLength, displayDevice.DeviceKey + deviceKeyPrefixLength, 100 - regKeyPrefixLength + 1);
|
||||
|
||||
@@ -13,7 +13,7 @@ static inline bool allPropertiesSet(FFGTKResult* result)
|
||||
result->font.length > 0;
|
||||
}
|
||||
|
||||
static inline void applyGTKSettings(FFGTKResult* result, const char* themeName, const char* iconsName, const char* fontName, const char* cursorTheme, int cursorSize)
|
||||
static inline void applyGTKSettings(FFGTKResult* result, const char* themeName, const char* iconsName, const char* fontName, const char* cursorTheme, int cursorSize, const char* wallpaper)
|
||||
{
|
||||
if(result->theme.length == 0)
|
||||
ffStrbufAppendS(&result->theme, themeName);
|
||||
@@ -29,6 +29,9 @@ static inline void applyGTKSettings(FFGTKResult* result, const char* themeName,
|
||||
|
||||
if(result->cursorSize.length == 0 && cursorSize > 0)
|
||||
ffStrbufAppendF(&result->cursorSize, "%i", cursorSize);
|
||||
|
||||
if(result->wallpaper.length == 0)
|
||||
ffStrbufAppendS(&result->wallpaper, wallpaper);
|
||||
}
|
||||
|
||||
static void detectGTKFromSettings(const FFinstance* instance, FFGTKResult* result)
|
||||
@@ -40,6 +43,7 @@ static void detectGTKFromSettings(const FFinstance* instance, FFGTKResult* resul
|
||||
static const char* fontName = NULL;
|
||||
static const char* cursorTheme = NULL;
|
||||
static int cursorSize = 0;
|
||||
static const char* wallpaper = NULL;
|
||||
|
||||
static bool init = false;
|
||||
|
||||
@@ -48,7 +52,7 @@ static void detectGTKFromSettings(const FFinstance* instance, FFGTKResult* resul
|
||||
if(init)
|
||||
{
|
||||
ffThreadMutexUnlock(&mutex);
|
||||
applyGTKSettings(result, themeName, iconsName, fontName, cursorTheme, cursorSize);
|
||||
applyGTKSettings(result, themeName, iconsName, fontName, cursorTheme, cursorSize, wallpaper);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -63,6 +67,7 @@ static void detectGTKFromSettings(const FFinstance* instance, FFGTKResult* resul
|
||||
fontName = ffSettingsGetXFConf(instance, "xsettings", "/Gtk/FontName", FF_VARIANT_TYPE_STRING).strValue;
|
||||
cursorTheme = ffSettingsGetXFConf(instance, "xsettings", "/Gtk/CursorThemeName", FF_VARIANT_TYPE_STRING).strValue;
|
||||
cursorSize = ffSettingsGetXFConf(instance, "xsettings", "/Gtk/CursorThemeSize", FF_VARIANT_TYPE_INT).intValue;
|
||||
wallpaper = ffSettingsGetXFConf(instance, "xfce4-desktop", "/backdrop/screen0/monitor0/workspace0/last-image", FF_VARIANT_TYPE_STRING).strValue;
|
||||
}
|
||||
else if(ffStrbufIgnCaseCompS(&wmde->dePrettyName, FF_DE_PRETTY_CINNAMON) == 0)
|
||||
{
|
||||
@@ -90,10 +95,12 @@ static void detectGTKFromSettings(const FFinstance* instance, FFGTKResult* resul
|
||||
fontName = ffSettingsGet(instance, "/org/gnome/desktop/interface/font-name", "org.gnome.desktop.interface", NULL, "font-name", FF_VARIANT_TYPE_STRING).strValue;
|
||||
cursorTheme = ffSettingsGet(instance, "/org/gnome/desktop/interface/cursor-theme", "org.gnome.desktop.interface", NULL, "cursor-theme", FF_VARIANT_TYPE_STRING).strValue;
|
||||
cursorSize = ffSettingsGet(instance, "/org/gnome/desktop/interface/cursor-size", "org.gnome.desktop.interface", NULL, "cursor-size", FF_VARIANT_TYPE_INT).intValue;
|
||||
wallpaper = ffSettingsGet(instance, "/org/gnome/desktop/background/picture-uri", "org.gnome.desktop.background", NULL, "picture-uri", FF_VARIANT_TYPE_STRING).strValue;
|
||||
// TODO: support other DEs for wallpaper
|
||||
}
|
||||
|
||||
ffThreadMutexUnlock(&mutex);
|
||||
applyGTKSettings(result, themeName, iconsName, fontName, cursorTheme, cursorSize);
|
||||
applyGTKSettings(result, themeName, iconsName, fontName, cursorTheme, cursorSize, wallpaper);
|
||||
}
|
||||
|
||||
static void detectGTKFromConfigFile(const char* filename, FFGTKResult* result)
|
||||
@@ -184,6 +191,7 @@ static void detectGTK(const FFinstance* instance, const char* version, FFGTKResu
|
||||
ffStrbufInit(&result.font); \
|
||||
ffStrbufInit(&result.cursor); \
|
||||
ffStrbufInit(&result.cursorSize); \
|
||||
ffStrbufInit(&result.wallpaper); \
|
||||
detectGTK(instance, #version, &result); \
|
||||
ffThreadMutexUnlock(&mutex); \
|
||||
return &result;
|
||||
|
||||
@@ -12,6 +12,7 @@ typedef struct FFGTKResult
|
||||
FFstrbuf font;
|
||||
FFstrbuf cursor;
|
||||
FFstrbuf cursorSize;
|
||||
FFstrbuf wallpaper;
|
||||
} FFGTKResult;
|
||||
|
||||
typedef struct FFQtResult
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#ifndef FF_INCLUDED_detection_icons
|
||||
#define FF_INCLUDED_detection_icons
|
||||
|
||||
#include "fastfetch.h"
|
||||
|
||||
const char* ffDetectIcons(const FFinstance* instance, FFstrbuf* result);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,36 @@
|
||||
#include "icons.h"
|
||||
#include "common/parsing.h"
|
||||
#include "detection/gtk_qt/gtk_qt.h"
|
||||
#include "detection/displayserver/displayserver.h"
|
||||
|
||||
const char* ffDetectIcons(const FFinstance* instance, FFstrbuf* result)
|
||||
{
|
||||
const FFDisplayServerResult* wmde = ffConnectDisplayServer(instance);
|
||||
|
||||
if(ffStrbufIgnCaseCompS(&wmde->wmProtocolName, FF_WM_PROTOCOL_TTY) == 0)
|
||||
return "Icons aren't supported in TTY";
|
||||
|
||||
const FFstrbuf* plasma = &ffDetectQt(instance)->icons;
|
||||
const FFstrbuf* gtk2 = &ffDetectGTK2(instance)->icons;
|
||||
const FFstrbuf* gtk3 = &ffDetectGTK3(instance)->icons;
|
||||
const FFstrbuf* gtk4 = &ffDetectGTK4(instance)->icons;
|
||||
|
||||
if(plasma->length == 0 && gtk2->length == 0 && gtk3->length == 0 && gtk4->length == 0)
|
||||
return "No icons could be found";
|
||||
|
||||
FF_STRBUF_AUTO_DESTROY gtkPretty;
|
||||
ffStrbufInit(>kPretty);
|
||||
ffParseGTK(>kPretty, gtk2, gtk3, gtk4);
|
||||
|
||||
if(plasma->length > 0)
|
||||
{
|
||||
ffStrbufAppend(result, plasma);
|
||||
ffStrbufAppendS(result, " [QT]");
|
||||
|
||||
if(gtkPretty.length > 0)
|
||||
ffStrbufAppendS(result, ", ");
|
||||
}
|
||||
ffStrbufAppend(result, >kPretty);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
#include "icons.h"
|
||||
|
||||
const char* ffDetectIcons(FF_MAYBE_UNUSED const FFinstance* instance, FF_MAYBE_UNUSED FFstrbuf* result)
|
||||
{
|
||||
return "Not supported on this platform";
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
#include "icons.h"
|
||||
#include "util/windows/registry.h"
|
||||
|
||||
const char* ffDetectIcons(FF_MAYBE_UNUSED const FFinstance* instance, FFstrbuf* result)
|
||||
{
|
||||
FF_HKEY_AUTO_DESTROY hKey = NULL;
|
||||
if(!ffRegOpenKeyForRead(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\HideDesktopIcons\\ClassicStartMenu", &hKey, NULL))
|
||||
return "ffRegOpenKeyForRead(Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\HideDesktopIcons\\ClassicStartMenu) failed";
|
||||
|
||||
// Whether these icons are hidden
|
||||
uint32_t ThisPC = 0, UsersFiles = 0, RemoteNetwork = 0, RecycleBin = 0, ControlPanel = 0;
|
||||
ffRegReadUint(hKey, L"{20D04FE0-3AEA-1069-A2D8-08002B30309D}", &ThisPC, NULL);
|
||||
ffRegReadUint(hKey, L"{59031a47-3f72-44a7-89c5-5595fe6b30ee}", &UsersFiles, NULL);
|
||||
ffRegReadUint(hKey, L"{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}", &RemoteNetwork, NULL);
|
||||
ffRegReadUint(hKey, L"{645FF040-5081-101B-9F08-00AA002F954E}", &RecycleBin, NULL);
|
||||
ffRegReadUint(hKey, L"{5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0}", &ControlPanel, NULL);
|
||||
|
||||
if (!ThisPC)
|
||||
ffStrbufAppendS(result, "This PC, ");
|
||||
if (!UsersFiles)
|
||||
ffStrbufAppendS(result, "User's Files, ");
|
||||
if (!RemoteNetwork)
|
||||
ffStrbufAppendS(result, "Remote Network, ");
|
||||
if (!RecycleBin)
|
||||
ffStrbufAppendS(result, "Recycle Bin, ");
|
||||
if (!ControlPanel)
|
||||
ffStrbufAppendS(result, "Control Panel");
|
||||
|
||||
ffStrbufTrimRight(result, ' ');
|
||||
ffStrbufTrimRight(result, ',');
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -8,8 +8,9 @@
|
||||
typedef struct FFLocalIpResult
|
||||
{
|
||||
FFstrbuf name;
|
||||
FFstrbuf addr;
|
||||
bool ipv6;
|
||||
FFstrbuf ipv4;
|
||||
FFstrbuf ipv6;
|
||||
FFstrbuf mac;
|
||||
} FFLocalIpResult;
|
||||
|
||||
const char* ffDetectLocalIps(const FFinstance* instance, FFlist* results);
|
||||
|
||||
@@ -2,21 +2,48 @@
|
||||
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <net/if.h>
|
||||
#include <ifaddrs.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <net/if.h>
|
||||
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/socket.h> // FreeBSD needs this for AF_INET
|
||||
#if defined(__FreeBSD__) || defined(__APPLE__)
|
||||
#include <net/if_dl.h>
|
||||
#else
|
||||
#include <linux/if_packet.h>
|
||||
#endif
|
||||
|
||||
static void addNewIp(FFlist* list, const char* name, const char* addr, bool ipv6)
|
||||
static void addNewIp(FFlist* list, const char* name, const char* addr, int type)
|
||||
{
|
||||
FFLocalIpResult* ip = (FFLocalIpResult*) ffListAdd(list);
|
||||
ffStrbufInitS(&ip->name, name);
|
||||
ffStrbufInitS(&ip->addr, addr);
|
||||
ip->ipv6 = ipv6;
|
||||
FFLocalIpResult* ip = NULL;
|
||||
|
||||
FF_LIST_FOR_EACH(FFLocalIpResult, temp, *list)
|
||||
{
|
||||
if (!ffStrbufEqualS(&temp->name, name)) continue;
|
||||
ip = temp;
|
||||
break;
|
||||
}
|
||||
if (!ip)
|
||||
{
|
||||
ip = (FFLocalIpResult*) ffListAdd(list);
|
||||
ffStrbufInitS(&ip->name, name);
|
||||
ffStrbufInit(&ip->ipv4);
|
||||
ffStrbufInit(&ip->ipv6);
|
||||
ffStrbufInit(&ip->mac);
|
||||
}
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case AF_INET:
|
||||
ffStrbufSetS(&ip->ipv4, addr);
|
||||
break;
|
||||
case AF_INET6:
|
||||
ffStrbufSetS(&ip->ipv6, addr);
|
||||
break;
|
||||
case -1:
|
||||
ffStrbufSetS(&ip->mac, addr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const char* ffDetectLocalIps(const FFinstance* instance, FFlist* results)
|
||||
@@ -30,8 +57,7 @@ const char* ffDetectLocalIps(const FFinstance* instance, FFlist* results)
|
||||
if (!ifa->ifa_addr || !(ifa->ifa_flags & IFF_RUNNING))
|
||||
continue;
|
||||
|
||||
// loop back
|
||||
if (strncmp(ifa->ifa_name, "lo", 2) == 0 && (ifa->ifa_name[2] == '\0' || isdigit(ifa->ifa_name[2])) && !instance->config.localIpShowLoop)
|
||||
if ((ifa->ifa_flags & IFF_LOOPBACK) && !(instance->config.localIpShowType & FF_LOCALIP_TYPE_LOOP_BIT))
|
||||
continue;
|
||||
|
||||
if (instance->config.localIpNamePrefix.length && strncmp(ifa->ifa_name, instance->config.localIpNamePrefix.chars, instance->config.localIpNamePrefix.length) != 0)
|
||||
@@ -39,26 +65,49 @@ const char* ffDetectLocalIps(const FFinstance* instance, FFlist* results)
|
||||
|
||||
if (ifa->ifa_addr->sa_family == AF_INET)
|
||||
{
|
||||
// IPv4
|
||||
if (!instance->config.localIpShowIpV4)
|
||||
if (!(instance->config.localIpShowType & FF_LOCALIP_TYPE_IPV4_BIT))
|
||||
continue;
|
||||
|
||||
struct sockaddr_in* ipv4 = (struct sockaddr_in*) ifa->ifa_addr;
|
||||
char addressBuffer[INET_ADDRSTRLEN];
|
||||
inet_ntop(AF_INET, &ipv4->sin_addr, addressBuffer, INET_ADDRSTRLEN);
|
||||
addNewIp(results, ifa->ifa_name, addressBuffer, false);
|
||||
addNewIp(results, ifa->ifa_name, addressBuffer, AF_INET);
|
||||
}
|
||||
else if (ifa->ifa_addr->sa_family == AF_INET6)
|
||||
{
|
||||
// IPv6
|
||||
if (!instance->config.localIpShowIpV6)
|
||||
if (!(instance->config.localIpShowType & FF_LOCALIP_TYPE_IPV6_BIT))
|
||||
continue;
|
||||
|
||||
struct sockaddr_in6* ipv6 = (struct sockaddr_in6 *)ifa->ifa_addr;
|
||||
char addressBuffer[INET6_ADDRSTRLEN];
|
||||
inet_ntop(AF_INET6, &ipv6->sin6_addr, addressBuffer, INET6_ADDRSTRLEN);
|
||||
addNewIp(results, ifa->ifa_name, addressBuffer, true);
|
||||
addNewIp(results, ifa->ifa_name, addressBuffer, AF_INET6);
|
||||
}
|
||||
#if defined(__FreeBSD__) || defined(__APPLE__)
|
||||
else if (ifa->ifa_addr->sa_family == AF_LINK)
|
||||
{
|
||||
if (!(instance->config.localIpShowType & FF_LOCALIP_TYPE_MAC_BIT))
|
||||
continue;
|
||||
|
||||
char addressBuffer[32];
|
||||
uint8_t* ptr = (uint8_t*) LLADDR((struct sockaddr_dl *)ifa->ifa_addr);
|
||||
snprintf(addressBuffer, sizeof(addressBuffer), "%02x:%02x:%02x:%02x:%02x:%02x",
|
||||
ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]);
|
||||
addNewIp(results, ifa->ifa_name, addressBuffer, -1);
|
||||
}
|
||||
#else
|
||||
else if (ifa->ifa_addr->sa_family == AF_PACKET)
|
||||
{
|
||||
if (!(instance->config.localIpShowType & FF_LOCALIP_TYPE_MAC_BIT))
|
||||
continue;
|
||||
|
||||
char addressBuffer[32];
|
||||
uint8_t* ptr = ((struct sockaddr_ll *)ifa->ifa_addr)->sll_addr;
|
||||
snprintf(addressBuffer, sizeof(addressBuffer), "%02x:%02x:%02x:%02x:%02x:%02x",
|
||||
ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]);
|
||||
addNewIp(results, ifa->ifa_name, addressBuffer, -1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (ifAddrStruct) freeifaddrs(ifAddrStruct);
|
||||
|
||||
@@ -1,21 +1,45 @@
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
#include <iphlpapi.h>
|
||||
#include <wchar.h>
|
||||
|
||||
#include "util/mallocHelper.h"
|
||||
#include "util/windows/unicode.h"
|
||||
#include "localip.h"
|
||||
|
||||
static void addNewIp(FFlist* list, const char* name, const char* addr, bool ipv6)
|
||||
static void addNewIp(FFlist* list, const char* name, const char* value, int type, bool newIp)
|
||||
{
|
||||
FFLocalIpResult* ip = (FFLocalIpResult*) ffListAdd(list);
|
||||
ffStrbufInitS(&ip->name, name);
|
||||
ffStrbufInitS(&ip->addr, addr);
|
||||
ip->ipv6 = ipv6;
|
||||
FFLocalIpResult* ip = NULL;
|
||||
|
||||
if (newIp)
|
||||
{
|
||||
ip = (FFLocalIpResult*) ffListAdd(list);
|
||||
ffStrbufInitS(&ip->name, name);
|
||||
ffStrbufInit(&ip->ipv4);
|
||||
ffStrbufInit(&ip->ipv6);
|
||||
ffStrbufInit(&ip->mac);
|
||||
}
|
||||
else
|
||||
{
|
||||
ip = ffListGet(list, list->length - 1);
|
||||
}
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case AF_INET:
|
||||
ffStrbufSetS(&ip->ipv4, value);
|
||||
break;
|
||||
case AF_INET6:
|
||||
ffStrbufSetS(&ip->ipv6, value);
|
||||
break;
|
||||
case -1:
|
||||
ffStrbufSetS(&ip->mac, value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const char* ffDetectLocalIps(const FFinstance* instance, FFlist* results)
|
||||
{
|
||||
IP_ADAPTER_ADDRESSES* adapter_addresses = NULL;
|
||||
IP_ADAPTER_ADDRESSES* FF_AUTO_FREE adapter_addresses = NULL;
|
||||
|
||||
// Start with a 16 KB buffer and resize if needed -
|
||||
// multiple attempts in case interfaces change while
|
||||
@@ -27,11 +51,10 @@ const char* ffDetectLocalIps(const FFinstance* instance, FFlist* results)
|
||||
assert(adapter_addresses);
|
||||
|
||||
DWORD error = GetAdaptersAddresses(
|
||||
AF_UNSPEC,
|
||||
GAA_FLAG_SKIP_ANYCAST |
|
||||
GAA_FLAG_SKIP_MULTICAST |
|
||||
GAA_FLAG_SKIP_DNS_SERVER |
|
||||
GAA_FLAG_SKIP_FRIENDLY_NAME,
|
||||
instance->config.localIpShowType & FF_LOCALIP_TYPE_IPV4_BIT
|
||||
? instance->config.localIpShowType & FF_LOCALIP_TYPE_IPV6_BIT ? AF_UNSPEC : AF_INET
|
||||
: AF_INET6,
|
||||
GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER,
|
||||
NULL,
|
||||
adapter_addresses,
|
||||
&adapter_addresses_buffer_size);
|
||||
@@ -47,41 +70,47 @@ const char* ffDetectLocalIps(const FFinstance* instance, FFlist* results)
|
||||
// Iterate through all of the adapters
|
||||
for (IP_ADAPTER_ADDRESSES* adapter = adapter_addresses; adapter; adapter = adapter->Next)
|
||||
{
|
||||
if (adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK && !instance->config.localIpShowLoop)
|
||||
bool isLoop = adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK;
|
||||
if (isLoop && !(instance->config.localIpShowType & FF_LOCALIP_TYPE_LOOP_BIT))
|
||||
continue;
|
||||
|
||||
bool newIp = true;
|
||||
|
||||
char name[128];
|
||||
WideCharToMultiByte(CP_UTF8, 0, adapter->FriendlyName, -1, name, sizeof(name), NULL, NULL);
|
||||
if (instance->config.localIpNamePrefix.length && strncmp(name, instance->config.localIpNamePrefix.chars, instance->config.localIpNamePrefix.length) != 0)
|
||||
continue;
|
||||
|
||||
if (instance->config.localIpShowType & FF_LOCALIP_TYPE_MAC_BIT && adapter->PhysicalAddressLength == 6)
|
||||
{
|
||||
char addressBuffer[32];
|
||||
uint8_t* ptr = adapter->PhysicalAddress;
|
||||
snprintf(addressBuffer, sizeof(addressBuffer), "%02x:%02x:%02x:%02x:%02x:%02x",
|
||||
ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5]);
|
||||
addNewIp(results, name, addressBuffer, -1, newIp);
|
||||
newIp = false;
|
||||
}
|
||||
|
||||
for (IP_ADAPTER_UNICAST_ADDRESS* ifa = adapter->FirstUnicastAddress; ifa; ifa = ifa->Next)
|
||||
{
|
||||
if (ifa->Address.lpSockaddr->sa_family == AF_INET)
|
||||
{
|
||||
// IPv4
|
||||
if (!instance->config.localIpShowIpV4)
|
||||
continue;
|
||||
|
||||
SOCKADDR_IN* ipv4 = (SOCKADDR_IN*) ifa->Address.lpSockaddr;
|
||||
char addressBuffer[INET_ADDRSTRLEN];
|
||||
inet_ntop(AF_INET, &ipv4->sin_addr, addressBuffer, INET_ADDRSTRLEN);
|
||||
addNewIp(results, name, addressBuffer, false);
|
||||
addNewIp(results, name, addressBuffer, AF_INET, newIp);
|
||||
newIp = false;
|
||||
}
|
||||
else if (ifa->Address.lpSockaddr->sa_family == AF_INET6)
|
||||
{
|
||||
// IPv6
|
||||
if (!instance->config.localIpShowIpV6)
|
||||
continue;
|
||||
|
||||
SOCKADDR_IN6* ipv6 = (SOCKADDR_IN6*) ifa->Address.lpSockaddr;
|
||||
char addressBuffer[INET6_ADDRSTRLEN];
|
||||
inet_ntop(AF_INET6, &ipv6->sin6_addr, addressBuffer, INET6_ADDRSTRLEN);
|
||||
addNewIp(results, name, addressBuffer, true);
|
||||
addNewIp(results, name, addressBuffer, AF_INET6, newIp);
|
||||
newIp = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
free(adapter_addresses);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ const FFMediaResult* ffDetectMedia(const FFinstance* instance)
|
||||
{
|
||||
FF_DETECTION_INTERNAL_GUARD(FFMediaResult,
|
||||
ffStrbufInitA(&result.error, 0);
|
||||
ffStrbufInit(&result.busNameShort);
|
||||
ffStrbufInit(&result.playerId);
|
||||
ffStrbufInit(&result.player);
|
||||
ffStrbufInit(&result.song);
|
||||
ffStrbufInit(&result.artist);
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
typedef struct FFMediaResult
|
||||
{
|
||||
FFstrbuf error;
|
||||
FFstrbuf busNameShort; //e.g. plasma-browser-integration
|
||||
FFstrbuf playerId; // Bus name on Linux, app bundle name on macOS. e.g. plasma-browser-integration
|
||||
FFstrbuf player; // e.g. Google Chrome
|
||||
FFstrbuf song;
|
||||
FFstrbuf artist;
|
||||
|
||||
@@ -57,17 +57,17 @@ static const char* getMedia(FFMediaResult* result)
|
||||
if (identifier == nil)
|
||||
identifier = MRNowPlayingClientGetParentAppBundleIdentifier(clientObj);
|
||||
if (identifier != nil)
|
||||
ffCfStrGetString(identifier, &result->busNameShort);
|
||||
ffCfStrGetString(identifier, &result->playerId);
|
||||
}
|
||||
dispatch_group_leave(group);
|
||||
});
|
||||
|
||||
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
|
||||
|
||||
if(result->busNameShort.length > 0)
|
||||
if(result->playerId.length > 0)
|
||||
{
|
||||
char buf[128];
|
||||
snprintf(buf, sizeof(buf), "name of app id \"%s\"", result->busNameShort.chars);
|
||||
snprintf(buf, sizeof(buf), "name of app id \"%s\"", result->playerId.chars);
|
||||
ffOsascript(buf, &result->player);
|
||||
}
|
||||
|
||||
|
||||
@@ -87,14 +87,14 @@ static bool getBusProperties(FFDBusData* data, const char* busName, FFMediaResul
|
||||
}
|
||||
|
||||
//Set short bus name
|
||||
ffStrbufAppendS(&result->busNameShort, busName + sizeof(FF_DBUS_MPRIS_PREFIX) - 1);
|
||||
ffStrbufAppendS(&result->playerId, busName + sizeof(FF_DBUS_MPRIS_PREFIX) - 1);
|
||||
|
||||
//We found a song, get the player name
|
||||
ffDBusGetPropertyString(data, busName, "/org/mpris/MediaPlayer2", "org.mpris.MediaPlayer2", "Identity", &result->player);
|
||||
if(result->player.length == 0)
|
||||
ffDBusGetPropertyString(data, busName, "/org/mpris/MediaPlayer2", "org.mpris.MediaPlayer2", "DesktopEntry", &result->player);
|
||||
if(result->player.length == 0)
|
||||
ffStrbufAppend(&result->player, &result->busNameShort);
|
||||
ffStrbufAppend(&result->player, &result->playerId);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -3,8 +3,14 @@
|
||||
#ifndef FF_INCLUDED_detection_memory_memory
|
||||
#define FF_INCLUDED_detection_memory_memory
|
||||
|
||||
#include "detection/storage.h"
|
||||
#include "fastfetch.h"
|
||||
|
||||
void ffDetectMemory(FFMemoryStorage* result);
|
||||
typedef struct FFMemoryResult
|
||||
{
|
||||
uint64_t bytesUsed;
|
||||
uint64_t bytesTotal;
|
||||
} FFMemoryResult;
|
||||
|
||||
const char* ffDetectMemory(FFMemoryResult* result);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -3,31 +3,25 @@
|
||||
#include <string.h>
|
||||
#include <mach/mach.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
void ffDetectMemory(FFMemoryStorage* ram)
|
||||
const char* ffDetectMemory(FFMemoryResult* ram)
|
||||
{
|
||||
size_t length = sizeof(ram->bytesTotal);
|
||||
if (sysctl((int[]){ CTL_HW, HW_MEMSIZE }, 2, &ram->bytesTotal, &length, NULL, 0))
|
||||
{
|
||||
ffStrbufAppendS(&ram->error, "Failed to read hw.memsize");
|
||||
return;
|
||||
}
|
||||
return "Failed to read hw.memsize";
|
||||
|
||||
uint32_t pagesize;
|
||||
length = sizeof(pagesize);
|
||||
if (sysctl((int[]){ CTL_HW, HW_PAGESIZE }, 2, &pagesize, &length, NULL, 0))
|
||||
{
|
||||
ffStrbufAppendS(&ram->error, "Failed to read hw.pagesize");
|
||||
return;
|
||||
}
|
||||
return "Failed to read hw.pagesize";
|
||||
|
||||
mach_msg_type_number_t count = HOST_VM_INFO64_COUNT;
|
||||
vm_statistics64_data_t vmstat;
|
||||
if(host_statistics64(mach_host_self(), HOST_VM_INFO64, (host_info64_t) (&vmstat), &count) != KERN_SUCCESS)
|
||||
{
|
||||
ffStrbufAppendS(&ram->error, "Failed to read host_statistics64");
|
||||
return;
|
||||
}
|
||||
return "Failed to read host_statistics64";
|
||||
|
||||
ram->bytesUsed = ((uint64_t) vmstat.active_count + vmstat.wire_count) * pagesize;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1,24 +1,21 @@
|
||||
#include "memory.h"
|
||||
#include "common/sysctl.h"
|
||||
|
||||
void ffDetectMemory(FFMemoryStorage* ram)
|
||||
const char* ffDetectMemory(FFMemoryResult* ram)
|
||||
{
|
||||
uint32_t pageSize = (uint32_t) ffSysctlGetInt("hw.pagesize", 0);
|
||||
if(pageSize == 0)
|
||||
{
|
||||
ffStrbufAppendS(&ram->error, "Failed to read hw.pagesize");
|
||||
return;
|
||||
}
|
||||
uint32_t pageSize;
|
||||
uint64_t length = sizeof(pageSize);
|
||||
if (sysctl((int[]){ CTL_HW, HW_PAGESIZE }, 2, &pageSize, &length, NULL, 0))
|
||||
return "Failed to read hw.pagesize";
|
||||
|
||||
ram->bytesTotal = (uint64_t) ffSysctlGetInt64("vm.stats.vm.v_page_count", 0) * pageSize;
|
||||
if(ram->bytesTotal == 0)
|
||||
{
|
||||
ffStrbufAppendS(&ram->error, "Failed to read vm.stats.vm.v_page_count");
|
||||
return;
|
||||
}
|
||||
return "Failed to read vm.stats.vm.v_page_count";
|
||||
|
||||
ram->bytesUsed = ram->bytesTotal
|
||||
- (uint64_t) ffSysctlGetInt64("vm.stats.vm.v_free_count", 0) * pageSize
|
||||
- (uint64_t) ffSysctlGetInt64("vm.stats.vm.v_inactive_count", 0) * pageSize
|
||||
;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1,18 +1,16 @@
|
||||
#include "memory.h"
|
||||
#include "util/mallocHelper.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
void ffDetectMemory(FFMemoryStorage* ram)
|
||||
const char* ffDetectMemory(FFMemoryResult* ram)
|
||||
{
|
||||
FILE* meminfo = fopen("/proc/meminfo", "r");
|
||||
if(meminfo == NULL)
|
||||
{
|
||||
ffStrbufAppendS(&ram->error, "Failed to open /proc/meminfo");
|
||||
return;
|
||||
}
|
||||
return "Failed to open /proc/meminfo";
|
||||
|
||||
char* line = NULL;
|
||||
char* FF_AUTO_FREE line = NULL;
|
||||
size_t len = 0;
|
||||
|
||||
uint32_t memTotal = 0,
|
||||
@@ -32,14 +30,13 @@ void ffDetectMemory(FFMemoryStorage* ram)
|
||||
sscanf(line, "SReclaimable: %u", &sReclaimable);
|
||||
}
|
||||
|
||||
if(line != NULL)
|
||||
free(line);
|
||||
|
||||
fclose(meminfo);
|
||||
|
||||
ram->bytesTotal = memTotal * (uint64_t) 1024;
|
||||
if(ram->bytesTotal == 0)
|
||||
ffStrbufAppendS(&ram->error, "Failed to read MemTotal");
|
||||
return "Failed to read MemTotal";
|
||||
else
|
||||
ram->bytesUsed = (memTotal + shmem - memFree - buffers - cached - sReclaimable) * (uint64_t) 1024;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -2,16 +2,15 @@
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
void ffDetectMemory(FFMemoryStorage* ram)
|
||||
const char* ffDetectMemory(FFMemoryResult* ram)
|
||||
{
|
||||
MEMORYSTATUSEX statex = {
|
||||
.dwLength = sizeof(statex),
|
||||
};
|
||||
if (!GlobalMemoryStatusEx(&statex))
|
||||
{
|
||||
ffStrbufAppendS(&ram->error, "GlobalMemoryStatusEx() failed");
|
||||
return;
|
||||
}
|
||||
return "GlobalMemoryStatusEx() failed";
|
||||
|
||||
ram->bytesTotal = statex.ullTotalPhys;
|
||||
ram->bytesUsed = statex.ullTotalPhys - statex.ullAvailPhys;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
#include "detection/opencl/opencl.h"
|
||||
|
||||
#if defined(FF_HAVE_OPENCL) || defined(__APPLE__)
|
||||
|
||||
#include "common/library.h"
|
||||
#include "common/parsing.h"
|
||||
#include "util/stringUtils.h"
|
||||
#include <string.h>
|
||||
|
||||
#define CL_TARGET_OPENCL_VERSION 100
|
||||
#ifdef FF_HAVE_OPENCL
|
||||
#include <CL/cl.h>
|
||||
#else
|
||||
#include <OpenCL/cl.h>
|
||||
#endif
|
||||
|
||||
typedef struct OpenCLData
|
||||
{
|
||||
FF_LIBRARY_SYMBOL(clGetPlatformIDs)
|
||||
FF_LIBRARY_SYMBOL(clGetDeviceIDs)
|
||||
FF_LIBRARY_SYMBOL(clGetDeviceInfo)
|
||||
} OpenCLData;
|
||||
|
||||
static const char* openCLHandleData(OpenCLData* data, FFOpenCLResult* result)
|
||||
{
|
||||
cl_platform_id platformID;
|
||||
cl_uint numPlatforms;
|
||||
data->ffclGetPlatformIDs(1, &platformID, &numPlatforms);
|
||||
|
||||
if(numPlatforms == 0)
|
||||
return "clGetPlatformIDs returned 0 platforms";
|
||||
|
||||
cl_device_id deviceID;
|
||||
cl_uint numDevices;
|
||||
data->ffclGetDeviceIDs(platformID, CL_DEVICE_TYPE_GPU, 1, &deviceID, &numDevices);
|
||||
|
||||
if(numDevices == 0)
|
||||
data->ffclGetDeviceIDs(platformID, CL_DEVICE_TYPE_ALL, 1, &deviceID, &numDevices);
|
||||
|
||||
if(numDevices == 0)
|
||||
return "clGetDeviceIDs returned 0 devices";
|
||||
|
||||
char version[64];
|
||||
data->ffclGetDeviceInfo(deviceID, CL_DEVICE_VERSION, sizeof(version), version, NULL);
|
||||
if(!ffStrSet(version))
|
||||
return "clGetDeviceInfo returned NULL or empty string";
|
||||
|
||||
const char* versionPretty = version;
|
||||
const char* prefix = "OpenCL ";
|
||||
if(strncasecmp(version, prefix, sizeof(prefix) - 1) == 0)
|
||||
versionPretty = version + sizeof(prefix) - 1;
|
||||
ffStrbufSetS(&result->version, versionPretty);
|
||||
|
||||
ffStrbufEnsureFree(&result->device, 128);
|
||||
data->ffclGetDeviceInfo(deviceID, CL_DEVICE_NAME, result->device.allocated, result->device.chars, NULL);
|
||||
ffStrbufRecalculateLength(&result->device);
|
||||
|
||||
ffStrbufEnsureFree(&result->vendor, 32);
|
||||
data->ffclGetDeviceInfo(deviceID, CL_DEVICE_VENDOR, result->vendor.allocated, result->vendor.chars, NULL);
|
||||
ffStrbufRecalculateLength(&result->vendor);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif // defined(FF_HAVE_OPENCL) || defined(__APPLE__)
|
||||
|
||||
const char* ffDetectOpenCL(FFinstance* instance, FFOpenCLResult* result)
|
||||
{
|
||||
#ifdef FF_HAVE_OPENCL
|
||||
|
||||
OpenCLData data;
|
||||
|
||||
FF_LIBRARY_LOAD(opencl, &instance->config.libOpenCL, "dlopen libOpenCL"FF_LIBRARY_EXTENSION" failed",
|
||||
#ifdef _WIN32
|
||||
"OpenCL"FF_LIBRARY_EXTENSION, -1,
|
||||
#endif
|
||||
"libOpenCL"FF_LIBRARY_EXTENSION, 1
|
||||
);
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(opencl, data, clGetPlatformIDs);
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(opencl, data, clGetDeviceIDs);
|
||||
FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(opencl, data, clGetDeviceInfo);
|
||||
|
||||
return openCLHandleData(&data, result);
|
||||
|
||||
#elif defined(__APPLE__) // FF_HAVE_OPENCL
|
||||
|
||||
FF_UNUSED(instance);
|
||||
|
||||
OpenCLData data;
|
||||
data.ffclGetPlatformIDs = clGetPlatformIDs;
|
||||
data.ffclGetDeviceIDs = clGetDeviceIDs;
|
||||
data.ffclGetDeviceInfo = clGetDeviceInfo;
|
||||
|
||||
return openCLHandleData(&data, result);
|
||||
|
||||
#else
|
||||
|
||||
FF_UNUSED(instance, result);
|
||||
return "Fastfetch was build without OpenCL support";
|
||||
|
||||
#endif // FF_HAVE_OPENCL
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
|
||||
#ifndef FF_INCLUDED_detection_opencl_opencl
|
||||
#define FF_INCLUDED_detection_opencl_opencl
|
||||
|
||||
#include "fastfetch.h"
|
||||
|
||||
typedef struct FFOpenCLResult
|
||||
{
|
||||
FFstrbuf version;
|
||||
FFstrbuf device;
|
||||
FFstrbuf vendor;
|
||||
} FFOpenCLResult;
|
||||
|
||||
const char* ffDetectOpenCL(FFinstance* instance, FFOpenCLResult* result);
|
||||
|
||||
#endif
|
||||
@@ -24,7 +24,52 @@ static void parseSystemVersion(FFOSResult* os)
|
||||
ffStrbufInitS(&os->buildID, value.UTF8String);
|
||||
}
|
||||
|
||||
void parseOSXSoftwareLicense(FFOSResult* os)
|
||||
static bool detectOSCodeName(FFOSResult* os)
|
||||
{
|
||||
// https://en.wikipedia.org/wiki/MacOS_version_history
|
||||
char* str_end;
|
||||
const char* version = os->version.chars;
|
||||
unsigned long num = strtoul(version, &str_end, 10);
|
||||
if (str_end == version) return false;
|
||||
|
||||
switch (num)
|
||||
{
|
||||
case 14: ffStrbufAppendS(&os->codename, "Sonoma"); return true;
|
||||
case 13: ffStrbufAppendS(&os->codename, "Ventura"); return true;
|
||||
case 12: ffStrbufAppendS(&os->codename, "Monterey"); return true;
|
||||
case 11: ffStrbufAppendS(&os->codename, "Big Sur"); return true;
|
||||
case 10: {
|
||||
version = str_end + 1;
|
||||
num = strtoul(version, &str_end, 10);
|
||||
if (str_end == version) return false;
|
||||
|
||||
switch (num)
|
||||
{
|
||||
case 16: ffStrbufAppendS(&os->codename, "Big Sur"); return true;
|
||||
case 15: ffStrbufAppendS(&os->codename, "Catalina"); return true;
|
||||
case 14: ffStrbufAppendS(&os->codename, "Mojave"); return true;
|
||||
case 13: ffStrbufAppendS(&os->codename, "High Sierra"); return true;
|
||||
case 12: ffStrbufAppendS(&os->codename, "Sierra"); return true;
|
||||
case 11: ffStrbufAppendS(&os->codename, "El Capitan"); return true;
|
||||
case 10: ffStrbufAppendS(&os->codename, "Yosemite"); return true;
|
||||
case 9: ffStrbufAppendS(&os->codename, "Mavericks"); return true;
|
||||
case 8: ffStrbufAppendS(&os->codename, "Mountain Lion"); return true;
|
||||
case 7: ffStrbufAppendS(&os->codename, "Lion"); return true;
|
||||
case 6: ffStrbufAppendS(&os->codename, "Snow Leopard"); return true;
|
||||
case 5: ffStrbufAppendS(&os->codename, "Leopard"); return true;
|
||||
case 4: ffStrbufAppendS(&os->codename, "Tiger"); return true;
|
||||
case 3: ffStrbufAppendS(&os->codename, "Panther"); return true;
|
||||
case 2: ffStrbufAppendS(&os->codename, "Jaguar"); return true;
|
||||
case 1: ffStrbufAppendS(&os->codename, "Puma"); return true;
|
||||
case 0: ffStrbufAppendS(&os->codename, "Cheetah"); return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void parseOSXSoftwareLicense(FFOSResult* os)
|
||||
{
|
||||
FILE* rtf = fopen("/System/Library/CoreServices/Setup Assistant.app/Contents/Resources/en.lproj/OSXSoftwareLicense.rtf", "r");
|
||||
if(rtf == NULL)
|
||||
@@ -81,5 +126,6 @@ void ffDetectOSImpl(FFOSResult* os, const FFinstance* instance)
|
||||
ffStrbufAppend(&os->prettyName, &os->name);
|
||||
ffStrbufAppend(&os->versionID, &os->version);
|
||||
|
||||
parseOSXSoftwareLicense(os);
|
||||
if(!detectOSCodeName(os))
|
||||
parseOSXSoftwareLicense(os);
|
||||
}
|
||||
|
||||
@@ -207,6 +207,19 @@ static uint32_t getSnap(FFstrbuf* baseDir)
|
||||
return result > 0 ? result - 1 : 0;
|
||||
}
|
||||
|
||||
static uint32_t getFlatpak(FFstrbuf* baseDir, const char* dirname)
|
||||
{
|
||||
uint32_t baseDirLength = baseDir->length;
|
||||
ffStrbufAppendS(baseDir, dirname);
|
||||
|
||||
uint32_t result =
|
||||
getNumElements(baseDir, "/app", DT_DIR) +
|
||||
getNumElements(baseDir, "/runtime", DT_DIR);
|
||||
|
||||
ffStrbufSubstrBefore(baseDir, baseDirLength);
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifdef FF_HAVE_RPM
|
||||
#include "common/library.h"
|
||||
#include <rpm/rpmlib.h>
|
||||
@@ -258,7 +271,7 @@ static void getPackageCounts(const FFinstance* instance, FFstrbuf* baseDir, FFPa
|
||||
packageCounts->dpkg += getNumStrings(baseDir, "/var/lib/dpkg/status", "Status: ");
|
||||
packageCounts->emerge += countFilesRecursive(baseDir, "/var/db/pkg", "SIZE");
|
||||
packageCounts->eopkg += getNumElements(baseDir, "/var/lib/eopkg/package", DT_DIR);
|
||||
packageCounts->flatpakSystem += getNumElements(baseDir, "/var/lib/flatpak/app", DT_DIR);
|
||||
packageCounts->flatpakSystem += getFlatpak(baseDir, "/var/lib/flatpak");
|
||||
packageCounts->nixDefault += getNixPackages(baseDir, "/nix/var/nix/profiles/default");
|
||||
packageCounts->nixSystem += getNixPackages(baseDir, "/run/current-system");
|
||||
packageCounts->pacman += getNumElements(baseDir, "/var/lib/pacman/local", DT_DIR);
|
||||
@@ -320,7 +333,7 @@ void ffDetectPackagesImpl(const FFinstance* instance, FFPackagesResult* result)
|
||||
ffStrbufInitA(&baseDir, 512);
|
||||
ffStrbufAppendS(&baseDir, FASTFETCH_TARGET_DIR_ROOT);
|
||||
|
||||
if(ffStrbufIgnCaseCompS(&(ffDetectOS(instance)->id), "bedrock") == 0)
|
||||
if(ffStrbufIgnCaseEqualS(&ffDetectOS(instance)->id, "bedrock"))
|
||||
getPackageCountsBedrock(instance, &baseDir, result);
|
||||
else
|
||||
getPackageCountsRegular(instance, &baseDir, result);
|
||||
@@ -335,5 +348,5 @@ void ffDetectPackagesImpl(const FFinstance* instance, FFPackagesResult* result)
|
||||
|
||||
ffStrbufSet(&baseDir, &instance->state.platform.homeDir);
|
||||
result->nixUser = getNixPackages(&baseDir, "/.nix-profile");
|
||||
result->flatpakUser += getNumElements(&baseDir, "/.var/app", DT_DIR);
|
||||
result->flatpakUser = getFlatpak(&baseDir, "/.local/share/flatpak");
|
||||
}
|
||||
|
||||
@@ -5,6 +5,6 @@
|
||||
|
||||
#include "fastfetch.h"
|
||||
|
||||
uint32_t ffDetectProcesses(FFstrbuf* error);
|
||||
const char* ffDetectProcesses(uint32_t* result);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -6,15 +6,14 @@
|
||||
#include <sys/user.h>
|
||||
#endif
|
||||
|
||||
uint32_t ffDetectProcesses(FFstrbuf* error)
|
||||
const char* ffDetectProcesses(uint32_t* result)
|
||||
{
|
||||
int request[] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL};
|
||||
size_t length;
|
||||
|
||||
if(sysctl(request, sizeof(request) / sizeof(*request), NULL, &length, NULL, 0) != 0)
|
||||
{
|
||||
ffStrbufAppendS(error, "sysctl() failed");
|
||||
return 0;
|
||||
}
|
||||
return (uint32_t)(length / sizeof(struct kinfo_proc));
|
||||
return "sysctl({CTL_KERN, KERN_PROC, KERN_PROC_ALL}) failed";
|
||||
|
||||
*result = (uint32_t)(length / sizeof(struct kinfo_proc));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -2,10 +2,12 @@
|
||||
|
||||
#include <sys/sysinfo.h>
|
||||
|
||||
uint32_t ffDetectProcesses(FFstrbuf* error)
|
||||
const char* ffDetectProcesses(uint32_t* result)
|
||||
{
|
||||
struct sysinfo info;
|
||||
if(sysinfo(&info) != 0)
|
||||
ffStrbufAppendS(error, "sysinfo() failed");
|
||||
return (uint32_t) info.procs;
|
||||
return "sysinfo() failed";
|
||||
|
||||
*result = (uint32_t) info.procs;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
#include "processes.h"
|
||||
#include "util/mallocHelper.h"
|
||||
|
||||
#include <ntstatus.h>
|
||||
#include <winternl.h>
|
||||
|
||||
const char* ffDetectProcesses(uint32_t* result)
|
||||
{
|
||||
ULONG size = 0;
|
||||
if(NtQuerySystemInformation(SystemProcessInformation, NULL, 0, &size) != STATUS_INFO_LENGTH_MISMATCH)
|
||||
return "NtQuerySystemInformation(SystemProcessInformation, NULL) failed";
|
||||
|
||||
size += sizeof(SystemProcessInformation) * 5; //What if new processes are created during two syscalls?
|
||||
|
||||
SYSTEM_PROCESS_INFORMATION* FF_AUTO_FREE pstart = (SYSTEM_PROCESS_INFORMATION*)malloc(size);
|
||||
if(!pstart)
|
||||
return "malloc(size) failed";
|
||||
|
||||
if(!NT_SUCCESS(NtQuerySystemInformation(SystemProcessInformation, pstart, size, NULL)))
|
||||
return "NtQuerySystemInformation(SystemProcessInformation, pstart) failed";
|
||||
|
||||
*result = 1; //Init with 1 because we test for ptr->NextEntryOffset
|
||||
for (SYSTEM_PROCESS_INFORMATION* ptr = pstart; ptr->NextEntryOffset; ptr = (SYSTEM_PROCESS_INFORMATION*)((uint8_t*)ptr + ptr->NextEntryOffset))
|
||||
++*result;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
extern "C" {
|
||||
#include "processes.h"
|
||||
#include "util/mallocHelper.h"
|
||||
}
|
||||
|
||||
#ifdef FF_USE_WIN_NTAPI
|
||||
|
||||
#include <ntstatus.h>
|
||||
#include <winternl.h>
|
||||
|
||||
uint32_t ffDetectProcesses(FFstrbuf* error)
|
||||
{
|
||||
ULONG size = 0;
|
||||
if(NtQuerySystemInformation(SystemProcessInformation, nullptr, 0, &size) != STATUS_INFO_LENGTH_MISMATCH)
|
||||
{
|
||||
ffStrbufAppendS(error, "NtQuerySystemInformation(SystemProcessInformation, NULL) failed");
|
||||
return 0;
|
||||
}
|
||||
size += sizeof(SystemProcessInformation) * 5; //What if new processes are created during two syscalls?
|
||||
|
||||
SYSTEM_PROCESS_INFORMATION* FF_AUTO_FREE pstart = (SYSTEM_PROCESS_INFORMATION*)malloc(size);
|
||||
if(!pstart)
|
||||
{
|
||||
ffStrbufAppendF(error, "malloc(%u) failed", (unsigned)size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(!NT_SUCCESS(NtQuerySystemInformation(SystemProcessInformation, pstart, size, nullptr)))
|
||||
{
|
||||
ffStrbufAppendS(error, "NtQuerySystemInformation(SystemProcessInformation, pstart) failed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t result = 1; //Init with 1 because we test for ptr->NextEntryOffset
|
||||
for (auto ptr = pstart; ptr->NextEntryOffset; ptr = (SYSTEM_PROCESS_INFORMATION*)((uint8_t*)ptr + ptr->NextEntryOffset))
|
||||
++result;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#include "util/windows/wmi.hpp"
|
||||
|
||||
uint32_t ffDetectProcesses(FFstrbuf* error)
|
||||
{
|
||||
FFWmiQuery query(L"SELECT NumberOfProcesses FROM Win32_OperatingSystem", error);
|
||||
if(!query)
|
||||
return 0;
|
||||
|
||||
if(FFWmiRecord record = query.next())
|
||||
{
|
||||
uint64_t result = 0;
|
||||
record.getUnsigned(L"NumberOfProcesses", &result);
|
||||
return (uint32_t)result;
|
||||
}
|
||||
else
|
||||
{
|
||||
ffStrbufAppendS(error, "No Wmi result returned");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
#include "fastfetch.h"
|
||||
|
||||
#define FF_SOUND_VOLUME_UNKNOWN 255
|
||||
|
||||
typedef struct FFSoundDevice
|
||||
{
|
||||
FFstrbuf identifier;
|
||||
|
||||
@@ -44,7 +44,7 @@ const char* ffDetectSound(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* de
|
||||
FFSoundDevice* device = (FFSoundDevice*) ffListAdd(devices);
|
||||
device->main = deviceId == mainDeviceId;
|
||||
device->active = false;
|
||||
device->volume = 0;
|
||||
device->volume = FF_SOUND_VOLUME_UNKNOWN;
|
||||
ffStrbufInitF(&device->identifier, "%u", (unsigned) deviceId);
|
||||
ffStrbufInit(&device->name);
|
||||
|
||||
@@ -67,6 +67,34 @@ const char* ffDetectSound(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* de
|
||||
kAudioObjectPropertyElementMain
|
||||
}, 0, NULL, &dataSize, &volume) == kAudioHardwareNoError)
|
||||
device->volume = (uint8_t) (volume * 100 + 0.5);
|
||||
else
|
||||
{
|
||||
// Try detecting volume from channels
|
||||
uint32_t channels[2];
|
||||
dataSize = sizeof(channels);
|
||||
if (AudioObjectGetPropertyData(deviceId, &(AudioObjectPropertyAddress){
|
||||
kAudioDevicePropertyPreferredChannelsForStereo,
|
||||
kAudioObjectPropertyScopeOutput,
|
||||
kAudioObjectPropertyElementMain
|
||||
}, 0, NULL, &dataSize, channels) == kAudioHardwareNoError)
|
||||
{
|
||||
dataSize = sizeof(volume);
|
||||
if (AudioObjectGetPropertyData(deviceId, &(AudioObjectPropertyAddress){
|
||||
kAudioDevicePropertyVolumeScalar,
|
||||
kAudioObjectPropertyScopeOutput,
|
||||
channels[0]
|
||||
}, 0, NULL, &dataSize, &volume) == kAudioHardwareNoError)
|
||||
{
|
||||
float temp;
|
||||
if (AudioObjectGetPropertyData(deviceId, &(AudioObjectPropertyAddress){
|
||||
kAudioDevicePropertyVolumeScalar,
|
||||
kAudioObjectPropertyScopeOutput,
|
||||
channels[1]
|
||||
}, 0, NULL, &dataSize, &temp) == kAudioHardwareNoError)
|
||||
device->volume = (uint8_t) ((volume + temp) / 2 * 100 + 0.5);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CFStringRef name;
|
||||
|
||||
@@ -77,7 +77,7 @@ static const char* detectSound(const FFinstance* instance, FFlist* devices)
|
||||
return "Failed to connect to pulseaudio context";
|
||||
}
|
||||
|
||||
int state;
|
||||
pa_context_state_t state;
|
||||
while((state = ffpa_context_get_state(context)) != PA_CONTEXT_READY)
|
||||
{
|
||||
if(!PA_CONTEXT_IS_GOOD(state))
|
||||
|
||||
@@ -62,12 +62,10 @@ const char* ffDetectSound(FF_MAYBE_UNUSED const FFinstance* instance, FF_MAYBE_U
|
||||
FFSoundDevice* device = (FFSoundDevice*) ffListAdd(devices);
|
||||
device->main = wcscmp(mainDeviceId, immDeviceId) == 0;
|
||||
device->active = !!(immState & DEVICE_STATE_ACTIVE);
|
||||
device->volume = 0;
|
||||
ffStrbufInit(&device->identifier);
|
||||
device->volume = FF_SOUND_VOLUME_UNKNOWN;
|
||||
ffStrbufInitWS(&device->identifier, immDeviceId);
|
||||
ffStrbufInit(&device->name);
|
||||
|
||||
ffStrbufSetWS(&device->identifier, immDeviceId);
|
||||
|
||||
{
|
||||
PROPVARIANT __attribute__((__cleanup__(PropVariantClear))) friendlyName;
|
||||
PropVariantInit(&friendlyName);
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#ifndef FF_INCLUDED_detection_storage
|
||||
#define FF_INCLUDED_detection_storage
|
||||
|
||||
#include "fastfetch.h"
|
||||
|
||||
typedef struct FFMemoryStorage
|
||||
{
|
||||
FFstrbuf error;
|
||||
uint64_t bytesUsed;
|
||||
uint64_t bytesTotal;
|
||||
} FFMemoryStorage;
|
||||
|
||||
#endif
|
||||
@@ -3,8 +3,14 @@
|
||||
#ifndef FF_INCLUDED_detection_swap_swap
|
||||
#define FF_INCLUDED_detection_swap_swap
|
||||
|
||||
#include "detection/storage.h"
|
||||
#include "fastfetch.h"
|
||||
|
||||
void ffDetectSwap(FFMemoryStorage* result);
|
||||
typedef struct FFSwapResult
|
||||
{
|
||||
uint64_t bytesUsed;
|
||||
uint64_t bytesTotal;
|
||||
} FFSwapResult;
|
||||
|
||||
const char* ffDetectSwap(FFSwapResult* result);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -3,16 +3,14 @@
|
||||
#include <mach/mach.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
void ffDetectSwap(FFMemoryStorage* swap)
|
||||
const char* ffDetectSwap(FFSwapResult* swap)
|
||||
{
|
||||
struct xsw_usage xsw;
|
||||
size_t size = sizeof(xsw);
|
||||
if(sysctl((int[]){ CTL_VM, VM_SWAPUSAGE }, 2, &xsw, &size, NULL, 0) != 0)
|
||||
{
|
||||
ffStrbufAppendS(&swap->error, "Failed to read vm.swapusage");
|
||||
return;
|
||||
}
|
||||
return "Failed to read vm.swapusage";
|
||||
|
||||
swap->bytesTotal = xsw.xsu_total;
|
||||
swap->bytesUsed = xsw.xsu_used;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
#include "swap.h"
|
||||
#include "common/sysctl.h"
|
||||
|
||||
void ffDetectSwap(FFMemoryStorage* swap)
|
||||
const char* ffDetectSwap(FFSwapResult* swap)
|
||||
{
|
||||
swap->bytesTotal = (uint64_t)ffSysctlGetInt64("vm.swap_total", 0);
|
||||
swap->bytesUsed = (uint64_t)ffSysctlGetInt64("vm.swap_reserved", 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -2,12 +2,14 @@
|
||||
|
||||
#include <sys/sysinfo.h>
|
||||
|
||||
void ffDetectSwap(FFMemoryStorage* swap)
|
||||
const char* ffDetectSwap(FFSwapResult* swap)
|
||||
{
|
||||
struct sysinfo info;
|
||||
if(sysinfo(&info) != 0)
|
||||
ffStrbufAppendS(&swap->error, "sysinfo() failed");
|
||||
return "sysinfo() failed";
|
||||
|
||||
swap->bytesTotal = info.totalswap * (uint64_t) info.mem_unit;
|
||||
swap->bytesUsed = (info.totalswap - info.freeswap) * (uint64_t) info.mem_unit;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
#include "swap.h"
|
||||
#include "util/mallocHelper.h"
|
||||
|
||||
#include <winternl.h>
|
||||
#include <ntstatus.h>
|
||||
#include <windows.h>
|
||||
|
||||
const char* ffDetectSwap(FFSwapResult* swap)
|
||||
{
|
||||
SYSTEM_INFO sysInfo;
|
||||
GetNativeSystemInfo(&sysInfo);
|
||||
|
||||
ULONG size = sizeof(SYSTEM_PAGEFILE_INFORMATION);
|
||||
SYSTEM_PAGEFILE_INFORMATION* FF_AUTO_FREE pstart = (SYSTEM_PAGEFILE_INFORMATION*)malloc(size);
|
||||
while(true)
|
||||
{
|
||||
NTSTATUS status = NtQuerySystemInformation(SystemPagefileInformation, pstart, size, &size);
|
||||
if(status == STATUS_INFO_LENGTH_MISMATCH)
|
||||
{
|
||||
if(!(pstart = (SYSTEM_PAGEFILE_INFORMATION*)realloc(pstart, size)))
|
||||
return "realloc(pstart, size) failed";
|
||||
}
|
||||
else if(!NT_SUCCESS(status))
|
||||
return "NtQuerySystemInformation(SystemPagefileInformation, size) failed";
|
||||
break;
|
||||
}
|
||||
swap->bytesUsed = (uint64_t)pstart->TotalUsed * sysInfo.dwPageSize;
|
||||
swap->bytesTotal = (uint64_t)pstart->CurrentSize * sysInfo.dwPageSize;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
extern "C" {
|
||||
#include "swap.h"
|
||||
#include "util/mallocHelper.h"
|
||||
}
|
||||
|
||||
#ifdef FF_USE_WIN_NTAPI
|
||||
|
||||
#include <winternl.h>
|
||||
#include <ntstatus.h>
|
||||
#include <windows.h>
|
||||
|
||||
extern "C"
|
||||
void ffDetectSwap(FFMemoryStorage* swap)
|
||||
{
|
||||
SYSTEM_INFO sysInfo;
|
||||
GetNativeSystemInfo(&sysInfo);
|
||||
|
||||
ULONG size = sizeof(SYSTEM_PAGEFILE_INFORMATION);
|
||||
SYSTEM_PAGEFILE_INFORMATION* FF_AUTO_FREE pstart = (SYSTEM_PAGEFILE_INFORMATION*)malloc(size);
|
||||
while(true)
|
||||
{
|
||||
NTSTATUS status = NtQuerySystemInformation(SystemPagefileInformation, pstart, size, &size);
|
||||
if(status == STATUS_INFO_LENGTH_MISMATCH)
|
||||
{
|
||||
if(!(pstart = (SYSTEM_PAGEFILE_INFORMATION*)realloc(pstart, size)))
|
||||
{
|
||||
ffStrbufAppendF(&swap->error, "realloc(pstart, %lu) failed", size);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if(!NT_SUCCESS(status))
|
||||
{
|
||||
ffStrbufAppendF(&swap->error, "NtQuerySystemInformation(SystemPagefileInformation, %lu) failed", size);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
swap->bytesUsed = (uint64_t)pstart->TotalUsed * sysInfo.dwPageSize;
|
||||
swap->bytesTotal = (uint64_t)pstart->CurrentSize * sysInfo.dwPageSize;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#include "util/windows/wmi.hpp"
|
||||
|
||||
extern "C"
|
||||
void ffDetectSwapImpl(FFMemoryStorage* swap)
|
||||
{
|
||||
FFWmiQuery query(L"SELECT AllocatedBaseSize, CurrentUsage FROM Win32_PageFileUsage", &swap->error);
|
||||
if(!query)
|
||||
return;
|
||||
|
||||
if(FFWmiRecord record = query.next())
|
||||
{
|
||||
//MB
|
||||
record.getUnsigned(L"AllocatedBaseSize", &swap->bytesTotal);
|
||||
record.getUnsigned(L"CurrentUsage", &swap->bytesUsed);
|
||||
swap->bytesTotal *= 1024 * 1024;
|
||||
swap->bytesUsed *= 1024 * 1024;
|
||||
}
|
||||
else
|
||||
ffStrbufInitS(&swap->error, "No Wmi result returned");
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -287,10 +287,10 @@ static void detectFromWindowsTeriminal(const FFinstance* instance, const FFstrbu
|
||||
|
||||
FF_MAYBE_UNUSED static bool detectKitty(const FFinstance* instance, FFTerminalFontResult* result)
|
||||
{
|
||||
FFstrbuf fontName;
|
||||
FF_STRBUF_AUTO_DESTROY fontName;
|
||||
ffStrbufInit(&fontName);
|
||||
|
||||
FFstrbuf fontSize;
|
||||
FF_STRBUF_AUTO_DESTROY fontSize;
|
||||
ffStrbufInit(&fontSize);
|
||||
|
||||
FFpropquery fontQuery[] = {
|
||||
@@ -308,9 +308,6 @@ FF_MAYBE_UNUSED static bool detectKitty(const FFinstance* instance, FFTerminalFo
|
||||
|
||||
ffFontInitValues(&result->font, fontName.chars, fontSize.chars);
|
||||
|
||||
ffStrbufDestroy(&fontName);
|
||||
ffStrbufDestroy(&fontSize);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -373,6 +370,32 @@ static bool detectWezterm(FF_MAYBE_UNUSED const FFinstance* instance, FFTerminal
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool detectTabby(FF_MAYBE_UNUSED const FFinstance* instance, FFTerminalFontResult* result)
|
||||
{
|
||||
FF_STRBUF_AUTO_DESTROY fontName;
|
||||
ffStrbufInit(&fontName);
|
||||
|
||||
FF_STRBUF_AUTO_DESTROY fontSize;
|
||||
ffStrbufInit(&fontSize);
|
||||
|
||||
FFpropquery fontQuery[] = {
|
||||
{"font: ", &fontName},
|
||||
{"fontSize: ", &fontSize},
|
||||
};
|
||||
|
||||
if(!ffParsePropFileConfigValues(instance, "tabby/config.yaml", 2, fontQuery))
|
||||
return false;
|
||||
|
||||
if(fontName.length == 0)
|
||||
ffStrbufSetS(&fontName, "monospace");
|
||||
if(fontSize.length == 0)
|
||||
ffStrbufSetS(&fontSize, "14");
|
||||
|
||||
ffFontInitValues(&result->font, fontName.chars, fontSize.chars);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ffDetectTerminalFontPlatform(const FFinstance* instance, const FFTerminalShellResult* terminalShell, FFTerminalFontResult* terminalFont);
|
||||
|
||||
static bool detectTerminalFontCommon(const FFinstance* instance, const FFTerminalShellResult* terminalShell, FFTerminalFontResult* terminalFont)
|
||||
@@ -383,8 +406,12 @@ static bool detectTerminalFontCommon(const FFinstance* instance, const FFTermina
|
||||
detectTerminator(instance, terminalFont);
|
||||
else if(ffStrbufStartsWithIgnCaseS(&terminalShell->terminalProcessName, "wezterm-gui"))
|
||||
detectWezterm(instance, terminalFont);
|
||||
else if(ffStrbufStartsWithIgnCaseS(&terminalShell->terminalProcessName, "tabby"))
|
||||
detectTabby(instance, terminalFont);
|
||||
|
||||
#ifndef _WIN32
|
||||
else if(ffStrbufStartsWithIgnCaseS(&terminalShell->terminalExe, "/dev/pts/"))
|
||||
ffStrbufAppendS(&terminalFont->error, "Terminal font detection is not supported on PTS");
|
||||
else if(ffStrbufIgnCaseEqualS(&terminalShell->terminalProcessName, "kitty"))
|
||||
detectKitty(instance, terminalFont);
|
||||
else if(ffStrbufStartsWithIgnCaseS(&terminalShell->terminalExe, "/dev/tty"))
|
||||
|
||||
@@ -86,7 +86,8 @@ static void detectWarpTerminal(const FFinstance* instance, FFTerminalFontResult*
|
||||
|
||||
void ffDetectTerminalFontPlatform(const FFinstance* instance, const FFTerminalShellResult* terminalShell, FFTerminalFontResult* terminalFont)
|
||||
{
|
||||
if(ffStrbufIgnCaseCompS(&terminalShell->terminalProcessName, "iterm.app") == 0)
|
||||
if(ffStrbufIgnCaseCompS(&terminalShell->terminalProcessName, "iterm.app") == 0 ||
|
||||
ffStrbufStartsWithIgnCaseS(&terminalShell->terminalProcessName, "iTermServer-"))
|
||||
detectIterm2(instance, terminalFont);
|
||||
else if(ffStrbufIgnCaseCompS(&terminalShell->terminalProcessName, "Apple_Terminal") == 0)
|
||||
detectAppleTerminal(terminalFont);
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
#include "util/mallocHelper.h"
|
||||
|
||||
#include <winver.h>
|
||||
|
||||
static bool getFileVersion(const char* exePath, FFstrbuf* version)
|
||||
@@ -13,7 +15,7 @@ static bool getFileVersion(const char* exePath, FFstrbuf* version)
|
||||
DWORD size = GetFileVersionInfoSizeA(exePath, &handle);
|
||||
if(size > 0)
|
||||
{
|
||||
void* versionData = malloc(size);
|
||||
FF_AUTO_FREE void* versionData = malloc(size);
|
||||
if(GetFileVersionInfoA(exePath, handle, size, versionData))
|
||||
{
|
||||
VS_FIXEDFILEINFO* verInfo;
|
||||
@@ -26,11 +28,9 @@ static bool getFileVersion(const char* exePath, FFstrbuf* version)
|
||||
(unsigned)(( verInfo->dwFileVersionLS >> 16 ) & 0xffff),
|
||||
(unsigned)(( verInfo->dwFileVersionLS >> 0 ) & 0xffff)
|
||||
);
|
||||
free(versionData);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
free(versionData);
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -136,6 +136,11 @@ bool fftsGetShellVersion(FFstrbuf* exe, const char* exeName, FFstrbuf* version)
|
||||
return getExeVersionGeneral(exe, version); //tcsh 6.24.07 (Astron) 2022-12-21 (aarch64-apple-darwin) options wide,nls,dl,al,kan,sm,rh,color,filec
|
||||
if(strcasecmp(exeName, "nu") == 0)
|
||||
return getExeVersionRaw(exe, version); //0.73.0
|
||||
if(strcasecmp(exeName, "python") == 0 && getenv("XONSH_VERSION"))
|
||||
{
|
||||
ffStrbufSetS(version, getenv("XONSH_VERSION"));
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
if(strcasecmp(exeName, "powershell") == 0 || strcasecmp(exeName, "powershell_ise") == 0)
|
||||
@@ -190,11 +195,7 @@ FF_MAYBE_UNUSED static bool getTerminalVersionKonsole(FFstrbuf* exe, FFstrbuf* v
|
||||
|
||||
FF_MAYBE_UNUSED static bool getTerminalVersionFoot(FFstrbuf* exe, FFstrbuf* version)
|
||||
{
|
||||
if(ffProcessAppendStdOut(version, (char* const[]){
|
||||
exe->chars,
|
||||
"--version",
|
||||
NULL
|
||||
})) return false;
|
||||
if(!getExeVersionRaw(exe, version)) return false;
|
||||
|
||||
//foot version: 1.13.1 -pgo +ime -graphemes -assertions
|
||||
ffStrbufSubstrAfterFirstS(version, "version: ");
|
||||
@@ -274,6 +275,9 @@ bool fftsGetTerminalVersion(FFstrbuf* processName, FF_MAYBE_UNUSED FFstrbuf* exe
|
||||
if(ffStrbufIgnCaseEqualS(processName, "kitty"))
|
||||
return getExeVersionGeneral(exe, version); //kitty 0.21.2 created by Kovid Goyal
|
||||
|
||||
if (ffStrbufIgnCaseEqualS(processName, "Tabby") && getExeVersionRaw(exe, version))
|
||||
return true;
|
||||
|
||||
#endif
|
||||
|
||||
if(ffStrbufStartsWithIgnCaseS(processName, "alacritty"))
|
||||
@@ -286,7 +290,8 @@ bool fftsGetTerminalVersion(FFstrbuf* processName, FF_MAYBE_UNUSED FFstrbuf* exe
|
||||
if(termProgram)
|
||||
{
|
||||
if(ffStrbufStartsWithIgnCaseS(processName, termProgram) || // processName ends with `.exe` on Windows
|
||||
(strcmp(termProgram, "vscode") == 0 && ffStrbufStartsWithIgnCaseS(processName, "code"))
|
||||
(strcmp(termProgram, "vscode") == 0 && ffStrbufStartsWithIgnCaseS(processName, "code")) ||
|
||||
(strcmp(termProgram, "iTerm.app") == 0 && ffStrbufStartsWithIgnCaseS(processName, "iTermServer-"))
|
||||
) {
|
||||
ffStrbufSetS(version, termProgramVersion);
|
||||
return true;
|
||||
|
||||
@@ -148,7 +148,7 @@ static void getTerminalShell(FFTerminalShellResult* result, pid_t pid)
|
||||
}
|
||||
|
||||
//Known shells
|
||||
if(
|
||||
if (
|
||||
strcasecmp(name, "bash") == 0 ||
|
||||
strcasecmp(name, "zsh") == 0 ||
|
||||
strcasecmp(name, "ksh") == 0 ||
|
||||
@@ -158,7 +158,8 @@ static void getTerminalShell(FFTerminalShellResult* result, pid_t pid)
|
||||
strcasecmp(name, "dash") == 0 ||
|
||||
strcasecmp(name, "pwsh") == 0 ||
|
||||
strcasecmp(name, "nu") == 0 ||
|
||||
strcasecmp(name, "git-shell") == 0
|
||||
strcasecmp(name, "git-shell") == 0 ||
|
||||
(strcasecmp(name, "python") == 0 && getenv("XONSH_VERSION"))
|
||||
) {
|
||||
if (result->shellProcessName.length == 0)
|
||||
{
|
||||
@@ -369,13 +370,15 @@ const FFTerminalShellResult* ffDetectTerminalShell(const FFinstance* instance)
|
||||
ffStrbufInitS(&result.shellPrettyName, "PowerShell");
|
||||
else if(ffStrbufEqualS(&result.shellProcessName, "nu"))
|
||||
ffStrbufInitS(&result.shellPrettyName, "nushell");
|
||||
else if(ffStrbufIgnCaseEqualS(&result.shellProcessName, "python") && getenv("XONSH_VERSION"))
|
||||
ffStrbufInitS(&result.shellPrettyName, "xonsh");
|
||||
else
|
||||
{
|
||||
// https://github.com/LinusDierheimer/fastfetch/discussions/280#discussioncomment-3831734
|
||||
ffStrbufInitS(&result.shellPrettyName, result.shellExeName);
|
||||
}
|
||||
|
||||
if(ffStrbufEqualS(&result.terminalProcessName, "iTerm.app"))
|
||||
if(ffStrbufEqualS(&result.terminalProcessName, "iTerm.app") || ffStrbufStartsWithS(&result.terminalProcessName, "iTermServer-"))
|
||||
ffStrbufInitS(&result.terminalPrettyName, "iTerm");
|
||||
else if(ffStrbufEqualS(&result.terminalProcessName, "Apple_Terminal"))
|
||||
ffStrbufInitS(&result.terminalPrettyName, "Apple Terminal");
|
||||
|
||||
+45
-91
@@ -1,19 +1,41 @@
|
||||
extern "C" {
|
||||
#include "terminalshell.h"
|
||||
#include "common/processing.h"
|
||||
#include "common/thread.h"
|
||||
#include "util/mallocHelper.h"
|
||||
}
|
||||
|
||||
#include <windows.h>
|
||||
#include <wchar.h>
|
||||
#include <tlhelp32.h>
|
||||
|
||||
#ifdef FF_USE_WIN_NTAPI
|
||||
|
||||
#include <ntstatus.h>
|
||||
#include <winternl.h>
|
||||
|
||||
static bool getProductVersion(const wchar_t* filePath, FFstrbuf* version)
|
||||
{
|
||||
DWORD handle;
|
||||
DWORD size = GetFileVersionInfoSizeW(filePath, &handle);
|
||||
if(size > 0)
|
||||
{
|
||||
FF_AUTO_FREE void* versionData = malloc(size);
|
||||
if(GetFileVersionInfoW(filePath, handle, size, versionData))
|
||||
{
|
||||
VS_FIXEDFILEINFO* verInfo;
|
||||
UINT len;
|
||||
if(VerQueryValueW(versionData, L"\\", (void**)&verInfo, &len) && len && verInfo->dwSignature == 0xFEEF04BD)
|
||||
{
|
||||
ffStrbufAppendF(version, "%u.%u.%u.%u",
|
||||
(unsigned)(( verInfo->dwProductVersionMS >> 16 ) & 0xffff),
|
||||
(unsigned)(( verInfo->dwProductVersionMS >> 0 ) & 0xffff),
|
||||
(unsigned)(( verInfo->dwProductVersionLS >> 16 ) & 0xffff),
|
||||
(unsigned)(( verInfo->dwProductVersionLS >> 0 ) & 0xffff)
|
||||
);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool getProcessInfo(uint32_t pid, uint32_t* ppid, FFstrbuf* pname, FFstrbuf* exe, const char** exeName)
|
||||
{
|
||||
HANDLE hProcess = pid == 0
|
||||
@@ -59,7 +81,7 @@ static bool getProcessInfo(uint32_t pid, uint32_t* ppid, FFstrbuf* pname, FFstrb
|
||||
static bool getTerminalInfoByEnumeratingChildProcesses(FFTerminalShellResult* result, uint32_t ppid)
|
||||
{
|
||||
ULONG size = 0;
|
||||
if(NtQuerySystemInformation(SystemProcessInformation, nullptr, 0, &size) != STATUS_INFO_LENGTH_MISMATCH)
|
||||
if(NtQuerySystemInformation(SystemProcessInformation, NULL, 0, &size) != STATUS_INFO_LENGTH_MISMATCH)
|
||||
return false;
|
||||
|
||||
size += sizeof(SystemProcessInformation) * 5; //What if new processes are created during two syscalls?
|
||||
@@ -68,12 +90,12 @@ static bool getTerminalInfoByEnumeratingChildProcesses(FFTerminalShellResult* re
|
||||
if(!pstart)
|
||||
return false;
|
||||
|
||||
if(!NT_SUCCESS(NtQuerySystemInformation(SystemProcessInformation, pstart, size, nullptr)))
|
||||
if(!NT_SUCCESS(NtQuerySystemInformation(SystemProcessInformation, pstart, size, NULL)))
|
||||
return false;
|
||||
|
||||
uint32_t currentProcessId = (uint32_t) GetCurrentProcessId();
|
||||
|
||||
for (auto ptr = pstart; ptr->NextEntryOffset; ptr = (SYSTEM_PROCESS_INFORMATION*)((uint8_t*)ptr + ptr->NextEntryOffset))
|
||||
for (SYSTEM_PROCESS_INFORMATION* ptr = pstart; ptr->NextEntryOffset; ptr = (SYSTEM_PROCESS_INFORMATION*)((uint8_t*)ptr + ptr->NextEntryOffset))
|
||||
{
|
||||
if ((uint32_t)(uintptr_t) ptr->InheritedFromUniqueProcessId != ppid)
|
||||
continue;
|
||||
@@ -82,7 +104,7 @@ static bool getTerminalInfoByEnumeratingChildProcesses(FFTerminalShellResult* re
|
||||
if (pid == currentProcessId)
|
||||
continue;
|
||||
|
||||
if(!getProcessInfo(pid, nullptr, &result->terminalProcessName, &result->terminalExe, &result->terminalExeName))
|
||||
if(!getProcessInfo(pid, NULL, &result->terminalProcessName, &result->terminalExe, &result->terminalExeName))
|
||||
return false;
|
||||
|
||||
result->terminalPid = pid;
|
||||
@@ -95,77 +117,7 @@ static bool getTerminalInfoByEnumeratingChildProcesses(FFTerminalShellResult* re
|
||||
return false;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#include "util/windows/wmi.hpp"
|
||||
#include <inttypes.h>
|
||||
|
||||
static bool getProcessInfo(uint32_t pid, uint32_t* ppid, FFstrbuf* pname, FFstrbuf* exe, const char** exeName)
|
||||
{
|
||||
if(pid == 0)
|
||||
pid = GetCurrentProcessId();
|
||||
|
||||
wchar_t sql[256] = {};
|
||||
swprintf(sql, 256, L"SELECT %ls %ls ParentProcessId FROM Win32_Process WHERE ProcessId = %" PRIu32,
|
||||
pname ? L"Name," : L"",
|
||||
pname ? L"ExecutablePath," : L"",
|
||||
pid);
|
||||
|
||||
FFWmiQuery query(sql);
|
||||
if(!query)
|
||||
return false;
|
||||
|
||||
if(FFWmiRecord record = query.next())
|
||||
{
|
||||
if(ppid)
|
||||
{
|
||||
uint64_t value;
|
||||
record.getUnsigned(L"ParentProcessId", &value);
|
||||
*ppid = (uint32_t) value;
|
||||
}
|
||||
|
||||
if(pname)
|
||||
record.getString(L"Name", pname);
|
||||
|
||||
if(exe)
|
||||
record.getString(L"ExecutablePath", exe);
|
||||
|
||||
if(exeName)
|
||||
*exeName = exe->chars + ffStrbufLastIndexC(exe, '\\') + 1;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool getTerminalInfoByEnumeratingChildProcesses(FFTerminalShellResult* result, uint32_t ppid)
|
||||
{
|
||||
wchar_t sql[256] = {};
|
||||
swprintf(sql, 256, L"SELECT Name, ExecutablePath, ProcessId FROM Win32_Process WHERE ProcessId <> %" PRIu32 " AND ParentProcessId = %" PRIu32,
|
||||
(uint32_t) GetCurrentProcessId(),
|
||||
ppid);
|
||||
|
||||
FFWmiQuery query(sql);
|
||||
if(!query)
|
||||
return false;
|
||||
|
||||
if(FFWmiRecord record = query.next())
|
||||
{
|
||||
record.getString(L"Name", &result->terminalProcessName);
|
||||
record.getString(L"ExecutablePath", &result->terminalExe);
|
||||
result->terminalExeName = result->terminalExe.chars + ffStrbufLastIndexC(&result->terminalExe, '\\') + 1;
|
||||
uint64_t pid;
|
||||
record.getUnsigned(L"ProcessId", &pid);
|
||||
result->terminalPid = (uint32_t) pid;
|
||||
ffStrbufSet(&result->terminalPrettyName, &result->terminalProcessName);
|
||||
if(ffStrbufEndsWithIgnCaseS(&result->terminalPrettyName, ".exe"))
|
||||
ffStrbufSubstrBefore(&result->terminalPrettyName, result->terminalPrettyName.length - 4);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
extern "C" bool fftsGetShellVersion(FFstrbuf* exe, const char* exeName, FFstrbuf* version);
|
||||
bool fftsGetShellVersion(FFstrbuf* exe, const char* exeName, FFstrbuf* version);
|
||||
|
||||
static uint32_t getShellInfo(const FFinstance* instance, FFTerminalShellResult* result, uint32_t pid)
|
||||
{
|
||||
@@ -195,7 +147,7 @@ static uint32_t getShellInfo(const FFinstance* instance, FFTerminalShellResult*
|
||||
ffStrbufClear(&result->shellProcessName);
|
||||
ffStrbufClear(&result->shellPrettyName);
|
||||
ffStrbufClear(&result->shellExe);
|
||||
result->shellExeName = nullptr;
|
||||
result->shellExeName = NULL;
|
||||
return getShellInfo(instance, result, ppid);
|
||||
}
|
||||
|
||||
@@ -225,7 +177,9 @@ static uint32_t getShellInfo(const FFinstance* instance, FFTerminalShellResult*
|
||||
{
|
||||
if(wcsncmp(module.szModule, L"clink_dll_", strlen("clink_dll_")) == 0)
|
||||
{
|
||||
ffStrbufAppendS(&result->shellPrettyName, "CMD (with Clink)");
|
||||
ffStrbufAppendS(&result->shellPrettyName, "CMD (with Clink ");
|
||||
getProductVersion(module.szExePath, &result->shellPrettyName);
|
||||
ffStrbufAppendC(&result->shellPrettyName, ')');
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -316,23 +270,23 @@ static void getTerminalFromEnv(FFTerminalShellResult* result)
|
||||
ffStrbufIgnCaseCompS(&result->terminalProcessName, "explorer") != 0
|
||||
) return;
|
||||
|
||||
const char* term = nullptr;
|
||||
const char* term = NULL;
|
||||
|
||||
//SSH
|
||||
if(getenv("SSH_CONNECTION") != nullptr)
|
||||
if(getenv("SSH_CONNECTION") != NULL)
|
||||
term = getenv("SSH_TTY");
|
||||
|
||||
//Windows Terminal
|
||||
if(!term && (
|
||||
getenv("WT_SESSION") != nullptr ||
|
||||
getenv("WT_PROFILE_ID") != nullptr
|
||||
getenv("WT_SESSION") != NULL ||
|
||||
getenv("WT_PROFILE_ID") != NULL
|
||||
)) term = "Windows Terminal";
|
||||
|
||||
//Alacritty
|
||||
if(!term && (
|
||||
getenv("ALACRITTY_SOCKET") != nullptr ||
|
||||
getenv("ALACRITTY_LOG") != nullptr ||
|
||||
getenv("ALACRITTY_WINDOW_ID") != nullptr
|
||||
getenv("ALACRITTY_SOCKET") != NULL ||
|
||||
getenv("ALACRITTY_LOG") != NULL ||
|
||||
getenv("ALACRITTY_WINDOW_ID") != NULL
|
||||
)) term = "Alacritty";
|
||||
|
||||
if(!term)
|
||||
@@ -351,7 +305,7 @@ static void getTerminalFromEnv(FFTerminalShellResult* result)
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" bool fftsGetTerminalVersion(FFstrbuf* processName, FFstrbuf* exe, FFstrbuf* version);
|
||||
bool fftsGetTerminalVersion(FFstrbuf* processName, FFstrbuf* exe, FFstrbuf* version);
|
||||
|
||||
const FFTerminalShellResult* ffDetectTerminalShell(const FFinstance* instance)
|
||||
{
|
||||
@@ -386,7 +340,7 @@ const FFTerminalShellResult* ffDetectTerminalShell(const FFinstance* instance)
|
||||
ffStrbufInit(&result.userShellVersion);
|
||||
|
||||
uint32_t ppid;
|
||||
if(!getProcessInfo(0, &ppid, nullptr, nullptr, nullptr))
|
||||
if(!getProcessInfo(0, &ppid, NULL, NULL, NULL))
|
||||
goto exit;
|
||||
|
||||
ppid = getShellInfo(instance, &result, ppid);
|
||||
@@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#ifndef FF_INCLUDED_detection_theme
|
||||
#define FF_INCLUDED_detection_theme
|
||||
|
||||
#include "fastfetch.h"
|
||||
|
||||
const char* ffDetectTheme(const FFinstance* instance, FFstrbuf* result);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,69 @@
|
||||
#include "theme.h"
|
||||
#include "common/parsing.h"
|
||||
#include "detection/gtk_qt/gtk_qt.h"
|
||||
#include "detection/displayserver/displayserver.h"
|
||||
|
||||
const char* ffDetectTheme(const FFinstance* instance, FFstrbuf* result)
|
||||
{
|
||||
const FFDisplayServerResult* wmde = ffConnectDisplayServer(instance);
|
||||
|
||||
if(ffStrbufIgnCaseCompS(&wmde->wmProtocolName, FF_WM_PROTOCOL_TTY) == 0)
|
||||
return "Theme isn't supported in TTY";
|
||||
|
||||
const FFQtResult* plasma = ffDetectQt(instance);
|
||||
const FFstrbuf* gtk2 = &ffDetectGTK2(instance)->theme;
|
||||
const FFstrbuf* gtk3 = &ffDetectGTK3(instance)->theme;
|
||||
const FFstrbuf* gtk4 = &ffDetectGTK4(instance)->theme;
|
||||
|
||||
if(plasma->widgetStyle.length == 0 && plasma->colorScheme.length == 0 && gtk2->length == 0 && gtk3->length == 0 && gtk4->length == 0)
|
||||
return "No themes found";
|
||||
|
||||
FF_STRBUF_AUTO_DESTROY plasmaColorPretty;
|
||||
ffStrbufInit(&plasmaColorPretty);
|
||||
if(ffStrbufStartsWithIgnCase(&plasma->colorScheme, &plasma->widgetStyle))
|
||||
ffStrbufAppendNS(&plasmaColorPretty, plasma->colorScheme.length - plasma->widgetStyle.length, &plasma->colorScheme.chars[plasma->widgetStyle.length]);
|
||||
else
|
||||
ffStrbufAppend(&plasmaColorPretty, &plasma->colorScheme);
|
||||
|
||||
ffStrbufTrim(&plasmaColorPretty, ' ');
|
||||
|
||||
FF_STRBUF_AUTO_DESTROY gtkPretty;
|
||||
ffStrbufInit(>kPretty);
|
||||
ffParseGTK(>kPretty, gtk2, gtk3, gtk4);
|
||||
|
||||
if(plasma->widgetStyle.length > 0)
|
||||
{
|
||||
ffStrbufAppend(result, &plasma->widgetStyle);
|
||||
|
||||
if(plasma->colorScheme.length > 0)
|
||||
{
|
||||
ffStrbufAppendS(result, " (");
|
||||
|
||||
if(plasmaColorPretty.length > 0)
|
||||
ffStrbufAppend(result, &plasmaColorPretty);
|
||||
else
|
||||
ffStrbufAppend(result, &plasma->colorScheme);
|
||||
|
||||
ffStrbufAppendC(result, ')');
|
||||
}
|
||||
}
|
||||
else if(plasma->colorScheme.length > 0)
|
||||
{
|
||||
if(plasmaColorPretty.length > 0)
|
||||
ffStrbufAppend(result, &plasmaColorPretty);
|
||||
else
|
||||
ffStrbufAppend(result, &plasma->colorScheme);
|
||||
}
|
||||
|
||||
if(plasma->widgetStyle.length > 0 || plasma->colorScheme.length > 0)
|
||||
{
|
||||
ffStrbufAppendS(result, " [QT]");
|
||||
|
||||
if(gtkPretty.length > 0)
|
||||
ffStrbufAppendS(result, ", ");
|
||||
}
|
||||
|
||||
ffStrbufAppend(result, >kPretty);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
#include "theme.h"
|
||||
|
||||
const char* ffDetectTheme(FF_MAYBE_UNUSED const FFinstance* instance, FF_MAYBE_UNUSED FFstrbuf* result)
|
||||
{
|
||||
return "Not supported on this platform";
|
||||
}
|
||||
@@ -176,8 +176,17 @@ static const char* detectVulkan(const FFinstance* instance, FFVulkanResult* resu
|
||||
if(physicalDeviceProperties.properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_CPU)
|
||||
continue;
|
||||
|
||||
// #456
|
||||
FF_LIST_FOR_EACH(FFGPUResult, gpu, result->gpus)
|
||||
{
|
||||
if (gpu->vulkanDeviceId == physicalDeviceProperties.properties.deviceID)
|
||||
goto next;
|
||||
}
|
||||
|
||||
FFGPUResult* gpu = ffListAdd(&result->gpus);
|
||||
|
||||
gpu->vulkanDeviceId = physicalDeviceProperties.properties.deviceID;
|
||||
|
||||
ffStrbufInit(&gpu->name);
|
||||
ffStrbufAppendS(&gpu->name, physicalDeviceProperties.properties.deviceName);
|
||||
|
||||
@@ -215,6 +224,9 @@ static const char* detectVulkan(const FFinstance* instance, FFVulkanResult* resu
|
||||
//No way to detect those using vulkan
|
||||
gpu->coreCount = FF_GPU_CORE_COUNT_UNSET;
|
||||
gpu->temperature = FF_GPU_TEMP_UNSET;
|
||||
|
||||
next:
|
||||
continue;
|
||||
}
|
||||
|
||||
//If the highest device version is lower than the instance version, use it as our vulkan version
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#ifndef FF_INCLUDED_detection_wallpaper
|
||||
#define FF_INCLUDED_detection_wallpaper
|
||||
|
||||
#include "fastfetch.h"
|
||||
|
||||
const char* ffDetectWallpaper(const FFinstance* instance, FFstrbuf* result);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,31 @@
|
||||
#include "wallpaper.h"
|
||||
#include "common/settings.h"
|
||||
#include "util/apple/osascript.h"
|
||||
|
||||
const char* ffDetectWallpaper(FF_MAYBE_UNUSED const FFinstance* instance, FFstrbuf* result)
|
||||
{
|
||||
// https://stackoverflow.com/questions/301215/getting-desktop-background-on-mac
|
||||
|
||||
#ifdef FF_HAVE_SQLITE3
|
||||
|
||||
FF_STRBUF_AUTO_DESTROY path;
|
||||
ffStrbufInitCopy(&path, &instance->state.platform.homeDir);
|
||||
ffStrbufAppendS(&path, "Library/Application Support/Dock/desktoppicture.db");
|
||||
if (ffSettingsGetSQLite3String(instance, path.chars,
|
||||
"SELECT value\n"
|
||||
"FROM preferences\n"
|
||||
"JOIN data ON preferences.data_id=data.ROWID\n"
|
||||
"JOIN pictures ON preferences.picture_id=pictures.ROWID\n"
|
||||
"JOIN displays ON pictures.display_id=displays.ROWID\n"
|
||||
"JOIN spaces ON pictures.space_id=spaces.ROWID\n"
|
||||
"WHERE display_id=1 AND space_id=1 AND key=1", result)
|
||||
)
|
||||
return NULL;
|
||||
|
||||
#endif
|
||||
|
||||
if (!ffOsascript("tell application \"Finder\" to get POSIX path of (get desktop picture as alias)", result))
|
||||
return "ffOsascript() failed";
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
#include "wallpaper.h"
|
||||
#include "common/settings.h"
|
||||
#include "detection/gtk_qt/gtk_qt.h"
|
||||
|
||||
const char* ffDetectWallpaper(const FFinstance* instance, FFstrbuf* result)
|
||||
{
|
||||
const FFGTKResult* gtk = ffDetectGTK4(instance);
|
||||
if (!gtk->wallpaper.length)
|
||||
return "Failed to detect the current wallpaper path";
|
||||
|
||||
if (ffStrbufStartsWithS(>k->wallpaper, "file:///"))
|
||||
ffStrbufAppendS(result, gtk->wallpaper.chars + strlen("file://"));
|
||||
else
|
||||
ffStrbufAppend(result, >k->wallpaper);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
#include "wallpaper.h"
|
||||
|
||||
const char* ffDetectWallpaper(FF_MAYBE_UNUSED const FFinstance* instance, FF_MAYBE_UNUSED FFstrbuf* result)
|
||||
{
|
||||
return "Not supported on this platform";
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
#include "wallpaper.h"
|
||||
#include "util/windows/registry.h"
|
||||
|
||||
const char* ffDetectWallpaper(FF_MAYBE_UNUSED const FFinstance* instance, FFstrbuf* result)
|
||||
{
|
||||
FF_HKEY_AUTO_DESTROY hKey = NULL;
|
||||
if(!ffRegOpenKeyForRead(HKEY_CURRENT_USER, L"Control Panel\\Desktop", &hKey, NULL))
|
||||
return "ffRegOpenKeyForRead(Control Panel\\Desktop) failed";
|
||||
|
||||
if(!ffRegReadStrbuf(hKey, L"WallPaper", result, NULL))
|
||||
return "ffRegReadStrbuf(WallPaper) failed";
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@@ -72,7 +72,7 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* res
|
||||
WLAN_INTERFACE_INFO* ifInfo = (WLAN_INTERFACE_INFO*)&ifList->InterfaceInfo[index];
|
||||
|
||||
FFWifiResult* item = (FFWifiResult*)ffListAdd(result);
|
||||
ffStrbufInit(&item->inf.description);
|
||||
ffStrbufInitWS(&item->inf.description, ifInfo->strInterfaceDescription);
|
||||
ffStrbufInit(&item->inf.status);
|
||||
ffStrbufInit(&item->conn.status);
|
||||
ffStrbufInit(&item->conn.ssid);
|
||||
@@ -83,7 +83,6 @@ const char* ffDetectWifi(FF_MAYBE_UNUSED const FFinstance* instance, FFlist* res
|
||||
item->conn.rxRate = 0.0/0.0;
|
||||
item->conn.txRate = 0.0/0.0;
|
||||
|
||||
ffStrbufSetWS(&item->inf.description, ifInfo->strInterfaceDescription);
|
||||
convertIfStateToString(ifInfo->isState, &item->inf.status);
|
||||
|
||||
if(ifInfo->isState != wlan_interface_state_connected)
|
||||
|
||||
+33
-37
@@ -15,6 +15,8 @@
|
||||
#include "util/windows/getline.h"
|
||||
#endif
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wsign-conversion"
|
||||
|
||||
typedef struct CustomValue
|
||||
{
|
||||
bool printKey;
|
||||
@@ -207,24 +209,20 @@ static inline void printCommandHelp(const char* command)
|
||||
}
|
||||
else if(strcasecmp(command, "theme-format") == 0)
|
||||
{
|
||||
constructAndPrintCommandHelpFormat("theme", "{} ({3}) [Plasma], {7}", 7,
|
||||
"Plasma theme",
|
||||
"Plasma color scheme",
|
||||
"Plasma color scheme pretty",
|
||||
"GTK2 theme",
|
||||
"GTK3 theme",
|
||||
"GTK4 theme",
|
||||
"Combined GTK themes"
|
||||
constructAndPrintCommandHelpFormat("theme", "{}", 1,
|
||||
"Combined themes"
|
||||
);
|
||||
}
|
||||
else if(strcasecmp(command, "icons-format") == 0)
|
||||
{
|
||||
constructAndPrintCommandHelpFormat("icons", "{} [Plasma], {5}", 5,
|
||||
"Plasma icons",
|
||||
"GTK2 icons",
|
||||
"GTK3 icons",
|
||||
"GTK4 icons",
|
||||
"Combined GTK icons"
|
||||
constructAndPrintCommandHelpFormat("icons", "{}", 1,
|
||||
"Combined icons"
|
||||
);
|
||||
}
|
||||
else if(strcasecmp(command, "wallpaper-format") == 0)
|
||||
{
|
||||
constructAndPrintCommandHelpFormat("wallpaper", "{}", 1,
|
||||
"Wallpaper image file"
|
||||
);
|
||||
}
|
||||
else if(strcasecmp(command, "font-format") == 0)
|
||||
@@ -385,7 +383,7 @@ static inline void printCommandHelp(const char* command)
|
||||
constructAndPrintCommandHelpFormat("player", "{}", 4,
|
||||
"Pretty player name",
|
||||
"Player name",
|
||||
"DBus bus name",
|
||||
"Player Identifier",
|
||||
"URL name"
|
||||
);
|
||||
}
|
||||
@@ -1149,6 +1147,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con
|
||||
else if(optionParseModuleArgs(key, value, "wm-theme", &instance->config.wmTheme)) {}
|
||||
else if(optionParseModuleArgs(key, value, "theme", &instance->config.theme)) {}
|
||||
else if(optionParseModuleArgs(key, value, "icons", &instance->config.icons)) {}
|
||||
else if(optionParseModuleArgs(key, value, "wallpaper", &instance->config.wallpaper)) {}
|
||||
else if(optionParseModuleArgs(key, value, "font", &instance->config.font)) {}
|
||||
else if(optionParseModuleArgs(key, value, "cursor", &instance->config.cursor)) {}
|
||||
else if(optionParseModuleArgs(key, value, "terminal", &instance->config.terminal)) {}
|
||||
@@ -1162,8 +1161,8 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con
|
||||
else if(optionParseModuleArgs(key, value, "battery", &instance->config.battery)) {}
|
||||
else if(optionParseModuleArgs(key, value, "poweradapter", &instance->config.powerAdapter)) {}
|
||||
else if(optionParseModuleArgs(key, value, "locale", &instance->config.locale)) {}
|
||||
else if(optionParseModuleArgs(key, value, "local-ip", &instance->config.localIP)) {}
|
||||
else if(optionParseModuleArgs(key, value, "public-ip", &instance->config.publicIP)) {}
|
||||
else if(optionParseModuleArgs(key, value, "localip", &instance->config.localIP)) {}
|
||||
else if(optionParseModuleArgs(key, value, "publicip", &instance->config.publicIP)) {}
|
||||
else if(optionParseModuleArgs(key, value, "weather", &instance->config.weather)) {}
|
||||
else if(optionParseModuleArgs(key, value, "player", &instance->config.player)) {}
|
||||
else if(optionParseModuleArgs(key, value, "media", &instance->config.media)) {}
|
||||
@@ -1263,14 +1262,16 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con
|
||||
instance->config.terminalVersion = optionParseBoolean(value);
|
||||
else if(strcasecmp(key, "--disk-folders") == 0)
|
||||
optionParseString(key, value, &instance->config.diskFolders);
|
||||
else if(strcasecmp(key, "--disk-show-regular") == 0)
|
||||
optionParseBoolean(value) ? (instance->config.diskShowTypes |= FF_DISK_TYPE_REGULAR_BIT) : (instance->config.diskShowTypes &= ~FF_DISK_TYPE_REGULAR_BIT);
|
||||
else if(strcasecmp(key, "--disk-show-removable") == 0)
|
||||
instance->config.diskShowRemovable = optionParseBoolean(value);
|
||||
optionParseBoolean(value) ? (instance->config.diskShowTypes |= FF_DISK_TYPE_EXTERNAL_BIT) : (instance->config.diskShowTypes &= ~FF_DISK_TYPE_EXTERNAL_BIT);
|
||||
else if(strcasecmp(key, "--disk-show-hidden") == 0)
|
||||
instance->config.diskShowHidden = optionParseBoolean(value);
|
||||
optionParseBoolean(value) ? (instance->config.diskShowTypes |= FF_DISK_TYPE_HIDDEN_BIT) : (instance->config.diskShowTypes &= ~FF_DISK_TYPE_HIDDEN_BIT);
|
||||
else if(strcasecmp(key, "--disk-show-subvolumes") == 0)
|
||||
instance->config.diskShowSubvolumes = optionParseBoolean(value);
|
||||
optionParseBoolean(value) ? (instance->config.diskShowTypes |= FF_DISK_TYPE_SUBVOLUME_BIT) : (instance->config.diskShowTypes &= ~FF_DISK_TYPE_SUBVOLUME_BIT);
|
||||
else if(strcasecmp(key, "--disk-show-unknown") == 0)
|
||||
instance->config.diskShowUnknown = optionParseBoolean(value);
|
||||
optionParseBoolean(value) ? (instance->config.diskShowTypes |= FF_DISK_TYPE_UNKNOWN_BIT) : (instance->config.diskShowTypes &= ~FF_DISK_TYPE_UNKNOWN_BIT);
|
||||
else if(strcasecmp(key, "--display-compact-type") == 0)
|
||||
{
|
||||
optionParseEnum(key, value, &instance->config.displayCompactType,
|
||||
@@ -1298,32 +1299,25 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con
|
||||
optionParseString(key, value, &instance->config.batteryDir);
|
||||
else if(strcasecmp(key, "--separator-string") == 0)
|
||||
optionParseString(key, value, &instance->config.separatorString);
|
||||
else if(strcasecmp(key, "--localip-v6first") == 0)
|
||||
instance->config.localIpV6First = optionParseBoolean(value);
|
||||
else if(strcasecmp(key, "--localip-show-ipv4") == 0)
|
||||
instance->config.localIpShowIpV4 = optionParseBoolean(value);
|
||||
optionParseBoolean(value) ? (instance->config.localIpShowType |= FF_LOCALIP_TYPE_IPV4_BIT) : (instance->config.localIpShowType &= ~FF_LOCALIP_TYPE_IPV4_BIT);
|
||||
else if(strcasecmp(key, "--localip-show-ipv6") == 0)
|
||||
instance->config.localIpShowIpV6 = optionParseBoolean(value);
|
||||
optionParseBoolean(value) ? (instance->config.localIpShowType |= FF_LOCALIP_TYPE_IPV6_BIT) : (instance->config.localIpShowType &= ~FF_LOCALIP_TYPE_IPV6_BIT);
|
||||
else if(strcasecmp(key, "--localip-show-mac") == 0)
|
||||
optionParseBoolean(value) ? (instance->config.localIpShowType |= FF_LOCALIP_TYPE_MAC_BIT) : (instance->config.localIpShowType &= ~FF_LOCALIP_TYPE_MAC_BIT);
|
||||
else if(strcasecmp(key, "--localip-show-loop") == 0)
|
||||
instance->config.localIpShowLoop = optionParseBoolean(value);
|
||||
optionParseBoolean(value) ? (instance->config.localIpShowType |= FF_LOCALIP_TYPE_LOOP_BIT) : (instance->config.localIpShowType &= ~FF_LOCALIP_TYPE_LOOP_BIT);
|
||||
else if(strcasecmp(key, "--localip-compact") == 0)
|
||||
optionParseBoolean(value) ? (instance->config.localIpShowType |= FF_LOCALIP_TYPE_COMPACT_BIT) : (instance->config.localIpShowType &= ~FF_LOCALIP_TYPE_COMPACT_BIT);
|
||||
else if(strcasecmp(key, "--localip-name-prefix") == 0)
|
||||
optionParseString(key, value, &instance->config.localIpNamePrefix);
|
||||
else if(strcasecmp(key, "--localip-compact-type") == 0)
|
||||
{
|
||||
optionParseEnum(key, value, &instance->config.localIpCompactType,
|
||||
"none", FF_LOCALIP_COMPACT_TYPE_NONE,
|
||||
"oneline", FF_LOCALIP_COMPACT_TYPE_ONELINE,
|
||||
"multiline", FF_LOCALIP_COMPACT_TYPE_MULTILINE,
|
||||
NULL
|
||||
);
|
||||
}
|
||||
else if(strcasecmp(key, "--os-file") == 0)
|
||||
optionParseString(key, value, &instance->config.osFile);
|
||||
else if(strcasecmp(key, "--player-name") == 0)
|
||||
optionParseString(key, value, &instance->config.playerName);
|
||||
else if(strcasecmp(key, "--public-ip-url") == 0)
|
||||
else if(strcasecmp(key, "--publicip-url") == 0)
|
||||
optionParseString(key, value, &instance->config.publicIpUrl);
|
||||
else if(strcasecmp(key, "--public-ip-timeout") == 0)
|
||||
else if(strcasecmp(key, "--publicip-timeout") == 0)
|
||||
instance->config.publicIpTimeout = optionParseUInt32(key, value);
|
||||
else if(strcasecmp(key, "--weather-output-format") == 0)
|
||||
optionParseString(key, value, &instance->config.weatherOutputFormat);
|
||||
@@ -1454,6 +1448,8 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char
|
||||
ffPrintWMTheme(instance);
|
||||
else if(strcasecmp(line, "icons") == 0)
|
||||
ffPrintIcons(instance);
|
||||
else if(strcasecmp(line, "wallpaper") == 0)
|
||||
ffPrintWallpaper(instance);
|
||||
else if(strcasecmp(line, "font") == 0)
|
||||
ffPrintFont(instance);
|
||||
else if(strcasecmp(line, "cursor") == 0)
|
||||
|
||||
+26
-10
@@ -55,6 +55,16 @@ typedef enum FFLocalIpCompactType
|
||||
FF_LOCALIP_COMPACT_TYPE_ONELINE,
|
||||
} FFLocalIpCompactType;
|
||||
|
||||
typedef enum FFDiskType
|
||||
{
|
||||
FF_DISK_TYPE_NONE = 0,
|
||||
FF_DISK_TYPE_REGULAR_BIT = 1 << 0,
|
||||
FF_DISK_TYPE_HIDDEN_BIT = 1 << 1,
|
||||
FF_DISK_TYPE_EXTERNAL_BIT = 1 << 2,
|
||||
FF_DISK_TYPE_SUBVOLUME_BIT = 1 << 3,
|
||||
FF_DISK_TYPE_UNKNOWN_BIT = 1 << 4,
|
||||
} FFDiskType;
|
||||
|
||||
typedef enum FFBinaryPrefixType
|
||||
{
|
||||
FF_BINARY_PREFIX_TYPE_IEC, // 1024 Bytes = 1 KiB, 1024 KiB = 1 MiB, ... (standard)
|
||||
@@ -77,6 +87,17 @@ typedef struct FFModuleArgs
|
||||
FFstrbuf errorFormat;
|
||||
} FFModuleArgs;
|
||||
|
||||
typedef enum FFLocalIpType
|
||||
{
|
||||
FF_LOCALIP_TYPE_NONE,
|
||||
FF_LOCALIP_TYPE_LOOP_BIT = 1 << 0,
|
||||
FF_LOCALIP_TYPE_IPV4_BIT = 1 << 1,
|
||||
FF_LOCALIP_TYPE_IPV6_BIT = 1 << 2,
|
||||
FF_LOCALIP_TYPE_MAC_BIT = 1 << 3,
|
||||
|
||||
FF_LOCALIP_TYPE_COMPACT_BIT = 1 << 10,
|
||||
} FFLocalIpType;
|
||||
|
||||
typedef struct FFconfig
|
||||
{
|
||||
struct
|
||||
@@ -130,6 +151,7 @@ typedef struct FFconfig
|
||||
FFModuleArgs shell;
|
||||
FFModuleArgs display;
|
||||
FFModuleArgs de;
|
||||
FFModuleArgs wallpaper;
|
||||
FFModuleArgs wifi;
|
||||
FFModuleArgs wm;
|
||||
FFModuleArgs wmTheme;
|
||||
@@ -204,10 +226,7 @@ typedef struct FFconfig
|
||||
bool terminalVersion;
|
||||
|
||||
FFstrbuf diskFolders;
|
||||
bool diskShowRemovable;
|
||||
bool diskShowHidden;
|
||||
bool diskShowUnknown;
|
||||
bool diskShowSubvolumes;
|
||||
FFDiskType diskShowTypes;
|
||||
|
||||
FFDisplayCompactType displayCompactType;
|
||||
bool displayDetectName;
|
||||
@@ -219,12 +238,8 @@ typedef struct FFconfig
|
||||
|
||||
FFstrbuf separatorString;
|
||||
|
||||
bool localIpShowLoop;
|
||||
bool localIpV6First;
|
||||
bool localIpShowIpV4;
|
||||
bool localIpShowIpV6;
|
||||
FFstrbuf localIpNamePrefix;
|
||||
FFLocalIpCompactType localIpCompactType;
|
||||
FFLocalIpType localIpShowType;
|
||||
|
||||
FFstrbuf publicIpUrl;
|
||||
uint32_t publicIpTimeout;
|
||||
@@ -318,6 +333,7 @@ void ffPrintWM(FFinstance* instance);
|
||||
void ffPrintWMTheme(FFinstance* instance);
|
||||
void ffPrintTheme(FFinstance* instance);
|
||||
void ffPrintIcons(FFinstance* instance);
|
||||
void ffPrintWallpaper(FFinstance* instance);
|
||||
void ffPrintFont(FFinstance* instance);
|
||||
void ffPrintCursor(FFinstance* instance);
|
||||
void ffPrintTerminal(FFinstance* instance);
|
||||
@@ -326,7 +342,7 @@ void ffPrintCPU(FFinstance* instance);
|
||||
void ffPrintCPUUsage(FFinstance* instance);
|
||||
void ffPrintGPU(FFinstance* instance);
|
||||
void ffPrintMemory(FFinstance* instance);
|
||||
void ffPrintSwap(FFinstance* instance); //Also in modules/memory.c
|
||||
void ffPrintSwap(FFinstance* instance);
|
||||
void ffPrintDisk(FFinstance* instance);
|
||||
void ffPrintBattery(FFinstance* instance);
|
||||
void ffPrintPowerAdapter(FFinstance* instance);
|
||||
|
||||
+108
-21
@@ -188,7 +188,7 @@ static const FFlogo* getLogoArch()
|
||||
FF_LOGO_INIT
|
||||
FF_LOGO_NAMES("arch", "archlinux", "arch-linux")
|
||||
FF_LOGO_LINES(
|
||||
" -`\n"
|
||||
"$1 -`\n"
|
||||
" .o+`\n"
|
||||
" `ooo/\n"
|
||||
" `+oooo:\n"
|
||||
@@ -197,9 +197,9 @@ static const FFlogo* getLogoArch()
|
||||
" `/:-:++oooo+:\n"
|
||||
" `/++++/+++++++:\n"
|
||||
" `/++++++++++++++:\n"
|
||||
" `/+++ooooooooooooo/`\n"
|
||||
" ./ooosssso++osssssso+`\n"
|
||||
" .oossssso-````/ossssss+`\n"
|
||||
" `/+++o$2oooooooo$1oooo/`\n"
|
||||
" ./$2ooosssso++osssssso$1+`\n"
|
||||
"$2 .oossssso-````/ossssss+`\n"
|
||||
" -osssssso. :ssssssso.\n"
|
||||
" :osssssss/ osssso+++.\n"
|
||||
" /ossssssss/ +ssssooo/-\n"
|
||||
@@ -209,6 +209,7 @@ static const FFlogo* getLogoArch()
|
||||
".` `/";
|
||||
)
|
||||
FF_LOGO_COLORS(
|
||||
"36", //cyan
|
||||
"36" //cyan
|
||||
)
|
||||
FF_LOGO_COLOR_KEYS("36"); //cyan
|
||||
@@ -734,7 +735,7 @@ static const FFlogo* getLogoEndeavour()
|
||||
"$2`-////+$1ssssssssssssssssssssssssssso$3++++-\n"
|
||||
" $2`..-+$1oosssssssssssssssssssssssso$3+++++/`\n"
|
||||
" $3./++++++++++++++++++++++++++++++/:.\n"
|
||||
" `:::::::::::::::::::::::::------``"
|
||||
" `:::::::::::::::::::::::::------``"
|
||||
)
|
||||
FF_LOGO_COLORS(
|
||||
"35", //magenta
|
||||
@@ -1186,6 +1187,56 @@ static const FFlogo* getLogoMacOS()
|
||||
FF_LOGO_RETURN
|
||||
}
|
||||
|
||||
static const FFlogo* getLogoMacOSSmall()
|
||||
{
|
||||
FF_LOGO_INIT
|
||||
FF_LOGO_NAMES("macos_small", "mac_small", "apple_small", "darwin_small", "osx_small")
|
||||
FF_LOGO_LINES(
|
||||
"$1 .:'\n"
|
||||
" __ :'__\n"
|
||||
"$2 .'`__`-'__``.\n"
|
||||
"$3:__________.-'\n"
|
||||
"$4:_________:\n"
|
||||
" :_________`-;\n"
|
||||
"$5 `.__.-.__.'"
|
||||
)
|
||||
FF_LOGO_COLORS(
|
||||
"32", //green
|
||||
"33", //yellow
|
||||
"31", //red
|
||||
"35", //magenta
|
||||
"34" //blue
|
||||
)
|
||||
FF_LOGO_COLOR_KEYS("33"); //yellow
|
||||
FF_LOGO_COLOR_TITLE("32"); //green
|
||||
FF_LOGO_RETURN
|
||||
}
|
||||
|
||||
static const FFlogo* getLogoMacOSSmall2()
|
||||
{
|
||||
FF_LOGO_INIT
|
||||
FF_LOGO_NAMES("macos_small2", "mac_small2", "apple_small2", "darwin_small2", "osx_small2")
|
||||
FF_LOGO_LINES(
|
||||
"$1 .:'\n"
|
||||
" __ :'__\n"
|
||||
"$2 .'` `-' ``.\n"
|
||||
"$3: .-'\n"
|
||||
"$4: :\n"
|
||||
" : `-;\n"
|
||||
"$5 `.__.-.__.'"
|
||||
)
|
||||
FF_LOGO_COLORS(
|
||||
"32", //green
|
||||
"33", //yellow
|
||||
"31", //red
|
||||
"35", //magenta
|
||||
"34" //blue
|
||||
)
|
||||
FF_LOGO_COLOR_KEYS("33"); //yellow
|
||||
FF_LOGO_COLOR_TITLE("32"); //green
|
||||
FF_LOGO_RETURN
|
||||
}
|
||||
|
||||
static const FFlogo* getLogoManjaro()
|
||||
{
|
||||
FF_LOGO_INIT
|
||||
@@ -1369,23 +1420,23 @@ static const FFlogo* getLogoWindows11()
|
||||
FF_LOGO_NAMES("Windows 11", "Windows Server 2022")
|
||||
FF_LOGO_LINES(
|
||||
"$1\n"
|
||||
",,**************/ ///////////////()\n"
|
||||
"****************/ ///////////////((\n"
|
||||
"***************// //////////////(((\n"
|
||||
"**************/// ////////////(((((\n"
|
||||
"************///// /////////((((((((\n"
|
||||
"*********//////// /////((((((((((((\n"
|
||||
"*******////////// ///((((((((((((((\n"
|
||||
"****///////////// (((((((((((((((((\n"
|
||||
"///////////////// /////////////////\n"
|
||||
"///////////////// /////////////////\n"
|
||||
"///////////////// /////////////////\n"
|
||||
"///////////////// /////////////////\n"
|
||||
"///////////////// /////////////////\n"
|
||||
"///////////////// /////////////////\n"
|
||||
"///////////////// /////////////////\n"
|
||||
"///////////////// /////////////////\n"
|
||||
"\n"
|
||||
"/////////////(((( (((((((((((((((((\n"
|
||||
"////////////((((( (((((((((((((((((\n"
|
||||
"///////////(((((( (((((((((((((((((\n"
|
||||
"/////////(((((((( (((((((((((((((((\n"
|
||||
"///////(((((((((( (((((((((((((((((\n"
|
||||
"////((((((((((((( (((((((((((((((((\n"
|
||||
"((((((((((((((((( (((((((((((((((((\n"
|
||||
"((((((((((((((((( (((((((((((((((()"
|
||||
"///////////////// /////////////////\n"
|
||||
"///////////////// /////////////////\n"
|
||||
"///////////////// /////////////////\n"
|
||||
"///////////////// /////////////////\n"
|
||||
"///////////////// /////////////////\n"
|
||||
"///////////////// /////////////////\n"
|
||||
"///////////////// /////////////////\n"
|
||||
"///////////////// /////////////////"
|
||||
)
|
||||
FF_LOGO_COLORS(
|
||||
"34" //blue
|
||||
@@ -2217,6 +2268,39 @@ static const FFlogo* getLogoSolus()
|
||||
FF_LOGO_RETURN
|
||||
}
|
||||
|
||||
static const FFlogo* getLogoSteamOS()
|
||||
{
|
||||
FF_LOGO_INIT
|
||||
FF_LOGO_NAMES("steamos")
|
||||
FF_LOGO_LINES(
|
||||
"$1 .,,,,.\n"
|
||||
" .,'onNMMMMMNNnn',.\n"
|
||||
" .'oNMANKMMMMMMMMMMMNNn'.\n"
|
||||
" .'ANMMMMMMMXKNNWWWPFFWNNMNn.\n"
|
||||
" ;NNMMMMMMMMMMNWW'' ,.., 'WMMM,\n"
|
||||
" ;NMMMMV+##+VNWWW' .+;'':+, 'WMW,\n"
|
||||
",VNNWP+$2######$1+WW, $2+: $1:+, +MMM,\n"
|
||||
"'$2+#############, +. ,+' $1+NMMM\n"
|
||||
"$2 '*#########*' '*,,*' $1.+NMMMM.\n"
|
||||
"$2 `'*###*' ,.,;###$1+WNM,\n"
|
||||
"$2 .,;;, .;##########$1+W\n"
|
||||
"$2,',. '; ,+##############'\n"
|
||||
" '###+. :,. .,; ,###############'\n"
|
||||
" '####.. `'' .,###############'\n"
|
||||
" '#####+++################'\n"
|
||||
" '*##################*'\n"
|
||||
" ''*##########*''\n"
|
||||
" ''''''\n"
|
||||
)
|
||||
FF_LOGO_COLORS(
|
||||
"34", //blue
|
||||
"37" //white
|
||||
)
|
||||
FF_LOGO_COLOR_KEYS("34"); //blue
|
||||
FF_LOGO_COLOR_TITLE("34"); //blue
|
||||
FF_LOGO_RETURN
|
||||
}
|
||||
|
||||
static const FFlogo* getLogoUbuntu()
|
||||
{
|
||||
FF_LOGO_INIT
|
||||
@@ -2469,6 +2553,8 @@ GetLogoMethod* ffLogoBuiltinGetAll()
|
||||
getLogoLangitKetujuh,
|
||||
getLogoLinux,
|
||||
getLogoMacOS,
|
||||
getLogoMacOSSmall,
|
||||
getLogoMacOSSmall2,
|
||||
getLogoManjaro,
|
||||
getLogoManjaroSmall,
|
||||
getLogoMint,
|
||||
@@ -2503,6 +2589,7 @@ GetLogoMethod* ffLogoBuiltinGetAll()
|
||||
getLogoSlackware,
|
||||
getLogoSlackwareSmall,
|
||||
getLogoSolus,
|
||||
getLogoSteamOS,
|
||||
getLogoUbuntu,
|
||||
getLogoUbuntuOld,
|
||||
getLogoUbuntuSmall,
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <sys/syslimits.h>
|
||||
#elif _WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
static FFstrbuf base64Encode(FFstrbuf* in)
|
||||
|
||||
@@ -5,13 +5,7 @@
|
||||
void ffPrintColors(FFinstance* instance)
|
||||
{
|
||||
if(instance->config.pipe)
|
||||
{
|
||||
ffLogoPrintLine(instance);
|
||||
puts("████████████████████████");
|
||||
ffLogoPrintLine(instance);
|
||||
puts("████████████████████████");
|
||||
return;
|
||||
}
|
||||
|
||||
ffLogoPrintLine(instance);
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ void ffPrintCPUUsage(FFinstance* instance)
|
||||
{
|
||||
ffPrintLogoAndKey(instance, FF_CPU_USAGE_MODULE_NAME, 0, &instance->config.cpuUsage.key);
|
||||
|
||||
FFstrbuf str;
|
||||
FF_STRBUF_AUTO_DESTROY str;
|
||||
ffStrbufInit(&str);
|
||||
if(instance->config.percentType & FF_PERCENTAGE_TYPE_BAR_BIT)
|
||||
ffAppendPercentBar(instance, &str, (uint8_t)percentage, 0, 5, 8);
|
||||
@@ -32,7 +32,6 @@ void ffPrintCPUUsage(FFinstance* instance)
|
||||
ffAppendPercentNum(instance, &str, (uint8_t) percentage, 50, 80, str.length > 0);
|
||||
}
|
||||
ffStrbufPutTo(&str, stdout);
|
||||
ffStrbufDestroy(&str);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+16
-26
@@ -9,7 +9,7 @@
|
||||
|
||||
static void printDisk(FFinstance* instance, const FFDisk* disk)
|
||||
{
|
||||
FFstrbuf key;
|
||||
FF_STRBUF_AUTO_DESTROY key;
|
||||
ffStrbufInit(&key);
|
||||
|
||||
if(instance->config.disk.key.length == 0)
|
||||
@@ -23,11 +23,11 @@ static void printDisk(FFinstance* instance, const FFDisk* disk)
|
||||
});
|
||||
}
|
||||
|
||||
FFstrbuf usedPretty;
|
||||
FF_STRBUF_AUTO_DESTROY usedPretty;
|
||||
ffStrbufInit(&usedPretty);
|
||||
ffParseSize(disk->bytesUsed, instance->config.binaryPrefixType, &usedPretty);
|
||||
|
||||
FFstrbuf totalPretty;
|
||||
FF_STRBUF_AUTO_DESTROY totalPretty;
|
||||
ffStrbufInit(&totalPretty);
|
||||
ffParseSize(disk->bytesTotal, instance->config.binaryPrefixType, &totalPretty);
|
||||
|
||||
@@ -37,7 +37,7 @@ static void printDisk(FFinstance* instance, const FFDisk* disk)
|
||||
{
|
||||
ffPrintLogoAndKey(instance, key.chars, 0, NULL);
|
||||
|
||||
FFstrbuf str;
|
||||
FF_STRBUF_AUTO_DESTROY str;
|
||||
ffStrbufInit(&str);
|
||||
|
||||
if(disk->bytesTotal > 0)
|
||||
@@ -60,12 +60,11 @@ static void printDisk(FFinstance* instance, const FFDisk* disk)
|
||||
else
|
||||
ffStrbufAppendS(&str, "Unknown ");
|
||||
|
||||
if(disk->type == FF_DISK_TYPE_EXTERNAL && !(instance->config.percentType & FF_PERCENTAGE_TYPE_HIDE_OTHERS_BIT))
|
||||
if(disk->type & FF_DISK_TYPE_EXTERNAL_BIT && !(instance->config.percentType & FF_PERCENTAGE_TYPE_HIDE_OTHERS_BIT))
|
||||
ffStrbufAppendS(&str, "[Removable]");
|
||||
|
||||
ffStrbufTrimRight(&str, ' ');
|
||||
ffStrbufPutTo(&str, stdout);
|
||||
ffStrbufDestroy(&str);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -78,16 +77,12 @@ static void printDisk(FFinstance* instance, const FFDisk* disk)
|
||||
{FF_FORMAT_ARG_TYPE_UINT, &disk->filesUsed},
|
||||
{FF_FORMAT_ARG_TYPE_UINT, &disk->filesTotal},
|
||||
{FF_FORMAT_ARG_TYPE_UINT8, &filesPercentage},
|
||||
{FF_FORMAT_ARG_TYPE_BOOL, FF_FORMAT_ARG_VALUE_BOOL(disk->type == FF_DISK_TYPE_EXTERNAL)},
|
||||
{FF_FORMAT_ARG_TYPE_BOOL, FF_FORMAT_ARG_VALUE_BOOL(disk->type == FF_DISK_TYPE_HIDDEN)},
|
||||
{FF_FORMAT_ARG_TYPE_BOOL, FF_FORMAT_ARG_VALUE_BOOL(disk->type & FF_DISK_TYPE_EXTERNAL_BIT)},
|
||||
{FF_FORMAT_ARG_TYPE_BOOL, FF_FORMAT_ARG_VALUE_BOOL(disk->type & FF_DISK_TYPE_HIDDEN_BIT)},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &disk->filesystem},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &disk->name}
|
||||
});
|
||||
}
|
||||
|
||||
ffStrbufDestroy(&totalPretty);
|
||||
ffStrbufDestroy(&usedPretty);
|
||||
ffStrbufDestroy(&key);
|
||||
}
|
||||
|
||||
static void printMountpoint(FFinstance* instance, const FFlist* disks, const char* mountpoint)
|
||||
@@ -113,7 +108,7 @@ static void printMountpoints(FFinstance* instance, const FFlist* disks)
|
||||
const char separator = ':';
|
||||
#endif
|
||||
|
||||
FFstrbuf mountpoints;
|
||||
FF_STRBUF_AUTO_DESTROY mountpoints;
|
||||
ffStrbufInitCopy(&mountpoints, &instance->config.diskFolders);
|
||||
ffStrbufTrim(&mountpoints, separator);
|
||||
|
||||
@@ -131,24 +126,19 @@ static void printMountpoints(FFinstance* instance, const FFlist* disks)
|
||||
|
||||
static void printAutodetected(FFinstance* instance, const FFlist* disks)
|
||||
{
|
||||
for(uint32_t i = 0; i < disks->length; i++)
|
||||
bool found = false;
|
||||
|
||||
FF_LIST_FOR_EACH(FFDisk, disk, *disks)
|
||||
{
|
||||
const FFDisk* disk = ffListGet(disks, i);
|
||||
|
||||
if(disk->type == FF_DISK_TYPE_EXTERNAL && !instance->config.diskShowRemovable)
|
||||
continue;
|
||||
|
||||
if(disk->type == FF_DISK_TYPE_SUBVOLUME && !instance->config.diskShowSubvolumes)
|
||||
continue;
|
||||
|
||||
if(disk->type == FF_DISK_TYPE_HIDDEN && !instance->config.diskShowHidden)
|
||||
continue;
|
||||
|
||||
if(disk->bytesTotal == 0 && !instance->config.diskShowUnknown)
|
||||
if(!(disk->type & instance->config.diskShowTypes))
|
||||
continue;
|
||||
|
||||
printDisk(instance, disk);
|
||||
found = true;
|
||||
}
|
||||
|
||||
if (!found)
|
||||
ffPrintError(instance, FF_DISK_MODULE_NAME, 0, &instance->config.disk, "No disk found");
|
||||
}
|
||||
|
||||
void ffPrintDisk(FFinstance* instance)
|
||||
|
||||
+4
-71
@@ -4,77 +4,10 @@
|
||||
#include "detection/displayserver/displayserver.h"
|
||||
|
||||
#define FF_FONT_MODULE_NAME "Font"
|
||||
#define FF_FONT_NUM_FORMAT_ARGS 4
|
||||
|
||||
#if defined(__linux__) || defined(__FreeBSD__)
|
||||
#include "common/parsing.h"
|
||||
|
||||
static void printFont(const FFFontResult* font)
|
||||
{
|
||||
FFstrbuf gtk;
|
||||
ffStrbufInit(>k);
|
||||
ffParseGTK(>k, &font->fonts[1], &font->fonts[2], &font->fonts[3]);
|
||||
|
||||
if(font->fonts[0].length > 0)
|
||||
{
|
||||
printf("%s [QT]", font->fonts[0].chars);
|
||||
if(gtk.length > 0)
|
||||
fputs(", ", stdout);
|
||||
}
|
||||
|
||||
ffStrbufWriteTo(>k, stdout);
|
||||
ffStrbufDestroy(>k);
|
||||
}
|
||||
|
||||
#elif defined(__APPLE__)
|
||||
|
||||
static void printFont(const FFFontResult* font)
|
||||
{
|
||||
if(font->fonts[0].length > 0)
|
||||
{
|
||||
printf("%s [System]", font->fonts[0].chars);
|
||||
if(font->fonts[1].length > 0)
|
||||
fputs(", ", stdout);
|
||||
}
|
||||
|
||||
if(font->fonts[1].length > 0)
|
||||
printf("%s [User]", font->fonts[1].chars);
|
||||
}
|
||||
|
||||
#elif defined(_WIN32)
|
||||
|
||||
static void printFont(const FFFontResult* font)
|
||||
{
|
||||
const char* types[] = { "Caption", "Menu", "Message", "Status" };
|
||||
for(uint32_t i = 0; i < sizeof(types) / sizeof(types[0]); ++i)
|
||||
{
|
||||
if(i == 0 || !ffStrbufEqual(&font->fonts[i - 1], &font->fonts[i]))
|
||||
{
|
||||
if(i > 0)
|
||||
fputs("], ", stdout);
|
||||
printf("%s [%s", font->fonts[i].chars, types[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf(" / %s", types[i]);
|
||||
}
|
||||
}
|
||||
putchar(']');
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void printFont(const FFFontResult* font)
|
||||
{
|
||||
FF_UNUSED(font);
|
||||
}
|
||||
|
||||
#endif
|
||||
#define FF_FONT_NUM_FORMAT_ARGS (FF_DETECT_FONT_NUM_FONTS + 1)
|
||||
|
||||
void ffPrintFont(FFinstance* instance)
|
||||
{
|
||||
assert(FF_DETECT_FONT_NUM_FONTS == FF_FONT_NUM_FORMAT_ARGS);
|
||||
|
||||
const FFFontResult* font = ffDetectFont(instance);
|
||||
|
||||
if(font->error.length > 0)
|
||||
@@ -86,8 +19,7 @@ void ffPrintFont(FFinstance* instance)
|
||||
if(instance->config.font.outputFormat.length == 0)
|
||||
{
|
||||
ffPrintLogoAndKey(instance, FF_FONT_MODULE_NAME, 0, &instance->config.font.key);
|
||||
printFont(font);
|
||||
putchar('\n');
|
||||
ffStrbufPutTo(&font->display, stdout);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -95,7 +27,8 @@ void ffPrintFont(FFinstance* instance)
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &font->fonts[0]},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &font->fonts[1]},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &font->fonts[2]},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &font->fonts[3]}
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &font->fonts[3]},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &font->display},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,14 +6,14 @@
|
||||
|
||||
static void printDevice(FFinstance* instance, const FFGamepadDevice* device, uint8_t index)
|
||||
{
|
||||
if(instance->config.sound.outputFormat.length == 0)
|
||||
if(instance->config.gamepad.outputFormat.length == 0)
|
||||
{
|
||||
ffPrintLogoAndKey(instance, FF_GAMEPAD_MODULE_NAME, index, &instance->config.sound.key);
|
||||
ffPrintLogoAndKey(instance, FF_GAMEPAD_MODULE_NAME, index, &instance->config.gamepad.key);
|
||||
ffStrbufPutTo(&device->name, stdout);
|
||||
}
|
||||
else
|
||||
{
|
||||
ffPrintFormat(instance, FF_GAMEPAD_MODULE_NAME, index, &instance->config.sound, FF_GAMEPAD_NUM_FORMAT_ARGS, (FFformatarg[]) {
|
||||
ffPrintFormat(instance, FF_GAMEPAD_MODULE_NAME, index, &instance->config.gamepad, FF_GAMEPAD_NUM_FORMAT_ARGS, (FFformatarg[]) {
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &device->name},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &device->identifier},
|
||||
});
|
||||
@@ -28,13 +28,13 @@ void ffPrintGamepad(FFinstance* instance)
|
||||
|
||||
if(error)
|
||||
{
|
||||
ffPrintError(instance, FF_GAMEPAD_MODULE_NAME, 0, &instance->config.sound, "%s", error);
|
||||
ffPrintError(instance, FF_GAMEPAD_MODULE_NAME, 0, &instance->config.gamepad, "%s", error);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!result.length)
|
||||
{
|
||||
ffPrintError(instance, FF_GAMEPAD_MODULE_NAME, 0, &instance->config.sound, "No devices detected");
|
||||
ffPrintError(instance, FF_GAMEPAD_MODULE_NAME, 0, &instance->config.gamepad, "No devices detected");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
+9
-49
@@ -1,71 +1,31 @@
|
||||
#include "fastfetch.h"
|
||||
#include "common/printing.h"
|
||||
#include "common/parsing.h"
|
||||
#include "detection/gtk_qt/gtk_qt.h"
|
||||
#include "detection/displayserver/displayserver.h"
|
||||
#include "detection/icons/icons.h"
|
||||
|
||||
#define FF_ICONS_MODULE_NAME "Icons"
|
||||
#define FF_ICONS_NUM_FORMAT_ARGS 5
|
||||
#define FF_ICONS_NUM_FORMAT_ARGS 1
|
||||
|
||||
void ffPrintIcons(FFinstance* instance)
|
||||
{
|
||||
#if defined(__ANDROID__) || defined(__APPLE__) || defined(_WIN32)
|
||||
FF_STRBUF_AUTO_DESTROY icons;
|
||||
ffStrbufInit(&icons);
|
||||
const char* error = ffDetectIcons(instance, &icons);
|
||||
|
||||
FF_UNUSED(instance);
|
||||
ffPrintError(instance, FF_ICONS_MODULE_NAME, 0, &instance->config.icons, "Icons detection is not supported");
|
||||
return;
|
||||
|
||||
#else
|
||||
|
||||
const FFDisplayServerResult* wmde = ffConnectDisplayServer(instance);
|
||||
|
||||
if(ffStrbufIgnCaseCompS(&wmde->wmProtocolName, FF_WM_PROTOCOL_TTY) == 0)
|
||||
if(error)
|
||||
{
|
||||
ffPrintError(instance, FF_ICONS_MODULE_NAME, 0, &instance->config.icons, "Icons aren't supported in TTY");
|
||||
ffPrintError(instance, FF_ICONS_MODULE_NAME, 0, &instance->config.icons, "%s", error);
|
||||
return;
|
||||
}
|
||||
|
||||
const FFstrbuf* plasma = &ffDetectQt(instance)->icons;
|
||||
const FFstrbuf* gtk2 = &ffDetectGTK2(instance)->icons;
|
||||
const FFstrbuf* gtk3 = &ffDetectGTK3(instance)->icons;
|
||||
const FFstrbuf* gtk4 = &ffDetectGTK4(instance)->icons;
|
||||
|
||||
if(plasma->length == 0 && gtk2->length == 0 && gtk3->length == 0 && gtk4->length == 0)
|
||||
{
|
||||
ffPrintError(instance, FF_ICONS_MODULE_NAME, 0, &instance->config.icons, "No icons could be found");
|
||||
return;
|
||||
}
|
||||
|
||||
FF_STRBUF_CREATE(gtkPretty);
|
||||
ffParseGTK(>kPretty, gtk2, gtk3, gtk4);
|
||||
|
||||
if(instance->config.icons.outputFormat.length == 0)
|
||||
{
|
||||
ffPrintLogoAndKey(instance, FF_ICONS_MODULE_NAME, 0, &instance->config.icons.key);
|
||||
|
||||
if(plasma->length > 0)
|
||||
{
|
||||
ffStrbufWriteTo(plasma, stdout);
|
||||
fputs(" [QT]", stdout);
|
||||
|
||||
if(gtkPretty.length > 0)
|
||||
fputs(", ", stdout);
|
||||
}
|
||||
|
||||
ffStrbufPutTo(>kPretty, stdout);
|
||||
ffStrbufPutTo(&icons, stdout);
|
||||
}
|
||||
else
|
||||
{
|
||||
ffPrintFormat(instance, FF_ICONS_MODULE_NAME, 0, &instance->config.icons, FF_ICONS_NUM_FORMAT_ARGS, (FFformatarg[]){
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, plasma},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, gtk2},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, gtk3},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, gtk4},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, >kPretty}
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &icons}
|
||||
});
|
||||
}
|
||||
|
||||
ffStrbufDestroy(>kPretty);
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
+38
-62
@@ -5,28 +5,9 @@
|
||||
#define FF_LOCALIP_MODULE_NAME "Local IP"
|
||||
#define FF_LOCALIP_NUM_FORMAT_ARGS 2
|
||||
|
||||
static int sortIpsV4First(const FFLocalIpResult* left, const FFLocalIpResult* right)
|
||||
static int sortIps(const FFLocalIpResult* left, const FFLocalIpResult* right)
|
||||
{
|
||||
int name = ffStrbufComp(&left->name, &right->name);
|
||||
if (name != 0)
|
||||
return name;
|
||||
|
||||
if (left->ipv6 != right->ipv6)
|
||||
return left->ipv6 == false ? -1 : 1;
|
||||
|
||||
return ffStrbufComp(&left->addr, &right->addr);
|
||||
}
|
||||
|
||||
static int sortIpsV6First(const FFLocalIpResult* left, const FFLocalIpResult* right)
|
||||
{
|
||||
int name = ffStrbufComp(&left->name, &right->name);
|
||||
if (name != 0)
|
||||
return name;
|
||||
|
||||
if (left->ipv6 != right->ipv6)
|
||||
return left->ipv6 == true ? -1 : 1;
|
||||
|
||||
return ffStrbufComp(&left->addr, &right->addr);
|
||||
return ffStrbufComp(&left->name, &right->name);
|
||||
}
|
||||
|
||||
static void formatKey(const FFinstance* instance, const FFLocalIpResult* ip, FFstrbuf* key)
|
||||
@@ -47,32 +28,27 @@ static void formatKey(const FFinstance* instance, const FFLocalIpResult* ip, FFs
|
||||
}
|
||||
}
|
||||
|
||||
static void printIpsOneline(FFlist* ips)
|
||||
static void printIp(FFLocalIpResult* ip)
|
||||
{
|
||||
uint32_t index = 0;
|
||||
FF_LIST_FOR_EACH(FFLocalIpResult, ip, *ips)
|
||||
bool flag = false;
|
||||
if (ip->ipv4.length)
|
||||
{
|
||||
if (index++ > 0)
|
||||
putchar(' ');
|
||||
ffStrbufWriteTo(&ip->addr, stdout);
|
||||
ffStrbufWriteTo(&ip->ipv4, stdout);
|
||||
flag = true;
|
||||
}
|
||||
}
|
||||
|
||||
static void printIpsWithKey(FFinstance* instance, FFlist* ips)
|
||||
{
|
||||
FFLocalIpResult* ip = (FFLocalIpResult*) ffListGet(ips, 0);
|
||||
if (instance->config.localIpCompactType == FF_LOCALIP_COMPACT_TYPE_MULTILINE)
|
||||
if (ip->ipv6.length)
|
||||
{
|
||||
FF_STRBUF_AUTO_DESTROY key;
|
||||
ffStrbufInit(&key);
|
||||
formatKey(instance, ip, &key);
|
||||
ffPrintLogoAndKey(instance, key.chars, 0, NULL);
|
||||
if (flag) putchar(' ');
|
||||
ffStrbufWriteTo(&ip->ipv6, stdout);
|
||||
flag = true;
|
||||
}
|
||||
if (ip->mac.length)
|
||||
{
|
||||
if (flag)
|
||||
printf(" (%s)", ip->mac.chars);
|
||||
else
|
||||
ffStrbufWriteTo(&ip->mac, stdout);
|
||||
}
|
||||
printIpsOneline(ips);
|
||||
if (instance->config.localIpCompactType == FF_LOCALIP_COMPACT_TYPE_ONELINE)
|
||||
printf(" (%s) ", ip->name.chars);
|
||||
else
|
||||
putchar('\n');
|
||||
}
|
||||
|
||||
void ffPrintLocalIp(FFinstance* instance)
|
||||
@@ -94,26 +70,18 @@ void ffPrintLocalIp(FFinstance* instance)
|
||||
return;
|
||||
}
|
||||
|
||||
ffListSort(&results, instance->config.localIpV6First ? (void*) sortIpsV6First : (void*) sortIpsV4First);
|
||||
ffListSort(&results, (void*) sortIps);
|
||||
|
||||
if (instance->config.localIpCompactType != FF_LOCALIP_COMPACT_TYPE_NONE)
|
||||
if (instance->config.localIpShowType & FF_LOCALIP_TYPE_COMPACT_BIT)
|
||||
{
|
||||
if (instance->config.localIpCompactType == FF_LOCALIP_COMPACT_TYPE_ONELINE)
|
||||
ffPrintLogoAndKey(instance, FF_LOCALIP_MODULE_NAME, 0, &instance->config.localIP.key);
|
||||
|
||||
FF_LIST_AUTO_DESTROY ips;
|
||||
ffListInit(&ips, sizeof(FFLocalIpResult)); // weak references
|
||||
ffPrintLogoAndKey(instance, FF_LOCALIP_MODULE_NAME, 0, &instance->config.localIP.key);
|
||||
|
||||
FF_LIST_FOR_EACH(FFLocalIpResult, ip, results)
|
||||
{
|
||||
if (ips.length > 0 && !ffStrbufEqual(&ip->name, &ip[-1].name))
|
||||
{
|
||||
printIpsWithKey(instance, &ips);
|
||||
ips.length = 0;
|
||||
}
|
||||
*(FFLocalIpResult*)ffListAdd(&ips) = *ip;
|
||||
if ((void*) ip != (void*) results.data)
|
||||
fputs(" - ", stdout);
|
||||
printIp(ip);
|
||||
}
|
||||
printIpsWithKey(instance, &ips);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -126,18 +94,26 @@ void ffPrintLocalIp(FFinstance* instance)
|
||||
if(instance->config.localIP.outputFormat.length == 0)
|
||||
{
|
||||
ffPrintLogoAndKey(instance, key.chars, 0, NULL);
|
||||
ffStrbufPutTo(&ip->addr, stdout);
|
||||
printIp(ip);
|
||||
putchar('\n');
|
||||
}
|
||||
else
|
||||
{
|
||||
ffPrintFormatString(instance, key.chars, 0, NULL, &instance->config.localIP.outputFormat, FF_LOCALIP_NUM_FORMAT_ARGS, (FFformatarg[]){
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &ip->addr},
|
||||
{FF_FORMAT_ARG_TYPE_STRING, ip->ipv6 ? "IPv6" : "IPv4"}
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &ip->ipv4},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &ip->ipv6},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &ip->mac},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &ip->name},
|
||||
});
|
||||
}
|
||||
|
||||
ffStrbufDestroy(&ip->name);
|
||||
ffStrbufDestroy(&ip->addr);
|
||||
}
|
||||
}
|
||||
|
||||
FF_LIST_FOR_EACH(FFLocalIpResult, ip, results)
|
||||
{
|
||||
ffStrbufDestroy(&ip->name);
|
||||
ffStrbufDestroy(&ip->ipv4);
|
||||
ffStrbufDestroy(&ip->ipv6);
|
||||
ffStrbufDestroy(&ip->mac);
|
||||
}
|
||||
}
|
||||
|
||||
+17
-45
@@ -3,47 +3,41 @@
|
||||
#include "common/parsing.h"
|
||||
#include "common/bar.h"
|
||||
#include "detection/memory/memory.h"
|
||||
#include "detection/swap/swap.h"
|
||||
|
||||
#define FF_MEMORY_MODULE_NAME "Memory"
|
||||
#define FF_SWAP_MODULE_NAME "Swap"
|
||||
|
||||
#define FF_MEMORY_NUM_FORMAT_ARGS 3
|
||||
|
||||
static uint8_t calculatePercentage(const FFMemoryStorage* storage)
|
||||
void ffPrintMemory(FFinstance* instance)
|
||||
{
|
||||
if(storage->error.length != 0 || storage->bytesTotal == 0)
|
||||
return 0;
|
||||
else
|
||||
return (uint8_t) (((long double) storage->bytesUsed / (long double) storage->bytesTotal) * 100.0);
|
||||
}
|
||||
FFMemoryResult storage;
|
||||
const char* error = ffDetectMemory(&storage);
|
||||
|
||||
static void printMemory(FFinstance* instance, const char* name, const FFModuleArgs* moduleArgs, const FFMemoryStorage* storage)
|
||||
{
|
||||
if(storage->error.length > 0)
|
||||
if(error)
|
||||
{
|
||||
ffPrintError(instance, name, 0, moduleArgs, "%s", storage->error.chars);
|
||||
ffPrintError(instance, FF_MEMORY_MODULE_NAME, 0, &instance->config.memory, "%s", error);
|
||||
return;
|
||||
}
|
||||
|
||||
FFstrbuf usedPretty;
|
||||
FF_STRBUF_AUTO_DESTROY usedPretty;
|
||||
ffStrbufInit(&usedPretty);
|
||||
ffParseSize(storage->bytesUsed, instance->config.binaryPrefixType, &usedPretty);
|
||||
ffParseSize(storage.bytesUsed, instance->config.binaryPrefixType, &usedPretty);
|
||||
|
||||
FFstrbuf totalPretty;
|
||||
FF_STRBUF_AUTO_DESTROY totalPretty;
|
||||
ffStrbufInit(&totalPretty);
|
||||
ffParseSize(storage->bytesTotal, instance->config.binaryPrefixType, &totalPretty);
|
||||
ffParseSize(storage.bytesTotal, instance->config.binaryPrefixType, &totalPretty);
|
||||
|
||||
uint8_t percentage = calculatePercentage(storage);
|
||||
uint8_t percentage = storage.bytesTotal == 0
|
||||
? 0
|
||||
: (uint8_t) (((long double) storage.bytesUsed / (long double) storage.bytesTotal) * 100.0);
|
||||
|
||||
if(moduleArgs->outputFormat.length == 0)
|
||||
if(instance->config.memory.outputFormat.length == 0)
|
||||
{
|
||||
ffPrintLogoAndKey(instance, name, 0, &moduleArgs->key);
|
||||
if (storage->bytesTotal == 0)
|
||||
ffPrintLogoAndKey(instance, FF_MEMORY_MODULE_NAME, 0, &instance->config.memory.key);
|
||||
if (storage.bytesTotal == 0)
|
||||
puts("Disabled");
|
||||
else
|
||||
{
|
||||
FFstrbuf str;
|
||||
FF_STRBUF_AUTO_DESTROY str;
|
||||
ffStrbufInit(&str);
|
||||
|
||||
if(instance->config.percentType & FF_PERCENTAGE_TYPE_BAR_BIT)
|
||||
@@ -60,36 +54,14 @@ static void printMemory(FFinstance* instance, const char* name, const FFModuleAr
|
||||
|
||||
ffStrbufTrimRight(&str, ' ');
|
||||
ffStrbufPutTo(&str, stdout);
|
||||
ffStrbufDestroy(&str);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ffPrintFormat(instance, name, 0, moduleArgs, FF_MEMORY_NUM_FORMAT_ARGS, (FFformatarg[]){
|
||||
ffPrintFormat(instance, FF_MEMORY_MODULE_NAME, 0, &instance->config.memory, FF_MEMORY_NUM_FORMAT_ARGS, (FFformatarg[]){
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &usedPretty},
|
||||
{FF_FORMAT_ARG_TYPE_STRBUF, &totalPretty},
|
||||
{FF_FORMAT_ARG_TYPE_UINT8, &percentage},
|
||||
});
|
||||
}
|
||||
|
||||
ffStrbufDestroy(&usedPretty);
|
||||
ffStrbufDestroy(&totalPretty);
|
||||
}
|
||||
|
||||
void ffPrintMemory(FFinstance* instance)
|
||||
{
|
||||
FFMemoryStorage result;
|
||||
ffStrbufInit(&result.error);
|
||||
ffDetectMemory(&result);
|
||||
printMemory(instance, FF_MEMORY_MODULE_NAME, &instance->config.memory, &result);
|
||||
ffStrbufDestroy(&result.error);
|
||||
}
|
||||
|
||||
void ffPrintSwap(FFinstance* instance)
|
||||
{
|
||||
FFMemoryStorage result;
|
||||
ffStrbufInit(&result.error);
|
||||
ffDetectSwap(&result);
|
||||
printMemory(instance, FF_SWAP_MODULE_NAME, &instance->config.swap, &result);
|
||||
ffStrbufDestroy(&result.error);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user