Files
RedBear-OS/local/recipes/system/redbear-greeter/source/redbear-greeter-compositor
T
vasilito 1aca85e48c fix: greeter compositor — replace bash process substitution with POSIX for loop
redbear-greeter-compositor: line 35 was using 'done < <(cmd)'
bash process substitution which creates /dev/fd/63. Redox kernel
does not implement /dev/fd, causing 'No such file or directory'
error and compositor startup failure.

Replaced 'while read; do ...; done < <(parse_drm_devices)' with
'for device in ; do ...; done' — pure POSIX,
no /dev/fd dependency. Device names contain no whitespace so
word splitting is correct for this use case.
2026-05-04 19:41:04 +01:00

107 lines
3.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
export DISPLAY=""
export WAYLAND_DISPLAY="${WAYLAND_DISPLAY:-wayland-0}"
export XDG_SESSION_TYPE=wayland
export LIBSEAT_BACKEND=seatd
export SEATD_SOCK=/run/seatd.sock
export QT_PLUGIN_PATH="${QT_PLUGIN_PATH:-/usr/plugins}"
export QT_QPA_PLATFORM_PLUGIN_PATH="${QT_QPA_PLATFORM_PLUGIN_PATH:-/usr/plugins/platforms}"
export QML2_IMPORT_PATH="${QML2_IMPORT_PATH:-/usr/qml}"
export QT_WAYLAND_SHELL_INTEGRATION="${QT_WAYLAND_SHELL_INTEGRATION:-xdg-shell}"
export XCURSOR_THEME="${XCURSOR_THEME:-Pop}"
export XKB_CONFIG_ROOT="${XKB_CONFIG_ROOT:-/usr/share/X11/xkb}"
if [ -z "${XDG_RUNTIME_DIR:-}" ]; then
export XDG_RUNTIME_DIR="/tmp/run/redbear-greeter"
fi
mkdir -p "$XDG_RUNTIME_DIR"
parse_drm_devices() {
local devices="${1:-}"
local part=""
IFS=':' read -r -a parts <<< "$devices"
for part in "${parts[@]}"; do
if [ -n "$part" ]; then
printf '%s\n' "$part"
fi
done
}
drm_devices_ready() {
local devices="${1:-}"
local device=""
for device in $(parse_drm_devices "$devices"); do
if [ ! -e "$device" ]; then
return 1
fi
done
return 0
}
wait_for_drm_devices() {
local devices="${1:-}"
local wait_seconds="${REDBEAR_DRM_WAIT_SECONDS:-10}"
local attempts=0
if [ -z "$devices" ]; then
return 1
fi
if [ "$wait_seconds" -le 0 ] 2>/dev/null; then
drm_devices_ready "$devices"
return $?
fi
attempts=$((wait_seconds * 2))
if ! drm_devices_ready "$devices"; then
echo "redbear-greeter-compositor: waiting up to ${wait_seconds}s for DRM device(s): ${devices}" >&2
fi
while [ "$attempts" -gt 0 ]; do
if drm_devices_ready "$devices"; then
return 0
fi
sleep 0.5
attempts=$((attempts - 1))
done
drm_devices_ready "$devices"
}
if [ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ] && command -v dbus-launch >/dev/null 2>&1; then
eval "$(dbus-launch --sh-syntax)"
fi
if ! command -v redbear-compositor >/dev/null 2>&1; then
# Fall back to redbear-compositor (simpler Rust compositor)
if command -v /usr/bin/redbear-compositor >/dev/null 2>&1 || command -v redbear-compositor >/dev/null 2>&1; then
echo "redbear-greeter-compositor: redbear-compositor not found, using redbear-compositor" >&2
exec /usr/bin/redbear-compositor
fi
echo "redbear-greeter-compositor: redbear-compositor not found, and redbear-compositor not found either" >&2
exit 1
fi
# pcid-spawner is intentionally async in Red Bear OS, so service ordering only guarantees that
# spawning has started. The compositor wrapper still has to wait for the actual DRM node.
desired_drm_devices="${KWIN_DRM_DEVICES:-/scheme/drm/card0}"
if wait_for_drm_devices "$desired_drm_devices"; then
export KWIN_DRM_DEVICES="$desired_drm_devices"
echo "redbear-greeter-compositor: using DRM compositor backend (KWIN_DRM_DEVICES=${KWIN_DRM_DEVICES})" >&2
exec redbear-compositor --drm
else
unset KWIN_DRM_DEVICES
echo "redbear-greeter-compositor: DRM device not ready after wait, using virtual compositor backend" >&2
exec redbear-compositor --virtual
fi