Merge branch 'main' into gradle-welcome-screen

This commit is contained in:
Stef Tervelde
2025-03-16 21:18:22 +01:00
31 changed files with 1651 additions and 163 deletions
+36 -15
View File
@@ -1,4 +1,4 @@
name: Pre-releases with Gradle
name: Branch Builds
on:
push:
paths-ignore:
@@ -6,31 +6,58 @@ on:
- '.all-contributorsrc'
jobs:
test:
runs-on: ubuntu-latest
name: Test Processing
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Install Java
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Build with Gradle
run: ./gradlew test
build:
name: Create Pre-release for ${{ matrix.os_prefix }} (${{ matrix.arch }})
name: (${{ matrix.os_prefix }}/${{ matrix.arch }}) Create Processing Build
runs-on: ${{ matrix.os }}
permissions:
contents: write
needs: test
strategy:
fail-fast: false
matrix:
include:
- os: [self-hosted, linux, ARM64]
- os: ubuntu-24.04-arm
os_prefix: linux
arch: aarch64
binary: processing*.snap
- os: ubuntu-latest
os_prefix: linux
arch: x64
binary: processing*.snap
- os: windows-latest
os_prefix: windows
arch: x64
binary: msi/Processing-*.msi
- os: macos-latest
os_prefix: macos
arch: x64
binary: dmg/Processing-*.dmg
- os: macos-latest
os_prefix: macos
arch: aarch64
binary: dmg/Processing-*.dmg
steps:
- name: Install Snapcraft
if: runner.os == 'Linux'
uses: samuelmeuli/action-snapcraft@v3
- name: Install LXD
if: runner.os == 'Linux'
uses: canonical/setup-lxd@main
- name: Checkout Repository
uses: actions/checkout@v4
- name: Install Java
@@ -41,19 +68,13 @@ jobs:
architecture: ${{ matrix.arch }}
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Build with Gradle
run: ./gradlew packageDistributionForCurrentOS
- name: Add instructions
if: ${{ matrix.os_prefix == 'macos' }}
run: |
echo "run 'xattr -d com.apple.quarantine Processing-${version}.dmg' to remove the quarantine flag" > ./app/build/compose/binaries/main/dmg/INSTRUCTIONS_FOR_TESTING.txt
- name: Add artifact
uses: actions/upload-artifact@v4
with:
name: processing-${{ github.ref_name }}-${{github.sha}}-${{ matrix.os_prefix }}-${{ matrix.arch }}-gradle
path: |
./app/build/compose/binaries/main/dmg/Processing-*.dmg
./app/build/compose/binaries/main/dmg/INSTRUCTIONS_FOR_TESTING.txt
./app/build/compose/binaries/main/msi/Processing-*.msi
./app/build/compose/binaries/main/deb/processing*.deb
name: processing-${{ matrix.os_prefix }}-${{ matrix.arch }}-br_${{ github.ref_name }}
retention-days: 1
path: app/build/compose/binaries/main/${{ matrix.binary }}
-37
View File
@@ -1,37 +0,0 @@
name: Maven Release
on:
workflow_dispatch:
inputs:
version:
description: 'Version to release'
required: true
default: '1.0.0'
jobs:
publish:
name: Create Processing Core Release on Maven Central
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: 17
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Build with Gradle
run: ./gradlew publish
env:
MAVEN_CENTRAL_USERNAME: ${{ secrets.MAVEN_CENTRAL_USERNAME }}
MAVEN_CENTRAL_PASSWORD: ${{ secrets.MAVEN_CENTRAL_PASSWORD }}
ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.MAVEN_CENTRAL_USERNAME }}
ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.MAVEN_CENTRAL_PASSWORD }}
ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.SIGNING_IN_MEMORY_KEY }}
ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.SIGNING_IN_MEMORY_KEY_PASSWORD }}
ORG_GRADLE_PROJECT_version: ${{ github.event.inputs.version }}
+35 -15
View File
@@ -7,12 +7,26 @@ on:
- main
jobs:
build:
name: Create Pull Request Build for ${{ matrix.os_prefix }} (${{ matrix.arch }})
test:
runs-on: ubuntu-latest
name: Test Processing
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Install Java
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Build with Gradle
run: ./gradlew test
build:
name: (${{ matrix.os_prefix }}/${{ matrix.arch }}) Create Processing Build
runs-on: ${{ matrix.os }}
permissions:
pull-requests: write
contents: read
needs: test
strategy:
fail-fast: false
matrix:
@@ -20,19 +34,31 @@ jobs:
- os: ubuntu-24.04-arm
os_prefix: linux
arch: aarch64
binary: processing*.snap
- os: ubuntu-latest
os_prefix: linux
arch: x64
binary: processing*.snap
- os: windows-latest
os_prefix: windows
arch: x64
binary: msi/Processing-*.msi
- os: macos-latest
os_prefix: macos
arch: x64
binary: dmg/Processing-*.dmg
- os: macos-latest
os_prefix: macos
arch: aarch64
binary: dmg/Processing-*.dmg
steps:
- name: Install Snapcraft
if: runner.os == 'Linux'
uses: samuelmeuli/action-snapcraft@v3
- name: Install LXD
if: runner.os == 'Linux'
uses: canonical/setup-lxd@main
- name: Checkout Repository
uses: actions/checkout@v4
- name: Install Java
@@ -43,19 +69,13 @@ jobs:
architecture: ${{ matrix.arch }}
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Build with Gradle
run: ./gradlew packageDistributionForCurrentOS
- name: Add instructions
if: ${{ matrix.os_prefix == 'macos' }}
run: |
echo "run 'xattr -d com.apple.quarantine Processing-${version}.dmg' to remove the quarantine flag" > ./app/build/compose/binaries/main/dmg/INSTRUCTIONS_FOR_TESTING.txt
- name: Add artifact
uses: actions/upload-artifact@v4
with:
name: processing-pr${{ github.event.pull_request.number }}-${{github.sha}}-${{ matrix.os_prefix }}-${{ matrix.arch }}-gradle
path: |
./app/build/compose/binaries/main/dmg/Processing-*.dmg
./app/build/compose/binaries/main/dmg/INSTRUCTIONS_FOR_TESTING.txt
./app/build/compose/binaries/main/msi/Processing-*.msi
./app/build/compose/binaries/main/deb/processing*.deb
name: processing-${{ matrix.os_prefix }}-${{ matrix.arch }}-pr_${{ github.event.pull_request.number }}
retention-days: 5
path: app/build/compose/binaries/main/${{ matrix.binary }}
+106 -28
View File
@@ -7,22 +7,50 @@ jobs:
version:
runs-on: ubuntu-latest
outputs:
build_number: ${{ steps.tag_info.outputs.build_number }}
revision: ${{ steps.tag_info.outputs.revision }}
version: ${{ steps.tag_info.outputs.version }}
steps:
- name: Extract version and build number
- name: Extract version and revision
id: tag_info
shell: bash
run: |
TAG_NAME="${GITHUB_REF#refs/tags/}"
BUILD_NUMBER=$(echo "$TAG_NAME" | cut -d'-' -f2)
REVISION=$(echo "$TAG_NAME" | cut -d'-' -f2)
VERSION=$(echo "$TAG_NAME" | cut -d'-' -f3)
# Set outputs for use in later jobs or steps
echo "build_number=$BUILD_NUMBER" >> $GITHUB_OUTPUT
echo "revision=$REVISION" >> $GITHUB_OUTPUT
echo "version=$VERSION" >> $GITHUB_OUTPUT
reference:
name: Publish Processing Reference to release
runs-on: ubuntu-latest
permissions:
contents: write
needs: version
steps:
- name: Checkout Website Repository
uses: actions/checkout@v4
with:
repository: processing/processing-website
- name: Use Node.js 16
uses: actions/setup-node@v3
with:
node-version: 16
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
- name: Make reference.zip
run: npm run zip
- name: Upload reference to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
asset_name: processing-${{ needs.version.outputs.version }}-reference.zip
file: reference.zip
publish:
name: Publish Processing Core to Maven Central
name: Publish Processing Libraries to Maven Central
runs-on: ubuntu-latest
needs: version
steps:
@@ -35,6 +63,7 @@ jobs:
java-version: 17
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- name: Build with Gradle
run: ./gradlew publish
env:
@@ -48,9 +77,9 @@ jobs:
ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.SIGNING_IN_MEMORY_KEY_PASSWORD }}
ORG_GRADLE_PROJECT_version: ${{ needs.version.outputs.version }}
ORG_GRADLE_PROJECT_group: ${{ vars.PROCESSING_GROUP }}
ORG_GRADLE_PROJECT_group: ${{ vars.GRADLE_GROUP }}
build:
name: Publish Release for ${{ matrix.os_prefix }} (${{ matrix.arch }})
name: (${{ matrix.os_prefix }}/${{ matrix.arch }}) Create Processing Release
runs-on: ${{ matrix.os }}
needs: version
permissions:
@@ -59,26 +88,47 @@ jobs:
fail-fast: false
matrix:
include:
# compiling for arm32 needs a self-hosted runner on Raspi OS (32-bit)
- os: [self-hosted, linux, ARM]
- os: ubuntu-24.04-arm
os_prefix: linux
arch: arm
arch: aarch64
binary: ${{ vars.SNAP_NAME }}_${{ needs.version.outputs.version }}_arm64
extension: snap
- os: ubuntu-latest
os_prefix: linux
arch: x64
binary: ${{ vars.SNAP_NAME }}_${{ needs.version.outputs.version }}_amd64
extension: snap
- os: windows-latest
os_prefix: windows
arch: x64
binary: msi/Processing-${{ needs.version.outputs.version }}
extension: msi
- os: macos-latest
os_prefix: macos
arch: x64
binary: dmg/Processing-${{ needs.version.outputs.version }}
extension: dmg
- os: macos-latest
os_prefix: macos
arch: aarch64
- os: macos-latest
os_prefix: linux
arch: aarch64
binary: dmg/Processing-${{ needs.version.outputs.version }}
extension: dmg
steps:
- name: Install Certificates for Code Signing
if: runner.os == 'macOS'
continue-on-error: true
uses: apple-actions/import-codesign-certs@v3
with:
p12-file-base64: ${{ secrets.CERTIFICATES_P12 }}
p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }}
- name: Install Snapcraft
if: runner.os == 'Linux'
uses: samuelmeuli/action-snapcraft@v3
- name: Install LXD
if: runner.os == 'Linux'
uses: canonical/setup-lxd@main
- name: Checkout Repository
uses: actions/checkout@v4
- name: Install Java
@@ -89,25 +139,53 @@ jobs:
architecture: ${{ matrix.arch }}
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
# - name: Install Certificates for Code Signing
# if: ${{ matrix.os_prefix == 'macos' }}
# uses: apple-actions/import-codesign-certs@v3
# with:
# p12-file-base64: ${{ secrets.CERTIFICATES_P12 }}
# p12-password: ${{ secrets.CERTIFICATES_P12_PASSWORD }}
- name: Build with Gradle
run: ./gradlew packageDistributionForCurrentOS
env:
env:
ORG_GRADLE_PROJECT_version: ${{ needs.version.outputs.version }}
ORG_GRADLE_PROJECT_group: ${{ vars.PROCESSING_GROUP }}
ORG_GRADLE_PROJECT_group: ${{ vars.GRADLE_GROUP }}
ORG_GRADLE_PROJECT_revision: ${{ needs.version.outputs.revision }}
ORG_GRADLE_PROJECT_compose.desktop.verbose: true
ORG_GRADLE_PROJECT_compose.desktop.mac.sign: ${{ secrets.PROCESSING_SIGNING }}
ORG_GRADLE_PROJECT_compose.desktop.mac.signing.identity: ${{ secrets.PROCESSING_SIGNING_IDENTITY }}
ORG_GRADLE_PROJECT_compose.desktop.mac.notarization.appleID: ${{ secrets.PROCESSING_APPLE_ID }}
ORG_GRADLE_PROJECT_compose.desktop.mac.notarization.password: ${{ secrets.PROCESSING_APP_PASSWORD }}
ORG_GRADLE_PROJECT_compose.desktop.mac.notarization.teamID: ${{ secrets.PROCESSING_TEAM_ID }}
ORG_GRADLE_PROJECT_snapname: ${{ vars.SNAP_NAME }}
- name: Upload binaries to release
- name: Upload portables to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: |
./app/build/compose/binaries/main/dmg/Processing-*.dmg
./app/build/compose/binaries/main/dmg/INSTRUCTIONS_FOR_TESTING.txt
./app/build/compose/binaries/main/msi/Processing-*.msi
./app/build/compose/binaries/main/deb/processing*.deb
file_glob: true
asset_name: processing-${{ needs.version.outputs.version }}-${{ matrix.os_prefix }}-${{ matrix.arch }}-portable.zip
file: app/build/compose/binaries/main/Processing-${{ needs.version.outputs.version }}.zip
- name: Upload installers to release
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
asset_name: processing-${{ needs.version.outputs.version }}-${{ matrix.os_prefix }}-${{ matrix.arch }}.${{ matrix.extension }}
file: app/build/compose/binaries/main/${{ matrix.binary }}.${{ matrix.extension }}
- name: Upload snap to Snap Store
if: runner.os == 'Linux'
run: snapcraft upload --release=beta app/build/compose/binaries/main/${{ matrix.binary }}.${{ matrix.extension }}
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.PROCESSING_SNAPCRAFT_TOKEN }}
- name: Sign files with Trusted Signing
if: runner.os == 'Windows'
uses: azure/trusted-signing-action@v0
with:
azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }}
azure-client-id: ${{ secrets.AZURE_CLIENT_ID }}
azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}
endpoint: https://eus.codesigning.azure.net/
trusted-signing-account-name: vscx-codesigning
certificate-profile-name: vscx-certificate-profile
files-folder: app/build/compose/binaries/main/msi
files-folder-filter: msi
file-digest: SHA256
timestamp-rfc3161: http://timestamp.acs.microsoft.com
timestamp-digest: SHA256
+1
View File
@@ -112,3 +112,4 @@ java/build/
/core/examples/build
.build/
/app/windows/obj
+5
View File
@@ -0,0 +1,5 @@
<svg width="800" height="800" viewBox="0 0 800 800" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M400 500C700 500 700 100 400 100" stroke="#0468FF" stroke-width="150"/>
<path d="M400 200L100 600" stroke="#1F34AB" stroke-width="150"/>
<path d="M100 300L200 500" stroke="#85AEFF" stroke-width="150"/>
</svg>

