Only use XKB with libxkbcommon defaults when no layout is configured, but
fall back to VT-based input when KEYMAP is set without XKBLAYOUT. This
preserves any user console keymap configuration.
Bone NI [Wed, 13 May 2026 10:59:14 +0000 (10:59 +0000)]
Translated using Weblate (Lao)
Currently translated at 100.0% (8 of 8 strings)
Added translation using Weblate (Lao)
Co-authored-by: Bone NI <bounkirdni@gmail.com>
Translate-URL: https://translate.fedoraproject.org/projects/plymouth/master/lo/
Translation: plymouth/main
The version generator can compare version strings and can derive git
checkout versions from the last numeric release tag.
Checkout versions use the last commit date plus a commit count that
starts over after the latest release tag. If the next commit is from the
same day as the release, or from an older-dated commit that lands after
the tag, the date-based prefix does not move past the release while the
count drops back to a small number. Users and packagers then see a
post-release checkout report a version that sorts older than the release
baseline.
This commit resolves that ordering problem by comparing the generated
version with the last numeric release tag and, when needed, emitting the
release tag base with a micro value advanced by the number of commits
since that release.
The git-checkout version series now handles release tags, missing
release history, and post-release ordering consistently.
Ray Strode [Thu, 14 May 2026 04:49:54 +0000 (00:49 -0400)]
generate-version: Add version comparison helper
The version generator handles exact numeric release tags and git
checkouts without release tags before emitting a dated version for other
checkouts.
The project still lacks a small ordering primitive for comparing the
dated version with the latest release tag. Without that, the generator
cannot make a later adjustment when the date-based value sorts before the
release it follows.
This commit lays groundwork for that adjustment by adding a shell helper
that compares two version strings with Git's version sort order.
The final commit will use that helper to keep post-release generated
versions ordered after the most recent numeric release tag.
Ray Strode [Thu, 14 May 2026 04:48:48 +0000 (00:48 -0400)]
generate-version: Handle checkouts without release tags
The version generator now uses numeric release tags consistently when it
derives versions from git checkouts.
Some CI jobs build from shallow clones, and packaging jobs sometimes
fetch branch tips without tags. Those trees do not have enough local
metadata to compute a release-relative version, but the script should
still produce a checkout version instead of treating the missing tag as
an empty revision range.
This commit addresses that by allowing the release-tag lookup to be empty
and counting the commits reachable from HEAD in the available checkout
when no numeric release tag is present.
The final commit will keep generated checkout versions ordered after the
most recent numeric release tag.
Ray Strode [Thu, 14 May 2026 04:47:35 +0000 (00:47 -0400)]
generate-version: Select numeric release tags
The version generator now returns exact numeric release tags before using
its fallback date-based version for other git checkouts.
The fallback path still asks Git for the nearest described tag without
making the release-tag rules explicit. That can make version derivation
depend on tag shapes that are not Plymouth release versions.
This commit addresses that by looking up the fallback baseline with the
same numeric tag match used for exact release checkouts, then reusing the
matched tag when counting commits since the last release.
Subsequent commits will cover histories where no matching release tag
exists.
Ray Strode [Thu, 14 May 2026 04:46:18 +0000 (00:46 -0400)]
generate-version: Return exact release tags
The version generator derives git-checkout versions from the last commit
date and the number of commits since the most recent release tag.
Release checkouts still flow through the generated-version path, so a
checked-out release can report a dated micro version instead of the tag
that identifies the release.
This commit begins tightening git-checkout version derivation by
returning an exact numeric release tag before falling back to the dated
version format.
Subsequent commits will reuse numeric release tag lookup for the other
git-checkout version paths.
Daniel van Vugt [Fri, 20 Feb 2026 07:43:51 +0000 (15:43 +0800)]
generate-version: Specify options before format
This is strongly implied in the command line help and man page.
While GNU date doesn't care about ordering, uutils (Rust) date does
enforce the ordering (in current releases). Use the ordering suggested
by date's own documentation and supported by all implementations.
It was fixed upstream this week:
https://github.com/uutils/coreutils/issues/10972
https://github.com/uutils/coreutils/issues/10910
Clayton Craft [Wed, 25 Feb 2026 01:04:18 +0000 (17:04 -0800)]
allow configuring an additional key for Escape
Some devices (phones/tablets) don't have keyboards, so this allows
specifying an additional key using a new config option
(XkbExtraEscButton) that works like Esc e.g. for hiding the splash.
Aaron Andersen [Sun, 8 Mar 2026 20:37:45 +0000 (16:37 -0400)]
ply-device-manager: fix build failure when udev support is disabled
The input device management functions (on_each_renderer_add_input_device,
add_input_device_to_renderers, on_each_input_device_add_to_renderer,
add_input_devices_to_renderer, on_each_input_device_remove_from_renderer,
remove_input_device_from_renderers) were placed inside the #ifdef HAVE_UDEV
block, but are called unconditionally from
create_devices_for_terminal_and_renderer_type(). This caused an
"implicit declaration" build error when udev support is disabled.
Move these functions outside the #ifdef HAVE_UDEV guard, and place the
genuinely udev-specific functions (drm_device_in_use,
fb_device_has_drm_device) into their own #ifdef HAVE_UDEV block.
Clayton Craft [Wed, 25 Feb 2026 02:33:10 +0000 (18:33 -0800)]
ply-device-manager: fall back to default XKB keymap when no layout is configured
Plymouth was skipping all input devices when no XKB layout was configured.
Passing NULL to xkb_keymap_new_from_names to lets libxkbcommon use
its own defaults, so input devices are used regardless of whether
the system has a keyboard layout configured in vconsole.conf.
D Scott Phillips [Mon, 26 Jan 2026 17:25:32 +0000 (09:25 -0800)]
ply-keyboard: Fix hang on read of incomplete terminal control sequence
It's possible for a read from the terminal to provide a partial command
sequence, starting with the CSI ('\x1b\x5b') but not terminating with
its function character ('\x40'..'\x7e'). In that case, the input byte
handling loop would not terminate, causing plymouthd to hang both itself
and possibly completion of the boot.
Break from the input byte handling loop when an incomplete command
sequence is found so that the program does not hang. The incomplete
command sequence will remain in the input buffer so that a later
completion of the command sequence can be handled.
n3rdopolis [Thu, 4 Dec 2025 13:31:36 +0000 (08:31 -0500)]
Display the first specified XKBLAYOUT as the active one, instead of the last
This fixes https://bugzilla.redhat.com/show_bug.cgi?id=2416197
This corrects the keymap display when users specify multiple keymaps
in /etc/vconsole.conf
label-freetype: fix UAF in set_font_for_control() with hidpi (scale_factor 2)
On hidpi screens, label-freetype will trigger a use-after-free in
set_font_for_control() via the call in update_scale_factor_from_pixel_buffer().
That call passes label->font as the font parameter to set_font_for_control().
set_font_for_control() then calls strdup() on its font argument, and
frees label->font. In this case this causes font to point into freed
memory, causing a read use-after-free in the following strstr() and
strrchr() calls.
Fix the issue by only using the freshly strdup()'d new_font variable
after freeing label->font.
xinpeng wang [Mon, 1 Dec 2025 08:16:19 +0000 (16:16 +0800)]
Fix: script: Ensure Window.GetX/Y() returns 0 for correct multi-display centering
When multiple displays of different resolutions are attached, the Plymouth script
plugin uses a virtual "max canvas" (defined by max_width and max_height) for
rendering. Individual displays calculate their offsets (display->x, display->y)
relative to this max canvas for mirroring/centering.
The script-level centering formula, as seen in example themes:
logo.sprite.SetX (Window.GetX() + Window.GetWidth() / 2 - logo.image.GetWidth() / 2);
Issue:
For the script to correctly calculate the absolute center position on the max canvas,
Window.GetX() must conceptually return the origin of the max canvas, which is 0.
However, the non-indexed implementation of sprite_window_get_x (and GetY) currently
returns the maximum calculated display offset (MAX(display->x)), which corresponds to
the offset of the smallest display. This incorrect, non-zero return value introduces
an unintended shift, pushing sprites (like the logo) off-center, and breaking the
centering logic.
Solution:
Update sprite_window_get_x and sprite_window_get_y to return the minimum calculated
display offset (MIN(display->x)). Since the largest display always has an offset of 0,
this guarantees that Window.GetX() and Window.GetY() return 0 when called without
parameters, correctly anchoring the script-calculated center position to the absolute
max canvas origin.
A S Alam [Thu, 16 Oct 2025 17:54:22 +0000 (17:54 +0000)]
Translated using Weblate (Punjabi)
Currently translated at 100.0% (8 of 8 strings)
Co-authored-by: A S Alam <aalam@users.noreply.translate.fedoraproject.org>
Translate-URL: https://translate.fedoraproject.org/projects/plymouth/master/pa/
Translation: plymouth/main
Co-authored-by: Fco. Javier F. Serrador <fserrador@gmail.com>
Translate-URL: https://translate.fedoraproject.org/projects/plymouth/master/es/
Translation: plymouth/main
Hans de Goede [Wed, 2 Jul 2025 07:31:21 +0000 (09:31 +0200)]
Fix keymap and capslock icon on displays on second GPU
The keymap and capslock code in src/plugins/renderers/drm/plugin.c relies
on the terminal passed to backend_create() to get the keymap and current
capslock state (when not using evdev input because of e.g. no XKBLAYOUT
in /etc/vconsole.conf which is the default in at least Fedora).
When 2 GPUs which both have displays attached are used only the first
one gets passed the local_console_terminal as terminal (it is considered
the terminal owner and e.g. listens for keypresses). This leads to keymap
and capslock icons not being shown on displays attached to the second GPU.
To fix this add a second ply_terminal_t argument to backend_create() called
local_console_terminal, which will pass the local_console_terminal to both
drm plugin instances. And modify the drm plugin capslock and keymap code to
use this instead of the normal terminal argument which will be NULL on
the second GPU.
Hans de Goede [Tue, 1 Jul 2025 18:41:24 +0000 (20:41 +0200)]
Add UseSimpledrmNoLuks config file keyword
Add a UseSimpledrmNoLuks config file keyword this enables simpledrm use,
like the existing "UseSimpledrm" config file keyword. Except when using
LUKS. Showing the LUKS unlock screen using simpledrm has 2 problems:
1. If the GPU drivers are built into the initrd then typically the
unlock screen will briefly show and then the screen goes black
2. The i915 driver uses the firmware framebuffer as fallback when
userspace has not installed a fb to scan out from. This happens
e.g. on logout between the user-session and the display-manager.
Drawing the unlock screen on the simpledrm fb results in it briefly
showing when logging out, which looks quite ugly.
This allows distributions to chose to only enable simpledrm when
LUKS is not used.
Hans de Goede [Tue, 1 Jul 2025 12:37:03 +0000 (14:37 +0200)]
drm: Fix crash when terminal fd is still -1 after reconnect
The drm plugin code installs a fd disconnect handler for the terminal fd
which simply calls open_input_source () again.
This assumes that the ply-terminal code's disconnect handler has run first
(which it should) and that ply_terminal_reopen_device () has successfully
re-opened the terminal. This last condition is not always true, resulting
in open_input_source () calling ply_event_loop_watch_fd () with a -1 fd
triggerig an assert in ply_event_loop_watch_fd ():
5 0x00007f62d39a1c6f in __assert_fail (assertion=<optimized out>, file=<optimized out>, line=<optimized out>, function=<optimized out>) at assert.c:127
6 0x00007f62d3bc22c7 in ply_event_loop_watch_fd (loop=<optimized out>, fd=-1, status=status@entry=PLY_EVENT_LOOP_FD_STATUS_HAS_DATA,
status_met_handler=status_met_handler@entry=0x7f62d3790870 <on_terminal_key_event>,
disconnected_handler=disconnected_handler@entry=0x7f62d3790c70 <on_input_source_disconnected>, user_data=user_data@entry=0x5647f7dd9fb8)
at ../src/libply/ply-event-loop.c:732
7 0x00007f62d3790bf6 in open_input_source (backend=0x5647f7dd9f90, input_source=0x5647f7dd9fb8) at ../src/plugins/renderers/drm/plugin.c:1930
8 0x00007f62d3bcbd53 in ply_event_loop_handle_disconnect_for_source (loop=<optimized out>, source=0x5647f7dd69f0) at ../src/libply/ply-event-loop.c:1065
9 ply_event_loop_disconnect_source (loop=<optimized out>, source=0x5647f7dd69f0) at ../src/libply/ply-event-loop.c:1157
10 ply_event_loop_process_pending_events (loop=0x5647f7dd13e0) at ../src/libply/ply-event-loop.c:1277
11 0x00007f62d3bcc068 in ply_event_loop_run (loop=0x5647f7dd13e0) at ../src/libply/ply-event-loop.c:1311
12 0x00005647c99bba48 in main (argc=<optimized out>, argv=<optimized out>) at ../src/main.c:2572
Fix this by checking that the fd >= 0 before calling
ply_event_loop_watch_fd ().
The above backtrace is from the drm plugin, but the same problem exists
in the frame-buffer plugin. So this fix is applied to both.
Hans de Goede [Thu, 3 Jul 2025 10:23:57 +0000 (12:23 +0200)]
two-step: Remove ':' at the end of (passphrase) prompt below text entry field
When asked for e.g. a disk unlock passphrase, plymouth will be passed
a prompt like: "Please enter passphrase for disk $DISK:" the ':' in
the end makes sense when asking for this a text console, but this makes
less sense in the two-step disk unlock screen where the text is below
the passphrase entry field.
Strip any ':' char at the prompt's end on two-step's disk unlock screen.
Hans de Goede [Thu, 3 Jul 2025 11:05:13 +0000 (13:05 +0200)]
ply-keymap-icon: Fix falling back to label-plugin when there is no pre-rendered text
In order for the fallback path (keymap_icon->has_prerendered_text == false)
to work properly keymap_icon->keymap_name must be set when no pre-rendered
text is found.
Tested by temporarily removing the "us" entry from ply-keymap-metadata.h.
Janne Grunau [Sat, 17 May 2025 06:57:06 +0000 (08:57 +0200)]
drm: Add simpledrm HiDPI display support
For devicetree based systems simpledrm might know the actual physical
display dimensions. Test if the reported connector width and height
result in a pixel density larger than 96 DPI. If that's the case
calculate the device scale instead of guessing it based on the
resolution.
This restores HiDPI scaling on 13-inch Apple silicon Macbooks with a
resolution of 2560x1600 (224 - 227 DPI) after commit 1421a9f6
("ply-utils: Increase threshold for guessed hiDPI scaling
to >= 2880x1620").