docs: migrate documentation to Dockle (#5749)

This commit is contained in:
Dave Lane authored and GitHub committed 2026-09-20 19:17:45 -04:00
1 parent 7e4a740104
commit 3a8dcea0df
29 files changed
+240 -501

No files matched your search

+2 -1
View File
@@ -40,7 +40,8 @@
# build directories # build directories
build/ build/
cmake-*/ cmake-*/
docs/doxyconfig* /.dockle/
/_site/
# npm # npm
node_modules/ node_modules/
+3 -3
View File
@@ -6,9 +6,9 @@
path = third-party/build-deps path = third-party/build-deps
url = https://github.com/LizardByte/build-deps.git url = https://github.com/LizardByte/build-deps.git
branch = master branch = master
[submodule "third-party/doxyconfig"] [submodule "third-party/dockle"]
path = third-party/doxyconfig path = third-party/dockle
url = https://github.com/LizardByte/doxyconfig.git url = https://github.com/LizardByte/dockle.git
branch = master branch = master
[submodule "third-party/glad"] [submodule "third-party/glad"]
path = third-party/glad path = third-party/glad
+14 -13
View File
@@ -8,22 +8,23 @@ version: 2
build: build:
os: ubuntu-24.04 os: ubuntu-24.04
tools: tools:
nodejs: "24"
python: "miniconda-latest" python: "miniconda-latest"
commands: jobs:
- | build:
if [ -f readthedocs_build.sh ]; then html:
doxyconfig_dir="." - |
else if [ -f readthedocs_build.sh ]; then
doxyconfig_dir="./third-party/doxyconfig" dockle_dir="."
fi else
chmod +x "${doxyconfig_dir}/readthedocs_build.sh" dockle_dir="./third-party/dockle"
export DOXYCONFIG_DIR="${doxyconfig_dir}" fi
"${doxyconfig_dir}/readthedocs_build.sh" chmod +x "${dockle_dir}/readthedocs_build.sh"
export DOCKLE_DIR="${dockle_dir}"
"${dockle_dir}/readthedocs_build.sh"
# using conda, we can get newer doxygen and graphviz than ubuntu provide
# https://github.com/readthedocs/readthedocs.org/issues/8151#issuecomment-890359661
conda: conda:
environment: third-party/doxyconfig/environment.yml environment: third-party/dockle/environment.yml
submodules: submodules:
include: all include: all
-13
View File
@@ -155,16 +155,3 @@ The architectures supported by these images are shown in the table below.
| debian-bookworm | ✅ | ✅ | | debian-bookworm | ✅ | ✅ |
| ubuntu-22.04 | ✅ | ✅ | | ubuntu-22.04 | ✅ | ✅ |
| ubuntu-24.04 | ✅ | ✅ | | ubuntu-24.04 | ✅ | ✅ |
<div class="section_buttons">
| Previous | Next |
|:-------------------------------|-----------------------------------------------------:|
| [Changelog](docs/changelog.md) | [Third-Party Packages](docs/third_party_packages.md) |
</div>
<details style="display: none;">
<summary></summary>
[TOC]
</details>
-13
View File
@@ -521,16 +521,3 @@ Thank you to all the contributors who have helped make Sunshine better!
<p align="center"> <p align="center">
<img src='https://cdn.jsdelivr.net/gh/LizardByte/contributors@dist/crowdin.606145.svg' alt="CrowdIn contributors"/> <img src='https://cdn.jsdelivr.net/gh/LizardByte/contributors@dist/crowdin.606145.svg' alt="CrowdIn contributors"/>
</p> </p>
<div class="section_buttons">
| Previous | Next |
|:---------|-------------------------------------------:|
| | [Getting Started](docs/getting_started.md) |
</div>
<details style="display: none;">
<summary></summary>
[TOC]
</details>
+2 -1
View File
@@ -97,7 +97,8 @@ add_custom_target(web-ui ALL
# docs # docs
if(BUILD_DOCS) if(BUILD_DOCS)
add_subdirectory(third-party/doxyconfig docs) include(third-party/dockle/cmake/Dockle.cmake)
dockle_add_docs(docs TARGETS docs)
endif() endif()
# tests # tests
+64
View File
@@ -0,0 +1,64 @@
[project]
name = "Sunshine"
version = "0.0.0"
description = "Self-hosted game stream host for Moonlight."
repository = "https://github.com/LizardByte/Sunshine"
logo = "sunshine.svg"
favicon = "sunshine.ico"
[build]
output = "_site"
work = ".dockle"
strict = true
clean = true
[[targets]]
name = "docs"
title = "Sunshine documentation"
framework = "doxygen"
source = "."
home = true
[targets.doxygen]
inputs = [
"README.md",
"docs/getting_started.md",
"docs/changelog.md",
"DOCKER_README.md",
"docs/third_party_packages.md",
"docs/gamestream_migration.md",
"docs/legal.md",
"docs/configuration.md",
"docs/app_examples.md",
"docs/awesome_sunshine.md",
"docs/guides.md",
"docs/performance_tuning.md",
"docs/api.md",
"docs/troubleshooting.md",
"docs/building.md",
"docs/contributing.md",
"src",
]
image_paths = ["docs/images"]
predefined = [
"__APPLE__",
"linux",
"__linux",
"__linux__",
"__MACH__",
"_WIN32",
"SUNSHINE_BUILD_WAYLAND",
"SUNSHINE_TRAY=1",
]
extra_stylesheets = [
"docs/doc-styles.css",
"https://cdn.jsdelivr.net/npm/@lizardbyte/shared-web@2026.920.12131/dist/crowdin-dockle-css.css",
]
extra_javascript = [
"https://cdn.jsdelivr.net/npm/@lizardbyte/shared-web@2026.920.12131/dist/crowdin.js",
"docs/crowdin.js",
]
extra_files = ["docs/api.js", "docs/configuration.js"]
aliases = ["api_examples{3|:|}=@htmlonly<script>(function() { let examples = generateExamples('\\1', '\\2', \\3); document.write(createTabs(examples)); })();</script>@endhtmlonly"]
main_page = "README.md"
dot_graph_max_nodes = 60
-67
View File
@@ -1,67 +0,0 @@
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project.
#
# All text after a double hash (##) is considered a comment and is placed in
# front of the TAG it is preceding.
#
# All text after a single hash (#) is considered a comment and will be ignored.
# The format is:
# TAG = value [value, ...]
# For lists, items can also be appended using:
# TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (\" \").
#
# Note:
#
# Use doxygen to compare the used configuration file with the template
# configuration file:
# doxygen -x [configFile]
# Use doxygen to compare the used configuration file with the template
# configuration file without replacing the environment variables or CMake type
# replacement variables:
# doxygen -x_noenv [configFile]
# project metadata
DOCSET_BUNDLE_ID = dev.lizardbyte.Sunshine
DOCSET_PUBLISHER_ID = dev.lizardbyte.Sunshine.documentation
PROJECT_BRIEF = "Self-hosted game stream host for Moonlight."
PROJECT_ICON = ../sunshine.ico
PROJECT_LOGO = ../sunshine.svg
PROJECT_NAME = Sunshine
# project specific settings
DOT_GRAPH_MAX_NODES = 60
IMAGE_PATH = ../docs/images
PREDEFINED += SUNSHINE_BUILD_WAYLAND
PREDEFINED += SUNSHINE_TRAY=1
# files and directories to process
USE_MDFILE_AS_MAINPAGE = ../README.md
INPUT = ../README.md \
getting_started.md \
changelog.md \
../DOCKER_README.md \
third_party_packages.md \
gamestream_migration.md \
legal.md \
configuration.md \
app_examples.md \
awesome_sunshine.md \
guides.md \
performance_tuning.md \
api.md \
troubleshooting.md \
building.md \
contributing.md \
../third-party/doxyconfig/docs/source_code.md \
../src
# extra css
HTML_EXTRA_STYLESHEET += doc-styles.css
# extra js
HTML_EXTRA_FILES += api.js
HTML_EXTRA_FILES += configuration.js
# custom aliases
ALIASES += api_examples{3|}="@htmlonly<script>(function() { let examples = generateExamples('\1', '\2', \3); document.write(createTabs(examples)); })();</script>@endhtmlonly"
+19 -94
View File
@@ -43,102 +43,27 @@ requests.${method.trim().toLowerCase()}(
}; };
} }
/** function escapeHtml(value) {
* @brief Create a stable signed 32-bit hash for a string. return value
* .replaceAll('&', '&amp;')
* @param {string} str String to hash. .replaceAll('<', '&lt;')
* @return {number} Signed 32-bit hash value. .replaceAll('>', '&gt;')
*/ .replaceAll('"', '&quot;')
function hashString(str) { .replaceAll("'", '&#039;');
let hash = 0;
const signedHash = new Int32Array(1);
for (const character of str) {
const codePoint = character.codePointAt(0);
hash = hash * 31 + codePoint;
signedHash[0] = hash;
hash = signedHash[0];
}
return hash;
} }
function createTabs(examples) { function createTabs(examples) {
const languages = Object.keys(examples); const languages = {
let tabs = '<div class="tabs-overview-container"><div class="tabs-overview">'; cURL: 'bash',
let content = '<div class="tab-content">'; Python: 'python',
JavaScript: 'javascript',
PowerShell: 'powershell'
};
const tabs = Object.entries(examples).map(([label, example]) => `
<li>
<strong class="dockle-tab-title">${escapeHtml(label)}</strong>
<pre data-dockle-language="${languages[label]}"><code>${escapeHtml(example)}</code></pre>
</li>`).join('');
languages.forEach((lang, index) => { return `<div class="dockle-tabs dockle-tabs-alias" data-dockle-tab-group="api-language"><ul>${tabs}</ul></div>`;
const hash = hashString(examples[lang]);
tabs += `<button class="tab-button ${index === 0 ? 'active' : ''}" onclick="openTab(event, '${lang}')"><b class="tab-title" title=" ${lang} "> ${lang} </b></button>`;
content += `<div id="${lang}" class="tabcontent" style="display: ${index === 0 ? 'block' : 'none'};">
<div class="doxygen-awesome-fragment-wrapper">
<div class="fragment">
${examples[lang].split('\n').map(line => `<div class="line">${line}</div>`).join('')}
</div>
<doxygen-awesome-fragment-copy-button id="copy-button-${lang}-${hash}" title="Copy to clipboard">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
<path d="M0 0h24v24H0V0z" fill="none"></path>
<path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"></path>
</svg>
</doxygen-awesome-fragment-copy-button>
</div>
</div>`;
});
tabs += '</div></div>';
content += '</div>';
setTimeout(() => {
languages.forEach((lang, index) => {
const hash = hashString(examples[lang]);
const copyButton = document.getElementById(`copy-button-${lang}-${hash}`);
copyButton.addEventListener('click', copyContent);
});
}, 0);
return tabs + content;
}
function copyContent() {
const content = this.previousElementSibling.cloneNode(true);
if (content instanceof Element) {
// filter out line number from file listings
content.querySelectorAll(".lineno, .ttc").forEach((node) => {
node.remove();
});
let textContent = Array.from(content.querySelectorAll('.line'))
.map(line => line.innerText)
.join('\n')
.trim(); // Join lines with newline characters and trim leading/trailing whitespace
navigator.clipboard.writeText(textContent);
this.classList.add("success");
this.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z"/></svg>`;
window.setTimeout(() => {
this.classList.remove("success");
this.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/></svg>`;
}, 980);
} else {
console.error('Failed to copy: content is not a DOM element');
}
}
function openTab(evt, lang) {
const tabcontent = document.getElementsByClassName("tabcontent");
for (const content of tabcontent) {
content.style.display = "none";
}
const tablinks = document.getElementsByClassName("tab-button");
for (const link of tablinks) {
link.className = link.className.replace(" active", "");
}
const selectedTabs = document.querySelectorAll(`#${lang}`);
for (const tab of selectedTabs) {
tab.style.display = "block";
}
const selectedButtons = document.querySelectorAll(`.tab-button[onclick*="${lang}"]`);
for (const button of selectedButtons) {
button.className += " active";
}
} }
-13
View File
@@ -99,16 +99,3 @@ curl -u user:pass -H "X-CSRF-Token: your_token_here" \
## GET /api/virtual-input/status ## GET /api/virtual-input/status
@copydoc confighttp::getVirtualInputStatus() @copydoc confighttp::getVirtualInputStatus()
<div class="section_buttons">
| Previous | Next |
|:--------------------------------------------|--------------------------------------:|
| [Performance Tuning](performance_tuning.md) | [Troubleshooting](troubleshooting.md) |
</div>
<details style="display: none;">
<summary></summary>
[TOC]
</details>
+30 -43
View File
@@ -25,36 +25,36 @@ and applications to Sunshine.
> Steam is launched as a detached command because Steam starts with a process that self updates itself and the original > Steam is launched as a detached command because Steam starts with a process that self updates itself and the original
> process is killed. > process is killed.
@tabs{ @tabs_grouped{platform|:|
@tab{FreeBSD | <!-- --> @tab{FreeBSD |:| <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|------------------------------\|------------------------------------------------------\| \|------------------------------\|------------------------------------------------------\|
\| Application Name \| @code{}Steam Big Picture@endcode \| \| Application Name \| @code{}Steam Big Picture@endcode \|
\| Command Preporations -> Undo \| @code{}setsid steam steam://close/bigpicture@endcode \| \| Command Preparations -> Undo \| @code{}setsid steam steam://close/bigpicture@endcode \|
\| Detached Commands \| @code{}setsid steam steam://open/bigpicture@endcode \| \| Detached Commands \| @code{}setsid steam steam://open/bigpicture@endcode \|
\| Image \| @code{}steam.png@endcode \| \| Image \| @code{}steam.png@endcode \|
} }
@tab{Linux | <!-- --> @tab{Linux |:| <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|------------------------------\|------------------------------------------------------\| \|------------------------------\|------------------------------------------------------\|
\| Application Name \| @code{}Steam Big Picture@endcode \| \| Application Name \| @code{}Steam Big Picture@endcode \|
\| Command Preporations -> Undo \| @code{}setsid steam steam://close/bigpicture@endcode \| \| Command Preparations -> Undo \| @code{}setsid steam steam://close/bigpicture@endcode \|
\| Detached Commands \| @code{}setsid steam steam://open/bigpicture@endcode \| \| Detached Commands \| @code{}setsid steam steam://open/bigpicture@endcode \|
\| Image \| @code{}steam.png@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 \|
\| Command Preporations -> Undo \| @code{}open steam://close/bigpicture@endcode \| \| Command Preparations -> Undo \| @code{}open steam://close/bigpicture@endcode \|
\| Detached Commands \| @code{}open steam://open/bigpicture@endcode \| \| Detached Commands \| @code{}open steam://open/bigpicture@endcode \|
\| Image \| @code{}steam.png@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 \|
\| Command Preporations -> Undo \| @code{}steam://close/bigpicture@endcode \| \| Command Preparations -> Undo \| @code{}steam://close/bigpicture@endcode \|
\| Detached Commands \| @code{}steam://open/bigpicture@endcode \| \| Detached Commands \| @code{}steam://open/bigpicture@endcode \|
\| Image \| @code{}steam.png@endcode \| \| Image \| @code{}steam.png@endcode \|
} }
@@ -67,8 +67,8 @@ and applications to Sunshine.
#### URI #### URI
@tabs{ @tabs_grouped{platform|:|
@tab{Windows | <!-- --> @tab{Windows |:| <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|------------------\|-------------------------------------------------------------------------------------------------------------------------------------------------------\| \|------------------\|-------------------------------------------------------------------------------------------------------------------------------------------------------\|
\| Application Name \| @code{}Surviving Mars@endcode \| \| Application Name \| @code{}Surviving Mars@endcode \|
@@ -77,8 +77,8 @@ and applications to Sunshine.
} }
#### Binary (w/ working directory #### Binary (w/ working directory
@tabs{ @tabs_grouped{platform|:|
@tab{Windows | <!-- --> @tab{Windows |:| <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|-------------------\|------------------------------------------------------------\| \|-------------------\|------------------------------------------------------------\|
\| Application Name \| @code{}Surviving Mars@endcode \| \| Application Name \| @code{}Surviving Mars@endcode \|
@@ -88,8 +88,8 @@ and applications to Sunshine.
} }
#### Binary (w/o working directory) #### Binary (w/o working directory)
@tabs{ @tabs_grouped{platform|:|
@tab{Windows | <!-- --> @tab{Windows |:| <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|-------------------\|-------------------------------------------------------------------------\| \|-------------------\|-------------------------------------------------------------------------\|
\| Application Name \| @code{}Surviving Mars@endcode \| \| Application Name \| @code{}Surviving Mars@endcode \|
@@ -104,26 +104,26 @@ and applications to Sunshine.
#### URI #### URI
@tabs{ @tabs_grouped{platform|:|
@tab{FreeBSD | <!-- --> @tab{FreeBSD |:| <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|-------------------\|------------------------------------------------------\| \|-------------------\|------------------------------------------------------\|
\| Application Name \| @code{}Surviving Mars@endcode \| \| Application Name \| @code{}Surviving Mars@endcode \|
\| Detached Commands \| @code{}setsid steam steam://rungameid/464920@endcode \| \| Detached Commands \| @code{}setsid steam steam://rungameid/464920@endcode \|
} }
@tab{Linux | <!-- --> @tab{Linux |:| <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|-------------------\|------------------------------------------------------\| \|-------------------\|------------------------------------------------------\|
\| Application Name \| @code{}Surviving Mars@endcode \| \| Application Name \| @code{}Surviving Mars@endcode \|
\| Detached Commands \| @code{}setsid steam steam://rungameid/464920@endcode \| \| Detached Commands \| @code{}setsid steam steam://rungameid/464920@endcode \|
} }
@tab{macOS | <!-- --> @tab{macOS |:| <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|-------------------\|----------------------------------------------\| \|-------------------\|----------------------------------------------\|
\| Application Name \| @code{}Surviving Mars@endcode \| \| Application Name \| @code{}Surviving Mars@endcode \|
\| Detached Commands \| @code{}open steam://rungameid/464920@endcode \| \| Detached Commands \| @code{}open steam://rungameid/464920@endcode \|
} }
@tab{Windows | <!-- --> @tab{Windows |:| <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|-------------------\|-----------------------------------------\| \|-------------------\|-----------------------------------------\|
\| Application Name \| @code{}Surviving Mars@endcode \| \| Application Name \| @code{}Surviving Mars@endcode \|
@@ -132,29 +132,29 @@ and applications to Sunshine.
} }
#### Binary (w/ working directory #### Binary (w/ working directory
@tabs{ @tabs_grouped{platform|:|
@tab{FreeBSD | <!-- --> @tab{FreeBSD |:| <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|-------------------\|--------------------------------------------------------------\| \|-------------------\|--------------------------------------------------------------\|
\| Application Name \| @code{}Surviving Mars@endcode \| \| Application Name \| @code{}Surviving Mars@endcode \|
\| Command \| @code{}MarsSteam@endcode \| \| Command \| @code{}MarsSteam@endcode \|
\| Working Directory \| @code{}$(HOME)/.steam/steam/SteamApps/common/Survivng Mars@endcode \| \| Working Directory \| @code{}$(HOME)/.steam/steam/SteamApps/common/Survivng Mars@endcode \|
} }
@tab{Linux | <!-- --> @tab{Linux |:| <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|-------------------\|--------------------------------------------------------------\| \|-------------------\|--------------------------------------------------------------\|
\| Application Name \| @code{}Surviving Mars@endcode \| \| Application Name \| @code{}Surviving Mars@endcode \|
\| Command \| @code{}MarsSteam@endcode \| \| Command \| @code{}MarsSteam@endcode \|
\| Working Directory \| @code{}$(HOME)/.steam/steam/SteamApps/common/Survivng Mars@endcode \| \| Working Directory \| @code{}$(HOME)/.steam/steam/SteamApps/common/Survivng Mars@endcode \|
} }
@tab{macOS | <!-- --> @tab{macOS |:| <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|-------------------\|--------------------------------------------------------------\| \|-------------------\|--------------------------------------------------------------\|
\| Application Name \| @code{}Surviving Mars@endcode \| \| Application Name \| @code{}Surviving Mars@endcode \|
\| Command \| @code{}MarsSteam@endcode \| \| Command \| @code{}MarsSteam@endcode \|
\| Working Directory \| @code{}$(HOME)/.steam/steam/SteamApps/common/Survivng Mars@endcode \| \| Working Directory \| @code{}$(HOME)/.steam/steam/SteamApps/common/Survivng Mars@endcode \|
} }
@tab{Windows | <!-- --> @tab{Windows |:| <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|-------------------\|-------------------------------------------------------------------------------\| \|-------------------\|-------------------------------------------------------------------------------\|
\| Application Name \| @code{}Surviving Mars@endcode \| \| Application Name \| @code{}Surviving Mars@endcode \|
@@ -164,26 +164,26 @@ and applications to Sunshine.
} }
#### Binary (w/o working directory) #### Binary (w/o working directory)
@tabs{ @tabs_grouped{platform|:|
@tab{FreeBSD | <!-- --> @tab{FreeBSD |:| <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|-------------------\|------------------------------------------------------------------------\| \|-------------------\|------------------------------------------------------------------------\|
\| Application Name \| @code{}Surviving Mars@endcode \| \| Application Name \| @code{}Surviving Mars@endcode \|
\| Command \| @code{}$(HOME)/.steam/steam/SteamApps/common/Survivng Mars/MarsSteam@endcode \| \| Command \| @code{}$(HOME)/.steam/steam/SteamApps/common/Survivng Mars/MarsSteam@endcode \|
} }
@tab{Linux | <!-- --> @tab{Linux |:| <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|-------------------\|------------------------------------------------------------------------\| \|-------------------\|------------------------------------------------------------------------\|
\| Application Name \| @code{}Surviving Mars@endcode \| \| Application Name \| @code{}Surviving Mars@endcode \|
\| Command \| @code{}$(HOME)/.steam/steam/SteamApps/common/Survivng Mars/MarsSteam@endcode \| \| Command \| @code{}$(HOME)/.steam/steam/SteamApps/common/Survivng Mars/MarsSteam@endcode \|
} }
@tab{macOS | <!-- --> @tab{macOS |:| <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|-------------------\|------------------------------------------------------------------------\| \|-------------------\|------------------------------------------------------------------------\|
\| Application Name \| @code{}Surviving Mars@endcode \| \| Application Name \| @code{}Surviving Mars@endcode \|
\| Command \| @code{}$(HOME)/.steam/steam/SteamApps/common/Survivng Mars/MarsSteam@endcode \| \| Command \| @code{}$(HOME)/.steam/steam/SteamApps/common/Survivng Mars/MarsSteam@endcode \|
} }
@tab{Windows | <!-- --> @tab{Windows |:| <!-- -->
\| Field \| Value \| \| Field \| Value \|
\|-------------------\|---------------------------------------------------------------------------------------------\| \|-------------------\|---------------------------------------------------------------------------------------------\|
\| Application Name \| @code{}Surviving Mars@endcode \| \| Application Name \| @code{}Surviving Mars@endcode \|
@@ -371,16 +371,3 @@ UAC prompt.
"image-path": "" "image-path": ""
} }
``` ```
<div class="section_buttons">
| Previous | Next |
|:----------------------------------|----------------------------------------:|
| [Configuration](configuration.md) | [Awesome-Sunshine](awesome_sunshine.md) |
</div>
<details style="display: none;">
<summary></summary>
[TOC]
</details>
-13
View File
@@ -8,16 +8,3 @@
src="https://raw.githubusercontent.com/LizardByte/awesome-sunshine/master/README.md"> src="https://raw.githubusercontent.com/LizardByte/awesome-sunshine/master/README.md">
</md-block> </md-block>
@endhtmlonly @endhtmlonly
<div class="section_buttons">
| Previous | Next |
|:--------------------------------|--------------------:|
| [App Examples](app_examples.md) | [Guides](guides.md) |
</div>
<details style="display: none;">
<summary></summary>
[TOC]
</details>
+15 -28
View File
@@ -135,11 +135,11 @@ brew install "${dependencies[@]}"
If there are issues with an SSL header that is not found: If there are issues with an SSL header that is not found:
@tabs{ @tabs_grouped{mac-architecture|:|
@tab{ Intel | ```bash @tab{ Intel |:| ```bash
ln -s /usr/local/opt/openssl/include/openssl /usr/local/include/openssl ln -s /usr/local/opt/openssl/include/openssl /usr/local/include/openssl
```} ```}
@tab{ Apple Silicon | ```bash @tab{ Apple Silicon |:| ```bash
ln -s /opt/homebrew/opt/openssl/include/openssl /opt/homebrew/include/openssl ln -s /opt/homebrew/opt/openssl/include/openssl /opt/homebrew/include/openssl
``` ```
} }
@@ -249,33 +249,33 @@ ninja -C build
### Package ### Package
@tabs{ @tabs_grouped{platform|:|
@tab{FreeBSD | @tabs{ @tab{FreeBSD |:| @tabs{
@tab{pkg | ```bash @tab{pkg |:| ```bash
cpack -G FREEBSD --config ./build/CPackConfig.cmake cpack -G FREEBSD --config ./build/CPackConfig.cmake
```} ```}
}} }}
@tab{Linux | @tabs{ @tab{Linux |:| @tabs{
@tab{deb | ```bash @tab{deb |:| ```bash
cpack -G DEB --config ./build/CPackConfig.cmake cpack -G DEB --config ./build/CPackConfig.cmake
```} ```}
@tab{rpm | ```bash @tab{rpm |:| ```bash
cpack -G RPM --config ./build/CPackConfig.cmake cpack -G RPM --config ./build/CPackConfig.cmake
```} ```}
}} }}
@tab{macOS | @tabs{ @tab{macOS |:| @tabs{
@tab{DragNDrop | ```bash @tab{DragNDrop |:| ```bash
cpack -G DragNDrop --config ./build/CPackConfig.cmake cpack -G DragNDrop --config ./build/CPackConfig.cmake
```} ```}
}} }}
@tab{Windows | @tabs{ @tab{Windows |:| @tabs{
@tab{NSIS Installer | ```bash @tab{NSIS Installer |:| ```bash
cpack -G NSIS --config ./build/CPackConfig.cmake cpack -G NSIS --config ./build/CPackConfig.cmake
```} ```}
@tab{WiX Installer | ```bash @tab{WiX Installer |:| ```bash
cpack -G WIX --config ./build/CPackConfig.cmake cpack -G WIX --config ./build/CPackConfig.cmake
```} ```}
@tab{Portable | ```bash @tab{Portable |:| ```bash
cpack -G ZIP --config ./build/CPackConfig.cmake cpack -G ZIP --config ./build/CPackConfig.cmake
```} ```}
}} }}
@@ -288,16 +288,3 @@ It may be beneficial to build remotely in some cases. This will enable easier bu
2. Activate workflows 2. Activate workflows
3. Trigger the *CI* workflow manually 3. Trigger the *CI* workflow manually
4. Download the artifacts/binaries from the workflow run summary 4. Download the artifacts/binaries from the workflow run summary
<div class="section_buttons">
| Previous | Next |
|:--------------------------------------|--------------------------------:|
| [Troubleshooting](troubleshooting.md) | [Contributing](contributing.md) |
</div>
<details style="display: none;">
<summary></summary>
[TOC]
</details>
-13
View File
@@ -7,16 +7,3 @@
src="https://raw.githubusercontent.com/LizardByte/Sunshine/changelog/CHANGELOG.md"> src="https://raw.githubusercontent.com/LizardByte/Sunshine/changelog/CHANGELOG.md">
</md-block> </md-block>
@endhtmlonly @endhtmlonly
<div class="section_buttons">
| Previous | Next |
|:--------------------------------------|------------------------------:|
| [Getting Started](getting_started.md) | [Docker](../DOCKER_README.md) |
</div>
<details style="display: none;">
<summary></summary>
[TOC]
</details>
+9 -5
View File
@@ -19,12 +19,16 @@ document.addEventListener("DOMContentLoaded", function() {
const newCell = document.createElement("td"); const newCell = document.createElement("td");
newCell.setAttribute("colspan", "3"); newCell.setAttribute("colspan", "3");
const newCode = document.createElement("code"); const openButton = document.createElement("button");
newCode.className = "open-button"; openButton.className = "open-button";
newCode.setAttribute("onclick", `window.open('https://${document.getElementById('host-authority').value}/config/#${sectionId}', '_blank')`); openButton.type = "button";
newCode.textContent = "Open"; openButton.textContent = "Open configuration";
openButton.addEventListener("click", () => {
const authority = document.getElementById("host-authority").value;
window.open(`https://${authority}/config/#${sectionId}`, "_blank", "noopener");
});
newCell.appendChild(newCode); newCell.appendChild(openButton);
newRow.appendChild(newCell); newRow.appendChild(newCell);
// get the table body // get the table body
+1 -14
View File
@@ -1,6 +1,6 @@
# Configuration # Configuration
@admonition{ Host authority | @htmlonly @admonition{ Host authority |:| @htmlonly
By providing the host authority (URI + port), you can easily open each configuration option in the config UI. By providing the host authority (URI + port), you can easily open each configuration option in the config UI.
<br> <br>
<script src="configuration.js"></script> <script src="configuration.js"></script>
@@ -3455,16 +3455,3 @@ supported on the current platform.
<td>good for fast encoding and low-latency streaming</td> <td>good for fast encoding and low-latency streaming</td>
</tr> </tr>
</table> </table>
<div class="section_buttons">
| Previous | Next |
|:------------------|--------------------------------:|
| [Legal](legal.md) | [App Examples](app_examples.md) |
</div>
<details style="display: none;">
<summary></summary>
[TOC]
</details>
+3 -16
View File
@@ -23,11 +23,11 @@ Read our contribution guide in our organization level
#### Building #### Building
@tabs{ @tabs{
@tab{CMake | ```bash @tab{CMake |:| ```bash
cmake -B build -G Ninja -S . --target web-ui cmake -B build -G Ninja -S . --target web-ui
ninja -C build web-ui ninja -C build web-ui
```} ```}
@tab{Manual | ```bash @tab{Manual |:| ```bash
npm run dev npm run dev
```} ```}
} }
@@ -46,7 +46,7 @@ The default language is `en` (English).
![](https://app.lizardbyte.dev/dashboard/crowdin/LizardByte_graph.svg) ![](https://app.lizardbyte.dev/dashboard/crowdin/LizardByte_graph.svg)
@admonition{Community | We are looking for language coordinators to help approve translations. @admonition{Community |:| We are looking for language coordinators to help approve translations.
The goal is to have the bars above filled with green! The goal is to have the bars above filled with green!
If you are interested, please reach out to us on our Discord server.} If you are interested, please reach out to us on our Discord server.}
@@ -210,16 +210,3 @@ Even if your changes cannot be covered in the CI, we still encourage you to writ
maintainers to run the tests locally. maintainers to run the tests locally.
[crowdin-url]: https://translate.lizardbyte.dev [crowdin-url]: https://translate.lizardbyte.dev
<div class="section_buttons">
| Previous | Next |
|:------------------------|-------------------------------------------------------------:|
| [Building](building.md) | [Source Code](../third-party/doxyconfig/docs/source_code.md) |
</div>
<details style="display: none;">
<summary></summary>
[TOC]
</details>
+1
View File
@@ -0,0 +1 @@
globalThis.initCrowdIn('LizardByte-docs', 'dockle')
+19 -4
View File
@@ -1,6 +1,21 @@
/* A fake button as doxygen doesn't allow button elements */ /* Link generated configuration actions to Sunshine's web UI. */
.open-button { .open-button {
background: var(--primary-color); background: var(--dockle-primary);
color: white; border: 1px solid color-mix(in srgb, var(--dockle-primary) 75%, black);
cursor: pointer; border-radius: var(--dockle-radius);
color: white;
cursor: pointer;
font: inherit;
font-weight: 650;
padding: 0.5rem 0.8rem;
}
.open-button:hover,
.open-button:focus-visible {
filter: brightness(1.1);
}
.open-button:focus-visible {
outline: 2px solid color-mix(in srgb, var(--dockle-primary) 40%, transparent);
outline-offset: 2px;
} }
-13
View File
@@ -22,16 +22,3 @@ Sunshine does have some limitations, as compared to Nvidia GameStream.
* Automatic game/application list. * Automatic game/application list.
* Changing game settings automatically to optimize streaming. * Changing game settings automatically to optimize streaming.
<div class="section_buttons">
| Previous | Next |
|:------------------------------------------------|------------------:|
| [Third-party Packages](third_party_packages.md) | [Legal](legal.md) |
</div>
<details style="display: none;">
<summary></summary>
[TOC]
</details>
+24 -35
View File
@@ -195,11 +195,11 @@ pacman -R sunshine
Configure the `stable` repository for releases or the `beta` repository for prereleases. The setup script Configure the `stable` repository for releases or the `beta` repository for prereleases. The setup script
automatically selects the appropriate Debian or Ubuntu release. automatically selects the appropriate Debian or Ubuntu release.
@tabs{ @tabs_grouped{release-channel|:|
@tab_with_pipe{ Stable |:| ```bash @tab{ Stable |:| ```bash
curl -1sLf 'https://dl.cloudsmith.io/public/lizardbyte/stable/cfg/setup/bash.deb.sh' | sudo -E bash curl -1sLf 'https://dl.cloudsmith.io/public/lizardbyte/stable/cfg/setup/bash.deb.sh' | sudo -E bash
```} ```}
@tab_with_pipe{ Beta |:| ```bash @tab{ Beta |:| ```bash
curl -1sLf 'https://dl.cloudsmith.io/public/lizardbyte/beta/cfg/setup/bash.deb.sh' | sudo -E bash curl -1sLf 'https://dl.cloudsmith.io/public/lizardbyte/beta/cfg/setup/bash.deb.sh' | sudo -E bash
```} ```}
} }
@@ -240,22 +240,22 @@ sudo apt remove sunshine
Configure the `stable` repository for releases or the `beta` repository for prereleases. Cloudsmith's setup script Configure the `stable` repository for releases or the `beta` repository for prereleases. Cloudsmith's setup script
automatically selects Fedora or openSUSE and the appropriate release. automatically selects Fedora or openSUSE and the appropriate release.
@tabs{ @tabs_grouped{release-channel|:|
@tab_with_pipe{ Stable |:| ```bash @tab{ Stable |:| ```bash
curl -1sLf 'https://dl.cloudsmith.io/public/lizardbyte/stable/cfg/setup/bash.rpm.sh' | sudo -E bash curl -1sLf 'https://dl.cloudsmith.io/public/lizardbyte/stable/cfg/setup/bash.rpm.sh' | sudo -E bash
```} ```}
@tab_with_pipe{ Beta |:| ```bash @tab{ Beta |:| ```bash
curl -1sLf 'https://dl.cloudsmith.io/public/lizardbyte/beta/cfg/setup/bash.rpm.sh' | sudo -E bash curl -1sLf 'https://dl.cloudsmith.io/public/lizardbyte/beta/cfg/setup/bash.rpm.sh' | sudo -E bash
```} ```}
} }
Install Sunshine with your distribution's package manager. Install Sunshine with your distribution's package manager.
@tabs{ @tabs_grouped{distribution|:|
@tab{ Fedora | ```bash @tab{ Fedora |:| ```bash
sudo dnf install Sunshine sudo dnf install Sunshine
```} ```}
@tab{ openSUSE | ```bash @tab{ openSUSE |:| ```bash
sudo zypper install Sunshine sudo zypper install Sunshine
```} ```}
} }
@@ -264,11 +264,11 @@ Install Sunshine with your distribution's package manager.
Download `Sunshine-{version}-1.{distro+version}.{arch}.rpm` and run the following command. Download `Sunshine-{version}-1.{distro+version}.{arch}.rpm` and run the following command.
@tabs{ @tabs_grouped{distribution|:|
@tab{ Fedora | ```bash @tab{ Fedora |:| ```bash
sudo dnf install ./Sunshine-{version}-1.{distro+version}.{arch}.rpm sudo dnf install ./Sunshine-{version}-1.{distro+version}.{arch}.rpm
```} ```}
@tab{ openSUSE | ```bash @tab{ openSUSE |:| ```bash
sudo zypper install ./Sunshine-{version}-1.{distro+version}.{arch}.rpm sudo zypper install ./Sunshine-{version}-1.{distro+version}.{arch}.rpm
```} ```}
} }
@@ -282,11 +282,11 @@ Download `Sunshine-{version}-1.{distro+version}.{arch}.rpm` and run the followin
##### Uninstall ##### Uninstall
@tabs{ @tabs_grouped{distribution|:|
@tab{ Fedora | ```bash @tab{ Fedora |:| ```bash
sudo dnf remove Sunshine sudo dnf remove Sunshine
```} ```}
@tab{ openSUSE | ```bash @tab{ openSUSE |:| ```bash
sudo zypper remove Sunshine sudo zypper remove Sunshine
```} ```}
} }
@@ -678,19 +678,20 @@ by default. You may replace *localhost* with your internal ip address.
7. If you run into issues, logs are available in the `Troubleshooting` tab. 7. If you run into issues, logs are available in the `Troubleshooting` tab.
You can navigate through each warning/error message for clues to the issue. You can navigate through each warning/error message for clues to the issue.
![Logs](images/troubleshooting-logs.png) ![Logs](images/troubleshooting-logs.png)
### Arguments ### Arguments
To get a list of available arguments, run the following command. To get a list of available arguments, run the following command.
@tabs{ @tabs_grouped{linux-package|:|
@tab{ General | ```bash @tab{ General |:| ```bash
sunshine --help sunshine --help
```} ```}
@tab{ AppImage | ```bash @tab{ AppImage |:| ```bash
./Sunshine_{version}_{arch}.AppImage --help ./Sunshine_{version}_{arch}.AppImage --help
```} ```}
@tab{ Flatpak | ```bash @tab{ Flatpak |:| ```bash
flatpak run --command=sunshine dev.lizardbyte.app.Sunshine --help flatpak run --command=sunshine dev.lizardbyte.app.Sunshine --help
```} ```}
} }
@@ -755,14 +756,14 @@ Streaming HDR content is officially supported on Windows hosts and experimentall
Additional information: Additional information:
@tabs{ @tabs_grouped{platform|:|
@tab{ Windows | @tab{ Windows |:|
- HDR streaming is supported for Intel, AMD, and NVIDIA GPUs that support encoding HEVC Main 10 or AV1 10-bit profiles. - HDR streaming is supported for Intel, AMD, and NVIDIA GPUs that support encoding HEVC Main 10 or AV1 10-bit profiles.
- We recommend calibrating the display by streaming the Windows HDR Calibration app to your client device and saving an HDR calibration profile to use while streaming. - We recommend calibrating the display by streaming the Windows HDR Calibration app to your client device and saving an HDR calibration profile to use while streaming.
- Older games that use NVIDIA-specific NVAPI HDR rather than native Windows HDR support may not display properly in HDR. - Older games that use NVIDIA-specific NVAPI HDR rather than native Windows HDR support may not display properly in HDR.
} }
@tab{ Linux | @tab{ Linux |:|
- HDR streaming is supported for Intel and AMD GPUs that support encoding HEVC Main 10 or AV1 10-bit profiles using VAAPI. - HDR streaming is supported for Intel and AMD GPUs that support encoding HEVC Main 10 or AV1 10-bit profiles using VAAPI.
- The KMS capture backend is required for HDR capture. Other capture methods, like NvFBC or X11, do not support HDR. - The KMS capture backend is required for HDR capture. Other capture methods, like NvFBC or X11, do not support HDR.
- You will need a desktop environment with a compositor that supports HDR rendering, such as Gamescope or KDE Plasma 6. - You will need a desktop environment with a compositor that supports HDR rendering, such as Gamescope or KDE Plasma 6.
@@ -777,20 +778,8 @@ Tutorial videos are available [here](https://www.youtube.com/playlist?list=PLMYr
Guides are available [here](guides.md). Guides are available [here](guides.md).
@admonition{Community! | @admonition{Community! |:|
Tutorials and Guides are community generated. Want to contribute? Reach out to us on our discord server.} Tutorials and Guides are community generated. Want to contribute? Reach out to us on our discord server.}
<div class="section_buttons">
| Previous | Next |
|:-------------------------|--------------------------:|
| [Overview](../README.md) | [Changelog](changelog.md) |
</div>
<details style="display: none;">
<summary></summary>
[TOC]
</details>
[latest-release]: https://github.com/LizardByte/Sunshine/releases/latest [latest-release]: https://github.com/LizardByte/Sunshine/releases/latest
+1 -14
View File
@@ -1,19 +1,6 @@
# Guides # Guides
@admonition{Community | A collection of guides written by the community is available on our @admonition{Community |:| A collection of guides written by the community is available on our
[blog](https://app.lizardbyte.dev/blog). [blog](https://app.lizardbyte.dev/blog).
Feel free to contribute your own tips and trips by making a PR to Feel free to contribute your own tips and trips by making a PR to
[LizardByte.github.io](https://github.com/LizardByte/LizardByte.github.io).} [LizardByte.github.io](https://github.com/LizardByte/LizardByte.github.io).}
<div class="section_buttons">
| Previous | Next |
|:----------------------------------------|--------------------------------------------:|
| [Awesome-Sunshine](awesome_sunshine.md) | [Performance Tuning](performance_tuning.md) |
</div>
<details style="display: none;">
<summary></summary>
[TOC]
</details>
-13
View File
@@ -19,16 +19,3 @@ Motion Picture Experts Group (MPEG-LA) and/or any other necessary licensing requ
In summary, while Sunshine is free to use, it is the user's responsibility to ensure compliance with all applicable In summary, while Sunshine is free to use, it is the user's responsibility to ensure compliance with all applicable
licensing requirements when redistributing the software as part of a commercial offering. If you have any questions or licensing requirements when redistributing the software as part of a commercial offering. If you have any questions or
concerns about using Sunshine in a commercial setting, we recommend consulting with a lawyer. concerns about using Sunshine in a commercial setting, we recommend consulting with a lawyer.
<div class="section_buttons">
| Previous | Next |
|:------------------------------------------------|----------------------------------:|
| [Gamestream Migration](gamestream_migration.md) | [Configuration](configuration.md) |
</div>
<details style="display: none;">
<summary></summary>
[TOC]
</details>
-13
View File
@@ -10,16 +10,3 @@ applies to `amfenc` and `libx264`.
## NVIDIA ## NVIDIA
Enabling *Fast Sync* in Nvidia settings may help reduce latency. Enabling *Fast Sync* in Nvidia settings may help reduce latency.
<div class="section_buttons">
| Previous | Next |
|:--------------------|--------------:|
| [Guides](guides.md) | [API](api.md) |
</div>
<details style="display: none;">
<summary></summary>
[TOC]
</details>
-13
View File
@@ -14,16 +14,3 @@
## Solus ## Solus
[![Solus](https://img.shields.io/badge/dynamic/xml.svg?color=orange&label=Solus&style=for-the-badge&prefix=v&query=%2F%2Ftr%5B%40id%3D%27solus%27%5D%2Ftd%5B3%5D%2Fspan%2Fa&url=https%3A%2F%2Frepology.org%2Fproject%2Fsunshine%2Fversions&logo=solus)](https://dev.getsol.us/source/sunshine) [![Solus](https://img.shields.io/badge/dynamic/xml.svg?color=orange&label=Solus&style=for-the-badge&prefix=v&query=%2F%2Ftr%5B%40id%3D%27solus%27%5D%2Ftd%5B3%5D%2Fspan%2Fa&url=https%3A%2F%2Frepology.org%2Fproject%2Fsunshine%2Fversions&logo=solus)](https://dev.getsol.us/source/sunshine)
<div class="section_buttons">
| Previous | Next |
|:------------------------------|------------------------------------------------:|
| [Docker](../DOCKER_README.md) | [Gamestream Migration](gamestream_migration.md) |
</div>
<details style="display: none;">
<summary></summary>
[TOC]
</details>
+6 -19
View File
@@ -5,16 +5,16 @@
### Forgotten Credentials ### Forgotten Credentials
If you forgot your credentials to the web UI, try this. If you forgot your credentials to the web UI, try this.
@tabs{ @tabs_grouped{linux-package|:|
@tab{General | ```bash @tab{General |:| ```bash
sunshine --creds {new-username} {new-password} sunshine --creds {new-username} {new-password}
``` ```
} }
@tab{AppImage | ```bash @tab{AppImage |:| ```bash
./sunshine.AppImage --creds {new-username} {new-password} ./sunshine.AppImage --creds {new-username} {new-password}
``` ```
} }
@tab{Flatpak | ```bash @tab{Flatpak |:| ```bash
flatpak run --command=sunshine dev.lizardbyte.app.Sunshine --creds {new-username} {new-password} flatpak run --command=sunshine dev.lizardbyte.app.Sunshine --creds {new-username} {new-password}
``` ```
} }
@@ -193,11 +193,11 @@ restarts. Approve the Remote Desktop prompt and select the display to capture wh
If the Web UI is inaccessible, stop Sunshine and delete the token manually: If the Web UI is inaccessible, stop Sunshine and delete the token manually:
@tabs{ @tabs{
@tab{Linux / FreeBSD | ```bash @tab{Linux / FreeBSD |:| ```bash
rm "${XDG_CONFIG_HOME:-$HOME/.config}/sunshine/portal_token" rm "${XDG_CONFIG_HOME:-$HOME/.config}/sunshine/portal_token"
``` ```
} }
@tab{Flatpak | ```bash @tab{Flatpak |:| ```bash
rm "$HOME/.var/app/dev.lizardbyte.app.Sunshine/config/sunshine/portal_token" rm "$HOME/.var/app/dev.lizardbyte.app.Sunshine/config/sunshine/portal_token"
``` ```
} }
@@ -385,16 +385,3 @@ permissions on the disk.
### Stuttering ### Stuttering
If you experience stuttering using NVIDIA, try disabling `vsync:fast` in the NVIDIA Control Panel. If you experience stuttering using NVIDIA, try disabling `vsync:fast` in the NVIDIA Control Panel.
<div class="section_buttons">
| Previous | Next |
|:--------------|------------------------:|
| [API](api.md) | [Building](building.md) |
</div>
<details style="display: none;">
<summary></summary>
[TOC]
</details>
+26 -26
View File
@@ -1004,7 +1004,7 @@ namespace confighttp {
* @param response The HTTP response object. * @param response The HTTP response object.
* @param request The HTTP request object. * @param request The HTTP request object.
* *
* @api_examples{/api/csrf-token| GET| null} * @api_examples{/api/csrf-token|:| GET|:| null}
*/ */
void getCSRFToken(const resp_https_t &response, const req_https_t &request) { void getCSRFToken(const resp_https_t &response, const req_https_t &request) {
if (!authenticate(response, request)) { if (!authenticate(response, request)) {
@@ -1026,7 +1026,7 @@ namespace confighttp {
* @param response The HTTP response object. * @param response The HTTP response object.
* @param request The HTTP request object. * @param request The HTTP request object.
* *
* @api_examples{/api/apps| GET| null} * @api_examples{/api/apps|:| GET|:| null}
*/ */
void getApps(const resp_https_t &response, const req_https_t &request) { void getApps(const resp_https_t &response, const req_https_t &request) {
if (!authenticate(response, request)) { if (!authenticate(response, request)) {
@@ -1111,7 +1111,7 @@ namespace confighttp {
* } * }
* @endcode * @endcode
* *
* @api_examples{/api/apps| POST| {"name":"Hello, World!","index":-1}} * @api_examples{/api/apps|:| POST|:| {"name":"Hello, World!","index":-1}}
*/ */
void saveApp(const resp_https_t &response, const req_https_t &request) { void saveApp(const resp_https_t &response, const req_https_t &request) {
if (!check_content_type(response, request, "application/json")) { if (!check_content_type(response, request, "application/json")) {
@@ -1186,7 +1186,7 @@ namespace confighttp {
* @param response The HTTP response object. * @param response The HTTP response object.
* @param request The HTTP request object. * @param request The HTTP request object.
* *
* @api_examples{/api/apps/close| POST| null} * @api_examples{/api/apps/close|:| POST|:| null}
*/ */
void closeApp(const resp_https_t &response, const req_https_t &request) { void closeApp(const resp_https_t &response, const req_https_t &request) {
if (!authenticate(response, request)) { if (!authenticate(response, request)) {
@@ -1212,7 +1212,7 @@ namespace confighttp {
* @param response The HTTP response object. * @param response The HTTP response object.
* @param request The HTTP request object. * @param request The HTTP request object.
* *
* @api_examples{/api/apps/9999| DELETE| null} * @api_examples{/api/apps/9999|:| DELETE|:| null}
*/ */
void deleteApp(const resp_https_t &response, const req_https_t &request) { void deleteApp(const resp_https_t &response, const req_https_t &request) {
if (!authenticate(response, request)) { if (!authenticate(response, request)) {
@@ -1263,7 +1263,7 @@ namespace confighttp {
* @param response The HTTP response object. * @param response The HTTP response object.
* @param request The HTTP request object. * @param request The HTTP request object.
* *
* @api_examples{/api/clients/list| GET| null} * @api_examples{/api/clients/list|:| GET|:| null}
*/ */
void getClients(const resp_https_t &response, const req_https_t &request) { void getClients(const resp_https_t &response, const req_https_t &request) {
if (!authenticate(response, request)) { if (!authenticate(response, request)) {
@@ -1292,7 +1292,7 @@ namespace confighttp {
* } * }
* @endcode * @endcode
* *
* @api_examples{/api/clients/update| POST| {"uuid":"<uuid>","enabled":true}} * @api_examples{/api/clients/update|:| POST|:| {"uuid":"<uuid>","enabled":true}}
*/ */
void updateClient(resp_https_t response, req_https_t request) { void updateClient(resp_https_t response, req_https_t request) {
if (!check_content_type(response, request, "application/json")) { if (!check_content_type(response, request, "application/json")) {
@@ -1346,7 +1346,7 @@ namespace confighttp {
* } * }
* @endcode * @endcode
* *
* @api_examples{/api/unpair| POST| {"uuid":"1234"}} * @api_examples{/api/unpair|:| POST|:| {"uuid":"1234"}}
*/ */
void unpair(const resp_https_t &response, const req_https_t &request) { void unpair(const resp_https_t &response, const req_https_t &request) {
if (!check_content_type(response, request, "application/json")) { if (!check_content_type(response, request, "application/json")) {
@@ -1390,7 +1390,7 @@ namespace confighttp {
* @param response The HTTP response object. * @param response The HTTP response object.
* @param request The HTTP request object. * @param request The HTTP request object.
* *
* @api_examples{/api/clients/unpair-all| POST| null} * @api_examples{/api/clients/unpair-all|:| POST|:| null}
*/ */
void unpairAll(const resp_https_t &response, const req_https_t &request) { void unpairAll(const resp_https_t &response, const req_https_t &request) {
if (!authenticate(response, request)) { if (!authenticate(response, request)) {
@@ -1417,7 +1417,7 @@ namespace confighttp {
* @param response The HTTP response object. * @param response The HTTP response object.
* @param request The HTTP request object. * @param request The HTTP request object.
* *
* @api_examples{/api/config| GET| null} * @api_examples{/api/config|:| GET|:| null}
*/ */
void getConfig(const resp_https_t &response, const req_https_t &request) { void getConfig(const resp_https_t &response, const req_https_t &request) {
if (!authenticate(response, request)) { if (!authenticate(response, request)) {
@@ -1445,7 +1445,7 @@ namespace confighttp {
* @param response The HTTP response object. * @param response The HTTP response object.
* @param request The HTTP request object. * @param request The HTTP request object.
* *
* @api_examples{/api/configLocale| GET| null} * @api_examples{/api/configLocale|:| GET|:| null}
*/ */
void getLocale(const resp_https_t &response, const req_https_t &request) { void getLocale(const resp_https_t &response, const req_https_t &request) {
// we need to return the locale whether authenticated or not // we need to return the locale whether authenticated or not
@@ -1471,7 +1471,7 @@ namespace confighttp {
* *
* @attention{It is recommended to ONLY save the config settings that differ from the default behavior.} * @attention{It is recommended to ONLY save the config settings that differ from the default behavior.}
* *
* @api_examples{/api/config| POST| {"key":"value"}} * @api_examples{/api/config|:| POST|:| {"key":"value"}}
*/ */
void saveConfig(const resp_https_t &response, const req_https_t &request) { void saveConfig(const resp_https_t &response, const req_https_t &request) {
if (!check_content_type(response, request, "application/json")) { if (!check_content_type(response, request, "application/json")) {
@@ -1520,7 +1520,7 @@ namespace confighttp {
* *
* @note{The index in the url path is the application index.} * @note{The index in the url path is the application index.}
* *
* @api_examples{/api/covers/9999 | GET| null} * @api_examples{/api/covers/9999 |:| GET|:| null}
*/ */
void getCover(const resp_https_t &response, const req_https_t &request) { void getCover(const resp_https_t &response, const req_https_t &request) {
if (!authenticate(response, request)) { if (!authenticate(response, request)) {
@@ -1590,7 +1590,7 @@ namespace confighttp {
* } * }
* @endcode * @endcode
* *
* @api_examples{/api/covers/upload| POST| {"key":"igdb_1234","url":"https://images.igdb.com/igdb/image/upload/t_cover_big_2x/abc123.png"}} * @api_examples{/api/covers/upload|:| POST|:| {"key":"igdb_1234","url":"https://images.igdb.com/igdb/image/upload/t_cover_big_2x/abc123.png"}}
*/ */
void uploadCover(const resp_https_t &response, const req_https_t &request) { void uploadCover(const resp_https_t &response, const req_https_t &request) {
if (!check_content_type(response, request, "application/json")) { if (!check_content_type(response, request, "application/json")) {
@@ -1646,7 +1646,7 @@ namespace confighttp {
* @param response The HTTP response object. * @param response The HTTP response object.
* @param request The HTTP request object. * @param request The HTTP request object.
* *
* @api_examples{/api/logs| GET| null} * @api_examples{/api/logs|:| GET|:| null}
*/ */
void getLogs(const resp_https_t &response, const req_https_t &request) { void getLogs(const resp_https_t &response, const req_https_t &request) {
if (!authenticate(response, request)) { if (!authenticate(response, request)) {
@@ -1678,7 +1678,7 @@ namespace confighttp {
* } * }
* @endcode * @endcode
* *
* @api_examples{/api/password| POST| {"currentUsername":"admin","currentPassword":"admin","newUsername":"admin","newPassword":"admin","confirmNewPassword":"admin"}} * @api_examples{/api/password|:| POST|:| {"currentUsername":"admin","currentPassword":"admin","newUsername":"admin","newPassword":"admin","confirmNewPassword":"admin"}}
*/ */
void savePassword(const resp_https_t &response, const req_https_t &request) { void savePassword(const resp_https_t &response, const req_https_t &request) {
if (!check_content_type(response, request, "application/json")) { if (!check_content_type(response, request, "application/json")) {
@@ -1747,7 +1747,7 @@ namespace confighttp {
/** /**
* @brief List client pairing requests that are waiting for PIN approval. * @brief List client pairing requests that are waiting for PIN approval.
* *
* @api_examples{/api/pin| GET| null} * @api_examples{/api/pin|:| GET|:| null}
*/ */
void getPendingPairings(const resp_https_t &response, const req_https_t &request) { void getPendingPairings(const resp_https_t &response, const req_https_t &request) {
if (!authenticate(response, request)) { if (!authenticate(response, request)) {
@@ -1777,7 +1777,7 @@ namespace confighttp {
* } * }
* @endcode * @endcode
* *
* @api_examples{/api/pin| DELETE| {"pairing_id":"0123456789abcdef0123456789abcdef"}} * @api_examples{/api/pin|:| DELETE|:| {"pairing_id":"0123456789abcdef0123456789abcdef"}}
*/ */
void cancelPairing(const resp_https_t &response, const req_https_t &request) { void cancelPairing(const resp_https_t &response, const req_https_t &request) {
if (!check_content_type(response, request, "application/json")) { if (!check_content_type(response, request, "application/json")) {
@@ -1828,7 +1828,7 @@ namespace confighttp {
* } * }
* @endcode * @endcode
* *
* @api_examples{/api/pin| POST| {"pairing_id":"0123456789abcdef0123456789abcdef","pin":"1234","name":"My PC"}} * @api_examples{/api/pin|:| POST|:| {"pairing_id":"0123456789abcdef0123456789abcdef","pin":"1234","name":"My PC"}}
*/ */
void savePin(const resp_https_t &response, const req_https_t &request) { void savePin(const resp_https_t &response, const req_https_t &request) {
if (!check_content_type(response, request, "application/json")) { if (!check_content_type(response, request, "application/json")) {
@@ -1879,7 +1879,7 @@ namespace confighttp {
* @param response The HTTP response object. * @param response The HTTP response object.
* @param request The HTTP request object. * @param request The HTTP request object.
* *
* @api_examples{/api/reset-display-device-persistence| POST| null} * @api_examples{/api/reset-display-device-persistence|:| POST|:| null}
*/ */
void resetDisplayDevicePersistence(const resp_https_t &response, const req_https_t &request) { void resetDisplayDevicePersistence(const resp_https_t &response, const req_https_t &request) {
if (!authenticate(response, request)) { if (!authenticate(response, request)) {
@@ -1905,7 +1905,7 @@ namespace confighttp {
* @param response HTTP response used for authentication, CSRF, and status output. * @param response HTTP response used for authentication, CSRF, and status output.
* @param request HTTP request carrying the client identity and CSRF token. * @param request HTTP request carrying the client identity and CSRF token.
* *
* @api_examples{/api/reset-portal-token| POST| null} * @api_examples{/api/reset-portal-token|:| POST|:| null}
*/ */
void resetPortalToken(const resp_https_t &response, const req_https_t &request) { void resetPortalToken(const resp_https_t &response, const req_https_t &request) {
if (!authenticate(response, request)) { if (!authenticate(response, request)) {
@@ -1940,7 +1940,7 @@ namespace confighttp {
* @param response HTTP response used for authentication or CSRF failures. * @param response HTTP response used for authentication or CSRF failures.
* @param request HTTP request carrying the client identity and CSRF token. * @param request HTTP request carrying the client identity and CSRF token.
* *
* @api_examples{/api/restart| POST| null} * @api_examples{/api/restart|:| POST|:| null}
*/ */
void restart(const resp_https_t &response, const req_https_t &request) { void restart(const resp_https_t &response, const req_https_t &request) {
if (!authenticate(response, request)) { if (!authenticate(response, request)) {
@@ -2033,7 +2033,7 @@ namespace confighttp {
* @param response The HTTP response object. * @param response The HTTP response object.
* @param request The HTTP request object. * @param request The HTTP request object.
* *
* @api_examples{/api/virtual-input/status| GET| null} * @api_examples{/api/virtual-input/status|:| GET|:| null}
*/ */
void getVirtualInputStatus(const resp_https_t &response, const req_https_t &request) { void getVirtualInputStatus(const resp_https_t &response, const req_https_t &request) {
if (!authenticate(response, request)) { if (!authenticate(response, request)) {
@@ -2054,7 +2054,7 @@ namespace confighttp {
* @param response HTTP response object. * @param response HTTP response object.
* @param request Authenticated HTTP request. * @param request Authenticated HTTP request.
* *
* @api_examples{/api/virtual-input/license| GET| null} * @api_examples{/api/virtual-input/license|:| GET|:| null}
*/ */
void getVirtualInputLicense(const resp_https_t &response, const req_https_t &request) { void getVirtualInputLicense(const resp_https_t &response, const req_https_t &request) {
get_virtual_input_license(response, request); get_virtual_input_license(response, request);
@@ -2070,7 +2070,7 @@ namespace confighttp {
* @param response HTTP response object. * @param response HTTP response object.
* @param request Authenticated HTTP request with a JSON action. * @param request Authenticated HTTP request with a JSON action.
* *
* @api_examples{/api/virtual-input/license| POST| {"action":"validate"}} * @api_examples{/api/virtual-input/license|:| POST|:| {"action":"validate"}}
*/ */
void updateVirtualInputLicense(const resp_https_t &response, const req_https_t &request) { void updateVirtualInputLicense(const resp_https_t &response, const req_https_t &request) {
if (!authenticate(response, request)) { if (!authenticate(response, request)) {
@@ -2235,7 +2235,7 @@ namespace confighttp {
* @note On Windows, an empty or root path returns the list of available drive letters. * @note On Windows, an empty or root path returns the list of available drive letters.
* @note On non-Windows, an empty path defaults to the filesystem root ("/"). * @note On non-Windows, an empty path defaults to the filesystem root ("/").
* *
* @api_examples{/api/browse?path=/home/user&type=directory| GET| null} * @api_examples{/api/browse?path=/home/user&type=directory|:| GET|:| null}
*/ */
void browseDirectory(const resp_https_t &response, const req_https_t &request) { void browseDirectory(const resp_https_t &response, const req_https_t &request) {
if (!authenticate(response, request)) { if (!authenticate(response, request)) {
Vendored Submodule
+1
Submodule third-party/dockle added at c1bca827d9.
Submodule third-party/doxyconfig deleted from 419127bad8.