From 93193ef2b68cd08070b3c9f3ca98f45964a7c554 Mon Sep 17 00:00:00 2001 From: Moon Date: Mon, 20 Jul 2026 14:10:54 -0700 Subject: [PATCH 1/6] un-revert file permissions fix (#1552) --- app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6acfc49bb..d50675922 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -440,7 +440,6 @@ tasks.register("includeJavaMode") { from(java.configurations.runtimeClasspath) into(composeResources("modes/java/mode")) duplicatesStrategy = DuplicatesStrategy.EXCLUDE - dirPermissions { unix("rwx------") } } val enableWebGPU = findProperty("enableWebGPU")?.toString()?.toBoolean() ?: false @@ -453,6 +452,7 @@ tasks.register("includeJdk") { from(jdkHome) destinationDir = composeResources("jdk").get().asFile + dirPermissions { unix("rwx------") } fileTree(destinationDir).files.forEach { file -> file.setWritable(true, false) file.setReadable(true, false) From c83c84a464aabb78dfe3ef936cf16042e8fd646f Mon Sep 17 00:00:00 2001 From: Jim Date: Fri, 31 Jul 2026 13:07:05 -0400 Subject: [PATCH 2/6] fix #1520 (#1557) --- core/src/processing/opengl/PGraphicsOpenGL.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index 88164f43e..b00fa43f9 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -5512,8 +5512,11 @@ protected void setImpl(PImage sourceImage, int targetX, int targetY) { updatePixelSize(); - // Copies the pixels + // make sure pixel arrays are available loadPixels(); + sourceImage.loadPixels(); + + // Copies the pixels int sourceOffset = sourceY * sourceImage.pixelWidth + sourceX; int targetOffset = targetY * pixelWidth + targetX; for (int y = sourceY; y < sourceY + sourceHeight; y++) { From 3a43b70b47082e7585e435b16fd821172aa793e4 Mon Sep 17 00:00:00 2001 From: Moon Date: Sun, 2 Aug 2026 10:48:02 -0400 Subject: [PATCH 3/6] replaying neobrain: Use lazy evaluation for dependencies of the zipDistributable task (#1555) --- app/build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d50675922..01938a187 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -369,12 +369,12 @@ tasks.register("zipDistributable"){ dependsOn("createDistributable", "setExecutablePermissions") group = "compose desktop" - val dir = distributable().destinationDir.get() - val packageName = distributable().packageName.get() + val dir = provider { distributable().destinationDir.get() } + val packageName = provider { distributable().packageName.get() } from(dir){ eachFile{ permissions{ unix("755") } } } archiveBaseName.set(packageName) - destinationDirectory.set(dir.file("../").asFile) + destinationDirectory.set(layout.dir(provider { dir.get().file("../").asFile})) } afterEvaluate{ From 8b13be8c06616632c65df6e70c219c51f648aecf Mon Sep 17 00:00:00 2001 From: Moon Date: Mon, 3 Aug 2026 09:41:51 -0400 Subject: [PATCH 4/6] release candidate process for before full-release (#1558) --- .github/workflows/release.yml | 76 +++++++++++++++++++++++++++-------- 1 file changed, 59 insertions(+), 17 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3a7d26625..04a498569 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,19 +10,39 @@ jobs: outputs: revision: ${{ steps.tag_info.outputs.revision }} version: ${{ steps.tag_info.outputs.version }} + is_prerelease: ${{ steps.tag_info.outputs.is_prerelease }} + asset_version: ${{ steps.tag_info.outputs.asset_version }} + release_title: ${{ steps.tag_info.outputs.release_title }} steps: - name: Extract version and revision id: tag_info shell: bash run: | + # Tags are shaped processing--[-rc]. + # A trailing -rc marks a release candidate (a public GitHub + # prerelease); without it the tag is a final release. TAG_NAME="${GITHUB_REF#refs/tags/}" REVISION=$(echo "$TAG_NAME" | cut -d'-' -f2) VERSION=$(echo "$TAG_NAME" | cut -d'-' -f3) + RC=$(echo "$TAG_NAME" | cut -d'-' -f4) # Set outputs for use in later jobs or steps echo "revision=$REVISION" >> $GITHUB_OUTPUT echo "version=$VERSION" >> $GITHUB_OUTPUT + # The packaged version stays numeric (installer formats require it); + # the RC marker only rides along in the release title and asset names. + if [ -n "$RC" ]; then + RC_UPPER=$(echo "$RC" | tr '[:lower:]' '[:upper:]') + echo "is_prerelease=true" >> $GITHUB_OUTPUT + echo "asset_version=${VERSION}-${RC}" >> $GITHUB_OUTPUT + echo "release_title=Processing ${VERSION} ${RC_UPPER}" >> $GITHUB_OUTPUT + else + echo "is_prerelease=false" >> $GITHUB_OUTPUT + echo "asset_version=${VERSION}" >> $GITHUB_OUTPUT + echo "release_title=Processing ${VERSION}" >> $GITHUB_OUTPUT + fi + create-draft: name: Create draft release runs-on: ubuntu-latest @@ -33,7 +53,7 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_REPO: ${{ github.repository }} TAG: ${{ github.ref_name }} - VERSION: ${{ needs.version.outputs.version }} + TITLE: ${{ needs.version.outputs.release_title }} steps: - name: Create draft release run: | @@ -42,7 +62,7 @@ jobs: else gh release create "$TAG" \ --draft \ - --title "Processing $VERSION" \ + --title "$TITLE" \ --generate-notes fi @@ -69,21 +89,23 @@ jobs: run: npm run zip - name: Stage reference asset env: - VERSION: ${{ needs.version.outputs.version }} + ASSET_VERSION: ${{ needs.version.outputs.asset_version }} run: | mkdir -p release-assets - cp reference.zip "release-assets/processing-${VERSION}-reference.zip" + cp reference.zip "release-assets/processing-${ASSET_VERSION}-reference.zip" - name: Upload reference to release uses: softprops/action-gh-release@v2 with: draft: true tag_name: ${{ github.ref_name }} - files: release-assets/processing-${{ needs.version.outputs.version }}-reference.zip + files: release-assets/processing-${{ needs.version.outputs.asset_version }}-reference.zip publish-maven: name: Publish Processing Libraries to Maven Central runs-on: ubuntu-latest needs: [version, release-windows, release-macos, release-linux] + # Release candidates must not notify Maven Central. + if: ${{ needs.version.outputs.is_prerelease != 'true' }} steps: - name: Checkout Repository uses: actions/checkout@v4 @@ -110,6 +132,8 @@ jobs: name: Publish Processing Plugins to Gradle Plugin Portal runs-on: ubuntu-latest needs: [version, release-windows, release-macos, release-linux] + # Release candidates must not notify the Gradle Plugin Portal. + if: ${{ needs.version.outputs.is_prerelease != 'true' }} steps: - name: Checkout Repository uses: actions/checkout@v4 @@ -189,11 +213,12 @@ jobs: shell: bash env: VERSION: ${{ needs.version.outputs.version }} + ASSET_VERSION: ${{ needs.version.outputs.asset_version }} ARCH: ${{ matrix.arch }} run: | mkdir -p release-assets - cp "app/build/compose/binaries/main/Processing-${VERSION}.zip" "release-assets/processing-${VERSION}-windows-${ARCH}-portable.zip" - cp "app/build/compose/binaries/main/msi/Processing-${VERSION}.msi" "release-assets/processing-${VERSION}-windows-${ARCH}.msi" + cp "app/build/compose/binaries/main/Processing-${VERSION}.zip" "release-assets/processing-${ASSET_VERSION}-windows-${ARCH}-portable.zip" + cp "app/build/compose/binaries/main/msi/Processing-${VERSION}.msi" "release-assets/processing-${ASSET_VERSION}-windows-${ARCH}.msi" - name: Upload release assets uses: softprops/action-gh-release@v2 @@ -246,11 +271,12 @@ jobs: - name: Stage release assets env: VERSION: ${{ needs.version.outputs.version }} + ASSET_VERSION: ${{ needs.version.outputs.asset_version }} ARCH: ${{ matrix.arch }} run: | mkdir -p release-assets - cp "app/build/compose/binaries/main/Processing-${VERSION}.zip" "release-assets/processing-${VERSION}-macos-${ARCH}-portable.zip" - cp "app/build/compose/binaries/main/dmg/Processing-${VERSION}.dmg" "release-assets/processing-${VERSION}-macos-${ARCH}.dmg" + cp "app/build/compose/binaries/main/Processing-${VERSION}.zip" "release-assets/processing-${ASSET_VERSION}-macos-${ARCH}-portable.zip" + cp "app/build/compose/binaries/main/dmg/Processing-${VERSION}.dmg" "release-assets/processing-${ASSET_VERSION}-macos-${ARCH}.dmg" - name: Upload release assets uses: softprops/action-gh-release@v2 @@ -293,12 +319,13 @@ jobs: - name: Stage release assets env: VERSION: ${{ needs.version.outputs.version }} + ASSET_VERSION: ${{ needs.version.outputs.asset_version }} ARCH: ${{ matrix.arch }} DEB: ${{ matrix.deb }} run: | mkdir -p release-assets - cp "app/build/compose/binaries/main/Processing-${VERSION}.zip" "release-assets/processing-${VERSION}-linux-${ARCH}-portable.zip" - cp "app/build/compose/binaries/main/deb/processing_${VERSION}-1_${DEB}.deb" "release-assets/processing-${VERSION}-linux-${ARCH}.deb" + cp "app/build/compose/binaries/main/Processing-${VERSION}.zip" "release-assets/processing-${ASSET_VERSION}-linux-${ARCH}-portable.zip" + cp "app/build/compose/binaries/main/deb/processing_${VERSION}-1_${DEB}.deb" "release-assets/processing-${ASSET_VERSION}-linux-${ARCH}.deb" - name: Upload release assets uses: softprops/action-gh-release@v2 @@ -358,21 +385,24 @@ jobs: - name: Stage release assets env: VERSION: ${{ needs.version.outputs.version }} + ASSET_VERSION: ${{ needs.version.outputs.asset_version }} ARCH: ${{ matrix.arch }} DEB: ${{ matrix.deb }} SNAP_NAME: ${{ vars.SNAP_NAME }} run: | mkdir -p release-assets - cp "app/build/compose/binaries/main/${SNAP_NAME}_${VERSION}_${DEB}.snap" "release-assets/processing-${VERSION}-linux-${ARCH}.snap" + cp "app/build/compose/binaries/main/${SNAP_NAME}_${VERSION}_${DEB}.snap" "release-assets/processing-${ASSET_VERSION}-linux-${ARCH}.snap" - name: Upload snap to release uses: softprops/action-gh-release@v2 with: draft: true tag_name: ${{ github.ref_name }} - files: release-assets/processing-${{ needs.version.outputs.version }}-linux-${{ matrix.arch }}.snap + files: release-assets/processing-${{ needs.version.outputs.asset_version }}-linux-${{ matrix.arch }}.snap - name: Upload snap to Snap Store + # Release candidates must not push to the Snap Store. + if: ${{ needs.version.outputs.is_prerelease != 'true' }} run: snapcraft upload --release=beta app/build/compose/binaries/main/${{ vars.SNAP_NAME }}_${{ needs.version.outputs.version }}_${{ matrix.deb }}.snap env: SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.PROCESSING_SNAPCRAFT_TOKEN }} @@ -426,18 +456,18 @@ jobs: - name: Stage release assets env: - VERSION: ${{ needs.version.outputs.version }} + ASSET_VERSION: ${{ needs.version.outputs.asset_version }} ARCH: ${{ matrix.arch }} run: | mkdir -p release-assets - cp processing.flatpak "release-assets/processing-${VERSION}-linux-${ARCH}.flatpak" + cp processing.flatpak "release-assets/processing-${ASSET_VERSION}-linux-${ARCH}.flatpak" - name: Upload Flatpak to release uses: softprops/action-gh-release@v2 with: draft: true tag_name: ${{ github.ref_name }} - files: release-assets/processing-${{ needs.version.outputs.version }}-linux-${{ matrix.arch }}.flatpak + files: release-assets/processing-${{ needs.version.outputs.asset_version }}-linux-${{ matrix.arch }}.flatpak publish-release: name: Publish release @@ -454,12 +484,24 @@ jobs: - release-linux - release-linux-snap - release-linux-flatpak + # Run once nothing has failed. publish-maven/publish-gradle are skipped for + # release candidates, and a skipped dependency would otherwise skip this job. + if: ${{ !failure() && !cancelled() }} permissions: contents: write env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_REPO: ${{ github.repository }} TAG: ${{ github.ref_name }} + IS_PRERELEASE: ${{ needs.version.outputs.is_prerelease }} steps: - name: Mark release as published - run: gh release edit "$TAG" --draft=false --latest + run: | + # Release candidates go out as a public prerelease (downloadable, but + # not marked "latest" so package-manager watchers ignore them); final + # releases are marked latest. + if [ "$IS_PRERELEASE" = "true" ]; then + gh release edit "$TAG" --draft=false --prerelease + else + gh release edit "$TAG" --draft=false --latest + fi From 0d8bde55f71764f4c6091beab7881fcb00738d20 Mon Sep 17 00:00:00 2001 From: Tony Wasserka <4840017+neobrain@users.noreply.github.com> Date: Wed, 5 Aug 2026 19:04:40 +0200 Subject: [PATCH 5/6] Fix "InaccessibleObjectException" exception on Linux startup (#1559) Linux builds would previously throw this error on startup: > java.lang.reflect.InaccessibleObjectException: Unable to make field private > static java.lang.String sun.awt.X11.XToolkit.awtAppClassName accessible: > module java.desktop does not "opens sun.awt.X11" to unnamed module @4c8aea9c The code that triggered this in Processing itself documented that an `--add-opens` parameter must be used, but this was never applied in the gradle build. Co-authored-by: Tony Wasserka --- app/build.gradle.kts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 01938a187..c536cc465 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -104,7 +104,8 @@ compose.desktop { iconFile = rootProject.file("build/linux/processing.png") // Fix fonts on some Linux distributions jvmArgs("-Dawt.useSystemAAFontSettings=on") - + // Enable access to restricted methods; see initBase in LinuxPlatform.java + jvmArgs("--add-opens=java.desktop/sun.awt.X11=ALL-UNNAMED") } } } From 76feca7ffe9863e5e3f259d0cfaa0473c59b045d Mon Sep 17 00:00:00 2001 From: pepc84 Date: Mon, 14 Sep 2026 11:35:16 -0700 Subject: [PATCH 6/6] Fix: only pass --disable-awt for WebGPU renderer ARGS_DISABLE_AWT was passed unconditionally, breaking display detection, displayWidth/displayHeight, and pixelDensity() on all platforms since these still go through ShimAWT. Also fixes the string literal WEBGPU check on line 346 which should use PConstants.WEBGPU. Fixes #1553, #1569, #1551 --- java/src/processing/mode/java/runner/Runner.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/java/src/processing/mode/java/runner/Runner.java b/java/src/processing/mode/java/runner/Runner.java index d0bded04d..3813928ea 100644 --- a/java/src/processing/mode/java/runner/Runner.java +++ b/java/src/processing/mode/java/runner/Runner.java @@ -343,7 +343,7 @@ protected StringList getMachineParams() { //params.append("-Dcom.apple.mrj.application.apple.menu.about.name=" + // build.getSketchClassName()); - if ("WEBGPU".equals(build.getSketchRenderer())) { + if (PConstants.WEBGPU.equals(build.getSketchRenderer())) { params.append("-XstartOnFirstThread"); } } @@ -515,10 +515,13 @@ protected StringList getSketchParams(boolean present, String[] args) { params.append(PApplet.ARGS_UI_SCALE + "=" + uiScale); } */ - - // TODO: excise AWT to make webgpu work properly - params.append(PApplet.ARGS_DISABLE_AWT); - + // Only disable AWT for the WebGPU renderer, which uses GLFW and + // cannot coexist with AWT. All other renderers still depend on AWT + // for display detection, displayWidth/displayHeight, pixelDensity(), etc. + if (PConstants.WEBGPU.equals(build.getSketchRenderer())) { + params.append(PApplet.ARGS_DISABLE_AWT); + } + params.append(build.getSketchClassName()); } // Add command-line arguments to be given to the sketch itself