From 0f9f0d07b7d5ff0cdefda3e77eb6b5ce2854c4a8 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Wed, 9 Apr 2025 19:48:50 +0700 Subject: [PATCH 01/16] chore: switch to version 2.3.7 after the release (#2701) --- arduino-ide-extension/package.json | 2 +- electron-app/package.json | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 3d478a88e..ff9a09eff 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide-extension", - "version": "2.3.6", + "version": "2.3.7", "description": "An extension for Theia building the Arduino IDE", "license": "AGPL-3.0-or-later", "scripts": { diff --git a/electron-app/package.json b/electron-app/package.json index 6a31d222a..774fe56bc 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "electron-app", - "version": "2.3.6", + "version": "2.3.7", "license": "AGPL-3.0-or-later", "main": "./src-gen/backend/electron-main.js", "dependencies": { @@ -19,7 +19,7 @@ "@theia/preferences": "1.57.0", "@theia/terminal": "1.57.0", "@theia/workspace": "1.57.0", - "arduino-ide-extension": "2.3.6" + "arduino-ide-extension": "2.3.7" }, "devDependencies": { "@theia/cli": "1.57.0", diff --git a/package.json b/package.json index f71303a0d..8b5356b49 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "arduino-ide", - "version": "2.3.6", + "version": "2.3.7", "description": "Arduino IDE", "repository": "https://github.com/arduino/arduino-ide.git", "author": "Arduino SA", From ee4f74d5662995f9bb09ea9039e3ba3fb828f9ec Mon Sep 17 00:00:00 2001 From: Per Tillisch Date: Wed, 9 Jul 2025 10:38:55 -0700 Subject: [PATCH 02/16] Document localization capabilities in Translator Guide The system used for localization of this project leverages the infrastructure and data that already exists for VS Code. These assets are applicable to Arduino IDE 2.x due to the project being built on the Eclipse Theia IDE framework. In this way, the Arduino IDE developers and community are only responsible for internationalization and localization of the Arduino-specific strings (e.g., "Sketchbook") used in the IDE's UI. The unfortunate downside to this approach is that there is a hard technical limit on localization of the project to languages for which a VS Code "language pack" is available. It will be helpful to clearly communicate the set of languages for which we are able to ship contributions from translators. Likewise, it will be useful to also communicate that, we are able to ship contributions of translations of Arduino CLI user interface strings for any language. This is due to the fact that the Arduino CLI codebase uses a completely different internationalization system that does not impose any technical limits on the scope of localization. --- docs/contributor-guide/translation.md | 32 +++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/docs/contributor-guide/translation.md b/docs/contributor-guide/translation.md index 4b8b82400..9632ae952 100644 --- a/docs/contributor-guide/translation.md +++ b/docs/contributor-guide/translation.md @@ -1,13 +1,41 @@ # Translator Guide -The text of the Arduino IDE interface is translated into several languages. The language can be selected in the dialog opened via **File > Preferences** in the Arduino IDE menus (**Arduino IDE > Preferences** for macOS users). +The text of the Arduino IDE user interface is translated into several languages. The language can be selected in the dialog opened via **File > Preferences** in the Arduino IDE menus (**Arduino IDE > Preferences** for macOS users). Translating text and improving on existing translations is a valuable contribution to the project, helping make Arduino accessible to everyone. -The translations for the text found in the Arduino IDE come from several sources: +The translations for the text found in Arduino IDE come from several sources: ## Arduino IDE Text +The text of the Arduino IDE application can be translated to the following languages: + +- čeština (Czech) +- Deutsch (German) +- Dutch +- español (Spanish) +- français (French) +- italiano (Italian) +- magyar (Hungarian) +- polski (Polish) +- português (Portuguese) +- Türkçe (Turkish) +- български (Bulgarian) +- русский (Russian) +- українська (Ukrainian) +- 한국어 (Korean) +- 中文(简体) (Chinese Simplified) +- 中文(繁體) (Chinese Traditional) +- 日本語 (Japanese) + +--- + +⚠ Unfortunately the 3rd party localization system used by the Arduino IDE application imposes a technical limitation to that set of languages. For this reason, we are unable to add support to Arduino IDE for additional languages (see [`arduino/arduino-ide#1447`](https://github.com/arduino/arduino-ide/issues/1447) for details). + +There is no technical limitation on the set of languages to which **Arduino CLI** can be translated. If you would like to contribute translations for a language not on the above list, you are welcome to [contribute to the **Arduino CLI** project](#arduino-cli-text). + +--- + Translations of Arduino IDE's text is done in the "**Arduino IDE 2.0**" project on the **Transifex** localization platform: https://explore.transifex.com/arduino-1/ide2/ From c1e5fbc8a589642c7b9cca90499c77de1288d961 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Aug 2025 19:12:46 +0000 Subject: [PATCH 03/16] build(deps): Bump actions/download-artifact from 4 to 5 Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 5. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 8 ++++---- .github/workflows/sync-labels.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8d8fb2557..26679ab84 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -444,7 +444,7 @@ jobs: uses: actions/checkout@v4 - name: Download staged-for-merge channel file artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: merge-multiple: true path: ${{ env.CHANNEL_FILES_PATH }} @@ -513,7 +513,7 @@ jobs: steps: - name: Download job transfer artifact that contains ${{ matrix.artifact.name }} tester build - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: name: ${{ env.JOB_TRANSFER_ARTIFACT_PREFIX }}${{ matrix.artifact.job-transfer-artifact-suffix }} path: ${{ env.BUILD_ARTIFACTS_FOLDER }} @@ -600,7 +600,7 @@ jobs: steps: - name: Download all job transfer artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: merge-multiple: true path: ${{ env.ARTIFACTS_FOLDER }} @@ -643,7 +643,7 @@ jobs: steps: - name: Download all job transfer artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: merge-multiple: true path: ${{ env.ARTIFACTS_FOLDER }} diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index 22fa0d0e9..a5f75128e 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -109,7 +109,7 @@ jobs: uses: actions/checkout@v4 - name: Download configuration file artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v5 with: merge-multiple: true pattern: ${{ env.CONFIGURATIONS_ARTIFACT_PREFIX }}* From 3d8f3fa3e39d5ecad57ecd5d5901167ddb7450ab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 01:24:56 +0000 Subject: [PATCH 04/16] build(deps): Bump actions/checkout from 4 to 5 Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 6 +++--- .github/workflows/check-containers.yml | 2 +- .github/workflows/check-i18n-task.yml | 2 +- .github/workflows/check-javascript.yml | 2 +- .github/workflows/check-yarn.yml | 2 +- .github/workflows/compose-full-changelog.yml | 2 +- .github/workflows/i18n-nightly-push.yml | 2 +- .github/workflows/i18n-weekly-pull.yml | 2 +- .github/workflows/push-container-images.yml | 2 +- .github/workflows/sync-labels.yml | 4 ++-- .github/workflows/test-javascript.yml | 2 +- .github/workflows/themes-weekly-pull.yml | 2 +- 12 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 26679ab84..e56db0a40 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -317,7 +317,7 @@ jobs: if not exist "${{ matrix.config.working-directory }}" mklink /d "${{ matrix.config.working-directory }}" "C:\actions-runner\_work\arduino-ide\arduino-ide" - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install Node.js @@ -441,7 +441,7 @@ jobs: echo "CHANNEL_FILES_PATH=${{ runner.temp }}/channel-files" >> "$GITHUB_ENV" - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Download staged-for-merge channel file artifacts uses: actions/download-artifact@v5 @@ -533,7 +533,7 @@ jobs: BODY: ${{ steps.changelog.outputs.BODY }} steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 0 # To fetch all history for all branches and tags. diff --git a/.github/workflows/check-containers.yml b/.github/workflows/check-containers.yml index 964867cdd..a3211e99d 100644 --- a/.github/workflows/check-containers.yml +++ b/.github/workflows/check-containers.yml @@ -40,7 +40,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Build and push to local registry uses: docker/build-push-action@v6 diff --git a/.github/workflows/check-i18n-task.yml b/.github/workflows/check-i18n-task.yml index 3064dc602..42f65c196 100644 --- a/.github/workflows/check-i18n-task.yml +++ b/.github/workflows/check-i18n-task.yml @@ -56,7 +56,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install Node.js 18.17 uses: actions/setup-node@v4 diff --git a/.github/workflows/check-javascript.yml b/.github/workflows/check-javascript.yml index 26720d48b..5a7ec4a51 100644 --- a/.github/workflows/check-javascript.yml +++ b/.github/workflows/check-javascript.yml @@ -65,7 +65,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Node.js uses: actions/setup-node@v4 diff --git a/.github/workflows/check-yarn.yml b/.github/workflows/check-yarn.yml index 019cfec88..5d3e2702a 100644 --- a/.github/workflows/check-yarn.yml +++ b/.github/workflows/check-yarn.yml @@ -64,7 +64,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Node.js uses: actions/setup-node@v4 diff --git a/.github/workflows/compose-full-changelog.yml b/.github/workflows/compose-full-changelog.yml index 0e669cf8f..8cf2ac214 100644 --- a/.github/workflows/compose-full-changelog.yml +++ b/.github/workflows/compose-full-changelog.yml @@ -21,7 +21,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install Node.js uses: actions/setup-node@v4 diff --git a/.github/workflows/i18n-nightly-push.yml b/.github/workflows/i18n-nightly-push.yml index 7b3ba2efc..41cc41764 100644 --- a/.github/workflows/i18n-nightly-push.yml +++ b/.github/workflows/i18n-nightly-push.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install Node.js 18.17 uses: actions/setup-node@v4 diff --git a/.github/workflows/i18n-weekly-pull.yml b/.github/workflows/i18n-weekly-pull.yml index 6d75556d3..fe5692aa4 100644 --- a/.github/workflows/i18n-weekly-pull.yml +++ b/.github/workflows/i18n-weekly-pull.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install Node.js 18.17 uses: actions/setup-node@v4 diff --git a/.github/workflows/push-container-images.yml b/.github/workflows/push-container-images.yml index f6a2c9a5b..03f08ae76 100644 --- a/.github/workflows/push-container-images.yml +++ b/.github/workflows/push-container-images.yml @@ -43,7 +43,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Log in to the Container registry uses: docker/login-action@v3 diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index a5f75128e..bcfa7542a 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -27,7 +27,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Download JSON schema for labels configuration file id: download-schema @@ -106,7 +106,7 @@ jobs: echo "flag=--dry-run" >> $GITHUB_OUTPUT - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Download configuration file artifacts uses: actions/download-artifact@v5 diff --git a/.github/workflows/test-javascript.yml b/.github/workflows/test-javascript.yml index a1665f4f5..1a84c33a4 100644 --- a/.github/workflows/test-javascript.yml +++ b/.github/workflows/test-javascript.yml @@ -82,7 +82,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Setup Node.js uses: actions/setup-node@v4 diff --git a/.github/workflows/themes-weekly-pull.yml b/.github/workflows/themes-weekly-pull.yml index 4daa767ba..86816d10e 100644 --- a/.github/workflows/themes-weekly-pull.yml +++ b/.github/workflows/themes-weekly-pull.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install Node.js uses: actions/setup-node@v4 From 155f0aebaf0e4e77a80f33a3422856ae5d3ad8e7 Mon Sep 17 00:00:00 2001 From: per1234 Date: Fri, 10 Oct 2025 21:52:17 -0700 Subject: [PATCH 05/16] Remove donation links from contributor guide The Arduino company is no longer soliciting monetary donations. Community members who wish to contribute to the project still have opportunities to do so via the other options listed here. --- README.md | 4 ++-- docs/CONTRIBUTING.md | 18 ++++++++---------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index a7a88f491..b5825e18f 100644 --- a/README.md +++ b/README.md @@ -46,9 +46,9 @@ See [**the contributor guide**](docs/CONTRIBUTING.md#contributor-guide) for more See the [**development guide**](docs/development.md) for a technical overview of the application and instructions for building the code. -## Donations +### Support the project -This open source code was written by the Arduino team and is maintained on a daily basis with the help of the community. We invest a considerable amount of time in development, testing and optimization. Please consider [donating](https://www.arduino.cc/en/donate/) or [sponsoring](https://github.com/sponsors/arduino) to support our work, as well as [buying original Arduino boards](https://store.arduino.cc/) which is the best way to make sure our effort can continue in the long term. +This open source code was written by the Arduino team and is maintained on a daily basis with the help of the community. We invest a considerable amount of time in development, testing and optimization. Please consider [buying original Arduino boards](https://store.arduino.cc/) to support our work on the project. ## License diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index a1ca9e0c8..842d0939e 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -6,22 +6,20 @@ Thanks for your interest in contributing to this project! There are several ways you can get involved: -| Type of contribution | Contribution method | -| ----------------------------------------- | -------------------------------------------------------------------------------- | -| - Support
- Question
- Discussion | Post on the [**Arduino Forum**][forum] | -| - Bug report
- Feature request | Issue report (see the guide [**here**][issues]) | -| Testing | Beta testing, PR review (see the guide [**here**][beta-testing]) | -| Translation | See the guide [**here**][translate] | -| - Bug fix
- Enhancement | Pull request (see the guide [**here**][prs]) | -| Monetary | - [Donate][donate]
- [Sponsor][sponsor]
- [Buy official products][store] | +| Type of contribution | Contribution method | +| ----------------------------------------- | ---------------------------------------------------------------- | +| - Support
- Question
- Discussion | Post on the [**Arduino Forum**][forum] | +| - Bug report
- Feature request | Issue report (see the guide [**here**][issues]) | +| Testing | Beta testing, PR review (see the guide [**here**][beta-testing]) | +| Translation | See the guide [**here**][translate] | +| - Bug fix
- Enhancement | Pull request (see the guide [**here**][prs]) | +| Monetary | [Buy official products][store] | [forum]: https://forum.arduino.cc [issues]: contributor-guide/issues.md#issue-report-guide [beta-testing]: contributor-guide/beta-testing.md#beta-testing-guide [translate]: contributor-guide/translation.md#translator-guide [prs]: contributor-guide/pull-requests.md#pull-request-guide -[donate]: https://www.arduino.cc/en/donate/ -[sponsor]: https://github.com/sponsors/arduino [store]: https://store.arduino.cc ## Resources From 93d27ea72aa00509d583cb1f499366b3f9cd76db Mon Sep 17 00:00:00 2001 From: 502E532E <502E532E+github@posteo.org> Date: Wed, 5 Nov 2025 15:56:04 +0000 Subject: [PATCH 06/16] feat: add a copy button to serial monitor (#2718) * Add a copy output button to serial monitor If the arduino collects some data that you want to store on your computer, a rather simple way is to write it to the serial monitor and copy it to the clipboard. This commit introduces a button that copies the whole content of the serial monitor to the clipboard to make this rather simple. It is a new component added to the menu, and does not change the behaviour of other compontents. * Test merging lines to str in serial monitor utils Adds a test for merging one or more lines to a single string. It is supposed to just concatenate the content of the lines, without doing anything else. This method is used when copying the serial monitor content to the clipboard. * Add copy output translation key This serves as an addition to the previous commits. It is the result of running `yarn i18n:generate` on the state after adding the copy output button to the serial monitor (see 2df3f465). I hope that this will resolve the current Github action failure. * Improve readability for serial monitor utils Replace return statement in inline method by direct statement, some minor formatting changes. Does not affect the functionality. * Rename linesToMergedStr in monitor-utils Renames the method linesToMergedStr to joinLines in the serial monitor utils. This brings the name more in line with truncateLines. No functionality changes. * Move label and icon registration for copy serial Moves the registration of the label and icon for the copy output button of the serial monitor to the toolbar item registration. Before, it happened at the command registration, but is not necessary at this level, as the icon and label are meant for the toolbar button only. * Do not update widget when copying output No longer updates the serial monitor output after its content is copied. Copying the content does not change anything for the view, so there is no need to update. --- .../browser/serial/monitor/monitor-utils.ts | 4 ++++ .../monitor/monitor-view-contribution.tsx | 18 ++++++++++++++++++ .../browser/serial/monitor/monitor-widget.tsx | 10 ++++++++++ .../monitor/serial-monitor-send-output.tsx | 8 +++++++- .../src/test/browser/monitor-utils.test.ts | 10 ++++++++++ i18n/en.json | 1 + 6 files changed, 50 insertions(+), 1 deletion(-) diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-utils.ts b/arduino-ide-extension/src/browser/serial/monitor/monitor-utils.ts index 41cb4f450..eca1756f2 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-utils.ts +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-utils.ts @@ -67,3 +67,7 @@ export function truncateLines( } return [lines, charCount]; } + +export function joinLines(lines: Line[]): string { + return lines.map((line: Line) => line.message).join(''); +} \ No newline at end of file diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx b/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx index 98bf53625..3697363ef 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-view-contribution.tsx @@ -52,6 +52,9 @@ export namespace SerialMonitor { }, 'vscode/output.contribution/clearOutput.label' ); + export const COPY_OUTPUT = { + id: 'serial-monitor-copy-output', + }; } } @@ -149,6 +152,12 @@ export class MonitorViewContribution 'Clear Output' ), }); + registry.registerItem({ + id: SerialMonitor.Commands.COPY_OUTPUT.id, + command: SerialMonitor.Commands.COPY_OUTPUT.id, + icon: codicon('copy'), + tooltip: nls.localize('arduino/serial/copyOutput', 'Copy Output'), + }); } override registerCommands(commands: CommandRegistry): void { @@ -161,6 +170,15 @@ export class MonitorViewContribution } }, }); + commands.registerCommand(SerialMonitor.Commands.COPY_OUTPUT, { + isEnabled: (widget) => widget instanceof MonitorWidget, + isVisible: (widget) => widget instanceof MonitorWidget, + execute: (widget) => { + if (widget instanceof MonitorWidget) { + widget.copyOutput(); + } + }, + }); if (this.toggleCommand) { commands.registerCommand(this.toggleCommand, { execute: () => this.toggle(), diff --git a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx index f5c394603..ee39ec228 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/monitor-widget.tsx @@ -28,6 +28,7 @@ import { import { MonitorModel } from '../../monitor-model'; import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; import { serialMonitorWidgetLabel } from '../../../common/nls'; +import { ClipboardService } from '@theia/core/lib/browser/clipboard-service'; @injectable() export class MonitorWidget extends ReactWidget { @@ -47,6 +48,7 @@ export class MonitorWidget extends ReactWidget { */ protected closing = false; protected readonly clearOutputEmitter = new Emitter(); + protected readonly copyOutputEmitter = new Emitter(); @inject(MonitorModel) private readonly monitorModel: MonitorModel; @@ -56,6 +58,8 @@ export class MonitorWidget extends ReactWidget { private readonly boardsServiceProvider: BoardsServiceProvider; @inject(FrontendApplicationStateService) private readonly appStateService: FrontendApplicationStateService; + @inject(ClipboardService) + private readonly clipboardService: ClipboardService; private readonly toDisposeOnReset: DisposableCollection; @@ -102,6 +106,10 @@ export class MonitorWidget extends ReactWidget { this.clearOutputEmitter.fire(undefined); this.update(); } + + copyOutput(): void { + this.copyOutputEmitter.fire(); + } override dispose(): void { this.toDisposeOnReset.dispose(); @@ -247,6 +255,8 @@ export class MonitorWidget extends ReactWidget { monitorModel={this.monitorModel} monitorManagerProxy={this.monitorManagerProxy} clearConsoleEvent={this.clearOutputEmitter.event} + copyOutputEvent={this.copyOutputEmitter.event} + clipboardService={this.clipboardService} height={Math.floor(this.widgetHeight - 50)} /> diff --git a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx index ec2327ad5..f93b24e53 100644 --- a/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx +++ b/arduino-ide-extension/src/browser/serial/monitor/serial-monitor-send-output.tsx @@ -3,9 +3,10 @@ import { Event } from '@theia/core/lib/common/event'; import { DisposableCollection } from '@theia/core/lib/common/disposable'; import { areEqual, FixedSizeList as List } from 'react-window'; import dateFormat from 'dateformat'; -import { messagesToLines, truncateLines } from './monitor-utils'; +import { messagesToLines, truncateLines, joinLines } from './monitor-utils'; import { MonitorManagerProxyClient } from '../../../common/protocol'; import { MonitorModel } from '../../monitor-model'; +import { ClipboardService } from '@theia/core/lib/browser/clipboard-service'; export type Line = { message: string; timestamp?: Date; lineLen: number }; @@ -74,6 +75,9 @@ export class SerialMonitorOutput extends React.Component< this.props.clearConsoleEvent(() => this.setState({ lines: [], charCount: 0 }) ), + this.props.copyOutputEvent(() => + this.props.clipboardService.writeText(joinLines(this.state.lines)) + ), this.props.monitorModel.onChange(({ property }) => { if (property === 'timestamp') { const { timestamp } = this.props.monitorModel; @@ -130,6 +134,8 @@ export namespace SerialMonitorOutput { readonly monitorModel: MonitorModel; readonly monitorManagerProxy: MonitorManagerProxyClient; readonly clearConsoleEvent: Event; + readonly copyOutputEvent: Event; + readonly clipboardService: ClipboardService; readonly height: number; } diff --git a/arduino-ide-extension/src/test/browser/monitor-utils.test.ts b/arduino-ide-extension/src/test/browser/monitor-utils.test.ts index cf1025740..b219ec2ea 100644 --- a/arduino-ide-extension/src/test/browser/monitor-utils.test.ts +++ b/arduino-ide-extension/src/test/browser/monitor-utils.test.ts @@ -2,6 +2,7 @@ import { expect } from 'chai'; import { messagesToLines, truncateLines, + joinLines, } from '../../browser/serial/monitor/monitor-utils'; import { Line } from '../../browser/serial/monitor/serial-monitor-send-output'; import { set, reset } from 'mockdate'; @@ -15,6 +16,7 @@ type TestLine = { charCount: number; maxCharacters?: number; }; + expectedJoined?: string; }; const date = new Date(); @@ -22,6 +24,7 @@ const testLines: TestLine[] = [ { messages: ['Hello'], expected: { lines: [{ message: 'Hello', lineLen: 5 }], charCount: 5 }, + expectedJoined: 'Hello', }, { messages: ['Hello', 'Dog!'], @@ -36,6 +39,7 @@ const testLines: TestLine[] = [ ], charCount: 10, }, + expectedJoined: 'Hello\nDog!' }, { messages: ['Dog!'], @@ -67,6 +71,7 @@ const testLines: TestLine[] = [ { message: "You're a good boy!", lineLen: 8 }, ], }, + expectedJoined: "Hello Dog!\n Who's a good boy?\nYou're a good boy!", }, { messages: ['boy?\n', "You're a good boy!"], @@ -116,6 +121,7 @@ const testLines: TestLine[] = [ { message: 'Yo', lineLen: 2 }, ], }, + expectedJoined: "Hello Dog!\nWho's a good boy?\nYo", }, ]; @@ -165,6 +171,10 @@ describe('Monitor Utils', () => { }); expect(totalCharCount).to.equal(charCount); } + if (testLine.expectedJoined) { + const joined_str = joinLines(testLine.expected.lines); + expect(joined_str).to.equal(testLine.expectedJoined); + } }); }); }); diff --git a/i18n/en.json b/i18n/en.json index e6dbab0c0..5e3d19be2 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -435,6 +435,7 @@ "autoscroll": "Autoscroll", "carriageReturn": "Carriage Return", "connecting": "Connecting to '{0}' on '{1}'...", + "copyOutput": "Copy Output", "message": "Message (Enter to send message to '{0}' on '{1}')", "newLine": "New Line", "newLineCarriageReturn": "Both NL & CR", From 11b246019961a6596837e303e61fb08d446bce9a Mon Sep 17 00:00:00 2001 From: AK <242477691+aknshr@users.noreply.github.com> Date: Wed, 12 Nov 2025 16:55:45 -0300 Subject: [PATCH 07/16] Update links in CONTRIBUTING.md Prefix links with "/docs/" so they work in the Contributing tab --- docs/CONTRIBUTING.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 842d0939e..1221ce9f2 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -16,12 +16,12 @@ There are several ways you can get involved: | Monetary | [Buy official products][store] | [forum]: https://forum.arduino.cc -[issues]: contributor-guide/issues.md#issue-report-guide -[beta-testing]: contributor-guide/beta-testing.md#beta-testing-guide -[translate]: contributor-guide/translation.md#translator-guide -[prs]: contributor-guide/pull-requests.md#pull-request-guide +[issues]: /docs/contributor-guide/issues.md#issue-report-guide +[beta-testing]: /docs/contributor-guide/beta-testing.md#beta-testing-guide +[translate]: /docs/contributor-guide/translation.md#translator-guide +[prs]: /docs/contributor-guide/pull-requests.md#pull-request-guide [store]: https://store.arduino.cc ## Resources -- [**Development Guide**](development.md#development-guide) +- [**Development Guide**](/docs/development.md#development-guide) From 4d6cfad0ff603a106efd68ffe015d6fc7449f5fc Mon Sep 17 00:00:00 2001 From: Sebastian Romero Date: Tue, 18 Nov 2025 00:13:45 +0100 Subject: [PATCH 08/16] Update translation.md for clarity on language support (#2814) Clarified the limitations of the Arduino IDE localization framework and added information about future language support. --- docs/contributor-guide/translation.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/contributor-guide/translation.md b/docs/contributor-guide/translation.md index 9632ae952..637b03f66 100644 --- a/docs/contributor-guide/translation.md +++ b/docs/contributor-guide/translation.md @@ -30,7 +30,9 @@ The text of the Arduino IDE application can be translated to the following langu --- -⚠ Unfortunately the 3rd party localization system used by the Arduino IDE application imposes a technical limitation to that set of languages. For this reason, we are unable to add support to Arduino IDE for additional languages (see [`arduino/arduino-ide#1447`](https://github.com/arduino/arduino-ide/issues/1447) for details). +⚠ Unfortunately the 3rd party localization framework used by the Arduino IDE application imposes a technical restriction to that set of languages. Unless a language is supported by that framework, it cannot be supported in the Arduino IDE. For this reason, we are currently unable to add support to Arduino IDE for additional languages (see [`arduino/arduino-ide#1447`](https://github.com/arduino/arduino-ide/issues/1447) for details). +If a new language becomes available through the said framework, it will be added to the above list. When that happens, we may consider adding support for that language to Arduino IDE. +Meanwhile we will continue to accept contributions for other languages, but be aware that we cannot say if and when those languages will become available in Arduino IDE. There is no technical limitation on the set of languages to which **Arduino CLI** can be translated. If you would like to contribute translations for a language not on the above list, you are welcome to [contribute to the **Arduino CLI** project](#arduino-cli-text). From 7c9ad70a56d30ef9f905993c803631ac4cbfcda0 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Fri, 5 Dec 2025 16:09:44 +0300 Subject: [PATCH 09/16] Add AOM disclaimer (#2824) --- electron-app/PATENT_DISCLAIMER | 6 ++++++ electron-app/package.json | 1 + 2 files changed, 7 insertions(+) create mode 100644 electron-app/PATENT_DISCLAIMER diff --git a/electron-app/PATENT_DISCLAIMER b/electron-app/PATENT_DISCLAIMER new file mode 100644 index 000000000..011eea6ac --- /dev/null +++ b/electron-app/PATENT_DISCLAIMER @@ -0,0 +1,6 @@ +Qualcomm neither accepts, nor undertakes any action to satisfy conditions in +support of the acceptance of, the Alliance for Open Media Patent License 1.0. +The license text has been retained for the benefit of our customers and +partners, so that they receive proper notice of the license that is available +to them by the Licensors under the AOM Patent License 1.0. +See also: https://www.qualcomm.com/content/dam/qcomm-martech/dm-assets/documents/AOM-Statement.pdf \ No newline at end of file diff --git a/electron-app/package.json b/electron-app/package.json index 774fe56bc..10c77a549 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -127,6 +127,7 @@ "resources/icons/512x512.png", "!**node_modules/**" ], + "extraFiles": "PATENT_DISCLAIMER", "extraResources": [ { "from": "plugins", From 4e684e25fe88cb80d58db51664d37d34e088622e Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Fri, 5 Dec 2025 19:27:38 +0300 Subject: [PATCH 10/16] fix: move `PATENT_DISCLAIMER` in resources folder in MacOS (#2825) --- electron-app/package.json | 10 ++++++---- electron-app/{ => resources}/PATENT_DISCLAIMER | 0 2 files changed, 6 insertions(+), 4 deletions(-) rename electron-app/{ => resources}/PATENT_DISCLAIMER (100%) diff --git a/electron-app/package.json b/electron-app/package.json index 10c77a549..6c77ed981 100644 --- a/electron-app/package.json +++ b/electron-app/package.json @@ -127,7 +127,6 @@ "resources/icons/512x512.png", "!**node_modules/**" ], - "extraFiles": "PATENT_DISCLAIMER", "extraResources": [ { "from": "plugins", @@ -140,7 +139,8 @@ "nsis", "zip" ], - "sign": "./scripts/windowsCustomSign.js" + "sign": "./scripts/windowsCustomSign.js", + "extraFiles": "resources/PATENT_DISCLAIMER" }, "mac": { "darkModeSupport": true, @@ -150,7 +150,8 @@ "entitlementsInherit": "resources/entitlements.mac.plist", "target": { "target": "default" - } + }, + "extraResources": "resources/PATENT_DISCLAIMER" }, "linux": { "target": [ @@ -158,7 +159,8 @@ "AppImage" ], "category": "Development", - "icon": "resources/icons" + "icon": "resources/icons", + "extraFiles": "resources/PATENT_DISCLAIMER" }, "msi": { "runAfterFinish": false diff --git a/electron-app/PATENT_DISCLAIMER b/electron-app/resources/PATENT_DISCLAIMER similarity index 100% rename from electron-app/PATENT_DISCLAIMER rename to electron-app/resources/PATENT_DISCLAIMER From aa7c6d6976619f419df1e1cc7cf0f3103046de2f Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Fri, 5 Dec 2025 19:29:02 +0300 Subject: [PATCH 11/16] feat: use Arduino CLI 1.3.1 (#2806) --- arduino-ide-extension/package.json | 2 +- .../node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts | 1 + .../src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index ff9a09eff..cda0ebf77 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -172,7 +172,7 @@ ], "arduino": { "arduino-cli": { - "version": "1.2.0" + "version": "1.3.1" }, "arduino-fwuploader": { "version": "2.4.1" diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts index c5401953e..a844e8303 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.d.ts @@ -1139,4 +1139,5 @@ export enum LibraryLocation { LIBRARY_LOCATION_PLATFORM_BUILTIN = 2, LIBRARY_LOCATION_REFERENCED_PLATFORM_BUILTIN = 3, LIBRARY_LOCATION_UNMANAGED = 4, + LIBRARY_LOCATION_PROFILE = 5, } diff --git a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js index 74e4f2818..c8f36e422 100644 --- a/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js +++ b/arduino-ide-extension/src/node/cli-protocol/cc/arduino/cli/commands/v1/lib_pb.js @@ -8652,7 +8652,8 @@ proto.cc.arduino.cli.commands.v1.LibraryLocation = { LIBRARY_LOCATION_USER: 1, LIBRARY_LOCATION_PLATFORM_BUILTIN: 2, LIBRARY_LOCATION_REFERENCED_PLATFORM_BUILTIN: 3, - LIBRARY_LOCATION_UNMANAGED: 4 + LIBRARY_LOCATION_UNMANAGED: 4, + LIBRARY_LOCATION_PROFILE: 5 }; goog.object.extend(exports, proto.cc.arduino.cli.commands.v1); From 46aba1385b1598268884f947a9a3dd437969cad2 Mon Sep 17 00:00:00 2001 From: Bernardo Gomes Date: Tue, 9 Dec 2025 14:17:12 -0300 Subject: [PATCH 12/16] docs: add Wayland troubleshooting guide for Linux users (#2821) Add comprehensive troubleshooting section for Wayland display server issues on Linux. This addresses common crashes and initialization failures experienced by users on Wayland compositors (Hyprland, Sway, KDE Plasma, GNOME). The guide provides two workarounds to force X11/XWayland backend: - Environment variable method (ELECTRON_OZONE_PLATFORM_HINT) - Command line flag method (--ozone-platform=x11) References: - Fixes #2759 - Related to #2107 --- docs/advanced-usage.md | 50 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index a21dad1a1..236ba289d 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -66,3 +66,53 @@ If you later decide you would like to remove a 3rd party theme you installed, it 1. If Arduino IDE is running, select **File > Quit** from the Arduino IDE menus to exit all windows. 1. Delete the theme's `.vsix` file from [the location you installed it to](#installation).
⚠ Please be careful when deleting things from your computer. When in doubt, back up! + +## Troubleshooting + +### Linux: Wayland Display Server Issues + +Arduino IDE is built on [Electron](https://www.electronjs.org/), which attempts to use native Wayland rendering on Linux systems with Wayland display servers. However, some Wayland compositors (particularly Hyprland, Sway, and some configurations of KDE Plasma and GNOME) may experience crashes or initialization failures with errors such as: + +``` +Failed to connect to Wayland display +Failed to initialize Wayland platform +The platform failed to initialize. Exiting. +``` + +Or segmentation faults immediately after launching. + +#### Workaround: Force X11/XWayland Backend + +If you encounter Wayland-related crashes, you can force Arduino IDE to use the X11/XWayland backend instead of native Wayland rendering: + +**Method 1: Environment Variable (Recommended)** + +Set the `ELECTRON_OZONE_PLATFORM_HINT` environment variable before launching Arduino IDE: + +```bash +export ELECTRON_OZONE_PLATFORM_HINT=x11 +arduino-ide +``` + +To make this permanent, add the export line to your shell configuration file (`~/.bashrc`, `~/.zshrc`, or equivalent). + +**Method 2: Command Line Flag** + +Launch Arduino IDE with the `--ozone-platform=x11` flag: + +```bash +arduino-ide --ozone-platform=x11 +``` + +You can create a wrapper script or shell alias for convenience: + +```bash +# Add to ~/.bashrc or ~/.zshrc +alias arduino-ide='arduino-ide --ozone-platform=x11' +``` + +#### Related Issues + +For more information and updates on native Wayland support, see: +- [Issue #2759: Segmentation fault when launching Arduino IDE](https://github.com/arduino/arduino-ide/issues/2759) +- [Issue #2107: IDE crashes with segmentation fault when run under native Wayland](https://github.com/arduino/arduino-ide/issues/2107) From 8a8387878520dd38fbfb969e3d4ebadd044cade7 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Tue, 9 Dec 2025 20:17:40 +0300 Subject: [PATCH 13/16] chore: use `macos-15-intel` runner for MacOS x86_64 builds (#2828) --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e56db0a40..ed67fa6ff 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -103,7 +103,7 @@ env: name: Linux_X86-64_app_image - config: name: macOS x86 - runs-on: macos-13 + runs-on: macos-15-intel container: | null # APPLE_SIGNING_CERTIFICATE_P12 secret was produced by following the procedure from: From cff91e421510f3193632e6fd54531446394af532 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Wed, 10 Dec 2025 11:55:30 +0300 Subject: [PATCH 14/16] chore: remove welcome dialog and donation links (#2808) * chore: remove donation dialog and links * chore: remove unused dompurify package --- arduino-ide-extension/package.json | 1 - .../browser/arduino-ide-frontend-module.ts | 9 -- .../contributions/check-for-ide-updates.ts | 43 ++----- .../ide-updater/ide-updater-dialog.tsx | 47 -------- .../dialogs/version-welcome-dialog.tsx | 107 ------------------ .../src/browser/style/ide-updater-dialog.css | 32 ------ .../src/browser/style/index.css | 1 - .../browser/style/version-welcome-dialog.css | 7 -- i18n/en.json | 11 -- yarn.lock | 2 +- 10 files changed, 8 insertions(+), 252 deletions(-) delete mode 100644 arduino-ide-extension/src/browser/dialogs/version-welcome-dialog.tsx delete mode 100644 arduino-ide-extension/src/browser/style/version-welcome-dialog.css diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index cda0ebf77..d51caa46d 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -67,7 +67,6 @@ "cross-fetch": "^3.1.5", "dateformat": "^3.0.3", "deepmerge": "^4.2.2", - "dompurify": "^2.4.7", "drivelist": "^9.2.4", "electron-updater": "^4.6.5", "fast-deep-equal": "^3.1.3", diff --git a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts index 9625ffae5..bc0caaee1 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -368,10 +368,6 @@ import { DebugConfigurationWidget } from './theia/debug/debug-configuration-widg import { DebugConfigurationWidget as TheiaDebugConfigurationWidget } from '@theia/debug/lib/browser/view/debug-configuration-widget'; import { DebugToolBar } from '@theia/debug/lib/browser/view/debug-toolbar-widget'; -import { - VersionWelcomeDialog, - VersionWelcomeDialogProps, -} from './dialogs/version-welcome-dialog'; import { TestViewContribution as TheiaTestViewContribution } from '@theia/test/lib/browser/view/test-view-contribution'; import { TestViewContribution } from './theia/test/test-view-contribution'; @@ -987,11 +983,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { title: 'IDEUpdater', }); - bind(VersionWelcomeDialog).toSelf().inSingletonScope(); - bind(VersionWelcomeDialogProps).toConstantValue({ - title: 'VersionWelcomeDialog', - }); - bind(UserFieldsDialog).toSelf().inSingletonScope(); bind(UserFieldsDialogProps).toConstantValue({ title: 'UserFields', diff --git a/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts b/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts index a2f76d15f..09087ab96 100644 --- a/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts +++ b/arduino-ide-extension/src/browser/contributions/check-for-ide-updates.ts @@ -8,7 +8,6 @@ import { } from '../../common/protocol/ide-updater'; import { IDEUpdaterDialog } from '../dialogs/ide-updater/ide-updater-dialog'; import { Contribution } from './contribution'; -import { VersionWelcomeDialog } from '../dialogs/version-welcome-dialog'; import { AppService } from '../app-service'; import { SemVer } from 'semver'; @@ -20,9 +19,6 @@ export class CheckForIDEUpdates extends Contribution { @inject(IDEUpdaterDialog) private readonly updaterDialog: IDEUpdaterDialog; - @inject(VersionWelcomeDialog) - private readonly versionWelcomeDialog: VersionWelcomeDialog; - @inject(LocalStorageService) private readonly localStorage: LocalStorageService; @@ -59,13 +55,8 @@ export class CheckForIDEUpdates extends Contribution { return this.updater.checkForUpdates(true); }) .then(async (updateInfo) => { - if (!updateInfo) { - const isNewVersion = await this.isNewStableVersion(); - if (isNewVersion) { - this.versionWelcomeDialog.open(); - } - return; - } + if (!updateInfo) return; + const versionToSkip = await this.localStorage.getData( SKIP_IDE_VERSION ); @@ -86,6 +77,11 @@ export class CheckForIDEUpdates extends Contribution { }); } + /** + * This value is set in localStorage but currently not used. + * We keep this logic running anyway for eventual future needs + * (eg. show a new version welcome dialog) + */ private async setCurrentIDEVersion(): Promise { try { const { appVersion } = await this.appService.info(); @@ -95,29 +91,4 @@ export class CheckForIDEUpdates extends Contribution { // ignore invalid versions } } - - /** - * Check if user is running a new IDE version for the first time. - * @returns true if the current IDE version is greater than the last used version - * and both are non-prerelease versions. - */ - private async isNewStableVersion(): Promise { - try { - const { appVersion } = await this.appService.info(); - const prevVersion = await this.localStorage.getData( - LAST_USED_IDE_VERSION - ); - - const prevSemVer = new SemVer(prevVersion ?? ''); - const currSemVer = new SemVer(appVersion ?? ''); - - if (prevSemVer.prerelease.length || currSemVer.prerelease.length) { - return false; - } - - return currSemVer.compare(prevSemVer) === 1; - } catch (e) { - return false; - } - } } diff --git a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx index 52eebd9c5..54517ce23 100644 --- a/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/ide-updater/ide-updater-dialog.tsx @@ -17,7 +17,6 @@ import { } from '../../../common/protocol/ide-updater'; import { LocalStorageService } from '@theia/core/lib/browser'; import { WindowService } from '@theia/core/lib/browser/window/window-service'; -import { sanitize } from 'dompurify'; @injectable() export class IDEUpdaterDialogProps extends DialogProps {} @@ -166,51 +165,6 @@ export class IDEUpdaterDialog extends ReactDialog { goToDownloadPageButton.focus(); } - private appendDonateFooter() { - const footer = document.createElement('div'); - footer.classList.add('ide-updater-dialog--footer'); - const footerContent = document.createElement('div'); - footerContent.classList.add('ide-updater-dialog--footer-content'); - footer.appendChild(footerContent); - - const footerLink = document.createElement('a'); - footerLink.innerText = sanitize( - nls.localize('arduino/ide-updater/donateLinkText', 'donate to support us') - ); - footerLink.classList.add('ide-updater-dialog--footer-link'); - footerLink.onclick = () => - this.openExternal('https://www.arduino.cc/en/donate'); - - const footerLinkIcon = document.createElement('span'); - footerLinkIcon.title = nls.localize( - 'arduino/ide-updater/donateLinkIconTitle', - 'open donation page' - ); - footerLinkIcon.classList.add('ide-updater-dialog--footer-link-icon'); - footerLink.appendChild(footerLinkIcon); - - const placeholderKey = '%%link%%'; - const footerText = sanitize( - nls.localize( - 'arduino/ide-updater/donateText', - 'Open source is love, {0}', - placeholderKey - ) - ); - const placeholder = footerText.indexOf(placeholderKey); - if (placeholder !== -1) { - const parts = footerText.split(placeholderKey); - footerContent.appendChild(document.createTextNode(parts[0])); - footerContent.appendChild(footerLink); - footerContent.appendChild(document.createTextNode(parts[1])); - } else { - footerContent.appendChild(document.createTextNode(footerText)); - footerContent.appendChild(footerLink); - } - - this.controlPanel.insertAdjacentElement('afterend', footer); - } - private openDownloadPage(): void { this.openExternal('https://www.arduino.cc/en/software'); this.close(); @@ -233,7 +187,6 @@ export class IDEUpdaterDialog extends ReactDialog { downloadStarted: true, }); this.clearButtons(); - this.appendDonateFooter(); this.updater.downloadUpdate(); } diff --git a/arduino-ide-extension/src/browser/dialogs/version-welcome-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/version-welcome-dialog.tsx deleted file mode 100644 index 380d980df..000000000 --- a/arduino-ide-extension/src/browser/dialogs/version-welcome-dialog.tsx +++ /dev/null @@ -1,107 +0,0 @@ -import React from '@theia/core/shared/react'; -import { inject, injectable } from '@theia/core/shared/inversify'; -import { Message } from '@theia/core/shared/@phosphor/messaging'; -import { ReactDialog } from '../theia/dialogs/dialogs'; -import { nls } from '@theia/core'; -import { DialogProps } from '@theia/core/lib/browser'; -import { WindowService } from '@theia/core/lib/browser/window/window-service'; -import { AppService } from '../app-service'; -import { sanitize } from 'dompurify'; - -@injectable() -export class VersionWelcomeDialogProps extends DialogProps {} - -@injectable() -export class VersionWelcomeDialog extends ReactDialog { - @inject(AppService) - private readonly appService: AppService; - - @inject(WindowService) - private readonly windowService: WindowService; - - constructor( - @inject(VersionWelcomeDialogProps) - protected override readonly props: VersionWelcomeDialogProps - ) { - super({ - title: nls.localize( - 'arduino/versionWelcome/title', - 'Welcome to a new version of the Arduino IDE!' - ), - }); - this.node.id = 'version-welcome-dialog-container'; - this.contentNode.classList.add('version-welcome-dialog'); - } - - protected render(): React.ReactNode { - return ( -
-

- {nls.localize( - 'arduino/versionWelcome/donateMessage', - 'Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.' - )} -

-

- {nls.localize( - 'arduino/versionWelcome/donateMessage2', - 'Please consider supporting our work on the free open source Arduino IDE.' - )} -

-
- ); - } - - override get value(): void { - return; - } - - private appendButtons(): void { - const cancelButton = this.createButton( - nls.localize('arduino/versionWelcome/cancelButton', 'Maybe later') - ); - cancelButton.classList.add('secondary'); - cancelButton.classList.add('cancel-button'); - this.addAction(cancelButton, this.close.bind(this), 'click'); - this.controlPanel.appendChild(cancelButton); - - const donateButton = this.createButton( - nls.localize('arduino/versionWelcome/donateButton', 'Donate now') - ); - this.addAction(donateButton, this.onDonateButtonClick.bind(this), 'click'); - this.controlPanel.appendChild(donateButton); - donateButton.focus(); - } - - private onDonateButtonClick(): void { - this.openDonationPage(); - this.close(); - } - - private readonly openDonationPage = () => { - const url = 'https://www.arduino.cc/en/donate'; - this.windowService.openNewWindow(url, { external: true }); - }; - - private async updateTitleVersion(): Promise { - const appInfo = await this.appService.info(); - const { appVersion } = appInfo; - - if (appVersion) { - this.titleNode.innerText = sanitize( - nls.localize( - 'arduino/versionWelcome/titleWithVersion', - 'Welcome to the new Arduino IDE {0}!', - appVersion - ) - ); - } - } - - protected override onAfterAttach(msg: Message): void { - this.update(); - this.appendButtons(); - this.updateTitleVersion(); - super.onAfterAttach(msg); - } -} diff --git a/arduino-ide-extension/src/browser/style/ide-updater-dialog.css b/arduino-ide-extension/src/browser/style/ide-updater-dialog.css index 8d722c9d1..5d5592baf 100644 --- a/arduino-ide-extension/src/browser/style/ide-updater-dialog.css +++ b/arduino-ide-extension/src/browser/style/ide-updater-dialog.css @@ -34,37 +34,6 @@ min-width: 0; } -.ide-updater-dialog--footer { - display: inline-block; - margin-top: -16px; - padding: 12px 0 24px 0; - border-top: 1px solid var(--theia-editorWidget-border); -} -.ide-updater-dialog--footer-content { - float: right; -} - -.ide-updater-dialog--footer-link { - display: inline-block; - color: var(--theia-textLink-foreground); - font-weight: 500; - line-height: 13px; -} -.ide-updater-dialog--footer-link:hover { - color: var(--theia-textLink-foreground); - cursor: pointer; -} -.ide-updater-dialog--footer-link-icon { - display: inline-block; - -webkit-mask: url(../icons/link-open-icon.svg) center no-repeat; - background-color: var(--theia-textLink-foreground); - height: 12px; - width: 12px; - cursor: pointer; - transform: translateY(2px); - margin-left: 4px; -} - .ide-updater-dialog .changelog { color: var(--theia-editor-foreground); background-color: var(--theia-editor-background); @@ -140,7 +109,6 @@ max-height: 100%; overflow: hidden; display: flex; - padding-bottom: 20px !important; } #ide-updater-dialog-container .skip-version-button { diff --git a/arduino-ide-extension/src/browser/style/index.css b/arduino-ide-extension/src/browser/style/index.css index 593cf1eaf..fd7887ae1 100644 --- a/arduino-ide-extension/src/browser/style/index.css +++ b/arduino-ide-extension/src/browser/style/index.css @@ -10,7 +10,6 @@ @import "./settings-dialog.css"; @import "./firmware-uploader-dialog.css"; @import "./ide-updater-dialog.css"; -@import "./version-welcome-dialog.css"; @import "./certificate-uploader-dialog.css"; @import "./user-fields-dialog.css"; @import "./debug.css"; diff --git a/arduino-ide-extension/src/browser/style/version-welcome-dialog.css b/arduino-ide-extension/src/browser/style/version-welcome-dialog.css deleted file mode 100644 index 80d6f71e4..000000000 --- a/arduino-ide-extension/src/browser/style/version-welcome-dialog.css +++ /dev/null @@ -1,7 +0,0 @@ -#version-welcome-dialog-container > .dialogBlock { - width: 546px; - - .bold { - font-weight: bold; - } -} diff --git a/i18n/en.json b/i18n/en.json index 5e3d19be2..f6e559cca 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -275,9 +275,6 @@ "checkForUpdates": "Check for Arduino IDE Updates", "closeAndInstallButton": "Close and Install", "closeToInstallNotice": "Close the software and install the update on your machine.", - "donateLinkIconTitle": "open donation page", - "donateLinkText": "donate to support us", - "donateText": "Open source is love, {0}", "downloadButton": "Download", "downloadingNotice": "Downloading the latest version of the Arduino IDE.", "errorCheckingForUpdates": "Error while checking for Arduino IDE updates.\n{0}", @@ -523,14 +520,6 @@ "renameSketchFolderMessage": "The sketch '{0}' cannot be used. {1} To get rid of this message, rename the sketch. Do you want to rename the sketch now?", "renameSketchFolderTitle": "Invalid sketch name" }, - "versionWelcome": { - "cancelButton": "Maybe later", - "donateButton": "Donate now", - "donateMessage": "Arduino is committed to keeping software free and open-source for everyone. Your donation helps us develop new features, improve libraries, and support millions of users worldwide.", - "donateMessage2": "Please consider supporting our work on the free open source Arduino IDE.", - "title": "Welcome to a new version of the Arduino IDE!", - "titleWithVersion": "Welcome to the new Arduino IDE {0}!" - }, "workspace": { "alreadyExists": "'{0}' already exists." } diff --git a/yarn.lock b/yarn.lock index 87c12c1f0..ff680ad33 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5912,7 +5912,7 @@ domexception@^4.0.0: dependencies: webidl-conversions "^7.0.0" -dompurify@^2.2.9, dompurify@^2.4.7: +dompurify@^2.2.9: version "2.5.8" resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.5.8.tgz#2809d89d7e528dc7a071dea440d7376df676f824" integrity sha512-o1vSNgrmYMQObbSSvF/1brBYEQPHhV1+gsmrusO7/GXtp1T9rCS8cXFqVxK/9crT1jA6Ccv+5MTSjBNqr7Sovw== From 086f4b825acee333f7e16c32d109fe058e95e4e1 Mon Sep 17 00:00:00 2001 From: AK <242477691+aknshr@users.noreply.github.com> Date: Wed, 10 Dec 2025 06:23:01 -0300 Subject: [PATCH 15/16] Add "installed" filter in boards manager (#2812) --- arduino-ide-extension/src/common/nls.ts | 1 + arduino-ide-extension/src/common/protocol/boards-service.ts | 3 +++ arduino-ide-extension/src/node/boards-service-impl.ts | 2 ++ i18n/en.json | 1 + 4 files changed, 7 insertions(+) diff --git a/arduino-ide-extension/src/common/nls.ts b/arduino-ide-extension/src/common/nls.ts index 7514a45c8..cf286d0fc 100644 --- a/arduino-ide-extension/src/common/nls.ts +++ b/arduino-ide-extension/src/common/nls.ts @@ -4,6 +4,7 @@ import { nls } from '@theia/core/lib/common/nls'; export const Unknown = nls.localize('arduino/common/unknown', 'Unknown'); export const Later = nls.localize('arduino/common/later', 'Later'); export const Updatable = nls.localize('arduino/common/updateable', 'Updatable'); +export const Installed = nls.localize('arduino/common/installed', 'Installed'); export const All = nls.localize('arduino/common/all', 'All'); export const Type = nls.localize('arduino/common/type', 'Type'); export const Partner = nls.localize('arduino/common/partner', 'Partner'); diff --git a/arduino-ide-extension/src/common/protocol/boards-service.ts b/arduino-ide-extension/src/common/protocol/boards-service.ts index a97dc9057..b41717ec4 100644 --- a/arduino-ide-extension/src/common/protocol/boards-service.ts +++ b/arduino-ide-extension/src/common/protocol/boards-service.ts @@ -8,6 +8,7 @@ import { Partner, Type as TypeLabel, Updatable, + Installed } from '../nls'; import type { Defined } from '../types'; import { naturalCompare } from './../utils'; @@ -113,6 +114,7 @@ export namespace BoardSearch { export const TypeLiterals = [ 'All', 'Updatable', + 'Installed', 'Arduino', 'Contributed', 'Arduino Certified', @@ -128,6 +130,7 @@ export namespace BoardSearch { export const TypeLabels: Record = { All: All, Updatable: Updatable, + Installed: Installed, Arduino: 'Arduino', Contributed: Contributed, 'Arduino Certified': nls.localize( diff --git a/arduino-ide-extension/src/node/boards-service-impl.ts b/arduino-ide-extension/src/node/boards-service-impl.ts index a5572a1f6..76d446453 100644 --- a/arduino-ide-extension/src/node/boards-service-impl.ts +++ b/arduino-ide-extension/src/node/boards-service-impl.ts @@ -423,6 +423,8 @@ export class BoardsServiceImpl switch (options.type) { case 'Updatable': return Installable.Updateable; + case 'Installed': + return Installable.Installed; case 'Arduino': case 'Partner': case 'Arduino@Heart': diff --git a/i18n/en.json b/i18n/en.json index f6e559cca..4e735fb78 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -140,6 +140,7 @@ "all": "All", "contributed": "Contributed", "installManually": "Install Manually", + "installed": "Installed", "later": "Later", "noBoardSelected": "No board selected", "noSketchOpened": "No sketch opened", From 1fa0fd31c8d6b62f19332e33713a8c5b0f4ed6f9 Mon Sep 17 00:00:00 2001 From: Giacomo Cusinato <7659518+giacomocusinato@users.noreply.github.com> Date: Wed, 10 Dec 2025 10:45:51 +0100 Subject: [PATCH 16/16] chore: macOS build security review (#2805) * chore: remove `allow-dyld-environment-variables` entitlement * fix: bundle theia native dependencies with stricter permissions --- electron-app/resources/entitlements.mac.plist | 2 -- electron-app/webpack.config.js | 23 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/electron-app/resources/entitlements.mac.plist b/electron-app/resources/entitlements.mac.plist index be8b7163d..46f675661 100644 --- a/electron-app/resources/entitlements.mac.plist +++ b/electron-app/resources/entitlements.mac.plist @@ -8,7 +8,5 @@ com.apple.security.cs.disable-library-validation - com.apple.security.cs.allow-dyld-environment-variables - diff --git a/electron-app/webpack.config.js b/electron-app/webpack.config.js index d259e150e..4b18cc3be 100644 --- a/electron-app/webpack.config.js +++ b/electron-app/webpack.config.js @@ -1,5 +1,7 @@ const path = require('node:path'); +const fs = require('fs'); const webpack = require('webpack'); +const TheiaNativeWebpackPlugin = require('@theia/native-webpack-plugin'); const frontend = require('./gen-webpack.config'); const backend = require('./gen-webpack.node.config'); const { @@ -39,6 +41,27 @@ backend.config.entry['parcel-watcher'] = { }, }; +// Override Theia native dependency bundler to assign stricter file permissions (chmod 755) +// https://github.com/eclipse-theia/theia/blob/9a52544fb4c1ea1d3d0d6bcbe106b97184279030/dev-packages/native-webpack-plugin/src/native-webpack-plugin.ts#L149 +class NativeWebpackPlugin extends TheiaNativeWebpackPlugin { + // Override the method that writes/copies files + async copyExecutable(source, target) { + const targetDirectory = path.dirname(target); + await fs.promises.mkdir(targetDirectory, { recursive: true }); + await fs.promises.copyFile(source, target); + await fs.promises.chmod(target, 0o755); + } +} +backend.config.plugins.push(new NativeWebpackPlugin({ + out: 'native', + trash: true, + ripgrep: true, + pty: true, + nativeBindings: { + drivelist: 'drivelist/build/Release/drivelist.node', + }, +})); + // Use a customized backend main that can enable the file logger in bundled mode. backend.config.entry['main'] = require.resolve('./arduino-ide-backend-main.js');