diff --git a/CHANGELOG.md b/CHANGELOG.md index 2288758f2..55ce47ee0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,182 +1,59 @@ # 2.69.0 Changes: -* ImageMagick is no longer used for image logos on Windows, macOS and Android, and has been replaced by the platform image frameworks (WIC on Windows, ImageIO on macOS, AImageDecoder on Android). (Logo) - * An image logo needs Android 11 (API 30), the release that introduced the platform image decoder, and is reported as an error on Android 10 and older. -* ImageMagick 6 support is deprecated. It is kept only for old Debian and Ubuntu releases that don't have ImageMagick 7 available, and is intended to be removed in a future release. Users are encouraged to upgrade to ImageMagick 7 when possible. -* `quickjs` scripting for format strings is deprecated and now disabled by default. It's expected to be removed in the next release. - * It's introduced in 2.64.0 as an experimental feature. People relies on it should migrate their scripts to lua script instead. - * For now, it can be enabled by configuring with `cmake -DENABLE_QUICKJS=ON`. -* `lua` scripting for format strings is now considered stable. -* The `--logo-recache` option has been replaced by `--logo-cache `, and the `logo.recache` JSON property has been renamed to `logo.cache`. (Logo) - * `--logo-cache true` (the default) reuses a cached rendering when it is valid, and writes it back on a cache miss; `false` ignores the image logo cache completely, reading nothing from it and writing nothing to it; `regen` does what `--logo-recache true` used to do. `logo.cache` accepts a boolean, or the string `"regen"`. +* ImageMagick 6 is deprecated and will be removed in a future release. It remains available for older Debian and Ubuntu releases; upgrade to ImageMagick 7 when possible. +* The experimental QuickJS format scripting is deprecated, disabled by default, and planned for removal in the next release. Re-enable it with `cmake -DENABLE_QUICKJS=ON`, or migrate scripts to Lua. (General) +* Replaced `--logo-recache` and `logo.recache` with `--logo-cache` and `logo.cache`. Use `true` to reuse or create valid cache entries, `false` to disable caching, or `regen` to force regeneration. (Logo) +* Modules selected with `--structure` now honor their options from the JSON config. Features: -* Added Bluetooth Low Energy detection on Windows and macOS, through WinRT and Core Bluetooth. (Bluetooth, Windows / macOS) -* Added the `showType` option to the `Bluetooth` module, which selects which stacks are looked for. (Bluetooth) -* Added `{device-type}`, `{signal-quality}` and `{signal-quality-bar}` to the `Bluetooth` module, and `deviceType` and `signalQuality` to its JSON output. (Bluetooth) - * `deviceType` names the stacks a device answers on, `Classic` and/or `Low Energy`, and `signalQuality` is the signal strength of the LE link, converted from dBm on the same scale the `Wifi` module uses. - * Linux fills both from the BlueZ `Class`, `Appearance` and `RSSI` properties, and macOS from Core Bluetooth. The remaining platforms report `Classic` and no signal quality, which is what their backends can tell. -* Added Bluetooth Core 6.0, 6.1, 6.2 and 6.3 to the `BluetoothRadio` version table, so an adapter reporting LMP version 14, 15, 16 or 17 now prints its version instead of the vendor name alone. (BluetoothRadio) -* Added rum overlay package counting on RakuOS, exposed as `{rum}`. (Packages, Linux) -* Improved image logo support - * Backend rewritten - * Added a native image decoding backend on Windows (WIC), macOS (ImageIO) and Android (AImageDecoder). - * Added an embedded libsixel encoder, used to produce sixel output on Windows, macOS and Android. It is reported by `fastfetch --list-features` as "Embedded sixel". - * Enabled chafa image output on Windows, macOS and Android independently of ImageMagick. - * As a result, `fastfetch --sixel X:\path\to\image` now works out of the box on Windows Terminal. - * Image logo cache entries are now validated against the modification time of the source image, so editing an image logo in place invalidates its cached rendering. (Logo) - * Cache entries written by older versions are not reused, as they carry no modification time. - * Image logos can now be animated when the terminal and the image protocol support it. (Logo) - * `--logo-animation-frame <0>` (`logo.animationFrame: 0` in the JSON config) plays a GIF or APNG. Only the `kitty` image protocol can play an animation; the frames are decoded and composed by fastfetch, so no external program is involved. - * `--logo-animation-frame ` renders the Nth frame as a still image, and negative values count back from the end, so `-1` is the last frame. This works for the `sixel`, `kitty` and `chafa` logo types. Note that negative values can only be given in the JSON config, as the command line parser reads a leading `-` as another option. - * The default is `1`, which renders a still image, so nothing changes for anyone who does not opt in. The frames come from the platform image framework (WIC on Windows, ImageIO on macOS, AImageDecoder on Android, ImageMagick 7 on Linux); a single-frame GIF falls back to a still image. - * On Android an animation needs Android 12 (API 31), and the repeat count is not available there, so an animation is reported as looping forever. A build with no image decoder, or one built with ImageMagick 6, reports an error instead of silently showing a still image. - * A terminal that supports the kitty graphics protocol but not its animation frames, such as Konsole, shows the first frame. - * Added the CMake option `ENABLE_IMAGE_LOGO`, which defaults to `ON`. Configure with `-DENABLE_IMAGE_LOGO=OFF` to build fastfetch without any image logo support to reduce binary size. (Logo) - * Image logos are the only consumer of ImageMagick, chafa, and the embedded libsixel encoder, so none of the three is searched for at configure time, and no image decoding sources are compiled in. This is intended only to reduce binary size on embedded systems (such as OpenWrt). - * The `sixel`, `kitty`, `kitty-direct`, `kitty-icat`, `iterm` and `chafa` logo types are rejected with an error, both on the command line and in the JSON config, and the `auto` logo type never tries an image. - * `--logo-type raw` keeps working: it passes a pre-rendered byte stream through unchanged and needs no decoder, so a logo can still be displayed by converting the image externally. -* Added CPU name and frequency detection support on SPARC. (CPU, Linux) -* Added package detection support for CRUX. (Packages, Linux) - * Exposed in custom format as `{crux}`. -* Improved Android ROM detection (DE, Android) - * Added support for HarmonyOS, HarmonyOS NEXT, Flyme, JOYUI, SmartisanOS, realme UI, HydrogenOS, ZUI, ZUXOS, MyOS, NebulaAIOS, ObricUI, MiFavor, LineageOS, PixelExperience, EUI and 360 UI. - * Added support for MagicUI 3.x, which stores a bare version number instead of a `MagicUI_x.y.z` string. - * Added Samsung OneUI support (#2541) - * It is read from system properties, so no particular Android version is required. This is mostly untested due to lack of available devices running these ROMs. Please report any issues you encounter. -* Improved Camera detection on Android (Camera, Android) - * The camera list is now read from the camera2 NDK instead of `termux-api CameraInfo`, so the Termux:API app is no longer required and no subprocess is spawned. - * This needs Android 7.0 (API 24), which is where the camera2 NDK was introduced. -* Improved Battery detection on Android (Battery, Android) - * The charge level and charging state are now read from the battery properties service over `/dev/binder` instead of `termux-api BatteryStatus`, so the Termux:API app is no longer required and no subprocess is spawned. - * The service interface changed in Android 10, and the right request is picked at run time, so every Android release is covered. - * Battery temperature, cycle count, manufacturer, model name, serial number and manufacture date need the `BATTERY_STATS` permission, which an app cannot obtain, so an app no longer reports them. - * Running as `adb shell` or as root, `dumpsys battery` is used, which also reports the battery temperature and technology, and reports a battery that has reached the critical level as such. An app can read none of the three. -* Improved Display detection on Android (Display, Android) - * The displays are now read from the display service instead of a vendor property that only some Xiaomi devices set. The preferred mode, the physical size, the rotation, the manufacture date and the display id are now reported as well. - * This needs Android 13 (API 33). On Android 12 and older only that vendor property is available to an app, and a device that does not set it reports no display. - * Running as `adb shell` or as root, `dumpsys display` is used as well, which is what covers Android 12 and older. - * The refresh rate is now the rate of the active display mode, and the HDR capability is read from the display itself, for every display rather than only for the built-in one. -* Improved WiFi detection on Android (Wifi, Android) - * The connection details are now read from the WiFi service over `/dev/binder` instead of `termux-api WifiConnectionInfo`, so no subprocess is spawned. - * The Termux:API app is still required, though. It is what carries the WiFi permission that the Termux app does not request itself, so uninstalling it turns this module off. - * A location permission is required as well, and Termux:API is what carries that one too. The WiFi service withholds the SSID and the BSSID from an app that does not hold one, and hands both over once it is granted; until then the signal, the rates, the frequency, the Wi-Fi standard and the security type are reported as usual, and the two names are reported as ``. The grant has to be for all the time rather than only while the app is in use, as the service withholds the two names from an app that is not in the foreground either -- which is the state a run over `ssh` is in. - * The interface name and its state, the connection state, the Wi-Fi standard and the security type are now reported as well. - * The security type is reported from Android 12 on. The reply Android 11 sends ends before that field, so the `security` field stays empty there. - * This needs Android 11 (API 30), the release that moved the Wi-Fi framework into an APEX. There is no fallback, so Android 10 and older report an error instead. - * WiFi detection on Android is experimental. The reply the WiFi service hands an app drifts between Android releases and between vendors, and what it contains also depends on the permissions the calling app holds, so a device can report less than its connection has. Please report anything that looks wrong or missing. -* Improved COSMIC detection (DE / WM, Linux) - * The version is now read from the `COSMIC_VERSION` environment variable when it is set. -* Improved accuracy and performance of process name detection in the Top module. (Top, macOS) -* Improved `winget` Packages detection on Windows (Packages, Windows) - * The source agreements are accepted non-interactively on a machine that has never accepted them, so no user interaction is required for the first run. - * The count reports the packages the `winget` source knows about, which is not limited to the packages `winget` itself installed. Microsoft Store apps are no longer counted. - * `winget list` takes about 1.5 seconds, so its result is cached. The cache is refreshed when a program is installed or removed, not on a timer, so only the first run after such a change is slow. - * Note that `winget` is still disabled by default. It can be enabled by setting `packages.disabled` to an empty array or by configuring with `cmake -DPACKAGES_DISABLE_WINGET=OFF`. -* Improved Wallpaper detection on macOS Sonoma and later (#2559, Wallpaper, macOS) - * The image path is now also extracted from the `Configuration` field of the wallpaper plist, and the `NSWorkspace` fallback is used only as a last resort. -* Removed the `kvm` dependency on OpenBSD by using `sysctl` directly. (General, OpenBSD) -* Modules that were selected on the command line via `--structure` / `-s` now honor module options configured in the JSON config. (CommandOption) -* Improved reliability of fastfetch's built-in HTTP client. (PublicIP, Weather) - * It now supports custom ports and can properly handle chunked transfer encoding. It is designed for minimal resource usage and fast performance, and does not support full HTTP features like HTTPS; the `Command` module with `curl` can be used for those. -* Added Umbriel wayland compositor version detection (WM, Linux) -* Improved the player name detection on Windows to show the name Windows shows for it. (Player, Windows) - * An unpackaged player such as Chrome is now reported as `Google Chrome` instead of `Chrome`. -* The `waitTime` option of `DiskIO`, `NetIO` and `Top` now defaults to `250` ms instead of `500`. (DiskIO / NetIO / Top) - * This change improves the responsiveness while maintaining reasonably accurate measurements. -* Added battery level detection for the DualSense, the DualSense Edge and the Access Controller, and for the Nintendo Switch Joy-Con, to the `gamepad` module on Windows. (Gamepad, Windows) - * The module also names the Sony Access Controller and the Nintendo Switch 2 controllers, which it previously left to Windows' own naming. -* Added battery level detection for the controllers the GameController framework knows, in the `gamepad` module on macOS. (Gamepad, macOS) - * The framework is the only source of a battery level on macOS, so a controller on Apple's allow list -- the official Sony, Microsoft and Nintendo ones, plus MFi pads -- now reports a percentage where it previously reported none. A controller outside that list is still listed from IOKit as before, with no battery, so nothing is lost. - * Those controllers are also named the way the system names them now, taken from the framework instead of from the HID strings. A Switch Pro Controller, for example, is reported as `Switch Pro Controller` rather than `Pro Controller`. The name of a controller the framework does not claim is unchanged. Because `ignores` matches on a name prefix, a config that hides controllers by manufacturer name may need to be adjusted. - * The serial number is unchanged: the framework has no serial of its own, so it is borrowed from the IOKit entry for the same controller. - * Needs macOS 11.0, the release that introduced `GCDeviceBattery`. - * `[GCController controllers]` is filled by a system daemon, and only while the run loop is pumped, so the module pumps it for at most 50 ms -- but only after confirming that the framework claims a connected controller. The wait is therefore not paid on a machine with no controller, or with one Apple does not claim. -* Added the `general.preload.lua` option, which runs a Lua script as the config is read, so a file of helpers can be shared by several modules instead of being repeated in every one. (General) - * It runs before any module does, so a script that raises is reported as a config error and stops the run, instead of being printed as the failure of whichever module happened to come first. - * A config that sets it therefore starts the Lua interpreter even when no `lua:` format string is used. - * The script loads its own helpers with `dofile` or `loadfile`. `require` is not available, and neither is the rest of Lua's `package` library, so a config file still cannot load a `.so` / `.dll`. - * A build without Lua support rejects the option instead of accepting it and doing nothing. +* Improved Bluetooth detection support: + * Added Bluetooth Low Energy detection on Windows and macOS. + * Report device type (LE or classic) and signal quality, if available. + * Added Bluetooth Core 6.0–6.3 version reporting. (BluetoothRadio) +* Improved image log support: + * Image logos on Windows, macOS, and Android now use native image processing libraries instead of ImageMagick. + * For package managers: ImageMagick dependencies can be removed on macOS, Windows and Android as they are no longer used for image logos. + * Windows Terminal supports sixel logos out of the box + * Changes to a source image now correctly invalidate its cache. (Logo) + * Added GIF and APNG support to `--kitty` image protocol. Set `logo.animationFrame` to `0` to play animations in compatible kitty terminals; positive or negative values select a still frame. Android animation requires Android 12 (API 31); unsupported terminals show the first frame. (Logo) + * Added cmake option `-DENABLE_IMAGE_LOGO=` (default `ON`) to disable image logos and reduce binary size. `raw` logos remain available. (Logo) +* Improved Linux support: + * Added RakuOS rum overlay package counting (`{rum}`) and CRUX package detection (`{crux}`). (Packages) + * Added CPU name and frequency detection on SPARC. (CPU) + * Improved COSMIC version detection and added Umbriel version detection. (DE / WM) +* Improved Android support: + * Expanded ROM detection to HarmonyOS, Flyme, OneUI, LineageOS, and many other ROMs. (DE) + * Improved camera detection; Android 7 (API 24) or later is required. (Camera) + * Battery level and charging state are now available to apps; detailed battery information requires root or ADB. (Battery) + * Added display mode, physical size, rotation, and HDR information. App-based detection requires Android 13 (API 33); root or ADB can also detect displays on older versions. (Display) + * Added Wi-Fi interface, connection, standard, and security information. Android 11 (API 30) or later is required. Termux:API and location permission are needed to reveal SSID and BSSID; otherwise, they appear as ``. (Wifi) +* Improved macOS support: + * Improved process-name detection in Top. (Top) + * Improved wallpaper detection on macOS Sonoma and later. (#2559, Wallpaper) +* Improved Windows support: + * `winget` now counts packages from configured sources, excludes Microsoft Store apps, and caches results. It remains disabled by default. (Packages) + * Player names now match the names shown by Windows (for example, Chrome is reported as Google Chrome). (Player) +* Added battery-level detection for more controllers on Windows and macOS. (Gamepad) +* Improved macOS controller name detection (macOS, Gamepad) + * macOS controller names now match the system; configs that filter by name may need updating. + * Requires macOS 11 or later. +* Improved the built-in HTTP client used by PublicIP and Weather; it now supports custom ports and chunked responses. (PublicIP / Weather) +* Reduced the default `waitTime` for DiskIO, NetIO, and Top from 500 ms to 250 ms. (DiskIO / NetIO / Top) +* Added `general.preload.lua` for loading shared Lua helpers before modules run. It requires a Lua-enabled build and starts the Lua interpreter whenever configured. (General) + * Lua format scripting is now considered stable. Bugfixes: -* Fixed Base64 encoding producing incorrect output for some inputs. (General) -* Fixed image logos not working when ImageMagick is built without a quantum depth suffix in its library name, as is the case on FreeBSD. (Logo, FreeBSD) -* Fixed TerminalFont detection on Windows ignoring Windows Terminal JSON fragment files. (#2573, TerminalFont, Windows) -* Fixed 64-bit values being truncated by `strtoul` on platforms where `unsigned long` is 32-bit. (Swap / PhysicalDisk / PhysicalMemory / GPU) -* Fixed read-only SQLite databases failing with `SQLITE_READONLY` when the database directory is not writable. (Packages) - * This fixes PKG package count detection on FreeBSD. -* Fixed `{#keys}` and `{#title}` in module format strings not honoring the `brightColor` display option. (Format) -* Fixed `paddingTop` and `paddingLeft` being ignored by the `kitty-icat` image logo type. (Logo) -* Fixed module format strings mishandling a value that carries more than one leading ANSI escape sequence: the second escape was taken for the start of the trailing reset, so `:`, `<`, `>` and `|` left the value untruncated instead of truncating it. -* Fixed issues when running on big-endian platforms. -* Fixed building on FreeBSD 16.0-CURRENT, where `` defines `memrchr` as a qualifier-preserving function-like macro. (General, FreeBSD) -* Worked around an iTerm bug where the image logo may be moved out of view. (Logo) -* Increased the terminal response wait time to 1s to improve compatibility with slower terminals. (General) -* Fixed the `PublicIp` and `Weather` modules exiting with "can only be used once due to internal limitations" on the round after a failed request when `--dynamic-interval` is used, instead of retrying. (PublicIp / Weather) -* Fixed the `Display`, `Monitor`, `WM`, `DE`, `Media`, `Player`, `Shell` and `Terminal` modules replaying the first round's result when `--dynamic-interval` is used. The detection results that are cached for the whole run are now dropped between rounds, so these modules detect again on every round. (Display / Monitor / WM / DE / Media / Player / Shell / Terminal) -* Fixed the `Command` module printing the internal marker `[BUG] command queue is empty` when it is selected with `--structure`; it now reports that module options are unsupported and exits with an error. (Command) -* Fixed `condition.succeeded` being evaluated differently in the prepare and the print pass, which could make a module print another module's output. (General) -* Fixed negative values for numeric options wrapping around to huge unsigned ones, which made `separator.times` write four billion characters and `waitTime` sleep for about 50 days. (Separator / CpuUsage / NetIO / DiskIO / LoadAvg) -* Fixed the module index wrapping around at 256 in the `command.splitLines` output. (Command) -* Fixed carriage returns not being stripped from the `command.splitLines` output on Windows. (Command, Windows) -* Fixed the `logo` module's JSON `type` never containing `"normal"`. (Logo) -* Fixed the JSON schema describing `custom.key` as the opposite of what the module does. (Custom) -* Fixed the JSON schema rejecting the `custom` and `logo` module types, the `GNU` and `Unknown` systems and the `sh` and `Unknown` architectures. (General) -* Fixed the JSON schema giving `command` a description different from the module registry. (Command) -* Added a JSON result to the `custom` module. (Custom) -* Fixed the `gpu` and `top` modules both declaring default order 36. (General) -* Removed the `kernel` format variable `{display-version}`, which was declared but never passed. (Kernel) -* Fixed `editor` detection treating a failure as a success and printing an empty or half-filled line without an error. (Editor) -* Fixed the `display` module's `order` option being ignored by `--format json`. (Display) -* Fixed compact mode printing `120Hz` where the normal mode prints `120 Hz`. (Display) -* Fixed the `display` module sorting the process-wide display server result in place, which reordered it for every other consumer. (Display) -* Removed 14 `*_nosupport.c` files that no platform block referenced. (General) -* Fixed the `media` module leaking a downloaded cover file on every run. (Media) -* Fixed the JSON schema for `packages.disabled` rejecting 8 names the parser accepts, and dropping the build-time default. (Packages) -* Fixed the JSON schema declaring `percent` for the `cpucache`, `cursor`, `datetime`, `editor` and `font` modules, which the parser rejects, and added the missing declaration for `wifi`. (General) -* Fixed the `custom` module's JSON `error` field being a dangling pointer when a script failed. (Custom) -* Fixed the `vulkan` module writing `deviceId` twice into every GPU object of its JSON result. (Vulkan) -* Fixed the `opencl` and `vulkan` modules writing `memory.*.used` from the total. (OpenCL / Vulkan) -* Fixed the `gpu` module's `hideType` filter being applied to the console output but not to `--format json`. (GPU) -* Fixed the `gpu` module's OpenGL fallback reporting all four memory fields as `0` instead of "unset", which made a format string print `0 B` and the percentage print `nan%`. (GPU) -* Fixed the `de` module not reporting a version for GNOME Classic. (DE, Linux) -* Fixed the `de` module's Trinity version detection never matching, as the display server reports `Trinity` or `TDE` rather than the lowercase `trinity` the dispatch compared against. (DE, Linux) -* Fixed the JSON schema pointing `keyColor` and `keyWidth` at non-existent `display.color.key` and `display.keyWidth` paths. (General) -* Fixed the JSON schema rejecting an empty module `key`, which the parser accepts and treats as "use the default name". (General) -* Fixed the JSON schema for `separator.times` having no upper bound, so values the runtime rejects passed validation. (Separator) -* Fixed the JSON schema declaring `showPeCoreCount` as defaulting to `false` when the runtime defaults it to `true`. (CPU) -* Fixed the JSON schema for `cpucache` not declaring the `compact` option, which made a valid configuration fail validation. (CPUCache) -* Fixed the JSON schema for `cpu` omitting the x86-only `{code-name}` and `{technology}` format variables. (CPU) -* Added the missing `{threads}` format variable to the `processes` module, which its default output already printed. (Processes) -* Added the missing `{kernel-release}` format variable to the `os` module. (OS) -* Fixed the `poweradapter` module documenting `{model}` while passing the value as `{model-name}`, so the documented variable was never substituted. (PowerAdapter) -* Fixed the JSON schema for `processes` omitting `{threads}`. (Processes) -* Fixed the `datetime` module's `{day-in-year}` variable wrapping around at day 256 and printing a wrong value for the rest of the year. (DateTime) -* Fixed the `datetime` module's `{hour-12}` variable being `0`-`11` while `{hour-12-pretty}` is `01`-`12`, so the two disagreed at midnight and noon. (DateTime) -* Fixed the `colors` module using out-of-range `paddingLeft` and `block.width` values instead of reporting them: `paddingLeft: -1` made the run write four billion spaces without ever finishing, and `block.width` was truncated to a byte (`256` printed nothing, `300` printed 44 cells). (Colors) -* Fixed the `vulkan` module's JSON result missing `instanceVersion`, which the detection layer already provides. (Vulkan) -* Fixed the `vulkan` module reporting every device that is not discrete as `Integrated`, so virtual and `OTHER` devices are no longer indistinguishable from a real integrated GPU. (Vulkan) -* Fixed the `camera` and `wifi` modules printing "Not support on this platform" instead of "Not supported on this platform" on platforms that have no implementation. (Camera / Wifi) -* Fixed the `colors` module reading a `block.range` element that is not an integer as `0`, so `[1.5, 3]` and `["x", 3]` printed the colours of `[0, 3]` without reporting anything. (Colors) -* Fixed the `bluetooth` module numbering a machine's only adapter (`Bluetooth 1`) instead of using the bare module name, which every other multi-entry module gets right. (Bluetooth) -* Fixed the `camera` module leaving `colorspace` uninitialized in its macOS backend, so a device reporting a colour space outside the known list produced a garbage string. (Camera, macOS) -* Added the missing `battery` field to the `gamepad` module's JSON result, which the detection layer already provides and the console output already prints. (Gamepad) -* Fixed the `gamepad` module leaking the name and the serial of every device when all of them are filtered out by `ignores`. (Gamepad) -* Fixed the `dns` module appending an uninitialized entry on Windows when an adapter reports a DNS server whose address family is neither IPv4 nor IPv6. (DNS, Windows) -* Added the missing `globalReservation` object (`used` / `total`) to the `btrfs` module's JSON result. The detection layer had been reading `allocation/global_rsv_size` and `allocation/global_rsv_reserved` into fields that neither the JSON nor a format variable exposed. (Btrfs) -* Fixed the `btrfs` module storing the free part of the global reservation as its used part. (Btrfs) -* Fixed the `keyboard` module leaking the name and the serial of every device that is filtered out by `ignores`. (Keyboard) -* Fixed the `keyboard` module reporting "No mouse support on this platform" instead of "No keyboard support on this platform" on platforms that have no implementation. (Keyboard) -* Fixed the `localip` module's `{is-default-route}` variable printing the internal bit field (`2`, `4`, `6`) instead of the families the interface carries the default route for (`ipv4`, `ipv6`, `ipv4,ipv6`). (LocalIp) -* Fixed the `sound` module always reporting itself as failed, which suppressed every following module gated on `condition.succeeded`. (Sound) -* Fixed the `top` module rejecting `sort: "threads"`, which the JSON schema documents and `--gen-config` emits. (Top) -* Fixed the `display.temp` validation errors naming the long-removed `display.temperature` key, which the config parser rejects. (General) -* Fixed a memory leak in the `wifi` module on Windows when the BSS list comes back empty. (Wifi, Windows) -* Fixed `--gen-config` hanging forever when stdout is redirected to `NUL` or MSYS2's `/dev/null`. On Windows `isatty()` reports a character device rather than a console, so a redirected run was mistaken for an interactive one. (General, Windows) -* Fixed the `gamepad` module reading the DualShock 4 battery level on Windows out of a report layout it guessed from the buffer length. A controller that has not been switched to its extended report mode sends the plain HID gamepad report, which carries no battery level, so the guess read a zeroed region and reported 0%. The layout now follows the report id, and the level is scaled the way SDL scales it, so a level of 8 is 85% rather than 100%. (Gamepad, Windows) -* Fixed the `gamepad` module on Windows giving up on a Switch controller's battery after a single read. A Switch controller interleaves its full state report with the replies it sends to subcommands, and on the Pro Controller these made up four fifths of the traffic, so the one report the module read almost never carried a battery and the controller always reported 0%. It now keeps reading until a full state report arrives, within the same one-second budget. (Gamepad, Windows) -* Some internal cleanups and optimizations. +* Fixed image logo caching, padding, and positioning issues, including an iTerm display bug. (Logo) +* Fixed several Windows issues, including Windows Terminal font detection, redirected `--gen-config` output, and gamepad battery reporting for DualShock 4 and Switch controllers. (#2573, TerminalFont; Gamepad; General) +* Fixed formatting and display issues, including ANSI-aware truncation, date/time formatting, and bright key/title colors. (Format / DateTime / Display) +* Fixed `--dynamic-interval` retries and stale results across multiple rounds. (PublicIP / Weather / Display / Monitor / WM / DE / Media / Player / Shell / Terminal) +* Fixed invalid numeric and color options that could cause hangs or excessive output. (Separator / CPUUsage / NetIO / DiskIO / LoadAvg / Colors) +* Fixed JSON output and config validation across several modules, including GPU, Btrfs, Gamepad, Packages, and Custom. (General) +* Fixed GPU memory and device-type reporting, GNOME Classic and Trinity version detection, and default-route family names. (GPU / DE / LocalIP) +* Fixed module output and filtering issues affecting editor failures, sound status, command selection, and ignored keyboard/gamepad devices. (Editor / Sound / Command / Keyboard / Gamepad) +* Fixed package counting with read-only databases and corrected other package detection and JSON output issues. (Packages) +* Fixed Base64 encoding, big-endian handling, and 64-bit value truncation on 32-bit platforms. (General) Logos: * Added ALT Atomic