diff --git a/.github/workflows/ci-freebsd.yml b/.github/workflows/ci-freebsd.yml new file mode 100644 index 00000000..99389658 --- /dev/null +++ b/.github/workflows/ci-freebsd.yml @@ -0,0 +1,171 @@ +--- +name: CI-FreeBSD +permissions: + contents: read + +on: + workflow_call: + inputs: + release_commit: + required: true + type: string + release_version: + required: true + type: string + +env: + FREEBSD_CLANG_VERSION: 19 + +jobs: + build_freebsd: + name: ${{ matrix.cmake_processor }}-${{ matrix.bsd_release }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - bsd_release: "14.3" + arch: x86_64 + cmake_processor: amd64 + runner: ubuntu-latest + - bsd_release: "14.3" + arch: aarch64 + cmake_processor: aarch64 + runner: ubuntu-latest # ubuntu-24.04-arm is slower with the FreeBSD VM + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Get Processor Count + id: processor_count + shell: bash + run: | + PROCESSOR_COUNT=$(nproc) + echo "PROCESSOR_COUNT=${PROCESSOR_COUNT}" >> $GITHUB_OUTPUT + echo "PROCESSOR_COUNT: $PROCESSOR_COUNT" + + - name: Setup FreeBSD + uses: vmactions/freebsd-vm@v1.2.1 + with: + arch: ${{ matrix.arch }} + cpu: ${{ steps.processor_count.outputs.PROCESSOR_COUNT }} + # TODO: there is no libcap for freebsd... we need graphics/libdrm if we find a way to use libcap + # TODO: docs are off because doxygen is too old: https://www.freshports.org/devel/doxygen/ must be >= 1.10 + prepare: | + set -e + + pkg update + pkg upgrade -y + pkg install -y \ + audio/opus \ + audio/pulseaudio \ + devel/cmake-core \ + devel/evdev-proto \ + devel/git \ + devel/libayatana-appindicator \ + devel/libevdev \ + devel/libnotify \ + devel/llvm${{ env.FREEBSD_CLANG_VERSION }} \ + devel/ninja \ + devel/pkgconf \ + ftp/curl \ + graphics/libdrm \ + graphics/wayland \ + multimedia/libva \ + net/miniupnpc \ + ports-mgmt/pkg \ + security/openssl \ + shells/bash \ + www/npm \ + x11/libX11 \ + x11/libxcb \ + x11/libXfixes \ + x11/libXrandr \ + x11/libXtst + + # create symlink for shebang bash compatibility + ln -s /usr/local/bin/bash /bin/bash + release: ${{ matrix.bsd_release }} + run: | + set -e + + # fix git safe.directory issues + git config --global --add safe.directory "*" + sync: nfs + + - name: Configure + env: + BRANCH: ${{ github.head_ref || github.ref_name }} + BUILD_VERSION: ${{ inputs.release_version }} + COMMIT: ${{ inputs.release_commit }} + shell: freebsd {0} + run: | + set -e + cd $GITHUB_WORKSPACE + + export BRANCH=${{ env.BRANCH }} + export BUILD_VERSION=${{ env.BUILD_VERSION }} + export COMMIT=${{ env.COMMIT }} + + export CC=$(which clang${{ env.FREEBSD_CLANG_VERSION }}) + export CXX=$(which clang++${{ env.FREEBSD_CLANG_VERSION }}) + + mkdir -p build + cmake \ + -B build \ + -G Ninja \ + -S . \ + -DBUILD_DOCS=OFF \ + -DBUILD_WERROR=OFF \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DSUNSHINE_ASSETS_DIR=share/assets \ + -DSUNSHINE_EXECUTABLE_PATH=/usr/local/bin/sunshine \ + -DSUNSHINE_ENABLE_CUDA=OFF \ + -DSUNSHINE_ENABLE_DRM=OFF \ + -DSUNSHINE_ENABLE_WAYLAND=OFF \ + -DSUNSHINE_ENABLE_X11=ON \ + -DSUNSHINE_PUBLISHER_NAME='${{ github.repository_owner }}' \ + -DSUNSHINE_PUBLISHER_WEBSITE='https://app.lizardbyte.dev' \ + -DSUNSHINE_PUBLISHER_ISSUE_URL='https://app.lizardbyte.dev/support' + + - name: Build + shell: freebsd {0} + run: | + set -e + cd $GITHUB_WORKSPACE + ninja -C build + + - name: Package + shell: freebsd {0} + run: | + set -e + cd $GITHUB_WORKSPACE + + mkdir -p artifacts + + cd build + cpack -G FREEBSD --verbose --debug + + # move compiled files to artifacts + mv ./cpack_artifacts/Sunshine* ../artifacts/ + + - name: Debug cpack_artifacts + if: always() + shell: bash + working-directory: build/cpack_artifacts + run: | + ls -R . + + # print contents of manifest + echo "Manifest:" + cat ./_CPack_Packages/FreeBSD/FREEBSD/Sunshine/+MANIFEST + + - name: Upload Artifacts + uses: actions/upload-artifact@v4 + with: + name: build-FreeBSD-${{ matrix.bsd_release }}-${{ matrix.cmake_processor }} + path: artifacts/ + if-no-files-found: error diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ad2dd394..3fd85a31 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,6 +68,14 @@ jobs: GH_BOT_TOKEN: ${{ secrets.GH_BOT_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + build-freebsd: + name: FreeBSD + needs: release-setup + uses: ./.github/workflows/ci-freebsd.yml + with: + release_commit: ${{ needs.release-setup.outputs.release_commit }} + release_version: ${{ needs.release-setup.outputs.release_version }} + build-homebrew: name: Homebrew needs: release-setup diff --git a/CMakeLists.txt b/CMakeLists.txt index 5cedee55..08c0b1ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,10 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE) endif() +if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + set(FREEBSD ON) +endif() + # set the module path, used for includes set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") diff --git a/cmake/compile_definitions/linux.cmake b/cmake/compile_definitions/linux.cmake index 27f52e63..e869d044 100644 --- a/cmake/compile_definitions/linux.cmake +++ b/cmake/compile_definitions/linux.cmake @@ -1,6 +1,10 @@ # linux specific compile definitions -add_compile_definitions(SUNSHINE_PLATFORM="linux") +if(FREEBSD) + add_compile_definitions(SUNSHINE_PLATFORM="freebsd") +else() + add_compile_definitions(SUNSHINE_PLATFORM="linux") +endif() # AppImage if(${SUNSHINE_BUILD_APPIMAGE}) @@ -224,6 +228,9 @@ endif() # These need to be set before adding the inputtino subdirectory in order for them to be picked up set(LIBEVDEV_CUSTOM_INCLUDE_DIR "${EVDEV_INCLUDE_DIR}") set(LIBEVDEV_CUSTOM_LIBRARY "${EVDEV_LIBRARY}") +if(FREEBSD) + set(USE_UHID OFF) +endif() add_subdirectory("${CMAKE_SOURCE_DIR}/third-party/inputtino") list(APPEND SUNSHINE_EXTERNAL_LIBRARIES inputtino::libinputtino) diff --git a/cmake/dependencies/common.cmake b/cmake/dependencies/common.cmake index c92b4777..9f12f1bc 100644 --- a/cmake/dependencies/common.cmake +++ b/cmake/dependencies/common.cmake @@ -30,6 +30,9 @@ include_directories(SYSTEM ${MINIUPNP_INCLUDE_DIRS}) if(NOT DEFINED FFMPEG_PREPARED_BINARIES) if(WIN32) set(FFMPEG_PLATFORM_LIBRARIES mfplat ole32 strmiids mfuuid vpl) + elseif(FREEBSD) + # numa is not available on FreeBSD + set(FFMPEG_PLATFORM_LIBRARIES va va-drm va-x11 X11) elseif(UNIX AND NOT APPLE) set(FFMPEG_PLATFORM_LIBRARIES numa va va-drm va-x11 X11) endif() diff --git a/cmake/packaging/linux.cmake b/cmake/packaging/linux.cmake index 659bbc37..cd6f2b3b 100644 --- a/cmake/packaging/linux.cmake +++ b/cmake/packaging/linux.cmake @@ -30,6 +30,14 @@ else() endif() endif() +# RPM specific +set(CPACK_RPM_PACKAGE_LICENSE "GPLv3") + +# FreeBSD specific +set(CPACK_FREEBSD_PACKAGE_MAINTAINER "${CPACK_PACKAGE_VENDOR}") +set(CPACK_FREEBSD_PACKAGE_ORIGIN "misc/${CPACK_PACKAGE_NAME}") +set(CPACK_FREEBSD_PACKAGE_LICENSE "GPLv3") + # Post install set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${SUNSHINE_SOURCE_ASSETS_DIR}/linux/misc/postinst") set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE "${SUNSHINE_SOURCE_ASSETS_DIR}/linux/misc/postinst") @@ -69,6 +77,14 @@ set(CPACK_RPM_PACKAGE_REQUIRES "\ numactl-libs >= 2.0.14, \ openssl >= 3.0.2, \ pulseaudio-libs >= 10.0") +set(CPACK_FREEBSD_PACKAGE_DEPS "\) + ${CPACK_FREEBSD_PLATFORM_PACKAGE_DEPS} \ + audio/opus, \ + ftp/curl, \ + devel/libevdev, \ + x11/libX11, \ + net/miniupnpc, \ + security/openssl") if(NOT BOOST_USE_STATIC) set(CPACK_DEBIAN_PACKAGE_DEPENDS "\ @@ -83,6 +99,9 @@ if(NOT BOOST_USE_STATIC) boost-locale >= ${Boost_VERSION}, \ boost-log >= ${Boost_VERSION}, \ boost-program-options >= ${Boost_VERSION}") + set(CPACK_FREEBSD_PACKAGE_DEPS "\) + ${CPACK_FREEBSD_PACKAGE_DEPS}, \ + devel/boost-libs") endif() # This should automatically figure out dependencies, doesn't work with the current config @@ -133,6 +152,10 @@ if(${SUNSHINE_TRAY} STREQUAL 1) set(CPACK_RPM_PACKAGE_REQUIRES "\ ${CPACK_RPM_PACKAGE_REQUIRES}, \ libappindicator-gtk3 >= 12.10.0") + set(CPACK_FREEBSD_PACKAGE_DEPS "\ + ${CPACK_FREEBSD_PACKAGE_DEPS}, \ + devel/libayatana-appindicator, \ + devel/libnotify") endif() # desktop file diff --git a/docs/app_examples.md b/docs/app_examples.md index 782681fd..6a40ce9c 100644 --- a/docs/app_examples.md +++ b/docs/app_examples.md @@ -22,6 +22,14 @@ adding an image or a log file (via the `Output` field).} process is killed.} @tabs{ + @tab{FreeBSD | + \| Field \| Value \| + \|------------------------------\|------------------------------------------------------\| + \| Application Name \| @code{}Steam Big Picture@endcode \| + \| Command Preporations -> Undo \| @code{}setsid steam steam://close/bigpicture@endcode \| + \| Detached Commands \| @code{}setsid steam steam://open/bigpicture@endcode \| + \| Image \| @code{}steam.png@endcode \| + } @tab{Linux | \| Field \| Value \| \|------------------------------\|------------------------------------------------------\| @@ -89,6 +97,12 @@ process is killed.} #### URI @tabs{ + @tab{FreeBSD | + \| Field \| Value \| + \|-------------------\|------------------------------------------------------\| + \| Application Name \| @code{}Surviving Mars@endcode \| + \| Detached Commands \| @code{}setsid steam steam://rungameid/464920@endcode \| + } @tab{Linux | \| Field \| Value \| \|-------------------\|------------------------------------------------------\| @@ -111,6 +125,13 @@ process is killed.} #### Binary (w/ working directory @tabs{ + @tab{FreeBSD | + \| Field \| Value \| + \|-------------------\|--------------------------------------------------------------\| + \| Application Name \| @code{}Surviving Mars@endcode \| + \| Command \| @code{}MarsSteam@endcode \| + \| Working Directory \| @code{}~/.steam/steam/SteamApps/common/Survivng Mars@endcode \| + } @tab{Linux | \| Field \| Value \| \|-------------------\|--------------------------------------------------------------\| @@ -136,6 +157,12 @@ process is killed.} #### Binary (w/o working directory) @tabs{ + @tab{FreeBSD | + \| Field \| Value \| + \|-------------------\|------------------------------------------------------------------------\| + \| Application Name \| @code{}Surviving Mars@endcode \| + \| Command \| @code{}~/.steam/steam/SteamApps/common/Survivng Mars/MarsSteam@endcode \| + } @tab{Linux | \| Field \| Value \| \|-------------------\|------------------------------------------------------------------------\| diff --git a/docs/building.md b/docs/building.md index b7f5d402..0eae596a 100644 --- a/docs/building.md +++ b/docs/building.md @@ -5,6 +5,38 @@ Sunshine binaries are built using [CMake](https://cmake.org) and requires `cmake ### Dependencies +#### FreeBSD +@attention{Sunshine support for FreeBSD is experimental and may be incomplete or not work as expected.} + +##### Install dependencies +```sh +pkg install -y \ + audio/opus \ + audio/pulseaudio \ + devel/cmake \ + devel/evdev-proto \ + devel/git \ + devel/libayatana-appindicator \ + devel/libevdev \ + devel/libnotify \ + devel/ninja \ + devel/pkgconf \ + ftp/curl \ + graphics/libdrm \ + graphics/wayland \ + multimedia/libva \ + net/miniupnpc \ + ports-mgmt/pkg \ + security/openssl \ + shells/bash \ + www/npm \ + x11/libX11 \ + x11/libxcb \ + x11/libXfixes \ + x11/libXrandr \ + x11/libXtst +``` + #### Linux Dependencies vary depending on the distribution. You can reference our [linux_build.sh](https://github.com/LizardByte/Sunshine/blob/master/scripts/linux_build.sh) script for a list of @@ -124,6 +156,11 @@ ninja -C build ### Package @tabs{ + @tab{FreeBSD | @tabs{ + @tab{pkg | ```bash + cpack -G FREEBSD --config ./build/CPackConfig.cmake + ```} + }} @tab{Linux | @tabs{ @tab{deb | ```bash cpack -G DEB --config ./build/CPackConfig.cmake diff --git a/docs/configuration.md b/docs/configuration.md index f788729d..6c9682bf 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -26,6 +26,7 @@ location by modifying the configuration file. | OS | Location | |---------|-------------------------------------------------| | Docker | @code{}/config@endcode | +| FreeBSD | @code{}~/.config/sunshine@endcode | | Linux | @code{}~/.config/sunshine@endcode | | macOS | @code{}~/.config/sunshine@endcode | | Windows | @code{}%ProgramFiles%\\Sunshine\\config@endcode | @@ -316,12 +317,12 @@ editing the `conf` file in a text editor. Use the examples as reference. ds5 DualShock 5 controller (PS5) - @note{This option applies to Linux only.} + @note{This option applies to FreeBSD and Linux only.} switch Switch Pro controller - @note{This option applies to Linux only.} + @note{This option applies to FreeBSD and Linux only.} x360 @@ -331,7 +332,7 @@ editing the `conf` file in a text editor. Use the examples as reference. xone Xbox One controller - @note{This option applies to Linux only.} + @note{This option applies to FreeBSD and Linux only.} @@ -688,14 +689,14 @@ editing the `conf` file in a text editor. Use the examples as reference. @tip{To find the name of the audio sink follow these instructions.

- **Linux + pulseaudio:** + **FreeBSD/Linux + pulseaudio:**
@code{} pacmd list-sinks | grep "name:" @endcode

- **Linux + pipewire:** + **FreeBSD/Linux + pipewire:**
@code{} pactl info | grep Source @@ -729,7 +730,7 @@ editing the `conf` file in a text editor. Use the examples as reference. Sunshine will select the default audio device. - Example (Linux) + Example (FreeBSD/Linux) @code{} audio_sink = alsa_output.pci-0000_09_00.3.analog-stereo @endcode @@ -836,7 +837,7 @@ editing the `conf` file in a text editor. Use the examples as reference. @tip{To find the appropriate values follow these instructions.

- **Linux + VA-API:** + **FreeBSD/Linux + VA-API:**
Unlike with *amdvce* and *nvenc*, it doesn't matter if video encoding is done on a different GPU. @code{} @@ -866,7 +867,7 @@ editing the `conf` file in a text editor. Use the examples as reference. Sunshine will select the default video card. - Example (Linux) + Example (FreeBSD/Linux) @code{} adapter_name = /dev/dri/renderD128 @endcode @@ -889,7 +890,7 @@ editing the `conf` file in a text editor. Use the examples as reference. @tip{To find the appropriate values follow these instructions.

- **Linux:** + **FreeBSD/Linux:**
During Sunshine startup, you should see the list of detected displays: @code{} @@ -974,7 +975,7 @@ editing the `conf` file in a text editor. Use the examples as reference. Sunshine will select the default display. - Example (Linux) + Example (FreeBSD/Linux) @code{} output_name = 0 @endcode @@ -1961,7 +1962,7 @@ editing the `conf` file in a text editor. Use the examples as reference. x11 Uses XCB. This is the slowest and most CPU intensive so should be avoided if possible. - @note{Applies to Linux only.} + @note{Applies to FreeBSD and Linux only.} ddx @@ -2010,7 +2011,7 @@ editing the `conf` file in a text editor. Use the examples as reference. vaapi - Use Linux VA-API (AMD, Intel) + Use VA-API (AMD, Intel) software diff --git a/docs/getting_started.md b/docs/getting_started.md index f3036239..083840a8 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -8,7 +8,7 @@ and release artifacts may be missing when merging changes on a faster cadence. ## Binaries -Binaries of Sunshine are created for each release. They are available for Linux, macOS, and Windows. +Binaries of Sunshine are created for each release. They are available for FreeBSD, Linux, macOS, and Windows. Binaries can be found in the [latest release][latest-release]. @tip{Some third party packages also exist. @@ -25,6 +25,9 @@ and [ghcr.io](https://github.com/orgs/LizardByte/packages?repo_name=sunshine). See [Docker](../DOCKER_README.md) for more information. +### FreeBSD +@todo{Document this.} + ### Linux **CUDA Compatibility** @@ -494,6 +497,12 @@ All shortcuts start with `Ctrl+Alt+Shift`, just like Moonlight. * The "Desktop" app works the same as any other application except it has no commands. It does not start an application, instead it simply starts a stream. If you removed it and would like to get it back, just add a new application with the name "Desktop" and "desktop.png" as the image path. +* The FreeBSD version of Sunshine is missing some features that are present on Linux. + The following are known limitations. + + * Only x11 is working + * DualSense5 emulation is limited due to missing uhid features + * For the Linux flatpak you must prepend commands with `flatpak-spawn --host`. * If inputs (mouse, keyboard, gamepads...) aren't working after connecting, add the user running sunshine to the `input` group. diff --git a/src/platform/linux/misc.cpp b/src/platform/linux/misc.cpp index 9da87337..891fad42 100644 --- a/src/platform/linux/misc.cpp +++ b/src/platform/linux/misc.cpp @@ -35,6 +35,30 @@ #include "src/platform/common.h" #include "vaapi.h" +#ifdef __FreeBSD__ + #include + #include + // Define constants that are missing in FreeBSD + #ifndef IP_PKTINFO // packet info for IPv4 + #define IP_PKTINFO IP_RECVDSTADDR + #endif + #ifndef SOL_IP // socket level for IPv4 + #define SOL_IP IPPROTO_IP + #endif + #ifndef SOL_IPV6 // socket level for IPv6 + #define SOL_IPV6 IPPROTO_IPV6 + #endif + #ifndef SO_PRIORITY // socket option for priority, disabled for FreeBSD + #define SO_PRIORITY -1 + #endif +// Define in_pktinfo structure for IPv4 packet info +struct in_pktinfo { + struct in_addr ipi_addr; + struct in_addr ipi_spec_dst; + int ipi_ifindex; +}; +#endif + #ifdef __GNUC__ #define SUNSHINE_GNUC_EXTENSION __extension__ #else @@ -507,8 +531,8 @@ namespace platf { { // If GSO is not supported, use sendmmsg() instead. - struct mmsghdr msgs[send_info.block_count]; - struct iovec iovs[send_info.block_count * (send_info.headers ? 2 : 1)]; + std::vector msgs(send_info.block_count); + std::vector iovs(send_info.block_count * (send_info.headers ? 2 : 1)); int iov_idx = 0; for (size_t i = 0; i < send_info.block_count; i++) { msgs[i].msg_len = 0; @@ -753,6 +777,10 @@ namespace platf { // reset SO_PRIORITY back to 0. // // 6 is the highest priority that can be used without SYS_CAP_ADMIN. +#ifdef __FreeBSD__ + // FreeBSD doesn't support SO_PRIORITY, so we skip this + BOOST_LOG(debug) << "SO_PRIORITY not supported on FreeBSD, skipping traffic priority setting"; +#else int priority = data_type == qos_data_type_e::audio ? 6 : 5; if (setsockopt(sockfd, SOL_SOCKET, SO_PRIORITY, &priority, sizeof(priority)) == 0) { // Reset SO_PRIORITY to 0 when QoS is disabled @@ -760,6 +788,7 @@ namespace platf { } else { BOOST_LOG(error) << "Failed to set SO_PRIORITY: "sv << errno; } +#endif return std::make_unique(sockfd, reset_options); } diff --git a/src/system_tray.cpp b/src/system_tray.cpp index f792c741..8b194aaa 100644 --- a/src/system_tray.cpp +++ b/src/system_tray.cpp @@ -13,7 +13,7 @@ #define TRAY_ICON_PLAYING WEB_DIR "images/sunshine-playing.ico" #define TRAY_ICON_PAUSING WEB_DIR "images/sunshine-pausing.ico" #define TRAY_ICON_LOCKED WEB_DIR "images/sunshine-locked.ico" - #elif defined(__linux__) || defined(linux) || defined(__linux) + #elif defined(__linux__) || defined(linux) || defined(__linux) || defined(__FreeBSD__) #define TRAY_ICON SUNSHINE_TRAY_PREFIX "-tray" #define TRAY_ICON_PLAYING SUNSHINE_TRAY_PREFIX "-playing" #define TRAY_ICON_PAUSING SUNSHINE_TRAY_PREFIX "-pausing" diff --git a/src/video.cpp b/src/video.cpp index ed263e21..549870b9 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -886,7 +886,7 @@ namespace video { H264_ONLY | PARALLEL_ENCODING | ALWAYS_REPROBE | YUV444_SUPPORT }; -#ifdef __linux__ +#if defined(__linux__) || defined(linux) || defined(__linux) || defined(__FreeBSD__) encoder_t vaapi { "vaapi"sv, std::make_unique( @@ -1021,7 +1021,7 @@ namespace video { &quicksync, &amdvce, #endif -#ifdef __linux__ +#if defined(__linux__) || defined(linux) || defined(__linux) || defined(__FreeBSD__) &vaapi, #endif #ifdef __APPLE__ diff --git a/src/video.h b/src/video.h index a966c53e..43119fc9 100644 --- a/src/video.h +++ b/src/video.h @@ -221,7 +221,7 @@ namespace video { extern encoder_t quicksync; #endif -#ifdef __linux__ +#if defined(__linux__) || defined(linux) || defined(__linux) || defined(__FreeBSD__) extern encoder_t vaapi; #endif diff --git a/src_assets/common/assets/web/PlatformLayout.vue b/src_assets/common/assets/web/PlatformLayout.vue index 31064fec..49cbacc0 100644 --- a/src_assets/common/assets/web/PlatformLayout.vue +++ b/src_assets/common/assets/web/PlatformLayout.vue @@ -12,6 +12,10 @@ const props = defineProps({ + + diff --git a/src_assets/common/assets/web/apps.html b/src_assets/common/assets/web/apps.html index 8b0cb517..e1f7c83d 100644 --- a/src_assets/common/assets/web/apps.html +++ b/src_assets/common/assets/web/apps.html @@ -331,7 +331,7 @@
{{ $t('apps.env_qres_example') }}
cmd /C <{{ $t('apps.env_qres_path') }}>\QRes.exe /X:%SUNSHINE_CLIENT_WIDTH% /Y:%SUNSHINE_CLIENT_HEIGHT% /R:%SUNSHINE_CLIENT_FPS%
-
{{ $t('apps.env_xrandr_example') }} +
{{ $t('apps.env_xrandr_example') }}
sh -c "xrandr --output HDMI-1 --mode \"${SUNSHINE_CLIENT_WIDTH}x${SUNSHINE_CLIENT_HEIGHT}\" --rate ${SUNSHINE_CLIENT_FPS}"
{{ $t('apps.env_displayplacer_example') }} @@ -442,8 +442,8 @@ if (resp) { fetch("./api/apps/" + id, { method: "DELETE", - headers: { - "Content-Type": "application/json" + headers: { + "Content-Type": "application/json" }, }).then((r) => { if (r.status === 200) document.location.reload(); diff --git a/src_assets/common/assets/web/config.html b/src_assets/common/assets/web/config.html index 6e766e93..b43cbee1 100644 --- a/src_assets/common/assets/web/config.html +++ b/src_assets/common/assets/web/config.html @@ -301,7 +301,7 @@ return el.id !== "vt" && el.id !== "vaapi"; }); } - if (this.platform === "linux") { + if (this.platform === "freebsd" || this.platform === "linux") { this.tabs = this.tabs.filter((el) => { return el.id !== "amd" && el.id !== "qsv" && el.id !== "vt"; }); diff --git a/src_assets/common/assets/web/configs/tabs/Advanced.vue b/src_assets/common/assets/web/configs/tabs/Advanced.vue index bd11adf2..6a78e0d6 100644 --- a/src_assets/common/assets/web/configs/tabs/Advanced.vue +++ b/src_assets/common/assets/web/configs/tabs/Advanced.vue @@ -64,6 +64,9 @@ const config = ref(props.config)