mirror of
https://github.com/arduino/arduino-ide.git
synced 2025-12-14 02:57:15 +00:00
Compare commits
11 Commits
temporary-
...
#2505
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
96e5eae492 | ||
|
|
1fa0fd31c8 | ||
|
|
086f4b825a | ||
|
|
cff91e4215 | ||
|
|
8a83878785 | ||
|
|
46aba1385b | ||
|
|
aa7c6d6976 | ||
|
|
4e684e25fe | ||
|
|
7c9ad70a56 | ||
|
|
4d6cfad0ff | ||
|
|
11b2460199 |
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@@ -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:
|
||||
|
||||
@@ -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",
|
||||
@@ -172,7 +171,7 @@
|
||||
],
|
||||
"arduino": {
|
||||
"arduino-cli": {
|
||||
"version": "1.2.0"
|
||||
"version": "1.3.1"
|
||||
},
|
||||
"arduino-fwuploader": {
|
||||
"version": "2.4.1"
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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<string>(
|
||||
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<void> {
|
||||
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<boolean> {
|
||||
try {
|
||||
const { appVersion } = await this.appService.info();
|
||||
const prevVersion = await this.localStorage.getData<string>(
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,7 +61,6 @@ export class FirstStartupInstaller extends Contribution {
|
||||
try {
|
||||
await this.libraryService.install({
|
||||
item: builtInLibrary,
|
||||
installDependencies: true,
|
||||
noOverwrite: true, // We don't want to automatically replace custom libraries the user might already have in place
|
||||
installLocation: LibraryLocation.BUILTIN,
|
||||
});
|
||||
|
||||
@@ -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<UpdateInfo | undefined> {
|
||||
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<UpdateInfo | undefined> {
|
||||
downloadStarted: true,
|
||||
});
|
||||
this.clearButtons();
|
||||
this.appendDonateFooter();
|
||||
this.updater.downloadUpdate();
|
||||
}
|
||||
|
||||
|
||||
@@ -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<void> {
|
||||
@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 (
|
||||
<div>
|
||||
<p>
|
||||
{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.'
|
||||
)}
|
||||
</p>
|
||||
<p className="bold">
|
||||
{nls.localize(
|
||||
'arduino/versionWelcome/donateMessage2',
|
||||
'Please consider supporting our work on the free open source Arduino IDE.'
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
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<void> {
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -167,23 +167,21 @@ export class LibraryListWidget extends ListWidget<
|
||||
installDependencies = false;
|
||||
}
|
||||
|
||||
if (typeof installDependencies === 'boolean') {
|
||||
await this.service.install({
|
||||
item,
|
||||
version,
|
||||
progressId,
|
||||
installDependencies,
|
||||
});
|
||||
this.messageService.info(
|
||||
nls.localize(
|
||||
'arduino/library/installedSuccessfully',
|
||||
'Successfully installed library {0}:{1}',
|
||||
item.name,
|
||||
version
|
||||
),
|
||||
{ timeout: 3000 }
|
||||
);
|
||||
}
|
||||
await this.service.install({
|
||||
item,
|
||||
version,
|
||||
progressId,
|
||||
noDeps: !installDependencies,
|
||||
});
|
||||
this.messageService.info(
|
||||
nls.localize(
|
||||
'arduino/library/installedSuccessfully',
|
||||
'Successfully installed library {0}:{1}',
|
||||
item.name,
|
||||
version
|
||||
),
|
||||
{ timeout: 3000 }
|
||||
);
|
||||
}
|
||||
|
||||
protected override async uninstall({
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
#version-welcome-dialog-container > .dialogBlock {
|
||||
width: 546px;
|
||||
|
||||
.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
|
||||
@@ -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<Type, string> = {
|
||||
All: All,
|
||||
Updatable: Updatable,
|
||||
Installed: Installed,
|
||||
Arduino: 'Arduino',
|
||||
Contributed: Contributed,
|
||||
'Arduino Certified': nls.localize(
|
||||
|
||||
@@ -27,7 +27,7 @@ export interface LibraryService
|
||||
item: LibraryPackage;
|
||||
progressId?: string;
|
||||
version?: Installable.Version;
|
||||
installDependencies?: boolean;
|
||||
noDeps?: boolean;
|
||||
noOverwrite?: boolean;
|
||||
installLocation?: LibraryLocation.BUILTIN | LibraryLocation.USER;
|
||||
}): Promise<void>;
|
||||
|
||||
@@ -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':
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -306,7 +306,7 @@ export class LibraryServiceImpl
|
||||
item: LibraryPackage;
|
||||
progressId?: string;
|
||||
version?: Installable.Version;
|
||||
installDependencies?: boolean;
|
||||
noDeps?: boolean;
|
||||
noOverwrite?: boolean;
|
||||
installLocation?: LibraryLocation.BUILTIN | LibraryLocation.USER;
|
||||
}): Promise<void> {
|
||||
@@ -321,7 +321,7 @@ export class LibraryServiceImpl
|
||||
req.setInstance(instance);
|
||||
req.setName(item.name);
|
||||
req.setVersion(version);
|
||||
req.setNoDeps(!options.installDependencies);
|
||||
req.setNoDeps(Boolean(options.noDeps));
|
||||
req.setNoOverwrite(Boolean(options.noOverwrite));
|
||||
if (options.installLocation === LibraryLocation.BUILTIN) {
|
||||
req.setInstallLocation(
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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). <br />
|
||||
⚠ 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)
|
||||
|
||||
@@ -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).
|
||||
|
||||
|
||||
@@ -139,7 +139,8 @@
|
||||
"nsis",
|
||||
"zip"
|
||||
],
|
||||
"sign": "./scripts/windowsCustomSign.js"
|
||||
"sign": "./scripts/windowsCustomSign.js",
|
||||
"extraFiles": "resources/PATENT_DISCLAIMER"
|
||||
},
|
||||
"mac": {
|
||||
"darkModeSupport": true,
|
||||
@@ -149,7 +150,8 @@
|
||||
"entitlementsInherit": "resources/entitlements.mac.plist",
|
||||
"target": {
|
||||
"target": "default"
|
||||
}
|
||||
},
|
||||
"extraResources": "resources/PATENT_DISCLAIMER"
|
||||
},
|
||||
"linux": {
|
||||
"target": [
|
||||
@@ -157,7 +159,8 @@
|
||||
"AppImage"
|
||||
],
|
||||
"category": "Development",
|
||||
"icon": "resources/icons"
|
||||
"icon": "resources/icons",
|
||||
"extraFiles": "resources/PATENT_DISCLAIMER"
|
||||
},
|
||||
"msi": {
|
||||
"runAfterFinish": false
|
||||
|
||||
6
electron-app/resources/PATENT_DISCLAIMER
Normal file
6
electron-app/resources/PATENT_DISCLAIMER
Normal file
@@ -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
|
||||
@@ -8,7 +8,5 @@
|
||||
<true/>
|
||||
<key>com.apple.security.cs.disable-library-validation</key>
|
||||
<true/>
|
||||
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -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');
|
||||
|
||||
|
||||
12
i18n/en.json
12
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",
|
||||
@@ -275,9 +276,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 +521,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."
|
||||
}
|
||||
|
||||
@@ -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==
|
||||
|
||||
Reference in New Issue
Block a user