From fd96aa0b36b9a98b8851c317ab2f7ec4213db357 Mon Sep 17 00:00:00 2001 From: Gilles Schintgen Date: Tue, 23 Sep 2025 05:30:21 +0200 Subject: [PATCH] fix(packaging/Linux): ensure that uhid is loaded automatically (#2906) Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com> --- cmake/FindSystemd.cmake | 14 ++++++++------ cmake/FindUdev.cmake | 4 +--- cmake/packaging/linux.cmake | 4 ++++ packaging/linux/AppImage/AppRun | 5 +++++ packaging/linux/Arch/sunshine.install | 2 ++ packaging/linux/fedora/Sunshine.spec | 18 ++++++------------ .../flatpak/scripts/additional-install.sh | 6 ++++++ .../scripts/remove-additional-install.sh | 3 ++- src_assets/linux/misc/60-sunshine.conf | 2 ++ src_assets/linux/misc/postinst | 4 ++++ 10 files changed, 40 insertions(+), 22 deletions(-) create mode 100644 src_assets/linux/misc/60-sunshine.conf diff --git a/cmake/FindSystemd.cmake b/cmake/FindSystemd.cmake index c41ca64d..c38d62c3 100644 --- a/cmake/FindSystemd.cmake +++ b/cmake/FindSystemd.cmake @@ -4,6 +4,7 @@ # SYSTEMD_FOUND - system has systemd # SYSTEMD_USER_UNIT_INSTALL_DIR - the systemd system unit install directory # SYSTEMD_SYSTEM_UNIT_INSTALL_DIR - the systemd user unit install directory +# SYSTEMD_MODULES_LOAD_DIR - the systemd modules-load.d directory IF (NOT WIN32) @@ -15,19 +16,20 @@ IF (NOT WIN32) if (SYSTEMD_FOUND) execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=systemduserunitdir systemd + OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE SYSTEMD_USER_UNIT_INSTALL_DIR) - string(REGEX REPLACE "[ \t\n]+" "" SYSTEMD_USER_UNIT_INSTALL_DIR - "${SYSTEMD_USER_UNIT_INSTALL_DIR}") - execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=systemdsystemunitdir systemd + OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE SYSTEMD_SYSTEM_UNIT_INSTALL_DIR) - string(REGEX REPLACE "[ \t\n]+" "" SYSTEMD_SYSTEM_UNIT_INSTALL_DIR - "${SYSTEMD_SYSTEM_UNIT_INSTALL_DIR}") + execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} + --variable=modules_load_dir systemd + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE SYSTEMD_MODULES_LOAD_DIR) - mark_as_advanced(SYSTEMD_USER_UNIT_INSTALL_DIR SYSTEMD_SYSTEM_UNIT_INSTALL_DIR) + mark_as_advanced(SYSTEMD_USER_UNIT_INSTALL_DIR SYSTEMD_SYSTEM_UNIT_INSTALL_DIR SYSTEMD_MODULES_LOAD_DIR) endif () diff --git a/cmake/FindUdev.cmake b/cmake/FindUdev.cmake index bb14a789..bb33b0c1 100644 --- a/cmake/FindUdev.cmake +++ b/cmake/FindUdev.cmake @@ -22,11 +22,9 @@ if(NOT WIN32) execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=udevdir udev + OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE UDEV_RULES_INSTALL_DIR) - string(REGEX REPLACE "[ \t\n]+" "" UDEV_RULES_INSTALL_DIR - "${UDEV_RULES_INSTALL_DIR}") - set(UDEV_RULES_INSTALL_DIR "${UDEV_RULES_INSTALL_DIR}/rules.d") mark_as_advanced(UDEV_RULES_INSTALL_DIR) diff --git a/cmake/packaging/linux.cmake b/cmake/packaging/linux.cmake index 3fa6e0cf..cd8e706e 100644 --- a/cmake/packaging/linux.cmake +++ b/cmake/packaging/linux.cmake @@ -14,6 +14,8 @@ file(CREATE_LINK "${SUNSHINE_SOURCE_ASSETS_DIR}/linux/assets/shaders" if(${SUNSHINE_BUILD_APPIMAGE} OR ${SUNSHINE_BUILD_FLATPAK}) install(FILES "${SUNSHINE_SOURCE_ASSETS_DIR}/linux/misc/60-sunshine.rules" DESTINATION "${SUNSHINE_ASSETS_DIR}/udev/rules.d") + install(FILES "${SUNSHINE_SOURCE_ASSETS_DIR}/linux/misc/60-sunshine.conf" + DESTINATION "${SUNSHINE_ASSETS_DIR}/modules-load.d") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sunshine.service" DESTINATION "${SUNSHINE_ASSETS_DIR}/systemd/user") else() @@ -27,6 +29,8 @@ else() if(SYSTEMD_FOUND) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sunshine.service" DESTINATION "${SYSTEMD_USER_UNIT_INSTALL_DIR}") + install(FILES "${SUNSHINE_SOURCE_ASSETS_DIR}/linux/misc/60-sunshine.conf" + DESTINATION "${SYSTEMD_MODULES_LOAD_DIR}") endif() endif() diff --git a/packaging/linux/AppImage/AppRun b/packaging/linux/AppImage/AppRun index e90ee3a4..c021e425 100644 --- a/packaging/linux/AppImage/AppRun +++ b/packaging/linux/AppImage/AppRun @@ -47,6 +47,8 @@ function install() { # user input rules # shellcheck disable=SC2002 cat "$SUNSHINE_SHARE_HERE/udev/rules.d/60-sunshine.rules" | sudo tee /etc/udev/rules.d/60-sunshine.rules + cat "$SUNSHINE_SHARE_HERE/modules-load.d/60-sunshine.conf" | sudo tee /etc/modules-load.d/60-sunshine.conf + sudo modprobe uhid sudo udevadm control --reload-rules sudo udevadm trigger --property-match=DEVNAME=/dev/uinput sudo udevadm trigger --property-match=DEVNAME=/dev/uhid @@ -65,6 +67,9 @@ function remove() { # remove input rules sudo rm -f /etc/udev/rules.d/60-sunshine.rules + # remove uhid module loading config + sudo rm -f /etc/modules-load.d/60-sunshine.conf + # remove service sudo rm -f ~/.config/systemd/user/sunshine.service } diff --git a/packaging/linux/Arch/sunshine.install b/packaging/linux/Arch/sunshine.install index 008f75d3..d7b87737 100644 --- a/packaging/linux/Arch/sunshine.install +++ b/packaging/linux/Arch/sunshine.install @@ -13,9 +13,11 @@ do_udev_reload() { post_install() { do_setcap do_udev_reload + modprobe uhid } post_upgrade() { do_setcap do_udev_reload + modprobe uhid } diff --git a/packaging/linux/fedora/Sunshine.spec b/packaging/linux/fedora/Sunshine.spec index 8625b812..2763f17b 100644 --- a/packaging/linux/fedora/Sunshine.spec +++ b/packaging/linux/fedora/Sunshine.spec @@ -211,15 +211,13 @@ xvfb-run ./tests/test_sunshine cd %{_builddir}/Sunshine/build %make_install -# Add modules-load configuration -# load the uhid module in initramfs even if it doesn't detect the module as being used during dracut -# which must be run every time a new kernel is installed -install -D -m 0644 /dev/stdin %{buildroot}/usr/lib/modules-load.d/uhid.conf < /etc/modules-load.d/60-sunshine.conf" +flatpak-spawn --host pkexec modprobe uhid + # Udev rule UDEV=$(cat /app/share/sunshine/udev/rules.d/60-sunshine.rules) echo "Configuring mouse permission." diff --git a/packaging/linux/flatpak/scripts/remove-additional-install.sh b/packaging/linux/flatpak/scripts/remove-additional-install.sh index ea2680ef..b3b30149 100644 --- a/packaging/linux/flatpak/scripts/remove-additional-install.sh +++ b/packaging/linux/flatpak/scripts/remove-additional-install.sh @@ -6,6 +6,7 @@ rm "$HOME/.config/systemd/user/sunshine.service" systemctl --user daemon-reload echo "Sunshine User Service has been removed." -# Udev rule +# Remove rules +flatpak-spawn --host pkexec sh -c "rm /etc/modules-load.d/60-sunshine.conf" flatpak-spawn --host pkexec sh -c "rm /etc/udev/rules.d/60-sunshine.rules" echo "Input rules removed. Restart computer to take effect." diff --git a/src_assets/linux/misc/60-sunshine.conf b/src_assets/linux/misc/60-sunshine.conf new file mode 100644 index 00000000..779674c5 --- /dev/null +++ b/src_assets/linux/misc/60-sunshine.conf @@ -0,0 +1,2 @@ +# Sunshine needs uhid for DS5 emulation +uhid diff --git a/src_assets/linux/misc/postinst b/src_assets/linux/misc/postinst index 262dd8bc..4783c2ec 100644 --- a/src_assets/linux/misc/postinst +++ b/src_assets/linux/misc/postinst @@ -1,5 +1,9 @@ #!/bin/sh +# Load uhid (DS5 emulation) +echo "Loading uhid kernel module for DS5 emulation." +modprobe uhid + # Check if we're in an rpm-ostree environment if [ ! -x "$(command -v rpm-ostree)" ]; then echo "Not in an rpm-ostree environment, proceeding with post install steps."