Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
45755c3
Phase 1: Migrate from Spring Boot to Quarkus
Copilot Apr 3, 2026
48ae3f8
fix: make AppEvents.instance volatile for thread visibility
Copilot Apr 3, 2026
66ebb1b
Migrate from Spring to Quarkus CDI
Copilot Apr 3, 2026
7160bb9
Quarkus migration: pom.xml, CDI sweep, platform producer, Angular sca…
Copilot Apr 3, 2026
3b4ba05
WIP: Quarkus migration - fix Spring/JavaFX dependencies, Log4j2, Over…
Copilot Apr 3, 2026
5765af2
WIP: Fix enable-preview/lombok conflict, convert pattern switches, fi…
Copilot Apr 3, 2026
8d3109b
Fix log4j2 dependency: replace quarkus-logging-log4j2 with log4j-api …
Copilot Apr 3, 2026
ad76d8e
Fix compilation errors: constructors, accessors, logging, missing met…
Copilot Apr 3, 2026
e44e396
Fix final 4 compilation errors: iconHandlers inject, TriFunction retu…
Copilot Apr 3, 2026
7620e3b
Fix DeviceMqttTopicHelper constructor and ColorType.getName() → name()
Copilot Apr 3, 2026
526433d
Add REST API layer and Angular frontend (Quinoa) for Quarkus migration
Copilot Apr 3, 2026
aeff1f9
Upgrade Angular runtime packages from 18.2.14 to 19.2.20 to fix XSS/X…
Copilot Apr 3, 2026
00a1d80
Add PLAN.md (full migration plan) and CONTEXT.md (current status and …
Copilot Apr 3, 2026
c3f5350
Make tests compile. Add instructions for the agent. Update Quarkus an…
Apr 3, 2026
ddc99ab
Phase 4: remove dead closeDialogs/showLightingConfigToUI methods from…
Copilot Apr 3, 2026
b69bf8d
Phase 5: add ProcessResource (/api/processes) and IconResource (/api/…
Copilot Apr 3, 2026
54e0a76
Phase 6: add CommandConfigComponent, AudioPickerComponent, DialParams…
Copilot Apr 3, 2026
d5b3072
Phase 7: GraalVM native image hints + fix CodeQL path-injection and t…
Copilot Apr 3, 2026
78dced7
Phase 8: GitHub Actions native image workflow + Java version decision…
Copilot Apr 3, 2026
f3edf42
Phase 9: OBS WebSocket 5 client + Java 25 CI upgrade
Copilot Apr 3, 2026
f271c7c
Migrate to Java 25 everywhere + fix workflow action versions
Copilot Apr 3, 2026
c2c3bc8
feat: upgrade Angular 19→21, extract inline templates, add charcoal/a…
Copilot Apr 3, 2026
91ac9d8
Migrate Angular frontend to Angular Material (partial - all TS/HTML/S…
Copilot Apr 3, 2026
b912ac5
Complete Angular Material migration - all components migrated, build …
Copilot Apr 3, 2026
c8d9b78
Fix device visuals: Pro knobs+sliders, live value tracking, brightnes…
Copilot Apr 4, 2026
83c56a8
Replace CSS device widgets with proper SVG components based on JavaFX…
Copilot Apr 4, 2026
6a9eab8
Fix path injection in IconResource: restrict to known-safe file exten…
Copilot Apr 4, 2026
e59ff00
Make the software run again on Windows
Apr 3, 2026
8f7691c
Save-state will be restored correctly on startup
Apr 4, 2026
63cdbbe
Attempting to fix the Windows native build
Apr 4, 2026
f3d70a2
Fix native image build: add WaveLink classes to reflection, jnativeho…
Copilot Apr 4, 2026
dbcdfd4
Revert workflow branch trigger (keep workflow_dispatch for manual tes…
Copilot Apr 4, 2026
a6f7cd2
Migrate Angular to zoneless + signals + new control flow; update CONT…
Copilot Apr 4, 2026
193b3da
Trying to get the native executable to start
Apr 6, 2026
8ac9719
Trying to get the native executable to start
Apr 6, 2026
15da35c
More fix attempts
Apr 6, 2026
1a74743
Fix native build for Linux
Apr 18, 2026
76467f6
Cleaner shutdown
Apr 18, 2026
f03d8df
Build seems to run
Apr 7, 2026
b57dd99
Trying to make the front-end more modern
Apr 23, 2026
04662f8
Setup setting commands
Apr 24, 2026
f744bf7
Add/remove commands
Apr 25, 2026
7566eba
Dial params
Apr 25, 2026
81e5e36
Split pcpanel stuff and start building the saving of controls
Apr 25, 2026
71a0867
Save commands
Apr 25, 2026
50805ec
Start editing lights
Apr 25, 2026
6015dc1
Fix wavelink commands
Apr 26, 2026
63f4b73
Cleanup stray files
Apr 26, 2026
f41a4ee
Attempt to get the overlay working in the native build
Apr 27, 2026
c37c198
More native build
Apr 28, 2026
93e72e5
Even more native build changes
May 1, 2026
305c917
Only include needed beans in build (needs to be tested for Windows)
May 3, 2026
b4875c6
Keep track of focus volumes
May 3, 2026
bc1fbf8
Even more native build
May 8, 2026
5e5063c
Control wavelink when wavelink-controlled app is focus-controlled
May 8, 2026
0f7d7d0
Fix hot-reloading
May 9, 2026
f19260a
Real-time update knob-settings
May 9, 2026
69e0400
Vertical tabs for dial/slider configuration
May 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
90 changes: 39 additions & 51 deletions .github/workflows/maven-build-installer-windows.yml
Original file line number Diff line number Diff line change
@@ -1,68 +1,61 @@
# This workflow will build a Java project with Maven
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
# Build native executables with GraalVM and publish a pre-release
# Replaces the old Spring Boot/JavaFX MSI pipeline now that the app is a Quarkus native image.

name: Build Windows Installer
name: Build Native Image
env:
JAVA_VERSION: 25
JAVA_VERSION: '25' # GraalVM CE 25 — Java 25 source/target and runtime; Quarkus 3.34.1 supports Java 25

on:
push:
branches:
- main
- releases/**
workflow_dispatch:

jobs:
buildWindows:
runs-on: windows-latest
steps:
- name: Download Wix
uses: i3h/download-release-asset@v1
with:
owner: wixtoolset
repo: wix3
tag: wix3112rtm
file: wix311-binaries.zip
token: ${{ secrets.GITHUB_TOKEN }}
- name: Decompress Wix
run: 7z x wix311-binaries.zip "-o./target/wix"
- name: Add Wix to Path
run: echo "$HOME/target/wix" >> $GITHUB_PATH
- uses: actions/checkout@v6
- name: Set up JDK
uses: actions/setup-java@v5
- uses: actions/checkout@v4

- name: Set up GraalVM CE
uses: graalvm/setup-graalvm@v1
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: 'liberica'
java-package: jdk+fx
distribution: 'graalvm-community'
native-image-job-reports: 'true'
cache: 'maven'
- name: Build with Maven
run: mvn -B clean install --file pom.xml

- name: Build native image (Windows)
run: mvn -B package -Pnative --file pom.xml

- name: Store artifact
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v4
with:
name: windows-installer
path: ./target/*.msi
name: windows-native
path: ./target/*-runner.exe

buildLinux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up JDK
uses: actions/setup-java@v5
- uses: actions/checkout@v4

- name: Set up GraalVM CE
uses: graalvm/setup-graalvm@v1
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: 'liberica'
java-package: jdk+fx
distribution: 'graalvm-community'
native-image-job-reports: 'true'
cache: 'maven'
- name: Build with Maven
run: mvn -B clean install --file pom.xml

- name: Build native image (Linux)
run: mvn -B package -Pnative --file pom.xml

- name: Store artifact
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v4
with:
name: linux-installer
path: |
./target/*.deb
./target/*.jar
name: linux-native
path: ./target/*-runner

preRelease:
name: Pre-release
Expand All @@ -71,30 +64,27 @@ jobs:
- buildLinux
runs-on: ubuntu-latest
steps:
# Check out current repository
- name: Fetch Sources
uses: actions/checkout@v6
uses: actions/checkout@v4

- name: Extract Maven project version
run: echo "version=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)" >> $GITHUB_OUTPUT
id: project

- name: Compute tag name
# Compute a branch-specific, filesystem-friendly tag name and export to job env
run: |
# Strip refs/heads/ prefix and replace non-alphanumeric characters with '-'
branch="${GITHUB_REF#refs/heads/}"
safe_branch=$(echo "$branch" | sed 's/[^A-Za-z0-9._-]/-/g')
echo "TAG_NAME=latest-windows-$safe_branch" >> $GITHUB_ENV
echo "TAG_NAME=latest-$safe_branch" >> $GITHUB_ENV

# Remove old pre-releases
- name: Remove Old Pre-release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh api repos/{owner}/{repo}/releases \
--jq '.[] | select(.prerelease == true) | .id' \
| xargs -I '{}' gh api -X DELETE repos/{owner}/{repo}/releases/{}

- name: Remove previous tag
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Expand All @@ -106,7 +96,6 @@ jobs:
echo "Tag $TAG_NAME does not exist; skipping delete"
fi

# Create new pre-release
- name: Create Pre-release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Expand All @@ -117,17 +106,16 @@ jobs:
--title "v${{ steps.project.outputs.version }} Pre-Release (${{ env.GITHUB_RUN_NUMBER }})" \
--notes "$(sed '/##/Q' CHANGELOG.md)"

# Only now download the artifacts so that there is a delay between creating the pre-release and adding the artifacts
- uses: actions/download-artifact@v7
- uses: actions/download-artifact@v4
with:
name: windows-installer
name: windows-native
path: target
- uses: actions/download-artifact@v7

- uses: actions/download-artifact@v4
with:
name: linux-installer
name: linux-native
path: target

# Upload artifact as a release asset
- name: Upload Release Asset
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,4 @@ target/
# Application files
/SndCtrl.dll
/src/main/resources/application-default.properties
/.idea/JunieProjectTechnologies.xml
10 changes: 8 additions & 2 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions .mvn/jvm.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED
--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED
--add-opens=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
--add-opens=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED
--add-opens=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED
--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED
--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
--add-opens=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
--add-opens=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED
7 changes: 7 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,10 @@ The SndCtrlTest project is there because Access Violations within JNI just close
Running it with the Test code might actually show the error.

An `EnableFullDump.reg` registry file is included to enable full dumps when the application crashes. This can be used to debug the native code.

## Native build stuff

```shell
java.exe -agentlib:native-image-agent=config-output-dir=native-image
-jar target/pcpanel-1.8-SNAPSHOT-native-image-source-jar/pcpanel-1.8-SNAPSHOT-runner.jar
```
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,13 @@ manually copy the settings file:
to
`%userprofile%\.pcpanel\profiles.json`

# Generate reachability metadata

```shell
mvn test "-DargLine=-agentlib:native-image-agent=config-output-dir=src/main/resources/META-INF/native-image/ -Djava.awt.headless=false"
mvn test "-DargLine=-Dnative -Dquarkus.native.agent-configuration-apply" -Dnative -Dquarkus.native.agent-configuration-apply
```


---
Build template from [wiverson](https://github.com/wiverson/maven-jpackage-template)
154 changes: 154 additions & 0 deletions generate-native-configs.cmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
@echo off
setlocal enabledelayedexpansion

:: ============================================================================
:: generate-native-configs.cmd
::
:: Runs the native-image coverage tests under the GraalVM tracing agent and
:: merges the resulting JSON config files into the project's hand-maintained
:: native-image directory so they can be committed alongside source code.
::
:: Prerequisites
:: -------------
:: * GraalVM JDK installed and GRAALVM_HOME set (or JAVA_HOME pointing to it)
:: * Maven wrapper (mvnw.cmd) present at the project root
:: * SndCtrl.dll available on PATH or in target/ (for the JNI tests)
::
:: Usage
:: -----
:: generate-native-configs.cmd
::
:: Output
:: ------
:: Generated JSON files are written to:
:: target\native-agent-output\
::
:: Then MERGED into (existing entries preserved, new ones appended):
:: src\main\resources\META-INF\native-image\com.getpcpanel\pcpanel\
:: ============================================================================

:: ── Locate project root (directory that contains this script) ────────────────
set "PROJECT_ROOT=%~dp0"
if "%PROJECT_ROOT:~-1%" == "\" set "PROJECT_ROOT=%PROJECT_ROOT:~0,-1%"

:: ── Resolve GraalVM home ─────────────────────────────────────────────────────
if not defined GRAALVM_HOME (
if defined JAVA_HOME (
set "GRAALVM_HOME=%JAVA_HOME%"
echo INFO: GRAALVM_HOME not set; falling back to JAVA_HOME=%JAVA_HOME%
) else (
echo ERROR: Neither GRAALVM_HOME nor JAVA_HOME is set.
echo Install GraalVM and set GRAALVM_HOME, or set JAVA_HOME to the GraalVM JDK.
exit /b 1
)
)

:: Ensure Maven uses the GraalVM JDK (not whatever JAVA_HOME the shell inherited)
set "JAVA_HOME=%GRAALVM_HOME%"
set "PATH=%JAVA_HOME%\bin;%PATH%"

:: Verify the tracing agent JAR / native-image-agent library is available
if not exist "%GRAALVM_HOME%\lib\svm\bin\native-image.cmd" (
if not exist "%GRAALVM_HOME%\bin\native-image.cmd" (
echo WARNING: native-image executable not found under GRAALVM_HOME=%GRAALVM_HOME%
echo Make sure GraalVM Native Image component is installed:
echo gu install native-image
echo Continuing anyway – the agent JVM flag may still work.
)
)

:: ── Paths ────────────────────────────────────────────────────────────────────
set "AGENT_OUTPUT_DIR=%PROJECT_ROOT%\target\native-agent-output"
set "CONFIG_DEST=%PROJECT_ROOT%\src\main\resources\META-INF\native-image\com.getpcpanel\pcpanel"
set "MVNW=%PROJECT_ROOT%\mvnw.cmd"

:: ── Clean previous agent output ──────────────────────────────────────────────
echo.
echo [1/4] Cleaning previous agent output directory...
if exist "%AGENT_OUTPUT_DIR%" (
rmdir /s /q "%AGENT_OUTPUT_DIR%"
)
mkdir "%AGENT_OUTPUT_DIR%"

:: ── Compile the project (tests + main) ──────────────────────────────────────
echo.
echo [2/4] Compiling project (test-compile)...
call "%MVNW%" test-compile -q
if %ERRORLEVEL% neq 0 (
echo ERROR: Compilation failed. Fix build errors before regenerating configs.
exit /b %ERRORLEVEL%
)

:: ── Run coverage tests with tracing agent ────────────────────────────────────
echo.
echo [3/4] Running native-image coverage tests with tracing agent...
echo Agent output : %AGENT_OUTPUT_DIR%
echo Tests : SndCtrlNativeConfigTest, VolumeOverlayNativeTest
echo.

:: -Dtest selects only the four coverage tests so unrelated tests don't pollute
:: the config. maven.test.failure.ignore=true lets the script continue even if
:: a test fails (e.g. on a headless CI machine without a display).
call "%MVNW%" test "-DargLine=-agentlib:native-image-agent=config-output-dir=%AGENT_OUTPUT_DIR% -Djava.awt.headless=false"

echo.
echo [3/4] Tests finished (failures are non-fatal for config generation).

:: ── Merge generated files into the hand-maintained config directory ───────────
echo.
echo [4/4] Merging generated configs into %CONFIG_DEST%
echo.

if not exist "%CONFIG_DEST%" mkdir "%CONFIG_DEST%"

set FILES_UPDATED=0

:: GraalVM 23+ generates a unified reachability-metadata.json that replaces all of the
:: old individual files (jni-config.json, reflect-config.json, proxy-config.json, etc.).
::
:: The following files are intentionally hand-maintained and must NOT be overwritten:
:: jni-config.json -- 4 project classes SndCtrl.dll calls back into via JNI (C->Java).
:: Cannot be auto-generated because unit tests never load the native DLL.
:: proxy-config.json -- JNA dynamic proxy interfaces (Shell32Extra, VoicemeeterInstance, …).
:: Cannot be auto-generated without loading the native libraries.
::
:: Only reachability-metadata.json (and future agent-only files) are copied here.

call "%MVNW%" verify "-DargLine=-Dnative -Dquarkus.native.agent-configuration-apply" -Dnative -Dquarkus.native.agent-configuration-apply


@REM for %%F in (reachability-metadata.json) do (
@REM if exist "%AGENT_OUTPUT_DIR%\%%F" (
@REM copy /y "%AGENT_OUTPUT_DIR%\%%F" "%CONFIG_DEST%\%%F" > nul
@REM echo Updated : %%F
@REM set /a FILES_UPDATED=FILES_UPDATED+1
@REM ) else (
@REM echo Skipped : %%F ^(not generated^)
@REM )
@REM )

:: ── Summary ──────────────────────────────────────────────────────────────────
echo.
if %FILES_UPDATED% gtr 0 (
echo SUCCESS: %FILES_UPDATED% config file^(s^) updated.
echo.
echo Next steps:
echo 1. Review the changes in %CONFIG_DEST%
echo 2. Diff against the previous version to understand what changed
echo 3. Remove spurious entries captured from test infrastructure
echo ^(look for class names ending in Test, or JUnit internals^)
echo 4. Commit the updated files
) else (
echo WARNING: No config files were generated.
echo Check that:
echo * The tests compiled and ran ^(see target\surefire-reports\^)
echo * GRAALVM_HOME points to a GraalVM JDK ^(not a regular JDK^)
echo * The native-image-agent is installed: gu install native-image
)

echo.
echo Raw agent output is preserved in:
echo %AGENT_OUTPUT_DIR%
echo.

endlocal
Binary file added org/hid4java/HidDevice.class
Binary file not shown.
Loading