After

Width:  |  Height:  |  Size: 324 B

-1
View File
@@ -4,7 +4,6 @@
<option name="env">
<map>
<entry key="DEBUG" value="true" />
<entry key="ORG_GRADLE_PROJECT_version" value="Development Build" />
</map>
</option>
<option name="executionName" />
+282 -16
View File
@@ -1,6 +1,12 @@
import org.gradle.kotlin.dsl.support.zipTo
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
import org.jetbrains.compose.desktop.application.tasks.AbstractJPackageTask
import org.jetbrains.compose.internal.de.undercouch.gradle.tasks.download.Download
import org.jetbrains.kotlin.fir.scopes.impl.overrides
import java.io.FileOutputStream
import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream
// TODO: Update to 2.10.20 and add hot-reloading: https://github.com/JetBrains/compose-hot-reload
@@ -14,9 +20,6 @@ plugins{
alias(libs.plugins.download)
}
group = rootProject.group
version = rootProject.version
repositories{
mavenCentral()
google()
@@ -47,37 +50,38 @@ compose.desktop {
mainClass = "processing.app.ui.Start"
jvmArgs(*listOf(
Pair("processing.version", version),
Pair("processing.revision", "1300"),
Pair("processing.contributions.source", "https://contributions-preview.processing.org/contribs.txt"),
Pair("processing.version", rootProject.version),
Pair("processing.revision", findProperty("revision") ?: Int.MAX_VALUE),
Pair("processing.contributions.source", "https://download.processing.org/contribs.txt"),
Pair("processing.download.page", "https://processing.org/download/"),
Pair("processing.download.latest", "https://processing.org/download/latest.txt"),
Pair("processing.tutorials", "https://processing.org/tutorials/"),
).map { "-D${it.first}=${it.second}" }.toTypedArray())
nativeDistributions{
modules("jdk.jdi", "java.compiler", "jdk.accessibility", "jdk.zipfs")
modules("jdk.jdi", "java.compiler", "jdk.accessibility", "jdk.zipfs", "java.management.rmi")
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
packageName = "Processing"
macOS{
bundleID = "org.processing.app"
iconFile = project.file("../build/macos/processing.icns")
bundleID = "${rootProject.group}.app"
iconFile = rootProject.file("build/macos/processing.icns")
infoPlist{
extraKeysRawXml = layout.projectDirectory.file("info.plist").asFile.readText()
extraKeysRawXml = file("macos/info.plist").readText()
}
entitlementsFile.set(project.file("entitlements.plist"))
runtimeEntitlementsFile.set(project.file("entitlements.plist"))
entitlementsFile.set(file("macos/entitlements.plist"))
runtimeEntitlementsFile.set(file("macos/entitlements.plist"))
appStore = true
}
windows{
iconFile = project.file("../build/windows/processing.ico")
iconFile = rootProject.file("build/windows/processing.ico")
menuGroup = "Processing"
upgradeUuid = "89d8d7fe-5602-4b12-ba10-0fe78efbd602"
}
linux {
appCategory = "Programming"
menuGroup = "Processing"
iconFile = project.file("../build/linux/processing.png")
menuGroup = "Development;Programming;"
iconFile = rootProject.file("build/linux/processing.png")
// Fix fonts on some Linux distributions
jvmArgs("-Dawt.useSystemAAFontSettings=on")
@@ -110,6 +114,8 @@ dependencies {
implementation(libs.compottie)
implementation(libs.kaml)
implementation(libs.markdown)
implementation(libs.markdownJVM)
testImplementation(kotlin("test"))
testImplementation(libs.mockitoKotlin)
@@ -127,6 +133,172 @@ tasks.compileJava{
options.encoding = "UTF-8"
}
val version = if(project.version == "unspecified") "1.0.0" else project.version
tasks.register<Exec>("installCreateDmg") {
onlyIf { org.gradle.internal.os.OperatingSystem.current().isMacOsX }
commandLine("arch", "-arm64", "brew", "install", "--quiet", "create-dmg")
}
tasks.register<Exec>("packageCustomDmg"){
onlyIf { org.gradle.internal.os.OperatingSystem.current().isMacOsX }
group = "compose desktop"
val distributable = tasks.named<AbstractJPackageTask>("createDistributable").get()
dependsOn(distributable, "installCreateDmg")
val packageName = distributable.packageName.get()
val dir = distributable.destinationDir.get()
val dmg = dir.file("../dmg/$packageName-$version.dmg").asFile
val app = dir.file("$packageName.app").asFile
dmg.parentFile.deleteRecursively()
dmg.parentFile.mkdirs()
val extra = mutableListOf<String>()
val isSigned = compose.desktop.application.nativeDistributions.macOS.signing.sign.get()
if(!isSigned) {
val content = """
run 'xattr -d com.apple.quarantine Processing-${version}.dmg' to remove the quarantine flag
""".trimIndent()
val instructions = dmg.parentFile.resolve("INSTRUCTIONS.txt")
instructions.writeText(content)
extra.add("--add-file")
extra.add("INSTRUCTIONS.txt")
extra.add(instructions.path)
extra.add("200")
extra.add("25")
}
commandLine("brew", "install", "--quiet", "create-dmg")
commandLine("create-dmg",
"--volname", packageName,
"--volicon", file("macos/volume.icns"),
"--background", file("macos/background.png"),
"--icon", "$packageName.app", "190", "185",
"--window-pos", "200", "200",
"--window-size", "658", "422",
"--app-drop-link", "466", "185",
"--hide-extension", "$packageName.app",
*extra.toTypedArray(),
dmg,
app
)
}
tasks.register<Exec>("packageCustomMsi"){
onlyIf { org.gradle.internal.os.OperatingSystem.current().isWindows }
dependsOn("createDistributable")
workingDir = file("windows")
group = "compose desktop"
val version = if(version == "unspecified") "1.0.0" else version
commandLine(
"dotnet",
"build",
"/p:Platform=x64",
"/p:Version=$version",
"/p:DefineConstants=\"Version=$version;\""
)
}
val snapname = findProperty("snapname") ?: rootProject.name
val snaparch = when (System.getProperty("os.arch")) {
"amd64", "x86_64" -> "amd64"
"aarch64" -> "arm64"
else -> System.getProperty("os.arch")
}
tasks.register("generateSnapConfiguration"){
onlyIf { org.gradle.internal.os.OperatingSystem.current().isLinux }
val distributable = tasks.named<AbstractJPackageTask>("createDistributable").get()
dependsOn(distributable)
val dir = distributable.destinationDir.get()
val content = """
name: $snapname
version: $version
base: core22
summary: A creative coding editor
description: |
Processing is a flexible software sketchbook and a programming language designed for learning how to code.
confinement: strict
apps:
processing:
command: opt/processing/bin/Processing
desktop: opt/processing/lib/processing-Processing.desktop
environment:
LD_LIBRARY_PATH: ${'$'}SNAP/opt/processing/lib/runtime/lib:${'$'}LD_LIBRARY_PATH
LIBGL_DRIVERS_PATH: ${'$'}SNAP/usr/lib/${'$'}SNAPCRAFT_ARCH_TRIPLET/dri
plugs:
- desktop
- desktop-legacy
- wayland
- x11
- network
- opengl
parts:
processing:
plugin: dump
source: deb/processing_$version-1_$snaparch.deb
source-type: deb
stage-packages:
- openjdk-17-jre
override-prime: |
snapcraftctl prime
chmod -R +x opt/processing/lib/app/resources/jdk-*
rm -vf usr/lib/jvm/java-17-openjdk-*/lib/security/cacerts
""".trimIndent()
dir.file("../snapcraft.yaml").asFile.writeText(content)
}
tasks.register<Exec>("packageSnap"){
onlyIf { org.gradle.internal.os.OperatingSystem.current().isLinux }
dependsOn("packageDeb", "generateSnapConfiguration")
group = "compose desktop"
val distributable = tasks.named<AbstractJPackageTask>("createDistributable").get()
workingDir = distributable.destinationDir.dir("../").get().asFile
commandLine("snapcraft")
}
tasks.register<Zip>("zipDistributable"){
dependsOn("createDistributable", "setExecutablePermissions")
group = "compose desktop"
val distributable = tasks.named<AbstractJPackageTask>("createDistributable").get()
val dir = distributable.destinationDir.get()
val packageName = distributable.packageName.get()
from(dir){ eachFile{ permissions{ unix("755") } } }
archiveBaseName.set(packageName)
destinationDirectory.set(dir.file("../").asFile)
}
afterEvaluate{
tasks.named("packageDmg").configure{
dependsOn("packageCustomDmg")
group = "compose desktop"
actions = emptyList()
}
tasks.named("packageMsi").configure{
dependsOn("packageCustomMsi")
group = "compose desktop"
actions = emptyList()
}
tasks.named("packageDistributionForCurrentOS").configure {
if(org.gradle.internal.os.OperatingSystem.current().isMacOsX
&& compose.desktop.application.nativeDistributions.macOS.notarization.appleID.isPresent
){
dependsOn("notarizeDmg")
}
dependsOn("packageSnap", "zipDistributable")
}
}
// LEGACY TASKS
// Most of these are shims to be compatible with the old build system
@@ -242,6 +414,97 @@ tasks.register<Copy>("renameWindres") {
}
duplicatesStrategy = DuplicatesStrategy.INCLUDE
into(dir)
}
tasks.register("signResources"){
onlyIf {
org.gradle.internal.os.OperatingSystem.current().isMacOsX
&&
compose.desktop.application.nativeDistributions.macOS.signing.sign.get()
}
group = "compose desktop"
dependsOn(
"includeCore",
"includeJavaMode",
"includeJdk",
"includeSharedAssets",
"includeProcessingExamples",
"includeProcessingWebsiteExamples",
"includeJavaModeResources",
"renameWindres"
)
finalizedBy("prepareAppResources")
val resourcesPath = composeResources("")
// find jars in the resources directory
val jars = mutableListOf<File>()
doFirst{
fileTree(resourcesPath)
.matching { include("**/Info.plist") }
.singleOrNull()
?.let { file ->
copy {
from(file)
into(resourcesPath)
}
}
fileTree(resourcesPath) {
include("**/*.jar")
exclude("**/*.jar.tmp/**")
}.forEach { file ->
val tempDir = file.parentFile.resolve("${file.name}.tmp")
copy {
from(zipTree(file))
into(tempDir)
}
file.delete()
jars.add(tempDir)
}
fileTree(resourcesPath){
include("**/bin/**")
include("**/*.jnilib")
include("**/*.dylib")
include("**/*aarch64*")
include("**/*x86_64*")
include("**/*ffmpeg*")
include("**/ffmpeg*/**")
exclude("jdk-*/**")
exclude("*.jar")
exclude("*.so")
exclude("*.dll")
}.forEach{ file ->
exec {
commandLine("codesign", "--timestamp", "--force", "--deep","--options=runtime", "--sign", "Developer ID Application", file)
}
}
jars.forEach { file ->
FileOutputStream(File(file.parentFile, file.nameWithoutExtension)).use { fos ->
ZipOutputStream(fos).use { zos ->
file.walkTopDown().forEach { fileEntry ->
if (fileEntry.isFile) {
// Calculate the relative path for the zip entry
val zipEntryPath = fileEntry.relativeTo(file).path
val entry = ZipEntry(zipEntryPath)
zos.putNextEntry(entry)
// Copy file contents to the zip
fileEntry.inputStream().use { input ->
input.copyTo(zos)
}
zos.closeEntry()
}
}
}
}
file.deleteRecursively()
}
file(composeResources("Info.plist")).delete()
}
}
afterEvaluate {
tasks.named("prepareAppResources").configure {
@@ -275,5 +538,8 @@ afterEvaluate {
}
}
}
tasks.findByName("createDistributable")?.finalizedBy("setExecutablePermissions")
tasks.named("createDistributable").configure {
dependsOn("signResources")
finalizedBy("setExecutablePermissions")
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 497 KiB

Binary file not shown.
+5
View File
@@ -0,0 +1,5 @@
<svg width="900" height="900" viewBox="0 0 900 900" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M456.735 552.393L155.9 151.279" stroke="#A44D28" stroke-width="150.418"/>
<path d="M757.575 452.113C456.738 552.391 456.738 752.948 155.903 652.67" stroke="#FF7D45" stroke-width="150.418"/>
<path d="M556.832 552.392L456.555 51" stroke="#FFBEA2" stroke-width="150.418"/>
</svg>

After

Width:  |  Height:  |  Size: 386 B

+1
View File
@@ -124,6 +124,7 @@ public class Base {
static public void main(final String[] args) {
Messages.log("Starting Processing version" + VERSION_NAME + " revision "+ REVISION);
EventQueue.invokeLater(() -> {
try {
createAndShowGUI(args);
+12 -5
View File
@@ -577,18 +577,25 @@ public class Platform {
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
/**
* These methods were refactored to use the Preferences system instead of
* actual environment variables, since modifying environment variables at runtime
* proved problematic. This approach provides similar functionality
* while being compatible with various platforms and execution environments.
*
* This abstraction maintains a consistent API for environment-like variable storage
* while implementing it differently under the hood to work around runtime limitations.
*/
static public void setenv(String variable, String value) {
inst.setenv(variable, value);
Preferences.set(variable, value);
}
static public String getenv(String variable) {
return inst.getenv(variable);
return Preferences.get(variable);
}
static public int unsetenv(String variable) {
return inst.unsetenv(variable);
throw new RuntimeException("unsetenv() not yet implemented");
}
}
+1 -1
View File
@@ -117,7 +117,7 @@ public class UpdateCheck {
long now = System.currentTimeMillis();
if (lastString != null) {
long when = Long.parseLong(lastString);
if (now - when < ONE_DAY) {
if (now - when < ONE_DAY && !Base.DEBUG) {
// don't annoy the shit outta people
return;
}
@@ -30,6 +30,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
import processing.app.Base;
import processing.app.Messages;
import processing.app.UpdateCheck;
import processing.app.Util;
import processing.core.PApplet;
@@ -228,6 +229,7 @@ public class ContributionListing {
public void downloadAvailableList(final Base base,
final ContribProgress progress) {
// TODO: replace with SwingWorker [jv]
Messages.log("Downloading contributions list from " + LISTING_URL);
new Thread(() -> {
downloadingLock.lock();
@@ -257,31 +257,31 @@ public class DefaultPlatform {
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
public interface CLibrary extends Library {
CLibrary INSTANCE = Native.load("c", CLibrary.class);
int setenv(String name, String value, int overwrite);
String getenv(String name);
int unsetenv(String name);
int putenv(String string);
}
public void setenv(String variable, String value) {
CLibrary clib = CLibrary.INSTANCE;
clib.setenv(variable, value, 1);
}
public String getenv(String variable) {
CLibrary clib = CLibrary.INSTANCE;
return clib.getenv(variable);
}
public int unsetenv(String variable) {
CLibrary clib = CLibrary.INSTANCE;
return clib.unsetenv(variable);
}
// public interface CLibrary extends Library {
// CLibrary INSTANCE = Native.load("c", CLibrary.class);
// int setenv(String name, String value, int overwrite);
// String getenv(String name);
// int unsetenv(String name);
// int putenv(String string);
// }
//
//
// public void setenv(String variable, String value) {
// CLibrary clib = CLibrary.INSTANCE;
// clib.setenv(variable, value, 1);
// }
//
//
// public String getenv(String variable) {
// CLibrary clib = CLibrary.INSTANCE;
// return clib.getenv(variable);
// }
//
//
// public int unsetenv(String variable) {
// CLibrary clib = CLibrary.INSTANCE;
// return clib.unsetenv(variable);
// }
// . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
@@ -33,7 +33,8 @@ import processing.core.PApplet;
public class LinuxPlatform extends DefaultPlatform {
String homeDir;
// Switched to use ~ as the home directory for compatibility with snap
String homeDir = "~";
public void initBase(Base base) {
@@ -98,7 +99,7 @@ public class LinuxPlatform extends DefaultPlatform {
File configHome = null;
// Check to see if the user has set a different location for their config
String configHomeEnv = getenv("XDG_CONFIG_HOME");
String configHomeEnv = System.getenv("XDG_CONFIG_HOME");
if (configHomeEnv != null && !configHomeEnv.isBlank()) {
configHome = new File(configHomeEnv);
if (!configHome.exists()) {
+24 -5
View File
@@ -7,6 +7,7 @@ import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.material.MaterialTheme
import androidx.compose.material.MaterialTheme.colors
import androidx.compose.material.MaterialTheme.typography
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.*
@@ -30,6 +31,17 @@ import androidx.compose.ui.window.application
import androidx.compose.ui.window.rememberWindowState
import com.formdev.flatlaf.util.SystemInfo
import processing.app.ui.theme.*
import com.mikepenz.markdown.compose.Markdown
import com.mikepenz.markdown.m2.markdownColor
import com.mikepenz.markdown.m2.markdownTypography
import com.mikepenz.markdown.model.MarkdownColors
import com.mikepenz.markdown.model.MarkdownTypography
import processing.app.Base.getRevision
import processing.app.Base.getVersionName
import processing.app.ui.theme.LocalLocale
import processing.app.ui.theme.LocalTheme
import processing.app.ui.theme.Locale
import processing.app.ui.theme.ProcessingTheme
import java.awt.Cursor
import java.awt.Dimension
import java.awt.event.KeyAdapter
@@ -64,27 +76,34 @@ class WelcomeToBeta {
){
val locale = LocalLocale.current
Image(
painter = painterResource("logo.svg"),
painter = painterResource("bird.svg"),
contentDescription = locale["beta.logo"],
modifier = Modifier
.align(Alignment.CenterVertically)
.size(100.dp, 100.dp)
.offset(0.dp, (-25).dp)
)
Column(
modifier = Modifier
.fillMaxHeight(),
verticalArrangement = Arrangement
.spacedBy(
MaterialTheme.typography.subtitle1.lineHeight.value.dp,
10.dp,
alignment = Alignment.CenterVertically
)
) {
Text(
text = locale["beta.title"],
style = MaterialTheme.typography.subtitle1,
style = typography.subtitle1,
)
Text(
text = locale["beta.message"]
val text = locale["beta.message"]
.replace('$' + "version", getVersionName())
.replace('$' + "revision", getRevision().toString())
Markdown(
text,
colors = markdownColor(),
typography = markdownTypography(text = typography.body1, link = typography.body1.copy(color = colors.primary)),
modifier = Modifier.background(Color.Transparent).padding(bottom = 10.dp)
)
Row {
val window = LocalWindow.current
+2 -2
View File
@@ -48,7 +48,7 @@ class SchemaTest {
""".trimIndent()
val base64 = Base64.encode(sketch.toByteArray())
Schema.handleSchema("pde://sketch/base64/$base64?pde=Module:$base64", base)
Schema.handleSchema("pde://sketch/base64/$base64?pde=AnotherFile:$base64", base)
val captor = ArgumentCaptor.forClass(String::class.java)
verify(base).handleOpenUntitled(captor.capture())
@@ -57,7 +57,7 @@ class SchemaTest {
assert(file.exists())
assert(file.readText() == sketch)
val extra = file.parentFile.resolve("Module.pde")
val extra = file.parentFile.resolve("AnotherFile.pde")
assert(extra.exists())
assert(extra.readText() == sketch)
file.parentFile.deleteRecursively()
File diff suppressed because it is too large Load Diff
+9
View File
@@ -0,0 +1,9 @@
<Project Sdk="WixToolset.Sdk/5.0.1">
<PropertyGroup>
<OutputPath>..\build\compose\binaries\main\msi</OutputPath>
<OutputName>Processing-$(Version)</OutputName>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="WixToolset.UI.wixext" Version="5.0.1" />
</ItemGroup>
</Project>
+35
View File
@@ -0,0 +1,35 @@
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:ui="http://wixtoolset.org/schemas/v4/wxs/ui">
<Package Name="Processing" Manufacturer="Processing Foundation" Version="$(Version)" UpgradeCode="89d8d7fe-5602-4b12-ba10-0fe78efbd602">
<Icon Id="icon.ico" SourceFile="..\..\build\windows\processing.ico" />
<Property Id="ARPPRODUCTICON" Value="icon.ico" />
<MediaTemplate EmbedCab="yes" />
<ui:WixUI Id="WixUI_Mondo" InstallDirectory="INSTALLFOLDER" />
<WixVariable Id="WixUILicenseRtf" Value="LICENSE.rtf" />
<WixVariable Id="WixUIDialogBmp" Value="background.png" />
<WixVariable Id="WixUIBannerBmp" Value="banner.png" />
<Feature Id="MainApplication" Title="Processing" Level="1">
<Files Include="..\build\compose\binaries\main\app\Processing\**" />
<ComponentRef Id="ApplicationShortcut" />
</Feature>
<Directory Id="ProgramMenuFolder">
<Directory Id="ApplicationProgramsFolder" Name="Processing"/>
</Directory>
<Directory Id="ProgramFiles64Folder">
<Directory Id="INSTALLFOLDER" Name="Processing">
</Directory>
</Directory>
<Component Id="ApplicationShortcut" Guid="b15e6d69-f054-4ec2-aade-8e3756b537d6">
<Shortcut Id="ApplicationStartMenuShortcut"
Name="Processing"
Description="My Application Description"
Directory="ApplicationProgramsFolder"
Target="[INSTALLFOLDER]\Processing.exe"
WorkingDirectory="INSTALLFOLDER"/>
<RemoveFolder Id="CleanUpShortCut" Directory="ApplicationProgramsFolder" On="uninstall"/>
<RegistryValue Root="HKCU" Key="Software\Processing Foundation\Processing" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
</Component>
</Package>
</Wix>
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

-3
View File
@@ -1,6 +1,3 @@
group = "org.processing"
version = "4.4.0"
plugins {
kotlin("jvm") version libs.versions.kotlin apply false
alias(libs.plugins.kotlinMultiplatform) apply false
+9 -3
View File
@@ -6,8 +6,6 @@ plugins {
alias(libs.plugins.mavenPublish)
}
group = "org.processing"
repositories {
mavenCentral()
maven { url = uri("https://jogamp.org/deployment/maven") }
@@ -23,6 +21,11 @@ sourceSets{
exclude("**/*.java")
}
}
test{
java{
srcDirs("test")
}
}
}
dependencies {
@@ -70,4 +73,7 @@ tasks.test {
}
tasks.withType<Jar> {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
}
tasks.compileJava{
options.encoding = "UTF-8"
}
+3 -1
View File
@@ -7,7 +7,7 @@ jupiter = "5.12.0"
[libraries]
jogl = { module = "org.jogamp.jogl:jogl-all-main", version.ref = "jogl" }
gluegen = { module = "org.jogamp.gluegen:gluegen-rt-main", version.ref = "jogl" }
flatlaf = { module = "com.formdev:flatlaf", version = "3.4.1" }
flatlaf = { module = "com.formdev:flatlaf", version = "2.4" }
jna = { module = "net.java.dev.jna:jna", version = "5.12.1" }
jnaplatform = { module = "net.java.dev.jna:jna-platform", version = "5.12.1" }
compottie = { module = "io.github.alexzhirkevich:compottie", version = "2.0.0-rc02" }
@@ -25,6 +25,8 @@ netbeansSwing = { module = "org.netbeans.api:org-netbeans-swing-outline", versio
ant = { module = "org.apache.ant:ant", version = "1.10.14" }
lsp4j = { module = "org.eclipse.lsp4j:org.eclipse.lsp4j", version = "0.22.0" }
jsoup = { module = "org.jsoup:jsoup", version = "1.17.2" }
markdown = { module = "com.mikepenz:multiplatform-markdown-renderer-m2", version = "0.31.0" }
markdownJVM = { module = "com.mikepenz:multiplatform-markdown-renderer-jvm", version = "0.31.0" }
[plugins]
jetbrainsCompose = { id = "org.jetbrains.compose", version.ref = "compose-plugin" }
-2
View File
@@ -5,8 +5,6 @@ plugins{
id("com.vanniktech.maven.publish") version "0.30.0"
}
group = "org.processing"
repositories{
mavenCentral()
google()
-2
View File
@@ -5,8 +5,6 @@ plugins{
alias(libs.plugins.mavenPublish)
}
group = "org.processing"
repositories{
mavenCentral()
google()