diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 1f2d1ab6..905de6fc 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -6,11 +6,43 @@ on:
pull_request:
branches: [master, 'chromatics-4.0.x', 'chromatics-4.*']
+# Minimum-privilege GITHUB_TOKEN: the workflow only checks out the repo and
+# runs build/test/manifest-validation locally on the runner — it never calls
+# the GitHub API to write commits, comments, releases, packages, etc. So
+# contents: read is the only permission needed. Explicit block also silences
+# the GitHub Advanced Security warning about unrestricted token scope.
+permissions:
+ contents: read
+
+# Deduplicate push + pull_request runs on the same branch. A commit pushed to
+# a PR branch fires both a `push` event and a `pull_request:synchronize`
+# event; with the same concurrency group key (resolved from
+# pull_request.head.ref on PR events and ref_name on push events), the
+# newer run cancels the older one, so we get a single CI completion per
+# commit instead of two parallel ones.
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event.pull_request.head.ref || github.ref_name }}
+ cancel-in-progress: true
+
jobs:
build-and-test:
- # GDI + WASAPI loopback means the project targets
- # net10.0-windows7.0 and can only build on a Windows runner.
- runs-on: windows-latest
+ # GDI + WASAPI loopback + Windows.Devices.Lights.LampArray plus the
+ # sparse-package PackageManager APIs mean the project targets
+ # net10.0-windows10.0.19041.0 and can only build on a Windows runner.
+ #
+ # Matrix on both currently-supported GitHub-hosted Windows runners so
+ # platform-specific regressions surface early:
+ # - windows-2022 = Server 2022, build 20348 (~Win11 21H2 equivalent)
+ # - windows-2025 = Server 2025, build 26100 (~Win11 24H2 equivalent)
+ # windows-2019 (build 17763) was retired by GitHub Actions in mid-2025, so
+ # SupportedOSPlatformVersion=10.0.17763.0 cannot be exercised in CI today;
+ # OS-guarded codepaths (e.g. SparsePackageRegistrar skipping on <19041) are
+ # validated locally / via user-reported issues.
+ strategy:
+ fail-fast: false
+ matrix:
+ runner: [windows-2022, windows-2025]
+ runs-on: ${{ matrix.runner }}
steps:
- name: Checkout
@@ -21,11 +53,58 @@ jobs:
with:
dotnet-version: '10.0.x'
+ # nuget.org occasionally returns 502 Bad Gateway mid-restore (saw
+ # one such failure on commit bb0c9ed, second run on the same SHA
+ # succeeded immediately). Retry up to 3 times before failing the
+ # build to absorb transient feed flakiness without needing a
+ # manual re-run.
- name: Restore
- run: dotnet restore Chromatics.sln
+ uses: nick-fields/retry@v3
+ with:
+ timeout_minutes: 10
+ max_attempts: 3
+ retry_wait_seconds: 30
+ shell: pwsh
+ command: dotnet restore Chromatics.sln
- name: Build (Release, no restore)
run: dotnet build Chromatics.sln --configuration Release --no-restore --nologo
- name: Test (Release, no build)
run: dotnet test Chromatics.Tests/Chromatics.Tests.csproj --configuration Release --no-build --nologo --verbosity normal
+
+ # Validate the Dynamic Lighting sparse-package manifest by packing it
+ # with makeappx (no signing, /nv = no schema validation skipping). The
+ # real publish.py pipeline does this against a freshly-bumped version
+ # number; here we substitute 0.0.0.0 just to satisfy the 4-part
+ # version requirement. Catches schema regressions (typo'd capability
+ # names, namespace drift, missing assets) before they reach a user,
+ # because registration failures at runtime are silent — the AppX
+ # subsystem reports them via DeploymentResult.ErrorText into the log,
+ # not via a dialog or exception. SDK 10 ships on both runners.
+ - name: Validate sparse-package manifest (makeappx)
+ shell: pwsh
+ run: |
+ $sdk = Get-ChildItem 'C:\Program Files (x86)\Windows Kits\10\bin' -Directory `
+ | Where-Object { $_.Name -match '^10\.' } `
+ | Sort-Object Name -Descending `
+ | Select-Object -First 1
+ if (-not $sdk) { throw "Windows 10 SDK not found on runner" }
+ $makeappx = Join-Path $sdk.FullName 'x64\makeappx.exe'
+ if (-not (Test-Path $makeappx)) { throw "makeappx.exe not found at $makeappx" }
+ Write-Host "Using makeappx at $makeappx"
+
+ $src = 'Chromatics/Resources/SparsePackage'
+ $work = Join-Path $env:RUNNER_TEMP 'sparse-validate'
+ if (Test-Path $work) { Remove-Item $work -Recurse -Force }
+ Copy-Item $src $work -Recurse
+
+ # Substitute the {{VERSION}} placeholder so the manifest parses.
+ $manifest = Join-Path $work 'AppxManifest.xml'
+ (Get-Content $manifest -Raw) -replace '\{\{VERSION\}\}', '0.0.0.0' `
+ | Set-Content $manifest -NoNewline
+
+ $out = Join-Path $env:RUNNER_TEMP 'Chromatics.test.appx'
+ & $makeappx pack /d $work /p $out /o /nv
+ if ($LASTEXITCODE -ne 0) { throw "makeappx pack failed with exit code $LASTEXITCODE" }
+ Write-Host "Sparse package validated: $out"
diff --git a/.gitignore b/.gitignore
index ddce4c65..17e78d56 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,6 +9,10 @@
# folder is local-only and must not be committed.
Build Dependencies/Sharlayan/
+# Build Dependencies/RGB.NET/ holds custom RGB.NET.Devices.* DLLs that the
+# main + harness csprojs reference via HintPath. Those DLLs are checked in
+# (CI needs them) so this folder is intentionally NOT ignored.
+
# Project-scoped MCP server configuration. Local-only — contains personal
# tool wiring (Sentry hosted MCP) that's specific to maintainer accounts.
.mcp.json
@@ -101,6 +105,9 @@ ipch/
*.sdf
*.cachefile
+# Avalonia / IDE language-server project cache, regenerated on every load.
+*.csproj.lscache
+
# Visual Studio profiler
*.psess
*.vsp
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Core.deps.json b/Build Dependencies/RGB.NET/RGB.NET.Core.deps.json
new file mode 100644
index 00000000..1a9c7401
--- /dev/null
+++ b/Build Dependencies/RGB.NET/RGB.NET.Core.deps.json
@@ -0,0 +1,23 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v10.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v10.0": {
+ "RGB.NET.Core/0.0.1": {
+ "runtime": {
+ "RGB.NET.Core.dll": {}
+ }
+ }
+ }
+ },
+ "libraries": {
+ "RGB.NET.Core/0.0.1": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Core.dll b/Build Dependencies/RGB.NET/RGB.NET.Core.dll
new file mode 100644
index 00000000..e2ad58aa
Binary files /dev/null and b/Build Dependencies/RGB.NET/RGB.NET.Core.dll differ
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Core.xml b/Build Dependencies/RGB.NET/RGB.NET.Core.xml
new file mode 100644
index 00000000..95de09dc
--- /dev/null
+++ b/Build Dependencies/RGB.NET/RGB.NET.Core.xml
@@ -0,0 +1,4608 @@
+
+
+
+ RGB.NET.Core
+
+
+
+
+ Represents a generic color-correction.
+
+
+
+
+ Applies the to the specified .
+
+ The to correct.
+
+
+
+
+ Represents the default-behavior for the work with colors.
+
+
+
+
+ Converts the individual byte values of this to a human-readable string.
+
+ A string that contains the individual byte values of this . For example "[A: 255, R: 255, G: 0, B: 0]".
+
+
+
+ Tests whether the specified object is a and is equivalent to this .
+
+ The color to test.
+ The object to test.
+ true if is a equivalent to this ; otherwise, false.
+
+
+
+ Tests whether the specified object is a and is equivalent to this .
+
+ The first color to test.
+ The second color to test.
+ true if equivalent to this ; otherwise, false.
+
+
+
+ Returns a hash code for this .
+
+ An integer value that specifies the hash code for this .
+
+
+
+ Blends a over this color.
+
+ The to to blend over.
+ The to blend.
+
+
+
+ Represents a behavior of a color for base operations.
+
+
+
+
+ Converts the specified to a string representation.
+
+ The color to convert.
+ The string representation of the specified color.
+
+
+
+ Tests whether the specified object is a and is equivalent to this .
+
+ The color to test.
+ The object to test.
+ true if is a equivalent to this ; otherwise, false.
+
+
+
+ Tests whether the specified object is a and is equivalent to this .
+
+ The first color to test.
+ The second color to test.
+ true if equivalent to this ; otherwise, false.
+
+
+
+ Returns a hash code for this .
+
+ An integer value that specifies the hash code for this .
+
+
+
+ Blends a over this color.
+
+ The to to blend over.
+ The to blend.
+
+
+
+ Represents an ARGB (alpha, red, green, blue) color.
+
+
+
+
+ Gets an transparent color [A: 0, R: 0, G: 0, B: 0]
+
+
+
+
+ Gets or sets the used to perform operations on colors.
+
+
+
+
+ Gets the alpha component value of this as percentage in the range [0..1].
+
+
+
+
+ Gets the red component value of this as percentage in the range [0..1].
+
+
+
+
+ Gets the green component value of this as percentage in the range [0..1].
+
+
+
+
+ Gets the blue component value of this as percentage in the range [0..1].
+
+
+
+
+
+ Initializes a new instance of the struct using RGB-Values.
+ Alpha defaults to 255.
+
+ The red component value of this .
+ The green component value of this .
+ The blue component value of this .
+
+
+
+
+ Initializes a new instance of the struct using RGB-Values.
+ Alpha defaults to 255.
+
+ The red component value of this .
+ The green component value of this .
+ The blue component value of this .
+
+
+
+ Initializes a new instance of the struct using ARGB values.
+
+ The alpha component value of this .
+ The red component value of this .
+ The green component value of this .
+ The blue component value of this .
+
+
+
+ Initializes a new instance of the struct using ARGB values.
+
+ The alpha component value of this .
+ The red component value of this .
+ The green component value of this .
+ The blue component value of this .
+
+
+
+ Initializes a new instance of the struct using RGB-percent values.
+ Alpha defaults to 1.0.
+
+ The red component value of this .
+ The green component value of this .
+ The blue component value of this .
+
+
+
+ Initializes a new instance of the struct using ARGB-percent values.
+
+ The alpha component value of this .
+ The red component value of this .
+ The green component value of this .
+ The blue component value of this .
+
+
+
+ Initializes a new instance of the struct using ARGB-percent values.
+
+ The alpha component value of this .
+ The red component value of this .
+ The green component value of this .
+ The blue component value of this .
+
+
+
+ Initializes a new instance of the struct using ARGB-percent values.
+
+ The alpha component value of this .
+ The red component value of this .
+ The green component value of this .
+ The blue component value of this .
+
+
+
+ Initializes a new instance of the struct using ARGB-percent values.
+
+ The alpha component value of this .
+ The red component value of this .
+ The green component value of this .
+ The blue component value of this .
+
+
+
+ Initializes a new instance of the struct using ARGB-percent values.
+
+ The alpha component value of this .
+ The red component value of this .
+ The green component value of this .
+ The blue component value of this .
+
+
+
+
+ Initializes a new instance of the struct by cloning a existing .
+
+ The the values are copied from.
+
+
+
+ Gets a human-readable string, as defined by the current .
+
+ A string that contains the individual byte values of this . Default format: "[A: 255, R: 255, G: 0, B: 0]".
+
+
+
+ Tests whether the specified object is a and is equivalent to this , as defined by the current .
+
+ The object to test.
+ true if is a equivalent to this ; otherwise, false.
+
+
+
+ Tests whether the specified is equivalent to this , as defined by the current .
+
+ The color to test.
+ true if is equivalent to this ; otherwise, false.
+
+
+
+ Returns a hash code for this , as defined by the current .
+
+ An integer value that specifies the hash code for this .
+
+
+
+ Blends a over this color, as defined by the current .
+
+ The to blend.
+
+
+
+ Blends the provided colors as if would've been called on .
+
+ The base color.
+ The color to blend.
+ The blended color.
+
+
+
+ Returns a value that indicates whether two specified are equal.
+
+ The first to compare.
+ The second to compare.
+ true if and are equal; otherwise, false.
+
+
+
+ Returns a value that indicates whether two specified are equal.
+
+ The first to compare.
+ The second to compare.
+ true if and are not equal; otherwise, false.
+
+
+
+ Converts a of ARGB-components to a .
+
+ The containing the components.
+ The color.
+
+
+
+ Converts a of ARGB-components to a .
+
+ The containing the components.
+ The color.
+
+
+
+ Converts a of ARGB-components to a .
+
+ The containing the components.
+ The color.
+
+
+
+ Converts a of ARGB-components to a .
+
+ The containing the components.
+ The color.
+
+
+
+ Converts a of ARGB-components to a .
+
+ The containing the components.
+ The color.
+
+
+
+ Converts a of ARGB-components to a .
+
+ The containing the components.
+ The color.
+
+
+
+ Contains helper-methods and extension for the -type to work in the Hcl color space.
+
+
+
+
+ Gets the H component value (Hcl-color space) of this in the range [0..360].
+
+ The color to get the value from.
+ The H component value of the color.
+
+
+
+ Gets the c component value (Hcl-color space) of this in the range [0..1].
+
+ The color to get the value from.
+ The c component value of the color.
+
+
+
+ Gets the l component value (Hcl-color space) of this in the range [0..1].
+
+ The color to get the value from.
+ The l component value of the color.
+
+
+
+ Gets the H, c and l component values (Hcl-color space) of this .
+ H in the range [0..360].
+ c in the range [0..1].
+ l in the range [0..1].
+
+ The color to get the value from.
+ A tuple containing the H, c and l component value of the color.
+
+
+
+ Adds the specified Hcl values to this color.
+
+ The color to modify.
+ The H value to add.
+ The c value to add.
+ The l value to add.
+ The new color after the modification.
+
+
+
+ Subtracts the specified Hcl values to this color.
+
+ The color to modify.
+ The H value to subtract.
+ The c value to subtract.
+ The l value to subtract.
+ The new color after the modification.
+
+
+
+ Multiplies the specified Hcl values to this color.
+
+ The color to modify.
+ The H value to multiply.
+ The c value to multiply.
+ The l value to multiply.
+ The new color after the modification.
+
+
+
+ Divides the specified Hcl values to this color.
+
+ The color to modify.
+ The H value to divide.
+ The c value to divide.
+ The l value to divide.
+ The new color after the modification.
+
+
+
+ Sets the specified X value of this color.
+
+ The color to modify.
+ The H value to set.
+ The c value to set.
+ The l value to set.
+ The new color after the modification.
+
+
+
+ Creates a new instance of the struct using Hcl-Values.
+
+ The H component value of this .
+ The c component value of this .
+ The l component value of this .
+ The color created from the values.
+
+
+
+ Creates a new instance of the struct using alpha and Hcl-Values.
+
+ The alphc component value of this .
+ The H component value of this .
+ The c component value of this .
+ The l component value of this .
+ The color created from the values.
+
+
+
+ Creates a new instance of the struct using alpha and Hcl-Values.
+
+ The alphc component value of this .
+ The H component value of this .
+ The c component value of this .
+ The l component value of this .
+ The color created from the values.
+
+
+
+ Creates a new instance of the struct using alpha and Hcl-Values.
+
+ The alphc component value of this .
+ The H component value of this .
+ The c component value of this .
+ The l component value of this .
+ The color created from the values.
+
+
+
+ Contains helper-methods and extension for the -type to work in the HSV color space.
+
+
+
+
+ Gets the hue component value (HSV-color space) of this as degree in the range [0..360].
+
+ The color to get the value from.
+ The hue component value of the color.
+
+
+
+ Gets the saturation component value (HSV-color space) of this in the range [0..1].
+
+ The color to get the value from.
+ The saturation component value of the color.
+
+
+
+ Gets the value component value (HSV-color space) of this in the range [0..1].
+
+ The color to get the value from.
+ The value component value of the color.
+
+
+
+ Gets the hue, saturation and value component values (HSV-color space) of this .
+ Hue as degree in the range [0..1].
+ Saturation in the range [0..1].
+ Value in the range [0..1].
+
+ The color to get the value from.
+ A tuple containing the hue, saturation and value component value of the color.
+
+
+
+ Adds the specified HSV values to this color.
+
+ The color to modify.
+ The hue value to add.
+ The saturation value to add.
+ The value value to add.
+ The new color after the modification.
+
+
+
+ Subtracts the specified HSV values to this color.
+
+ The color to modify.
+ The hue value to subtract.
+ The saturation value to subtract.
+ The value value to subtract.
+ The new color after the modification.
+
+
+
+ Multiplies the specified HSV values to this color.
+
+ The color to modify.
+ The hue value to multiply.
+ The saturation value to multiply.
+ The value value to multiply.
+ The new color after the modification.
+
+
+
+ Divides the specified HSV values to this color.
+
+ The color to modify.
+ The hue value to divide.
+ The saturation value to divide.
+ The value value to divide.
+ The new color after the modification.
+
+
+
+ Sets the specified hue value of this color.
+
+ The color to modify.
+ The hue value to set.
+ The saturation value to set.
+ The value value to set.
+ The new color after the modification.
+
+
+
+ Creates a new instance of the struct using HSV-Values.
+
+ The hue component value of this .
+ The saturation component value of this .
+ The value component value of this .
+ The color created from the values.
+
+
+
+ Creates a new instance of the struct using AHSV-Values.
+
+ The alpha component value of this .
+ The hue component value of this .
+ The saturation component value of this .
+ The value component value of this .
+ The color created from the values.
+
+
+
+ Creates a new instance of the struct using AHSV-Values.
+
+ The alpha component value of this .
+ The hue component value of this .
+ The saturation component value of this .
+ The value component value of this .
+ The color created from the values.
+
+
+
+ Creates a new instance of the struct using AHSV-Values.
+
+ The alpha component value of this .
+ The hue component value of this .
+ The saturation component value of this .
+ The value component value of this .
+ The color created from the values.
+
+
+
+ Contains helper-methods and extension for the -type to work in the Lab color space.
+
+
+
+
+ Gets the L component value (Lab-color space) of this in the range [0..100].
+
+ The color to get the value from.
+ The L component value of the color.
+
+
+
+ Gets the a component value (Lab-color space) of this in the range [0..1].
+
+ The color to get the value from.
+ The a component value of the color.
+
+
+
+ Gets the b component value (Lab-color space) of this in the range [0..1].
+
+ The color to get the value from.
+ The b component value of the color.
+
+
+
+ Gets the L, a and b component values (Lab-color space) of this .
+ L in the range [0..100].
+ a in the range [0..1].
+ b in the range [0..1].
+
+ The color to get the value from.
+ A tuple containing the L, a and b component value of the color.
+
+
+
+ Adds the specified Lab values to this color.
+
+ The color to modify.
+ The L value to add.
+ The a value to add.
+ The b value to add.
+ The new color after the modification.
+
+
+
+ Subtracts the specified Lab values to this color.
+
+ The color to modify.
+ The L value to subtract.
+ The a value to subtract.
+ The b value to subtract.
+ The new color after the modification.
+
+
+
+ Multiplies the specified Lab values to this color.
+
+ The color to modify.
+ The L value to multiply.
+ The a value to multiply.
+ The b value to multiply.
+ The new color after the modification.
+
+
+
+ Divides the specified Lab values to this color.
+
+ The color to modify.
+ The L value to divide.
+ The a value to divide.
+ The b value to divide.
+ The new color after the modification.
+
+
+
+ Sets the specified X valueof this color.
+
+ The color to modify.
+ The L value to set.
+ The a value to set.
+ The b value to set.
+ The new color after the modification.
+
+
+
+ Creates a new instance of the struct using Lab-Values.
+
+ The L component value of this .
+ The a component value of this .
+ The b component value of this .
+ The color created from the values.
+
+
+
+ Creates a new instance of the struct using alpha and Lab-Values.
+
+ The alpha component value of this .
+ The L component value of this .
+ The a component value of this .
+ The b component value of this .
+ The color created from the values.
+
+
+
+ Creates a new instance of the struct using alpha and Lab-Values.
+
+ The alpha component value of this .
+ The L component value of this .
+ The a component value of this .
+ The b component value of this .
+ The color created from the values.
+
+
+
+ Creates a new instance of the struct using alpha and Lab-Values.
+
+ The alpha component value of this .
+ The L component value of this .
+ The a component value of this .
+ The b component value of this .
+ The color created from the values.
+
+
+
+ Contains helper-methods and extension for the -type to work in the RGB color space.
+
+
+
+
+ Gets the A component value of this as byte in the range [0..255].
+
+ The color to get the value from.
+ The A component value of the color.
+
+
+
+ Gets the R component value of this as byte in the range [0..255].
+
+ The color to get the value from.
+ The R component value of the color.
+
+
+
+ Gets the G component value of this as byte in the range [0..255].
+
+ The color to get the value from.
+ The G component value of the color.
+
+
+
+ Gets the B component value of this as byte in the range [0..255].
+
+ The color to get the value from.
+ The B component value of the color.
+
+
+
+ Gets the A, R, G and B component value of this as byte in the range [0..255].
+
+ The color to get the value from.
+ A tuple containing the A, R, G and B component value of the color.
+
+
+
+ Gets the A, R, G and B component value of this as percentage in the range [0..1].
+
+ The color to get the value from.
+ A tuple containing the A, R, G and B component value of the color.
+
+
+
+ Adds the specified RGB values to this color.
+
+ The color to modify.
+ The red value to add.
+ The green value to add.
+ The blue value to add.
+ The new color after the modification.
+
+
+
+ Adds the specified RGB-percent values to this color.
+
+ The color to modify.
+ The red value to add.
+ The green value to add.
+ The blue value to add.
+ The new color after the modification.
+
+
+
+ Adds the specified alpha value to this color.
+
+ The color to modify.
+ The alpha value to add.
+ The new color after the modification.
+
+
+
+ Adds the specified alpha-percent value to this color.
+
+ The color to modify.
+ The alpha value to add.
+ The new color after the modification.
+
+
+
+ Subtracts the specified RGB values to this color.
+
+ The color to modify.
+ The red value to subtract.
+ The green value to subtract.
+ The blue value to subtract.
+ The new color after the modification.
+
+
+
+ Subtracts the specified RGB values to this color.
+
+ The color to modify.
+ The red value to subtract.
+ The green value to subtract.
+ The blue value to subtract.
+ The new color after the modification.
+
+
+
+ Subtracts the specified alpha value to this color.
+
+ The color to modify.
+ The alpha value to subtract.
+ The new color after the modification.
+
+
+
+ Subtracts the specified alpha-percent value to this color.
+
+ The color to modify.
+ The alpha value to subtract.
+ The new color after the modification.
+
+
+
+ Multiplies the specified RGB values to this color.
+
+ The color to modify.
+ The red value to multiply.
+ The green value to multiply.
+ The blue value to multiply.
+ The new color after the modification.
+
+
+
+ Multiplies the specified alpha value to this color.
+
+ The color to modify.
+ The alpha value to multiply.
+ The new color after the modification.
+
+
+
+ Divides the specified RGB values to this color.
+
+ The color to modify.
+ The red value to divide.
+ The green value to divide.
+ The blue value to divide.
+ The new color after the modification.
+
+
+
+ Divides the specified alpha value to this color.
+
+ The color to modify.
+ The alpha value to divide.
+ The new color after the modification.
+
+
+
+ Sets the specified RGB value of this color.
+
+ The color to modify.
+ The red value to set.
+ The green value to set.
+ The blue value to set.
+ The new color after the modification.
+
+
+
+ Sets the specified RGB value of this color.
+
+ The color to modify.
+ The red value to set.
+ The green value to set.
+ The blue value to set.
+ The new color after the modification.
+
+
+
+ Sets the specified RGB value of this color.
+
+ The color to modify.
+ The red value to set.
+ The green value to set.
+ The blue value to set.
+ The new color after the modification.
+
+
+
+ Sets the specified alpha value of this color.
+
+ The color to modify.
+ The alpha value to set.
+ The new color after the modification.
+
+
+
+ Sets the specified alpha value of this color.
+
+ The color to modify.
+ The alpha value to set.
+ The new color after the modification.
+
+
+
+ Gets the current color as a RGB-HEX-string.
+
+ The RGB-HEX-string.
+
+
+
+ Gets the current color as a ARGB-HEX-string.
+
+ The ARGB-HEX-string.
+
+
+
+ Creates a new instance of the struct using a HEX-string.
+
+ The HEX-representation of the color.
+ The color created from the HEX-string.
+
+
+
+ Contains helper-methods and extension for the -type to work in the XYZ color space.
+
+
+
+
+ Gets the X component value (XYZ-color space) of this in the range [0..95.047].
+
+ The color to get the value from.
+ The X component value of the color.
+
+
+
+ Gets the Y component value (XYZ-color space) of this in the range [0..100].
+
+ The color to get the value from.
+ The Y component value of the color.
+
+
+
+ Gets the Z component value (XYZ-color space) of this in the range [0..108.883].
+
+ The color to get the value from.
+ The Z component value of the color.
+
+
+
+ Gets the X, Y and Z component values (XYZ-color space) of this .
+ X in the range [0..95.047].
+ Y in the range [0..100].
+ Z in the range [0..108.883].
+
+ The color to get the value from.
+ A tuple containing the X, Y and Z component value of the color.
+
+
+
+ Adds the specified XYZ values to this color.
+
+ The color to modify.
+ The X value to add.
+ The Y value to add.
+ The Z value to add.
+ The new color after the modification.
+
+
+
+ Subtracts the specified XYZ values to this color.
+
+ The color to modify.
+ The X value to subtract.
+ The Y value to subtract.
+ The Z value to subtract.
+ The new color after the modification.
+
+
+
+ Multiplies the specified XYZ values to this color.
+
+ The color to modify.
+ The X value to multiply.
+ The Y value to multiply.
+ The Z value to multiply.
+ The new color after the modification.
+
+
+
+ Divides the specified XYZ values to this color.
+
+ The color to modify.
+ The X value to divide.
+ The Y value to divide.
+ The Z value to divide.
+ The new color after the modification.
+
+
+
+ Sets the specified X valueof this color.
+
+ The color to modify.
+ The X value to set.
+ The Y value to set.
+ The Z value to set.
+ The new color after the modification.
+
+
+
+ Creates a new instance of the struct using XYZ-Values.
+
+ The X component value of this .
+ The Y component value of this .
+ The Z component value of this .
+ The color created from the values.
+
+
+
+ Creates a new instance of the struct using alpha and XYZ-Values.
+
+ The alpha component value of this .
+ The X component value of this .
+ The Y component value of this .
+ The Z component value of this .
+ The color created from the values.
+
+
+
+ Creates a new instance of the struct using alpha and XYZ-Values.
+
+ The alpha component value of this .
+ The X component value of this .
+ The Y component value of this .
+ The Z component value of this .
+ The color created from the values.
+
+
+
+ Creates a new instance of the struct using alpha and XYZ-Values.
+
+ The alpha component value of this .
+ The X component value of this .
+ The Y component value of this .
+ The Z component value of this .
+ The color created from the values.
+
+
+
+
+
+
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Gets a readonly-list of all this decorator is attached to.
+
+
+
+
+
+
+
+
+
+
+ Detaches the decorator from all it is currently attached to.
+
+
+
+
+
+ Represents a basic decorator which is aware of the event.
+
+
+
+
+ Gets the surface this decorator is attached to.
+
+
+
+
+ Gets or sets if the should call even if the Decorator is disabled.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The surface this decorator is attached to.
+ Bool indicating if the should call even if the Decorator is disabled.
+
+
+
+
+
+
+
+
+
+ Updates this .
+
+ The elapsed time (in seconds) since the last update.
+
+
+
+
+ Represents a decorating a .
+
+
+
+
+ Decorator-Method called by the .
+
+ The rectangle in which the should be drawn.
+ The target (key/point) from which the should be taken.
+ The to be modified.
+
+
+
+ Represents a basic decoratable.
+
+
+
+
+
+ Represents a basic decoratable for a specific type of
+
+ The type of decorators this decoratable can be decorated with.
+
+
+
+ Gets a readonly-list of all attached to this .
+
+
+
+
+ Adds an to the .
+
+ The to be added.
+
+
+
+ Removes an from the .
+
+ The to be removed.
+
+
+
+ Removes all from the .
+
+
+
+
+ Represents a basic decorator.
+
+
+
+
+ Gets or sets if the is enabled and will be used.
+
+
+
+
+ Gets or sets the order in which multiple decorators should be applied on the same object.
+ Higher orders are processed first.
+
+
+
+
+ Attaches this to the specified target.
+
+ The object this should be attached to.
+
+
+
+ Detaches this from the specified target.
+
+ The object this should be detached from.
+
+
+
+
+ Represents a basic decorator decorating a .
+
+
+
+
+
+
+ Represents a generic RGB-device.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Gets or sets if the device needs to be flushed on every update.
+
+
+
+
+ Gets a dictionary containing all of the .
+
+
+
+
+ Gets the update queue used to update this device.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The device info of this device.
+ The queue used to update this device.
+
+
+
+
+
+
+ Gets an enumerable of LEDs that are changed and requires an update.
+
+ Forces all LEDs to be treated as dirty.
+ The collection LEDs to update.
+
+
+
+ Gets an enumerable of a custom data and color tuple for the specified leds.
+
+
+ Applies all .
+ if no ist specified the is used.
+
+ The of led to convert.
+ The enumerable of custom data and color tuples for the specified leds.
+
+
+
+ Sends all the updated to the device.
+
+
+
+
+
+
+
+ Performs device specific updates.
+
+
+
+
+
+
+
+
+
+
+ Gets the custom data associated with the specified LED.
+
+ The id of the led.
+ The custom data for the specified LED.
+
+
+
+ Called when the device is attached to a surface.
+
+
+ When overriden base should be called to validate boundries.
+
+
+
+
+ Called when the device is detached from a surface.
+
+
+
+
+
+ Returns an enumerator that iterates over all of the .
+
+ An enumerator for all of the .
+
+
+
+
+ Returns an enumerator that iterates over all of the .
+
+ An enumerator for all of the .
+
+
+
+ Represents the abstract base implementation for a .
+
+
+
+
+
+
+
+
+
+
+ The list of devices managed by this device-provider.
+
+
+
+
+
+
+
+ Gets the dictionary containing the registered update triggers.
+ Normally should be used to access them.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The update rate hard limit all update triggers for this device provider are initialized with.
+
+
+
+
+
+
+ Loads devices and returns a filtered list of them.
+
+
+ The underlying loading of the devices happens in .
+
+ -flags to filter the device with.
+ The filtered collection of loaded devices.
+
+
+
+ Initializes the underlying SDK.
+
+
+
+
+ Loads all devices this device provider is capable of loading.
+
+
+ Filtering happens in .
+
+ A collection of loaded devices.
+
+
+
+ Gets the mapped to the specified id or a new one if the id wasn't requested before.
+
+
+ The creation of the update trigger happens in .
+
+ The id of the update trigger.
+ The update rate hard limit to be set in the update trigger.
+ The update trigger mapped to the specified id.
+
+
+
+ Creates a update trigger with the specified id and the specified update rate hard limit.
+
+ The id of the update trigger.
+ The update rate hard limit tobe set in the update trigger.
+ The newly created update trigger.
+
+
+
+ Resets the device provider and disposes all devices and update triggers.
+
+
+
+
+ Adds the provided device to the list of managed devices.
+
+ The device to add.
+ true if the device was added successfully; otherwise false.
+
+
+
+ Removes the provided device from the list of managed devices.
+
+ The device to remove.
+ true if the device was removed successfully; otherwise false.
+
+
+
+ Triggers the -event and throws the specified exception if is true and it is not overriden in the event.
+
+ The exception to throw.
+ Indicates if the exception is critical for device provider to work correctly.
+
+
+
+ Throws the .event.
+
+ The parameters passed to the event.
+
+
+
+ Throws the -event.
+
+ The parameters passed to the event.
+
+
+
+
+
+
+ Disposes the object and frees all resources.
+
+ true if explicitely called through the Dispose-Method, false if called by the destructor.
+
+
+
+
+
+
+ Represents a generic RGB-device.
+
+
+
+
+ Gets the surface this device is attached to.
+
+
+
+
+ Gets generic information about the .
+
+
+
+
+ Gets a list of color corrections applied to this device.
+
+
+
+
+ Gets the with the specified .
+
+ The of the to get.
+ The with the specified or null if no is found.
+
+
+
+ Gets the at the specified physical location.
+
+ The to get the location from.
+ The at the specified or null if no location is found.
+
+
+
+ Gets a list of inside the specified .
+
+ The to check.
+ The minimal percentage overlay a must have with the to be taken into the list.
+ A enumerable of leds inside the specified rectangle.
+
+
+
+ Perform an update for all dirty , or all if flushLeds is set to true.
+
+ Specifies whether all (including clean ones) should be updated.
+
+
+
+ Adds a led to the device.
+
+ The id of the led.
+ The location of the led on the device.
+ The size of the led.
+ Custom data saved on the led.
+ The newly added led or null if a led with this id is already added.
+
+
+
+ Removes the led with the specified id from the device.
+
+ The id of the led to remove.
+ The removed led or null if there was no led with the specified id.
+
+
+
+
+ Represents a generic RGB-device with an known device-info type.
+
+
+
+
+ Gets generic information about the .
+
+
+
+
+ Represents a generic information for a
+
+
+
+
+ Gets the of the .
+
+
+
+
+ Unique name of the .
+
+
+
+
+ Gets the manufacturer-name of the .
+
+
+
+
+ Gets the model-name of the .
+
+
+
+
+ Gets custom metadata added to the layout.
+
+
+
+
+ Represents a generic device provider.
+
+
+
+
+ Indicates if the used SDK is initialized and ready to use.
+
+
+
+
+ Indicates if exceptions in the device provider are thrown or silently ignored.
+
+
+ This should only be set to true for debugging/development purposes.
+ Production code should use the -Event to handle exceptions.
+
+
+
+
+ Gets a collection of loaded by this .
+
+
+
+
+ Gets a collection registered to this device provider.
+
+
+
+
+ Occurs when an exception is thrown in the device provider.
+
+
+
+
+ Occures when the devices provided by this device provider changed.
+
+
+
+
+ Initializes the device provider and loads available devices.
+
+ -flags to filter the devices to load.
+ Specifies if exceptions should be thrown or silently be ignored.
+ true if the initialization was successful; false otherwise.
+
+
+
+ Contains a list of available keyboard layout types.
+
+
+
+
+ Contains a list of different types of device.
+
+
+
+
+ Represents nothing.
+
+
+
+
+ Represents a keyboard.
+
+
+
+
+ Represents a mouse.
+
+
+
+
+ Represents a headset.
+
+
+
+
+ Represents a mousepad.
+
+
+
+
+ Represents a LED-stipe.
+
+
+
+
+ Represents a LED-matrix.
+
+
+
+
+ Represents a Mainboard.
+
+
+
+
+ Represents a Graphics card.
+
+
+
+
+ Represents a DRAM-bank.
+
+
+
+
+ Represents a headset stand.
+
+
+
+
+ Represents a keypad.
+
+
+
+
+ Represents a fan.
+
+
+
+
+ Represents a speaker
+
+
+
+
+ Represents a cooler.
+
+
+
+
+ Represents a monitor.
+
+
+
+
+ Represents a generic led-controller.
+
+
+
+
+ Represents a game controller.
+
+
+
+
+ Represents a device where the type is not known or not present in the list.
+
+
+
+
+ Represents all devices.
+
+
+
+
+ Represents a cooler-device
+
+
+
+
+ Represents a DRAM-device
+
+
+
+
+ represents a fan-device
+
+
+
+
+ Represents a gamecontroller-device
+
+
+
+
+ Represents a graphics-card-device
+
+
+
+
+ Represents a headset-device
+
+
+
+
+ Represents a headset-stand-device
+
+
+
+
+ Represents a generic keyboard-device.
+
+
+
+
+ Gets the device information assiciated with this device.
+
+
+
+
+ Represents a generic keyboard device information.
+
+
+
+
+ Gets the of the keyboard.
+
+
+
+
+ Represents a keypad-device
+
+
+
+
+ Represents a led-matrix-device
+
+
+
+
+ Represents a led-stripe-device
+
+
+
+
+ Represents a mainboard-device
+
+
+
+
+ Represents a mouse-device
+
+
+
+
+ Represents a mousepad-device
+
+
+
+
+ Represents a speaker-device
+
+
+
+
+ Represents a device with unkown or not specified type.
+
+
+
+
+
+ Represents the information supplied with an -event.
+
+
+
+
+ Gets the which is responsible for the event-call.
+
+
+
+
+ Gets a bool indicating if the exception is critical for the thrower.
+
+
+
+
+ Gets or sets if the exception should be thrown after the event is handled.
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The which is responsible for the event-call.
+ Indicates if the exception is critical for the thrower.
+ Indicates if the exception should be thrown after the event is handled.
+
+
+
+
+ Represents the information supplied with an -event.
+
+
+
+
+ Gets the that caused the change. Returns null if the change isn't caused by a .
+
+
+
+
+ Gets a value indicating if the event is caused by the addition of a new to the .
+
+
+
+
+ Gets a value indicating if the event is caused by the removal of a to the .
+
+
+
+
+ Gets a value indicating if the event is caused by a changed location or size of one of the on the .
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The that caused the change.
+ A value indicating if the event is caused by the addition of a new to the .
+ A value indicating if the event is caused by the removal of a from the .
+ A value indicating if the event is caused by a change to a on the .
+
+
+
+
+ Represents the information supplied with an -event.
+
+
+
+
+
+ Represents the information supplied with an -event.
+
+
+
+
+ Gets the elapsed time (in seconds) since the last update.
+
+
+
+
+ Gets the trigger causing this update.
+
+
+
+
+ Gets the custom-data provided by the trigger for this update.
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The elapsed time (in seconds) since the last update.
+ The trigger causing this update.
+ The custom-data provided by the trigger for this update.
+
+
+
+
+ Represents an exception thrown by a .
+
+
+
+
+ Gets a bool indicating if the exception is critical and shouldn't be ingored.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The exception that is the casue of the current exception or null if this exception was thrown on purpose.
+ A value indicating if the exception is critical and shouldn't be ignored.
+
+
+
+
+ Represents an exception thrown by an .
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The message which describes the reason of throwing this exception.
+ Optional inner exception, which lead to this exception.
+
+
+
+
+ Represents an exception thrown by an .
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The message which describes the reason of throwing this exception.
+ Optional inner exception, which lead to this exception.
+
+
+
+ Offers some extensions and helper-methods for related things.
+
+
+
+
+ Calculates the distance between the two specified colors using the redmean algorithm.
+ For more infos check https://www.compuphase.com/cmetric.htm
+
+ The start color of the distance calculation.
+ The end color fot the distance calculation.
+ The redmean distance between the two specified colors.
+
+
+
+ Offers some extensions for easier use of .
+
+
+
+
+ Sets the -Parameter to the given value.
+
+ The update-data to modify.
+ The value to set.
+ The modified update-data.
+
+
+
+ Sets the -Parameter to the given value.
+
+ The update-data to modify.
+ The value to set.
+ The modified update-data.
+
+
+
+ Sets the -Parameter to the given value.
+
+ The update-data to modify.
+ The value to set.
+ The modified update-data.
+
+
+
+ Sets the -Parameter to the given value.
+
+ The update-data to modify.
+ The value to set.
+ The modified update-data.
+
+
+
+ Offers some extensions and helper-methods for the work with floats.
+
+
+
+
+ Defines the precision RGB.NET processes floating point comparisons in.
+
+
+
+
+ Checks if two values are equal respecting the .
+
+ The first value to compare.
+ The first value to compare.
+ true if the difference is smaller than the ; otherwise, false.
+
+
+
+ Clamps the provided value to be bigger or equal min and smaller or equal max.
+
+ The value to clamp.
+ The lower value of the range the value is clamped to.
+ The higher value of the range the value is clamped to.
+ The clamped value.
+
+
+
+ Clamps the provided value to be bigger or equal min and smaller or equal max.
+
+ The value to clamp.
+ The lower value of the range the value is clamped to.
+ The higher value of the range the value is clamped to.
+ The clamped value.
+
+
+
+ Enforces the provided value to be in the specified range by wrapping it around the edges if it exceeds them.
+
+ The value to wrap.
+ The lower value of the range the value is wrapped into.
+ The higher value of the range the value is wrapped into.
+ The wrapped value.
+
+
+
+ Converts a normalized float value in the range [0..1] to a byte [0..255].
+
+ The normalized float value to convert.
+ The byte value.
+
+
+
+ Converts a byte value [0..255] to a normalized float value in the range [0..1].
+
+ The byte value to convert.
+ The normalized float value.
+
+
+
+ Offers some extensions and helper-methods for related things.
+
+
+
+
+ Moves the specified by the specified amount.
+
+ The to move.
+ The x-ammount to move.
+ The y-ammount to move.
+ The new location of the point.
+
+
+
+ Rotates the specified by the specified amuont around the specified origin.
+
+ The to rotate.
+ The rotation.
+ The origin to rotate around. [0,0] if not set.
+ The new location of the point.
+
+
+
+ Offers some extensions and helper-methods for the work with rectangles.
+
+
+
+
+ Sets the of the specified rectangle.
+
+ The rectangle to modify.
+ The new location of the rectangle.
+ The modified .
+
+
+
+ Sets the of the of the specified rectangle.
+
+ The rectangle to modify.
+ The new x-location of the rectangle.
+ The modified .
+
+
+
+ Sets the of the of the specified rectangle.
+
+ The rectangle to modify.
+ The new y-location of the rectangle.
+ The modified .
+
+
+
+ Sets the of the specified rectangle.
+
+ The rectangle to modify.
+ The new size of the rectangle.
+ The modified .
+
+
+
+ Sets the of the of the specified rectangle.
+
+ The rectangle to modify.
+ The new width of the rectangle.
+ The modified .
+
+
+
+ Sets the of the of the specified rectangle.
+
+ The rectangle to modify.
+ The new height of the rectangle.
+ The modified .
+
+
+
+ Calculates the percentage of intersection of a rectangle.
+
+ The rectangle to calculate the intersection for.
+ The intersecting rectangle.
+ The percentage of intersection.
+
+
+
+ Calculates the representing the intersection of this and the one provided as parameter.
+
+ The rectangle to calculate the intersection for.
+ The intersecting .
+ A new representing the intersection this and the one provided as parameter.
+
+
+
+ Determines if the specified is contained within this .
+
+ The containing rectangle.
+ The to test.
+ true if the rectangle contains the specified point; otherwise false.
+
+
+
+ Determines if the specified location is contained within this .
+
+ The containing rectangle.
+ The X-location to test.
+ The Y-location to test.
+ true if the rectangle contains the specified coordinates; otherwise false.
+
+
+
+ Determines if the specified is contained within this .
+
+ The containing rectangle.
+ The to test.
+ true if the rectangle contains the specified rect; otherwise false.
+
+
+
+ Moves the specified by the specified amount.
+
+ The to move.
+ The amount to move.
+ The moved rectangle.
+
+
+
+ Moves the specified by the specified amount.
+
+ The to move.
+ The x-ammount to move.
+ The y-ammount to move.
+ The moved rectangle.
+
+
+
+ Rotates the specified by the specified amuont around the specified origin.
+
+
+ The returned array of is filled with the new locations of the rectangle clockwise starting from the top left:
+ [0] = top left
+ [1] = top right
+ [2] = bottom right
+ [3] = bottom left
+
+ The to rotate.
+ The rotation.
+ The origin to rotate around. [0,0] if not set.
+ A array of containing the new locations of the corners of the original rectangle.
+
+
+
+ Offers some extensions and helper-methods for the work with the surface.
+
+
+
+
+ Initializes the specifiec device provider and attaches all devices.
+
+ The surface to attach the devices to.
+ The device provider to load.
+ -flags to filter the devices to load.
+ Specifies if exceptions should be thrown or silently be ignored.
+
+
+
+ Attaches the specified devices to the surface.
+
+ The surface the devices are attached to.
+ The devices to attach.
+
+
+
+ Detaches the specified devices from the surface.
+
+ The surface the devices are detached from.
+ The devices to detach.
+
+
+
+ Gets all devices of a specific type.
+
+ The type of devices to get.
+ A collection of devices with the specified type.
+
+
+
+ Gets all devices of the specified .
+
+ The surface to get the devices from.
+ The of the devices to get.
+ A collection of devices matching the specified .
+
+
+
+ Automatically aligns all devices to prevent overlaps.
+
+
+
+
+
+
+ Represents a generic .
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Gets a enumerable containing all leds in this group.
+
+ A enumerable containing all leds of this group.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Represents a generic ledgroup.
+
+
+
+
+ Gets the surface this group is attached to or null if it is not attached to any surface.
+
+
+
+
+ Gets a bool indicating if the group is attached to a surface.
+
+
+
+
+ Gets or sets the which should be drawn over this .
+
+
+
+
+ Gets or sets the z-index of this to allow ordering them before drawing. (lowest first) (default: 0)
+
+
+
+
+ Called when the is attached to the .
+
+
+
+
+ Called when the is detached from the .
+
+
+
+
+ Returns a list containing all in this group.
+
+ A list containing all in this group.
+
+
+
+ Offers some extensions and helper-methods for related things.
+
+
+
+
+ Converts the specified to a .
+
+ The to convert.
+ The converted .
+
+
+
+ Returns a new which contains all from the specified excluding the specified ones.
+
+ The base .
+ The to exclude.
+ The new .
+
+
+
+ Attaches the specified to the .
+
+ The to attach.
+ The to attach this group to.
+ true if the could be attached; otherwise, false.
+
+
+
+ Detaches the specified from the .
+
+ The to attach.
+ true if the could be detached; otherwise, false.
+
+
+
+
+ Represents a ledgroup containing arbitrary .
+
+
+
+
+ Gets the list containing the of this .
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ Specifies the surface to attach this group to or null if the group should not be attached on creation.
+
+
+
+
+ Initializes a new instance of the class.
+
+ Specifies the surface to attach this group to or null if the group should not be attached on creation.
+ The initial of this .
+
+
+
+
+ Initializes a new instance of the class.
+
+ Specifies the surface to attach this group to or null if the group should not be attached on creation.
+ The initial of this .
+
+
+
+ Adds the specified LED(s) to this .
+
+ The LED(s) to add.
+
+
+
+ Adds the specified to this .
+
+ The to add.
+
+
+
+ Removes the specified LED(s) from this .
+
+ The LED(s) to remove.
+
+
+
+ Removes the specified from this .
+
+ The to remove.
+
+
+
+ Checks if a specified LED is contained by this ledgroup.
+
+ The LED which should be checked.
+ true if the LED is contained by this ledgroup; otherwise, false.
+
+
+
+ Merges the from the specified ledgroup in this ledgroup.
+
+ The ledgroup to merge.
+
+
+
+
+ Gets a list containing the from this group.
+
+ The list containing the .
+
+
+
+
+ Gets a list containing the from this group.
+
+ The list containing the .
+
+
+
+ Contains helper methods for converting things.
+
+
+
+
+ Converts an array of bytes to a HEX-representation.
+
+ The array of bytes.
+ The HEX-representation of the provided bytes.
+
+
+
+ Converts the HEX-representation of a byte array to that array.
+
+ The HEX-string to convert.
+ The correspondending byte array.
+
+
+
+ Offsers some helper methods for device creation.
+
+
+
+
+ Creates a unique device name from a manufacturer and model name.
+
+
+ The id is made unique based on the assembly calling this method.
+
+ The manufacturer of the device.
+ The model of the device.
+ The unique identifier for this device.
+
+
+
+ Offers some helper methods for timed operations.
+
+
+
+
+ Gets or sets if High Resolution Timers should be used.
+
+
+
+
+ Executes the provided action and blocks if needed until the the has passed.
+
+ The action to execute.
+ The time in ms this method should block. default: 0
+ The time in ms spent executing the .
+
+
+
+ Calculates the elapsed time in ms from the provided timestamp until now.
+
+ The initial timestamp to calculate the time from.
+ The elapsed time in ms.
+
+
+
+ Requests to use to use High Resolution Timers if enabled.
+ IMPORTANT: Always dispose the returned disposable if High Resolution Timers are no longer needed for the caller.
+
+ A disposable to remove the request.
+
+
+
+ Disposes all open High Resolution Timer Requests.
+ This should be called once when exiting the application to make sure nothing remains open and the application correctly unregisters itself on OS level.
+ Shouldn't be needed if everything is disposed, but better safe then sorry.
+
+
+
+
+ Offers some methods to create and handle unique identifiers.
+
+
+
+
+ Makes the specified id unique based on the calling assembly by adding a counter if needed.
+
+ The id to make unique.
+ The unique id.
+
+
+
+ Resets the counter used to create unique ids.
+ All previous generated ids are not garantueed to stay unique if this is called!
+
+
+
+
+
+ Represents a single LED of a RGB-device.
+
+
+
+
+ Gets the this is associated with.
+
+
+
+
+ Gets the of the .
+
+
+
+
+ Gets or sets the of the .
+
+
+
+
+ Gets or sets the data used for by the -.
+
+
+
+
+ Gets a rectangle representing the logical location of the on the .
+
+
+
+
+ Indicates whether the is about to change it's color.
+
+
+
+
+ Gets a copy of the the LED should be set to on the next update.
+ Null if there is no update-request for the next update.
+
+
+
+
+ Gets the current of the . Sets the for the next update.
+
+
+
+
+ Gets the provider-specific data associated with this led.
+
+
+
+
+ Gets or sets some custom metadata of this led.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The the is associated with.
+ The of the .
+ The physical location of the relative to the .
+ The size of the .
+ The provider-specific data associated with this led.
+
+
+
+
+
+
+ Converts the and the of this to a human-readable string.
+
+ A string that contains the and the of this . For example "Enter [A: 255, R: 255, G: 0, B: 0]".
+
+
+
+ Updates the to the requested .
+
+
+
+
+ Converts a to a .
+
+ The to convert.
+
+
+
+ Converts a to a .
+
+ The to convert.
+
+
+
+ Represents a mapping from to a custom identifier.
+
+ The identifier the is mapped to.
+
+
+
+ Gets the number of entries in this mapping.
+
+
+
+
+ Gets a collection of all mapped ledids.
+
+
+
+
+ Gets a collection of all mapped custom identifiers.
+
+
+
+
+ Gets the custom identifier mapped to the specified .
+
+ The led id to get the mapped identifier.
+ The mapped ifentifier.
+
+
+
+ Gets the mapped to the specified custom identifier.
+
+ The custom identifier to get the mapped led id.
+ The led id.
+
+
+
+ Adds a new entry to the mapping.
+
+ The to map.
+ The custom identifier to map.
+
+
+
+ Checks if the specified is mapped.
+
+ The led id to check.
+ true if the led id is mapped; otherwise false.
+
+
+
+ Checks if the specified custom identifier is mapped.
+
+ The custom identifier to check.
+ true if the led id is mapped; otherwise false.
+
+
+
+ Gets the custom identifier mapped to the specified led id.
+
+ The led id to get the custom identifier for.
+ Contains the mapped custom identifier or null if there is no mapping for the specified led id.
+ true if there was a custom identifier for the specified led id; otherwise false.
+
+
+
+ Gets the led id mapped to the specified custom identifier.
+
+ The custom identifier to get the led id for.
+ Contains the mapped led id or null if there is no mapping for the specified led id.
+ true if there was a led id for the specified custom identifier; otherwise false.
+
+
+
+ Removes the specified led id and the mapped custom identifier.
+
+ The led id to remove.
+ true if there was a mapping for the led id to remove; otherwise false.
+
+
+
+ Removes the specified custom identifier and the mapped led id.
+
+ The custom identifier to remove.
+ true if there was a mapping for the custom identifier to remove; otherwise false.
+
+
+
+ Removes all registered mappings.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Gets the amount of currently registered referencing objects.
+
+
+
+
+ Adds the given object to the list of referencing objects.
+
+ The object to add.
+
+
+
+ Removes the given object from the list of referencing objects.
+
+ The object to remove.
+
+
+
+
+ Represents a basic bindable class which notifies when a property value changes.
+
+
+
+
+ Occurs when a property value changes.
+
+
+
+
+ Checks if the property already matches the desired value or needs to be updated.
+
+ Type of the property.
+ Reference to the backing-filed.
+ Value to apply.
+ true if the value needs to be updated; otherwise false.
+
+
+
+ Checks if the property already matches the desired value and updates it if not.
+
+ Type of the property.
+ Reference to the backing-filed.
+ Value to apply.
+ Name of the property used to notify listeners. This value is optional
+ and can be provided automatically when invoked from compilers that support .
+ true if the value was changed, false if the existing value matched the desired value.
+
+
+
+ Triggers the -event when a a property value has changed.
+
+ Name of the property used to notify listeners. This value is optional
+ and can be provided automatically when invoked from compilers that support .
+
+
+
+ Represents a basic bindable class which notifies when a property value changes.
+
+
+
+
+ Represents a generic placeable element.
+
+
+
+
+ Gets or sets the location of the .
+
+
+
+
+ Gets the size of the .
+
+
+
+
+ Gets or sets the scale of the .
+
+
+
+
+ Gets or sets the rotation of the .
+
+
+
+
+ Gets the actual location of the .
+ This includes the .
+
+
+
+
+ Gets the actual of the .
+ This includes the .
+
+
+
+
+ Gets a rectangle containing the whole .
+ This includes , , and .
+
+
+
+
+ Occurs when the property was changed.
+
+
+
+
+ Occurs when the property was changed.
+
+
+
+
+ Occurs when the property was changed.
+
+
+
+
+ Occurs when the property was changed.
+
+
+
+
+ Occurs when the property was changed.
+
+
+
+
+ Occurs when the property was changed.
+
+
+
+
+ Occurs when the property was changed.
+
+
+
+
+ Represents a placeable element.
+
+
+
+
+ Gets the parent this placeable is placed in.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The parent this placeable is placed in.
+
+
+
+ Initializes a new instance of the class.
+
+ The location of this placeable.
+ The size of this placeable.
+
+
+
+ Initializes a new instance of the class.
+
+ The parent placeable this placeable is placed in.
+ The location of this placeable.
+ The size of this placeable.
+
+
+
+ Updates the , and based on the , and .
+
+
+
+
+ Called when the property was changed.
+
+
+
+
+ Called when the property was changed.
+
+
+
+
+ Called when the property was changed.
+
+
+
+
+ Called when the property was changed.
+
+
+
+
+ Called when the property was changed.
+
+
+
+
+ Called when the property was changed.
+
+
+
+
+ Called when the property was changed.
+
+
+
+
+ Represents a point consisting of a X- and a Y-position.
+
+
+
+
+ Gets a [NaN,NaN]-Point.
+
+
+
+
+ Gets the X-position of this .
+
+
+
+
+ Gets the Y-position of this .
+
+
+
+
+ Initializes a new instance of the class using the provided values.
+
+ The value used for the X-position.
+ The value used for the Y-position.
+
+
+
+ Converts the - and -position of this to a human-readable string.
+
+ A string that contains the and of this . For example "[X: 100, Y: 20]".
+
+
+
+ Tests whether the specified is equivalent to this .
+
+ The point to test.
+ true if is equivalent to this ; otherwise, false.
+
+
+
+ Tests whether the specified object is a and is equivalent to this .
+
+ The object to test.
+ true if is a equivalent to this ; otherwise, false.
+
+
+
+ Returns a hash code for this .
+
+ An integer value that specifies the hash code for this .
+
+
+
+ Returns a value that indicates whether two specified are equal.
+
+ The first to compare.
+ The second to compare.
+ true if and are equal; otherwise, false.
+
+
+
+ Returns a value that indicates whether two specified are equal.
+
+ The first to compare.
+ The second to compare.
+ true if and are not equal; otherwise, false.
+
+
+
+ Returns a new representing the addition of the two provided .
+
+ The first .
+ The second .
+ A new representing the addition of the two provided .
+
+
+
+ Returns a new created from the provided and .
+
+ The of the rectangle.
+ The of the rectangle.
+ The rectangle created from the provided and .
+
+
+
+ Returns a new representing the subtraction of the two provided .
+
+ The first .
+ The second .
+ A new representing the subtraction of the two provided .
+
+
+
+ Returns a new representing the multiplication of the two provided .
+
+ The first .
+ The second .
+ A new representing the multiplication of the two provided .
+
+
+
+ Returns a new representing the division of the two provided .
+
+ The first .
+ The second .
+ A new representing the division of the two provided .
+
+
+
+ Returns a new representing the multiplication of the and the provided .
+
+ The .
+ The .
+ A new representing the multiplication of the and the provided .
+
+
+
+ Represents a rectangle defined by it's position and it's size.
+
+
+
+
+ Gets the representing the top-left corner of the .
+
+
+
+
+ Gets the of the .
+
+
+
+
+ Gets a new representing the center-point of the .
+
+
+
+
+ Gets a bool indicating if both, the width and the height of the rectangle is greater than zero.
+ True if the rectangle has a width or a height of zero; otherwise, false.
+
+
+
+
+
+ Initializes a new instance of the class using the provided values for ans .
+
+ The x-value of the of this .
+ The y-value of the -position of this .
+ The width of the of this .
+ The height of the of this .
+
+
+
+ Initializes a new instance of the class using the (0,0) and the specified .
+
+ The size of of this .
+
+
+
+ Initializes a new instance of the class using the specified and .
+
+ The location of this of this .
+ The size of of this .
+
+
+
+
+ Initializes a new instance of the class using the specified array of .
+ The and is calculated to completely contain all rectangles provided as parameters.
+
+ The array of used to calculate the and .
+
+
+
+ Initializes a new instance of the class using the specified list of .
+ The and is calculated to completely contain all rectangles provided as parameters.
+
+ The list of used to calculate the and .
+
+
+
+
+ Initializes a new instance of the class using the specified array of .
+ The and is calculated to contain all points provided as parameters.
+
+ The array of used to calculate the and .
+
+
+
+ Initializes a new instance of the class using the specified list of .
+ The and is calculated to contain all points provided as parameters.
+
+ The list of used to calculate the and .
+
+
+
+ Converts the - and -position of this to a human-readable string.
+
+ A string that contains the and of this . For example "[Location: [X: 100, Y: 10], Size: [Width: 20, Height: [40]]".
+
+
+
+ Tests whether the specified is equivalent to this .
+
+ The rectangle to test.
+ true if is equivalent to this ; otherwise, false.
+
+
+
+ Tests whether the specified object is a and is equivalent to this .
+
+ The object to test.
+ true if is a equivalent to this ; otherwise, false.
+
+
+
+ Returns a hash code for this .
+
+ An integer value that specifies the hash code for this .
+
+
+
+ Returns a value that indicates whether two specified are equal.
+
+ The first to compare.
+ The second to compare.
+ true if and are equal; otherwise, false.
+
+
+
+ Returns a value that indicates whether two specified are equal.
+
+ The first to compare.
+ The second to compare.
+ true if and are not equal; otherwise, false.
+
+
+
+ Returns a normalized to the specified reference.
+
+ The rectangle to nromalize.
+ The reference used for normalization.
+ A normalized rectangle.
+
+
+
+ Represents an angular rotation.
+
+
+
+
+ Gets the angle in degrees.
+
+
+
+
+ Gets the angle in radians.
+
+
+
+
+ Gets a bool indicating if the rotation is > 0.
+
+
+
+
+ Initializes a new instance of the class using the provided values.
+
+ The rotation in degrees.
+
+
+
+ Creates a new Rotation out of the specified degree-angle.
+
+ The angle in degrees.
+ The new rotation.
+
+
+
+ Creates a new Rotation out of the specified radian-angle.
+
+ The angle in radians.
+ The new rotation.
+
+
+
+ Tests whether the specified is equivalent to this .
+
+ The rotation to test.
+ true if is equivalent to this ; otherwise, false.
+
+
+
+ Tests whether the specified object is a and is equivalent to this .
+
+ The object to test.
+ true if is a equivalent to this ; otherwise, false.
+
+
+
+ Returns a hash code for this .
+
+ An integer value that specifies the hash code for this .
+
+
+
+ Returns a value that indicates whether two specified are equal.
+
+ The first to compare.
+ The second to compare.
+ true if and are equal; otherwise, false.
+
+
+
+ Returns a value that indicates whether two specified are equal.
+
+ The first to compare.
+ The second to compare.
+ true if and are not equal; otherwise, false.
+
+
+
+ Returns a new representing the addition of the and the provided value.
+
+ The .
+ The value to add.
+ A new representing the addition of the and the provided value.
+
+
+
+ Returns a new representing the subtraction of the and the provided value.
+
+ The .
+ The value to substract.
+ A new representing the subtraction of the and the provided value.
+
+
+
+ Returns a new representing the multiplication of the and the provided value.
+
+ The .
+ The value to multiply with.
+ A new representing the multiplication of the and the provided value.
+
+
+
+ Returns a new representing the division of the and the provided value.
+
+ The .
+ The value to device with.
+ A new representing the division of the and the provided value.
+
+
+
+ Converts a float to a .
+
+ The rotation in degrees to convert.
+
+
+
+ Converts to a float representing the rotation in degrees.
+
+ The rotatio to convert.
+
+
+
+ Represents a scaling.
+
+
+
+
+ Gets the horizontal scaling value.
+
+
+
+
+ Gets the vertical scaling value.
+
+
+
+
+ Initializes a new instance of the class using the provided values.
+
+ The value used for horizontal and vertical scaling. 0 if not set.
+
+
+
+ Initializes a new instance of the class using the provided values.
+
+ The value used for horizontal scaling.
+ The value used for vertical scaling.
+
+
+
+ Converts the and value of this to a human-readable string.
+
+ A string that contains the and value of this . For example "[Horizontal: 1, Vertical: 0.5]".
+
+
+
+ Tests whether the specified is equivalent to this .
+
+ The scale to test.
+ true if is equivalent to this ; otherwise, false.
+
+
+
+ Tests whether the specified object is a and is equivalent to this .
+
+ The object to test.
+ true if is a equivalent to this ; otherwise, false.
+
+
+
+ Returns a hash code for this .
+
+ An integer value that specifies the hash code for this .
+
+
+
+ Deconstructs the scale into the horizontal and vertical value.
+
+ The horizontal scaling value.
+ The vertical scaling value.
+
+
+
+ Returns a value that indicates whether two specified are equal.
+
+ The first to compare.
+ The second to compare.
+ true if and are equal; otherwise, false.
+
+
+
+ Returns a value that indicates whether two specified are equal.
+
+ The first to compare.
+ The second to compare.
+ true if and are not equal; otherwise, false.
+
+
+
+ Returns a new representing the addition of the and the provided value.
+
+ The .
+ The value to add.
+ A new representing the addition of the and the provided value.
+
+
+
+ Returns a new representing the subtraction of the and the provided value.
+
+ The .
+ The value to substract.
+ A new representing the subtraction of the and the provided value.
+
+
+
+ Returns a new representing the multiplication of the and the provided value.
+
+ The .
+ The value to multiply with.
+ A new representing the multiplication of the and the provided value.
+
+
+
+ Returns a new representing the division of the and the provided value.
+
+ The .
+ The value to device with.
+ A new representing the division of the and the provided value.
+
+
+
+ Converts a float to a .
+
+ The scale value to convert.
+
+
+
+ Contains a list of different shapes used to define the layout of a LED.
+
+
+
+
+ A custom shape defined by vector-data.
+
+
+
+
+ A simple rectangle.
+
+
+
+
+ A simple circle.
+
+
+
+
+ Represents a size consisting of a width and a height.
+
+
+
+
+ Gets a [NaN,NaN]-Size.
+
+
+
+
+ Gets or sets the width component value of this .
+
+
+
+
+ Gets or sets the height component value of this .
+
+
+
+
+
+ Initializes a new instance of the using the provided size to define a square.
+
+ The size used for the component value and the component value.
+
+
+
+ Initializes a new instance of the class using the provided values.
+
+ The size used for the component value.
+ The size used for the component value.
+
+
+
+ Converts the and of this to a human-readable string.
+
+ A string that contains the and of this . For example "[Width: 100, Height: 20]".
+
+
+
+ Tests whether the specified is equivalent to this .
+
+ The size to test.
+ true if is equivalent to this ; otherwise, false.
+
+
+
+ Tests whether the specified object is a and is equivalent to this .
+
+ The object to test.
+ true if is a equivalent to this ; otherwise, false.
+
+
+
+ Returns a hash code for this .
+
+ An integer value that specifies the hash code for this .
+
+
+
+ Deconstructs the size into the width and height value.
+
+ The width.
+ The height.
+
+
+
+ Returns a value that indicates whether two specified are equal.
+
+ The first to compare.
+ The second to compare.
+ true if and are equal; otherwise, false.
+
+
+
+ Returns a value that indicates whether two specified are equal.
+
+ The first to compare.
+ The second to compare.
+ true if and are not equal; otherwise, false.
+
+
+
+ Returns a new representing the addition of the two provided .
+
+ The first .
+ The second .
+ A new representing the addition of the two provided .
+
+
+
+ Returns a new created from the provided and .
+
+ The of the rectangle.
+ The of the rectangle.
+ The rectangle created from the provided and .
+
+
+
+ Returns a new representing the subtraction of the two provided .
+
+ The first .
+ The second .
+ A new representing the subtraction of the two provided .
+
+
+
+ Returns a new representing the multiplication of the two provided .
+
+ The first .
+ The second .
+ A new representing the multiplication of the two provided .
+
+
+
+ Returns a new representing the multiplication of the and the provided factor.
+
+ The .
+ The factor by which the should be multiplied.
+ A new representing the multiplication of the and the provided factor.
+
+
+
+ Returns a new representing the division of the two provided .
+
+ The first .
+ The second .
+ A new representing the division of the two provided .
+
+
+
+ Returns a new representing the division of the and the provided factor.
+
+ The .
+ The factor by which the should be divided.
+ A new representing the division of the and the provided factor.
+
+
+
+ Returns a new representing the multiplication of the and the specified .
+
+ The to scale.
+ The scaling factor.
+ A new representing the multiplication of the and the specified .
+
+
+
+
+
+ Represents a basic brush.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The overall percentage brightness of the brush. (default: 1.0)
+ The overall percentage opacity of the brush. (default: 1.0)
+
+
+
+ Renders the brush to the specified list of .
+
+ The bounding box the brush is rendered in.
+ The targets to render to.
+ A enumerable containing the rendered for each .
+
+
+
+ Applies all attached and enabled decorators to the brush.
+
+ The rectangle in which the brush should be drawn.
+ The target (key/point) from which the color should be taken.
+ The to be modified.
+
+
+
+ Gets the color at an specific point assuming the brush is drawn into the specified rectangle.
+
+ The rectangle in which the brush should be drawn.
+ The target (key/point) from which the color should be taken.
+ The color at the specified point.
+
+
+
+ Finalizes the color by appliing the overall brightness and opacity.
+
+ The color to finalize.
+ The finalized color.
+
+
+
+ Represents a basic brush.
+
+
+
+
+ Gets or sets if the is enabled and will be drawn on an update.
+
+
+
+
+ Gets or sets the calculation mode used for the rectangle/points used for color-selection in brushes.
+
+
+
+
+ Gets or sets the overall percentage brightness of the .
+
+
+
+
+ Gets or sets the overall percentage opacity of the .
+
+
+
+
+ Performs the render pass of the and calculates the raw for all requested .
+
+ The in which the brush should be drawn.
+ The (keys/points) of which the color should be calculated.
+
+
+
+
+ Represents a brush drawing only a single color.
+
+
+
+
+ Gets or sets the drawn by this .
+
+
+
+
+ Initializes a new instance of the class.
+
+ The drawn by this .
+
+
+
+
+
+
+ Converts a to a .
+
+ The to convert.
+
+
+
+ Converts a to a .
+
+ The to convert.
+
+
+
+
+ Represents a brush drawing a texture.
+
+
+
+
+ Gets or sets the texture drawn by this brush.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The texture drawn by this brush.
+
+
+
+
+
+
+ Contains a list of all brush calculation modes.
+
+
+
+
+ The calculation for will be the rectangle around the the is applied to.
+
+
+
+
+ The calculation for will always be the whole .
+
+
+
+
+ Represents a single target of a brush render.
+
+
+
+
+ Gets the target-.
+
+
+
+
+ Gets the representing the area to render the target-.
+
+
+
+
+ Gets the representing the position to render the target-.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The target-.
+ The representing the area to render the target-.
+
+
+
+ Represents a generic texture.
+
+
+
+
+ Gets a empty texture.
+
+
+
+
+ Gets the size of the texture
+
+
+
+
+ Gets the color at the specified location.
+
+ The location to get the color from.
+ The color at the specified location.
+
+
+
+ Gets the sampled color inside the specified rectangle.
+
+ The rectangle to get the color from.
+ The sampled color.
+
+
+
+
+ Represents a texture made of pixels (like a common image).
+
+ The type of the pixels.
+
+
+
+ Gets the underlying pixel data.
+
+
+
+
+ Gets the amount of data-entries per pixel.
+
+
+
+
+ Gets the stride of the data.
+
+
+
+
+ Gets or sets the sampler used to get the color of a region.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Gets the sampled color inside the specified region.
+
+ The x-location of the region.
+ The y-location of the region.
+ The with of the region.
+ The height of the region.
+ The sampled color.
+
+
+
+ Initializes a new instance of the class.
+
+ The width of the texture.
+ The height of the texture.
+ The amount of data-entries per pixel.
+ The sampler used to get the color of a region.
+ The stride of the data or -1 if the width should be used.
+
+
+
+ Converts the pixel-data to a color.
+
+ The pixel-data to convert.
+ The color represented by the specified pixel-data.
+
+
+
+ Gets the pixel-data at the specified location.
+
+ The x-location.
+ The y-location.
+ The pixel-data on the specified location.
+
+
+
+
+ Represents a texture made of color-pixels.
+
+
+
+
+
+
+
+ Initializes a new instance of the class.
+ A is used.
+
+ The width of the texture.
+ The height of the texture.
+ The pixel-data of the texture.
+
+
+
+ Initializes a new instance of the class.
+
+ The width of the texture.
+ The height of the texture.
+ The pixel-data of the texture.
+ The sampler used to get the color of a region.
+
+
+
+
+
+
+ Represents a sampled that averages multiple color to a single color.
+
+
+ Averages all components (A, R, G, B) of the colors separately which isn't ideal in cases where multiple different colors are combined.
+
+
+
+
+
+
+
+ Represents a generic sampler to combine multipel data entries to a single one.
+
+ The type of the data to sample.
+
+
+
+ Samples the specified data to a single pixel-buffer.
+
+ The information containing the data to sample.
+ The buffer used to write the resulting pixel to.
+
+
+
+ Represents the information used to sample data.
+
+ The type of the data to sample.
+
+
+
+ Gets the width of the region the data comes from.
+
+
+
+
+ Gets the height of region the data comes from.
+
+
+
+
+ Gets the data for the requested row.
+
+ The row to get the data for.
+ A readonly span containing the data of the row.
+
+
+
+ Initializes a new instance of the class.
+
+ The width of the region the data comes from.
+ The height of region the data comes from.
+ The data to sample.
+
+
+
+
+
+ Represents a RGB-surface containing multiple devices.
+
+
+
+
+ Gets a readonly list containing all loaded .
+ This collection should be locked when enumerated in a multi-threaded application.
+
+
+
+
+ Gets a readonly list containing all registered .
+ This collection should be locked when enumerated in a multi-threaded application.
+
+
+
+
+ Gets a copy of the representing this .
+
+
+
+
+ Gets a list of all on this .
+
+
+
+
+ Represents the event-handler of the -event.
+
+ The arguments provided by the event.
+
+
+
+ Represents the event-handler of the -event.
+
+ The arguments provided by the event.
+
+
+
+ Represents the event-handler of the -event.
+
+ The arguments provided by the event.
+
+
+
+ Represents the event-handler of the -event.
+
+ The arguments provided by the event.
+
+
+
+ Occurs when a catched exception is thrown inside the .
+
+
+
+
+ Occurs when the starts updating.
+
+
+
+
+ Occurs when the update is done.
+
+
+
+
+ Occurs when the layout of this changed.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Perform a full update for all devices. Updates only dirty by default, or all , if flushLeds is set to true.
+
+ Specifies whether all , (including clean ones) should be updated.
+
+
+
+
+
+
+ Renders a ledgroup.
+
+ The led group to render.
+ Thrown if the of the Brush is not valid.
+
+
+
+ Attaches the specified .
+
+ The to attach.
+ true if the could be attached; otherwise, false.
+
+
+
+ Detaches the specified .
+
+ The to detache.
+ true if the could be detached; false otherwise.
+
+
+
+ Attaches the specified .
+
+ The to attach.
+
+
+
+ Detaches the specified .
+
+ The to detache.
+ true if the could be detached; false otherwise.
+
+
+
+ Registers the provided .
+
+ The to register.
+
+
+
+ Unregisters the provided .
+
+ The to unregister.
+
+
+
+ Handles the needed event-calls for an exception.
+
+ The exception previously thrown.
+
+
+
+ Handles the needed event-calls before updating.
+
+
+
+
+ Handles the needed event-calls after an update.
+
+
+
+
+ Represents a generic update trigger.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Invokes the -event.
+
+ Optional custom-data passed to the subscribers of the .event.
+
+
+
+ Invokes the -event.
+
+ Optional custom-data passed to the subscribers of the .event.
+
+
+
+
+
+
+
+
+
+ Represents an index used to identify data in the .
+
+
+
+
+ Checked by the to see if all LEDs needs to be flushed even if they aren't changed in this update.
+ default: false
+
+
+
+
+ Checked by the to see if the surface should be rendered in this update.
+ default: true
+
+
+
+
+ Checked by the to see if devies should be updated after rendering.
+ default: true
+
+
+
+
+ Used by to indicate heatbeat updates.
+
+
+
+
+ Represents a set of custom data, each indexed by a string-key.
+
+
+
+
+ Gets the value for a specific key.
+
+ The key of the value.
+ The value represented by the specified key.
+
+
+
+ Represents a set of custom data, each indexed by a string-key.
+
+
+
+
+ Gets or sets the value for a specific key.
+
+ The key of the value.
+ The value represented by the specified key.
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ A params-list of tuples containing the key (string) and the value of a specific custom-data.
+
+
+
+ Represents an update-trigger used to update devices with a maximum update-rate.
+
+
+
+
+ Gets or sets the timeout used by the blocking wait for data availability.
+
+
+
+
+ Gets the update frequency used by the trigger if not limited by data shortage.
+
+
+
+
+ Gets or sets the maximum update rate of this trigger (is overwriten if the is smaller).
+ <= 0 removes the limit.
+
+
+
+
+ Gets the hard limit of the update rate of this trigger. Updates will never perform faster then then this value if it's set.
+ <= 0 removes the limit.
+
+
+
+
+ Gets or sets the time in ms after which a refresh-request is sent even if no changes are made in the meantime to prevent the target from timing out or similar problems.
+ To disable heartbeats leave it at 0.
+
+
+
+
+
+
+
+ Gets or sets the timestamp of the last update.
+
+
+
+
+ Gets or sets the event to trigger when new data is available ().
+
+
+
+
+ Gets or sets a bool indicating if the trigger is currently updating.
+
+
+
+
+ Gets or sets the update loop of this trigger.
+
+
+
+
+ Gets or sets the cancellation token source used to create the cancellation token checked by the .
+
+
+
+
+ Gets or sets the cancellation token checked by the .
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The hard limit of the update rate of this trigger.
+
+
+
+ Starts the trigger.
+
+
+
+
+ Stops the trigger.
+
+
+
+
+ The update loop called by the .
+
+
+
+
+
+
+
+
+
+
+ Represents an update trigger used to trigger device-updates.
+
+
+
+
+ Indicates that there's data available to process.
+
+
+
+
+ Represents a generic update queue.
+
+ The identifier used to identify the data processed by this queue.
+ The type of the data processed by this queue.
+
+
+
+ Gets a bool indicating if the queue requires a flush of all data due to an internal error.
+
+
+
+
+ Sets or merges the provided data set in the current dataset and notifies the trigger that there is new data available.
+
+ The set of data.
+
+
+
+ Resets the current data set.
+
+
+
+
+ Represents a generic update queue processing -data using -identifiers.
+
+
+
+
+ Represents a generic update queue.
+
+ The type of the key used to identify some data.
+ The type of the data.
+
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The causing this queue to update.
+
+
+
+ Event handler for the -event.
+
+ The causing this update.
+ provided by the trigger.
+
+
+
+ Event handler for the -event.
+
+ The starting .
+ provided by the trigger.
+
+
+
+ Performs the update this queue is responsible for.
+
+ The set of data that needs to be updated.
+
+
+
+ Sets or merges the provided data set in the current dataset and notifies the trigger that there is new data available.
+
+ The set of data.
+
+
+
+ Resets the current data set.
+
+
+
+
+
+
+
+ Represents a generic using an object as the key and a color as the value.
+
+
+
+
+
+
+
+ Represents a trigger causing an update.
+
+
+
+
+ Gets the time spent for the last update.
+
+
+
+
+ Occurs when the trigger is starting up.
+
+
+
+
+ Occurs when the trigger wants to cause an update.
+
+
+
+
+ Starts the update trigger.
+
+
+
+
+
+ Represents an update trigger that is manully triggered by calling .
+
+
+
+
+ Gets the time it took the last update-loop cycle to run.
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Starts the trigger if needed, causing it to performing updates.
+
+
+
+
+ Stops the trigger if running, causing it to stop performing updates.
+
+
+
+
+ Triggers an update.
+
+
+
+
+
+
+
+
+ Represents an update trigger that triggers in a set interval.
+
+
+
+
+ Gets or sets the update loop of this trigger.
+
+
+
+
+ Gets or sets the cancellation token source used to create the cancellation token checked by the .
+
+
+
+
+ Gets or sets the cancellation token checked by the .
+
+
+
+
+ Gets or sets the update-frequency in seconds. (Calculate by using '1.0 / updates per second')
+
+
+
+
+ Gets the time it took the last update-loop cycle to run.
+
+
+
+
+ Initializes a new instance of the class.
+
+ A value indicating if the trigger should automatically right after construction.
+
+
+
+ Initializes a new instance of the class.
+
+ The update-data passed on each update triggered.
+ A value indicating if the trigger should automatically right after construction.
+
+
+
+ Starts the trigger if needed, causing it to performing updates.
+
+
+
+
+ Stops the trigger if running, causing it to stop performing updates.
+
+
+
+
+
+
+
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Devices.CoolerMaster.xml b/Build Dependencies/RGB.NET/RGB.NET.Devices.CoolerMaster.xml
new file mode 100644
index 00000000..f9c9f72b
--- /dev/null
+++ b/Build Dependencies/RGB.NET/RGB.NET.Devices.CoolerMaster.xml
@@ -0,0 +1,305 @@
+
+
+
+ RGB.NET.Devices.CoolerMaster
+
+
+
+
+
+ Specifies the of a field.
+
+
+
+
+ Gets the .
+
+
+
+
+
+ Internal constructor of the class.
+
+ The .
+
+
+
+
+ Represents a device provider responsible for Cooler Master devices.
+
+
+
+
+ Gets the singleton instance.
+
+
+
+
+ Gets a modifiable list of paths used to find the native SDK-dlls for x86 applications.
+ The first match will be used.
+
+
+
+
+ Gets a modifiable list of paths used to find the native SDK-dlls for x64 applications.
+ The first match will be used.
+
+
+
+
+ Initializes a new instance of the class.
+
+ Thrown if this constructor is called even if there is already an instance of this class.
+
+
+
+
+
+
+
+
+
+
+
+
+ Contains a list of available device-indexes.
+
+
+
+
+ Contains list of available physical layouts for cooler master keyboards.
+
+
+
+
+
+ Represents a generic CoolerMaster-device. (keyboard, mouse, headset, mousepad).
+
+
+
+
+ Initializes a new instance of the class.
+
+ The generic information provided by CoolerMaster for the device.
+ The update trigger used to update this device.
+
+
+
+
+
+
+
+
+ Represents a generic information for a Corsair-.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Gets the of the .
+
+
+
+
+ Internal constructor of managed .
+
+ The type of the .
+ The of the .
+
+
+
+
+ Represents the update-queue performing updates for cooler master devices.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The update trigger used by this queue.
+ The of the device this queue performs updates for.
+
+
+
+
+
+
+ Represents a CoolerMaster RGB-device.
+
+
+
+
+ Offers some extensions and helper-methods for enum related things.
+
+
+
+
+ Gets the value of the .
+
+ The enum value to get the description from.
+ The value of the or the result of the source.
+
+
+
+ Gets the value of the .
+
+ The enum value to get the description from.
+ The value of the or the result of the source.
+
+
+
+ Gets the attribute of type T.
+
+ The enum value to get the attribute from
+ The generic attribute type
+ The .
+
+
+
+ Contains all the hardware-id mappings for CoolerMaster devices.
+
+
+
+
+ Contains all the hardware-id mappings for CoolerMaster devices.
+
+
+
+
+
+ Represents a CoolerMaster keyboard.
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The specific information provided by CoolerMaster for the keyboard
+ The update trigger used to update this device.
+
+
+
+
+
+
+ Represents a generic information for a .
+
+
+
+
+
+
+
+ Gets the of the .
+
+
+
+
+
+ Internal constructor of managed .
+
+ The index of the .
+ The of the .
+
+
+
+ Contains all the hardware-id mappings for CoolerMaster devices.
+
+
+
+
+ Contains all the hardware-id mappings for CoolerMaster devices.
+
+
+
+
+
+ Represents a CoolerMaster mouse.
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The specific information provided by CoolerMaster for the mouse
+ The update trigger used to update this device.
+
+
+
+
+
+
+
+ Represents a generic information for a .
+
+
+
+
+
+ Internal constructor of managed .
+
+ The index of the .
+
+
+
+ Reloads the SDK.
+
+
+
+
+ CM-SDK: Get SDK Dll's Version.
+
+
+
+
+ CM-SDK: set operating device
+
+
+
+
+ CM-SDK: verify if the deviced is plugged in
+
+
+
+
+ CM-SDK: Obtain current device layout
+
+
+
+
+ CM-SDK: set control over device’s LED
+
+
+
+
+ CM-SDK: Print out the lights setting from Buffer to LED
+
+
+
+
+ CM-SDK: Set single Key LED color
+
+
+
+
+ CM-SDK: Set Keyboard "every LED" color
+
+
+
+
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Devices.Logitech.deps.json b/Build Dependencies/RGB.NET/RGB.NET.Devices.Logitech.deps.json
new file mode 100644
index 00000000..1dd84bcf
--- /dev/null
+++ b/Build Dependencies/RGB.NET/RGB.NET.Devices.Logitech.deps.json
@@ -0,0 +1,72 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v10.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v10.0": {
+ "RGB.NET.Devices.Logitech/0.0.1": {
+ "dependencies": {
+ "RGB.NET.Core": "0.0.1",
+ "RGB.NET.HID": "0.0.1"
+ },
+ "runtime": {
+ "RGB.NET.Devices.Logitech.dll": {}
+ }
+ },
+ "HidSharp/2.1.0": {
+ "runtime": {
+ "lib/netstandard2.0/HidSharp.dll": {
+ "assemblyVersion": "2.1.0.0",
+ "fileVersion": "2.1.0.0"
+ }
+ }
+ },
+ "RGB.NET.Core/0.0.1": {
+ "runtime": {
+ "RGB.NET.Core.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.1.0"
+ }
+ }
+ },
+ "RGB.NET.HID/0.0.1": {
+ "dependencies": {
+ "HidSharp": "2.1.0",
+ "RGB.NET.Core": "0.0.1"
+ },
+ "runtime": {
+ "RGB.NET.HID.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.1.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "RGB.NET.Devices.Logitech/0.0.1": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "HidSharp/2.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-UTdxWvbgp2xzT1Ajaa2va+Qi3oNHJPasYmVhbKI2VVdu1VYP6yUG+RikhsHvpD7iM0S8e8UYb5Qm/LTWxx9QAA==",
+ "path": "hidsharp/2.1.0",
+ "hashPath": "hidsharp.2.1.0.nupkg.sha512"
+ },
+ "RGB.NET.Core/0.0.1": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "RGB.NET.HID/0.0.1": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Devices.Logitech.dll b/Build Dependencies/RGB.NET/RGB.NET.Devices.Logitech.dll
new file mode 100644
index 00000000..0e6d0319
Binary files /dev/null and b/Build Dependencies/RGB.NET/RGB.NET.Devices.Logitech.dll differ
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Devices.Logitech.xml b/Build Dependencies/RGB.NET/RGB.NET.Devices.Logitech.xml
new file mode 100644
index 00000000..fd6af7d0
--- /dev/null
+++ b/Build Dependencies/RGB.NET/RGB.NET.Devices.Logitech.xml
@@ -0,0 +1,367 @@
+
+
+
+ RGB.NET.Devices.Logitech
+
+
+
+
+ Contains list of available logitech device types.
+
+
+
+
+ Contains a list of Logitech LED IDs
+
+
+
+
+ Contains list of available logical layouts for logitech keyboards.
+
+
+
+
+ Contains list of available physical layouts for logitech keyboards.
+
+
+
+
+ US-Keyboard
+
+
+
+
+ UK-Keyboard
+
+
+
+
+ BR-Keyboard
+
+
+
+
+ JP-Keyboard
+
+
+
+
+ KR-Keyboard
+
+
+
+
+ Represents a logitech RGB-device.
+
+
+
+
+ Contains mappings for to .
+
+
+
+
+ Gets the mapping for per key devices.
+
+
+
+
+ Gets the mapping for per device devices.
+
+
+
+
+ Gets the mapping for per zone keyboards.
+
+
+
+
+ Gets the mapping for per zone mice.
+
+
+
+
+ Gets the mapping for per zone headsets.
+
+
+
+
+ Gets the mapping for per zone mousepads.
+
+
+
+
+ Gets the mapping for per zone speakers.
+
+
+
+
+
+ Represents a generic Logitech-device. (keyboard, mouse, headset, mousepad).
+
+
+
+
+ Initializes a new instance of the class.
+
+ The generic information provided by Logitech for the device.
+ The queue used to update this device.
+
+
+
+
+ Represents a generic information for a Logitech-.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Gets a flag that describes device capabilities. ()
+
+
+
+
+ Gets the amount of zones the is able to control (0 for single-color and per-key devices)
+
+
+
+
+ Gets the zone at which LEDs start being mapped
+
+
+
+
+ Internal constructor of managed .
+
+ The type of the .
+ The represented device model.
+ The lighting-capabilities of the device.
+ The amount of zones the device is able to control.
+ The zone at which to start mapping LEDs.
+
+
+
+ Represents a loaded for logitech HID-devices.
+
+ The type of the identifier leds are mapped to.
+ The type of the custom data added to the HID-device.
+
+
+
+ Gets the vendor id used for this loader.
+
+
+
+
+ Gets or sets the filter used to determine which devices should be loaded.
+
+
+
+
+ Adds a new to this loader.
+
+ The virtual product id of the HID-device.
+ The type of the device.
+ The name of the device.
+ The mapping of the leds of the device.
+ Some custom data to attach to the device.
+
+
+
+ Gets a enumerable containing all devices from the definition-list that are connected and match the .
+
+ The enumerable containing the connected devices.
+
+
+
+ Gets a enumerable containing all the first device of each group of devices from the definition-list that are connected and match the .
+ The grouping is done by the specified function.
+
+ The type of the key used to group the devices.
+ The function grouping the devices.
+ The enumerable containing the selected devices.
+
+
+
+
+
+
+
+ Represents a device provider responsible for logitech devices.
+
+
+
+
+ Gets the singleton instance.
+
+
+
+
+ Gets a modifiable list of paths used to find the native SDK-dlls for x86 applications.
+ The first match will be used.
+
+
+
+
+ Gets a modifiable list of paths used to find the native SDK-dlls for x64 applications.
+ The first match will be used.
+
+
+
+
+ Gets the HID-definitions for wired per-key-devices.
+
+
+
+
+ Gets the HID-definitions for wireless per-key-devices.
+
+
+
+
+ Gets the HID-definitions for wired per-zone-devices.
+
+
+
+
+ Gets the HID-definitions for wireless per-zone-devices.
+
+
+
+
+ Gets the HID-definitions for wired per-device-devices.
+
+
+
+
+ Gets the HID-definitions for wireless per-device-devices.
+
+
+
+
+ Initializes a new instance of the class.
+
+ Thrown if this constructor is called even if there is already an instance of this class.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Reloads the SDK.
+
+
+
+
+
+ Represents a logitech per-device-lightable device.
+
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+
+
+
+
+ Represents the update-queue performing updates for logitech per-device devices.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The update trigger used by this queue.
+
+
+
+
+
+
+
+ Represents a logitech per-key-lightable device.
+
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+
+
+
+ Represents the update-queue performing updates for logitech per-key devices.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The update trigger used by this queue.
+
+
+
+
+
+
+
+ Represents a logitech zone-lightable device.
+
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+
+
+
+ Represents the update-queue performing updates for logitech zone devices.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The update trigger used by this queue.
+ The tpye of the device this queue is updating.
+
+
+
+
+
+
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Devices.OpenRGB.deps.json b/Build Dependencies/RGB.NET/RGB.NET.Devices.OpenRGB.deps.json
new file mode 100644
index 00000000..2f0d2e8a
--- /dev/null
+++ b/Build Dependencies/RGB.NET/RGB.NET.Devices.OpenRGB.deps.json
@@ -0,0 +1,55 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v10.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v10.0": {
+ "RGB.NET.Devices.OpenRGB/0.0.1": {
+ "dependencies": {
+ "OpenRGB.NET": "3.1.1",
+ "RGB.NET.Core": "0.0.1"
+ },
+ "runtime": {
+ "RGB.NET.Devices.OpenRGB.dll": {}
+ }
+ },
+ "OpenRGB.NET/3.1.1": {
+ "runtime": {
+ "lib/net8.0/OpenRGB.NET.dll": {
+ "assemblyVersion": "3.1.1.0",
+ "fileVersion": "3.1.1.0"
+ }
+ }
+ },
+ "RGB.NET.Core/0.0.1": {
+ "runtime": {
+ "RGB.NET.Core.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.1.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "RGB.NET.Devices.OpenRGB/0.0.1": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "OpenRGB.NET/3.1.1": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-oM9zmjwaDSAb0MxTK+cMhebFRrK5emnJW3K0zeuYmh5AMVYx0JxsCLQClrdh1x1cZOWCxjnbuJ5VIC6+yJh0zw==",
+ "path": "openrgb.net/3.1.1",
+ "hashPath": "openrgb.net.3.1.1.nupkg.sha512"
+ },
+ "RGB.NET.Core/0.0.1": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Devices.OpenRGB.dll b/Build Dependencies/RGB.NET/RGB.NET.Devices.OpenRGB.dll
new file mode 100644
index 00000000..59367c37
Binary files /dev/null and b/Build Dependencies/RGB.NET/RGB.NET.Devices.OpenRGB.dll differ
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Devices.OpenRGB.xml b/Build Dependencies/RGB.NET/RGB.NET.Devices.OpenRGB.xml
new file mode 100644
index 00000000..714eb911
--- /dev/null
+++ b/Build Dependencies/RGB.NET/RGB.NET.Devices.OpenRGB.xml
@@ -0,0 +1,195 @@
+
+
+
+ RGB.NET.Devices.OpenRGB
+
+
+
+
+
+ Represents a generic OpenRGB Device.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The generic information provided by OpenRGB for this device.
+ The queue used to update this device.
+
+
+
+ Represents a generic OpenRGB Device.
+
+
+
+
+ Represents generic information for an OpenRGB Device
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Gets the OpenRGB device.
+
+
+
+
+ Initializes a new instance of .
+
+ The OpenRGB device to extract information from.
+ If this is a zone or segment, specify the name
+
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ Generic information for the device.
+ The queue used to update the device.
+
+
+
+ Initializes the LEDs of the device based on the data provided by the SDK.
+
+
+
+
+
+ Represents the update-queue performing updates for OpenRGB devices.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The update trigger used by this queue.
+ The index used to identify the device.
+ The OpenRGB client used to send updates to the OpenRGB server.
+ The OpenRGB Device containing device-specific information.
+
+
+
+
+
+ Shortens given input into 8 character string
+
+
+
+
+ Represents a device provider responsible for OpenRGB devices.
+
+
+
+
+ Gets the singleton instance.
+
+
+
+
+ Gets a list of all defined device-definitions.
+
+
+
+
+ Indicates whether all devices will be added, or just the ones with a 'Direct' mode. Defaults to false.
+
+
+
+
+ Defines which device types will be separated by zones. Defaults to | | .
+
+
+
+
+ Initializes a new instance of the class.
+
+ Thrown if this constructor is called even if there is already an instance of this class.
+
+
+
+ Adds the specified to this device-provider.
+
+ The to add.
+
+
+
+
+
+
+
+
+
+
+
+
+ Represents a definition of an OpenRGB server.
+
+
+
+
+ The name of the client that will appear in the OpenRGB interface.
+
+
+
+
+ The ip address of the server.
+
+
+
+
+ The port of the server.
+
+
+
+
+ Whether the provider is connected to this server definition or not.
+
+
+
+
+ The error that occurred when connecting, if this failed.
+
+
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The information provided by OpenRGB
+ The ledId of the first led in the device that belongs to this zone.
+ The Zone information provided by OpenRGB.
+ The queue used to update this zone.
+
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The information provided by OpenRGB
+ The ledId of the first led in the device that belongs to this zone.
+ The Segment information provided by OpenRGB.
+ The queue used to update this zone.
+
+
+
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Devices.PlayStation.deps.json b/Build Dependencies/RGB.NET/RGB.NET.Devices.PlayStation.deps.json
new file mode 100644
index 00000000..0daf807c
--- /dev/null
+++ b/Build Dependencies/RGB.NET/RGB.NET.Devices.PlayStation.deps.json
@@ -0,0 +1,72 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v10.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v10.0": {
+ "RGB.NET.Devices.PlayStation/0.0.1": {
+ "dependencies": {
+ "RGB.NET.Core": "0.0.1",
+ "RGB.NET.HID": "0.0.1"
+ },
+ "runtime": {
+ "RGB.NET.Devices.PlayStation.dll": {}
+ }
+ },
+ "HidSharp/2.1.0": {
+ "runtime": {
+ "lib/netstandard2.0/HidSharp.dll": {
+ "assemblyVersion": "2.1.0.0",
+ "fileVersion": "2.1.0.0"
+ }
+ }
+ },
+ "RGB.NET.Core/0.0.1": {
+ "runtime": {
+ "RGB.NET.Core.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.1.0"
+ }
+ }
+ },
+ "RGB.NET.HID/0.0.1": {
+ "dependencies": {
+ "HidSharp": "2.1.0",
+ "RGB.NET.Core": "0.0.1"
+ },
+ "runtime": {
+ "RGB.NET.HID.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.1.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "RGB.NET.Devices.PlayStation/0.0.1": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "HidSharp/2.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-UTdxWvbgp2xzT1Ajaa2va+Qi3oNHJPasYmVhbKI2VVdu1VYP6yUG+RikhsHvpD7iM0S8e8UYb5Qm/LTWxx9QAA==",
+ "path": "hidsharp/2.1.0",
+ "hashPath": "hidsharp.2.1.0.nupkg.sha512"
+ },
+ "RGB.NET.Core/0.0.1": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "RGB.NET.HID/0.0.1": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Devices.PlayStation.dll b/Build Dependencies/RGB.NET/RGB.NET.Devices.PlayStation.dll
new file mode 100644
index 00000000..fb9bd8e7
Binary files /dev/null and b/Build Dependencies/RGB.NET/RGB.NET.Devices.PlayStation.dll differ
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Devices.PlayStation.xml b/Build Dependencies/RGB.NET/RGB.NET.Devices.PlayStation.xml
new file mode 100644
index 00000000..e8a5187b
--- /dev/null
+++ b/Build Dependencies/RGB.NET/RGB.NET.Devices.PlayStation.xml
@@ -0,0 +1,238 @@
+
+
+
+ RGB.NET.Devices.PlayStation
+
+
+
+
+
+ Represents a Sony DualSense controller (PS5 / DualSense Edge). Owns its
+ HID I/O directly — the open , the optional Win32
+ raw-write fallback, and the device path used for identity comparison
+ during hot-plug — and tears them down on .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ See for the contract.
+
+
+
+
+ See for the contract.
+
+
+
+
+
+ Represents a Sony DualShock 4 controller. Owns its HID I/O directly —
+ the open , the optional Win32 raw-write fallback,
+ and the device path used for identity comparison during hot-plug — and
+ tears them down on .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Sets the queue's disposed flag so subsequent ticks short-circuit before
+ attempting any HidStream.Write. Called by the provider's immediate
+ hot-unplug handler the moment the OS reports the device is gone, so the
+ next trigger tick has nothing to write. Lighter than Shutdown — no off-
+ frame attempt, no other state mutation. Idempotent.
+
+
+
+
+ Tears down the queue. defaults to true for
+ "voluntary" teardowns (provider unloaded by the user, app exit) where the
+ controller is still connected and benefits from a clean off-state. Pass
+ false from the hot-plug-disconnect path.
+
+
+
+
+ True on successful write, false on any failure (handle invalid, device
+ gone, partial write, etc.). Never throws — that's the whole point.
+ Caller checks the return value and decides whether to log, retry, or
+ self-suspend the queue.
+
+ The first byte of must be the HID report ID,
+ matching the convention HidStream.Write uses.
+
+
+
+
+ Common contract for PlayStation controller RGB devices. Each device owns
+ its own HID I/O (HidStream + optional HidRawWriter) and DevicePath, and
+ is responsible for tearing those down on .
+
+
+
+ The Windows / Linux HID device path the controller was opened on.
+
+
+
+ Set by the provider's hot-plug pass when the controller has disappeared
+ from HID enumeration. Causes Dispose to skip the polite off-frame write
+ (which would just throw against the invalidated handle anyway).
+
+
+
+
+ Records that the device is no longer reachable on its HID path AND
+ suspends any further writes from the update queue. Called from the
+ hot-plug callback before the debounced Reconcile fires, so the next
+ 30Hz tick is a no-op rather than an exception.
+
+
+
+
+ Identifies the family of PlayStation controller exposed by the provider.
+
+
+
+ The PlayStation 4 DualShock 4 controller (v1 and v2).
+
+
+ The PlayStation 5 DualSense controller.
+
+
+ The PlayStation 5 DualSense Edge controller.
+
+
+
+
+ Represents a generic device-info for a PlayStation controller.
+
+
+
+ Gets the controller family (DualShock 4 / DualSense / DualSense Edge).
+
+
+ Gets the transport the controller is connected by.
+
+
+
+ Gets a stable per-controller identifier derived from the OS device path. Used
+ to disambiguate two same-model controllers connected at the same time.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Identifies the physical transport over which a PlayStation controller is connected.
+
+
+
+ USB (wired) connection.
+
+
+ Bluetooth (wireless) connection.
+
+
+
+
+ Represents a device provider responsible for Sony PlayStation controllers —
+ DualShock 4 (PS4) and DualSense / DualSense Edge (PS5).
+
+
+ Talks raw HID via HidSharp; no third-party drivers (no DS4Windows, no SignalRGB,
+ no HidHide). Both USB and Bluetooth transports are supported.
+
+ Lighting only — input reports continue to flow through the OS HID stack to games
+ normally. Sony's HID gamepads accept *shared* output writes by default, so
+ coexisting with Steam or a game's native lighting integration is the expected
+ case. Last-writer-wins per output report period; at the 30Hz cadence this
+ provider comfortably overrides most intermittent setters (Steam profile changes,
+ game state events).
+
+ Hot-plug: 's Changed event fires on PnP events
+ (USB connect/disconnect, BT pair/unpair). Reconcile is debounced, then
+ the open set is diffed against the current HID enumeration — new
+ controllers get opened + AddDevice'd, removed ones are disposed and
+ RemoveDevice'd.
+
+ Known collisions:
+
+ - DS4Windows / reWASD with "Exclusive Mode" enabled — they hold the HID
+ handle exclusive, so opens fail with UnauthorizedAccessException /
+ IOException.
+ - HidHide hiding the controller from non-allow-listed apps — the device
+ never appears in HidSharp enumeration.
+
+
+
+
+ Gets the singleton instance.
+
+
+ Initializes a new instance of the class.
+ Thrown if a second instance is constructed.
+
+
+
+
+
+
+
+
+
+
+
+
+ Per-frame pre-check used by the update queues. Queries HidSharp's device
+ list LIVE — HidSharp invalidates its internal device-keys cache
+ synchronously on WM_DEVICECHANGE inside DeviceMonitorWindowProc on the
+ message-pump thread, BEFORE pulsing the notify thread that eventually
+ fires the Changed event. So a live
+ GetHidDevices call sees the unplug ahead of any subscriber, which is
+ the race that would otherwise leave the snapshot stale through the
+ first post-unplug 30Hz tick.
+
+
+
+
+
+
+
+
+
+
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Devices.Razer.deps.json b/Build Dependencies/RGB.NET/RGB.NET.Devices.Razer.deps.json
new file mode 100644
index 00000000..8561138e
--- /dev/null
+++ b/Build Dependencies/RGB.NET/RGB.NET.Devices.Razer.deps.json
@@ -0,0 +1,72 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v10.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v10.0": {
+ "RGB.NET.Devices.Razer/0.0.1": {
+ "dependencies": {
+ "RGB.NET.Core": "0.0.1",
+ "RGB.NET.HID": "0.0.1"
+ },
+ "runtime": {
+ "RGB.NET.Devices.Razer.dll": {}
+ }
+ },
+ "HidSharp/2.1.0": {
+ "runtime": {
+ "lib/netstandard2.0/HidSharp.dll": {
+ "assemblyVersion": "2.1.0.0",
+ "fileVersion": "2.1.0.0"
+ }
+ }
+ },
+ "RGB.NET.Core/0.0.1": {
+ "runtime": {
+ "RGB.NET.Core.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.1.0"
+ }
+ }
+ },
+ "RGB.NET.HID/0.0.1": {
+ "dependencies": {
+ "HidSharp": "2.1.0",
+ "RGB.NET.Core": "0.0.1"
+ },
+ "runtime": {
+ "RGB.NET.HID.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.1.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "RGB.NET.Devices.Razer/0.0.1": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "HidSharp/2.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-UTdxWvbgp2xzT1Ajaa2va+Qi3oNHJPasYmVhbKI2VVdu1VYP6yUG+RikhsHvpD7iM0S8e8UYb5Qm/LTWxx9QAA==",
+ "path": "hidsharp/2.1.0",
+ "hashPath": "hidsharp.2.1.0.nupkg.sha512"
+ },
+ "RGB.NET.Core/0.0.1": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "RGB.NET.HID/0.0.1": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Devices.Razer.dll b/Build Dependencies/RGB.NET/RGB.NET.Devices.Razer.dll
new file mode 100644
index 00000000..68c3f48d
Binary files /dev/null and b/Build Dependencies/RGB.NET/RGB.NET.Devices.Razer.dll differ
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Devices.Razer.xml b/Build Dependencies/RGB.NET/RGB.NET.Devices.Razer.xml
new file mode 100644
index 00000000..8bf4714d
--- /dev/null
+++ b/Build Dependencies/RGB.NET/RGB.NET.Devices.Razer.xml
@@ -0,0 +1,605 @@
+
+
+
+ RGB.NET.Devices.Razer
+
+
+
+
+
+ Represents a razer chroma link.
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The specific information provided by CUE for the chroma link.
+ The update trigger used to update this device.
+
+
+
+
+
+
+ Represents the update-queue performing updates for razer chroma-link devices.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The update trigger used to update this queue.
+
+
+
+
+
+
+
+
+
+ Represents a type of Razer SDK endpoint
+
+
+
+
+ No endpoint
+
+
+
+
+ The keyboard endpoint
+
+
+
+
+ The laptop keyboard endpoint, shares the endpoint but has a different LED layout
+
+
+
+
+ The mouse endpoint
+
+
+
+
+ The headset endpoint
+
+
+
+
+ The mousepad endpoint
+
+
+
+
+ The keypad endpoint
+
+
+
+
+ The Chroma Link endpoint
+
+
+
+
+ All endpoints
+
+
+
+
+ Razer-SDK: Error codes for Chroma SDK. If the error is not defined here, refer to WinError.h from the Windows SDK.
+
+
+
+
+ Razer-SDK: Invalid.
+
+
+
+
+ Razer-SDK: Success.
+
+
+
+
+ Razer-SDK: Access denied.
+
+
+
+
+ Razer-SDK: Invalid handle.
+
+
+
+
+ Razer-SDK: Not supported.
+
+
+
+
+ Razer-SDK: Invalid parameter.
+
+
+
+
+ Razer-SDK: The service has not been started.
+
+
+
+
+ Razer-SDK: Cannot start more than one instance of the specified program.
+
+
+
+
+ Razer-SDK: Device not connected.
+
+
+
+
+ Razer-SDK: Element not found.
+
+
+
+
+ Razer-SDK: Request aborted.
+
+
+
+
+ Razer-SDK: An attempt was made to perform an initialization operation when initialization has already been completed.
+
+
+
+
+ Razer-SDK: Resource not available or disabled.
+
+
+
+
+ Razer-SDK: Device not available or supported.
+
+
+
+
+ Razer-SDK: The group or resource is not in the correct state to perform the requested operation.
+
+
+
+
+ Razer-SDK: No more items.
+
+
+
+
+ Razer-SDK: General failure.
+
+
+
+
+
+ Represents an exception thrown by the Razer-SDK.
+
+
+
+
+ Gets the error code provided by the SDK.
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The error code provided by the SDK.
+
+
+
+ Represents a razer RGB-device.
+
+
+
+
+ Contains mappings for to the matrix location.
+
+
+
+
+ Gets the mapping for keyboards.
+
+
+
+
+ Gets the mapping for Blade keyboards.
+
+
+
+
+ Gets the mapping for mice.
+
+
+ The order of the ids is a bit messed up since the officially documented locations are 1-21 and 22 is know to be used even if it's not documented.
+ 23-63 is there to not run into issues in the future.
+
+
+
+
+ Gets the mapping for mousepads.
+
+
+
+
+ Gets the mapping for headsets.
+
+
+
+
+ Gets the mapping for keypads.
+
+
+
+
+ Gets the mapping for chroma link devices.
+
+
+
+
+
+
+ Represents a generic razer-device. (keyboard, mouse, headset, mousepad).
+
+
+
+
+ Initializes a new instance of the class.
+
+ The generic information provided by razer for the device.
+ The queue used to update this device.
+
+
+
+
+
+
+
+ Represents a generic information for a Razer-.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Gets the Razer SDK endpoint type the is addressed through.
+
+
+
+
+ Internal constructor of managed .
+
+ The type of the .
+ The Razer SDK endpoint type the is addressed through.
+ The model of the .
+
+
+
+ Represents a basic update-queue performing updates for razer devices.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The update trigger used to update this queue.
+
+
+
+
+
+
+ Creates the effect used to update this device.
+
+ The parameters of the effect.
+ The id this effect is created with.
+
+
+
+
+
+
+ Creates the device-specific effect parameters for the led-update.
+
+ The data to be updated.
+ An pointing to the effect parameter struct.
+
+
+
+
+ Represents a razer headset.
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The specific information provided by CUE for the headset.
+ The update trigger used to update this device.
+
+
+
+
+
+
+ Represents the update-queue performing updates for razer headset devices.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The update trigger used to update this queue.
+
+
+
+
+
+
+
+
+
+
+ Represents a razer keyboard.
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The specific information provided by CUE for the keyboard.
+ The update trigger used to update this device.
+ A mapping of leds this device is initialized with.
+
+
+
+
+
+
+ Represents a generic information for a .
+
+
+
+
+
+
+
+
+ Internal constructor of managed .
+
+ The model of the .
+ The Razer SDK endpoint type the is addressed through.
+
+
+
+ Represents the update-queue performing updates for razer keyboard devices.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The update trigger used to update this queue.
+
+
+
+
+
+
+
+
+
+
+ Represents a razer keypad.
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The specific information provided by CUE for the keypad.
+ The update trigger used to update this device.
+
+
+
+
+
+
+ Represents the update-queue performing updates for razer keypad devices.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The update trigger used to update this queue.
+
+
+
+
+
+
+
+
+
+
+ Represents a razer mousepad.
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The specific information provided by CUE for the mousepad.
+ The update trigger used to update this device.
+
+
+
+
+
+
+ Represents the update-queue performing updates for razer mousepad devices.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The update trigger used to update this queue.
+
+
+
+
+
+
+
+
+
+
+ Represents a razer mouse.
+
+
+
+
+
+ Initializes a new instance of the class.
+
+ The specific information provided by CUE for the mouse.
+ The update trigger used to update this device.
+ A mapping of leds this device is initialized with.
+
+
+
+
+
+
+ Represents the update-queue performing updates for razer mouse devices.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The update trigger used to update this queue.
+
+
+
+
+
+
+
+
+
+ Razer-SDK: Device info.
+
+
+
+
+ Razer-SDK: Device types.
+
+
+
+
+ Razer-SDK: Number of devices connected.
+
+
+
+
+ Reloads the SDK.
+
+
+
+
+ Razer-SDK: Initialize Chroma SDK.
+
+
+
+
+ Razer-SDK: UnInitialize Chroma SDK.
+
+
+
+
+ Razer-SDK: Query for device information.
+
+
+
+
+
+ Represents a device provider responsible for razer devices.
+
+
+
+
+ Gets the singleton instance.
+
+
+
+
+ Gets a modifiable list of paths used to find the native SDK-dlls for x86 applications.
+ The first match will be used.
+
+
+
+
+ Gets a modifiable list of paths used to find the native SDK-dlls for x64 applications.
+ The first match will be used.
+
+
+
+
+ Forces to load the devices represented by the emulator even if they aren't reported to exist.
+
+
+
+
+ Gets the HID-definitions for Razer-devices.
+
+
+
+
+ Initializes a new instance of the class.
+
+ Thrown if this constructor is called even if there is already an instance of this class.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Devices.SteelSeries.deps.json b/Build Dependencies/RGB.NET/RGB.NET.Devices.SteelSeries.deps.json
new file mode 100644
index 00000000..dcd0a650
--- /dev/null
+++ b/Build Dependencies/RGB.NET/RGB.NET.Devices.SteelSeries.deps.json
@@ -0,0 +1,72 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v10.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v10.0": {
+ "RGB.NET.Devices.SteelSeries/0.0.1": {
+ "dependencies": {
+ "RGB.NET.Core": "0.0.1",
+ "RGB.NET.HID": "0.0.1"
+ },
+ "runtime": {
+ "RGB.NET.Devices.SteelSeries.dll": {}
+ }
+ },
+ "HidSharp/2.1.0": {
+ "runtime": {
+ "lib/netstandard2.0/HidSharp.dll": {
+ "assemblyVersion": "2.1.0.0",
+ "fileVersion": "2.1.0.0"
+ }
+ }
+ },
+ "RGB.NET.Core/0.0.1": {
+ "runtime": {
+ "RGB.NET.Core.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.1.0"
+ }
+ }
+ },
+ "RGB.NET.HID/0.0.1": {
+ "dependencies": {
+ "HidSharp": "2.1.0",
+ "RGB.NET.Core": "0.0.1"
+ },
+ "runtime": {
+ "RGB.NET.HID.dll": {
+ "assemblyVersion": "0.0.1.0",
+ "fileVersion": "0.0.1.0"
+ }
+ }
+ }
+ }
+ },
+ "libraries": {
+ "RGB.NET.Devices.SteelSeries/0.0.1": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "HidSharp/2.1.0": {
+ "type": "package",
+ "serviceable": true,
+ "sha512": "sha512-UTdxWvbgp2xzT1Ajaa2va+Qi3oNHJPasYmVhbKI2VVdu1VYP6yUG+RikhsHvpD7iM0S8e8UYb5Qm/LTWxx9QAA==",
+ "path": "hidsharp/2.1.0",
+ "hashPath": "hidsharp.2.1.0.nupkg.sha512"
+ },
+ "RGB.NET.Core/0.0.1": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ },
+ "RGB.NET.HID/0.0.1": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Devices.SteelSeries.dll b/Build Dependencies/RGB.NET/RGB.NET.Devices.SteelSeries.dll
new file mode 100644
index 00000000..c42491f9
Binary files /dev/null and b/Build Dependencies/RGB.NET/RGB.NET.Devices.SteelSeries.dll differ
diff --git a/Build Dependencies/RGB.NET/RGB.NET.Devices.SteelSeries.xml b/Build Dependencies/RGB.NET/RGB.NET.Devices.SteelSeries.xml
new file mode 100644
index 00000000..e6ca370d
--- /dev/null
+++ b/Build Dependencies/RGB.NET/RGB.NET.Devices.SteelSeries.xml
@@ -0,0 +1,200 @@
+
+
+
+ RGB.NET.Devices.SteelSeries
+
+
+
+
+ Contains a list of Steel Series LED IDs
+
+
+
+
+ Represents a steelseries RGB-device.
+
+
+
+
+ Contains mappings for to .
+
+
+
+
+ Gets the uk-mapping for keyboards.
+
+
+
+
+ Gets the uk-tkl-mapping for keyboards.
+
+
+
+
+ Gets the uk-notebook-mapping for keyboards.
+
+
+
+
+ Gets the mapping for GE78HX keyboards.
+
+
+
+
+ Gets the mapping for one-zone mice.
+
+
+
+
+ Gets the mapping for two-zone mice.
+
+
+
+
+ Gets the mapping for three-zone mice.
+
+
+
+
+ Gets the mapping for eight-zone mice.
+
+
+
+
+ Gets the mapping for ten-zone mice.
+
+
+
+
+ Gets the mapping for two-zone headsets.
+
+
+
+
+ Gets the mapping for twelve-zone mousepads
+
+
+
+
+ Gets the mapping for two-zone mousepads
+
+
+
+
+ Gets the mapping for 103-zone led strip devices (monitor).
+
+
+
+
+ Gets the mapping for 10-zone kayboard.
+
+
+
+
+ Gets the mapping for 4-zone speakers.
+
+
+
+
+
+ Represents the update-queue performing updates for steelseries devices.
+
+
+
+
+ Initializes a new instance of the class.
+
+ The update trigger used by this queue.
+ The device type used to identify the device.
+
+
+
+
+
+
+
+
+ Represents a SteelSeries-device. (keyboard, mouse, headset, mousepad).
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+
+
+
+
+ Represents a generic information for a SteelSeries-.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Gets the type of this device used in the SDK.
+
+
+
+
+ Internal constructor of managed .
+
+ The type of the .
+ The represented device model.
+ The type of this device used in the SDK.
+
+
+
+
+ Represents a device provider responsible for SteelSeries-devices.
+
+
+
+
+ Gets the singleton instance.
+
+
+
+
+ Gets the HID-definitions for SteelSeries-devices.
+
+
+
+
+ Initializes a new instance of the class.
+
+ Thrown if this constructor is called even if there is already an instance of this class.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c85beb23..9b943eab 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,34 @@
All notable changes to Chromatics are documented here.
+## 4.2.54
+
+- Fixed an issue which prevented Corsair and OpenRGB RGB.NET device providers from starting.
+- Fixed an error that could appear when Chromatics auto-checked for updates while minimized to the tray.
+- Minor fixes and improvements.
+
+## 4.2.50
+
+- **New:** Windows Dynamic Lighting support. This is currently in beta.
+- **New:** Yeelight device support. This is currently in beta.
+- **New:** Alienware LightFX device support. This is currently in beta.
+- **New:** Layers can now be copied between devices. A new copy icon next to the device brightness button on the **Mappings** tab opens a dialog that duplicates every layer from one device onto another.
+- Hue, LIFX and Yeelight have been added to the first-run wizard, each with their own discovery flow.
+- PlayStation, Hue and LIFX devices are no longer classed as beta.
+- Multi-zone keyboards now show assignable keys for each zone instead of using the full keyboard grid intended for per-key LED layouts.
+- Updated RGB.NET device providers for Razer, Logitech, SteelSeries, Corsair and OpenRGB.
+- Chromatics is now officially code-signed for additional installer security.
+- Increased the minimum Windows target to Windows 10 version 1809, build 17763.
+- Fixed an issue that prevented Vegas Mode from starting in The Gold Saucer.
+- Fixed an issue that could cause the title screen animation to play when loading between zones.
+- Fixed an issue where console lines copied to the clipboard could be lost when Chromatics closed.
+- Minor fixes and improvements.
+
+## 4.1.44
+
+- **New:** QMK Raw HID keyboard support (Beta). Covers custom keyboards from NovelKeys, KBDFans, Drop, GMMK, Glorious, and any other brand running QMK firmware with Raw HID enabled. Enable it from Settings → Device Providers or pick it on the first-run device selector. Chromatics auto-detects compatible boards over USB and adopts them with no firmware flashing or extra software required. The provider drives per-key lighting through the OpenRGB-QMK plugin when the firmware has it installed; otherwise it controls the firmware's built-in RGB matrix base colour and effect mode via VIA. A pre-built key layout database covering 2650 QMK boards ships with Chromatics, so the Highlight and Keybind layers map to the correct physical keys without manual setup.
+- Updated dependency libraries to latest version
+
## 4.1.38
- Added Auto-discovery for Hue bridges.
diff --git a/Chromatics.DecoratorHarnessUI/Chromatics.DecoratorHarnessUI.csproj b/Chromatics.DecoratorHarnessUI/Chromatics.DecoratorHarnessUI.csproj
index 61239982..8f64e462 100644
--- a/Chromatics.DecoratorHarnessUI/Chromatics.DecoratorHarnessUI.csproj
+++ b/Chromatics.DecoratorHarnessUI/Chromatics.DecoratorHarnessUI.csproj
@@ -2,7 +2,7 @@
WinExe
- net10.0-windows7.0
+ net10.0-windows10.0.19041.0
enable
enable
True
@@ -16,11 +16,62 @@
-
-
-
-
+
+
+ ..\Build Dependencies\RGB.NET\RGB.NET.Core.dll
+ True
+
+
+ ..\Build Dependencies\RGB.NET\RGB.NET.Devices.Logitech.dll
+ True
+
+
+ ..\Build Dependencies\RGB.NET\RGB.NET.Devices.Razer.dll
+ True
+
+
+ ..\Build Dependencies\RGB.NET\RGB.NET.Devices.SteelSeries.dll
+ True
+
+
+ ..\Build Dependencies\RGB.NET\RGB.NET.Devices.OpenRGB.dll
+ True
+
+
+ ..\Build Dependencies\RGB.NET\RGB.NET.Devices.PlayStation.dll
+ True
+
+
+
+
+
+
+
+
+
+
+
+ <_NativeSdkDlls Include="$(MSBuildThisFileDirectory)..\Chromatics\bin\$(Configuration)\$(TargetFramework)\x64\*.dll" />
+ <_NativeSdkDllsX86 Include="$(MSBuildThisFileDirectory)..\Chromatics\bin\$(Configuration)\$(TargetFramework)\x86\*.dll" />
+
+
+
+
+
diff --git a/Chromatics.DecoratorHarnessUI/MainViewModel.cs b/Chromatics.DecoratorHarnessUI/MainViewModel.cs
index 3cb740a0..817d61da 100644
--- a/Chromatics.DecoratorHarnessUI/MainViewModel.cs
+++ b/Chromatics.DecoratorHarnessUI/MainViewModel.cs
@@ -7,7 +7,7 @@
using Chromatics.Extensions.RGB.NET.Decorators;
using Chromatics.Extensions.RGB.NET.Devices;
using Chromatics.Extensions.RGB.NET.Devices.LIFX;
-using Chromatics.Extensions.RGB.NET.Devices.PlayStation;
+using RGB.NET.Devices.PlayStation;
using RGB.NET.Core;
using RGB.NET.Presets.Decorators;
using RGB.NET.Presets.Textures;
@@ -76,7 +76,7 @@ public record ProviderItem(string Name, Func Factory);
new("Wooting", () => WootingDeviceProvider.Instance),
new("Novation", () => NovationDeviceProvider.Instance),
new("OpenRGB", () => OpenRGBDeviceProvider.Instance),
- new("PlayStation", () => PlayStationControllerRGBDeviceProvider.Instance),
+ new("PlayStation", () => PlayStationDeviceProvider.Instance),
new("LIFX", () => LifxRGBDeviceProvider.Instance),
];
@@ -101,6 +101,32 @@ private async Task LoadProvider()
{
var provider = SelectedProvider.Factory();
+ // Native-DLL providers (Logitech, Corsair, etc.) resolve their
+ // PossibleX64NativePaths entries against the current working
+ // directory, which is the workspace root when the harness
+ // launches from VS or `dotnet run` — not the harness's own bin
+ // folder where the DLLs actually sit. Pre-pend an absolute path
+ // computed from the harness assembly location so the SDK loader
+ // finds the wrapper without the user juggling cwd. Mirrors what
+ // the main app does for Corsair in RGBController.Setup.
+ string asmDir = System.IO.Path.GetDirectoryName(
+ System.Reflection.Assembly.GetExecutingAssembly().Location) ?? "";
+ if (!string.IsNullOrEmpty(asmDir))
+ {
+ if (provider is LogitechDeviceProvider)
+ {
+ LogitechDeviceProvider.PossibleX64NativePaths.Insert(
+ 0, System.IO.Path.Combine(asmDir, "x64", "LogitechLedEnginesWrapper.dll"));
+ LogitechDeviceProvider.PossibleX86NativePaths.Insert(
+ 0, System.IO.Path.Combine(asmDir, "x86", "LogitechLedEnginesWrapper.dll"));
+ }
+ else if (provider is CorsairDeviceProvider)
+ {
+ CorsairDeviceProvider.PossibleX64NativePaths.Insert(
+ 0, System.IO.Path.Combine(asmDir, "x64", "CUESDK.dll"));
+ }
+ }
+
// LIFX is the only provider in the harness that needs an
// adoption gate — the LAN protocol has no concept of "all
// devices on the segment", so the user has to pick which
@@ -137,20 +163,60 @@ private async Task LoadProvider()
}
}
- provider.Initialize(throwExceptions: false);
- _surface.Load(provider);
- _loadedProvider = provider;
-
- Devices.Clear();
- foreach (var d in _surface.Devices)
- Devices.Add(new DeviceItem(d.DeviceInfo.DeviceName, d.DeviceInfo.DeviceType.ToString(), d));
-
- StartSurfaceTick();
- ProviderLoaded = true;
- ProviderStatus = $"{Devices.Count} device(s) loaded";
- // Now that the surface has devices, evaluate the WASD highlight
- // hook so the toggle works even before the user starts an effect.
- RefreshWasdOverlay();
+ // Capture provider-side exceptions before we try to Initialize so
+ // the harness surfaces them in the status panel rather than
+ // silently coming up with zero devices. RGB.NET reports SDK
+ // failures (missing native DLL, vendor service not running,
+ // exclusive-mode conflict) through this event and would
+ // otherwise drop them on the floor when throwExceptions:false.
+ var providerErrors = new System.Text.StringBuilder();
+ void OnProviderException(object? s, ExceptionEventArgs e)
+ => providerErrors.AppendLine(e.Exception?.Message ?? e.Exception?.GetType().Name ?? "(null)");
+ provider.Exception += OnProviderException;
+
+ try
+ {
+ provider.Initialize(throwExceptions: false);
+ _surface.Load(provider);
+ _loadedProvider = provider;
+
+ // Same Logitech-layout fixup the main app applies in
+ // RGBController.DevicesChanged.Added — rebinds Led.Location
+ // for Logitech keyboards/mice so position-aware decorators
+ // (conical gradients in particular) render correctly. RGB.NET's
+ // LogitechPerKeyRGBDevice ships every LED at Y=0 by default.
+ string asmDirForLayout = System.IO.Path.GetDirectoryName(
+ System.Reflection.Assembly.GetExecutingAssembly().Location) ?? "";
+ foreach (var d in _surface.Devices)
+ Chromatics.Helpers.LogitechLayoutFixup.Apply(d, asmDirForLayout);
+
+ Devices.Clear();
+ foreach (var d in _surface.Devices)
+ Devices.Add(new DeviceItem(d.DeviceInfo.DeviceName, d.DeviceInfo.DeviceType.ToString(), d));
+
+ StartSurfaceTick();
+ ProviderLoaded = true;
+
+ if (Devices.Count > 0)
+ {
+ ProviderStatus = $"{Devices.Count} device(s) loaded";
+ }
+ else if (providerErrors.Length > 0)
+ {
+ ProviderStatus = $"0 devices. SDK said: {providerErrors.ToString().Trim()}";
+ }
+ else
+ {
+ ProviderStatus = "0 devices. SDK initialized but enumerated nothing — vendor service may not be running, or no supported hardware connected.";
+ }
+ // Now that the surface has devices, evaluate the WASD highlight
+ // hook so the toggle works even before the user starts an effect.
+ RefreshWasdOverlay();
+ }
+ finally
+ {
+ provider.Exception -= OnProviderException;
+ }
}
catch (Exception ex)
{
@@ -170,18 +236,18 @@ private async Task LoadProvider()
"Chromatics.DecoratorHarnessUI",
"lifx-adopted.json");
- private static List LoadHarnessLifxAdoptions()
+ private static List LoadHarnessLifxAdoptions()
{
try
{
if (!System.IO.File.Exists(LifxAdoptionsPath)) return new();
var json = System.IO.File.ReadAllText(LifxAdoptionsPath);
- return System.Text.Json.JsonSerializer.Deserialize>(json) ?? new();
+ return System.Text.Json.JsonSerializer.Deserialize>(json) ?? new();
}
catch { return new(); }
}
- private static void SaveHarnessLifxAdoptions(IEnumerable adoptions)
+ private static void SaveHarnessLifxAdoptions(IEnumerable adoptions)
{
try
{
@@ -2247,5 +2313,13 @@ public void Dispose()
_surfaceTimer?.Stop();
_surfaceTimer?.Dispose();
try { _surface.Dispose(); } catch { }
+
+ // Provider disposal stops the per-provider UpdateTrigger threads.
+ // Each provider's trigger is a Task.Factory.StartNew(... LongRunning ...)
+ // which spawns a foreground thread, and surface.Dispose only kills
+ // triggers explicitly registered via RegisterUpdateTrigger — not the
+ // providers' internal ones. Without this, the harness window closes
+ // but the process hangs around forever.
+ try { _loadedProvider?.Dispose(); } catch { }
}
}
diff --git a/Chromatics.Tests/Chromatics.Tests.csproj b/Chromatics.Tests/Chromatics.Tests.csproj
index 9e438fe2..0c3c3a56 100644
--- a/Chromatics.Tests/Chromatics.Tests.csproj
+++ b/Chromatics.Tests/Chromatics.Tests.csproj
@@ -1,7 +1,7 @@
- net10.0-windows7.0
+ net10.0-windows10.0.19041.0
enable
enable
@@ -11,7 +11,7 @@
-
+
@@ -26,7 +26,19 @@
-
+
+
+ ..\Build Dependencies\RGB.NET\RGB.NET.Core.dll
+ True
+
+
+
+
+
diff --git a/Chromatics/App.axaml b/Chromatics/App.axaml
index 777c84db..52c4d1a0 100644
--- a/Chromatics/App.axaml
+++ b/Chromatics/App.axaml
@@ -91,6 +91,18 @@
+
+