Compare commits

..

89 Commits

Author SHA1 Message Date
ReenigneArcher
6cf5e8a51c gcovr report directly in homebrew tests 2025-05-07 21:04:06 -04:00
ReenigneArcher
2acc57e8d6 remove --gcov-object-directory 2025-05-07 20:30:52 -04:00
ReenigneArcher
3d731a21e6 ci(homebrew): enable test coverage 2025-05-07 20:30:52 -04:00
jbellionjourdan
e9b39e4c15 fix(linux/input): improve input rules (#3857)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-05-07 14:41:01 +00:00
dependabot[bot]
e81a3f029f build(deps): bump third-party/inputtino from fd136cf to 17a9b9c (#3853)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
Bumps [third-party/inputtino](https://github.com/games-on-whales/inputtino) from `fd136cf` to `17a9b9c`.
- [Commits](fd136cfe49...17a9b9ce85)

---
updated-dependencies:
- dependency-name: third-party/inputtino
  dependency-version: 17a9b9ce85c6b8e711f777146d3c706c1a2a9fd9
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-06 08:22:20 -04:00
Clutchnp
c435d0fe56 build(linux): fix gcc version and disable docs for build on arch (#3846)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-05-05 13:06:01 -04:00
dependabot[bot]
a846ea909a build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from aac65cf to bf91cb0 (#3850)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `aac65cf` to `bf91cb0`.
- [Commits](aac65cf44c...bf91cb0bee)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-version: bf91cb0bee7ce0c8021e223e3ea9c5110ebb82de
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-05 12:29:49 +00:00
Vladimir Romashchenko
0a942437e2 feat(docs): Suggest using displayconfig-mutter for Gnome Wayland resolution change (#3845)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-05-05 02:09:18 +00:00
ReenigneArcher
808a862952 ci(codecov): add bundle analysis (#3843)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-05-04 09:38:34 -04:00
ReenigneArcher
a70cf5e12e ci(codecov): add test analytics (#3841)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-05-03 18:22:13 +00:00
Clutchnp
8ef838bada feat(audio): add an option to disable sound streaming (#3833)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
localize / Update Localization (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-05-01 11:39:43 -04:00
dependabot[bot]
7b6818ab4a build(deps): bump third-party/googletest from 6910c9d to 04ee1b4 (#3836)
Bumps [third-party/googletest](https://github.com/google/googletest) from `6910c9d` to `04ee1b4`.
- [Release notes](https://github.com/google/googletest/releases)
- [Commits](6910c9d916...04ee1b4f2a)

---
updated-dependencies:
- dependency-name: third-party/googletest
  dependency-version: 04ee1b4f2aefdffb0135d7cf2a2c519fe50dabe4
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-01 12:39:22 +00:00
SuperKenVery
3de3c299b2 docs(configuration): Update doc for wlr capture method (#3828)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-04-30 17:33:38 +00:00
ReenigneArcher
e9bce254fd ci(windows): pin gcc to 14 (#3831)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-04-29 21:29:38 -04:00
dependabot[bot]
e807769f6a build(deps): bump third-party/wayland-protocols from 4313a51 to 810f1ad (#3826)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
build(deps): bump third-party/wayland-protocols

Bumps [third-party/wayland-protocols](https://github.com/LizardByte-infrastructure/wayland-protocols) from `4313a51` to `810f1ad`.
- [Commits](4313a51a17...810f1adaf3)

---
updated-dependencies:
- dependency-name: third-party/wayland-protocols
  dependency-version: 810f1adaf33521cc55fc510566efba2a1418174f
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-29 12:43:47 -04:00
Clutchnp
bdf15f5277 build(linux): add arch linux support for linux_build.sh script (#3814)
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
2025-04-29 09:24:29 -04:00
ReenigneArcher
326592d08c ci(flatpak): disable maximize build space for arm64 (#3820)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-04-28 15:20:08 -04:00
ReenigneArcher
f82923e5c5 fix(homebrew): enable system tray for linux (#3819)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-04-28 13:45:12 -04:00
ReenigneArcher
c6f36474ba ci(release): increase permission for job and bump actions (#3816)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-04-25 21:01:37 -04:00
LizardByte-bot
1df4c89026 chore: update global workflows (#3813)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
localize / Update Localization (push) Has been cancelled
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
2025-04-25 19:09:06 -04:00
Vladimir Romashchenko
65b0217a90 fix(apps): exit steam big picture mode on session end (#3808)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-04-22 22:43:13 -04:00
ReenigneArcher
e58a437e6b ci(workflows): minor fixes and updates (#3581)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-04-20 10:25:33 -04:00
ReenigneArcher
f76ad0d238 docs(website): use cdn for branded icons (#3803)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-04-19 22:22:43 -04:00
Andy Grundman
4f2603ff63 fix(audio): set the bits-per-sample of Steam Streaming Speakers to 16-bit when the default audio device is 16-bit (#3704)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
localize / Update Localization (push) Has been cancelled
2025-04-19 17:48:17 -04:00
ReenigneArcher
5529850c10 docs: add external documentation (#3801) 2025-04-19 13:33:09 -04:00
ReenigneArcher
57b5b296da build(homebrew): explicitly set cxx standard (#3797)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
localize / Update Localization (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-04-14 14:12:59 -04:00
Ondřej Glet
b43a9b8efb fix(linux): headless monitors on wayland (#3783) 2025-04-14 09:56:21 -04:00
dependabot[bot]
86d7663927 build(deps): bump third-party/libdisplaydevice from 591387c to 13a4aca (#3791)
build(deps): bump third-party/libdisplaydevice

Bumps [third-party/libdisplaydevice](https://github.com/LizardByte/libdisplaydevice) from `591387c` to `13a4aca`.
- [Release notes](https://github.com/LizardByte/libdisplaydevice/releases)
- [Commits](591387c584...13a4aca3c2)

---
updated-dependencies:
- dependency-name: third-party/libdisplaydevice
  dependency-version: 13a4aca3c2f3eb78adef8f70231920f93f91f833
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-14 08:38:35 -04:00
ReenigneArcher
64c3862248 build(windows): fix resource file name (#3793)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
localize / Update Localization (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-04-13 22:33:49 -04:00
ReenigneArcher
955c0fd8e7 build(deps): pin boost to 1.87 (#3794) 2025-04-13 20:30:07 -04:00
ReenigneArcher
4f3d50a2ba build(linux): enable fedora 42 (#3780)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
Co-authored-by: Johnny Arcitec <38923130+arcitec@users.noreply.github.com>
2025-04-12 17:11:33 -04:00
dependabot[bot]
39916a7516 build(deps): bump vue-i18n from 11.1.2 to 11.1.3 (#3785)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
Bumps [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n) from 11.1.2 to 11.1.3.
- [Release notes](https://github.com/intlify/vue-i18n/releases)
- [Changelog](https://github.com/intlify/vue-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/intlify/vue-i18n/commits/v11.1.3/packages/vue-i18n)

---
updated-dependencies:
- dependency-name: vue-i18n
  dependency-version: 11.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-09 10:04:03 -04:00
dependabot[bot]
d2fbe1c7b4 build(deps): bump third-party/wayland-protocols from c7b582c to 4313a51 (#3788)
build(deps): bump third-party/wayland-protocols

Bumps [third-party/wayland-protocols](https://github.com/LizardByte-infrastructure/wayland-protocols) from `c7b582c` to `4313a51`.
- [Commits](c7b582cb71...4313a51a17)

---
updated-dependencies:
- dependency-name: third-party/wayland-protocols
  dependency-version: 4313a51a170efffece8f60f7a5dfdad135e6befa
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-09 08:20:33 -04:00
dependabot[bot]
498e9cfa61 build(deps): bump third-party/wlr-protocols from ffb89ac to 2ec67eb (#3782)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
Bumps [third-party/wlr-protocols](https://github.com/LizardByte-infrastructure/wlr-protocols) from `ffb89ac` to `2ec67eb`.
- [Commits](ffb89ac790...2ec67ebd26)

---
updated-dependencies:
- dependency-name: third-party/wlr-protocols
  dependency-version: 2ec67ebd26b73bada12f3fa6afdd51563b656722
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-04 13:13:04 -04:00
dependabot[bot]
6c1407847f build(deps): bump third-party/Simple-Web-Server from 4abe349 to 187f798 (#3781)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Blocked by required conditions
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
build(deps): bump third-party/Simple-Web-Server

Bumps [third-party/Simple-Web-Server](https://github.com/LizardByte-infrastructure/Simple-Web-Server) from `4abe349` to `187f798`.
- [Commits](4abe349158...187f798d54)

---
updated-dependencies:
- dependency-name: third-party/Simple-Web-Server
  dependency-version: 187f798d54a9c6cee742f2eb2c54e9ba26f5a385
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-04 08:21:07 -04:00
ReenigneArcher
ccce4ed6f4 docs(readme): update crowdin image url (#3774)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Blocked by required conditions
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
2025-04-03 20:34:23 -04:00
ReenigneArcher
7d75e4b75f build(cmake): update policies (#3775) 2025-04-03 19:09:40 -04:00
ReenigneArcher
3e41770d44 fix(config): ensure logging config settings are properly loaded (#3777)
Some checks failed
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Blocked by required conditions
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
localize / Update Localization (push) Has been cancelled
2025-04-03 13:32:46 -04:00
ReenigneArcher
fc9b548edd fix(config): fix parse error when list ends on last line of config file (#3772)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
localize / Update Localization (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-03-31 16:05:02 -04:00
dependabot[bot]
7ca2721739 build(deps): bump packaging/linux/flatpak/deps/shared-modules from a6c788b to 1f8e591 (#3773)
build(deps): bump packaging/linux/flatpak/deps/shared-modules

Bumps [packaging/linux/flatpak/deps/shared-modules](https://github.com/flathub/shared-modules) from `a6c788b` to `1f8e591`.
- [Commits](a6c788b38f...1f8e591b26)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/shared-modules
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-31 09:21:22 -04:00
ReenigneArcher
5f9fe26df3 fix(config): parse config after logging initialized (#3769)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Blocked by required conditions
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
localize / Update Localization (push) Waiting to run
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
2025-03-30 15:33:39 -04:00
Richard Ziegler
f921ae45d4 style(Web UI): Add 1rem margin between Save and Apply buttons for better UI/UX (#3762)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
localize / Update Localization (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-03-27 01:44:17 +00:00
ABeltramo
f65bb842ff feat(input/linux): DualSense adaptive trigger support (#3738) 2025-03-26 19:16:20 -04:00
dependabot[bot]
c4d991c8f7 build(deps): bump third-party/moonlight-common-c from d3d3e6c to e95feaf (#3761)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Blocked by required conditions
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
build(deps): bump third-party/moonlight-common-c

Bumps [third-party/moonlight-common-c](https://github.com/moonlight-stream/moonlight-common-c) from `d3d3e6c` to `e95feaf`.
- [Commits](d3d3e6cf01...e95feaf495)

---
updated-dependencies:
- dependency-name: third-party/moonlight-common-c
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-26 14:57:06 +00:00
dependabot[bot]
f0d563ecbb build(deps): bump @lizardbyte/shared-web from 2025.321.1458 to 2025.326.11214 (#3759)
build(deps): bump @lizardbyte/shared-web

Bumps [@lizardbyte/shared-web](https://github.com/LizardByte/shared-web) from 2025.321.1458 to 2025.326.11214.
- [Release notes](https://github.com/LizardByte/shared-web/releases)
- [Commits](https://github.com/LizardByte/shared-web/commits/v2025.326.11214)

---
updated-dependencies:
- dependency-name: "@lizardbyte/shared-web"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-26 08:43:41 -04:00
ReenigneArcher
2cd4b1b3ad fix(linux): update sunshine rules (#3748)
Some checks failed
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Blocked by required conditions
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
localize / Update Localization (push) Has been cancelled
Co-authored-by: ABeltramo <beltramo.ale@gmail.com>
2025-03-25 08:26:32 -04:00
dependabot[bot]
937615c8e6 build(deps): bump third-party/build-deps from c44b312 to b567d3c (#3751)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Blocked by required conditions
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
Bumps [third-party/build-deps](https://github.com/LizardByte/build-deps) from `c44b312` to `b567d3c`.
- [Commits](c44b312538...b567d3c479)

---
updated-dependencies:
- dependency-name: third-party/build-deps
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-24 14:03:47 +00:00
ReenigneArcher
e6fbd24001 chore(gh-pages): add crowdin-ignore class (#3747)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Blocked by required conditions
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
2025-03-23 14:21:04 +00:00
LizardByte-bot
5da5293471 chore: update global workflows (#3724)
Some checks failed
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Blocked by required conditions
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Co-authored-by: ReenigneArcher <42013603+ReenigneArcher@users.noreply.github.com>
2025-03-22 13:22:27 +00:00
ReenigneArcher
873939a7b2 fix(packaging/windows): add Sunshine directories to system PATH (#3727)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Blocked by required conditions
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
2025-03-22 02:19:57 +00:00
dependabot[bot]
7c8113ded8 build(deps): bump third-party/build-deps from 0f8f2af to c44b312 (#3744)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Blocked by required conditions
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
Bumps [third-party/build-deps](https://github.com/LizardByte/build-deps) from `0f8f2af` to `c44b312`.
- [Commits](0f8f2af955...c44b312538)

---
updated-dependencies:
- dependency-name: third-party/build-deps
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-21 12:27:08 -04:00
dependabot[bot]
310f5b8c1c build(deps): bump @lizardbyte/shared-web from 2025.221.2011 to 2025.321.1458 (#3742)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Blocked by required conditions
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
build(deps): bump @lizardbyte/shared-web

Bumps [@lizardbyte/shared-web](https://github.com/LizardByte/shared-web) from 2025.221.2011 to 2025.321.1458.
- [Commits](https://github.com/LizardByte/shared-web/commits)

---
updated-dependencies:
- dependency-name: "@lizardbyte/shared-web"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-21 09:18:40 -04:00
ReenigneArcher
0262a77c9a fix(packaging/flatpak): move more xvfb modules to LizardByte mirrors (#3739)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-03-20 02:17:31 +00:00
dependabot[bot]
643fdee8d3 build(deps): bump packaging/linux/flatpak/deps/shared-modules from 85cf327 to a6c788b (#3730)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Blocked by required conditions
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
build(deps): bump packaging/linux/flatpak/deps/shared-modules

Bumps [packaging/linux/flatpak/deps/shared-modules](https://github.com/flathub/shared-modules) from `85cf327` to `a6c788b`.
- [Commits](85cf3273f8...a6c788b38f)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/shared-modules
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-19 14:49:57 +00:00
dependabot[bot]
fe5812b008 build(deps): bump third-party/inputtino from 9c19995 to 1170b1e (#3736)
Bumps [third-party/inputtino](https://github.com/games-on-whales/inputtino) from `9c19995` to `1170b1e`.
- [Commits](9c19995cbd...1170b1e4ad)

---
updated-dependencies:
- dependency-name: third-party/inputtino
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-19 13:48:37 +00:00
ReenigneArcher
791580954f fix(packaging/flatpak): move xvfb modules to LizardByte mirrors (#3735) 2025-03-19 12:58:00 +00:00
ReenigneArcher
6efd41d3f7 docs(readme): add contributor images (#3732)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-03-17 19:27:25 -04:00
ReenigneArcher
1fd5534541 build(deps): change Gitlab submodules to LizardByte mirrors (#3728)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Blocked by required conditions
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
2025-03-16 22:19:07 -04:00
dependabot[bot]
a344e6cc69 build(deps): bump third-party/inputtino from 01b16d6 to 9c19995 (#3720)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
Bumps [third-party/inputtino](https://github.com/games-on-whales/inputtino) from `01b16d6` to `9c19995`.
- [Commits](01b16d67c9...9c19995cbd)

---
updated-dependencies:
- dependency-name: third-party/inputtino
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-12 13:16:44 +00:00
dependabot[bot]
ceea97479b build(deps): bump third-party/build-deps from 249a313 to 0f8f2af (#3717)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
Bumps [third-party/build-deps](https://github.com/LizardByte/build-deps) from `249a313` to `0f8f2af`.
- [Commits](249a313844...0f8f2af955)

---
updated-dependencies:
- dependency-name: third-party/build-deps
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-10 08:32:50 -04:00
dependabot[bot]
bd359b21d6 build(deps): bump robinraju/release-downloader from 1.11 to 1.12 (#3712)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
Bumps [robinraju/release-downloader](https://github.com/robinraju/release-downloader) from 1.11 to 1.12.
- [Release notes](https://github.com/robinraju/release-downloader/releases)
- [Commits](https://github.com/robinraju/release-downloader/compare/v1.11...v1.12)

---
updated-dependencies:
- dependency-name: robinraju/release-downloader
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-07 16:01:14 +00:00
dependabot[bot]
67d649621c build(deps): bump @lizardbyte/shared-web from 2024.921.191855 to 2025.221.2011 (#3681)
build(deps): bump @lizardbyte/shared-web

Bumps [@lizardbyte/shared-web](https://github.com/LizardByte/shared-web) from 2024.921.191855 to 2025.221.2011.
- [Commits](https://github.com/LizardByte/shared-web/commits)

---
updated-dependencies:
- dependency-name: "@lizardbyte/shared-web"
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-07 14:44:43 +00:00
dependabot[bot]
848558d80e build(deps): bump vue-i18n from 11.1.1 to 11.1.2 (#3713)
Bumps [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n) from 11.1.1 to 11.1.2.
- [Changelog](https://github.com/intlify/vue-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/intlify/vue-i18n/commits/v11.1.2/packages/vue-i18n)

---
updated-dependencies:
- dependency-name: vue-i18n
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-07 08:26:44 -05:00
ReenigneArcher
7cda5fa925 ci(gh-pages): preview website for PR builds in RTD (#3709)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-03-06 04:09:44 +00:00
dependabot[bot]
fd9f10f730 build(deps): bump third-party/inputtino from 00ea0c2 to 01b16d6 (#3701)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
Bumps [third-party/inputtino](https://github.com/games-on-whales/inputtino) from `00ea0c2` to `01b16d6`.
- [Commits](00ea0c28e8...01b16d67c9)

---
updated-dependencies:
- dependency-name: third-party/inputtino
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-04 16:58:40 +00:00
ReenigneArcher
a594b6434b docs(readme): add sponsors (#3697)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-03-02 02:04:10 +00:00
ReenigneArcher
f7190f53ff fix(http): lower TLS to v1.2 for downloading covers (#3691)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
localize / Update Localization (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-02-28 09:50:58 -05:00
ReenigneArcher
e3079da132 ci(flatpak): build aarch64 on arm architecture (#3680)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (aarch64, ubuntu-22.04-arm) (push) Has been cancelled
CI / Linux Flatpak (x86_64, ubuntu-22.04) (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-02-21 09:36:52 -05:00
ReenigneArcher
385471fb0a ci(flatpak): use local exceptions (#3679)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Setup Flatpak Matrix (push) Waiting to run
CI / Linux Flatpak (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
2025-02-21 04:28:06 +00:00
ReenigneArcher
3c6374fa7a docs(readme): fix badge whitespace (#3678) 2025-02-20 19:10:02 -05:00
dependabot[bot]
ecd0f9b5dc build(deps): bump third-party/inputtino from 311fd2d to 00ea0c2 (#3672)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Setup Flatpak Matrix (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
Bumps [third-party/inputtino](https://github.com/games-on-whales/inputtino) from `311fd2d` to `00ea0c2`.
- [Commits](311fd2deea...00ea0c28e8)

---
updated-dependencies:
- dependency-name: third-party/inputtino
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-19 09:19:43 -05:00
Lukas Senionis
fa22227fca feat(display): expose HDR toggle workaround delay to user (#3579)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Setup Flatpak Matrix (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
localize / Update Localization (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-02-18 09:32:21 -05:00
dependabot[bot]
9aaa40c3ca build(deps): bump packaging/linux/flatpak/deps/shared-modules from 802d804 to 85cf327 (#3661)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Setup Flatpak Matrix (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
build(deps): bump packaging/linux/flatpak/deps/shared-modules

Bumps [packaging/linux/flatpak/deps/shared-modules](https://github.com/flathub/shared-modules) from `802d804` to `85cf327`.
- [Commits](802d804161...85cf3273f8)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/shared-modules
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-13 13:08:58 -05:00
dependabot[bot]
849ad1c176 build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools from a1eb29c to aac65cf (#3596)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Setup Flatpak Matrix (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (push) Has been cancelled
CI / Linux AppImage (push) Has been cancelled
CI / Homebrew (macos-13) (push) Has been cancelled
CI / Homebrew (macos-14) (push) Has been cancelled
CI / Homebrew (ubuntu-latest) (push) Has been cancelled
CI / Homebrew (ubuntu-latest (Release)) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
build(deps): bump packaging/linux/flatpak/deps/flatpak-builder-tools

Bumps [packaging/linux/flatpak/deps/flatpak-builder-tools](https://github.com/flatpak/flatpak-builder-tools) from `a1eb29c` to `aac65cf`.
- [Commits](a1eb29c5f3...aac65cf44c)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/flatpak-builder-tools
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-12 04:06:08 +00:00
dependabot[bot]
782b3827d7 build(deps): bump packaging/linux/flatpak/deps/shared-modules from 26def5f to 802d804 (#3598)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Setup Flatpak Matrix (push) Waiting to run
CI / Linux Flatpak (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
build(deps): bump packaging/linux/flatpak/deps/shared-modules

Bumps [packaging/linux/flatpak/deps/shared-modules](https://github.com/flathub/shared-modules) from `26def5f` to `802d804`.
- [Commits](26def5f1d2...802d804161)

---
updated-dependencies:
- dependency-name: packaging/linux/flatpak/deps/shared-modules
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-11 21:57:28 +00:00
dependabot[bot]
e45b0b95fe build(deps): bump vue-i18n from 11.0.1 to 11.1.1 (#3651)
Bumps [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n) from 11.0.1 to 11.1.1.
- [Release notes](https://github.com/intlify/vue-i18n/releases)
- [Changelog](https://github.com/intlify/vue-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/intlify/vue-i18n/commits/v11.1.1/packages/vue-i18n)

---
updated-dependencies:
- dependency-name: vue-i18n
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-11 20:40:02 +00:00
Utkarsh Dalal
ffccc1af9b fix: add missing strings for max_bitrate setting, and improved logging for bitrate (#3656)
Some checks failed
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Setup Flatpak Matrix (push) Waiting to run
CI / Linux Flatpak (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
localize / Update Localization (push) Has been cancelled
2025-02-11 09:11:12 -05:00
ReenigneArcher
41d9a58560 build(deps): bump googletest to v1.16.0 (#3655)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Setup Flatpak Matrix (push) Waiting to run
CI / Linux Flatpak (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
2025-02-10 18:22:03 -05:00
dependabot[bot]
4f62944a7c build(deps): bump babel from 2.16.0 to 2.17.0 (#3631)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Setup Flatpak Matrix (push) Waiting to run
CI / Linux Flatpak (push) Blocked by required conditions
CI / Linux AppImage (push) Blocked by required conditions
CI / Homebrew (macos-13) (push) Blocked by required conditions
CI / Homebrew (macos-14) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest) (push) Blocked by required conditions
CI / Homebrew (ubuntu-latest (Release)) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
Bumps [babel](https://github.com/python-babel/babel) from 2.16.0 to 2.17.0.
- [Release notes](https://github.com/python-babel/babel/releases)
- [Changelog](https://github.com/python-babel/babel/blob/master/CHANGES.rst)
- [Commits](https://github.com/python-babel/babel/compare/v2.16.0...v2.17.0)

---
updated-dependencies:
- dependency-name: babel
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-10 13:15:33 -05:00
Utkarsh Dalal
3a88ddc639 feat: Add Max Bitrate option (#3628)
Some checks failed
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Setup Flatpak Matrix (push) Waiting to run
CI / Linux Flatpak (push) Blocked by required conditions
CI / Linux ${{ matrix.type }} (--appimage-build, 22.04, AppImage) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 13) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 14) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest, true) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
localize / Update Localization (push) Has been cancelled
2025-02-09 15:00:29 -05:00
ABeltramo
ff0ed25e47 fix(linux/inputtino): DualSense native support without Steam Input (#3600)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Setup Flatpak Matrix (push) Waiting to run
CI / Linux Flatpak (push) Blocked by required conditions
CI / Linux ${{ matrix.type }} (--appimage-build, 22.04, AppImage) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 13) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 14) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest, true) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
2025-02-09 18:18:25 +00:00
ReenigneArcher
ac2fc48288 ci(homebrew): fix python install (#3646)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Setup Flatpak Matrix (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (push) Has been cancelled
CI / Linux ${{ matrix.type }} (--appimage-build, 22.04, AppImage) (push) Has been cancelled
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 13) (push) Has been cancelled
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 14) (push) Has been cancelled
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest) (push) Has been cancelled
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest, true) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-02-08 01:35:45 +00:00
ReenigneArcher
d777b72421 build(deps): bump vite from 4.5.2 to 4.5.9 (#3645) 2025-02-07 18:38:52 -05:00
dependabot[bot]
f99d3af0a1 build(deps): bump third-party/libdisplaydevice from 53a0ea5 to 591387c (#3643)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Setup Flatpak Matrix (push) Waiting to run
CI / Linux Flatpak (push) Blocked by required conditions
CI / Linux ${{ matrix.type }} (--appimage-build, 22.04, AppImage) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 13) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 14) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest, true) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
build(deps): bump third-party/libdisplaydevice

Bumps [third-party/libdisplaydevice](https://github.com/LizardByte/libdisplaydevice) from `53a0ea5` to `591387c`.
- [Release notes](https://github.com/LizardByte/libdisplaydevice/releases)
- [Commits](53a0ea5317...591387c584)

---
updated-dependencies:
- dependency-name: third-party/libdisplaydevice
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-07 08:43:32 -05:00
Cameron Gutman
265a00793c feat(nvenc): implement async encode and hang recovery (#3629)
Some checks failed
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Setup Flatpak Matrix (push) Waiting to run
CI / Linux Flatpak (push) Blocked by required conditions
CI / Linux ${{ matrix.type }} (--appimage-build, 22.04, AppImage) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 13) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 14) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest, true) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
localize / Update Localization (push) Has been cancelled
* feat(nvenc): implement async encode

* fix(video): allow NVENC to complete teardown asynchronously
2025-02-06 22:22:00 -06:00
ReenigneArcher
dbba364ed7 fix(dd_config)!: disable by default (#3639)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Setup Flatpak Matrix (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
localize / Update Localization (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (push) Has been cancelled
CI / Linux ${{ matrix.type }} (--appimage-build, 22.04, AppImage) (push) Has been cancelled
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 13) (push) Has been cancelled
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 14) (push) Has been cancelled
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest) (push) Has been cancelled
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest, true) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-02-05 08:32:34 -05:00
ReenigneArcher
997093986d ci(docker): fix debian arm builds (#3627)
Some checks failed
CI / GitHub Env Debug (push) Has been cancelled
CI / Setup Release (push) Has been cancelled
CI / Setup Flatpak Matrix (push) Has been cancelled
CI Docker / Check Dockerfiles (push) Has been cancelled
CodeQL / Get language matrix (push) Has been cancelled
Build GH-Pages / prep (push) Has been cancelled
CI / Linux Flatpak (push) Has been cancelled
CI / Linux ${{ matrix.type }} (--appimage-build, 22.04, AppImage) (push) Has been cancelled
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 13) (push) Has been cancelled
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 14) (push) Has been cancelled
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest) (push) Has been cancelled
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest, true) (push) Has been cancelled
CI / Windows (push) Has been cancelled
CI Docker / Setup Release (push) Has been cancelled
CI Docker / Docker${{ matrix.tag }} (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
Build GH-Pages / call-jekyll-build (push) Has been cancelled
2025-02-03 03:48:56 +00:00
ReenigneArcher
6efc687036 fix(ui): properly handle boolean json responses (#3626)
Some checks are pending
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Setup Flatpak Matrix (push) Waiting to run
CI / Linux Flatpak (push) Blocked by required conditions
CI / Linux ${{ matrix.type }} (--appimage-build, 22.04, AppImage) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 13) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 14) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest, true) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
2025-02-02 17:34:02 +00:00
LizardByte-bot
a995e578fa chore: update global workflows (#3623)
Some checks failed
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Setup Flatpak Matrix (push) Waiting to run
CI / Linux Flatpak (push) Blocked by required conditions
CI / Linux ${{ matrix.type }} (--appimage-build, 22.04, AppImage) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 13) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 14) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest, true) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
CodeQL / Get language matrix (push) Has been cancelled
CodeQL / Analyze (${{ matrix.name }}) (push) Has been cancelled
2025-02-01 17:57:08 +00:00
112 changed files with 2139 additions and 1197 deletions

View File

@@ -4,10 +4,31 @@ set -e
# update pacman # update pacman
pacman --noconfirm -Syu pacman --noconfirm -Syu
gcc_version="14.2.0-3"
broken_deps=(
"mingw-w64-ucrt-x86_64-gcc"
"mingw-w64-ucrt-x86_64-gcc-libs"
)
tarballs=""
for dep in "${broken_deps[@]}"; do
tarball="${dep}-${gcc_version}-any.pkg.tar.zst"
# download and install working version
wget https://repo.msys2.org/mingw/ucrt64/${tarball}
tarballs="${tarballs} ${tarball}"
done
# install broken dependencies
if [ -n "$tarballs" ]; then
pacman -U --noconfirm ${tarballs}
fi
# install dependencies # install dependencies
dependencies=( dependencies=(
"git" "git"
"mingw-w64-ucrt-x86_64-boost"
"mingw-w64-ucrt-x86_64-cmake" "mingw-w64-ucrt-x86_64-cmake"
"mingw-w64-ucrt-x86_64-cppwinrt" "mingw-w64-ucrt-x86_64-cppwinrt"
"mingw-w64-ucrt-x86_64-curl-winssl" "mingw-w64-ucrt-x86_64-curl-winssl"
@@ -21,7 +42,8 @@ dependencies=(
"mingw-w64-ucrt-x86_64-opus" "mingw-w64-ucrt-x86_64-opus"
"mingw-w64-ucrt-x86_64-toolchain" "mingw-w64-ucrt-x86_64-toolchain"
) )
pacman -S --noconfirm "${dependencies[@]}"
pacman -Syu --noconfirm --ignore="$(IFS=,; echo "${broken_deps[*]}")" "${dependencies[@]}"
# build # build
mkdir -p build mkdir -p build

View File

@@ -1,9 +1,12 @@
# install dependencies for C++ analysis # install dependencies for C++ analysis
set -e set -e
# setup homebrew for x86_64
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
eval "$(/usr/local/bin/brew shellenv)"
# install dependencies # install dependencies
dependencies=( dependencies=(
"boost"
"cmake" "cmake"
"miniupnpc" "miniupnpc"
"ninja" "ninja"

View File

@@ -5,9 +5,15 @@
blank_issues_enabled: false blank_issues_enabled: false
contact_links: contact_links:
- name: Discussions
url: https://github.com/orgs/LizardByte/discussions
about: Community discussions
- name: Questions
url: https://github.com/orgs/LizardByte/discussions
about: Ask questions
- name: Feature Requests
url: https://github.com/orgs/LizardByte/discussions
about: Request new features
- name: Support Center - name: Support Center
url: https://app.lizardbyte.dev/support url: https://app.lizardbyte.dev/support
about: Official LizardByte support about: Official LizardByte support
- name: Discussions
url: https://github.com/orgs/LizardByte/discussions
about: Community discussions, questions, and feature requests

View File

@@ -1,12 +1,19 @@
--- ---
name: CI name: CI
permissions:
contents: read
on: on:
pull_request: pull_request:
branches: [master] branches:
types: [opened, synchronize, reopened] - master
types:
- opened
- synchronize
- reopened
push: push:
branches: [master] branches:
- master
workflow_dispatch: workflow_dispatch:
concurrency: concurrency:
@@ -17,7 +24,6 @@ jobs:
github_env: github_env:
name: GitHub Env Debug name: GitHub Env Debug
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Dump github context - name: Dump github context
run: echo "$GITHUB_CONTEXT" run: echo "$GITHUB_CONTEXT"
@@ -34,6 +40,8 @@ jobs:
release_generate_release_notes: ${{ steps.setup_release.outputs.release_generate_release_notes }} release_generate_release_notes: ${{ steps.setup_release.outputs.release_generate_release_notes }}
release_tag: ${{ steps.setup_release.outputs.release_tag }} release_tag: ${{ steps.setup_release.outputs.release_tag }}
release_version: ${{ steps.setup_release.outputs.release_version }} release_version: ${{ steps.setup_release.outputs.release_version }}
permissions:
contents: write # read does not work to check squash and merge details
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
@@ -41,50 +49,29 @@ jobs:
- name: Setup Release - name: Setup Release
id: setup_release id: setup_release
uses: LizardByte/setup-release-action@v2025.102.14715 uses: LizardByte/setup-release-action@v2025.426.225
with: with:
github_token: ${{ secrets.GITHUB_TOKEN }} github_token: ${{ secrets.GITHUB_TOKEN }}
setup_flatpak_matrix:
name: Setup Flatpak Matrix
runs-on: ubuntu-latest
steps:
- name: Set release details
id: flatpak_matrix
# https://www.cynkra.com/blog/2020-12-23-dynamic-gha
run: |
# determine which architectures to build
if [[ "${{ github.event_name }}" == "push" ]]; then
matrix=$((
echo '{ "arch" : ["x86_64", "aarch64"] }'
) | jq -c .)
else
matrix=$((
echo '{ "arch" : ["x86_64"] }'
) | jq -c .)
fi
echo $matrix
echo $matrix | jq .
echo "matrix=$matrix" >> $GITHUB_OUTPUT
outputs:
matrix: ${{ steps.flatpak_matrix.outputs.matrix }}
build_linux_flatpak: build_linux_flatpak:
name: Linux Flatpak
env: env:
APP_ID: dev.lizardbyte.app.Sunshine APP_ID: dev.lizardbyte.app.Sunshine
NODE_VERSION: "20" NODE_VERSION: "20"
PLATFORM_VERSION: "23.08" PLATFORM_VERSION: "23.08"
name: Linux Flatpak needs: setup_release
runs-on: ubuntu-22.04 runs-on: ${{ matrix.runner }}
needs: [setup_release, setup_flatpak_matrix]
strategy: strategy:
fail-fast: false # false to test all, true to fail entire job if any fail fail-fast: false # false to test all, true to fail entire job if any fail
matrix: ${{fromJson(needs.setup_flatpak_matrix.outputs.matrix)}} matrix:
include:
- arch: x86_64
runner: ubuntu-22.04
- arch: aarch64
runner: ubuntu-22.04-arm
steps: steps:
- name: Maximize build space - name: Maximize build space
if: matrix.arch == 'x86_64'
uses: easimon/maximize-build-space@v10 uses: easimon/maximize-build-space@v10
with: with:
root-reserve-mb: 10240 root-reserve-mb: 10240
@@ -106,12 +93,10 @@ jobs:
node-version: ${{ env.NODE_VERSION }} node-version: ${{ env.NODE_VERSION }}
- name: Install npm dependencies - name: Install npm dependencies
run: | run: npm install --package-lock-only
npm install --package-lock-only
- name: Debug package-lock.json - name: Debug package-lock.json
run: | run: cat package-lock.json
cat package-lock.json
- name: Setup python - name: Setup python
id: python id: python
@@ -126,8 +111,7 @@ jobs:
sudo apt-get update -y sudo apt-get update -y
sudo apt-get install -y \ sudo apt-get install -y \
cmake \ cmake \
flatpak \ flatpak
qemu-user-static
sudo su $(whoami) -c "flatpak --user remote-add --if-not-exists flathub \ sudo su $(whoami) -c "flatpak --user remote-add --if-not-exists flathub \
https://flathub.org/repo/flathub.flatpakrepo" https://flathub.org/repo/flathub.flatpakrepo"
@@ -143,12 +127,10 @@ jobs:
- name: flatpak node generator - name: flatpak node generator
# https://github.com/flatpak/flatpak-builder-tools/blob/master/node/README.md # https://github.com/flatpak/flatpak-builder-tools/blob/master/node/README.md
run: | run: flatpak-node-generator npm package-lock.json
flatpak-node-generator npm package-lock.json
- name: Debug generated-sources.json - name: Debug generated-sources.json
run: | run: cat generated-sources.json
cat generated-sources.json
- name: Cache Flatpak build - name: Cache Flatpak build
uses: actions/cache@v4 uses: actions/cache@v4
@@ -193,8 +175,7 @@ jobs:
- name: Debug Manifest - name: Debug Manifest
working-directory: build working-directory: build
run: | run: cat ${APP_ID}.yml
cat ${APP_ID}.yml
- name: Build Linux Flatpak - name: Build Linux Flatpak
working-directory: build working-directory: build
@@ -227,56 +208,27 @@ jobs:
- name: Lint Flatpak - name: Lint Flatpak
working-directory: build working-directory: build
run: | run: |
exceptions_file="${{ github.workspace }}/packaging/linux/flatpak/exceptions.json"
echo "Linting flatpak manifest" echo "Linting flatpak manifest"
flatpak run --command=flatpak-builder-lint org.flatpak.Builder \ flatpak run --command=flatpak-builder-lint org.flatpak.Builder \
manifest ${APP_ID}.yml > _flatpak-lint-exceptions_manifest.json || true --exceptions \
--user-exceptions "${exceptions_file}" \
manifest \
${APP_ID}.yml
echo "Linting flatpak repo" echo "Linting flatpak repo"
# TODO: add arg # TODO: add arg
# --mirror-screenshots-url=https://dl.flathub.org/media \ # --mirror-screenshots-url=https://dl.flathub.org/media \
flatpak run --command=flatpak-builder-lint org.flatpak.Builder \ flatpak run --command=flatpak-builder-lint org.flatpak.Builder \
repo repo > _flatpak-lint-exceptions_repo.json || true --exceptions \
--user-exceptions "${exceptions_file}" \
checks=(manifest repo) repo \
exit_code=0 repo
# check if files are equal
for check in "${checks[@]}"; do
echo "Validating $check"
# load baseline and result files
baseline="${{ github.workspace }}/packaging/linux/flatpak/flatpak-lint-baseline_${check}.json"
result="_flatpak-lint-exceptions_${check}.json"
# Extract errors from both JSON files
readarray -t result_errors < <(jq -r '.errors[]' "$result")
readarray -t baseline_errors < <(jq -r '.errors[]' "$baseline")
# Loop through result errors and check against baseline errors
for error in "${result_errors[@]}"; do
if printf '%s\n' "${baseline_errors[@]}" | grep -q -F "$error"; then
echo "::warning:: '$error'"
else
echo "::error:: '$error'"
exit_code=1
fi
done
done
# if exit code is not 0, print results
if [ $exit_code -ne 0 ]; then
echo "Manifest lint results:"
cat _flatpak-lint-exceptions_manifest.json
echo "Repo lint results:"
cat _flatpak-lint-exceptions_repo.json
fi
# exit with the correct code
exit $exit_code
- name: Package Flathub repo archive - name: Package Flathub repo archive
# copy files required to generate the Flathub repo # copy files required to generate the Flathub repo
if: ${{ matrix.arch == 'x86_64' }} if: matrix.arch == 'x86_64'
run: | run: |
mkdir -p flathub/modules mkdir -p flathub/modules
cp ./build/generated-sources.json ./flathub/ cp ./build/generated-sources.json ./flathub/
@@ -296,10 +248,11 @@ jobs:
with: with:
name: sunshine-linux-flatpak-${{ matrix.arch }} name: sunshine-linux-flatpak-${{ matrix.arch }}
path: artifacts/ path: artifacts/
if-no-files-found: error
- name: Create/Update GitHub Release - name: Create/Update GitHub Release
if: ${{ needs.setup_release.outputs.publish_release == 'true' }} if: needs.setup_release.outputs.publish_release == 'true'
uses: LizardByte/create-release-action@v2025.102.13208 uses: LizardByte/create-release-action@v2025.426.1549
with: with:
allowUpdates: true allowUpdates: true
body: ${{ needs.setup_release.outputs.release_body }} body: ${{ needs.setup_release.outputs.release_body }}
@@ -312,7 +265,7 @@ jobs:
build_linux: build_linux:
name: Linux ${{ matrix.type }} name: Linux ${{ matrix.type }}
runs-on: ubuntu-${{ matrix.dist }} runs-on: ubuntu-${{ matrix.dist }}
needs: [setup_release] needs: setup_release
strategy: strategy:
fail-fast: false # false to test all, true to fail entire job if any fail fail-fast: false # false to test all, true to fail entire job if any fail
matrix: matrix:
@@ -320,7 +273,6 @@ jobs:
- type: AppImage - type: AppImage
EXTRA_ARGS: '--appimage-build' EXTRA_ARGS: '--appimage-build'
dist: 22.04 dist: 22.04
steps: steps:
- name: Maximize build space - name: Maximize build space
uses: easimon/maximize-build-space@v10 uses: easimon/maximize-build-space@v10
@@ -395,14 +347,13 @@ jobs:
--ubuntu-test-repo ${{ matrix.EXTRA_ARGS }} --ubuntu-test-repo ${{ matrix.EXTRA_ARGS }}
- name: Set AppImage Version - name: Set AppImage Version
if: | if: matrix.type == 'AppImage'
matrix.type == 'AppImage'
run: | run: |
version=${{ needs.setup_release.outputs.release_tag }} version=${{ needs.setup_release.outputs.release_tag }}
echo "VERSION=${version}" >> $GITHUB_ENV echo "VERSION=${version}" >> $GITHUB_ENV
- name: Package Linux - AppImage - name: Package Linux - AppImage
if: ${{ matrix.type == 'AppImage' }} if: matrix.type == 'AppImage'
working-directory: build working-directory: build
run: | run: |
# install sunshine to the DESTDIR # install sunshine to the DESTDIR
@@ -447,7 +398,7 @@ jobs:
rm -rf ./build/cuda rm -rf ./build/cuda
- name: Verify AppImage - name: Verify AppImage
if: ${{ matrix.type == 'AppImage' }} if: matrix.type == 'AppImage'
run: | run: |
wget https://github.com/TheAssassin/appimagelint/releases/download/continuous/appimagelint-x86_64.AppImage wget https://github.com/TheAssassin/appimagelint/releases/download/continuous/appimagelint-x86_64.AppImage
chmod +x appimagelint-x86_64.AppImage chmod +x appimagelint-x86_64.AppImage
@@ -459,6 +410,7 @@ jobs:
with: with:
name: sunshine-linux-${{ matrix.type }}-${{ matrix.dist }} name: sunshine-linux-${{ matrix.type }}-${{ matrix.dist }}
path: artifacts/ path: artifacts/
if-no-files-found: error
- name: Install test deps - name: Install test deps
run: | run: |
@@ -479,12 +431,14 @@ jobs:
Xvfb ${DISPLAY} -screen 0 1024x768x24 & Xvfb ${DISPLAY} -screen 0 1024x768x24 &
sleep 5 # give Xvfb time to start sleep 5 # give Xvfb time to start
./test_sunshine --gtest_color=yes ./test_sunshine --gtest_color=yes --gtest_output=xml:test_results.xml
- name: Generate gcov report - name: Generate gcov report
# any except canceled or skipped
if: always() && (steps.test.outcome == 'success' || steps.test.outcome == 'failure')
id: test_report id: test_report
# any except canceled or skipped
if: >-
always() &&
(steps.test.outcome == 'success' || steps.test.outcome == 'failure')
working-directory: build working-directory: build
run: | run: |
${{ steps.python.outputs.python-path }} -m pip install gcovr ${{ steps.python.outputs.python-path }} -m pip install gcovr
@@ -496,6 +450,22 @@ jobs:
--xml-pretty \ --xml-pretty \
-o coverage.xml -o coverage.xml
- name: Upload test results to Codecov
# any except canceled or skipped
if: >-
always() &&
(steps.test.outcome == 'success' || steps.test.outcome == 'failure') &&
startsWith(github.repository, 'LizardByte/')
uses: codecov/test-results-action@v1
with:
disable_search: true
fail_ci_if_error: true
files: ./build/tests/test_results.xml
flags: ${{ runner.os }}
handle_no_reports_found: true
token: ${{ secrets.CODECOV_TOKEN }}
verbose: true
- name: Upload coverage - name: Upload coverage
# any except canceled or skipped # any except canceled or skipped
if: >- if: >-
@@ -512,8 +482,8 @@ jobs:
verbose: true verbose: true
- name: Create/Update GitHub Release - name: Create/Update GitHub Release
if: ${{ needs.setup_release.outputs.publish_release == 'true' }} if: needs.setup_release.outputs.publish_release == 'true'
uses: LizardByte/create-release-action@v2025.102.13208 uses: LizardByte/create-release-action@v2025.426.1549
with: with:
allowUpdates: true allowUpdates: true
body: ${{ needs.setup_release.outputs.release_body }} body: ${{ needs.setup_release.outputs.release_body }}
@@ -524,7 +494,8 @@ jobs:
token: ${{ secrets.GH_BOT_TOKEN }} token: ${{ secrets.GH_BOT_TOKEN }}
build_homebrew: build_homebrew:
needs: [setup_release] name: Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }})
needs: setup_release
strategy: strategy:
fail-fast: false # false to test all, true to fail entire job if any fail fail-fast: false # false to test all, true to fail entire job if any fail
matrix: matrix:
@@ -540,9 +511,7 @@ jobs:
- os_version: "latest" # this job will only configure the formula for release, no validation - os_version: "latest" # this job will only configure the formula for release, no validation
os_name: "ubuntu" os_name: "ubuntu"
release: true release: true
name: Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }})
runs-on: ${{ matrix.os_name }}-${{ matrix.os_version }} runs-on: ${{ matrix.os_name }}-${{ matrix.os_version }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@@ -554,20 +523,18 @@ jobs:
rm '/usr/local/bin/2to3-3.12' rm '/usr/local/bin/2to3-3.12'
rm '/usr/local/bin/idle3' rm '/usr/local/bin/idle3'
rm '/usr/local/bin/idle3.12' rm '/usr/local/bin/idle3.12'
rm '/usr/local/bin/idle3.13'
rm '/usr/local/bin/pydoc3' rm '/usr/local/bin/pydoc3'
rm '/usr/local/bin/pydoc3.12' rm '/usr/local/bin/pydoc3.12'
rm '/usr/local/bin/pydoc3.13'
rm '/usr/local/bin/python3' rm '/usr/local/bin/python3'
rm '/usr/local/bin/python3-config'
rm '/usr/local/bin/python3.12' rm '/usr/local/bin/python3.12'
rm '/usr/local/bin/python3.13'
rm '/usr/local/bin/python3-config'
rm '/usr/local/bin/python3.12-config' rm '/usr/local/bin/python3.12-config'
rm '/usr/local/bin/python3.13-config'
brew install python brew install python
- name: Setup python
id: python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Configure formula - name: Configure formula
run: | run: |
# variables for formula # variables for formula
@@ -626,16 +593,15 @@ jobs:
cat ./homebrew/sunshine.rb cat ./homebrew/sunshine.rb
- name: Upload Artifacts - name: Upload Artifacts
if: ${{ matrix.release }} if: matrix.release
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: sunshine-homebrew name: sunshine-homebrew
path: homebrew/ path: homebrew/
if-no-files-found: error
- name: Setup Xvfb - name: Setup Xvfb
if: | if: matrix.release != true && runner.os == 'Linux'
matrix.release != true &&
runner.os == 'Linux'
run: | run: |
sudo apt-get update -y sudo apt-get update -y
sudo apt-get install -y \ sudo apt-get install -y \
@@ -648,9 +614,8 @@ jobs:
- name: Validate Homebrew Formula - name: Validate Homebrew Formula
id: test id: test
if: | if: matrix.release != true
matrix.release != true uses: LizardByte/homebrew-release-action@v2025.506.15440
uses: LizardByte/homebrew-release-action@v2024.1115.14934
with: with:
formula_file: ${{ github.workspace }}/homebrew/sunshine.rb formula_file: ${{ github.workspace }}/homebrew/sunshine.rb
git_email: ${{ secrets.GH_BOT_EMAIL }} git_email: ${{ secrets.GH_BOT_EMAIL }}
@@ -659,52 +624,56 @@ jobs:
token: ${{ secrets.GH_BOT_TOKEN }} token: ${{ secrets.GH_BOT_TOKEN }}
validate: true validate: true
- name: Generate gcov report - name: Debug upload gcda artifact
# any except canceled or skipped if: always() && matrix.release != true
# TODO: fix coverage, no .gcno files are being created uses: actions/upload-artifact@v4
# TODO: .gcno files are supposed to be created next to .o files with:
if: false name: homebrew-gcda-${{ matrix.os_name }}-${{ matrix.os_version }}
# if: >- path: ${{ steps.test.outputs.buildpath }}/build/tests/CMakeFiles/test_sunshine.dir/__/src/audio.cpp.gcda
# always() &&
# matrix.release != true &&
# (steps.test.outcome == 'success' || steps.test.outcome == 'failure')
id: test_report
run: |
# if linux
if [ "${{ runner.os }}" == "Linux" ]; then
prefix="/tmp"
else
prefix="/private/tmp"
fi
brew_dir=$(find ${prefix} -type d -name "sunshine-*" -maxdepth 1 2>/dev/null) - name: Debug homebrew buildpath
cp -rf $brew_dir/build/ ./build/ if: always() && matrix.release != true
cd build run: |
# print the build path
echo "Build path: ${{ steps.test.outputs.buildpath }}"
echo "contents:"
ls -Ra ls -Ra
${{ steps.python.outputs.python-path }} -m pip install gcovr # print the test path
${{ steps.python.outputs.python-path }} -m gcovr . -r ../src \ echo "----"
--exclude-noncode-lines \ echo "Test path: ${{ steps.test.outputs.testpath }}"
--exclude-throw-branches \ echo "contents:"
--exclude-unreachable-branches \ ls -Ra
--verbose \
--xml-pretty \ - name: Upload test results to Codecov
-o coverage.xml # any except canceled or skipped
if: >-
always() &&
matrix.release != true &&
(steps.test.outcome == 'success' || steps.test.outcome == 'failure') &&
startsWith(github.repository, 'LizardByte/')
uses: codecov/test-results-action@v1
with:
disable_search: true
fail_ci_if_error: true
files: ${{ steps.test.outputs.testpath }}/test_results.xml
flags: ${{ matrix.os_name }}-${{ matrix.os_version }} (Homebrew)
handle_no_reports_found: true
token: ${{ secrets.CODECOV_TOKEN }}
verbose: true
- name: Upload coverage - name: Upload coverage
# any except canceled or skipped # any except canceled or skipped
# TODO: enable this once coverage report is fixed if: >-
if: false always() &&
# if: >- matrix.release != true &&
# always() && (steps.test_report.outcome == 'success') &&
# matrix.release != true && startsWith(github.repository, 'LizardByte/')
# (steps.test_report.outcome == 'success') &&
# startsWith(github.repository, 'LizardByte/')
uses: codecov/codecov-action@v5 uses: codecov/codecov-action@v5
with: with:
disable_search: true disable_search: true
fail_ci_if_error: true fail_ci_if_error: true
files: ./build/coverage.xml files: ${{ steps.test.outputs.testpath }}/build/coverage.xml
flags: ${{ matrix.os_name }}-${{ matrix.os_version }} (Homebrew) flags: ${{ matrix.os_name }}-${{ matrix.os_version }} (Homebrew)
token: ${{ secrets.CODECOV_TOKEN }} token: ${{ secrets.CODECOV_TOKEN }}
verbose: true verbose: true
@@ -713,7 +682,7 @@ jobs:
if: >- if: >-
matrix.release && matrix.release &&
needs.setup_release.outputs.publish_release == 'true' needs.setup_release.outputs.publish_release == 'true'
uses: LizardByte/create-release-action@v2025.102.13208 uses: LizardByte/create-release-action@v2025.426.1549
with: with:
allowUpdates: true allowUpdates: true
artifacts: '${{ github.workspace }}/homebrew/*' artifacts: '${{ github.workspace }}/homebrew/*'
@@ -727,8 +696,7 @@ jobs:
- name: Patch homebrew formula - name: Patch homebrew formula
# create beta version of the formula # create beta version of the formula
# don't run this on macOS, as the sed command fails # don't run this on macOS, as the sed command fails
if: >- if: matrix.release
matrix.release
run: | run: |
# variables # variables
formula_file="homebrew/sunshine-beta.rb" formula_file="homebrew/sunshine-beta.rb"
@@ -749,7 +717,7 @@ jobs:
github.repository_owner == 'LizardByte' && github.repository_owner == 'LizardByte' &&
matrix.release && matrix.release &&
needs.setup_release.outputs.publish_release == 'true' needs.setup_release.outputs.publish_release == 'true'
uses: LizardByte/homebrew-release-action@v2024.1115.14934 uses: LizardByte/homebrew-release-action@v2025.503.165455
with: with:
formula_file: ${{ github.workspace }}/homebrew/sunshine-beta.rb formula_file: ${{ github.workspace }}/homebrew/sunshine-beta.rb
git_email: ${{ secrets.GH_BOT_EMAIL }} git_email: ${{ secrets.GH_BOT_EMAIL }}
@@ -760,9 +728,8 @@ jobs:
build_win: build_win:
name: Windows name: Windows
needs: setup_release
runs-on: windows-2019 runs-on: windows-2019
needs: [setup_release]
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
@@ -874,27 +841,59 @@ jobs:
Get-Content -Path monitor_list.txt Get-Content -Path monitor_list.txt
- name: Setup Dependencies Windows - name: Setup Dependencies Windows
# if a dependency needs to be pinned, see https://github.com/LizardByte/build-deps/pull/186
uses: msys2/setup-msys2@v2 uses: msys2/setup-msys2@v2
with: with:
msystem: ucrt64 msystem: ucrt64
update: true update: true
install: >- install: >-
git
mingw-w64-ucrt-x86_64-boost
mingw-w64-ucrt-x86_64-cmake
mingw-w64-ucrt-x86_64-cppwinrt
mingw-w64-ucrt-x86_64-curl-winssl
mingw-w64-ucrt-x86_64-graphviz
mingw-w64-ucrt-x86_64-MinHook
mingw-w64-ucrt-x86_64-miniupnpc
mingw-w64-ucrt-x86_64-nodejs
mingw-w64-ucrt-x86_64-nsis
mingw-w64-ucrt-x86_64-onevpl
mingw-w64-ucrt-x86_64-openssl
mingw-w64-ucrt-x86_64-opus
mingw-w64-ucrt-x86_64-toolchain
wget wget
- name: Update Windows dependencies
env:
gcc_version: "14.2.0-3"
shell: msys2 {0}
run: |
broken_deps=(
"mingw-w64-ucrt-x86_64-gcc"
"mingw-w64-ucrt-x86_64-gcc-libs"
)
tarballs=""
for dep in "${broken_deps[@]}"; do
tarball="${dep}-${gcc_version}-any.pkg.tar.zst"
# download and install working version
wget https://repo.msys2.org/mingw/ucrt64/${tarball}
tarballs="${tarballs} ${tarball}"
done
# install broken dependencies
if [ -n "$tarballs" ]; then
pacman -U --noconfirm ${tarballs}
fi
# install dependencies
dependencies=(
"git"
"mingw-w64-ucrt-x86_64-cmake"
"mingw-w64-ucrt-x86_64-cppwinrt"
"mingw-w64-ucrt-x86_64-curl-winssl"
"mingw-w64-ucrt-x86_64-graphviz"
"mingw-w64-ucrt-x86_64-MinHook"
"mingw-w64-ucrt-x86_64-miniupnpc"
"mingw-w64-ucrt-x86_64-nlohmann-json"
"mingw-w64-ucrt-x86_64-nodejs"
"mingw-w64-ucrt-x86_64-nsis"
"mingw-w64-ucrt-x86_64-onevpl"
"mingw-w64-ucrt-x86_64-openssl"
"mingw-w64-ucrt-x86_64-opus"
"mingw-w64-ucrt-x86_64-toolchain"
)
pacman -Syu --noconfirm --ignore="$(IFS=,; echo "${broken_deps[*]}")" "${dependencies[@]}"
- name: Install Doxygen - name: Install Doxygen
# GCC compiled doxygen has issues when running graphviz # GCC compiled doxygen has issues when running graphviz
env: env:
@@ -942,6 +941,7 @@ jobs:
env: env:
BRANCH: ${{ github.head_ref || github.ref_name }} BRANCH: ${{ github.head_ref || github.ref_name }}
BUILD_VERSION: ${{ needs.setup_release.outputs.release_tag }} BUILD_VERSION: ${{ needs.setup_release.outputs.release_tag }}
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
COMMIT: ${{ needs.setup_release.outputs.release_commit }} COMMIT: ${{ needs.setup_release.outputs.release_commit }}
run: | run: |
mkdir -p build mkdir -p build
@@ -976,12 +976,14 @@ jobs:
shell: msys2 {0} shell: msys2 {0}
working-directory: build/tests working-directory: build/tests
run: | run: |
./test_sunshine.exe --gtest_color=yes ./test_sunshine.exe --gtest_color=yes --gtest_output=xml:test_results.xml
- name: Generate gcov report - name: Generate gcov report
# any except canceled or skipped
if: always() && (steps.test.outcome == 'success' || steps.test.outcome == 'failure')
id: test_report id: test_report
# any except canceled or skipped
if: >-
always() &&
(steps.test.outcome == 'success' || steps.test.outcome == 'failure')
shell: msys2 {0} shell: msys2 {0}
working-directory: build working-directory: build
run: | run: |
@@ -994,6 +996,22 @@ jobs:
--xml-pretty \ --xml-pretty \
-o coverage.xml -o coverage.xml
- name: Upload test results to Codecov
# any except canceled or skipped
if: >-
always() &&
(steps.test.outcome == 'success' || steps.test.outcome == 'failure') &&
startsWith(github.repository, 'LizardByte/')
uses: codecov/test-results-action@v1
with:
disable_search: true
fail_ci_if_error: true
files: ./build/tests/test_results.xml
flags: ${{ runner.os }}
handle_no_reports_found: true
token: ${{ secrets.CODECOV_TOKEN }}
verbose: true
- name: Upload coverage - name: Upload coverage
# any except canceled or skipped # any except canceled or skipped
if: >- if: >-
@@ -1027,10 +1045,11 @@ jobs:
with: with:
name: sunshine-windows name: sunshine-windows
path: artifacts/ path: artifacts/
if-no-files-found: error
- name: Create/Update GitHub Release - name: Create/Update GitHub Release
if: ${{ needs.setup_release.outputs.publish_release == 'true' }} if: needs.setup_release.outputs.publish_release == 'true'
uses: LizardByte/create-release-action@v2025.102.13208 uses: LizardByte/create-release-action@v2025.426.1549
with: with:
allowUpdates: true allowUpdates: true
body: ${{ needs.setup_release.outputs.release_body }} body: ${{ needs.setup_release.outputs.release_body }}

View File

@@ -1,5 +1,7 @@
--- ---
name: CI Copr name: CI Copr
permissions:
contents: read
on: on:
pull_request: pull_request:
@@ -26,7 +28,7 @@ jobs:
github_org_owner: LizardByte github_org_owner: LizardByte
copr_ownername: lizardbyte copr_ownername: lizardbyte
auto_update_package: true auto_update_package: true
job_timeout: 60 job_timeout: 90
secrets: secrets:
COPR_BETA_WEBHOOK_TOKEN: ${{ secrets.COPR_BETA_WEBHOOK_TOKEN }} COPR_BETA_WEBHOOK_TOKEN: ${{ secrets.COPR_BETA_WEBHOOK_TOKEN }}
COPR_STABLE_WEBHOOK_TOKEN: ${{ secrets.COPR_STABLE_WEBHOOK_TOKEN }} COPR_STABLE_WEBHOOK_TOKEN: ${{ secrets.COPR_STABLE_WEBHOOK_TOKEN }}

View File

@@ -1,5 +1,5 @@
--- ---
# This action is centrally managed in https://github.com/<organization>/.github/ # This workflow is centrally managed in https://github.com/<organization>/.github/
# Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in # Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in
# the above-mentioned repo. # the above-mentioned repo.
@@ -19,13 +19,20 @@
# GitHub runner. # GitHub runner.
name: CI Docker name: CI Docker
permissions:
contents: read
on: on:
pull_request: pull_request:
branches: [master] branches:
types: [opened, synchronize, reopened] - master
types:
- opened
- synchronize
- reopened
push: push:
branches: [master] branches:
- master
workflow_dispatch: workflow_dispatch:
concurrency: concurrency:
@@ -97,10 +104,9 @@ jobs:
solution: ${{ steps.find_dotnet.outputs.solution }} solution: ${{ steps.find_dotnet.outputs.solution }}
setup_release: setup_release:
if: ${{ needs.check_dockerfiles.outputs.dockerfiles }}
name: Setup Release name: Setup Release
needs: if: needs.check_dockerfiles.outputs.dockerfiles
- check_dockerfiles needs: check_dockerfiles
outputs: outputs:
publish_release: ${{ steps.setup_release.outputs.publish_release }} publish_release: ${{ steps.setup_release.outputs.publish_release }}
release_body: ${{ steps.setup_release.outputs.release_body }} release_body: ${{ steps.setup_release.outputs.release_body }}
@@ -108,6 +114,8 @@ jobs:
release_generate_release_notes: ${{ steps.setup_release.outputs.release_generate_release_notes }} release_generate_release_notes: ${{ steps.setup_release.outputs.release_generate_release_notes }}
release_tag: ${{ steps.setup_release.outputs.release_tag }} release_tag: ${{ steps.setup_release.outputs.release_tag }}
release_version: ${{ steps.setup_release.outputs.release_version }} release_version: ${{ steps.setup_release.outputs.release_version }}
permissions:
contents: write # read does not work to check squash and merge details
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
@@ -115,23 +123,24 @@ jobs:
- name: Setup Release - name: Setup Release
id: setup_release id: setup_release
uses: LizardByte/setup-release-action@v2025.102.14715 uses: LizardByte/setup-release-action@v2025.426.225
with: with:
dotnet: ${{ needs.check_dockerfiles.outputs.dotnet }} dotnet: ${{ needs.check_dockerfiles.outputs.dotnet }}
github_token: ${{ secrets.GITHUB_TOKEN }} github_token: ${{ secrets.GITHUB_TOKEN }}
docker: docker:
needs: [check_dockerfiles, setup_release] name: Docker${{ matrix.tag }}
if: ${{ needs.check_dockerfiles.outputs.dockerfiles }} if: needs.check_dockerfiles.outputs.dockerfiles
runs-on: ubuntu-latest needs:
- check_dockerfiles
- setup_release
permissions: permissions:
packages: write packages: write
contents: write contents: write
runs-on: ubuntu-22.04
strategy: strategy:
fail-fast: false fail-fast: false
matrix: ${{ fromJson(needs.check_dockerfiles.outputs.matrix) }} matrix: ${{ fromJson(needs.check_dockerfiles.outputs.matrix) }}
name: Docker${{ matrix.tag }}
steps: steps:
- name: Maximize build space - name: Maximize build space
uses: easimon/maximize-build-space@v10 uses: easimon/maximize-build-space@v10
@@ -256,14 +265,14 @@ jobs:
Docker-buildx${{ matrix.tag }}- Docker-buildx${{ matrix.tag }}-
- name: Log in to Docker Hub - name: Log in to Docker Hub
if: ${{ needs.setup_release.outputs.publish_release == 'true' }} # PRs do not have access to secrets if: needs.setup_release.outputs.publish_release == 'true' # PRs do not have access to secrets
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
username: ${{ secrets.DOCKER_HUB_USERNAME }} username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
- name: Log in to the Container registry - name: Log in to the Container registry
if: ${{ needs.setup_release.outputs.publish_release == 'true' }} # PRs do not have access to secrets if: needs.setup_release.outputs.publish_release == 'true' # PRs do not have access to secrets
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
registry: ghcr.io registry: ghcr.io
@@ -271,7 +280,7 @@ jobs:
password: ${{ secrets.GH_BOT_TOKEN }} password: ${{ secrets.GH_BOT_TOKEN }}
- name: Build artifacts - name: Build artifacts
if: ${{ steps.prepare.outputs.artifacts == 'true' }} if: steps.prepare.outputs.artifacts == 'true'
id: build_artifacts id: build_artifacts
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
with: with:
@@ -314,7 +323,7 @@ jobs:
no-cache-filters: ${{ steps.prepare.outputs.no_cache_filters }} no-cache-filters: ${{ steps.prepare.outputs.no_cache_filters }}
- name: Arrange Artifacts - name: Arrange Artifacts
if: ${{ steps.prepare.outputs.artifacts == 'true' }} if: steps.prepare.outputs.artifacts == 'true'
working-directory: artifacts working-directory: artifacts
run: | run: |
# debug directory # debug directory
@@ -336,15 +345,18 @@ jobs:
rm -f ./provenance.json rm -f ./provenance.json
- name: Upload Artifacts - name: Upload Artifacts
if: ${{ steps.prepare.outputs.artifacts == 'true' }} if: steps.prepare.outputs.artifacts == 'true'
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
name: Docker${{ matrix.tag }} name: Docker${{ matrix.tag }}
path: artifacts/ path: artifacts/
if-no-files-found: error
- name: Create/Update GitHub Release - name: Create/Update GitHub Release
if: ${{ needs.setup_release.outputs.publish_release == 'true' && steps.prepare.outputs.artifacts == 'true' }} if: >
uses: LizardByte/create-release-action@v2025.102.13208 needs.setup_release.outputs.publish_release == 'true' &&
steps.prepare.outputs.artifacts == 'true'
uses: LizardByte/create-release-action@v2025.426.1549
with: with:
allowUpdates: true allowUpdates: true
artifacts: "*artifacts/*" artifacts: "*artifacts/*"
@@ -356,7 +368,9 @@ jobs:
token: ${{ secrets.GH_BOT_TOKEN }} token: ${{ secrets.GH_BOT_TOKEN }}
- name: Update Docker Hub Description - name: Update Docker Hub Description
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} if: >
github.event_name == 'push' &&
github.ref == 'refs/heads/master'
uses: peter-evans/dockerhub-description@v4 uses: peter-evans/dockerhub-description@v4
with: with:
username: ${{ secrets.DOCKER_HUB_USERNAME }} username: ${{ secrets.DOCKER_HUB_USERNAME }}

View File

@@ -1,17 +1,21 @@
--- ---
# This action is centrally managed in https://github.com/<organization>/.github/ # This workflow is centrally managed in https://github.com/<organization>/.github/
# Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in # Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in
# the above-mentioned repo. # the above-mentioned repo.
# This workflow will analyze all supported languages in the repository using CodeQL Analysis. # This workflow will analyze all supported languages in the repository using CodeQL Analysis.
name: "CodeQL" name: "CodeQL"
permissions:
contents: read
on: on:
push: push:
branches: ["master"] branches:
- master
pull_request: pull_request:
branches: ["master"] branches:
- master
schedule: schedule:
- cron: '00 12 * * 0' # every Sunday at 12:00 UTC - cron: '00 12 * * 0' # every Sunday at 12:00 UTC
@@ -22,14 +26,17 @@ concurrency:
jobs: jobs:
languages: languages:
name: Get language matrix name: Get language matrix
runs-on: ubuntu-latest
outputs: outputs:
matrix: ${{ steps.lang.outputs.result }} matrix: ${{ steps.lang.outputs.result }}
continue: ${{ steps.continue.outputs.result }} continue: ${{ steps.continue.outputs.result }}
runs-on: ubuntu-latest
steps: steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Get repo languages - name: Get repo languages
uses: actions/github-script@v7
id: lang id: lang
uses: actions/github-script@v7
with: with:
script: | script: |
// CodeQL supports ['cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby', 'swift'] // CodeQL supports ['cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby', 'swift']
@@ -51,32 +58,62 @@ jobs:
"include": [] "include": []
} }
// Track languages we've already added to avoid duplicates
const addedLanguages = new Set()
// Check if workflow files exist to determine if we should add actions language
const fs = require('fs');
const hasYmlFiles = fs.existsSync('.github/workflows') &&
fs.readdirSync('.github/workflows').some(file => file.endsWith('.yml') || file.endsWith('.yaml'));
// Add actions language if workflow files exist
if (hasYmlFiles) {
console.log('Found GitHub Actions workflow files. Adding actions to the matrix.');
matrix['include'].push({
"category": "/language:actions",
"language": "actions",
"name": "actions",
"os": "ubuntu-latest"
});
}
for (let [key, value] of Object.entries(response.data)) { for (let [key, value] of Object.entries(response.data)) {
// remap language // remap language
if (remap_languages[key.toLowerCase()]) { if (remap_languages[key.toLowerCase()]) {
console.log(`Remapping language: ${key} to ${remap_languages[key.toLowerCase()]}`) console.log(`Remapping language: ${key} to ${remap_languages[key.toLowerCase()]}`)
key = remap_languages[key.toLowerCase()] key = remap_languages[key.toLowerCase()]
} }
if (supported_languages.includes(key.toLowerCase())) {
console.log(`Found supported language: ${key}`) const normalizedKey = key.toLowerCase()
if (supported_languages.includes(normalizedKey) && !addedLanguages.has(normalizedKey)) {
// Mark this language as added
addedLanguages.add(normalizedKey)
console.log(`Found supported language: ${normalizedKey}`)
let osList = ['ubuntu-latest']; let osList = ['ubuntu-latest'];
if (key.toLowerCase() === 'swift') { if (normalizedKey === 'swift') {
osList = ['macos-latest']; osList = ['macos-latest'];
} else if (key.toLowerCase() === 'cpp') { } else if (normalizedKey === 'cpp') {
// TODO: update macos to latest after the below issue is resolved osList = ['macos-latest', 'ubuntu-latest', 'windows-latest'];
// https://github.com/github/codeql-action/issues/2266
osList = ['macos-13', 'ubuntu-latest', 'windows-latest'];
} }
for (let os of osList) { for (let os of osList) {
// set name for matrix // set name for matrix
if (osList.length == 1) { let name = osList.length === 1 ? normalizedKey : `${normalizedKey}, ${os}`
name = key.toLowerCase()
} else { // set category for matrix
name = `${key.toLowerCase()}, ${os}` let category = `/language:${normalizedKey}`
if (normalizedKey === 'cpp') {
category = `/language:cpp-${os.split('-')[0]}`
} }
// add to matrix // add to matrix
matrix['include'].push({"language": key.toLowerCase(), "os": os, "name": name}) matrix['include'].push({
"category": category,
"language": normalizedKey,
"name": name,
"os": os
})
} }
} }
} }
@@ -87,8 +124,8 @@ jobs:
return matrix return matrix
- name: Continue - name: Continue
uses: actions/github-script@v7
id: continue id: continue
uses: actions/github-script@v7
with: with:
script: | script: |
// if matrix['include'] is an empty list return false, otherwise true // if matrix['include'] is an empty list return false, otherwise true
@@ -102,24 +139,22 @@ jobs:
analyze: analyze:
name: Analyze (${{ matrix.name }}) name: Analyze (${{ matrix.name }})
if: ${{ needs.languages.outputs.continue == 'true' }} if: needs.languages.outputs.continue == 'true'
defaults: defaults:
run: run:
shell: ${{ matrix.os == 'windows-latest' && 'msys2 {0}' || 'bash' }} shell: ${{ matrix.os == 'windows-latest' && 'msys2 {0}' || 'bash' }}
env: env:
GITHUB_CODEQL_BUILD: true GITHUB_CODEQL_BUILD: true
needs: [languages] needs: languages
runs-on: ${{ matrix.os || 'ubuntu-latest' }}
timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }}
permissions: permissions:
actions: read actions: read
contents: read contents: read
security-events: write security-events: write
runs-on: ${{ matrix.os || 'ubuntu-latest' }}
strategy: strategy:
fail-fast: false fail-fast: false
matrix: ${{ fromJson(needs.languages.outputs.matrix) }} matrix: ${{ fromJson(needs.languages.outputs.matrix) }}
timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }}
steps: steps:
- name: Maximize build space - name: Maximize build space
if: >- if: >-
@@ -167,8 +202,7 @@ jobs:
- third-party - third-party
# Pre autobuild # Pre autobuild
# create a file named .codeql-prebuild-${{ matrix.language }}.sh in the root of your repository # create a file named .codeql-prebuild-${{ matrix.language }}-${{ runner.os }}.sh in the root of your repository
# create a file named .codeql-build-${{ matrix.language }}.sh in the root of your repository
- name: Prebuild - name: Prebuild
id: prebuild id: prebuild
run: | run: |
@@ -187,7 +221,7 @@ jobs:
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3 uses: github/codeql-action/analyze@v3
with: with:
category: "/language:${{matrix.language}}" category: "${{ matrix.category }}"
output: sarif-results output: sarif-results
upload: failure-only upload: failure-only
@@ -204,6 +238,7 @@ jobs:
- name: Upload SARIF - name: Upload SARIF
uses: github/codeql-action/upload-sarif@v3 uses: github/codeql-action/upload-sarif@v3
with: with:
category: "${{ matrix.category }}"
sarif_file: sarif-results/${{ matrix.language }}.sarif sarif_file: sarif-results/${{ matrix.language }}.sarif
- name: Upload loc as a Build Artifact - name: Upload loc as a Build Artifact
@@ -211,4 +246,5 @@ jobs:
with: with:
name: sarif-results-${{ matrix.language }}-${{ runner.os }} name: sarif-results-${{ matrix.language }}-${{ runner.os }}
path: sarif-results path: sarif-results
if-no-files-found: error
retention-days: 1 retention-days: 1

View File

@@ -1,16 +1,22 @@
--- ---
# This action is centrally managed in https://github.com/<organization>/.github/ # This workflow is centrally managed in https://github.com/<organization>/.github/
# Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in # Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in
# the above-mentioned repo. # the above-mentioned repo.
# Common linting. # Common linting.
name: common lint name: common lint
permissions:
contents: read
on: on:
pull_request: pull_request:
branches: [master] branches:
types: [opened, synchronize, reopened] - master
types:
- opened
- synchronize
- reopened
concurrency: concurrency:
group: "${{ github.workflow }}-${{ github.ref }}" group: "${{ github.workflow }}-${{ github.ref }}"
@@ -77,9 +83,10 @@ jobs:
- name: C++ - Clang format lint - name: C++ - Clang format lint
if: always() && steps.cpp_files.outputs.found_files if: always() && steps.cpp_files.outputs.found_files
uses: DoozyX/clang-format-lint-action@v0.18 uses: DoozyX/clang-format-lint-action@v0.20
with: with:
source: ${{ steps.cpp_files.outputs.found_files }} source: ${{ steps.cpp_files.outputs.found_files }}
clangFormatVersion: '20'
extensions: 'c,cpp,h,hpp,m,mm' extensions: 'c,cpp,h,hpp,m,mm'
style: file style: file
inplace: false inplace: false
@@ -263,5 +270,4 @@ jobs:
- name: YAML - log - name: YAML - log
if: always() && steps.yamllint.outcome == 'failure' if: always() && steps.yamllint.outcome == 'failure'
run: | run: cat "${{ steps.yamllint.outputs.logfile }}" >> $GITHUB_STEP_SUMMARY
cat "${{ steps.yamllint.outputs.logfile }}" >> $GITHUB_STEP_SUMMARY

View File

@@ -1,17 +1,22 @@
--- ---
# This action is centrally managed in https://github.com/<organization>/.github/ # This workflow is centrally managed in https://github.com/<organization>/.github/
# Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in # Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in
# the above-mentioned repo. # the above-mentioned repo.
# Label and un-label actions using `../label-actions.yml`. # Label and un-label actions using `../label-actions.yml`.
name: Issues name: Issues
permissions: {}
on: on:
issues: issues:
types: [labeled, unlabeled] types:
- labeled
- unlabeled
discussion: discussion:
types: [labeled, unlabeled] types:
- labeled
- unlabeled
jobs: jobs:
label: label:

View File

@@ -1,10 +1,13 @@
--- ---
name: localize name: localize
permissions:
contents: read
on: on:
push: push:
branches: [master] branches:
paths: # prevents workflow from running unless these files change - master
paths:
- '.github/workflows/localize.yml' - '.github/workflows/localize.yml'
- 'src/**' - 'src/**'
- 'locale/sunshine.po' - 'locale/sunshine.po'
@@ -54,7 +57,7 @@ jobs:
python ./scripts/_locale.py --extract python ./scripts/_locale.py --extract
- name: git diff - name: git diff
if: ${{ env.new_file == 'false' }} if: env.new_file == 'false'
run: | run: |
# disable the pager # disable the pager
git config --global pager.diff false git config --global pager.diff false
@@ -68,7 +71,9 @@ jobs:
- name: git reset - name: git reset
# only run if a single line changed (date/time) and file already existed # only run if a single line changed (date/time) and file already existed
if: ${{ env.git_diff == '1 1 locale/sunshine.po' && env.new_file == 'false' }} if: >-
env.git_diff == '1 1 locale/sunshine.po' &&
env.new_file == 'false'
run: | run: |
git reset --hard git reset --hard

View File

@@ -1,5 +1,6 @@
--- ---
name: Release Notifications (Moonlight) name: Release Notifications (Moonlight)
permissions: {}
on: on:
release: release:
@@ -8,20 +9,30 @@ on:
jobs: jobs:
discord: discord:
if: >- if: github.repository_owner == 'LizardByte'
startsWith(github.repository, 'LizardByte/') &&
!github.event.release.prerelease &&
!github.event.release.draft
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: discord - name: Check if latest GitHub release
uses: sarisia/actions-status-discord@v1 # https://github.com/sarisia/actions-status-discord id: check-release
uses: actions/github-script@v7
with: with:
webhook: ${{ secrets.DISCORD_RELEASE_WEBHOOK_MOONLIGHT }} script: |
const latestRelease = await github.rest.repos.getLatestRelease({
owner: context.repo.owner,
repo: context.repo.repo
});
core.setOutput('isLatestRelease', latestRelease.data.tag_name === context.payload.release.tag_name);
- name: discord
if: steps.check-release.outputs.isLatestRelease == 'true'
uses: sarisia/actions-status-discord@v1
with:
avatar_url: ${{ vars.ORG_LOGO_URL }}256
color: 0x${{ vars.COLOR_HEX_GREEN }}
description: ${{ github.event.release.body }}
nodetail: true nodetail: true
nofail: false nofail: false
username: ${{ secrets.DISCORD_USERNAME }}
avatar_url: ${{ secrets.ORG_LOGO_URL }}
title: ${{ github.event.repository.name }} ${{ github.ref_name }} Released title: ${{ github.event.repository.name }} ${{ github.ref_name }} Released
description: ${{ github.event.release.body }} username: ${{ secrets.DISCORD_USERNAME }}
color: 0xFF4500 webhook: ${{ secrets.DISCORD_RELEASE_WEBHOOK_MOONLIGHT }}

View File

@@ -1,11 +1,13 @@
--- ---
# This action is centrally managed in https://github.com/<organization>/.github/ # This workflow is centrally managed in https://github.com/<organization>/.github/
# Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in # Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in
# the above-mentioned repo. # the above-mentioned repo.
# Create a blog post for a new release and open a PR to the blog repo # Create a blog post for a new release and open a PR to the blog repo
name: Release Notifications name: Release Notifications
permissions:
contents: read
on: on:
release: release:
@@ -14,8 +16,8 @@ on:
jobs: jobs:
update-blog: update-blog:
if: >- name: Update blog
github.repository_owner == 'LizardByte' if: github.repository_owner == 'LizardByte'
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Check topics - name: Check topics
@@ -41,8 +43,7 @@ jobs:
- name: Check if latest GitHub release - name: Check if latest GitHub release
id: check-release id: check-release
if: >- if: steps.check-label.outputs.hasTopic == 'true'
steps.check-label.outputs.hasTopic == 'true'
uses: actions/github-script@v7 uses: actions/github-script@v7
with: with:
script: | script: |
@@ -128,9 +129,7 @@ jobs:
steps.check-label.outputs.hasTopic == 'true' && steps.check-label.outputs.hasTopic == 'true' &&
steps.check-release.outputs.isLatestRelease == 'true' steps.check-release.outputs.isLatestRelease == 'true'
run: | run: |
gh \ gh pr merge \
pr \
merge \
--auto \ --auto \
--delete-branch \ --delete-branch \
--repo "LizardByte/LizardByte.github.io" \ --repo "LizardByte/LizardByte.github.io" \

View File

@@ -1,15 +1,20 @@
--- ---
# This action is centrally managed in https://github.com/<organization>/.github/ # This workflow is centrally managed in https://github.com/<organization>/.github/
# Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in # Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in
# the above-mentioned repo. # the above-mentioned repo.
# Update changelog on release events. # Update changelog on release events.
name: Update changelog name: Update changelog
permissions:
contents: read
on: on:
release: release:
types: [created, edited, deleted] types:
- created
- edited
- deleted
workflow_dispatch: workflow_dispatch:
concurrency: concurrency:
@@ -18,6 +23,7 @@ concurrency:
jobs: jobs:
update-changelog: update-changelog:
name: Update Changelog
if: >- if: >-
github.event_name == 'workflow_dispatch' || github.event_name == 'workflow_dispatch' ||
(!github.event.release.prerelease && !github.event.release.draft) (!github.event.release.prerelease && !github.event.release.draft)

View File

@@ -1,19 +1,23 @@
--- ---
# This action is centrally managed in https://github.com/<organization>/.github/ # This workflow is centrally managed in https://github.com/<organization>/.github/
# Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in # Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in
# the above-mentioned repo. # the above-mentioned repo.
# Use the `rtd` repository label to identify repositories that should trigger have this workflow. # To use, add the `rtd` repository label to identify repositories that should trigger this workflow.
# If the project slug is not the repository name, add a repository variable named `READTHEDOCS_SLUG` with the value of # If the project slug is not the repository name, add a repository variable named `READTHEDOCS_SLUG` with the value of
# the ReadTheDocs project slug. # the ReadTheDocs project slug.
# Update readthedocs on release events. # Update readthedocs on release events.
name: Update docs name: Update docs
permissions: {}
on: on:
release: release:
types: [created, edited, deleted] types:
- created
- edited
- deleted
concurrency: concurrency:
group: "${{ github.workflow }}-${{ github.event.release.tag_name }}" group: "${{ github.workflow }}-${{ github.event.release.tag_name }}"
@@ -73,8 +77,7 @@ jobs:
- name: Update RTD project - name: Update RTD project
# changing the default branch in readthedocs makes "latest" point to that branch/tag # changing the default branch in readthedocs makes "latest" point to that branch/tag
# we can also update other properties like description, etc. # we can also update other properties like description, etc.
if: >- if: steps.check.outputs.isLatestRelease == 'true'
steps.check.outputs.isLatestRelease == 'true'
run: | run: |
json_body=$(jq -n \ json_body=$(jq -n \
--arg default_branch "${TAG}" \ --arg default_branch "${TAG}" \

View File

@@ -1,15 +1,20 @@
--- ---
# This action is a candidate to centrally manage in https://github.com/<organization>/.github/ # This workflow is centrally managed in https://github.com/<organization>/.github/
# If more Flathub applications are developed, consider moving this action to the organization's .github repository, # Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in
# using the `flathub-pkg` repository label to identify repositories that should trigger this workflow. # the above-mentioned repo.
# To use, add the `flathub-pkg` repository label to identify repositories that should trigger this workflow.
# Update Flathub on release events. # Update Flathub on release events.
name: Update flathub repo name: Update flathub repo
permissions:
contents: read
on: on:
release: release:
types: [released] types:
- released
concurrency: concurrency:
group: "${{ github.workflow }}-${{ github.event.release.tag_name }}" group: "${{ github.workflow }}-${{ github.event.release.tag_name }}"
@@ -19,14 +24,13 @@ jobs:
update-flathub-repo: update-flathub-repo:
env: env:
FLATHUB_PKG: dev.lizardbyte.app.${{ github.event.repository.name }} FLATHUB_PKG: dev.lizardbyte.app.${{ github.event.repository.name }}
if: >- if: github.repository_owner == 'LizardByte'
github.repository_owner == 'LizardByte'
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Check if flathub repo - name: Check if flathub repo
id: check-label
env: env:
TOPIC: flathub-pkg TOPIC: flathub-pkg
id: check-label
uses: actions/github-script@v7 uses: actions/github-script@v7
with: with:
script: | script: |
@@ -46,8 +50,7 @@ jobs:
- name: Check if latest GitHub release - name: Check if latest GitHub release
id: check-release id: check-release
if: >- if: steps.check-label.outputs.hasTopic == 'true'
steps.check-label.outputs.hasTopic == 'true'
uses: actions/github-script@v7 uses: actions/github-script@v7
with: with:
script: | script: |
@@ -104,7 +107,7 @@ jobs:
if: >- if: >-
steps.check-label.outputs.hasTopic == 'true' && steps.check-label.outputs.hasTopic == 'true' &&
steps.check-release.outputs.isLatestRelease == 'true' steps.check-release.outputs.isLatestRelease == 'true'
uses: robinraju/release-downloader@v1.11 uses: robinraju/release-downloader@v1.12
with: with:
repository: "${{ github.repository }}" repository: "${{ github.repository }}"
tag: "${{ github.event.release.tag_name }}" tag: "${{ github.event.release.tag_name }}"
@@ -114,7 +117,7 @@ jobs:
out-file-path: "flathub/${{ env.FLATHUB_PKG }}" out-file-path: "flathub/${{ env.FLATHUB_PKG }}"
extract: true extract: true
- name: Delete arhive - name: Delete archive
if: >- if: >-
steps.check-label.outputs.hasTopic == 'true' && steps.check-label.outputs.hasTopic == 'true' &&
steps.check-release.outputs.isLatestRelease == 'true' steps.check-release.outputs.isLatestRelease == 'true'
@@ -172,6 +175,7 @@ jobs:
git checkout $main_commit git checkout $main_commit
- name: Create/Update Pull Request - name: Create/Update Pull Request
id: create-pr
if: >- if: >-
steps.check-label.outputs.hasTopic == 'true' && steps.check-label.outputs.hasTopic == 'true' &&
steps.check-release.outputs.isLatestRelease == 'true' && steps.check-release.outputs.isLatestRelease == 'true' &&
@@ -185,3 +189,18 @@ jobs:
delete-branch: true delete-branch: true
title: "chore: Update ${{ env.FLATHUB_PKG }} to ${{ github.event.release.tag_name }}" title: "chore: Update ${{ env.FLATHUB_PKG }} to ${{ github.event.release.tag_name }}"
body: ${{ github.event.release.body }} body: ${{ github.event.release.body }}
- name: Automerge PR
env:
GH_TOKEN: ${{ secrets.GH_BOT_TOKEN }}
if: >-
steps.check-label.outputs.hasTopic == 'true' &&
steps.check-release.outputs.isLatestRelease == 'true' &&
fromJson(steps.download.outputs.downloaded_files)[0]
run: |
gh pr merge \
--auto \
--delete-branch \
--repo "flathub/${{ env.FLATHUB_PKG }}" \
--squash \
"${{ steps.create-pr.outputs.pull-request-number }}"

View File

@@ -1,15 +1,20 @@
--- ---
# This action is a candidate to centrally manage in https://github.com/<organization>/.github/ # This workflow is centrally managed in https://github.com/<organization>/.github/
# If more Homebrew applications are developed, consider moving this action to the organization's .github repository, # Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in
# using the `homebrew-pkg` repository label to identify repositories that should trigger this workflow. # the above-mentioned repo.
# To use, add the `homebrew-pkg` repository label to identify repositories that should trigger this workflow.
# Update Homebrew on release events. # Update Homebrew on release events.
name: Update Homebrew release name: Update Homebrew release
permissions:
contents: read
on: on:
release: release:
types: [released] types:
- released
concurrency: concurrency:
group: "${{ github.workflow }}-${{ github.event.release.tag_name }}" group: "${{ github.workflow }}-${{ github.event.release.tag_name }}"
@@ -17,14 +22,13 @@ concurrency:
jobs: jobs:
update-homebrew-release: update-homebrew-release:
if: >- if: github.repository_owner == 'LizardByte'
github.repository_owner == 'LizardByte'
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Check if Homebrew repo - name: Check if Homebrew repo
id: check-label
env: env:
TOPIC: homebrew-pkg TOPIC: homebrew-pkg
id: check-label
uses: actions/github-script@v7 uses: actions/github-script@v7
with: with:
script: | script: |
@@ -44,9 +48,8 @@ jobs:
- name: Download release asset - name: Download release asset
id: download id: download
if: >- if: steps.check-label.outputs.hasTopic == 'true'
steps.check-label.outputs.hasTopic == 'true' uses: robinraju/release-downloader@v1.12
uses: robinraju/release-downloader@v1.11
with: with:
repository: "${{ github.repository }}" repository: "${{ github.repository }}"
tag: "${{ github.event.release.tag_name }}" tag: "${{ github.event.release.tag_name }}"

View File

@@ -1,15 +1,20 @@
--- ---
# This action is a candidate to centrally manage in https://github.com/<organization>/.github/ # This workflow is centrally managed in https://github.com/<organization>/.github/
# If more pacman packages are developed, consider moving this action to the organization's .github repository, # Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in
# using the `pacman-pkg` repository label to identify repositories that should trigger have this workflow. # the above-mentioned repo.
# To use, add the `pacman-pkg` repository label to identify repositories that should trigger this workflow.
# Update pacman repo on release events. # Update pacman repo on release events.
name: Update pacman repo name: Update pacman repo
permissions:
contents: read
on: on:
release: release:
types: [released] types:
- released
concurrency: concurrency:
group: "${{ github.workflow }}-${{ github.event.release.tag_name }}" group: "${{ github.workflow }}-${{ github.event.release.tag_name }}"
@@ -17,14 +22,13 @@ concurrency:
jobs: jobs:
update-homebrew-release: update-homebrew-release:
if: >- if: github.repository_owner == 'LizardByte'
github.repository_owner == 'LizardByte'
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Check if pacman repo - name: Check if pacman repo
id: check-label
env: env:
TOPIC: pacman-pkg TOPIC: pacman-pkg
id: check-label
uses: actions/github-script@v7 uses: actions/github-script@v7
with: with:
script: | script: |
@@ -77,7 +81,7 @@ jobs:
if: >- if: >-
steps.check-label.outputs.hasTopic == 'true' && steps.check-label.outputs.hasTopic == 'true' &&
steps.check-release.outputs.isLatestRelease == 'true' steps.check-release.outputs.isLatestRelease == 'true'
uses: robinraju/release-downloader@v1.11 uses: robinraju/release-downloader@v1.12
with: with:
repository: "${{ github.repository }}" repository: "${{ github.repository }}"
tag: "${{ github.event.release.tag_name }}" tag: "${{ github.event.release.tag_name }}"
@@ -87,7 +91,16 @@ jobs:
out-file-path: "pkgbuilds/${{ steps.prep.outputs.pkg_name }}" out-file-path: "pkgbuilds/${{ steps.prep.outputs.pkg_name }}"
extract: true extract: true
- name: Remove pkg.tar.gz
if: >-
steps.check-label.outputs.hasTopic == 'true' &&
steps.check-release.outputs.isLatestRelease == 'true' &&
fromJson(steps.download.outputs.downloaded_files)[0]
run: |
rm -f "pkgbuilds/${{ steps.prep.outputs.pkg_name }}"
- name: Create/Update Pull Request - name: Create/Update Pull Request
id: create-pr
if: >- if: >-
steps.check-label.outputs.hasTopic == 'true' && steps.check-label.outputs.hasTopic == 'true' &&
steps.check-release.outputs.isLatestRelease == 'true' && steps.check-release.outputs.isLatestRelease == 'true' &&
@@ -105,3 +118,17 @@ jobs:
labels: | labels: |
auto-approve auto-approve
auto-merge auto-merge
- name: Automerge PR
env:
GH_TOKEN: ${{ secrets.GH_BOT_TOKEN }}
if: >-
steps.check-label.outputs.hasTopic == 'true' &&
steps.check-release.outputs.isLatestRelease == 'true' &&
fromJson(steps.download.outputs.downloaded_files)[0]
run: |
gh pr merge \
--auto \
--delete-branch \
--squash \
"${{ steps.create-pr.outputs.pull-request-number }}"

View File

@@ -1,5 +1,7 @@
--- ---
name: Build GH-Pages name: Build GH-Pages
permissions:
contents: read
on: on:
pull_request: pull_request:
@@ -37,11 +39,11 @@ jobs:
call-jekyll-build: call-jekyll-build:
needs: prep needs: prep
uses: LizardByte/LizardByte.github.io/.github/workflows/jekyll-build.yml@master uses: LizardByte/LizardByte.github.io/.github/workflows/jekyll-build.yml@master
with:
site_artifact: 'prep'
target_branch: 'gh-pages'
clean_gh_pages: true
secrets: secrets:
GH_BOT_EMAIL: ${{ secrets.GH_BOT_EMAIL }} GH_BOT_EMAIL: ${{ secrets.GH_BOT_EMAIL }}
GH_BOT_NAME: ${{ secrets.GH_BOT_NAME }} GH_BOT_NAME: ${{ secrets.GH_BOT_NAME }}
GH_BOT_TOKEN: ${{ secrets.GH_BOT_TOKEN }} GH_BOT_TOKEN: ${{ secrets.GH_BOT_TOKEN }}
with:
clean_gh_pages: true
site_artifact: 'prep'
target_branch: 'gh-pages'

View File

@@ -1,15 +1,20 @@
--- ---
# This action is a candidate to centrally manage in https://github.com/<organization>/.github/ # This workflow is centrally managed in https://github.com/<organization>/.github/
# If more Winget applications are developed, consider moving this action to the organization's .github repository, # Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in
# using the `winget-pkg` repository label to identify repositories that should trigger this workflow. # the above-mentioned repo.
# To use, add the `winget-pkg` repository label to identify repositories that should trigger this workflow.
# Update Winget on release events. # Update Winget on release events.
name: Update Winget release name: Update Winget release
permissions:
contents: read
on: on:
release: release:
types: [released] types:
- released
concurrency: concurrency:
group: "${{ github.workflow }}-${{ github.event.release.tag_name }}" group: "${{ github.workflow }}-${{ github.event.release.tag_name }}"
@@ -17,14 +22,13 @@ concurrency:
jobs: jobs:
update-winget-release: update-winget-release:
if: >- if: github.repository_owner == 'LizardByte'
github.repository_owner == 'LizardByte'
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Check if Winget repo - name: Check if Winget repo
id: check-label
env: env:
TOPIC: winget-pkg TOPIC: winget-pkg
id: check-label
uses: actions/github-script@v7 uses: actions/github-script@v7
with: with:
script: | script: |
@@ -44,9 +48,8 @@ jobs:
- name: Download release asset - name: Download release asset
id: download id: download
if: >- if: steps.check-label.outputs.hasTopic == 'true'
steps.check-label.outputs.hasTopic == 'true' uses: robinraju/release-downloader@v1.12
uses: robinraju/release-downloader@v1.11
with: with:
repository: "${{ github.repository }}" repository: "${{ github.repository }}"
tag: "${{ github.event.release.tag_name }}" tag: "${{ github.event.release.tag_name }}"

6
.gitmodules vendored
View File

@@ -44,7 +44,7 @@
branch = sdk branch = sdk
[submodule "third-party/Simple-Web-Server"] [submodule "third-party/Simple-Web-Server"]
path = third-party/Simple-Web-Server path = third-party/Simple-Web-Server
url = https://gitlab.com/eidheim/Simple-Web-Server.git url = https://github.com/LizardByte-infrastructure/Simple-Web-Server.git
branch = master branch = master
[submodule "third-party/TPCircularBuffer"] [submodule "third-party/TPCircularBuffer"]
path = third-party/TPCircularBuffer path = third-party/TPCircularBuffer
@@ -60,9 +60,9 @@
branch = master branch = master
[submodule "third-party/wayland-protocols"] [submodule "third-party/wayland-protocols"]
path = third-party/wayland-protocols path = third-party/wayland-protocols
url = https://gitlab.freedesktop.org/wayland/wayland-protocols.git url = https://github.com/LizardByte-infrastructure/wayland-protocols.git
branch = main branch = main
[submodule "third-party/wlr-protocols"] [submodule "third-party/wlr-protocols"]
path = third-party/wlr-protocols path = third-party/wlr-protocols
url = https://gitlab.freedesktop.org/wlroots/wlr-protocols.git url = https://github.com/LizardByte-infrastructure/wlr-protocols.git
branch = master branch = master

View File

@@ -5,42 +5,18 @@
</div> </div>
<div align="center"> <div align="center">
<a href="https://github.com/LizardByte/Sunshine"> <a href="https://github.com/LizardByte/Sunshine"><img src="https://img.shields.io/github/stars/lizardbyte/sunshine.svg?logo=github&style=for-the-badge" alt="GitHub stars"></a>
<img src="https://img.shields.io/github/stars/lizardbyte/sunshine.svg?logo=github&style=for-the-badge" alt="GitHub stars"> <a href="https://github.com/LizardByte/Sunshine/releases/latest"><img src="https://img.shields.io/github/downloads/lizardbyte/sunshine/total.svg?style=for-the-badge&logo=github" alt="GitHub Releases"></a>
</a> <a href="https://hub.docker.com/r/lizardbyte/sunshine"><img src="https://img.shields.io/docker/pulls/lizardbyte/sunshine.svg?style=for-the-badge&logo=docker" alt="Docker"></a>
<a href="https://github.com/LizardByte/Sunshine/releases/latest"> <a href="https://github.com/LizardByte/Sunshine/pkgs/container/sunshine"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fipitio.github.io%2Fbackage%2FLizardByte%2FSunshine%2Fsunshine.json&query=%24.downloads&label=ghcr%20pulls&style=for-the-badge&logo=github" alt="GHCR"></a>
<img src="https://img.shields.io/github/downloads/lizardbyte/sunshine/total.svg?style=for-the-badge&logo=github" alt="GitHub Releases"> <a href="https://flathub.org/apps/dev.lizardbyte.app.Sunshine"><img src="https://img.shields.io/flathub/downloads/dev.lizardbyte.app.Sunshine?style=for-the-badge&logo=flathub" alt="Flathub installs"></a>
</a> <a href="https://flathub.org/apps/dev.lizardbyte.app.Sunshine"><img src="https://img.shields.io/flathub/v/dev.lizardbyte.app.Sunshine?style=for-the-badge&logo=flathub" alt="Flathub Version"></a>
<a href="https://hub.docker.com/r/lizardbyte/sunshine"> <a href="https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LizardByte/Sunshine"><img src="https://img.shields.io/winget/v/LizardByte.Sunshine?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHuSURBVFhH7ZfNTtRQGIYZiMDwN/IrCAqIhMSNKxcmymVwG+5dcDVsWHgDrtxwCYQVl+BChzDEwSnPY+eQ0sxoOz1mQuBNnpyvTdvz9jun5/SrjfxnJUkyQbMEz2ELduF1l0YUA3QyTrMAa2AnPtyOXsELeAYNyKtV2EC3k3lYgTOwg09ghy/BTp7CKBRV844BOpmmMV2+ySb4BmInG7AKY7AHH+EYqqhZo9PPBG/BVDlOizAD/XQFmnoPXzxRQX8M/CCYS48L6RIc4ygGHK9WGg9HZSZMUNRPVwNJGg5Hg2Qgqh4N3FsDsb6EmgYm07iwwvUxstdxJTwgmILf4CfZ6bb5OHANX8GN5x20IVxnG8ge94pt2xpwU3GnCwayF4Q2G2vgFLzHndFzQdk4q77nNfCdwL28qNyMtmEf3A1/QV5FjDiPWo5jrwf8TWZChTlgJvL4F9QL50/A43qVidTvLcuoM2wDQ1+IkgefgUpLcYwMVBqCKNJA2b0gKNocOIITOIef8C/F/CdMbh/GklynsSawKLHS8d9/B1x2LUqsfFyy3TMsWj5A1cLkotDbYO4JjWWZlZEGv8EbOIR1CAVN2eG8W5oNKgxaeC6DmTJjZs7ixUxpznLPLT+v4sXpoMLcLI3mzFSonDXIEI/M3QCIO4YuimBJ/gAAAABJRU5ErkJggg==" alt="Winget Version"></a>
<img src="https://img.shields.io/docker/pulls/lizardbyte/sunshine.svg?style=for-the-badge&logo=docker" alt="Docker"> <a href="https://gurubase.io/g/sunshine"><img src="https://img.shields.io/badge/Gurubase-Ask%20Guru-ef1a1b?style=for-the-badge&logo=data:image/jpeg;base64,/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIABgAGAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AOLqSO3mlilljido4QGkYDIQEgAn05IH41seFo7aS+uRKlrJci2Y2cd2QImlyOGyQPu7sA8ZxXapAlvpThbPRkv7nTQWhDoIZZRc/XaSAOmcZGOnFfP06XMr3P17F5iqE+Tl1uuvf9Lde55dRW74pit4r61EcdtFdG2U3kVqQY0lyeBgkD5duQOASawqykuV2O6jV9rTU0rXLNjf3Om3QubSXy5QCudoYEEYIIOQR7GnahqV3qk6zXk3mOqhFAUKqqOyqAAByeAKqUUXdrFezhz89lfv1+8KKKKRZ//Z" alt="Gurubase"></a>
</a> <a href="https://github.com/LizardByte/Sunshine/actions/workflows/CI.yml?query=branch%3Amaster"><img src="https://img.shields.io/github/actions/workflow/status/lizardbyte/sunshine/CI.yml.svg?branch=master&label=CI%20build&logo=github&style=for-the-badge" alt="GitHub Workflow Status (CI)"></a>
<a href="https://github.com/LizardByte/Sunshine/pkgs/container/sunshine"> <a href="https://github.com/LizardByte/Sunshine/actions/workflows/localize.yml?query=branch%3Amaster"><img src="https://img.shields.io/github/actions/workflow/status/lizardbyte/sunshine/localize.yml.svg?branch=master&label=localize%20build&logo=github&style=for-the-badge" alt="GitHub Workflow Status (localize)"></a>
<img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fipitio.github.io%2Fbackage%2FLizardByte%2FSunshine%2Fsunshine.json&query=%24.downloads&label=ghcr%20pulls&style=for-the-badge&logo=github" alt="GHCR"> <a href="https://docs.lizardbyte.dev/projects/sunshine"><img src="https://img.shields.io/readthedocs/sunshinestream.svg?label=Docs&style=for-the-badge&logo=readthedocs" alt="Read the Docs"></a>
</a> <a href="https://codecov.io/gh/LizardByte/Sunshine"><img src="https://img.shields.io/codecov/c/gh/LizardByte/Sunshine?token=SMGXQ5NVMJ&style=for-the-badge&logo=codecov&label=codecov" alt="Codecov"></a>
<a href="https://flathub.org/apps/dev.lizardbyte.app.Sunshine">
<img src="https://img.shields.io/flathub/downloads/dev.lizardbyte.app.Sunshine?style=for-the-badge&logo=flathub" alt="Flathub installs">
</a>
<a href="https://flathub.org/apps/dev.lizardbyte.app.Sunshine">
<img src="https://img.shields.io/flathub/v/dev.lizardbyte.app.Sunshine?style=for-the-badge&logo=flathub" alt="Flathub Version">
</a>
<a href="https://github.com/microsoft/winget-pkgs/tree/master/manifests/l/LizardByte/Sunshine">
<img src="https://img.shields.io/winget/v/LizardByte.Sunshine?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHuSURBVFhH7ZfNTtRQGIYZiMDwN/IrCAqIhMSNKxcmymVwG+5dcDVsWHgDrtxwCYQVl+BChzDEwSnPY+eQ0sxoOz1mQuBNnpyvTdvz9jun5/SrjfxnJUkyQbMEz2ELduF1l0YUA3QyTrMAa2AnPtyOXsELeAYNyKtV2EC3k3lYgTOwg09ghy/BTp7CKBRV844BOpmmMV2+ySb4BmInG7AKY7AHH+EYqqhZo9PPBG/BVDlOizAD/XQFmnoPXzxRQX8M/CCYS48L6RIc4ygGHK9WGg9HZSZMUNRPVwNJGg5Hg2Qgqh4N3FsDsb6EmgYm07iwwvUxstdxJTwgmILf4CfZ6bb5OHANX8GN5x20IVxnG8ge94pt2xpwU3GnCwayF4Q2G2vgFLzHndFzQdk4q77nNfCdwL28qNyMtmEf3A1/QV5FjDiPWo5jrwf8TWZChTlgJvL4F9QL50/A43qVidTvLcuoM2wDQ1+IkgefgUpLcYwMVBqCKNJA2b0gKNocOIITOIef8C/F/CdMbh/GklynsSawKLHS8d9/B1x2LUqsfFyy3TMsWj5A1cLkotDbYO4JjWWZlZEGv8EbOIR1CAVN2eG8W5oNKgxaeC6DmTJjZs7ixUxpznLPLT+v4sXpoMLcLI3mzFSonDXIEI/M3QCIO4YuimBJ/gAAAABJRU5ErkJggg==" alt="Winget Version">
</a>
<a href="https://gurubase.io/g/sunshine">
<img src="https://img.shields.io/badge/Gurubase-Ask%20Guru-ef1a1b?style=for-the-badge&logo=data:image/jpeg;base64,/9j/2wCEAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDIBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIABgAGAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AOLqSO3mlilljido4QGkYDIQEgAn05IH41seFo7aS+uRKlrJci2Y2cd2QImlyOGyQPu7sA8ZxXapAlvpThbPRkv7nTQWhDoIZZRc/XaSAOmcZGOnFfP06XMr3P17F5iqE+Tl1uuvf9Lde55dRW74pit4r61EcdtFdG2U3kVqQY0lyeBgkD5duQOASawqykuV2O6jV9rTU0rXLNjf3Om3QubSXy5QCudoYEEYIIOQR7GnahqV3qk6zXk3mOqhFAUKqqOyqAAByeAKqUUXdrFezhz89lfv1+8KKKKRZ//Z" alt="Gurubase">
</a>
<a href="https://github.com/LizardByte/Sunshine/actions/workflows/CI.yml?query=branch%3Amaster">
<img src="https://img.shields.io/github/actions/workflow/status/lizardbyte/sunshine/CI.yml.svg?branch=master&label=CI%20build&logo=github&style=for-the-badge" alt="GitHub Workflow Status (CI)">
</a>
<a href="https://github.com/LizardByte/Sunshine/actions/workflows/localize.yml?query=branch%3Amaster">
<img src="https://img.shields.io/github/actions/workflow/status/lizardbyte/sunshine/localize.yml.svg?branch=master&label=localize%20build&logo=github&style=for-the-badge" alt="GitHub Workflow Status (localize)">
</a>
<a href="https://docs.lizardbyte.dev/projects/sunshine">
<img src="https://img.shields.io/readthedocs/sunshinestream.svg?label=Docs&style=for-the-badge&logo=readthedocs" alt="Read the Docs">
</a>
<a href="https://codecov.io/gh/LizardByte/Sunshine">
<img src="https://img.shields.io/codecov/c/gh/LizardByte/Sunshine?token=SMGXQ5NVMJ&style=for-the-badge&logo=codecov&label=codecov" alt="Codecov">
</a>
</div> </div>
## About ## About
@@ -188,6 +164,34 @@ LizardByte has the full documentation hosted on [Read the Docs](https://docs.liz
Our support methods are listed in our [LizardByte Docs](https://docs.lizardbyte.dev/latest/about/support.html). Our support methods are listed in our [LizardByte Docs](https://docs.lizardbyte.dev/latest/about/support.html).
## 💲 Sponsors and Supporters
<p align="center">
<a href="https://app.lizardbyte.dev" aria-label="Sponsor LizardByte">
<img src='https://raw.githubusercontent.com/LizardByte/contributors/refs/heads/dist/sponsors.svg'/>
</a>
</p>
## 👥 Contributors
Thank you to all the contributors who have helped make Sunshine better!
### GitHub
<p align="center">
<a href="https://github.com/LizardByte/Sunshine" aria-label="GitHub">
<img src='https://raw.githubusercontent.com/LizardByte/contributors/refs/heads/dist/github.Sunshine.svg'/>
</a>
</p>
### CrowdIn
<p align="center">
<a href="https://translate.lizardbyte.dev" aria-label="CrowdIn">
<img src='https://raw.githubusercontent.com/LizardByte/contributors/refs/heads/dist/crowdin.606145.svg'/>
</a>
</p>
<div class="section_buttons"> <div class="section_buttons">
| Previous | Next | | Previous | Next |

View File

@@ -1,17 +0,0 @@
---
description: Bad Request - A parameter was not specified, or was specified incorrectly.
content:
application/json:
schema:
type: object
properties:
status_code:
type: string
status:
type: string
error:
type: string
example:
status_code: 400
status: false
error: "Bad Request"

View File

@@ -1,17 +0,0 @@
---
description: Unauthorized - The request requires user authentication.
content:
application/json:
schema:
type: object
properties:
status_code:
type: string
status:
type: string
error:
type: string
example:
status_code: 401
status: false
error: "Unauthorized"

View File

@@ -1,7 +0,0 @@
---
description: Forbidden - The server understood the request, but is refusing to fulfill it.
content:
# TODO: return JSON response.
text/plain:
schema:
type: string

View File

@@ -1,15 +0,0 @@
---
description: Not Found - The requested resource could not be found.
content:
application/json:
schema:
type: object
properties:
status_code:
type: integer
format: int32
error:
type: string
example:
status_code: 404
error: "Not Found"

View File

@@ -1,48 +0,0 @@
---
type: object
required:
- name
properties:
name:
type: string
description: Application Name, as shown on Moonlight
output:
type: string
description: The file where the output of the command is stored, if it is not specified, the output is ignored
cmd:
$ref: "./cmd.yml"
description: The main application to start. If blank, no application will be started.
exclude-global-prep-cmd:
type: boolean
description: Enable/Disable the execution of Global Prep Commands for this application.
elevated:
type: boolean
description: Run the application as an elevated process.
auto-detach:
type: boolean
description: Continue streaming if the application exits quickly
wait-all:
type: boolean
description: Continue streaming until all app processes exit
exit-timeout:
type: integer
description: Number of seconds to wait for all app processes to gracefully exit when requested to quit.
image-path:
type: string
description: |
Application icon/picture/image path that will be sent to client. Image must be a PNG file.
If not set, Sunshine will send default box image.
working-dir:
type: string
description: |
The working directory that should be passed to the process.
For example, some applications use the working directory to search for configuration files.
If not set, Sunshine will default to the parent directory of the command
prep-cmd:
type: array
items:
$ref: "./prep-cmd.yml"
detached:
type: array
items:
$ref: "./cmd.yml"

View File

@@ -1,3 +0,0 @@
---
type: string
description: Command to execute

View File

@@ -1,16 +0,0 @@
---
type: object
required:
- do
- undo
- elevated
properties:
do:
$ref: "./cmd.yml"
description: Command to run before the application starts.
undo:
$ref: "./cmd.yml"
description: Command to run after the application exits.
elevated:
type: boolean
description: Run the command as an elevated process.

View File

@@ -1,44 +0,0 @@
---
# https://openapi.tools
openapi: 3.1.0
info:
title: Sunshine
summary: Self-hosted game stream host for Moonlight.
version: 0.0.0
contact:
name: LizardByte
url: https://app.lizardbyte.dev/support
license:
name: GNU General Public License v3.0 only
url: https://github.com/LizardByte/Sunshine/blob/master/LICENSE
servers:
- url: "https://{host}:{ui-port}"
description: Sunshine server
variables:
host:
default: "localhost"
ui-port:
default: 47990
security:
- basicAuth: []
components:
securitySchemes:
# TODO: update when JWT is implemented (https://github.com/LizardByte/Sunshine/pull/2995)
# https://swagger.io/specification/#security-scheme-object-examples
basicAuth:
description: HTTP Basic authentication
type: http
scheme: basic
paths:
/api/apps:
$ref: "./paths/confighttp/apps/apps.yml"
/api/apps/{index}:
$ref: "./paths/confighttp/apps/apps-by-index.yml"
/api/logs:
$ref: "./paths/confighttp/logs/logs.yml"

View File

@@ -1,37 +0,0 @@
---
delete:
summary: Delete an application.
description: |
Delete an application.
operationId: deleteApps
tags:
- Apps
parameters:
- name: index
in: path
description: The index of the application to delete.
required: true
schema:
type: integer
format: int32
responses:
'200':
description: The application was deleted successfully.
content:
application/json:
schema:
type: object
properties:
status:
type: string
result:
type: string
example:
status: true
result: "application 9999 deleted"
'400':
$ref: "../../../components/responses/400.yml"
'401':
$ref: "../../../components/responses/401.yml"
'403':
$ref: "../../../components/responses/403.yml"

View File

@@ -1,151 +0,0 @@
---
get:
summary: Get the list of available applications.
description: |
Get the list of available applications.
operationId: getApps
tags:
- Apps
responses:
'200':
description: A list of available applications.
content:
application/json:
schema:
type: array
items:
$ref: "../../../components/schemas/app.yml"
example:
- name: "Example App"
output: "/path/to/output.log"
cmd: "example-command"
exclude-global-prep-cmd: false
elevated: false
auto-detach: true
wait-all: false
exit-timeout: 30
image-path: "/path/to/image.png"
working-dir: "/path/to/working-dir"
prep-cmd:
- do: "prep-command-1"
undo: "undo-command-1"
elevated: false
detached:
- "detached-command-1"
'401':
$ref: "../../../components/responses/401.yml"
'403':
$ref: "../../../components/responses/403.yml"
post:
summary: Save an application.
description: |
Save an application.
To save a new application the index must be `-1`.
To update an existing application, you must provide the current index of the application.
operationId: postApps
tags:
- Apps
parameters:
- name: index
in: query
description: The index of the application to update. If the index is -1, a new application will be created.
required: true
schema:
type: integer
format: int32
- name: name
in: query
description: Application Name
required: false
schema:
type: string
- name: output
in: query
description: Log Output Path
required: false
schema:
type: string
- name: cmd
in: query
description: Command to run the application
required: false
schema:
$ref: "../../../components/schemas/cmd.yml"
- name: exclude-global-prep-cmd
in: query
description: Enable/Disable the execution of Global Prep Commands for this application.
required: false
schema:
type: boolean
- name: elevated
in: query
description: Run the application as an elevated process.
required: false
schema:
type: boolean
- name: auto-detach
in: query
description: Continue streaming if the application exits quickly
required: false
schema:
type: boolean
- name: wait-all
in: query
description: Continue streaming until all app processes exit
required: false
schema:
type: boolean
- name: exit-timeout
in: query
description: Number of seconds to wait for all app processes to gracefully exit when requested to quit.
required: false
schema:
type: integer
format: int32
- name: prep-cmd
in: query
description: Commands to run before the main application
required: false
schema:
type: array
items:
$ref: "../../../components/schemas/prep-cmd.yml"
- name: detached
in: query
description: Commands to run in detached processes
required: false
schema:
type: array
items:
$ref: "../../../components/schemas/cmd.yml"
- name: image-path
in: query
description: Full path to the application image. Must be a png file.
required: false
schema:
type: string
- name: working-dir
in: query
description: The working directory that should be passed to the process.
required: false
schema:
type: string
responses:
'200':
description: The application was saved successfully.
content:
application/json:
schema:
type: object
properties:
status:
type: string
example:
status: true
'400':
$ref: "../../../components/responses/400.yml"
'401':
$ref: "../../../components/responses/401.yml"
'403':
$ref: "../../../components/responses/403.yml"

View File

@@ -1,20 +0,0 @@
---
get:
summary: Get the logs from the log file.
description: |
Get the logs from the log file.
operationId: getLogs
tags:
- Logs
responses:
'200':
description: The contents of the log file.
content:
text/plain:
schema:
type: string
example: '[2025-01-15 17:07:58.131]: Info: Sunshine version: v...'
'401':
$ref: "../../../components/responses/401.yml"
'403':
$ref: "../../../components/responses/403.yml"

View File

@@ -137,7 +137,8 @@ if(WAYLAND_FOUND)
endif() endif()
GEN_WAYLAND("${WAYLAND_PROTOCOLS_DIR}" "unstable/xdg-output" xdg-output-unstable-v1) GEN_WAYLAND("${WAYLAND_PROTOCOLS_DIR}" "unstable/xdg-output" xdg-output-unstable-v1)
GEN_WAYLAND("${CMAKE_SOURCE_DIR}/third-party/wlr-protocols" "unstable" wlr-export-dmabuf-unstable-v1) GEN_WAYLAND("${WAYLAND_PROTOCOLS_DIR}" "unstable/linux-dmabuf" linux-dmabuf-unstable-v1)
GEN_WAYLAND("${CMAKE_SOURCE_DIR}/third-party/wlr-protocols" "unstable" wlr-screencopy-unstable-v1)
include_directories( include_directories(
SYSTEM SYSTEM
@@ -145,7 +146,7 @@ if(WAYLAND_FOUND)
${CMAKE_BINARY_DIR}/generated-src ${CMAKE_BINARY_DIR}/generated-src
) )
list(APPEND PLATFORM_LIBRARIES ${WAYLAND_LIBRARIES}) list(APPEND PLATFORM_LIBRARIES ${WAYLAND_LIBRARIES} gbm)
list(APPEND PLATFORM_TARGET_FILES list(APPEND PLATFORM_TARGET_FILES
"${CMAKE_SOURCE_DIR}/src/platform/linux/wlgrab.cpp" "${CMAKE_SOURCE_DIR}/src/platform/linux/wlgrab.cpp"
"${CMAKE_SOURCE_DIR}/src/platform/linux/wayland.h" "${CMAKE_SOURCE_DIR}/src/platform/linux/wayland.h"

View File

@@ -38,7 +38,7 @@ if(NOT DEFINED SUNSHINE_ICON_PATH)
set(SUNSHINE_ICON_PATH "${CMAKE_SOURCE_DIR}/sunshine.ico") set(SUNSHINE_ICON_PATH "${CMAKE_SOURCE_DIR}/sunshine.ico")
endif() endif()
configure_file("${CMAKE_SOURCE_DIR}/src/platform/windows/windows.rs.in" windows.rc @ONLY) configure_file("${CMAKE_SOURCE_DIR}/src/platform/windows/windows.rc.in" windows.rc @ONLY)
set(PLATFORM_TARGET_FILES set(PLATFORM_TARGET_FILES
"${CMAKE_CURRENT_BINARY_DIR}/windows.rc" "${CMAKE_CURRENT_BINARY_DIR}/windows.rc"

View File

@@ -3,26 +3,43 @@
# #
include_guard(GLOBAL) include_guard(GLOBAL)
set(BOOST_VERSION 1.86) set(BOOST_VERSION "1.87.0")
set(BOOST_COMPONENTS set(BOOST_COMPONENTS
filesystem filesystem
locale locale
log log
program_options program_options
system) # system is not used by Sunshine, but by Simple-Web-Server, added here for convenience system
)
# system is not used by Sunshine, but by Simple-Web-Server, added here for convenience
# algorithm, preprocessor, scope, and uuid are not used by Sunshine, but by libdisplaydevice, added here for convenience
if(WIN32)
list(APPEND BOOST_COMPONENTS
algorithm
preprocessor
scope
uuid
)
endif()
if(BOOST_USE_STATIC) if(BOOST_USE_STATIC)
set(Boost_USE_STATIC_LIBS ON) # cmake-lint: disable=C0103 set(Boost_USE_STATIC_LIBS ON) # cmake-lint: disable=C0103
endif() endif()
find_package(Boost CONFIG ${BOOST_VERSION} COMPONENTS ${BOOST_COMPONENTS}) if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.30")
cmake_policy(SET CMP0167 NEW) # Get BoostConfig.cmake from upstream
endif()
find_package(Boost CONFIG ${BOOST_VERSION} EXACT COMPONENTS ${BOOST_COMPONENTS})
if(NOT Boost_FOUND) if(NOT Boost_FOUND)
message(STATUS "Boost v${BOOST_VERSION}.x package not found in the system. Falling back to FetchContent.") message(STATUS "Boost v${BOOST_VERSION} package not found in the system. Falling back to FetchContent.")
include(FetchContent) include(FetchContent)
# Avoid warning about DOWNLOAD_EXTRACT_TIMESTAMP in CMake 3.24:
if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0") if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0")
cmake_policy(SET CMP0135 NEW) cmake_policy(SET CMP0135 NEW) # Avoid warning about DOWNLOAD_EXTRACT_TIMESTAMP in CMake 3.24
endif()
if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.31.0")
cmake_policy(SET CMP0174 NEW) # Handle empty variables
endif() endif()
# more components required for compiling boost targets # more components required for compiling boost targets
@@ -36,12 +53,9 @@ if(NOT Boost_FOUND)
set(BOOST_ENABLE_CMAKE ON) set(BOOST_ENABLE_CMAKE ON)
# Limit boost to the required libraries only # Limit boost to the required libraries only
set(BOOST_INCLUDE_LIBRARIES set(BOOST_INCLUDE_LIBRARIES ${BOOST_COMPONENTS})
${BOOST_COMPONENTS}) set(BOOST_URL "https://github.com/boostorg/boost/releases/download/boost-${BOOST_VERSION}/boost-${BOOST_VERSION}-cmake.tar.xz") # cmake-lint: disable=C0301
set(BOOST_URL set(BOOST_HASH "SHA256=7da75f171837577a52bbf217e17f8ea576c7c246e4594d617bfde7fafd408be5")
"https://github.com/boostorg/boost/releases/download/boost-1.86.0/boost-1.86.0-cmake.tar.xz")
set(BOOST_HASH
"MD5=D02759931CEDC02ADED80402906C5EB6")
if(CMAKE_VERSION VERSION_LESS "3.24.0") if(CMAKE_VERSION VERSION_LESS "3.24.0")
FetchContent_Declare( FetchContent_Declare(
@@ -72,7 +86,7 @@ if(NOT Boost_FOUND)
set(Boost_FOUND TRUE) # cmake-lint: disable=C0103 set(Boost_FOUND TRUE) # cmake-lint: disable=C0103
set(Boost_INCLUDE_DIRS # cmake-lint: disable=C0103 set(Boost_INCLUDE_DIRS # cmake-lint: disable=C0103
"$<BUILD_INTERFACE:${Boost_SOURCE_DIR}/libs/headers/include>;$<INSTALL_INTERFACE:include/boost-1_85>") "$<BUILD_INTERFACE:${Boost_SOURCE_DIR}/libs/headers/include>")
if(WIN32) if(WIN32)
# Windows build is failing to create .h file in this directory # Windows build is failing to create .h file in this directory

View File

@@ -8,6 +8,13 @@ if(NOT nlohmann_json_FOUND)
message(STATUS "nlohmann_json v3.11.x package not found in the system. Falling back to FetchContent.") message(STATUS "nlohmann_json v3.11.x package not found in the system. Falling back to FetchContent.")
include(FetchContent) include(FetchContent)
if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0")
cmake_policy(SET CMP0135 NEW) # Avoid warning about DOWNLOAD_EXTRACT_TIMESTAMP in CMake 3.24
endif()
if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.31.0")
cmake_policy(SET CMP0174 NEW) # Handle empty variables
endif()
FetchContent_Declare( FetchContent_Declare(
json json
URL https://github.com/nlohmann/json/releases/download/v3.11.3/json.tar.xz URL https://github.com/nlohmann/json/releases/download/v3.11.3/json.tar.xz

View File

@@ -20,6 +20,9 @@ install(DIRECTORY "${SUNSHINE_SOURCE_ASSETS_DIR}/windows/misc/service/"
install(DIRECTORY "${SUNSHINE_SOURCE_ASSETS_DIR}/windows/misc/migration/" install(DIRECTORY "${SUNSHINE_SOURCE_ASSETS_DIR}/windows/misc/migration/"
DESTINATION "scripts" DESTINATION "scripts"
COMPONENT assets) COMPONENT assets)
install(DIRECTORY "${SUNSHINE_SOURCE_ASSETS_DIR}/windows/misc/path/"
DESTINATION "scripts"
COMPONENT assets)
# Configurable options for the service # Configurable options for the service
install(DIRECTORY "${SUNSHINE_SOURCE_ASSETS_DIR}/windows/misc/autostart/" install(DIRECTORY "${SUNSHINE_SOURCE_ASSETS_DIR}/windows/misc/autostart/"
@@ -64,6 +67,7 @@ SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS
IfSilent +2 0 IfSilent +2 0
ExecShell 'open' 'https://docs.lizardbyte.dev/projects/sunshine' ExecShell 'open' 'https://docs.lizardbyte.dev/projects/sunshine'
nsExec::ExecToLog 'icacls \\\"$INSTDIR\\\" /reset' nsExec::ExecToLog 'icacls \\\"$INSTDIR\\\" /reset'
nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\update-path.bat\\\" add'
nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\migrate-config.bat\\\"' nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\migrate-config.bat\\\"'
nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\add-firewall-rule.bat\\\"' nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\add-firewall-rule.bat\\\"'
nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\install-gamepad.bat\\\"' nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\install-gamepad.bat\\\"'
@@ -78,7 +82,7 @@ set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS
"${CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS} "${CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS}
nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\delete-firewall-rule.bat\\\"' nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\delete-firewall-rule.bat\\\"'
nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\uninstall-service.bat\\\"' nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\uninstall-service.bat\\\"'
nsExec::ExecToLog '\\\"$INSTDIR\\\\sunshine.exe\\\" --restore-nvprefs-undo' nsExec::ExecToLog '\\\"$INSTDIR\\\\${CMAKE_PROJECT_NAME}.exe\\\" --restore-nvprefs-undo'
MessageBox MB_YESNO|MB_ICONQUESTION \ MessageBox MB_YESNO|MB_ICONQUESTION \
'Do you want to remove Virtual Gamepad?' \ 'Do you want to remove Virtual Gamepad?' \
/SD IDNO IDNO NoGamepad /SD IDNO IDNO NoGamepad
@@ -88,16 +92,18 @@ set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS
'Do you want to remove $INSTDIR (this includes the configuration, cover images, and settings)?' \ 'Do you want to remove $INSTDIR (this includes the configuration, cover images, and settings)?' \
/SD IDNO IDNO NoDelete /SD IDNO IDNO NoDelete
RMDir /r \\\"$INSTDIR\\\"; skipped if no RMDir /r \\\"$INSTDIR\\\"; skipped if no
nsExec::ExecToLog '\\\"$INSTDIR\\\\scripts\\\\update-path.bat\\\" remove'
NoDelete: NoDelete:
") ")
# Adding an option for the start menu # Adding an option for the start menu
set(CPACK_NSIS_MODIFY_PATH "OFF") set(CPACK_NSIS_MODIFY_PATH OFF)
set(CPACK_NSIS_EXECUTABLES_DIRECTORY ".") set(CPACK_NSIS_EXECUTABLES_DIRECTORY ".")
# This will be shown on the installed apps Windows settings # This will be shown on the installed apps Windows settings
set(CPACK_NSIS_INSTALLED_ICON_NAME "${CMAKE_PROJECT_NAME}.exe") set(CPACK_NSIS_INSTALLED_ICON_NAME "${CMAKE_PROJECT_NAME}.exe")
set(CPACK_NSIS_CREATE_ICONS_EXTRA set(CPACK_NSIS_CREATE_ICONS_EXTRA
"${CPACK_NSIS_CREATE_ICONS_EXTRA} "${CPACK_NSIS_CREATE_ICONS_EXTRA}
SetOutPath '\$INSTDIR'
CreateShortCut '\$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\${CMAKE_PROJECT_NAME}.lnk' \ CreateShortCut '\$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\${CMAKE_PROJECT_NAME}.lnk' \
'\$INSTDIR\\\\${CMAKE_PROJECT_NAME}.exe' '--shortcut' '\$INSTDIR\\\\${CMAKE_PROJECT_NAME}.exe' '--shortcut'
") ")

View File

@@ -49,6 +49,7 @@ INPUT = ../README.md \
legal.md \ legal.md \
configuration.md \ configuration.md \
app_examples.md \ app_examples.md \
awesome_sunshine.md \
guides.md \ guides.md \
performance_tuning.md \ performance_tuning.md \
api.md \ api.md \

View File

@@ -23,25 +23,28 @@ process is killed.}
@tabs{ @tabs{
@tab{Linux | <!-- --> @tab{Linux | <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|-------------------\|-----------------------------------------------------\| \|------------------------------\|------------------------------------------------------\|
\| Application Name \| @code{}Steam Big Picture@endcode \| \| Application Name \| @code{}Steam Big Picture@endcode \|
\| Detached Commands \| @code{}setsid steam steam://open/bigpicture@endcode \| \| Command Preporations -> Undo \| @code{}setsid steam steam://close/bigpicture@endcode \|
\| Image \| @code{}steam.png@endcode \| \| Detached Commands \| @code{}setsid steam steam://open/bigpicture@endcode \|
\| Image \| @code{}steam.png@endcode \|
} }
@tab{macOS | <!-- --> @tab{macOS | <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|-------------------\|---------------------------------------------------\| \|------------------------------\|------------------------------------------------\|
\| Application Name \| @code{}Steam Big Picture@endcode \| \| Application Name \| @code{}Steam Big Picture@endcode \|
\| Detached Commands \| @code{}open steam steam://open/bigpicture@endcode \| \| Command Preporations -> Undo \| @code{}open steam://close/bigpicture@endcode \|
\| Image \| @code{}steam.png@endcode \| \| Detached Commands \| @code{}open steam://open/bigpicture@endcode \|
\| Image \| @code{}steam.png@endcode \|
} }
@tab{Windows | <!-- --> @tab{Windows | <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|-------------------\|----------------------------------------\| \|------------------------------\|-------------------------------------------\|
\| Application Name \| @code{}Steam Big Picture@endcode \| \| Application Name \| @code{}Steam Big Picture@endcode \|
\| Detached Commands \| @code{}steam://open/bigpicture@endcode \| \| Command Preporations -> Undo \| @code{}steam://close/bigpicture@endcode \|
\| Image \| @code{}steam.png@endcode \| \| Detached Commands \| @code{}steam://open/bigpicture@endcode \|
\| Image \| @code{}steam.png@endcode \|
} }
} }
@@ -210,7 +213,7 @@ xrandr --output ${display_output} --primary --mode ${mode_alias} --pos 0x0 --rot
``` ```
} }
###### Wayland ###### Wayland (wlroots, e.g. hyprland)
| Prep Step | Command | | Prep Step | Command |
|-----------|------------------------------------------------------------------------------------------------------------------------------------------| |-----------|------------------------------------------------------------------------------------------------------------------------------------------|
@@ -219,17 +222,30 @@ xrandr --output ${display_output} --primary --mode ${mode_alias} --pos 0x0 --rot
@hint{`wlr-xrandr` only works with wlroots-based compositors.} @hint{`wlr-xrandr` only works with wlroots-based compositors.}
###### Gnome (Wayland, X11) ###### Gnome (X11)
| Prep Step | Command | | Prep Step | Command |
|-----------|---------------------------------------------------------------------------------------------------------------------------------------| |-----------|---------------------------------------------------------------------------------------------------------------------------------------|
| Do | @code{}sh -c "xrandr --output HDMI-1 --mode ${SUNSHINE_CLIENT_WIDTH}x${SUNSHINE_CLIENT_HEIGHT} --rate ${SUNSHINE_CLIENT_FPS}"@endcode | | Do | @code{}sh -c "xrandr --output HDMI-1 --mode ${SUNSHINE_CLIENT_WIDTH}x${SUNSHINE_CLIENT_HEIGHT} --rate ${SUNSHINE_CLIENT_FPS}"@endcode |
| Undo | @code{}xrandr --output HDMI-1 --mode 3840x2160 --rate 120@endcode | | Undo | @code{}xrandr --output HDMI-1 --mode 3840x2160 --rate 120@endcode |
The commands above are valid for an X11 session but won't work for ###### Gnome (Wayland)
Wayland. In that case `xrandr` must be replaced by [gnome-randr.py](https://gitlab.com/Oschowa/gnome-randr).
This script is intended as a drop-in replacement with the same syntax. (It can be saved in | Prep Step | Command |
`/usr/local/bin` and needs to be made executable.) |-----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Do | @code{}sh -c "displayconfig-mutter set --connector HDMI-1 --resolution ${SUNSHINE_CLIENT_WIDTH}x${SUNSHINE_CLIENT_HEIGHT} --refresh-rate ${SUNSHINE_CLIENT_FPS} --hdr ${SUNSHINE_CLIENT_HDR}"@endcode |
| Undo | @code{}displayconfig-mutter set --connector HDMI-1 --resolution 3840x2160 --refresh-rate 120 --hdr false@endcode |
Installation instructions for displayconfig-mutter can be [found here](https://github.com/eaglesemanation/displayconfig-mutter). Alternatives include
[gnome-randr-rust](https://github.com/maxwellainatchi/gnome-randr-rust) and [gnome-randr.py](https://gitlab.com/Oschowa/gnome-randr), but both of those are
unmaintained and do not support newer Mutter features such as HDR and VRR.
@hint{HDR support has been added to Gnome 48, to check if your display supports it you can run this:
```
displayconfig-mutter list
```
If it doesn't, then remove ``--hdr`` flag from both ``Do`` and ``Undo`` steps.
}
###### KDE Plasma (Wayland, X11) ###### KDE Plasma (Wayland, X11)
@@ -322,9 +338,9 @@ UAC prompt.
<div class="section_buttons"> <div class="section_buttons">
| Previous | Next | | Previous | Next |
|:----------------------------------|--------------------:| |:----------------------------------|----------------------------------------:|
| [Configuration](configuration.md) | [Guides](guides.md) | | [Configuration](configuration.md) | [Awesome-Sunshine](awesome_sunshine.md) |
</div> </div>

23
docs/awesome_sunshine.md Normal file
View File

@@ -0,0 +1,23 @@
# Awesome-Sunshine
@htmlonly
<script type="module" src="https://md-block.verou.me/md-block.js"></script>
<md-block
hlinks=""
hmin="2"
src="https://raw.githubusercontent.com/LizardByte/awesome-sunshine/master/README.md">
</md-block>
@endhtmlonly
<div class="section_buttons">
| Previous | Next |
|:--------------------------------|--------------------:|
| [App Examples](app_examples.md) | [Guides](guides.md) |
</div>
<details style="display: none;">
<summary></summary>
[TOC]
</details>

View File

@@ -770,6 +770,29 @@ editing the `conf` file in a text editor. Use the examples as reference.
</tr> </tr>
</table> </table>
### stream_audio
<table>
<tr>
<td>Description</td>
<td colspan="2">
Whether to stream audio or not. Disabling this can be useful for streaming headless displays as second monitors.
</td>
</tr>
<tr>
<td>Default</td>
<td colspan="2">@code{}
enabled
@endcode</td>
</tr>
<tr>
<td>Example</td>
<td colspan="2">@code{}
stream_audio = disabled
@endcode</td>
</tr>
</table>
### install_steam_audio_drivers ### install_steam_audio_drivers
<table> <table>
@@ -974,7 +997,9 @@ editing the `conf` file in a text editor. Use the examples as reference.
</tr> </tr>
<tr> <tr>
<td>Default</td> <td>Default</td>
<td colspan="2">@code{}verify_only@endcode</td> <td colspan="2">@code{}
disabled
@endcode</td>
</tr> </tr>
<tr> <tr>
<td>Example</td> <td>Example</td>
@@ -1154,14 +1179,15 @@ editing the `conf` file in a text editor. Use the examples as reference.
</tr> </tr>
</table> </table>
### dd_wa_hdr_toggle ### dd_wa_hdr_toggle_delay
<table> <table>
<tr> <tr>
<td>Description</td> <td>Description</td>
<td colspan="2"> <td colspan="2">
When using virtual display device as for streaming, it might display incorrect (high-contrast) color. When using virtual display device (VDD) for streaming, it might incorrectly display HDR color. Sunshine can try to mitigate this issue, by turning HDR off and then on again.<br>
With this option enabled, Sunshine will try to mitigate this issue. If the value is set to 0, the workaround is disabled (default). If the value is between 0 and 3000 milliseconds, Sunshine will turn off HDR, wait for the specified amount of time and then turn HDR on again. The recommended delay time is around 500 milliseconds in most cases.<br>
DO NOT use this workaround unless you actually have issues with HDR as it directly impacts stream start time!
@note{This option works independently of [dd_hdr_option](#dd_hdr_option)} @note{This option works independently of [dd_hdr_option](#dd_hdr_option)}
@note{Applies to Windows only.} @note{Applies to Windows only.}
</td> </td>
@@ -1169,13 +1195,13 @@ editing the `conf` file in a text editor. Use the examples as reference.
<tr> <tr>
<td>Default</td> <td>Default</td>
<td colspan="2">@code{} <td colspan="2">@code{}
disabled 0
@endcode</td> @endcode</td>
</tr> </tr>
<tr> <tr>
<td>Example</td> <td>Example</td>
<td colspan="2">@code{} <td colspan="2">@code{}
dd_wa_hdr_toggle = enabled dd_wa_hdr_toggle_delay = 500
@endcode</td> @endcode</td>
</tr> </tr>
</table> </table>
@@ -1314,6 +1340,29 @@ editing the `conf` file in a text editor. Use the examples as reference.
</tr> </tr>
</table> </table>
### max_bitrate
<table>
<tr>
<td>Description</td>
<td colspan="2">
The maximum bitrate (in Kbps) that Sunshine will encode the stream at. If set to 0, it will always use the bitrate requested by Moonlight.
</td>
</tr>
<tr>
<td>Default</td>
<td colspan="2">@code{}
0
@endcode</td>
</tr>
<tr>
<td>Example</td>
<td colspan="2">@code{}
max_bitrate = 5000
@endcode</td>
</tr>
</table>
### min_fps_factor ### min_fps_factor
<table> <table>
@@ -1921,7 +1970,8 @@ editing the `conf` file in a text editor. Use the examples as reference.
</tr> </tr>
<tr> <tr>
<td>wlr</td> <td>wlr</td>
<td>Capture for wlroots based Wayland compositors via DMA-BUF. <td>Capture for wlroots based Wayland compositors via wlr-screencopy-unstable-v1. It is possible to capture
virtual displays in e.g. Hyprland using this method.
@note{Applies to Linux only.}</td> @note{Applies to Linux only.}</td>
</tr> </tr>
<tr> <tr>

View File

@@ -2,6 +2,12 @@
Read our contribution guide in our organization level Read our contribution guide in our organization level
[docs](https://docs.lizardbyte.dev/latest/developers/contributing.html). [docs](https://docs.lizardbyte.dev/latest/developers/contributing.html).
## Recommended Tools
| Tool | Description |
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| <a href="https://www.jetbrains.com/clion/"><img src="https://resources.jetbrains.com/storage/products/company/brand/logos/CLion_icon.svg" width="30" height="30"></a><br>CLion | Recommended IDE for C++ development. Free licenses available for open source developers through the [JetBrains Open Source Program](https://www.jetbrains.com/community/opensource/). |
## Project Patterns ## Project Patterns
### Web UI ### Web UI

View File

@@ -30,7 +30,9 @@ See [Docker](../DOCKER_README.md) for more information.
CUDA is used for NVFBC capture. CUDA is used for NVFBC capture.
@tip{See [CUDA GPUS](https://developer.nvidia.com/cuda-gpus) to cross-reference Compute Capability to your GPU.} @tip{See [CUDA GPUS](https://developer.nvidia.com/cuda-gpus) to cross-reference Compute Capability to your GPU.
The table below applies to packages provided by LizardByte. If you use an official LizardByte package then you do not
need to install CUDA.}
<table> <table>
<caption>CUDA Compatibility</caption> <caption>CUDA Compatibility</caption>
@@ -55,7 +57,7 @@ CUDA is used for NVFBC capture.
<tr> <tr>
<td rowspan="1">12.0.0</td> <td rowspan="1">12.0.0</td>
<td rowspan="2">525.60.13</td> <td rowspan="2">525.60.13</td>
<td rowspan="4">50;52;60;61;62;70;72;75;80;86;87;89;90</td> <td rowspan="5">50;52;60;61;62;70;72;75;80;86;87;89;90</td>
<td>sunshine-debian-bookworm-{arch}.deb</td> <td>sunshine-debian-bookworm-{arch}.deb</td>
</tr> </tr>
<tr> <tr>
@@ -68,7 +70,12 @@ CUDA is used for NVFBC capture.
<td>sunshine_{arch}.flatpak</td> <td>sunshine_{arch}.flatpak</td>
</tr> </tr>
<tr> <tr>
<td>Sunshine (copr)</td> <td>Sunshine (copr - Fedora 40/41)</td>
</tr>
<tr>
<td rowspan="1">12.8.1</td>
<td rowspan="1">570.124.06</td>
<td>Sunshine (copr - Fedora 42)</td>
</tr> </tr>
</table> </table>
@@ -335,8 +342,6 @@ recommended for most users. No support will be provided!}
scripts/uninstall-service.bat scripts/uninstall-service.bat
``` ```
To uninstall, delete the extracted directory which contains the `sunshine.exe` file.
## Initial Setup ## Initial Setup
After installation, some initial setup is required. After installation, some initial setup is required.
@@ -489,6 +494,7 @@ All shortcuts start with `Ctrl+Alt+Shift`, just like Moonlight.
instead it simply starts a stream. If you removed it and would like to get it back, just add a new application with 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 name "Desktop" and "desktop.png" as the image path.
* For the Linux flatpak you must prepend commands with `flatpak-spawn --host`. * 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.
### HDR Support ### HDR Support
Streaming HDR content is officially supported on Windows hosts and experimentally supported for Linux hosts. Streaming HDR content is officially supported on Windows hosts and experimentally supported for Linux hosts.

View File

@@ -7,9 +7,9 @@ Feel free to contribute your own tips and trips by making a PR to
<div class="section_buttons"> <div class="section_buttons">
| Previous | Next | | Previous | Next |
|:--------------------------------|--------------------------------------------:| |:----------------------------------------|--------------------------------------------:|
| [App Examples](app_examples.md) | [Performance Tuning](performance_tuning.md) | | [Awesome-Sunshine](awesome_sunshine.md) | [Performance Tuning](performance_tuning.md) |
</div> </div>

View File

@@ -118,6 +118,16 @@ system. You may also want to enable decoders, however that is not required for S
``` ```
} }
### Input not working
After installation, the `udev` rules need to be reloaded. Our post-install script tries to do this for you
automatically, but if it fails you may need to restart your system.
If the input is still not working, you may need to add your user to the `input` group.
```bash
sudo usermod -aG input $USER
```
@note{Other build options are listed in the @note{Other build options are listed in the
[meson options](https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/meson_options.txt) file.} [meson options](https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/meson_options.txt) file.}

View File

@@ -0,0 +1,25 @@
---
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
version: 2
build:
os: ubuntu-24.04
tools:
ruby: "3.3"
apt_packages:
- 7zip
- jq
jobs:
install:
- |
mkdir -p "./tmp"
branch="master"
base_url="https://raw.githubusercontent.com/LizardByte/LizardByte.github.io"
url="${base_url}/refs/heads/${branch}/scripts/readthedocs_build.sh"
curl -sSL -o "./tmp/readthedocs_build.sh" "${url}"
chmod +x "./tmp/readthedocs_build.sh"
build:
html:
- "./tmp/readthedocs_build.sh"

View File

@@ -56,7 +56,7 @@ ext-js:
<div class="card-body p-4"> <div class="card-body p-4">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<div class="icon text-white"> <div class="icon text-white">
<img class="icon" src="https://moonlight-stream.org/images/moonlight.svg" alt="Moonlight"> <img class="icon" src="https://moonlight-stream.org/images/moonlight.svg" alt="Moonlight"/>
</div> </div>
<div class="ms-3"> <div class="ms-3">
<h5 class="fw-bolder mb-0">Moonlight Support</h5> <h5 class="fw-bolder mb-0">Moonlight Support</h5>
@@ -163,7 +163,7 @@ ext-js:
<div class="card-body p-4"> <div class="card-body p-4">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<div class="icon text-white"> <div class="icon text-white">
<i class="fa-fw fa-2x fab fa-android"></i> <img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/android.svg" alt="Android"/>
</div> </div>
<div class="ms-3"> <div class="ms-3">
<h5 class="fw-bolder mb-0"> <h5 class="fw-bolder mb-0">
@@ -182,7 +182,7 @@ ext-js:
<a href="https://play.google.com/store/apps/details?id=com.limelight" target="_blank"> <a href="https://play.google.com/store/apps/details?id=com.limelight" target="_blank">
<img alt="Get it on Google Play" <img alt="Get it on Google Play"
src="https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png" src="https://play.google.com/intl/en_us/badges/static/images/badges/en_badge_web_generic.png"
height="60"> height="60"/>
</a> </a>
</div> </div>
<div> <div>
@@ -190,14 +190,14 @@ ext-js:
<img alt="Available at Amazon Appstore" <img alt="Available at Amazon Appstore"
src="https://images-na.ssl-images-amazon.com/images/G/01/mobile-apps/devportal2/res/images/amazon-appstore-badge-english-black.png" src="https://images-na.ssl-images-amazon.com/images/G/01/mobile-apps/devportal2/res/images/amazon-appstore-badge-english-black.png"
height="60" height="60"
style="padding: 10px;"> style="padding: 10px;"/>
</a> </a>
</div> </div>
<div> <div>
<a href="https://f-droid.org/packages/com.limelight" target="_blank"> <a href="https://f-droid.org/packages/com.limelight" target="_blank">
<img alt="Get it on F-Droid" <img alt="Get it on F-Droid"
src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
height="60"> height="60"/>
</a> </a>
</div> </div>
</div> </div>
@@ -210,7 +210,7 @@ ext-js:
<div class="card-body p-4"> <div class="card-body p-4">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<div class="icon text-white"> <div class="icon text-white">
<i class="fa-fw fa-2x fab fa-chrome"></i> <img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/chromewebstore.svg" alt="Chrome Web Store"/>
</div> </div>
<div class="ms-3"> <div class="ms-3">
<h5 class="fw-bolder mb-0"> <h5 class="fw-bolder mb-0">
@@ -229,7 +229,7 @@ ext-js:
<a href="https://chrome.google.com/webstore/detail/moonlight-game-streaming/gemamigbbenahjlfnmlfdjhdnkpbkfjj" target="_blank" class="btn btn-outline-light"> <a href="https://chrome.google.com/webstore/detail/moonlight-game-streaming/gemamigbbenahjlfnmlfdjhdnkpbkfjj" target="_blank" class="btn btn-outline-light">
<img alt="Available in the Chrome Web Store" <img alt="Available in the Chrome Web Store"
src="https://developer.chrome.com/static/docs/webstore/branding/image/206x58-chrome-web-043497a3d766e.png" src="https://developer.chrome.com/static/docs/webstore/branding/image/206x58-chrome-web-043497a3d766e.png"
height="30"> height="30"/>
</a> </a>
</div> </div>
</div> </div>
@@ -242,7 +242,8 @@ ext-js:
<div class="card-body p-4"> <div class="card-body p-4">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<div class="icon text-white"> <div class="icon text-white">
<i class="fa-fw fa-2x fab fa-apple"></i> <img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/ios.svg" alt="iOS"/>
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/appletv.svg" alt="Apple TV"/>
</div> </div>
<div class="ms-3"> <div class="ms-3">
<h5 class="fw-bolder mb-0"> <h5 class="fw-bolder mb-0">
@@ -261,14 +262,14 @@ ext-js:
<a href="https://apps.apple.com/us/app/moonlight-game-streaming/id1000551566" target="_blank"> <a href="https://apps.apple.com/us/app/moonlight-game-streaming/id1000551566" target="_blank">
<img alt="Download on the App Store" <img alt="Download on the App Store"
src="https://developer.apple.com/assets/elements/badges/download-on-the-app-store.svg" src="https://developer.apple.com/assets/elements/badges/download-on-the-app-store.svg"
height="40"> height="40"/>
</a> </a>
</div> </div>
<div class="pb-3"> <div class="pb-3">
<a href="https://apps.apple.com/us/app/moonlight-game-streaming/id1000551566" target="_blank"> <a href="https://apps.apple.com/us/app/moonlight-game-streaming/id1000551566" target="_blank">
<img alt="Download on Apple TV" <img alt="Download on Apple TV"
src="https://developer.apple.com/app-store/marketing/guidelines/images/badge-download-on-apple-tv.svg" src="https://developer.apple.com/app-store/marketing/guidelines/images/badge-download-on-apple-tv.svg"
height="40"> height="40"/>
</a> </a>
</div> </div>
</div> </div>
@@ -281,10 +282,10 @@ ext-js:
<div class="card-body p-4"> <div class="card-body p-4">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<div class="icon text-white"> <div class="icon text-white">
<i class="fa-fw fa-2x fab fa-linux"></i> <img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/linux.svg" alt="Linux"/>
<i class="fa-fw fa-2x fab fa-apple"></i> <img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/macos.svg" alt="macOS"/>
<i class="fa-fw fa-2x fab fa-windows"></i> <img class="invert" src="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/icons/windows.svg" alt="Windows"/>
<i class="fa-fw fa-2x fab fa-steam"></i> <img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/steam.svg" alt="Steam"/>
</div> </div>
<div class="ms-3"> <div class="ms-3">
<h5 class="fw-bolder mb-0"> <h5 class="fw-bolder mb-0">
@@ -314,7 +315,7 @@ ext-js:
<div class="card-body p-4"> <div class="card-body p-4">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<div class="icon text-white"> <div class="icon text-white">
<i class="fa-fw fa-2x fas fa-microchip"></i> <img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/raspberrypi.svg" alt="Raspberry Pi"/>
</div> </div>
<div class="ms-3"> <div class="ms-3">
<h5 class="fw-bolder mb-0"> <h5 class="fw-bolder mb-0">
@@ -344,7 +345,7 @@ ext-js:
<div class="card-body p-4"> <div class="card-body p-4">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<div class="icon text-white"> <div class="icon text-white">
<i class="fa-fw fa-2x fab fa-xbox"></i> <img class="invert" src="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/icons/xbox.svg" alt="Xbox"/>
</div> </div>
<div class="ms-3"> <div class="ms-3">
<h5 class="fw-bolder mb-0"> <h5 class="fw-bolder mb-0">
@@ -363,7 +364,7 @@ ext-js:
<a href="https://apps.microsoft.com/store/detail/moonlight-uwp/9MW1BS08ZBTH" target="_blank"> <a href="https://apps.microsoft.com/store/detail/moonlight-uwp/9MW1BS08ZBTH" target="_blank">
<img alt="Get it from Microsoft" <img alt="Get it from Microsoft"
src="https://get.microsoft.com/images/en-us%20dark.svg" src="https://get.microsoft.com/images/en-us%20dark.svg"
height="40"> height="40"/>
</a> </a>
</div> </div>
</div> </div>
@@ -376,7 +377,7 @@ ext-js:
<div class="card-body p-4"> <div class="card-body p-4">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<div class="icon text-white"> <div class="icon text-white">
<i class="fa-fw fa-2x fab fa-playstation"></i> <img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/playstationvita.svg" alt="PlayStation Vita"/>
</div> </div>
<div class="ms-3"> <div class="ms-3">
<h5 class="fw-bolder mb-0"> <h5 class="fw-bolder mb-0">
@@ -406,12 +407,16 @@ ext-js:
<div class="card-body p-4"> <div class="card-body p-4">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<div class="icon text-white"> <div class="icon text-white">
<i class="fa-fw fa-2x fas fa-code"></i> <img class="invert" src="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/icons/nintendo-switch.svg" alt="Nintendo Switch"/>
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/android.svg" alt="Android"/>
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/appletv.svg" alt="Apple TV"/>
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/ios.svg" alt="iOS"/>
<img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/macos.svg" alt="macOS"/>
</div> </div>
<div class="ms-3"> <div class="ms-3">
<h5 class="fw-bolder mb-0"> <h5 class="fw-bolder mb-0">
<a href="https://github.com/XITRIX/Moonlight-Switch" target="_blank" class="text-white text-decoration-none"> <a href="https://github.com/XITRIX/Moonlight-Switch" target="_blank" class="text-white text-decoration-none">
Nintendo Switch Moonlight Switch
</a> </a>
</h5> </h5>
</div> </div>
@@ -436,7 +441,7 @@ ext-js:
<div class="card-body p-4"> <div class="card-body p-4">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<div class="icon text-white"> <div class="icon text-white">
<i class="fa-fw fa-2x fas fa-code"></i> <img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v12/icons/wiiu.svg" alt="Wii U"/>
</div> </div>
<div class="ms-3"> <div class="ms-3">
<h5 class="fw-bolder mb-0"> <h5 class="fw-bolder mb-0">
@@ -466,7 +471,7 @@ ext-js:
<div class="card-body p-4"> <div class="card-body p-4">
<div class="d-flex align-items-center"> <div class="d-flex align-items-center">
<div class="icon text-white"> <div class="icon text-white">
<i class="fa-fw fa-2x fas fa-code"></i> <img class="invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/lg.svg" alt="LG webOS TV"/>
</div> </div>
<div class="ms-3"> <div class="ms-3">
<h5 class="fw-bolder mb-0"> <h5 class="fw-bolder mb-0">
@@ -514,7 +519,7 @@ ext-js:
</div> </div>
<div class="card-footer p-3 px-4"> <div class="card-footer p-3 px-4">
<a class="btn btn-outline-light me-3 mb-3" href="https://docs.lizardbyte.dev/projects/sunshine" target="_blank"> <a class="btn btn-outline-light me-3 mb-3" href="https://docs.lizardbyte.dev/projects/sunshine" target="_blank">
<i class="fa-fw fas fa-book"></i> <img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/readthedocs.svg" alt="ReadTheDocs"/>
Read the Docs Read the Docs
</a> </a>
</div> </div>
@@ -537,27 +542,37 @@ ext-js:
</div> </div>
<div class="card-footer p-3 px-4"> <div class="card-footer p-3 px-4">
<a class="latest-button btn btn-outline-light me-3 mb-3 d-none" href="https://github.com/LizardByte/Sunshine/releases/latest" target="_blank"> <a class="latest-button btn btn-outline-light me-3 mb-3 d-none" href="https://github.com/LizardByte/Sunshine/releases/latest" target="_blank">
<i class="fa-fw fab fa-github"></i> <img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/github.svg" alt="GitHub"/>
Latest: <span id="latest-version"></span> <img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/icons/windows.svg" alt="Windows"/>
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/debian.svg" alt="Debian"/>
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/ubuntu.svg" alt="Ubuntu"/>
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/flatpak.svg" alt="Flatpak"/>
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/linux.svg" alt="AppImage"/>
Latest: <span id="latest-version" class="crowdin-ignore"></span>
</a> </a>
<a class="beta-button btn btn-outline-light me-3 mb-3 d-none" href="#" target="_blank"> <a class="beta-button btn btn-outline-light me-3 mb-3 d-none" href="#" target="_blank">
<i class="fa-fw fas fa-flask"></i> <i class="fa-fw fa-lg fas fa-flask"></i>
Beta: <span id="beta-version"></span> <img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/icons/windows.svg" alt="Windows"/>
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/debian.svg" alt="Debian"/>
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/ubuntu.svg" alt="Ubuntu"/>
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/flatpak.svg" alt="Flatpak"/>
<img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/linux.svg" alt="AppImage"/>
Beta: <span id="beta-version" class="crowdin-ignore"></span>
</a> </a>
<a class="btn btn-outline-light me-3 mb-3" href="https://github.com/LizardByte/pacman-repo" target="_blank"> <a class="btn btn-outline-light me-3 mb-3" href="https://github.com/LizardByte/pacman-repo" target="_blank">
<i class="fa-fw fab fa-linux"></i> <img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/archlinux.svg" alt="Arch Linux"/>
ArchLinux Arch Linux
</a> </a>
<a class="btn btn-outline-light me-3 mb-3" href="https://hub.docker.com/r/lizardbyte/sunshine" target="_blank"> <a class="btn btn-outline-light me-3 mb-3" href="https://hub.docker.com/r/lizardbyte/sunshine" target="_blank">
<i class="fa-fw fab fa-docker"></i> <img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/docker.svg" alt="Docker"/>
Docker Docker
</a> </a>
<a class="btn btn-outline-light me-3 mb-3" href="https://flathub.org/apps/dev.lizardbyte.app.Sunshine" target="_blank"> <a class="btn btn-outline-light me-3 mb-3" href="https://flathub.org/apps/dev.lizardbyte.app.Sunshine" target="_blank">
<i class="fa-fw fab fa-linux"></i> <img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/flathub.svg" alt="Flathub"/>
Flathub Flathub
</a> </a>
<a class="btn btn-outline-light me-3 mb-3" href="https://github.com/LizardByte/homebrew-homebrew" target="_blank"> <a class="btn btn-outline-light me-3 mb-3" href="https://github.com/LizardByte/homebrew-homebrew" target="_blank">
<i class="fa-fw fas fa-beer-mug-empty"></i> <img class="icon-sm invert" src="https://cdn.jsdelivr.net/npm/simple-icons@v14/icons/homebrew.svg" alt="Homebrew"/>
Homebrew Homebrew
</a> </a>
</div> </div>
@@ -577,16 +592,21 @@ ext-js:
// Filter the releases to get only the stable releases // Filter the releases to get only the stable releases
const stableReleases = data.filter(release => !release.prerelease); const stableReleases = data.filter(release => !release.prerelease);
const latestButton = document.querySelector('.latest-button');
const latestVersion = document.querySelector('#latest-version');
const betaButton = document.querySelector('.beta-button');
const betaVersion = document.querySelector('#beta-version');
// If there are no stable releases, hide the latest download button // If there are no stable releases, hide the latest download button
if (stableReleases.length === 0) { if (stableReleases.length === 0) {
document.querySelector('.latest-button').classList.add('d-none'); latestButton.classList.add('d-none');
} else { } else {
// Show the latest download button // Show the latest download button
document.querySelector('.latest-button').classList.remove('d-none'); latestButton.classList.remove('d-none');
// Get the latest stable release // Get the latest stable release
const latestStableRelease = stableReleases[0]; const latestStableRelease = stableReleases[0];
document.querySelector('#latest-version').textContent = latestStableRelease.tag_name; latestVersion.textContent = latestStableRelease.tag_name;
// If there is a pre-release, update the href attribute of the anchor tag // If there is a pre-release, update the href attribute of the anchor tag
if (preReleases.length > 0) { if (preReleases.length > 0) {
@@ -598,16 +618,16 @@ ext-js:
// If the pre-release is newer, update the href attribute of the anchor tag // If the pre-release is newer, update the href attribute of the anchor tag
if (preReleaseDate > stableReleaseDate) { if (preReleaseDate > stableReleaseDate) {
document.querySelector('.beta-button').href = latestPreRelease.html_url; betaButton.href = latestPreRelease.html_url;
document.querySelector('#beta-version').textContent = latestPreRelease.tag_name; betaVersion.textContent = latestPreRelease.tag_name;
document.querySelector('.beta-button').classList.remove('d-none'); betaButton.classList.remove('d-none');
} else { } else {
// If the pre-release is older, hide the button // If the pre-release is older, hide the button
document.querySelector('.beta-button').classList.add('d-none'); betaButton.classList.add('d-none');
} }
} else { } else {
// If there is no pre-release, hide the button // If there is no pre-release, hide the button
document.querySelector('.beta-button').classList.add('d-none'); betaButton.classList.add('d-none');
} }
} }
}); });

View File

@@ -8,14 +8,15 @@
"serve": "serve ./tests/fixtures/http --no-port-switching" "serve": "serve ./tests/fixtures/http --no-port-switching"
}, },
"dependencies": { "dependencies": {
"@lizardbyte/shared-web": "2024.921.191855", "@lizardbyte/shared-web": "2025.326.11214",
"vue": "3.5.13", "vue": "3.5.13",
"vue-i18n": "11.0.1" "vue-i18n": "11.1.3"
}, },
"devDependencies": { "devDependencies": {
"@codecov/vite-plugin": "1.9.0",
"@vitejs/plugin-vue": "4.6.2", "@vitejs/plugin-vue": "4.6.2",
"serve": "14.2.3", "serve": "14.2.3",
"vite": "4.5.2", "vite": "4.5.9",
"vite-plugin-ejs": "1.6.4" "vite-plugin-ejs": "1.6.4"
} }
} }

View File

@@ -17,8 +17,6 @@ Source0: tarball.tar.gz
# BuildRequires: boost-devel >= 1.86.0 # BuildRequires: boost-devel >= 1.86.0
BuildRequires: cmake >= 3.25.0 BuildRequires: cmake >= 3.25.0
BuildRequires: gcc
BuildRequires: gcc-c++
BuildRequires: libayatana-appindicator3-devel BuildRequires: libayatana-appindicator3-devel
BuildRequires: libcap-devel BuildRequires: libcap-devel
BuildRequires: libcurl-devel BuildRequires: libcurl-devel
@@ -37,6 +35,7 @@ BuildRequires: libXrandr-devel
BuildRequires: libXtst-devel BuildRequires: libXtst-devel
BuildRequires: git BuildRequires: git
BuildRequires: mesa-libGL-devel BuildRequires: mesa-libGL-devel
BuildRequires: mesa-libgbm-devel
BuildRequires: miniupnpc-devel BuildRequires: miniupnpc-devel
BuildRequires: npm BuildRequires: npm
BuildRequires: numactl-devel BuildRequires: numactl-devel
@@ -54,11 +53,22 @@ BuildRequires: which
BuildRequires: xorg-x11-server-Xvfb BuildRequires: xorg-x11-server-Xvfb
# Conditional BuildRequires for cuda-gcc based on Fedora version # Conditional BuildRequires for cuda-gcc based on Fedora version
%if 0%{?fedora} >= 40 %if 0%{?fedora} >= 40 && 0%{?fedora} <= 41
# this package conflicts with gcc on f39 BuildRequires: gcc13
BuildRequires: cuda-gcc-c++ BuildRequires: gcc13-c++
%global gcc_version 13
%global cuda_version 12.6.3
%global cuda_build 560.35.05
%elif %{?fedora} >= 42
BuildRequires: gcc14
BuildRequires: gcc14-c++
%global gcc_version 14
%global cuda_version 12.8.1
%global cuda_build 570.124.06
%endif %endif
%global cuda_dir %{_builddir}/cuda
Requires: libcap >= 2.22 Requires: libcap >= 2.22
Requires: libcurl >= 7.0 Requires: libcurl >= 7.0
Requires: libdrm > 2.4.97 Requires: libdrm > 2.4.97
@@ -88,20 +98,14 @@ ls -a %{_builddir}/Sunshine
%autopatch -p1 %autopatch -p1
%build %build
# exit on error
set -e
# Detect the architecture and Fedora version # Detect the architecture and Fedora version
architecture=$(uname -m) architecture=$(uname -m)
fedora_version=%{fedora}
cuda_supported_architectures=("x86_64" "aarch64") cuda_supported_architectures=("x86_64" "aarch64")
# set cuda_version based on Fedora version
case "$fedora_version" in
*)
cuda_version="12.6.3"
cuda_build="560.35.05"
;;
esac
# prepare CMAKE args # prepare CMAKE args
cmake_args=( cmake_args=(
"-B=%{_builddir}/Sunshine/build" "-B=%{_builddir}/Sunshine/build"
@@ -121,27 +125,23 @@ cmake_args=(
"-DSUNSHINE_PUBLISHER_ISSUE_URL=https://app.lizardbyte.dev/support" "-DSUNSHINE_PUBLISHER_ISSUE_URL=https://app.lizardbyte.dev/support"
) )
export CC=gcc-%{gcc_version}
export CXX=g++-%{gcc_version}
function install_cuda() { function install_cuda() {
# check if we need to install cuda # check if we need to install cuda
if [ -f "%{_builddir}/cuda/bin/nvcc" ]; then if [ -f "%{cuda_dir}/bin/nvcc" ]; then
echo "cuda already installed" echo "cuda already installed"
return return
fi fi
if [ "$fedora_version" -ge 40 ]; then
# update environment variables for CUDA, necessary when using cuda-gcc-c++
export NVCC_PREPEND_FLAGS='-ccbin /usr/bin/g++-13'
export PATH=/usr/bin/cuda:"%{_builddir}/cuda/bin:${PATH}"
export LD_LIBRARY_PATH="%{_builddir}/cuda/lib64:${LD_LIBRARY_PATH}"
fi
local cuda_prefix="https://developer.download.nvidia.com/compute/cuda/" local cuda_prefix="https://developer.download.nvidia.com/compute/cuda/"
local cuda_suffix="" local cuda_suffix=""
if [ "$architecture" == "aarch64" ]; then if [ "$architecture" == "aarch64" ]; then
local cuda_suffix="_sbsa" local cuda_suffix="_sbsa"
fi fi
local url="${cuda_prefix}${cuda_version}/local_installers/cuda_${cuda_version}_${cuda_build}_linux${cuda_suffix}.run" local url="${cuda_prefix}%{cuda_version}/local_installers/cuda_%{cuda_version}_%{cuda_build}_linux${cuda_suffix}.run"
echo "cuda url: ${url}" echo "cuda url: ${url}"
wget \ wget \
"$url" \ "$url" \
@@ -157,23 +157,31 @@ function install_cuda() {
--override \ --override \
--silent \ --silent \
--toolkit \ --toolkit \
--toolkitpath="%{_builddir}/cuda" --toolkitpath="%{cuda_dir}"
rm "%{_builddir}/cuda.run" rm "%{_builddir}/cuda.run"
# we need to patch math_functions.h on fedora 42
# see https://forums.developer.nvidia.com/t/error-exception-specification-is-incompatible-for-cospi-sinpi-cospif-sinpif-with-glibc-2-41/323591/3
if [ "%{?fedora}" -eq 42 ]; then
echo "Original math_functions.h:"
find "%{cuda_dir}" -name math_functions.h -exec cat {} \;
# Apply the patch
patch -p2 \
--backup \
--directory="%{cuda_dir}" \
--verbose \
< "%{_builddir}/Sunshine/packaging/linux/fedora/patches/f42/${architecture}/01-math_functions.patch"
fi
} }
# we need to clear these flags to avoid linkage errors with cuda-gcc-c++ if [ -n "%{cuda_version}" ] && [[ " ${cuda_supported_architectures[@]} " =~ " ${architecture} " ]]; then
export CFLAGS=""
export CXXFLAGS=""
export FFLAGS=""
export FCFLAGS=""
export LDFLAGS=""
export CC=gcc-13
export CXX=g++-13
if [ -n "$cuda_version" ] && [[ " ${cuda_supported_architectures[@]} " =~ " ${architecture} " ]]; then
install_cuda install_cuda
cmake_args+=("-DSUNSHINE_ENABLE_CUDA=ON") cmake_args+=("-DSUNSHINE_ENABLE_CUDA=ON")
cmake_args+=("-DCMAKE_CUDA_COMPILER:PATH=%{_builddir}/cuda/bin/nvcc") cmake_args+=("-DCMAKE_CUDA_COMPILER:PATH=%{cuda_dir}/bin/nvcc")
cmake_args+=("-DCMAKE_CUDA_HOST_COMPILER=gcc-%{gcc_version}")
else
cmake_args+=("-DSUNSHINE_ENABLE_CUDA=OFF")
fi fi
# setup the version # setup the version

View File

@@ -0,0 +1,39 @@
diff '--color=auto' -ur a/cuda/targets/sbsa-linux/include/crt/math_functions.h b/cuda/targets/sbsa-linux/include/crt/math_functions.h
--- a/cuda/targets/sbsa-linux/include/crt/math_functions.h 2024-08-23 00:25:39.000000000 +0200
+++ b/cuda/targets/sbsa-linux/include/crt/math_functions.h 2025-02-17 01:19:44.270292640 +0100
@@ -2553,7 +2553,7 @@
*
* \note_accuracy_double
*/
-extern __DEVICE_FUNCTIONS_DECL__ __device_builtin__ double sinpi(double x);
+extern __DEVICE_FUNCTIONS_DECL__ __device_builtin__ double sinpi(double x) noexcept (true);
/**
* \ingroup CUDA_MATH_SINGLE
* \brief Calculate the sine of the input argument
@@ -2576,7 +2576,7 @@
*
* \note_accuracy_single
*/
-extern __DEVICE_FUNCTIONS_DECL__ __device_builtin__ float sinpif(float x);
+extern __DEVICE_FUNCTIONS_DECL__ __device_builtin__ float sinpif(float x) noexcept (true);
/**
* \ingroup CUDA_MATH_DOUBLE
* \brief Calculate the cosine of the input argument
@@ -2598,7 +2598,7 @@
*
* \note_accuracy_double
*/
-extern __DEVICE_FUNCTIONS_DECL__ __device_builtin__ double cospi(double x);
+extern __DEVICE_FUNCTIONS_DECL__ __device_builtin__ double cospi(double x) noexcept (true);
/**
* \ingroup CUDA_MATH_SINGLE
* \brief Calculate the cosine of the input argument
@@ -2620,7 +2620,7 @@
*
* \note_accuracy_single
*/
-extern __DEVICE_FUNCTIONS_DECL__ __device_builtin__ float cospif(float x);
+extern __DEVICE_FUNCTIONS_DECL__ __device_builtin__ float cospif(float x) noexcept (true);
/**
* \ingroup CUDA_MATH_DOUBLE
* \brief Calculate the sine and cosine of the first input argument

View File

@@ -0,0 +1,39 @@
diff '--color=auto' -ur a/cuda/targets/x86_64-linux/include/crt/math_functions.h b/cuda/targets/x86_64-linux/include/crt/math_functions.h
--- a/cuda/targets/x86_64-linux/include/crt/math_functions.h 2024-08-23 00:25:39.000000000 +0200
+++ b/cuda/targets/x86_64-linux/include/crt/math_functions.h 2025-02-17 01:19:44.270292640 +0100
@@ -2553,7 +2553,7 @@
*
* \note_accuracy_double
*/
-extern __DEVICE_FUNCTIONS_DECL__ __device_builtin__ double sinpi(double x);
+extern __DEVICE_FUNCTIONS_DECL__ __device_builtin__ double sinpi(double x) noexcept (true);
/**
* \ingroup CUDA_MATH_SINGLE
* \brief Calculate the sine of the input argument
@@ -2576,7 +2576,7 @@
*
* \note_accuracy_single
*/
-extern __DEVICE_FUNCTIONS_DECL__ __device_builtin__ float sinpif(float x);
+extern __DEVICE_FUNCTIONS_DECL__ __device_builtin__ float sinpif(float x) noexcept (true);
/**
* \ingroup CUDA_MATH_DOUBLE
* \brief Calculate the cosine of the input argument
@@ -2598,7 +2598,7 @@
*
* \note_accuracy_double
*/
-extern __DEVICE_FUNCTIONS_DECL__ __device_builtin__ double cospi(double x);
+extern __DEVICE_FUNCTIONS_DECL__ __device_builtin__ double cospi(double x) noexcept (true);
/**
* \ingroup CUDA_MATH_SINGLE
* \brief Calculate the cosine of the input argument
@@ -2620,7 +2620,7 @@
*
* \note_accuracy_single
*/
-extern __DEVICE_FUNCTIONS_DECL__ __device_builtin__ float cospif(float x);
+extern __DEVICE_FUNCTIONS_DECL__ __device_builtin__ float cospif(float x) noexcept (true);
/**
* \ingroup CUDA_MATH_DOUBLE
* \brief Calculate the sine and cosine of the first input argument

View File

@@ -1,13 +1,22 @@
# Overview <div align="center">
<img src="https://raw.githubusercontent.com/LizardByte/Sunshine/master/sunshine.png" />
<h1 align="center">Sunshine</h1>
<h4 align="center">Self-hosted game stream host for Moonlight.</h4>
</div>
[![Flathub installs](https://img.shields.io/flathub/downloads/dev.lizardbyte.app.Sunshine?style=for-the-badge&logo=flathub)](https://flathub.org/apps/dev.lizardbyte.app.Sunshine) <div align="center">
[![Flathub Version](https://img.shields.io/flathub/v/dev.lizardbyte.app.Sunshine?style=for-the-badge&logo=flathub)](https://flathub.org/apps/dev.lizardbyte.app.Sunshine) <a href="https://flathub.org/apps/dev.lizardbyte.app.Sunshine"><img src="https://img.shields.io/flathub/downloads/dev.lizardbyte.app.Sunshine?style=for-the-badge&logo=flathub" alt="Flathub installs"></a>
<a href="https://flathub.org/apps/dev.lizardbyte.app.Sunshine"><img src="https://img.shields.io/flathub/v/dev.lizardbyte.app.Sunshine?style=for-the-badge&logo=flathub" alt="Flathub Version"></a>
</div>
LizardByte has the full documentation hosted on [Read the Docs](https://docs.lizardbyte.dev/projects/sunshine). ## About
## About
Sunshine is a self-hosted game stream host for Moonlight. Sunshine is a self-hosted game stream host for Moonlight.
LizardByte has the full documentation hosted on [Read the Docs](https://docs.lizardbyte.dev/projects/sunshine)
* [Stable](https://docs.lizardbyte.dev/projects/sunshine/latest/)
* [Beta](https://docs.lizardbyte.dev/projects/sunshine/master/)
This repo is synced from the upstream [Sunshine](https://github.com/LizardByte/Sunshine) repo. This repo is synced from the upstream [Sunshine](https://github.com/LizardByte/Sunshine) repo.
Please report issues and contribute to the upstream repo. Please report issues and contribute to the upstream repo.

View File

@@ -0,0 +1,8 @@
{
"dev.lizardbyte.app.Sunshine": [
"appstream-missing-screenshots",
"appstream-screenshots-not-mirrored-in-ostree",
"external-gitmodule-url-found",
"finish-args-flatpak-spawn-access"
]
}

View File

@@ -1,9 +0,0 @@
{
"errors": [
"finish-args-flatpak-spawn-access"
],
"info": [
"finish-args-flatpak-spawn-access: finish-args has a talk-name access for org.freedesktop.Flatpak"
],
"message": "Please consult the documentation at https://docs.flathub.org/docs/for-app-authors/linter"
}

View File

@@ -1,11 +0,0 @@
{
"errors": [
"appstream-missing-screenshots",
"finish-args-flatpak-spawn-access"
],
"info": [
"appstream-missing-screenshots: Catalogue file has no screenshots. Please check if screenshot URLs are reachable",
"finish-args-flatpak-spawn-access: finish-args has a talk-name access for org.freedesktop.Flatpak"
],
"message": "Please consult the documentation at https://docs.flathub.org/docs/for-app-authors/linter"
}

View File

@@ -9,8 +9,8 @@
"sources": [ "sources": [
{ {
"type": "archive", "type": "archive",
"url": "https://github.com/boostorg/boost/releases/download/boost-1.86.0/boost-1.86.0-cmake.tar.xz", "url": "https://github.com/boostorg/boost/releases/download/boost-1.87.0/boost-1.87.0-cmake.tar.xz",
"sha256": "2c5ec5edcdff47ff55e27ed9560b0a0b94b07bd07ed9928b476150e16b0efc57" "sha256": "7da75f171837577a52bbf217e17f8ea576c7c246e4594d617bfde7fafd408be5"
} }
] ]
} }

View File

@@ -11,14 +11,15 @@
], ],
"sources": [ "sources": [
{ {
"type": "archive", "type": "git",
"url": "https://gitlab.freedesktop.org/xorg/xserver/-/archive/xorg-server-21.1.13/xserver-xorg-server-21.1.13.tar.bz2", "url": "https://github.com/LizardByte-infrastructure/xserver.git",
"sha256": "ee2bf6d65f4b111ce86ca817c3327dc1e70d9c958aa16876f2820caf7bf7cffa", "tag": "xorg-server-21.1.13",
"commit": "be2767845d6ed3c6dbd25a151051294d0908a995",
"x-checker-data": { "x-checker-data": {
"type": "anitya", "type": "anitya",
"project-id": 5250, "project-id": 5250,
"stable-only": true, "stable-only": true,
"url-template": "https://gitlab.freedesktop.org/xorg/xserver/-/archive/xorg-server-$version/xserver-xorg-server-$version.tar.bz2" "tag-template": "xorg-server-$version"
} }
}, },
{ {
@@ -32,14 +33,15 @@
"buildsystem": "meson", "buildsystem": "meson",
"sources": [ "sources": [
{ {
"type": "archive", "type": "git",
"url": "https://gitlab.freedesktop.org/xorg/lib/libxcvt/-/archive/libxcvt-0.1.2/libxcvt-libxcvt-0.1.2.tar.bz2", "url": "https://github.com/LizardByte-infrastructure/libxcvt.git",
"sha256": "590e5a6da87ace7aa7857026b207a2c4d378620035441e20ea97efedd15d6d4a", "tag": "libxcvt-0.1.2",
"commit": "d9ca87eea9eecddaccc3a77227bcb3acf84e89df",
"x-checker-data": { "x-checker-data": {
"type": "anitya", "type": "anitya",
"project-id": 235147, "project-id": 235147,
"stable-only": true, "stable-only": true,
"url-template": "https://gitlab.freedesktop.org/xorg/lib/libxcvt/-/archive/libxcvt-$version/libxcvt-libxcvt-$version.tar.bz2" "tag-template": "libxcvt-$version"
} }
} }
] ]
@@ -48,14 +50,32 @@
"name": "libXmu", "name": "libXmu",
"sources": [ "sources": [
{ {
"type": "archive", "type": "git",
"url": "https://xorg.freedesktop.org/archive/individual/lib/libXmu-1.2.1.tar.gz", "url": "https://github.com/LizardByte-infrastructure/libxmu.git",
"sha256": "bf0902583dd1123856c11e0a5085bd3c6e9886fbbd44954464975fd7d52eb599", "tag": "libXmu-1.2.1",
"commit": "792f80402ee06ce69bca3a8f2a84295999c3a170",
"x-checker-data": { "x-checker-data": {
"type": "anitya", "type": "anitya",
"project-id": 1785, "project-id": 1785,
"stable-only": true, "stable-only": true,
"url-template": "https://xorg.freedesktop.org/archive/individual/lib/libXmu-$version.tar.gz" "tag-template": "libXmu-$version"
}
}
]
},
{
"name": "font-util",
"sources": [
{
"type": "git",
"url": "https://github.com/LizardByte-infrastructure/font-util.git",
"tag": "font-util-1.4.1",
"commit": "b5ca142f81a6f14eddb23be050291d1c25514777",
"x-checker-data": {
"type": "anitya",
"project-id": 15055,
"stable-only": true,
"tag-template": "font-util-$version"
} }
} }
] ]
@@ -64,14 +84,15 @@
"name": "libfontenc", "name": "libfontenc",
"sources": [ "sources": [
{ {
"type": "archive", "type": "git",
"url": "https://xorg.freedesktop.org/archive/individual/lib/libfontenc-1.1.8.tar.xz", "url": "https://github.com/LizardByte-infrastructure/libfontenc.git",
"sha256": "7b02c3d405236e0d86806b1de9d6868fe60c313628b38350b032914aa4fd14c6", "tag": "libfontenc-1.1.8",
"commit": "92a85fda2acb4e14ec0b2f6d8fe3eaf2b687218c",
"x-checker-data": { "x-checker-data": {
"type": "anitya", "type": "anitya",
"project-id": 1613, "project-id": 1613,
"stable-only": true, "stable-only": true,
"url-template": "https://xorg.freedesktop.org/archive/individual/lib/libfontenc-$version.tar.xz" "tag-template": "libfontenc-$version"
} }
} }
] ]
@@ -95,34 +116,19 @@
} }
] ]
}, },
{
"name": "font-util",
"sources": [
{
"type": "archive",
"url": "https://xorg.freedesktop.org/archive/individual/font/font-util-1.4.1.tar.gz",
"sha256": "f029ae80cdd75d89bee7f7af61c21e07982adfb9f72344a158b99f91f77ef5ed",
"x-checker-data": {
"type": "anitya",
"project-id": 15055,
"stable-only": true,
"url-template": "https://xorg.freedesktop.org/archive/individual/font/font-util-$version.tar.gz"
}
}
]
},
{ {
"name": "xvfb-libXfont2", "name": "xvfb-libXfont2",
"sources": [ "sources": [
{ {
"type": "archive", "type": "git",
"url": "https://xorg.freedesktop.org/archive/individual/lib/libXfont2-2.0.6.tar.gz", "url": "https://github.com/LizardByte-infrastructure/libxfont.git",
"sha256": "a944df7b6837c8fa2067f6a5fc25d89b0acc4011cd0bc085106a03557fb502fc", "tag": "libXfont2-2.0.6",
"commit": "d54aaf2483df6a1f98fadc09004157e657b7f73e",
"x-checker-data": { "x-checker-data": {
"type": "anitya", "type": "anitya",
"project-id": 17165, "project-id": 17165,
"stable-only": true, "stable-only": true,
"url-template": "https://xorg.freedesktop.org/archive/individual/lib/libXfont2-$version.tar.gz" "tag-template": "libXfont2-$version"
} }
} }
] ]
@@ -131,14 +137,15 @@
"name": "xvfb-xauth", "name": "xvfb-xauth",
"sources": [ "sources": [
{ {
"type": "archive", "type": "git",
"url": "https://gitlab.freedesktop.org/xorg/app/xauth/-/archive/xauth-1.1.1/xauth-xauth-1.1.3.tar.bz2", "url": "https://github.com/LizardByte-infrastructure/xauth.git",
"sha256": "3cee16ebe9de0e85c62513f6d6353710407c8ebb1f855b18d03807c27d38a215", "tag": "xauth-1.1.3",
"commit": "c29eef23683f0e3575a3c60d9314de8156fbe2c2",
"x-checker-data": { "x-checker-data": {
"type": "anitya", "type": "anitya",
"project-id": 5253, "project-id": 5253,
"stable-only": true, "stable-only": true,
"url-template": "https://gitlab.freedesktop.org/xorg/app/xauth/-/archive/xauth-1.1.1/xauth-xauth-$version.tar.bz2" "tag-template": "xauth-$version"
} }
} }
] ]

View File

@@ -8,4 +8,4 @@ echo Sunshine User Service has been removed.
# Udev rule # Udev rule
flatpak-spawn --host pkexec sh -c "rm /etc/udev/rules.d/60-sunshine.rules" flatpak-spawn --host pkexec sh -c "rm /etc/udev/rules.d/60-sunshine.rules"
echo Mouse permission removed. Restart computer to take effect. echo Input rules removed. Restart computer to take effect.

View File

@@ -29,16 +29,35 @@ class @PROJECT_NAME@ < Formula
depends_on "cmake" => :build depends_on "cmake" => :build
depends_on "doxygen" => :build depends_on "doxygen" => :build
depends_on "graphviz" => :build depends_on "graphviz" => :build
depends_on "ninja" => :build
depends_on "node" => :build depends_on "node" => :build
depends_on "pkg-config" => :build depends_on "pkg-config" => :build
depends_on "gcovr" => :test
depends_on "curl" depends_on "curl"
depends_on "miniupnpc" depends_on "miniupnpc"
depends_on "openssl" depends_on "openssl"
depends_on "opus" depends_on "opus"
depends_on "boost" => :recommended
depends_on "icu4c" => :recommended depends_on "icu4c" => :recommended
on_linux do on_linux do
# the "build" dependencies are for libayatana-appindicator
depends_on "at-spi2-core" => :build
depends_on "cairo" => :build
depends_on "fontconfig" => :build
depends_on "freetype" => :build
depends_on "fribidi" => :build
depends_on "gettext" => :build
depends_on "gobject-introspection" => :build
depends_on "graphite2" => :build
depends_on "gtk+3" => :build
depends_on "harfbuzz" => :build
depends_on "intltool" => :build
depends_on "libepoxy" => :build
depends_on "libxdamage" => :build
depends_on "libxkbcommon" => :build
depends_on "pango" => :build
depends_on "perl" => :build
depends_on "pixman" => :build
depends_on "avahi" depends_on "avahi"
depends_on "libcap" depends_on "libcap"
depends_on "libdrm" depends_on "libdrm"
@@ -52,10 +71,133 @@ class @PROJECT_NAME@ < Formula
depends_on "libxinerama" depends_on "libxinerama"
depends_on "libxrandr" depends_on "libxrandr"
depends_on "libxtst" depends_on "libxtst"
depends_on "mesa"
depends_on "numactl" depends_on "numactl"
depends_on "pulseaudio" depends_on "pulseaudio"
depends_on "systemd" depends_on "systemd"
depends_on "wayland" depends_on "wayland"
# resources that do not have brew packages
resource "libayatana-appindicator" do
url "https://github.com/AyatanaIndicators/libayatana-appindicator/archive/refs/tags/0.5.94.tar.gz"
sha256 "884a6bc77994c0b58c961613ca4c4b974dc91aa0f804e70e92f38a542d0d0f90"
end
resource "libdbusmenu" do
url "https://launchpad.net/libdbusmenu/16.04/16.04.0/+download/libdbusmenu-16.04.0.tar.gz"
sha256 "b9cc4a2acd74509435892823607d966d424bd9ad5d0b00938f27240a1bfa878a"
patch 'From 729546c51806a1b3ea6cb6efb7a115b1baa811f1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stefan=20Br=C3=BCns?= <stefan.bruens@rwth-aachen.de>
Date: Mon, 18 Nov 2019 19:58:53 +0100
Subject: [PATCH 1/1] Fix HAVE_VALGRIND AM_CONDITIONAL
The AM_CONDITIONAL should also be run with --disable-tests, otherwise
HAVE_VALGRIND is undefined.
---
configure | 4 ++--
configure.ac | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/configure b/configure
index 831a3bb..8913b9b 100644
--- a/configure
+++ b/configure
@@ -14801,6 +14801,8 @@ else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
have_valgrind=yes
+fi
+
fi
if test "x$have_valgrind" = "xyes"; then
HAVE_VALGRIND_TRUE=
@@ -14811,8 +14813,6 @@ else
fi
-fi
-
diff --git a/configure.ac b/configure.ac
index ace54d1..cbd38a6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -120,8 +120,8 @@ PKG_CHECK_MODULES(DBUSMENUTESTS, json-glib-1.0 >= $JSON_GLIB_REQUIRED_VERSION
[have_tests=yes]
)
PKG_CHECK_MODULES(DBUSMENUTESTSVALGRIND, valgrind, have_valgrind=yes, have_valgrind=no)
-AM_CONDITIONAL([HAVE_VALGRIND], [test "x$have_valgrind" = "xyes"])
])
+AM_CONDITIONAL([HAVE_VALGRIND], [test "x$have_valgrind" = "xyes"])
AC_SUBST(DBUSMENUTESTS_CFLAGS)
AC_SUBST(DBUSMENUTESTS_LIBS)
--
2.46.2
'
end
resource "ayatana-ido" do
url "https://github.com/AyatanaIndicators/ayatana-ido/archive/refs/tags/0.10.4.tar.gz"
sha256 "bd59abd5f1314e411d0d55ce3643e91cef633271f58126be529de5fb71c5ab38"
patch 'From 8a09e6ad33c58c017c0c8fd756da036fc39428ea Mon Sep 17 00:00:00 2001
From: Alexander Koskovich <akoskovich@pm.me>
Date: Sun, 29 Sep 2024 13:47:54 -0400
Subject: [PATCH 1/1] Make introspection configurable
---
CMakeLists.txt | 1 +
src/CMakeLists.txt | 4 ++++
2 files changed, 5 insertions(+)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0e13fcd..f3e9ec0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -12,6 +12,7 @@ endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
option(ENABLE_TESTS "Enable all tests and checks" OFF)
option(ENABLE_COVERAGE "Enable coverage reports (includes enabling all tests and checks)" OFF)
option(ENABLE_WERROR "Treat all build warnings as errors" OFF)
+option(ENABLE_INTROSPECTION "Enable introspection" ON)
if(ENABLE_COVERAGE)
set(ENABLE_TESTS ON)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 5b3638d..aca9481 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -108,6 +108,8 @@ install(TARGETS "ayatana-ido3-0.4" LIBRARY DESTINATION "${CMAKE_INSTALL_FULL_LIB
# AyatanaIdo3-0.4.gir
+if (ENABLE_INTROSPECTION)
+
find_package(GObjectIntrospection REQUIRED QUIET)
if (INTROSPECTION_FOUND)
@@ -183,3 +185,5 @@ if (INTROSPECTION_FOUND)
endif ()
endif ()
+
+endif ()
--
2.46.2
'
end
resource "libayatana-indicator" do
url "https://github.com/AyatanaIndicators/libayatana-indicator/archive/refs/tags/0.9.4.tar.gz"
sha256 "a18d3c682e29afd77db24366f8475b26bda22b0e16ff569a2ec71cd6eb4eac95"
end
end end
def install def install
@@ -65,12 +207,12 @@ class @PROJECT_NAME@ < Formula
args = %W[ args = %W[
-DBUILD_WERROR=ON -DBUILD_WERROR=ON
-DCMAKE_CXX_STANDARD=20
-DCMAKE_INSTALL_PREFIX=#{prefix} -DCMAKE_INSTALL_PREFIX=#{prefix}
-DHOMEBREW_ALLOW_FETCHCONTENT=ON -DHOMEBREW_ALLOW_FETCHCONTENT=ON
-DOPENSSL_ROOT_DIR=#{Formula["openssl"].opt_prefix} -DOPENSSL_ROOT_DIR=#{Formula["openssl"].opt_prefix}
-DSUNSHINE_ASSETS_DIR=sunshine/assets -DSUNSHINE_ASSETS_DIR=sunshine/assets
-DSUNSHINE_BUILD_HOMEBREW=ON -DSUNSHINE_BUILD_HOMEBREW=ON
-DSUNSHINE_ENABLE_TRAY=OFF
-DSUNSHINE_PUBLISHER_NAME='LizardByte' -DSUNSHINE_PUBLISHER_NAME='LizardByte'
-DSUNSHINE_PUBLISHER_WEBSITE='https://app.lizardbyte.dev' -DSUNSHINE_PUBLISHER_WEBSITE='https://app.lizardbyte.dev'
-DSUNSHINE_PUBLISHER_ISSUE_URL='https://app.lizardbyte.dev/support' -DSUNSHINE_PUBLISHER_ISSUE_URL='https://app.lizardbyte.dev/support'
@@ -105,16 +247,69 @@ class @PROJECT_NAME@ < Formula
end end
args << "-DCUDA_FAIL_ON_MISSING=OFF" if OS.linux? args << "-DCUDA_FAIL_ON_MISSING=OFF" if OS.linux?
args << "-DSUNSHINE_ENABLE_TRAY=OFF" if OS.mac?
system "cmake", "-S", ".", "-B", "build", *std_cmake_args, *args # Handle system tray on Linux
if OS.linux?
# Build and install libayatana components
cd "build" do # Build libdbusmenu
system "make" resource("libdbusmenu").stage do
system "make", "install" system "./configure",
"--prefix=#{prefix}",
"--with-gtk=3",
"--disable-dumper",
"--disable-static",
"--disable-tests",
"--disable-gtk-doc",
"--enable-introspection=no",
"--disable-vala"
system "make", "install"
end
bin.install "tests/test_sunshine" # Build ayatana-ido
resource("ayatana-ido").stage do
system "cmake", "-S", ".", "-B", "build", "-G", "Ninja",
"-DCMAKE_INSTALL_PREFIX=#{prefix}",
"-DENABLE_INTROSPECTION=OFF",
*std_cmake_args
system "ninja", "-C", "build"
system "ninja", "-C", "build", "install"
end
# Build libayatana-indicator
resource("libayatana-indicator").stage do
ENV.append_path "PKG_CONFIG_PATH", "#{lib}/pkgconfig"
ENV.append "LDFLAGS", "-L#{lib}"
system "cmake", "-S", ".", "-B", "build", "-G", "Ninja",
"-DCMAKE_INSTALL_PREFIX=#{prefix}",
*std_cmake_args
system "ninja", "-C", "build"
system "ninja", "-C", "build", "install"
end
# Build libayatana-appindicator
resource("libayatana-appindicator").stage do
system "cmake", "-S", ".", "-B", "build", "-G", "Ninja",
"-DCMAKE_INSTALL_PREFIX=#{prefix}",
"-DENABLE_BINDINGS_MONO=OFF",
"-DENABLE_BINDINGS_VALA=OFF",
"-DENABLE_GTKDOC=OFF",
*std_cmake_args
system "ninja", "-C", "build"
system "ninja", "-C", "build", "install"
end
end end
system "cmake", "-S", ".", "-B", "build", "-G", "Unix Makefiles",
*std_cmake_args,
*args
system "make", "-C", "build"
system "make", "-C", "build", "install"
bin.install "build/tests/test_sunshine"
# codesign the binary on intel macs # codesign the binary on intel macs
system "codesign", "-s", "-", "--force", "--deep", bin/"sunshine" if OS.mac? && Hardware::CPU.intel? system "codesign", "-s", "-", "--force", "--deep", bin/"sunshine" if OS.mac? && Hardware::CPU.intel?
@@ -157,6 +352,23 @@ class @PROJECT_NAME@ < Formula
system bin/"sunshine", "--version" system bin/"sunshine", "--version"
# run the test suite # run the test suite
system bin/"test_sunshine", "--gtest_color=yes" system bin/"test_sunshine", "--gtest_color=yes", "--gtest_output=xml:test_results.xml"
assert_path_exists testpath/"test_results.xml"
# create gcovr report
if ENV["HOMEBREW_BUILDPATH"]
cd File.join(ENV["HOMEBREW_BUILDPATH"], "build") do
system "gcovr", ".",
"-r", "../src",
"--exclude-noncode-lines",
"--exclude-throw-branches",
"--exclude-unreachable-branches",
"--verbose",
"--xml-pretty",
"-o=coverage.xml"
end
assert_path_exists File.join(ENV["HOMEBREW_BUILDPATH"], "build", "coverage.xml")
end
end end
end end

156
scripts/linux_build.sh Normal file → Executable file
View File

@@ -3,6 +3,7 @@ set -e
# Default value for arguments # Default value for arguments
appimage_build=0 appimage_build=0
num_processors=$(nproc)
publisher_name="Third Party Publisher" publisher_name="Third Party Publisher"
publisher_website="" publisher_website=""
publisher_issue_url="https://app.lizardbyte.dev/support" publisher_issue_url="https://app.lizardbyte.dev/support"
@@ -27,6 +28,7 @@ Options:
-h, --help Display this help message. -h, --help Display this help message.
-s, --sudo-off Disable sudo command. -s, --sudo-off Disable sudo command.
--appimage-build Compile for AppImage, this will not create the AppImage, just the executable. --appimage-build Compile for AppImage, this will not create the AppImage, just the executable.
--num-processors The number of processors to use for compilation. Default is the value of 'nproc'.
--publisher-name The name of the publisher (not developer) of the application. --publisher-name The name of the publisher (not developer) of the application.
--publisher-website The URL of the publisher's website. --publisher-website The URL of the publisher's website.
--publisher-issue-url The URL of the publisher's support site or issue tracker. --publisher-issue-url The URL of the publisher's support site or issue tracker.
@@ -53,6 +55,9 @@ while getopts ":hs-:" opt; do
appimage_build=1 appimage_build=1
skip_libva=1 skip_libva=1
;; ;;
num-processors=*)
num_processors="${OPTARG#*=}"
;;
publisher-name=*) publisher-name=*)
publisher_name="${OPTARG#*=}" publisher_name="${OPTARG#*=}"
;; ;;
@@ -85,7 +90,53 @@ shift $((OPTIND -1))
# dependencies array to build out # dependencies array to build out
dependencies=() dependencies=()
function add_debain_based_deps() { function add_arch_deps() {
dependencies+=(
'avahi'
'base-devel'
'cmake'
'curl'
"gcc${gcc_version}"
"gcc${gcc_version}-libs"
'git'
'libayatana-appindicator'
'libcap'
'libdrm'
'libevdev'
'libmfx'
'libnotify'
'libpulse'
'libva'
'libx11'
'libxcb'
'libxfixes'
'libxrandr'
'libxtst'
'miniupnpc'
'ninja'
'nodejs'
'npm'
'numactl'
'openssl'
'opus'
'udev'
'wayland'
)
if [ "$skip_libva" == 0 ]; then
dependencies+=(
"libva" # VA-API
)
fi
if [ "$skip_cuda" == 0 ]; then
dependencies+=(
"cuda" # VA-API
)
fi
}
function add_debian_based_deps() {
dependencies+=( dependencies+=(
"bison" # required if we need to compile doxygen "bison" # required if we need to compile doxygen
"build-essential" "build-essential"
@@ -100,6 +151,7 @@ function add_debain_based_deps() {
"libcurl4-openssl-dev" "libcurl4-openssl-dev"
"libdrm-dev" # KMS "libdrm-dev" # KMS
"libevdev-dev" "libevdev-dev"
"libgbm-dev"
"libminiupnpc-dev" "libminiupnpc-dev"
"libnotify-dev" "libnotify-dev"
"libnuma-dev" "libnuma-dev"
@@ -128,8 +180,8 @@ function add_debain_based_deps() {
fi fi
} }
function add_debain_deps() { function add_debian_deps() {
add_debain_based_deps add_debian_based_deps
dependencies+=( dependencies+=(
"libayatana-appindicator3-dev" "libayatana-appindicator3-dev"
) )
@@ -141,7 +193,7 @@ function add_ubuntu_deps() {
${sudo_cmd} add-apt-repository ppa:ubuntu-toolchain-r/test -y ${sudo_cmd} add-apt-repository ppa:ubuntu-toolchain-r/test -y
fi fi
add_debain_based_deps add_debian_based_deps
dependencies+=( dependencies+=(
"libappindicator3-dev" "libappindicator3-dev"
) )
@@ -151,8 +203,8 @@ function add_fedora_deps() {
dependencies+=( dependencies+=(
"cmake" "cmake"
"doxygen" "doxygen"
"gcc" "gcc${gcc_version}"
"g++" "gcc${gcc_version}-c++"
"git" "git"
"graphviz" "graphviz"
"libappindicator-gtk3-devel" "libappindicator-gtk3-devel"
@@ -170,6 +222,7 @@ function add_fedora_deps() {
"libXrandr-devel" # X11 "libXrandr-devel" # X11
"libXtst-devel" # X11 "libXtst-devel" # X11
"mesa-libGL-devel" "mesa-libGL-devel"
"mesa-libgbm-devel"
"miniupnpc-devel" "miniupnpc-devel"
"ninja-build" "ninja-build"
"npm" "npm"
@@ -191,9 +244,15 @@ function add_fedora_deps() {
} }
function install_cuda() { function install_cuda() {
nvcc_path=$(command -v nvcc 2>/dev/null) || true
if [ -n "$nvcc_path" ]; then
echo "found system cuda"
return
fi
# check if we need to install cuda # check if we need to install cuda
if [ -f "${build_dir}/cuda/bin/nvcc" ]; then if [ -f "${build_dir}/cuda/bin/nvcc" ]; then
echo "cuda already installed" nvcc_path="${build_dir}/cuda/bin/nvcc"
echo "found local cuda"
return return
fi fi
@@ -230,11 +289,13 @@ function install_cuda() {
chmod a+x "${build_dir}/cuda.run" chmod a+x "${build_dir}/cuda.run"
"${build_dir}/cuda.run" --silent --toolkit --toolkitpath="${build_dir}/cuda" --no-opengl-libs --no-man-page --no-drm "${build_dir}/cuda.run" --silent --toolkit --toolkitpath="${build_dir}/cuda" --no-opengl-libs --no-man-page --no-drm
rm "${build_dir}/cuda.run" rm "${build_dir}/cuda.run"
nvcc_path="${build_dir}/cuda/bin/nvcc"
} }
function check_version() { function check_version() {
local package_name=$1 local package_name=$1
local min_version=$2 local min_version=$2
local max_version=$3
local installed_version local installed_version
echo "Checking if $package_name is installed and at least version $min_version" echo "Checking if $package_name is installed and at least version $min_version"
@@ -243,6 +304,8 @@ function check_version() {
installed_version=$(dpkg -s "$package_name" 2>/dev/null | grep '^Version:' | awk '{print $2}') installed_version=$(dpkg -s "$package_name" 2>/dev/null | grep '^Version:' | awk '{print $2}')
elif [ "$distro" == "fedora" ]; then elif [ "$distro" == "fedora" ]; then
installed_version=$(rpm -q --queryformat '%{VERSION}' "$package_name" 2>/dev/null) installed_version=$(rpm -q --queryformat '%{VERSION}' "$package_name" 2>/dev/null)
elif [ "$distro" == "arch" ]; then
installed_version=$(pacman -Q "$package_name" | awk '{print $2}' )
else else
echo "Unsupported Distro" echo "Unsupported Distro"
return 1 return 1
@@ -253,11 +316,12 @@ function check_version() {
return 1 return 1
fi fi
if [ "$(printf '%s\n' "$installed_version" "$min_version" | sort -V | head -n1)" = "$min_version" ]; then if [[ "$(printf '%s\n' "$installed_version" "$min_version" | sort -V | head -n1)" = "$min_version" ]] && \
echo "$package_name version $installed_version is at least $min_version" [[ "$(printf '%s\n' "$installed_version" "$max_version" | sort -V | head -n1)" = "$installed_version" ]]; then
echo "Installed version is within range"
return 0 return 0
else else
echo "$package_name version $installed_version is less than $min_version" echo "$package_name version $installed_version is out of range"
return 1 return 1
fi fi
} }
@@ -296,13 +360,15 @@ function run_install() {
# Update the package list # Update the package list
$package_update_command $package_update_command
if [ "$distro" == "debian" ]; then if [ "$distro" == "arch" ]; then
add_debain_deps add_arch_deps
elif [ "$distro" == "debian" ]; then
add_debian_deps
elif [ "$distro" == "ubuntu" ]; then elif [ "$distro" == "ubuntu" ]; then
add_ubuntu_deps add_ubuntu_deps
elif [ "$distro" == "fedora" ]; then elif [ "$distro" == "fedora" ]; then
add_fedora_deps add_fedora_deps
${sudo_cmd} dnf group install "Development Tools" -y ${sudo_cmd} dnf group install "$dev_tools_group" -y
fi fi
# Install the dependencies # Install the dependencies
@@ -320,8 +386,11 @@ function run_install() {
"gcc-ranlib" "gcc-ranlib"
) )
# update alternatives for gcc and g++ if a debian based distro #set gcc version based on distros
if [ "$distro" == "debian" ] || [ "$distro" == "ubuntu" ]; then if [ "$distro" == "arch" ]; then
export CC=gcc-14
export CXX=g++-14
elif [ "$distro" == "debian" ] || [ "$distro" == "ubuntu" ]; then
for file in "${gcc_alternative_files[@]}"; do for file in "${gcc_alternative_files[@]}"; do
file_path="/etc/alternatives/$file" file_path="/etc/alternatives/$file"
if [ -e "$file_path" ]; then if [ -e "$file_path" ]; then
@@ -340,7 +409,7 @@ function run_install() {
# compile cmake if the version is too low # compile cmake if the version is too low
cmake_min="3.25.0" cmake_min="3.25.0"
target_cmake_version="3.30.1" target_cmake_version="3.30.1"
if ! check_version "cmake" "$cmake_min"; then if ! check_version "cmake" "$cmake_min" "inf"; then
cmake_prefix="https://github.com/Kitware/CMake/releases/download/v" cmake_prefix="https://github.com/Kitware/CMake/releases/download/v"
if [ "$architecture" == "x86_64" ]; then if [ "$architecture" == "x86_64" ]; then
cmake_arch="x86_64" cmake_arch="x86_64"
@@ -358,7 +427,8 @@ function run_install() {
# compile doxygen if version is too low # compile doxygen if version is too low
doxygen_min="1.10.0" doxygen_min="1.10.0"
_doxygen_min="1_10_0" _doxygen_min="1_10_0"
if ! check_version "doxygen" "$doxygen_min"; then doxygen_max="1.12.0"
if ! check_version "doxygen" "$doxygen_min" "$doxygen_max"; then
if [ "${SUNSHINE_COMPILE_DOXYGEN}" == "true" ]; then if [ "${SUNSHINE_COMPILE_DOXYGEN}" == "true" ]; then
echo "Compiling doxygen" echo "Compiling doxygen"
doxygen_url="https://github.com/doxygen/doxygen/releases/download/Release_${_doxygen_min}/doxygen-${doxygen_min}.src.tar.gz" doxygen_url="https://github.com/doxygen/doxygen/releases/download/Release_${_doxygen_min}/doxygen-${doxygen_min}.src.tar.gz"
@@ -367,10 +437,10 @@ function run_install() {
tar -xzf "${build_dir}/doxygen.tar.gz" tar -xzf "${build_dir}/doxygen.tar.gz"
cd "doxygen-${doxygen_min}" cd "doxygen-${doxygen_min}"
cmake -DCMAKE_BUILD_TYPE=Release -G="Ninja" -B="build" -S="." cmake -DCMAKE_BUILD_TYPE=Release -G="Ninja" -B="build" -S="."
ninja -C "build" ninja -C "build" -j"${num_processors}"
ninja -C "build" install ninja -C "build" install
else else
echo "Doxygen version too low, skipping docs" echo "Doxygen version not in range, skipping docs"
cmake_args+=("-DBUILD_DOCS=OFF") cmake_args+=("-DBUILD_DOCS=OFF")
fi fi
fi fi
@@ -386,10 +456,10 @@ function run_install() {
fi fi
# run the cuda install # run the cuda install
if [ -n "$cuda_version" ] && [ "$skip_cuda" == 0 ]; then if [ "$skip_cuda" == 0 ]; then
install_cuda install_cuda
cmake_args+=("-DSUNSHINE_ENABLE_CUDA=ON") cmake_args+=("-DSUNSHINE_ENABLE_CUDA=ON")
cmake_args+=("-DCMAKE_CUDA_COMPILER:PATH=${build_dir}/cuda/bin/nvcc") cmake_args+=("-DCMAKE_CUDA_COMPILER:PATH=$nvcc_path")
fi fi
# Cmake stuff here # Cmake stuff here
@@ -429,7 +499,15 @@ function run_install() {
# Determine the OS and call the appropriate function # Determine the OS and call the appropriate function
cat /etc/os-release cat /etc/os-release
if grep -q "Debian GNU/Linux 12 (bookworm)" /etc/os-release; then
if grep -q "Arch Linux" /etc/os-release; then
distro="arch"
version=""
package_update_command="${sudo_cmd} pacman -Syu --noconfirm"
package_install_command="${sudo_cmd} pacman -Sy --needed"
nvm_node=0
gcc_version="14"
elif grep -q "Debian GNU/Linux 12 (bookworm)" /etc/os-release; then
distro="debian" distro="debian"
version="12" version="12"
package_update_command="${sudo_cmd} apt-get update" package_update_command="${sudo_cmd} apt-get update"
@@ -438,24 +516,36 @@ if grep -q "Debian GNU/Linux 12 (bookworm)" /etc/os-release; then
cuda_build="525.60.13" cuda_build="525.60.13"
gcc_version="12" gcc_version="12"
nvm_node=0 nvm_node=0
elif grep -q "PLATFORM_ID=\"platform:f39\"" /etc/os-release; then
distro="fedora"
version="39"
package_update_command="${sudo_cmd} dnf update -y"
package_install_command="${sudo_cmd} dnf install -y"
cuda_version="12.4.0"
cuda_build="550.54.14"
gcc_version="13"
nvm_node=0
elif grep -q "PLATFORM_ID=\"platform:f40\"" /etc/os-release; then elif grep -q "PLATFORM_ID=\"platform:f40\"" /etc/os-release; then
distro="fedora" distro="fedora"
version="40" version="40"
package_update_command="${sudo_cmd} dnf update -y" package_update_command="${sudo_cmd} dnf update -y"
package_install_command="${sudo_cmd} dnf install -y" package_install_command="${sudo_cmd} dnf install -y"
cuda_version= cuda_version=12.6.3
cuda_build= cuda_build=560.35.05
gcc_version="13" gcc_version="13"
nvm_node=0 nvm_node=0
dev_tools_group="Development Tools"
elif grep -q "PLATFORM_ID=\"platform:f41\"" /etc/os-release; then
distro="fedora"
version="41"
package_update_command="${sudo_cmd} dnf update -y"
package_install_command="${sudo_cmd} dnf install -y"
cuda_version=12.6.3
cuda_build=560.35.05
gcc_version="13"
nvm_node=0
dev_tools_group="development-tools"
elif grep -q "PLATFORM_ID=\"platform:f42\"" /etc/os-release; then
distro="fedora"
version="42"
package_update_command="${sudo_cmd} dnf update -y"
package_install_command="${sudo_cmd} dnf install -y"
cuda_version=12.8.1
cuda_build=570.124.06
gcc_version="14"
nvm_node=0
dev_tools_group="development-tools"
elif grep -q "Ubuntu 22.04" /etc/os-release; then elif grep -q "Ubuntu 22.04" /etc/os-release; then
distro="ubuntu" distro="ubuntu"
version="22.04" version="22.04"

View File

@@ -1,2 +1,2 @@
Babel==2.16.0 Babel==2.17.0
clang-format clang-format==20.*

View File

@@ -129,6 +129,10 @@ namespace audio {
void capture(safe::mail_t mail, config_t config, void *channel_data) { void capture(safe::mail_t mail, config_t config, void *channel_data) {
auto shutdown_event = mail->event<bool>(mail::shutdown); auto shutdown_event = mail->event<bool>(mail::shutdown);
if (!config::audio.stream) {
shutdown_event->view();
return;
}
auto stream = stream_configs[map_stream(config.channels, config.flags[config_t::HIGH_QUALITY])]; auto stream = stream_configs[map_stream(config.channels, config.flags[config_t::HIGH_QUALITY])];
if (config.flags[config_t::CUSTOM_SURROUND_PARAMS]) { if (config.flags[config_t::CUSTOM_SURROUND_PARAMS]) {
apply_surround_params(stream, config.customStreamParams); apply_surround_params(stream, config.customStreamParams);

View File

@@ -414,12 +414,7 @@ namespace config {
auto final_resolution = entry.template get_optional<std::string>("final_resolution"s); auto final_resolution = entry.template get_optional<std::string>("final_resolution"s);
auto final_refresh_rate = entry.template get_optional<std::string>("final_refresh_rate"s); auto final_refresh_rate = entry.template get_optional<std::string>("final_refresh_rate"s);
output_field.push_back(video_t::dd_t::mode_remapping_entry_t { output_field.push_back(video_t::dd_t::mode_remapping_entry_t {requested_resolution.value_or(""), requested_fps.value_or(""), final_resolution.value_or(""), final_refresh_rate.value_or("")});
requested_resolution.value_or(""),
requested_fps.value_or(""),
final_resolution.value_or(""),
final_refresh_rate.value_or("")
});
} }
}}; }};
@@ -497,7 +492,7 @@ namespace config {
{}, // output_name {}, // output_name
{ {
video_t::dd_t::config_option_e::verify_only, // configuration_option video_t::dd_t::config_option_e::disabled, // configuration_option
video_t::dd_t::resolution_option_e::automatic, // resolution_option video_t::dd_t::resolution_option_e::automatic, // resolution_option
{}, // manual_resolution {}, // manual_resolution
video_t::dd_t::refresh_rate_option_e::automatic, // refresh_rate_option video_t::dd_t::refresh_rate_option_e::automatic, // refresh_rate_option
@@ -509,12 +504,14 @@ namespace config {
{} // wa {} // wa
}, // display_device }, // display_device
1 // min_fps_factor 1, // min_fps_factor
0 // max_bitrate
}; };
audio_t audio { audio_t audio {
{}, // audio_sink {}, // audio_sink
{}, // virtual_sink {}, // virtual_sink
true, // stream audio
true, // install_steam_drivers true, // install_steam_drivers
}; };
@@ -651,9 +648,13 @@ namespace config {
// Lists might contain newlines // Lists might contain newlines
if (*begin_val == '[') { if (*begin_val == '[') {
endl = skip_list(begin_val + 1, end); endl = skip_list(begin_val + 1, end);
if (endl == end) {
std::cout << "Warning: Config option ["sv << to_string(begin, end_name) << "] Missing ']'"sv;
// Check if we reached the end of the file without finding a closing bracket
// We know we have a valid closing bracket if:
// 1. We didn't reach the end, or
// 2. We reached the end but the last character was the matching closing bracket
if (endl == end && end == begin_val + 1) {
BOOST_LOG(warning) << "config: Missing ']' in config option: " << to_string(begin, end_name);
return std::make_pair(endl, std::nullopt); return std::make_pair(endl, std::nullopt);
} }
} }
@@ -987,7 +988,7 @@ namespace config {
// The list needs to be a multiple of 2 // The list needs to be a multiple of 2
if (list.size() % 2) { if (list.size() % 2) {
std::cout << "Warning: expected "sv << name << " to have a multiple of two elements --> not "sv << list.size() << std::endl; BOOST_LOG(warning) << "config: expected "sv << name << " to have a multiple of two elements --> not "sv << list.size();
return; return;
} }
@@ -1017,7 +1018,7 @@ namespace config {
config::sunshine.flags[config::flag::UPNP].flip(); config::sunshine.flags[config::flag::UPNP].flip();
break; break;
default: default:
std::cout << "Warning: Unrecognized flag: ["sv << *line << ']' << std::endl; BOOST_LOG(warning) << "config: Unrecognized flag: ["sv << *line << ']' << std::endl;
ret = -1; ret = -1;
} }
@@ -1043,7 +1044,8 @@ namespace config {
} }
for (auto &[name, val] : vars) { for (auto &[name, val] : vars) {
std::cout << "["sv << name << "] -- ["sv << val << ']' << std::endl; BOOST_LOG(info) << "config: '"sv << name << "' = "sv << val;
modified_config_settings[name] = val;
} }
int_f(vars, "qp", video.qp); int_f(vars, "qp", video.qp);
@@ -1135,9 +1137,14 @@ namespace config {
} }
bool_f(vars, "dd_config_revert_on_disconnect", video.dd.config_revert_on_disconnect); bool_f(vars, "dd_config_revert_on_disconnect", video.dd.config_revert_on_disconnect);
generic_f(vars, "dd_mode_remapping", video.dd.mode_remapping, dd::mode_remapping_from_view); generic_f(vars, "dd_mode_remapping", video.dd.mode_remapping, dd::mode_remapping_from_view);
bool_f(vars, "dd_wa_hdr_toggle", video.dd.wa.hdr_toggle); {
int value = 0;
int_between_f(vars, "dd_wa_hdr_toggle_delay", value, {0, 3000});
video.dd.wa.hdr_toggle_delay = std::chrono::milliseconds {value};
}
int_between_f(vars, "min_fps_factor", video.min_fps_factor, {1, 3}); int_between_f(vars, "min_fps_factor", video.min_fps_factor, {1, 3});
int_f(vars, "max_bitrate", video.max_bitrate);
path_f(vars, "pkey", nvhttp.pkey); path_f(vars, "pkey", nvhttp.pkey);
path_f(vars, "cert", nvhttp.cert); path_f(vars, "cert", nvhttp.cert);
@@ -1154,6 +1161,7 @@ namespace config {
string_f(vars, "audio_sink", audio.sink); string_f(vars, "audio_sink", audio.sink);
string_f(vars, "virtual_sink", audio.virtual_sink); string_f(vars, "virtual_sink", audio.virtual_sink);
bool_f(vars, "stream_audio", audio.stream);
bool_f(vars, "install_steam_audio_drivers", audio.install_steam_drivers); bool_f(vars, "install_steam_audio_drivers", audio.install_steam_drivers);
string_restricted_f(vars, "origin_web_ui_allowed", nvhttp.origin_web_ui_allowed, {"pc"sv, "lan"sv, "wan"sv}); string_restricted_f(vars, "origin_web_ui_allowed", nvhttp.origin_web_ui_allowed, {"pc"sv, "lan"sv, "wan"sv});
@@ -1419,7 +1427,7 @@ namespace config {
shell_exec_info.nShow = SW_NORMAL; shell_exec_info.nShow = SW_NORMAL;
if (!ShellExecuteExW(&shell_exec_info)) { if (!ShellExecuteExW(&shell_exec_info)) {
auto winerr = GetLastError(); auto winerr = GetLastError();
std::cout << "Error: ShellExecuteEx() failed:"sv << winerr << std::endl; BOOST_LOG(error) << "Failed executing shell command: " << winerr << std::endl;
return 1; return 1;
} }

View File

@@ -16,6 +16,9 @@
#include "nvenc/nvenc_config.h" #include "nvenc/nvenc_config.h"
namespace config { namespace config {
// track modified config options
inline std::unordered_map<std::string, std::string> modified_config_settings;
struct video_t { struct video_t {
// ffmpeg params // ffmpeg params
int qp; // higher == more compression and less quality int qp; // higher == more compression and less quality
@@ -84,7 +87,7 @@ namespace config {
struct dd_t { struct dd_t {
struct workarounds_t { struct workarounds_t {
bool hdr_toggle; ///< Specify whether to apply HDR high-contrast color workaround. std::chrono::milliseconds hdr_toggle_delay; ///< Specify whether to apply HDR high-contrast color workaround and what delay to use.
}; };
enum class config_option_e { enum class config_option_e {
@@ -138,11 +141,13 @@ namespace config {
} dd; } dd;
int min_fps_factor; // Minimum fps target, determines minimum frame time int min_fps_factor; // Minimum fps target, determines minimum frame time
int max_bitrate; // Maximum bitrate, sets ceiling in kbps for bitrate requested from client
}; };
struct audio_t { struct audio_t {
std::string sink; std::string sink;
std::string virtual_sink; std::string virtual_sink;
bool stream;
bool install_steam_drivers; bool install_steam_drivers;
}; };

View File

@@ -621,7 +621,7 @@ namespace display_device {
std::make_shared<FileSettingsPersistence>(persistence_filepath) std::make_shared<FileSettingsPersistence>(persistence_filepath)
), ),
WinWorkarounds { WinWorkarounds {
.m_hdr_blank_delay = video_config.dd.wa.hdr_toggle ? std::make_optional(500ms) : std::nullopt .m_hdr_blank_delay = video_config.dd.wa.hdr_toggle_delay != std::chrono::milliseconds::zero() ? std::make_optional(video_config.dd.wa.hdr_toggle_delay) : std::nullopt
} }
); );
#else #else

View File

@@ -23,7 +23,7 @@ namespace http {
); );
int reload_user_creds(const std::string &file); int reload_user_creds(const std::string &file);
bool download_file(const std::string &url, const std::string &file, long ssl_version = CURL_SSLVERSION_TLSv1_3); bool download_file(const std::string &url, const std::string &file, long ssl_version = CURL_SSLVERSION_TLSv1_2);
std::string url_escape(const std::string &url); std::string url_escape(const std::string &url);
std::string url_get_host(const std::string &url); std::string url_get_host(const std::string &url);

View File

@@ -106,6 +106,7 @@ int main(int argc, char *argv[]) {
mail::man = std::make_shared<safe::mail_raw_t>(); mail::man = std::make_shared<safe::mail_raw_t>();
// parse config file
if (config::parse(argc, argv)) { if (config::parse(argc, argv)) {
return 0; return 0;
} }
@@ -123,6 +124,12 @@ int main(int argc, char *argv[]) {
// Log publisher metadata // Log publisher metadata
log_publisher_data(); log_publisher_data();
// Log modified_config_settings
for (auto &[name, val] : config::modified_config_settings) {
BOOST_LOG(info) << "config: '"sv << name << "' = "sv << val;
}
config::modified_config_settings.clear();
if (!config::sunshine.cmd.name.empty()) { if (!config::sunshine.cmd.name.empty()) {
auto fn = cmd_to_func.find(config::sunshine.cmd.name); auto fn = cmd_to_func.find(config::sunshine.cmd.name);
if (fn == std::end(cmd_to_func)) { if (fn == std::end(cmd_to_func)) {

View File

@@ -186,7 +186,7 @@ namespace net {
std::uint16_t map_port(int port) { std::uint16_t map_port(int port) {
// calculate the port from the config port // calculate the port from the config port
auto mapped_port = (std::uint16_t)((int) config::sunshine.port + port); auto mapped_port = (std::uint16_t) ((int) config::sunshine.port + port);
// Ensure port is in the range of 1024-65535 // Ensure port is in the range of 1024-65535
if (mapped_port < 1024 || mapped_port > 65535) { if (mapped_port < 1024 || mapped_port > 65535) {

View File

@@ -528,7 +528,7 @@ namespace nvenc {
NV_ENC_LOCK_BITSTREAM lock_bitstream = {min_struct_version(NV_ENC_LOCK_BITSTREAM_VER, 1, 2)}; NV_ENC_LOCK_BITSTREAM lock_bitstream = {min_struct_version(NV_ENC_LOCK_BITSTREAM_VER, 1, 2)};
lock_bitstream.outputBitstream = output_bitstream; lock_bitstream.outputBitstream = output_bitstream;
lock_bitstream.doNotWait = 0; lock_bitstream.doNotWait = async_event_handle ? 1 : 0;
if (async_event_handle && !wait_for_async_event(100)) { if (async_event_handle && !wait_for_async_event(100)) {
BOOST_LOG(error) << "NvEnc: frame " << frame_index << " encode wait timeout"; BOOST_LOG(error) << "NvEnc: frame " << frame_index << " encode wait timeout";

View File

@@ -10,11 +10,19 @@
namespace nvenc { namespace nvenc {
nvenc_d3d11::nvenc_d3d11(NV_ENC_DEVICE_TYPE device_type):
nvenc_base(device_type) {
async_event_handle = CreateEvent(NULL, FALSE, FALSE, NULL);
}
nvenc_d3d11::~nvenc_d3d11() { nvenc_d3d11::~nvenc_d3d11() {
if (dll) { if (dll) {
FreeLibrary(dll); FreeLibrary(dll);
dll = NULL; dll = NULL;
} }
if (async_event_handle) {
CloseHandle(async_event_handle);
}
} }
bool nvenc_d3d11::init_library() { bool nvenc_d3d11::init_library() {
@@ -53,5 +61,9 @@ namespace nvenc {
return false; return false;
} }
bool nvenc_d3d11::wait_for_async_event(uint32_t timeout_ms) {
return WaitForSingleObject(async_event_handle, timeout_ms) == WAIT_OBJECT_0;
}
} // namespace nvenc } // namespace nvenc
#endif #endif

View File

@@ -25,10 +25,7 @@ namespace nvenc {
*/ */
class nvenc_d3d11: public nvenc_base { class nvenc_d3d11: public nvenc_base {
public: public:
explicit nvenc_d3d11(NV_ENC_DEVICE_TYPE device_type): explicit nvenc_d3d11(NV_ENC_DEVICE_TYPE device_type);
nvenc_base(device_type) {
}
~nvenc_d3d11(); ~nvenc_d3d11();
/** /**
@@ -39,6 +36,7 @@ namespace nvenc {
protected: protected:
bool init_library() override; bool init_library() override;
bool wait_for_async_event(uint32_t timeout_ms) override;
private: private:
HMODULE dll = NULL; HMODULE dll = NULL;

View File

@@ -106,6 +106,7 @@ namespace platf {
rumble_triggers, ///< Rumble triggers rumble_triggers, ///< Rumble triggers
set_motion_event_state, ///< Set motion event state set_motion_event_state, ///< Set motion event state
set_rgb_led, ///< Set RGB LED set_rgb_led, ///< Set RGB LED
set_adaptive_triggers, ///< Set adaptive triggers
}; };
struct gamepad_feedback_msg_t { struct gamepad_feedback_msg_t {
@@ -142,6 +143,14 @@ namespace platf {
return msg; return msg;
} }
static gamepad_feedback_msg_t make_adaptive_triggers(std::uint16_t id, uint8_t event_flags, uint8_t type_left, uint8_t type_right, const std::array<uint8_t, 10> &left, const std::array<uint8_t, 10> &right) {
gamepad_feedback_msg_t msg;
msg.type = gamepad_feedback_e::set_adaptive_triggers;
msg.id = id;
msg.data.adaptive_triggers = {.event_flags = event_flags, .type_left = type_left, .type_right = type_right, .left = left, .right = right};
return msg;
}
gamepad_feedback_e type; gamepad_feedback_e type;
std::uint16_t id; std::uint16_t id;
@@ -166,6 +175,15 @@ namespace platf {
std::uint8_t g; std::uint8_t g;
std::uint8_t b; std::uint8_t b;
} rgb_led; } rgb_led;
struct {
uint16_t controllerNumber;
uint8_t event_flags;
uint8_t type_left;
uint8_t type_right;
std::array<uint8_t, 10> left;
std::array<uint8_t, 10> right;
} adaptive_triggers;
} data; } data;
}; };

View File

@@ -19,7 +19,7 @@ extern "C" {
// There aren't that many DRM_FORMAT I need to use, so define them here // There aren't that many DRM_FORMAT I need to use, so define them here
// //
// They aren't likely to change any time soon. // They aren't likely to change any time soon.
#define fourcc_code(a, b, c, d) ((std::uint32_t)(a) | ((std::uint32_t)(b) << 8) | ((std::uint32_t)(c) << 16) | ((std::uint32_t)(d) << 24)) #define fourcc_code(a, b, c, d) ((std::uint32_t) (a) | ((std::uint32_t) (b) << 8) | ((std::uint32_t) (c) << 16) | ((std::uint32_t) (d) << 24))
#define fourcc_mod_code(vendor, val) ((((uint64_t) vendor) << 56) | ((val) & 0x00ffffffffffffffULL)) #define fourcc_mod_code(vendor, val) ((((uint64_t) vendor) << 56) | ((val) & 0x00ffffffffffffffULL))
#define DRM_FORMAT_MOD_INVALID fourcc_mod_code(0, ((1ULL << 56) - 1)) #define DRM_FORMAT_MOD_INVALID fourcc_mod_code(0, ((1ULL << 56) - 1))

View File

@@ -43,7 +43,7 @@ namespace platf::gamepad {
} }
auto create_ds5() { auto create_ds5() {
return inputtino::PS5Joypad::create({.name = "Sunshine DualSense (virtual) pad", .vendor_id = 0x054C, .product_id = 0x0CE6, .version = 0x8111}); return inputtino::PS5Joypad::create({.name = "Sunshine PS5 (virtual) pad", .vendor_id = 0x054C, .product_id = 0x0CE6, .version = 0x8111});
} }
int alloc(input_raw_t *raw, const gamepad_id_t &id, const gamepad_arrival_t &metadata, feedback_queue_t feedback_queue) { int alloc(input_raw_t *raw, const gamepad_id_t &id, const gamepad_arrival_t &metadata, feedback_queue_t feedback_queue) {
@@ -152,6 +152,10 @@ namespace platf::gamepad {
gamepad->last_rgb_led = msg; gamepad->last_rgb_led = msg;
}); });
(*ds5).set_on_trigger_effect([feedback_queue, idx = id.clientRelativeIndex](const inputtino::PS5Joypad::TriggerEffect &trigger_effect) {
feedback_queue->raise(gamepad_feedback_msg_t::make_adaptive_triggers(idx, trigger_effect.event_flags, trigger_effect.type_left, trigger_effect.type_right, trigger_effect.left, trigger_effect.right));
});
// Activate the motion sensors // Activate the motion sensors
feedback_queue->raise(gamepad_feedback_msg_t::make_motion_event_state(id.clientRelativeIndex, LI_MOTION_TYPE_ACCEL, 100)); feedback_queue->raise(gamepad_feedback_msg_t::make_motion_event_state(id.clientRelativeIndex, LI_MOTION_TYPE_ACCEL, 100));
feedback_queue->raise(gamepad_feedback_msg_t::make_motion_event_state(id.clientRelativeIndex, LI_MOTION_TYPE_GYRO, 100)); feedback_queue->raise(gamepad_feedback_msg_t::make_motion_event_state(id.clientRelativeIndex, LI_MOTION_TYPE_GYRO, 100));

View File

@@ -6,9 +6,14 @@
#include <cstdlib> #include <cstdlib>
// platform includes // platform includes
#include <drm_fourcc.h>
#include <fcntl.h>
#include <gbm.h>
#include <poll.h> #include <poll.h>
#include <unistd.h>
#include <wayland-client.h> #include <wayland-client.h>
#include <wayland-util.h> #include <wayland-util.h>
#include <xf86drm.h>
// local includes // local includes
#include "graphics.h" #include "graphics.h"
@@ -37,6 +42,12 @@ namespace wl {
#define CLASS_CALL(c, m) classCall<c, decltype(&c::m), &c::m> #define CLASS_CALL(c, m) classCall<c, decltype(&c::m), &c::m>
// Define buffer params listener
static const struct zwp_linux_buffer_params_v1_listener params_listener = {
.created = dmabuf_t::buffer_params_created,
.failed = dmabuf_t::buffer_params_failed
};
int display_t::init(const char *display_name) { int display_t::init(const char *display_name) {
if (!display_name) { if (!display_name) {
display_name = std::getenv("WAYLAND_DISPLAY"); display_name = std::getenv("WAYLAND_DISPLAY");
@@ -136,7 +147,13 @@ namespace wl {
BOOST_LOG(info) << "Logical size: "sv << width << 'x' << height; BOOST_LOG(info) << "Logical size: "sv << width << 'x' << height;
} }
void monitor_t::wl_mode(wl_output *wl_output, std::uint32_t flags, std::int32_t width, std::int32_t height, std::int32_t refresh) { void monitor_t::wl_mode(
wl_output *wl_output,
std::uint32_t flags,
std::int32_t width,
std::int32_t height,
std::int32_t refresh
) {
viewport.width = width; viewport.width = width;
viewport.height = height; viewport.height = height;
@@ -151,6 +168,8 @@ namespace wl {
interface_t::interface_t() noexcept interface_t::interface_t() noexcept
: :
screencopy_manager {nullptr},
dmabuf_interface {nullptr},
output_manager {nullptr}, output_manager {nullptr},
listener { listener {
&CLASS_CALL(interface_t, add_interface), &CLASS_CALL(interface_t, add_interface),
@@ -162,7 +181,12 @@ namespace wl {
wl_registry_add_listener(registry, &listener, this); wl_registry_add_listener(registry, &listener, this);
} }
void interface_t::add_interface(wl_registry *registry, std::uint32_t id, const char *interface, std::uint32_t version) { void interface_t::add_interface(
wl_registry *registry,
std::uint32_t id,
const char *interface,
std::uint32_t version
) {
BOOST_LOG(debug) << "Available interface: "sv << interface << '(' << id << ") version "sv << version; BOOST_LOG(debug) << "Available interface: "sv << interface << '(' << id << ") version "sv << version;
if (!std::strcmp(interface, wl_output_interface.name)) { if (!std::strcmp(interface, wl_output_interface.name)) {
@@ -177,11 +201,16 @@ namespace wl {
output_manager = (zxdg_output_manager_v1 *) wl_registry_bind(registry, id, &zxdg_output_manager_v1_interface, version); output_manager = (zxdg_output_manager_v1 *) wl_registry_bind(registry, id, &zxdg_output_manager_v1_interface, version);
this->interface[XDG_OUTPUT] = true; this->interface[XDG_OUTPUT] = true;
} else if (!std::strcmp(interface, zwlr_export_dmabuf_manager_v1_interface.name)) { } else if (!std::strcmp(interface, zwlr_screencopy_manager_v1_interface.name)) {
BOOST_LOG(info) << "Found interface: "sv << interface << '(' << id << ") version "sv << version; BOOST_LOG(info) << "Found interface: "sv << interface << '(' << id << ") version "sv << version;
dmabuf_manager = (zwlr_export_dmabuf_manager_v1 *) wl_registry_bind(registry, id, &zwlr_export_dmabuf_manager_v1_interface, version); screencopy_manager = (zwlr_screencopy_manager_v1 *) wl_registry_bind(registry, id, &zwlr_screencopy_manager_v1_interface, version);
this->interface[WLR_EXPORT_DMABUF] = true; this->interface[WLR_EXPORT_DMABUF] = true;
} else if (!std::strcmp(interface, zwp_linux_dmabuf_v1_interface.name)) {
BOOST_LOG(info) << "Found interface: "sv << interface << '(' << id << ") version "sv << version;
dmabuf_interface = (zwp_linux_dmabuf_v1 *) wl_registry_bind(registry, id, &zwp_linux_dmabuf_v1_interface, version);
this->interface[LINUX_DMABUF] = true;
} }
} }
@@ -189,94 +218,306 @@ namespace wl {
BOOST_LOG(info) << "Delete: "sv << id; BOOST_LOG(info) << "Delete: "sv << id;
} }
// Initialize GBM
bool dmabuf_t::init_gbm() {
if (gbm_device) {
return true;
}
// Find render node
drmDevice *devices[16];
int n = drmGetDevices2(0, devices, 16);
if (n <= 0) {
BOOST_LOG(error) << "No DRM devices found"sv;
return false;
}
int drm_fd = -1;
for (int i = 0; i < n; i++) {
if (devices[i]->available_nodes & (1 << DRM_NODE_RENDER)) {
drm_fd = open(devices[i]->nodes[DRM_NODE_RENDER], O_RDWR);
if (drm_fd >= 0) {
break;
}
}
}
drmFreeDevices(devices, n);
if (drm_fd < 0) {
BOOST_LOG(error) << "Failed to open DRM render node"sv;
return false;
}
gbm_device = gbm_create_device(drm_fd);
if (!gbm_device) {
close(drm_fd);
BOOST_LOG(error) << "Failed to create GBM device"sv;
return false;
}
return true;
}
// Cleanup GBM
void dmabuf_t::cleanup_gbm() {
if (current_bo) {
gbm_bo_destroy(current_bo);
current_bo = nullptr;
}
if (current_wl_buffer) {
wl_buffer_destroy(current_wl_buffer);
current_wl_buffer = nullptr;
}
}
dmabuf_t::dmabuf_t(): dmabuf_t::dmabuf_t():
status {READY}, status {READY},
frames {}, frames {},
current_frame {&frames[0]}, current_frame {&frames[0]},
listener { listener {
&CLASS_CALL(dmabuf_t, frame), &CLASS_CALL(dmabuf_t, buffer),
&CLASS_CALL(dmabuf_t, object), &CLASS_CALL(dmabuf_t, flags),
&CLASS_CALL(dmabuf_t, ready), &CLASS_CALL(dmabuf_t, ready),
&CLASS_CALL(dmabuf_t, cancel) &CLASS_CALL(dmabuf_t, failed),
&CLASS_CALL(dmabuf_t, damage),
&CLASS_CALL(dmabuf_t, linux_dmabuf),
&CLASS_CALL(dmabuf_t, buffer_done),
} { } {
} }
void dmabuf_t::listen(zwlr_export_dmabuf_manager_v1 *dmabuf_manager, wl_output *output, bool blend_cursor) { // Start capture
auto frame = zwlr_export_dmabuf_manager_v1_capture_output(dmabuf_manager, blend_cursor, output); void dmabuf_t::listen(
zwlr_export_dmabuf_frame_v1_add_listener(frame, &listener, this); zwlr_screencopy_manager_v1 *screencopy_manager,
zwp_linux_dmabuf_v1 *dmabuf_interface,
wl_output *output,
bool blend_cursor
) {
this->dmabuf_interface = dmabuf_interface;
// Reset state
shm_info.supported = false;
dmabuf_info.supported = false;
// Create new frame
auto frame = zwlr_screencopy_manager_v1_capture_output(
screencopy_manager,
blend_cursor ? 1 : 0,
output
);
// Store frame data pointer for callbacks
zwlr_screencopy_frame_v1_set_user_data(frame, this);
// Add listener
zwlr_screencopy_frame_v1_add_listener(frame, &listener, this);
status = WAITING; status = WAITING;
} }
dmabuf_t::~dmabuf_t() { dmabuf_t::~dmabuf_t() {
cleanup_gbm();
for (auto &frame : frames) { for (auto &frame : frames) {
frame.destroy(); frame.destroy();
} }
if (gbm_device) {
// We should close the DRM FD, but it's owned by GBM
gbm_device_destroy(gbm_device);
gbm_device = nullptr;
}
} }
void dmabuf_t::frame( // Buffer format callback
zwlr_export_dmabuf_frame_v1 *frame, void dmabuf_t::buffer(
std::uint32_t width, zwlr_screencopy_frame_v1 *frame,
std::uint32_t height, uint32_t format,
std::uint32_t x, uint32_t width,
std::uint32_t y, uint32_t height,
std::uint32_t buffer_flags, uint32_t stride
std::uint32_t flags, ) {
shm_info.supported = true;
shm_info.format = format;
shm_info.width = width;
shm_info.height = height;
shm_info.stride = stride;
BOOST_LOG(debug) << "Screencopy supports SHM format: "sv << format;
}
// DMA-BUF format callback
void dmabuf_t::linux_dmabuf(
zwlr_screencopy_frame_v1 *frame,
std::uint32_t format, std::uint32_t format,
std::uint32_t high, std::uint32_t width,
std::uint32_t low, std::uint32_t height
std::uint32_t obj_count
) { ) {
auto next_frame = get_next_frame(); dmabuf_info.supported = true;
dmabuf_info.format = format;
dmabuf_info.width = width;
dmabuf_info.height = height;
next_frame->sd.fourcc = format; BOOST_LOG(debug) << "Screencopy supports DMA-BUF format: "sv << format;
next_frame->sd.width = width;
next_frame->sd.height = height;
next_frame->sd.modifier = (((std::uint64_t) high) << 32) | low;
} }
void dmabuf_t::object( // Flags callback
zwlr_export_dmabuf_frame_v1 *frame, void dmabuf_t::flags(zwlr_screencopy_frame_v1 *frame, std::uint32_t flags) {
std::uint32_t index, y_invert = flags & ZWLR_SCREENCOPY_FRAME_V1_FLAGS_Y_INVERT;
std::int32_t fd, BOOST_LOG(debug) << "Frame flags: "sv << flags << (y_invert ? " (y_invert)" : "");
std::uint32_t size,
std::uint32_t offset,
std::uint32_t stride,
std::uint32_t plane_index
) {
auto next_frame = get_next_frame();
next_frame->sd.fds[plane_index] = fd;
next_frame->sd.pitches[plane_index] = stride;
next_frame->sd.offsets[plane_index] = offset;
} }
// DMA-BUF creation helper
void dmabuf_t::create_and_copy_dmabuf(zwlr_screencopy_frame_v1 *frame) {
if (!init_gbm()) {
BOOST_LOG(error) << "Failed to initialize GBM"sv;
zwlr_screencopy_frame_v1_destroy(frame);
status = REINIT;
return;
}
// Create GBM buffer
current_bo = gbm_bo_create(gbm_device, dmabuf_info.width, dmabuf_info.height, dmabuf_info.format, GBM_BO_USE_RENDERING);
if (!current_bo) {
BOOST_LOG(error) << "Failed to create GBM buffer"sv;
zwlr_screencopy_frame_v1_destroy(frame);
status = REINIT;
return;
}
// Get buffer info
int fd = gbm_bo_get_fd(current_bo);
if (fd < 0) {
BOOST_LOG(error) << "Failed to get buffer FD"sv;
gbm_bo_destroy(current_bo);
current_bo = nullptr;
zwlr_screencopy_frame_v1_destroy(frame);
status = REINIT;
return;
}
uint32_t stride = gbm_bo_get_stride(current_bo);
uint64_t modifier = gbm_bo_get_modifier(current_bo);
// Store in surface descriptor for later use
auto next_frame = get_next_frame();
next_frame->sd.fds[0] = fd;
next_frame->sd.pitches[0] = stride;
next_frame->sd.offsets[0] = 0;
next_frame->sd.modifier = modifier;
// Create linux-dmabuf buffer
auto params = zwp_linux_dmabuf_v1_create_params(dmabuf_interface);
zwp_linux_buffer_params_v1_add(params, fd, 0, 0, stride, modifier >> 32, modifier & 0xffffffff);
// Add listener for buffer creation
zwp_linux_buffer_params_v1_add_listener(params, &params_listener, frame);
// Create Wayland buffer (async - callback will handle copy)
zwp_linux_buffer_params_v1_create(params, dmabuf_info.width, dmabuf_info.height, dmabuf_info.format, 0);
}
// Buffer done callback - time to create buffer
void dmabuf_t::buffer_done(zwlr_screencopy_frame_v1 *frame) {
auto next_frame = get_next_frame();
// Prefer DMA-BUF if supported
if (dmabuf_info.supported && dmabuf_interface) {
// Store format info first
next_frame->sd.fourcc = dmabuf_info.format;
next_frame->sd.width = dmabuf_info.width;
next_frame->sd.height = dmabuf_info.height;
// Create and start copy
create_and_copy_dmabuf(frame);
} else if (shm_info.supported) {
// SHM fallback would go here
BOOST_LOG(warning) << "SHM capture not implemented"sv;
zwlr_screencopy_frame_v1_destroy(frame);
status = REINIT;
} else {
BOOST_LOG(error) << "No supported buffer types"sv;
zwlr_screencopy_frame_v1_destroy(frame);
status = REINIT;
}
}
// Buffer params created callback
void dmabuf_t::buffer_params_created(
void *data,
struct zwp_linux_buffer_params_v1 *params,
struct wl_buffer *buffer
) {
auto frame = static_cast<zwlr_screencopy_frame_v1 *>(data);
auto self = static_cast<dmabuf_t *>(zwlr_screencopy_frame_v1_get_user_data(frame));
// Store for cleanup
self->current_wl_buffer = buffer;
// Start the actual copy
zwlr_screencopy_frame_v1_copy(frame, buffer);
}
// Buffer params failed callback
void dmabuf_t::buffer_params_failed(
void *data,
struct zwp_linux_buffer_params_v1 *params
) {
auto frame = static_cast<zwlr_screencopy_frame_v1 *>(data);
auto self = static_cast<dmabuf_t *>(zwlr_screencopy_frame_v1_get_user_data(frame));
BOOST_LOG(error) << "Failed to create buffer from params"sv;
self->cleanup_gbm();
zwlr_screencopy_frame_v1_destroy(frame);
self->status = REINIT;
}
// Ready callback
void dmabuf_t::ready( void dmabuf_t::ready(
zwlr_export_dmabuf_frame_v1 *frame, zwlr_screencopy_frame_v1 *frame,
std::uint32_t tv_sec_hi, std::uint32_t tv_sec_hi,
std::uint32_t tv_sec_lo, std::uint32_t tv_sec_lo,
std::uint32_t tv_nsec std::uint32_t tv_nsec
) { ) {
zwlr_export_dmabuf_frame_v1_destroy(frame); BOOST_LOG(debug) << "Frame ready"sv;
// Frame is ready for use, GBM buffer now contains screen content
current_frame->destroy(); current_frame->destroy();
current_frame = get_next_frame(); current_frame = get_next_frame();
// Keep the GBM buffer alive but destroy the Wayland objects
if (current_wl_buffer) {
wl_buffer_destroy(current_wl_buffer);
current_wl_buffer = nullptr;
}
cleanup_gbm();
zwlr_screencopy_frame_v1_destroy(frame);
status = READY; status = READY;
} }
void dmabuf_t::cancel( // Failed callback
zwlr_export_dmabuf_frame_v1 *frame, void dmabuf_t::failed(zwlr_screencopy_frame_v1 *frame) {
std::uint32_t reason BOOST_LOG(error) << "Frame capture failed"sv;
) {
zwlr_export_dmabuf_frame_v1_destroy(frame);
// Clean up resources
cleanup_gbm();
auto next_frame = get_next_frame(); auto next_frame = get_next_frame();
next_frame->destroy(); next_frame->destroy();
zwlr_screencopy_frame_v1_destroy(frame);
status = REINIT; status = REINIT;
} }
void dmabuf_t::damage(
zwlr_screencopy_frame_v1 *frame,
std::uint32_t x,
std::uint32_t y,
std::uint32_t width,
std::uint32_t height
) {};
void frame_t::destroy() { void frame_t::destroy() {
for (auto x = 0; x < 4; ++x) { for (auto x = 0; x < 4; ++x) {
if (sd.fds[x] >= 0) { if (sd.fds[x] >= 0) {

View File

@@ -8,7 +8,8 @@
#include <bitset> #include <bitset>
#ifdef SUNSHINE_BUILD_WAYLAND #ifdef SUNSHINE_BUILD_WAYLAND
#include <wlr-export-dmabuf-unstable-v1.h> #include <linux-dmabuf-unstable-v1.h>
#include <wlr-screencopy-unstable-v1.h>
#include <xdg-output-unstable-v1.h> #include <xdg-output-unstable-v1.h>
#endif #endif
@@ -27,9 +28,9 @@ namespace wl {
class frame_t { class frame_t {
public: public:
frame_t(); frame_t();
egl::surface_descriptor_t sd;
void destroy(); void destroy();
egl::surface_descriptor_t sd;
}; };
class dmabuf_t { class dmabuf_t {
@@ -40,104 +41,91 @@ namespace wl {
REINIT, ///< Reinitialize the frame REINIT, ///< Reinitialize the frame
}; };
dmabuf_t();
~dmabuf_t();
dmabuf_t(dmabuf_t &&) = delete; dmabuf_t(dmabuf_t &&) = delete;
dmabuf_t(const dmabuf_t &) = delete; dmabuf_t(const dmabuf_t &) = delete;
dmabuf_t &operator=(const dmabuf_t &) = delete; dmabuf_t &operator=(const dmabuf_t &) = delete;
dmabuf_t &operator=(dmabuf_t &&) = delete; dmabuf_t &operator=(dmabuf_t &&) = delete;
dmabuf_t(); void listen(zwlr_screencopy_manager_v1 *screencopy_manager, zwp_linux_dmabuf_v1 *dmabuf_interface, wl_output *output, bool blend_cursor = false);
static void buffer_params_created(void *data, struct zwp_linux_buffer_params_v1 *params, struct wl_buffer *wl_buffer);
static void buffer_params_failed(void *data, struct zwp_linux_buffer_params_v1 *params);
void buffer(zwlr_screencopy_frame_v1 *frame, std::uint32_t format, std::uint32_t width, std::uint32_t height, std::uint32_t stride);
void linux_dmabuf(zwlr_screencopy_frame_v1 *frame, std::uint32_t format, std::uint32_t width, std::uint32_t height);
void buffer_done(zwlr_screencopy_frame_v1 *frame);
void flags(zwlr_screencopy_frame_v1 *frame, std::uint32_t flags);
void damage(zwlr_screencopy_frame_v1 *frame, std::uint32_t x, std::uint32_t y, std::uint32_t width, std::uint32_t height);
void ready(zwlr_screencopy_frame_v1 *frame, std::uint32_t tv_sec_hi, std::uint32_t tv_sec_lo, std::uint32_t tv_nsec);
void failed(zwlr_screencopy_frame_v1 *frame);
void listen(zwlr_export_dmabuf_manager_v1 *dmabuf_manager, wl_output *output, bool blend_cursor = false); frame_t *get_next_frame() {
~dmabuf_t();
void frame(
zwlr_export_dmabuf_frame_v1 *frame,
std::uint32_t width,
std::uint32_t height,
std::uint32_t x,
std::uint32_t y,
std::uint32_t buffer_flags,
std::uint32_t flags,
std::uint32_t format,
std::uint32_t high,
std::uint32_t low,
std::uint32_t obj_count
);
void object(
zwlr_export_dmabuf_frame_v1 *frame,
std::uint32_t index,
std::int32_t fd,
std::uint32_t size,
std::uint32_t offset,
std::uint32_t stride,
std::uint32_t plane_index
);
void ready(
zwlr_export_dmabuf_frame_v1 *frame,
std::uint32_t tv_sec_hi,
std::uint32_t tv_sec_lo,
std::uint32_t tv_nsec
);
void cancel(
zwlr_export_dmabuf_frame_v1 *frame,
std::uint32_t reason
);
inline frame_t *get_next_frame() {
return current_frame == &frames[0] ? &frames[1] : &frames[0]; return current_frame == &frames[0] ? &frames[1] : &frames[0];
} }
status_e status; status_e status;
std::array<frame_t, 2> frames; std::array<frame_t, 2> frames;
frame_t *current_frame; frame_t *current_frame;
zwlr_screencopy_frame_v1_listener listener;
zwlr_export_dmabuf_frame_v1_listener listener; private:
bool init_gbm();
void cleanup_gbm();
void create_and_copy_dmabuf(zwlr_screencopy_frame_v1 *frame);
zwp_linux_dmabuf_v1 *dmabuf_interface {nullptr};
struct {
bool supported {false};
std::uint32_t format;
std::uint32_t width;
std::uint32_t height;
std::uint32_t stride;
} shm_info;
struct {
bool supported {false};
std::uint32_t format;
std::uint32_t width;
std::uint32_t height;
} dmabuf_info;
struct gbm_device *gbm_device {nullptr};
struct gbm_bo *current_bo {nullptr};
struct wl_buffer *current_wl_buffer {nullptr};
bool y_invert {false};
}; };
class monitor_t { class monitor_t {
public: public:
explicit monitor_t(wl_output *output);
monitor_t(monitor_t &&) = delete; monitor_t(monitor_t &&) = delete;
monitor_t(const monitor_t &) = delete; monitor_t(const monitor_t &) = delete;
monitor_t &operator=(const monitor_t &) = delete; monitor_t &operator=(const monitor_t &) = delete;
monitor_t &operator=(monitor_t &&) = delete; monitor_t &operator=(monitor_t &&) = delete;
monitor_t(wl_output *output); void listen(zxdg_output_manager_v1 *output_manager);
void xdg_name(zxdg_output_v1 *, const char *name); void xdg_name(zxdg_output_v1 *, const char *name);
void xdg_description(zxdg_output_v1 *, const char *description); void xdg_description(zxdg_output_v1 *, const char *description);
void xdg_position(zxdg_output_v1 *, std::int32_t x, std::int32_t y); void xdg_position(zxdg_output_v1 *, std::int32_t x, std::int32_t y);
void xdg_size(zxdg_output_v1 *, std::int32_t width, std::int32_t height); void xdg_size(zxdg_output_v1 *, std::int32_t width, std::int32_t height);
void xdg_done(zxdg_output_v1 *) { void xdg_done(zxdg_output_v1 *) {}
}
void wl_geometry(wl_output *wl_output, std::int32_t x, std::int32_t y, std::int32_t physical_width, std::int32_t physical_height, std::int32_t subpixel, const char *make, const char *model, std::int32_t transform) { void wl_geometry(wl_output *wl_output, std::int32_t x, std::int32_t y, std::int32_t physical_width, std::int32_t physical_height, std::int32_t subpixel, const char *make, const char *model, std::int32_t transform) {}
}
void wl_mode(wl_output *wl_output, std::uint32_t flags, std::int32_t width, std::int32_t height, std::int32_t refresh); void wl_mode(wl_output *wl_output, std::uint32_t flags, std::int32_t width, std::int32_t height, std::int32_t refresh);
void wl_done(wl_output *wl_output) { void wl_done(wl_output *wl_output) {}
}
void wl_scale(wl_output *wl_output, std::int32_t factor) { void wl_scale(wl_output *wl_output, std::int32_t factor) {}
}
void listen(zxdg_output_manager_v1 *output_manager);
wl_output *output; wl_output *output;
std::string name; std::string name;
std::string description; std::string description;
platf::touch_port_t viewport; platf::touch_port_t viewport;
wl_output_listener wl_listener; wl_output_listener wl_listener;
zxdg_output_v1_listener xdg_listener; zxdg_output_v1_listener xdg_listener;
}; };
@@ -151,35 +139,34 @@ namespace wl {
public: public:
enum interface_e { enum interface_e {
XDG_OUTPUT, ///< xdg-output XDG_OUTPUT, ///< xdg-output
WLR_EXPORT_DMABUF, ///< Export dmabuf WLR_EXPORT_DMABUF, ///< screencopy manager
LINUX_DMABUF, ///< linux-dmabuf protocol
MAX_INTERFACES, ///< Maximum number of interfaces MAX_INTERFACES, ///< Maximum number of interfaces
}; };
interface_t() noexcept;
interface_t(interface_t &&) = delete; interface_t(interface_t &&) = delete;
interface_t(const interface_t &) = delete; interface_t(const interface_t &) = delete;
interface_t &operator=(const interface_t &) = delete; interface_t &operator=(const interface_t &) = delete;
interface_t &operator=(interface_t &&) = delete; interface_t &operator=(interface_t &&) = delete;
interface_t() noexcept;
void listen(wl_registry *registry); void listen(wl_registry *registry);
std::vector<std::unique_ptr<monitor_t>> monitors;
zwlr_export_dmabuf_manager_v1 *dmabuf_manager;
zxdg_output_manager_v1 *output_manager;
bool operator[](interface_e bit) const { bool operator[](interface_e bit) const {
return interface[bit]; return interface[bit];
} }
std::vector<std::unique_ptr<monitor_t>> monitors;
zwlr_screencopy_manager_v1 *screencopy_manager {nullptr};
zwp_linux_dmabuf_v1 *dmabuf_interface {nullptr};
zxdg_output_manager_v1 *output_manager {nullptr};
private: private:
void add_interface(wl_registry *registry, std::uint32_t id, const char *interface, std::uint32_t version); void add_interface(wl_registry *registry, std::uint32_t id, const char *interface, std::uint32_t version);
void del_interface(wl_registry *registry, uint32_t id); void del_interface(wl_registry *registry, uint32_t id);
std::bitset<MAX_INTERFACES> interface; std::bitset<MAX_INTERFACES> interface;
wl_registry_listener listener; wl_registry_listener listener;
}; };
@@ -212,7 +199,6 @@ namespace wl {
}; };
std::vector<std::unique_ptr<monitor_t>> monitors(const char *display_name = nullptr); std::vector<std::unique_ptr<monitor_t>> monitors(const char *display_name = nullptr);
int init(); int init();
} // namespace wl } // namespace wl
#else #else
@@ -223,21 +209,18 @@ struct zxdg_output_manager_v1;
namespace wl { namespace wl {
class monitor_t { class monitor_t {
public: public:
monitor_t(wl_output *output);
monitor_t(monitor_t &&) = delete; monitor_t(monitor_t &&) = delete;
monitor_t(const monitor_t &) = delete; monitor_t(const monitor_t &) = delete;
monitor_t &operator=(const monitor_t &) = delete; monitor_t &operator=(const monitor_t &) = delete;
monitor_t &operator=(monitor_t &&) = delete; monitor_t &operator=(monitor_t &&) = delete;
monitor_t(wl_output *output);
void listen(zxdg_output_manager_v1 *output_manager); void listen(zxdg_output_manager_v1 *output_manager);
wl_output *output; wl_output *output;
std::string name; std::string name;
std::string description; std::string description;
platf::touch_port_t viewport; platf::touch_port_t viewport;
}; };

View File

@@ -90,7 +90,7 @@ namespace wl {
auto to = std::chrono::steady_clock::now() + timeout; auto to = std::chrono::steady_clock::now() + timeout;
// Dispatch events until we get a new frame or the timeout expires // Dispatch events until we get a new frame or the timeout expires
dmabuf.listen(interface.dmabuf_manager, output, cursor); dmabuf.listen(interface.screencopy_manager, interface.dmabuf_interface, output, cursor);
do { do {
auto remaining_time_ms = std::chrono::duration_cast<std::chrono::milliseconds>(to - std::chrono::steady_clock::now()); auto remaining_time_ms = std::chrono::duration_cast<std::chrono::milliseconds>(to - std::chrono::steady_clock::now());
if (remaining_time_ms.count() < 0 || !display.dispatch(remaining_time_ms)) { if (remaining_time_ms.count() < 0 || !display.dispatch(remaining_time_ms)) {

View File

@@ -117,15 +117,26 @@ namespace {
using virtual_sink_waveformats_t = std::vector<WAVEFORMATEXTENSIBLE>; using virtual_sink_waveformats_t = std::vector<WAVEFORMATEXTENSIBLE>;
/**
* @brief List of supported waveformats for an N-channel virtual audio device
* @tparam channel_count Number of virtual audio channels
* @returns std::vector<WAVEFORMATEXTENSIBLE>
* @note The list of virtual formats returned are sorted in preference order and the first valid
* format will be used. All bits-per-sample options are listed because we try to match
* this to the default audio device. See also: set_format() below.
*/
template<WORD channel_count> template<WORD channel_count>
virtual_sink_waveformats_t create_virtual_sink_waveformats() { virtual_sink_waveformats_t create_virtual_sink_waveformats() {
if constexpr (channel_count == 2) { if constexpr (channel_count == 2) {
auto channel_mask = waveformat_mask_stereo; auto channel_mask = waveformat_mask_stereo;
// only choose 24 or 16-bit formats to avoid clobbering existing Dolby/DTS spatial audio settings // The 32-bit formats are a lower priority for stereo because using one will disable Dolby/DTS
// spatial audio mode if the user enabled it on the Steam speaker.
return { return {
create_waveformat(sample_format_e::s24in32, channel_count, channel_mask), create_waveformat(sample_format_e::s24in32, channel_count, channel_mask),
create_waveformat(sample_format_e::s24, channel_count, channel_mask), create_waveformat(sample_format_e::s24, channel_count, channel_mask),
create_waveformat(sample_format_e::s16, channel_count, channel_mask), create_waveformat(sample_format_e::s16, channel_count, channel_mask),
create_waveformat(sample_format_e::f32, channel_count, channel_mask),
create_waveformat(sample_format_e::s32, channel_count, channel_mask),
}; };
} else if (channel_count == 6) { } else if (channel_count == 6) {
auto channel_mask1 = waveformat_mask_surround51_with_backspeakers; auto channel_mask1 = waveformat_mask_surround51_with_backspeakers;
@@ -298,6 +309,10 @@ namespace platf::audio {
auto waveformatext_pointer = reinterpret_cast<const WAVEFORMATEXTENSIBLE *>(mixer_waveformat.get()); auto waveformatext_pointer = reinterpret_cast<const WAVEFORMATEXTENSIBLE *>(mixer_waveformat.get());
capture_waveformat.dwChannelMask = waveformatext_pointer->dwChannelMask; capture_waveformat.dwChannelMask = waveformatext_pointer->dwChannelMask;
} }
BOOST_LOG(info) << "Audio mixer format is "sv << mixer_waveformat->wBitsPerSample << "-bit, "sv
<< mixer_waveformat->nSamplesPerSec << " Hz, "sv
<< ((mixer_waveformat->nSamplesPerSec != 48000) ? "will be resampled to 48000 by Windows"sv : "no resampling needed"sv);
} }
status = audio_client->Initialize( status = audio_client->Initialize(
@@ -315,7 +330,7 @@ namespace platf::audio {
return nullptr; return nullptr;
} }
BOOST_LOG(info) << "Audio capture format is " << logging::bracket(waveformat_to_pretty_string(capture_waveformat)); BOOST_LOG(info) << "Audio capture format is "sv << logging::bracket(waveformat_to_pretty_string(capture_waveformat));
return audio_client; return audio_client;
} }
@@ -793,6 +808,22 @@ namespace platf::audio {
} }
} }
// When switching to a Steam virtual speaker device, try to retain the bit depth of the
// default audio device. Switching from a 16-bit device to a 24-bit one has been known to
// cause glitches for some users.
int wanted_bits_per_sample = 32;
auto current_default_dev = default_device(device_enum);
if (current_default_dev) {
audio::prop_t prop;
prop_var_t current_device_format;
if (SUCCEEDED(current_default_dev->OpenPropertyStore(STGM_READ, &prop)) && SUCCEEDED(prop->GetValue(PKEY_AudioEngine_DeviceFormat, &current_device_format.prop))) {
auto *format = (WAVEFORMATEXTENSIBLE *) current_device_format.prop.blob.pBlobData;
wanted_bits_per_sample = format->Samples.wValidBitsPerSample;
BOOST_LOG(info) << "Virtual audio device will use "sv << wanted_bits_per_sample << "-bit to match default device"sv;
}
}
auto &device_id = virtual_sink_info->first; auto &device_id = virtual_sink_info->first;
auto &waveformats = virtual_sink_info->second.get().virtual_sink_waveformats; auto &waveformats = virtual_sink_info->second.get().virtual_sink_waveformats;
for (const auto &waveformat : waveformats) { for (const auto &waveformat : waveformats) {
@@ -802,6 +833,10 @@ namespace platf::audio {
auto waveformat_copy = waveformat; auto waveformat_copy = waveformat;
auto waveformat_copy_pointer = reinterpret_cast<WAVEFORMATEX *>(&waveformat_copy); auto waveformat_copy_pointer = reinterpret_cast<WAVEFORMATEX *>(&waveformat_copy);
if (wanted_bits_per_sample != waveformat.Samples.wValidBitsPerSample) {
continue;
}
WAVEFORMATEXTENSIBLE p {}; WAVEFORMATEXTENSIBLE p {};
if (SUCCEEDED(policy->SetDeviceFormat(device_id_copy.c_str(), waveformat_copy_pointer, (WAVEFORMATEX *) &p))) { if (SUCCEEDED(policy->SetDeviceFormat(device_id_copy.c_str(), waveformat_copy_pointer, (WAVEFORMATEX *) &p))) {
BOOST_LOG(info) << "Changed virtual audio sink format to " << logging::bracket(waveformat_to_pretty_string(waveformat)); BOOST_LOG(info) << "Changed virtual audio sink format to " << logging::bracket(waveformat_to_pretty_string(waveformat));

View File

@@ -219,7 +219,7 @@ namespace platf::dxgi {
{ {
util::buffer_t<std::uint8_t> cursor_img = img_data; util::buffer_t<std::uint8_t> cursor_img = img_data;
std::for_each((std::uint32_t *) std::begin(cursor_img), (std::uint32_t *) std::end(cursor_img), [](auto &pixel) { std::for_each((std::uint32_t *) std::begin(cursor_img), (std::uint32_t *) std::end(cursor_img), [](auto &pixel) {
auto alpha = (std::uint8_t)((pixel >> 24) & 0xFF); auto alpha = (std::uint8_t) ((pixel >> 24) & 0xFF);
if (alpha == 0xFF) { if (alpha == 0xFF) {
// Pixels with 0xFF alpha will be XOR-blended as is. // Pixels with 0xFF alpha will be XOR-blended as is.
} else if (alpha == 0x00) { } else if (alpha == 0x00) {
@@ -286,7 +286,7 @@ namespace platf::dxgi {
{ {
util::buffer_t<std::uint8_t> cursor_img = img_data; util::buffer_t<std::uint8_t> cursor_img = img_data;
std::for_each((std::uint32_t *) std::begin(cursor_img), (std::uint32_t *) std::end(cursor_img), [](auto &pixel) { std::for_each((std::uint32_t *) std::begin(cursor_img), (std::uint32_t *) std::end(cursor_img), [](auto &pixel) {
auto alpha = (std::uint8_t)((pixel >> 24) & 0xFF); auto alpha = (std::uint8_t) ((pixel >> 24) & 0xFF);
if (alpha == 0xFF) { if (alpha == 0xFF) {
// Pixels with 0xFF alpha will be XOR-blended by make_cursor_xor_image(). // Pixels with 0xFF alpha will be XOR-blended by make_cursor_xor_image().
// We make them transparent for the alpha-blended cursor image. // We make them transparent for the alpha-blended cursor image.

View File

@@ -92,10 +92,10 @@ namespace platf {
constexpr float EARTH_G = 9.80665f; constexpr float EARTH_G = 9.80665f;
#define MPS2_TO_DS4_ACCEL(x) (int32_t)(((x) / EARTH_G) * 8192) #define MPS2_TO_DS4_ACCEL(x) (int32_t) (((x) / EARTH_G) * 8192)
#define DPS_TO_DS4_GYRO(x) (int32_t)((x) * (1024 / 64)) #define DPS_TO_DS4_GYRO(x) (int32_t) ((x) * (1024 / 64))
#define APPLY_CALIBRATION(val, bias, scale) (int32_t)(((float) (val) + (bias)) / (scale)) #define APPLY_CALIBRATION(val, bias, scale) (int32_t) (((float) (val) + (bias)) / (scale))
constexpr DS4_TOUCH ds4_touch_unused = { constexpr DS4_TOUCH ds4_touch_unused = {
.bPacketCounter = 0, .bPacketCounter = 0,

View File

@@ -1,7 +1,7 @@
/** /**
* @file src/platform/windows/windows.rs.in * @file src/platform/windows/windows.rc.in
* @brief Windows resource file template. * @brief Windows resource file template.
* @note The final `windows.rs` is generated from this file during the CMake build. * @note The final `windows.rc` is generated from this file during the CMake build.
* @todo Use CMake definitions directly, instead of configuring this file. * @todo Use CMake definitions directly, instead of configuring this file.
*/ */
#include "winver.h" #include "winver.h"

View File

@@ -112,7 +112,7 @@ namespace rtsp_stream {
boost::asio::async_read(sock, boost::asio::buffer(begin, sizeof(encrypted_rtsp_header_t)), boost::bind(&socket_t::handle_read_encrypted_header, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); boost::asio::async_read(sock, boost::asio::buffer(begin, sizeof(encrypted_rtsp_header_t)), boost::bind(&socket_t::handle_read_encrypted_header, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
} else { } else {
sock.async_read_some( sock.async_read_some(
boost::asio::buffer(begin, (std::size_t)(std::end(msg_buf) - begin)), boost::asio::buffer(begin, (std::size_t) (std::end(msg_buf) - begin)),
boost::bind( boost::bind(
&socket_t::handle_read_plaintext, &socket_t::handle_read_plaintext,
shared_from_this(), shared_from_this(),
@@ -253,7 +253,7 @@ namespace rtsp_stream {
} }
sock.async_read_some( sock.async_read_some(
boost::asio::buffer(begin, (std::size_t)(std::end(msg_buf) - begin)), boost::asio::buffer(begin, (std::size_t) (std::end(msg_buf) - begin)),
boost::bind( boost::bind(
&socket_t::handle_plaintext_payload, &socket_t::handle_plaintext_payload,
shared_from_this(), shared_from_this(),
@@ -289,7 +289,7 @@ namespace rtsp_stream {
auto end = socket->begin + bytes; auto end = socket->begin + bytes;
msg_t req {new msg_t::element_type {}}; msg_t req {new msg_t::element_type {}};
if (auto status = parseRtspMessage(req.get(), socket->msg_buf.data(), (std::size_t)(end - socket->msg_buf.data()))) { if (auto status = parseRtspMessage(req.get(), socket->msg_buf.data(), (std::size_t) (end - socket->msg_buf.data()))) {
BOOST_LOG(error) << "Malformed RTSP message: ["sv << status << ']'; BOOST_LOG(error) << "Malformed RTSP message: ["sv << status << ']';
respond(socket->sock, *socket->session, nullptr, 400, "BAD REQUEST", 0, {}); respond(socket->sock, *socket->session, nullptr, 400, "BAD REQUEST", 0, {});
@@ -321,7 +321,7 @@ namespace rtsp_stream {
if (end - socket->crlf >= content_length) { if (end - socket->crlf >= content_length) {
if (end - socket->crlf > content_length) { if (end - socket->crlf > content_length) {
BOOST_LOG(warning) << "(end - socket->crlf) > content_length -- "sv << (std::size_t)(end - socket->crlf) << " > "sv << content_length; BOOST_LOG(warning) << "(end - socket->crlf) > content_length -- "sv << (std::size_t) (end - socket->crlf) << " > "sv << content_length;
} }
fg.disable(); fg.disable();

View File

@@ -48,6 +48,7 @@ extern "C" {
#define IDX_RUMBLE_TRIGGER_DATA 12 #define IDX_RUMBLE_TRIGGER_DATA 12
#define IDX_SET_MOTION_EVENT 13 #define IDX_SET_MOTION_EVENT 13
#define IDX_SET_RGB_LED 14 #define IDX_SET_RGB_LED 14
#define IDX_SET_ADAPTIVE_TRIGGERS 15
static const short packetTypes[] = { static const short packetTypes[] = {
0x0305, // Start A 0x0305, // Start A
@@ -65,6 +66,7 @@ static const short packetTypes[] = {
0x5500, // Rumble triggers (Sunshine protocol extension) 0x5500, // Rumble triggers (Sunshine protocol extension)
0x5501, // Set motion event (Sunshine protocol extension) 0x5501, // Set motion event (Sunshine protocol extension)
0x5502, // Set RGB LED (Sunshine protocol extension) 0x5502, // Set RGB LED (Sunshine protocol extension)
0x5503, // Set Adaptive triggers (Sunshine protocol extension)
}; };
namespace asio = boost::asio; namespace asio = boost::asio;
@@ -186,6 +188,21 @@ namespace stream {
std::uint8_t b; std::uint8_t b;
}; };
struct control_adaptive_triggers_t {
control_header_v2 header;
std::uint16_t id;
/**
* 0x04 - Right trigger
* 0x08 - Left trigger
*/
std::uint8_t event_flags;
std::uint8_t type_left;
std::uint8_t type_right;
std::uint8_t left[DS_EFFECT_PAYLOAD_SIZE];
std::uint8_t right[DS_EFFECT_PAYLOAD_SIZE];
};
struct control_hdr_mode_t { struct control_hdr_mode_t {
control_header_v2 header; control_header_v2 header;
@@ -833,6 +850,22 @@ namespace stream {
plaintext.b = data.b; plaintext.b = data.b;
BOOST_LOG(verbose) << "RGB: "sv << msg.id << " :: "sv << util::hex(data.r).to_string_view() << util::hex(data.g).to_string_view() << util::hex(data.b).to_string_view(); BOOST_LOG(verbose) << "RGB: "sv << msg.id << " :: "sv << util::hex(data.r).to_string_view() << util::hex(data.g).to_string_view() << util::hex(data.b).to_string_view();
std::array<std::uint8_t, sizeof(control_encrypted_t) + crypto::cipher::round_to_pkcs7_padded(sizeof(plaintext)) + crypto::cipher::tag_size>
encrypted_payload;
payload = encode_control(session, util::view(plaintext), encrypted_payload);
} else if (msg.type == platf::gamepad_feedback_e::set_adaptive_triggers) {
control_adaptive_triggers_t plaintext;
plaintext.header.type = packetTypes[IDX_SET_ADAPTIVE_TRIGGERS];
plaintext.header.payloadLength = sizeof(plaintext) - sizeof(control_header_v2);
plaintext.id = util::endian::little(msg.id);
plaintext.event_flags = msg.data.adaptive_triggers.event_flags;
plaintext.type_left = msg.data.adaptive_triggers.type_left;
std::ranges::copy(msg.data.adaptive_triggers.left, plaintext.left);
plaintext.type_right = msg.data.adaptive_triggers.type_right;
std::ranges::copy(msg.data.adaptive_triggers.right, plaintext.right);
std::array<std::uint8_t, sizeof(control_encrypted_t) + crypto::cipher::round_to_pkcs7_padded(sizeof(plaintext)) + crypto::cipher::tag_size> std::array<std::uint8_t, sizeof(control_encrypted_t) + crypto::cipher::round_to_pkcs7_padded(sizeof(plaintext)) + crypto::cipher::tag_size>
encrypted_payload; encrypted_payload;

View File

@@ -375,7 +375,7 @@ namespace util {
return (std::uint8_t) ch - '0'; return (std::uint8_t) ch - '0';
} }
return (std::uint8_t)(ch | (char) 32) - 'a' + (char) 10; return (std::uint8_t) (ch | (char) 32) - 'a' + (char) 10;
}; };
std::fill_n(buf + buf_size, padding, 0); std::fill_n(buf + buf_size, padding, 0);
@@ -429,7 +429,7 @@ namespace util {
return (std::uint8_t) ch - '0'; return (std::uint8_t) ch - '0';
} }
return (std::uint8_t)(ch | (char) 32) - 'a' + (char) 10; return (std::uint8_t) (ch | (char) 32) - 'a' + (char) 10;
}; };
for (auto &el : buf) { for (auto &el : buf) {
@@ -483,12 +483,12 @@ namespace util {
std::int64_t res {}; std::int64_t res {};
std::int64_t mul = 1; std::int64_t mul = 1;
while (begin != --end) { while (begin != --end) {
res += (std::int64_t)(*end - '0') * mul; res += (std::int64_t) (*end - '0') * mul;
mul *= 10; mul *= 10;
} }
return *begin != '-' ? res + (std::int64_t)(*begin - '0') * mul : -res; return *begin != '-' ? res + (std::int64_t) (*begin - '0') * mul : -res;
} }
inline std::int64_t from_view(const std::string_view &number) { inline std::int64_t from_view(const std::string_view &number) {
@@ -955,7 +955,7 @@ namespace util {
template<class It> template<class It>
std::string_view view(It begin, It end) { std::string_view view(It begin, It end) {
return std::string_view {(const char *) begin, (std::size_t)(end - begin)}; return std::string_view {(const char *) begin, (std::size_t) (end - begin)};
} }
template<class T> template<class T>

View File

@@ -299,6 +299,7 @@ namespace video {
REF_FRAMES_INVALIDATION = 1 << 8, ///< Support reference frames invalidation REF_FRAMES_INVALIDATION = 1 << 8, ///< Support reference frames invalidation
ALWAYS_REPROBE = 1 << 9, ///< This is an encoder of last resort and we want to aggressively probe for a better one ALWAYS_REPROBE = 1 << 9, ///< This is an encoder of last resort and we want to aggressively probe for a better one
YUV444_SUPPORT = 1 << 10, ///< Encoder may support 4:4:4 chroma sampling depending on hardware YUV444_SUPPORT = 1 << 10, ///< Encoder may support 4:4:4 chroma sampling depending on hardware
ASYNC_TEARDOWN = 1 << 11, ///< Encoder supports async teardown on a different thread
}; };
class avcodec_encode_session_t: public encode_session_t { class avcodec_encode_session_t: public encode_session_t {
@@ -503,7 +504,7 @@ namespace video {
{}, // Fallback options {}, // Fallback options
"h264_nvenc"s, "h264_nvenc"s,
}, },
PARALLEL_ENCODING | REF_FRAMES_INVALIDATION | YUV444_SUPPORT // flags PARALLEL_ENCODING | REF_FRAMES_INVALIDATION | YUV444_SUPPORT | ASYNC_TEARDOWN // flags
}; };
#elif !defined(__APPLE__) #elif !defined(__APPLE__)
encoder_t nvenc { encoder_t nvenc {
@@ -1686,7 +1687,8 @@ namespace video {
} }
} }
auto bitrate = config.bitrate * 1000; auto bitrate = ((config::video.max_bitrate > 0) ? std::min(config.bitrate, config::video.max_bitrate) : config.bitrate) * 1000;
BOOST_LOG(info) << "Streaming bitrate is " << bitrate;
ctx->rc_max_rate = bitrate; ctx->rc_max_rate = bitrate;
ctx->bit_rate = bitrate; ctx->bit_rate = bitrate;
@@ -1856,6 +1858,23 @@ namespace video {
return; return;
} }
// As a workaround for NVENC hangs and to generally speed up encoder reinit,
// we will complete the encoder teardown in a separate thread if supported.
// This will move expensive processing off the encoder thread to allow us
// to restart encoding as soon as possible. For cases where the NVENC driver
// hang occurs, this thread may probably never exit, but it will allow
// streaming to continue without requiring a full restart of Sunshine.
auto fail_guard = util::fail_guard([&encoder, &session] {
if (encoder.flags & ASYNC_TEARDOWN) {
std::thread encoder_teardown_thread {[session = std::move(session)]() mutable {
BOOST_LOG(info) << "Starting async encoder teardown";
session.reset();
BOOST_LOG(info) << "Async encoder teardown complete";
}};
encoder_teardown_thread.detach();
}
});
// set minimum frame time, avoiding violation of client-requested target framerate // set minimum frame time, avoiding violation of client-requested target framerate
auto minimum_frame_time = std::chrono::milliseconds(1000 / std::min(config.framerate, (config::video.min_fps_factor * 10))); auto minimum_frame_time = std::chrono::milliseconds(1000 / std::min(config.framerate, (config::video.min_fps_factor * 10)));
BOOST_LOG(debug) << "Minimum frame time set to "sv << minimum_frame_time.count() << "ms, based on min fps factor of "sv << config::video.min_fps_factor << "."sv; BOOST_LOG(debug) << "Minimum frame time set to "sv << minimum_frame_time.count() << "ms, based on min fps factor of "sv << config::video.min_fps_factor << "."sv;

View File

@@ -441,7 +441,7 @@
); );
if (resp) { if (resp) {
fetch("./api/apps/" + id, { method: "DELETE" }).then((r) => { fetch("./api/apps/" + id, { method: "DELETE" }).then((r) => {
if (r.status == 200) document.location.reload(); if (r.status === 200) document.location.reload();
}); });
} }
}, },
@@ -557,7 +557,7 @@
method: "POST", method: "POST",
body: JSON.stringify(this.editForm), body: JSON.stringify(this.editForm),
}).then((r) => { }).then((r) => {
if (r.status == 200) document.location.reload(); if (r.status === 200) document.location.reload();
}); });
}, },
}, },

View File

@@ -87,7 +87,7 @@
<b>{{ $t('_common.success') }}</b> {{ $t('config.restart_note') }} <b>{{ $t('_common.success') }}</b> {{ $t('config.restart_note') }}
</div> </div>
<div class="mb-3 buttons"> <div class="mb-3 buttons">
<button class="btn btn-primary" @click="save">{{ $t('_common.save') }}</button> <button class="btn btn-primary mr-3" @click="save">{{ $t('_common.save') }}</button>
<button class="btn btn-success" @click="apply" v-if="saved && !restarted">{{ $t('_common.apply') }}</button> <button class="btn btn-success" @click="apply" v-if="saved && !restarted">{{ $t('_common.apply') }}</button>
</div> </div>
</div> </div>
@@ -168,7 +168,7 @@
"install_steam_audio_drivers": "enabled", "install_steam_audio_drivers": "enabled",
"adapter_name": "", "adapter_name": "",
"output_name": "", "output_name": "",
"dd_configuration_option": "verify_only", "dd_configuration_option": "disabled",
"dd_resolution_option": "auto", "dd_resolution_option": "auto",
"dd_manual_resolution": "", "dd_manual_resolution": "",
"dd_refresh_rate_option": "auto", "dd_refresh_rate_option": "auto",
@@ -177,8 +177,9 @@
"dd_config_revert_delay": 3000, "dd_config_revert_delay": 3000,
"dd_config_revert_on_disconnect": "disabled", "dd_config_revert_on_disconnect": "disabled",
"dd_mode_remapping": {"mixed": [], "resolution_only": [], "refresh_rate_only": []}, "dd_mode_remapping": {"mixed": [], "resolution_only": [], "refresh_rate_only": []},
"dd_wa_hdr_toggle": "disabled", "dd_wa_hdr_toggle_delay": 0,
"min_fps_factor": 1, "min_fps_factor": 1,
"max_bitrate": 0,
}, },
}, },
{ {

View File

@@ -63,6 +63,14 @@ const config = ref(props.config)
</template> </template>
</PlatformLayout> </PlatformLayout>
<!-- Disable Audio -->
<Checkbox class="mb-3"
id="stream_audio"
locale-prefix="config"
v-model="config.stream_audio"
default="true"
></Checkbox>
<AdapterNameSelector <AdapterNameSelector
:platform="platform" :platform="platform"
:config="config" :config="config"

View File

@@ -1,7 +1,6 @@
<script setup> <script setup>
import { ref } from 'vue' import { ref } from 'vue'
import PlatformLayout from '../../../PlatformLayout.vue' import PlatformLayout from '../../../PlatformLayout.vue'
import Checkbox from "../../../Checkbox.vue";
const props = defineProps({ const props = defineProps({
platform: String, platform: String,
@@ -68,7 +67,7 @@ function addRemappingEntry() {
{{ $t('config.dd_config_label') }} {{ $t('config.dd_config_label') }}
</label> </label>
<select id="dd_configuration_option" class="form-select" v-model="config.dd_configuration_option"> <select id="dd_configuration_option" class="form-select" v-model="config.dd_configuration_option">
<option value="disabled">{{ $t('_common.disabled') }}</option> <option value="disabled">{{ $t('_common.disabled_def') }}</option>
<option value="verify_only">{{ $t('config.dd_config_verify_only') }}</option> <option value="verify_only">{{ $t('config.dd_config_verify_only') }}</option>
<option value="ensure_active">{{ $t('config.dd_config_ensure_active') }}</option> <option value="ensure_active">{{ $t('config.dd_config_ensure_active') }}</option>
<option value="ensure_primary">{{ $t('config.dd_config_ensure_primary') }}</option> <option value="ensure_primary">{{ $t('config.dd_config_ensure_primary') }}</option>
@@ -132,11 +131,18 @@ function addRemappingEntry() {
<option value="auto">{{ $t('config.dd_hdr_option_auto') }}</option> <option value="auto">{{ $t('config.dd_hdr_option_auto') }}</option>
</select> </select>
<!-- HDR toggle --> <!-- HDR toggle -->
<Checkbox id="dd_wa_hdr_toggle" <label for="dd_wa_hdr_toggle_delay" class="form-label">
locale-prefix="config" {{ $t('config.dd_wa_hdr_toggle_delay') }}
v-model="config.dd_wa_hdr_toggle" </label>
default="false" <input type="number" class="form-control" id="dd_wa_hdr_toggle_delay" placeholder="0" min="0" max="3000"
></Checkbox> v-model="config.dd_wa_hdr_toggle_delay" />
<div class="form-text">
{{ $t('config.dd_wa_hdr_toggle_delay_desc_1') }}
<br>
{{ $t('config.dd_wa_hdr_toggle_delay_desc_2') }}
<br>
{{ $t('config.dd_wa_hdr_toggle_delay_desc_3') }}
</div>
</div> </div>
<!-- Config revert delay --> <!-- Config revert delay -->

View File

@@ -17,6 +17,13 @@ const config = ref(props.config)
<input type="number" min="1" max="3" class="form-control" id="min_fps_factor" placeholder="1" v-model="config.min_fps_factor" /> <input type="number" min="1" max="3" class="form-control" id="min_fps_factor" placeholder="1" v-model="config.min_fps_factor" />
<div class="form-text">{{ $t('config.min_fps_factor_desc') }}</div> <div class="form-text">{{ $t('config.min_fps_factor_desc') }}</div>
</div> </div>
<!--max_bitrate-->
<div class="mb-3">
<label for="max_bitrate" class="form-label">{{ $t("config.max_bitrate") }}</label>
<input type="number" class="form-control" id="max_bitrate" placeholder="0" v-model="config.max_bitrate" />
<div class="form-text">{{ $t("config.max_bitrate_desc") }}</div>
</div>
</template> </template>
<style scoped> <style scoped>

View File

@@ -94,10 +94,10 @@
method: "POST", method: "POST",
body: JSON.stringify(this.passwordData), body: JSON.stringify(this.passwordData),
}).then((r) => { }).then((r) => {
if (r.status == 200) { if (r.status === 200) {
r.json().then((rj) => { r.json().then((rj) => {
if (rj.status.toString() === "true") { this.success = rj.status;
this.success = true; if (this.success === true) {
setTimeout(() => { setTimeout(() => {
document.location.reload(); document.location.reload();
}, 5000); }, 5000);

View File

@@ -42,7 +42,7 @@
fetch("./api/pin", {method: "POST", body: b}) fetch("./api/pin", {method: "POST", body: b})
.then((response) => response.json()) .then((response) => response.json())
.then((response) => { .then((response) => {
if (response.status.toString().toLowerCase() === "true") { if (response.status === true) {
document.querySelector( document.querySelector(
"#status" "#status"
).innerHTML = `<div class="alert alert-success" role="alert">${this.i18n.t('pin.pair_success')}</div>`; ).innerHTML = `<div class="alert alert-success" role="alert">${this.i18n.t('pin.pair_success')}</div>`;

View File

@@ -160,7 +160,7 @@
"dd_config_revert_delay_desc": "Additional delay in milliseconds to wait before reverting configuration when the app has been closed or the last session terminated. Main purpose is to provide a smoother transition when quickly switching between apps.", "dd_config_revert_delay_desc": "Additional delay in milliseconds to wait before reverting configuration when the app has been closed or the last session terminated. Main purpose is to provide a smoother transition when quickly switching between apps.",
"dd_config_revert_on_disconnect": "Config revert on disconnect", "dd_config_revert_on_disconnect": "Config revert on disconnect",
"dd_config_revert_on_disconnect_desc": "Revert configuration upon disconnect of all clients instead of app close or last session termination.", "dd_config_revert_on_disconnect_desc": "Revert configuration upon disconnect of all clients instead of app close or last session termination.",
"dd_config_verify_only": "Verify that the display is enabled (default)", "dd_config_verify_only": "Verify that the display is enabled",
"dd_hdr_option": "HDR", "dd_hdr_option": "HDR",
"dd_hdr_option_auto": "Switch on/off the HDR mode as requested by the client (default)", "dd_hdr_option_auto": "Switch on/off the HDR mode as requested by the client (default)",
"dd_hdr_option_disabled": "Do not change HDR settings", "dd_hdr_option_disabled": "Do not change HDR settings",
@@ -189,8 +189,10 @@
"dd_resolution_option_manual": "Use manually entered resolution", "dd_resolution_option_manual": "Use manually entered resolution",
"dd_resolution_option_manual_desc": "Enter the resolution to be used", "dd_resolution_option_manual_desc": "Enter the resolution to be used",
"dd_resolution_option_ogs_desc": "\"Optimize game settings\" option must be enabled on the Moonlight client for this to work.", "dd_resolution_option_ogs_desc": "\"Optimize game settings\" option must be enabled on the Moonlight client for this to work.",
"dd_wa_hdr_toggle_desc": "When using virtual display device as for streaming, it might display incorrect HDR color. With this option enabled, Sunshine will try to mitigate this issue.", "dd_wa_hdr_toggle_delay_desc_1": "When using virtual display device (VDD) for streaming, it might incorrectly display HDR color. Sunshine can try to mitigate this issue, by turning HDR off and then on again.",
"dd_wa_hdr_toggle": "Enable high-contrast workaround for HDR", "dd_wa_hdr_toggle_delay_desc_2": "If the value is set to 0, the workaround is disabled (default). If the value is between 0 and 3000 milliseconds, Sunshine will turn off HDR, wait for the specified amount of time and then turn HDR on again. The recommended delay time is around 500 milliseconds in most cases.",
"dd_wa_hdr_toggle_delay_desc_3": "DO NOT use this workaround unless you actually have issues with HDR as it directly impacts stream start time!",
"dd_wa_hdr_toggle_delay": "High-contrast workaround for HDR",
"ds4_back_as_touchpad_click": "Map Back/Select to Touchpad Click", "ds4_back_as_touchpad_click": "Map Back/Select to Touchpad Click",
"ds4_back_as_touchpad_click_desc": "When forcing DS4 emulation, map Back/Select to Touchpad Click", "ds4_back_as_touchpad_click_desc": "When forcing DS4 emulation, map Back/Select to Touchpad Click",
"encoder": "Force a Specific Encoder", "encoder": "Force a Specific Encoder",
@@ -252,6 +254,8 @@
"log_level_desc": "The minimum log level printed to standard out", "log_level_desc": "The minimum log level printed to standard out",
"log_path": "Logfile Path", "log_path": "Logfile Path",
"log_path_desc": "The file where the current logs of Sunshine are stored.", "log_path_desc": "The file where the current logs of Sunshine are stored.",
"max_bitrate": "Maximum Bitrate",
"max_bitrate_desc": "The maximum bitrate (in Kbps) that Sunshine will encode the stream at. If set to 0, it will always use the bitrate requested by Moonlight.",
"min_fps_factor": "Minimum FPS Factor", "min_fps_factor": "Minimum FPS Factor",
"min_fps_factor_desc": "Sunshine will use this factor to calculate the minimum time between frames. Increasing this value slightly may help when streaming mostly static content. Higher values will consume more bandwidth.", "min_fps_factor_desc": "Sunshine will use this factor to calculate the minimum time between frames. Increasing this value slightly may help when streaming mostly static content. Higher values will consume more bandwidth.",
"min_threads": "Minimum CPU Thread Count", "min_threads": "Minimum CPU Thread Count",
@@ -325,6 +329,8 @@
"qsv_slow_hevc": "Allow Slow HEVC Encoding", "qsv_slow_hevc": "Allow Slow HEVC Encoding",
"qsv_slow_hevc_desc": "This can enable HEVC encoding on older Intel GPUs, at the cost of higher GPU usage and worse performance.", "qsv_slow_hevc_desc": "This can enable HEVC encoding on older Intel GPUs, at the cost of higher GPU usage and worse performance.",
"restart_note": "Sunshine is restarting to apply changes.", "restart_note": "Sunshine is restarting to apply changes.",
"stream_audio": "Stream Audio",
"stream_audio_desc": "Whether to stream audio or not. Disabling this can be useful for streaming headless displays as second monitors.",
"sunshine_name": "Sunshine Name", "sunshine_name": "Sunshine Name",
"sunshine_name_desc": "The name displayed by Moonlight. If not specified, the PC's hostname is used", "sunshine_name_desc": "The name displayed by Moonlight. If not specified, the PC's hostname is used",
"sw_preset": "SW Presets", "sw_preset": "SW Presets",

View File

@@ -120,13 +120,14 @@
</div> </div>
<ul id="client-list" class="list-group list-group-flush list-group-item-light" v-if="clients && clients.length > 0"> <ul id="client-list" class="list-group list-group-flush list-group-item-light" v-if="clients && clients.length > 0">
<div v-for="client in clients" class="list-group-item d-flex"> <div v-for="client in clients" class="list-group-item d-flex">
<div class="p-2 flex-grow-1">{{client.name != "" ? client.name : $t('troubleshooting.unpair_single_unknown')}}</div><div class="me-2 ms-auto btn btn-danger" @click="unpairSingle(client.uuid)"><i class="fas fa-trash"></i></div> <div class="p-2 flex-grow-1">{{ client.name !== "" ? client.name : $t('troubleshooting.unpair_single_unknown') }}</div>
<div class="me-2 ms-auto btn btn-danger" @click="unpairSingle(client.uuid)"><i class="fas fa-trash"></i></div>
</div> </div>
</ul> </ul>
<ul v-else class="list-group list-group-flush list-group-item-light"> <ul v-else class="list-group list-group-flush list-group-item-light">
<div class="list-group-item p-3 text-center"><em>{{ $t('troubleshooting.unpair_single_no_devices') }}</em></div> <div class="list-group-item p-3 text-center"><em>{{ $t('troubleshooting.unpair_single_no_devices') }}</em></div>
</ul> </ul>
</div> </div>
<!-- Logs --> <!-- Logs -->
<div class="card p-2 my-4"> <div class="card p-2 my-4">
@@ -176,7 +177,7 @@
actualLogs() { actualLogs() {
if (!this.logFilter) return this.logs; if (!this.logFilter) return this.logs;
let lines = this.logs.split("\n"); let lines = this.logs.split("\n");
lines = lines.filter(x => x.indexOf(this.logFilter) != -1); lines = lines.filter(x => x.indexOf(this.logFilter) !== -1);
return lines.join("\n"); return lines.join("\n");
} }
}, },
@@ -210,7 +211,7 @@
.then((r) => r.json()) .then((r) => r.json())
.then((r) => { .then((r) => {
this.closeAppPressed = false; this.closeAppPressed = false;
this.closeAppStatus = r.status.toString() === "true"; this.closeAppStatus = r.status;
setTimeout(() => { setTimeout(() => {
this.closeAppStatus = null; this.closeAppStatus = null;
}, 5000); }, 5000);
@@ -222,7 +223,7 @@
.then((r) => r.json()) .then((r) => r.json())
.then((r) => { .then((r) => {
this.unpairAllPressed = false; this.unpairAllPressed = false;
this.unpairAllStatus = r.status.toString() === "true"; this.unpairAllStatus = r.status;
setTimeout(() => { setTimeout(() => {
this.unpairAllStatus = null; this.unpairAllStatus = null;
}, 5000); }, 5000);
@@ -240,9 +241,9 @@
.then((response) => response.json()) .then((response) => response.json())
.then((response) => { .then((response) => {
const clientList = document.querySelector("#client-list"); const clientList = document.querySelector("#client-list");
if (response.status === 'true' && response.named_certs && response.named_certs.length) { if (response.status === true && response.named_certs && response.named_certs.length) {
this.clients = response.named_certs.sort((a, b) => { this.clients = response.named_certs.sort((a, b) => {
return (a.name.toLowerCase() > b.name.toLowerCase() || a.name == "" ? 1 : -1) return (a.name.toLowerCase() > b.name.toLowerCase() || a.name === "" ? 1 : -1)
}); });
} else { } else {
this.clients = []; this.clients = [];
@@ -270,7 +271,7 @@
.then((r) => r.json()) .then((r) => r.json())
.then((r) => { .then((r) => {
this.ddResetPressed = false; this.ddResetPressed = false;
this.ddResetStatus = r.status.toString() === "true"; this.ddResetStatus = r.status;
setTimeout(() => { setTimeout(() => {
this.ddResetStatus = null; this.ddResetStatus = null;
}, 5000); }, 5000);

View File

@@ -81,10 +81,10 @@
body: JSON.stringify(this.passwordData), body: JSON.stringify(this.passwordData),
}).then((r) => { }).then((r) => {
this.loading = false; this.loading = false;
if (r.status == 200) { if (r.status === 200) {
r.json().then((rj) => { r.json().then((rj) => {
if (rj.status.toString() === "true") { this.success = rj.status;
this.success = true; if (this.success === true) {
setTimeout(() => { setTimeout(() => {
document.location.reload(); document.location.reload();
}, 5000); }, 5000);

View File

@@ -22,6 +22,12 @@
"detached": [ "detached": [
"setsid steam steam://open/bigpicture" "setsid steam steam://open/bigpicture"
], ],
"prep-cmd": [
{
"do": "",
"undo": "setsid steam steam://close/bigpicture"
}
],
"image-path": "steam.png" "image-path": "steam.png"
} }
] ]

View File

@@ -1,2 +1,11 @@
KERNEL=="uinput", SUBSYSTEM=="misc", OPTIONS+="static_node=uinput", TAG+="uaccess" # Allows Sunshine to acces /dev/uinput
KERNEL=="uhid", TAG+="uaccess" KERNEL=="uinput", SUBSYSTEM=="misc", OPTIONS+="static_node=uinput", GROUP="input", MODE="0660", TAG+="uaccess"
# Allows Sunshine to access /dev/uhid
KERNEL=="uhid", GROUP="input", MODE="0660", TAG+="uaccess"
# Joypads
KERNEL=="hidraw*" ATTRS{name}=="Sunshine PS5 (virtual) pad" GROUP="input", MODE="0660", TAG+="uaccess"
SUBSYSTEMS=="input", ATTRS{name}=="Sunshine X-Box One (virtual) pad", GROUP="input", MODE="0660", TAG+="uaccess"
SUBSYSTEMS=="input", ATTRS{name}=="Sunshine gamepad (virtual) motion sensors", GROUP="input", MODE="0660", TAG+="uaccess"
SUBSYSTEMS=="input", ATTRS{name}=="Sunshine Nintendo (virtual) pad", GROUP="input", MODE="0660", TAG+="uaccess"

View File

@@ -12,6 +12,12 @@
"detached": [ "detached": [
"open steam://open/bigpicture" "open steam://open/bigpicture"
], ],
"prep-cmd": [
{
"do": "",
"undo": "open steam://close/bigpicture"
}
],
"image-path": "steam.png" "image-path": "steam.png"
} }
] ]

Some files were not shown because too many files have changed in this diff Show More