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 @@ + +