@theia/core
Version:
Theia is a cloud & desktop IDE framework implemented in TypeScript.
164 lines • 8.14 kB
TypeScript
/// <reference types="node" />
import { BrowserWindow, WebContents, Event as ElectronEvent } from '../../electron-shared/electron';
import { ForkOptions } from 'child_process';
import { FrontendApplicationConfig } from '@theia/application-package/lib/application-props';
import URI from '../common/uri';
import { Deferred } from '../common/promise-util';
import { MaybePromise } from '../common/types';
import { ContributionProvider } from '../common/contribution-provider';
import { ElectronSecurityTokenService } from './electron-security-token-service';
import { ElectronSecurityToken } from '../electron-common/electron-token';
import Storage = require('electron-store');
import { WindowSearchParams } from '../common/window';
import { TheiaBrowserWindowOptions, TheiaElectronWindow, TheiaElectronWindowFactory } from './theia-electron-window';
import { ElectronMainApplicationGlobals } from './electron-main-constants';
export { ElectronMainApplicationGlobals };
/**
* Options passed to the main/default command handler.
*/
export interface ElectronMainCommandOptions {
/**
* By default, the first positional argument. Should be either a relative or absolute file-system path pointing to a file or a folder.
*/
readonly file?: string;
}
/**
* Fields related to a launch event.
*
* This kind of event is triggered in two different contexts:
* 1. The app is launched for the first time, `secondInstance` is false.
* 2. The app is already running but user relaunches it, `secondInstance` is true.
*/
export interface ElectronMainExecutionParams {
readonly secondInstance: boolean;
readonly argv: string[];
readonly cwd: string;
}
/**
* The default entrypoint will handle a very rudimentary CLI to open workspaces by doing `app path/to/workspace`. To override this behavior, you can extend and rebind the
* `ElectronMainApplication` class and overriding the `launch` method.
* A JSON-RPC communication between the Electron Main Process and the Renderer Processes is available: You can bind services using the `ElectronConnectionHandler` and
* `ElectronIpcConnectionProvider` APIs, example:
*
* From an `electron-main` module:
*
* bind(ElectronConnectionHandler).toDynamicValue(context =>
* new RpcConnectionHandler(electronMainWindowServicePath,
* () => context.container.get(ElectronMainWindowService))
* ).inSingletonScope();
*
* And from the `electron-browser` module:
*
* bind(ElectronMainWindowService).toDynamicValue(context =>
* ElectronIpcConnectionProvider.createProxy(context.container, electronMainWindowServicePath)
* ).inSingletonScope();
*/
export declare const ElectronMainApplicationContribution: unique symbol;
export interface ElectronMainApplicationContribution {
/**
* The application is ready and is starting. This is the time to initialize
* services global to this process.
*
* Invoked when the electron-main process starts for the first time.
*/
onStart?(application: ElectronMainApplication): MaybePromise<void>;
/**
* The application is stopping. Contributions must perform only synchronous operations.
*/
onStop?(application: ElectronMainApplication): void;
}
export declare class ElectronMainProcessArgv {
protected get processArgvBinIndex(): number;
protected get isBundledElectronApp(): boolean;
protected get isElectronApp(): boolean;
getProcessArgvWithoutBin(argv?: string[]): Array<string>;
getProcessArgvBin(argv?: string[]): string;
}
export declare namespace ElectronMainProcessArgv {
interface ElectronMainProcess extends NodeJS.Process {
readonly defaultApp: boolean;
readonly versions: NodeJS.ProcessVersions & {
readonly electron: string;
};
}
}
export declare class ElectronMainApplication {
protected readonly contributions: ContributionProvider<ElectronMainApplicationContribution>;
protected readonly globals: ElectronMainApplicationGlobals;
protected processArgv: ElectronMainProcessArgv;
protected electronSecurityTokenService: ElectronSecurityTokenService;
protected readonly electronSecurityToken: ElectronSecurityToken;
protected readonly windowFactory: TheiaElectronWindowFactory;
protected readonly electronStore: Storage<{
windowstate?: TheiaBrowserWindowOptions | undefined;
}>;
protected readonly _backendPort: Deferred<number>;
readonly backendPort: Promise<number>;
protected _config: FrontendApplicationConfig | undefined;
protected useNativeWindowFrame: boolean;
protected customBackgroundColor?: string;
protected didUseNativeWindowFrameOnStart: Map<number, boolean>;
protected windows: Map<number, TheiaElectronWindow>;
protected restarting: boolean;
protected initialWindow?: BrowserWindow;
get config(): FrontendApplicationConfig;
start(config: FrontendApplicationConfig): Promise<void>;
protected getTitleBarStyle(config: FrontendApplicationConfig): 'native' | 'custom';
setTitleBarStyle(webContents: WebContents, style: string): void;
setBackgroundColor(webContents: WebContents, backgroundColor: string): void;
protected saveState(webContents: Electron.WebContents): void;
/**
* @param id the id of the WebContents of the BrowserWindow in question
* @returns 'native' or 'custom'
*/
getTitleBarStyleAtStartup(webContents: WebContents): 'native' | 'custom';
protected showInitialWindow(): void;
protected launch(params: ElectronMainExecutionParams): Promise<void>;
/**
* Use this rather than creating `BrowserWindow` instances from scratch, since some security parameters need to be set, this method will do it.
*
* @param options
*/
createWindow(asyncOptions?: MaybePromise<TheiaBrowserWindowOptions>): Promise<BrowserWindow>;
getLastWindowOptions(): Promise<TheiaBrowserWindowOptions>;
protected avoidOverlap(options: TheiaBrowserWindowOptions): TheiaBrowserWindowOptions;
protected getDefaultOptions(): TheiaBrowserWindowOptions;
openDefaultWindow(params?: WindowSearchParams): Promise<BrowserWindow>;
protected openWindowWithWorkspace(workspacePath: string): Promise<BrowserWindow>;
protected reuseOrCreateWindow(asyncOptions: MaybePromise<TheiaBrowserWindowOptions>): Promise<BrowserWindow>;
/** Configures native window creation, i.e. using window.open or links with target "_blank" in the frontend. */
protected configureNativeSecondaryWindowCreation(electronWindow: BrowserWindow): void;
/**
* "Gently" close all windows, application will not stop if a `beforeunload` handler returns `false`.
*/
requestStop(): void;
protected handleMainCommand(params: ElectronMainExecutionParams, options: ElectronMainCommandOptions): Promise<void>;
protected createWindowUri(params?: WindowSearchParams): Promise<URI>;
protected getDefaultTheiaWindowOptions(): TheiaBrowserWindowOptions;
protected getDefaultTheiaWindowBounds(): TheiaBrowserWindowOptions;
/**
* Save the window geometry state on every change.
*/
protected attachSaveWindowState(electronWindow: BrowserWindow): void;
protected saveWindowState(electronWindow: BrowserWindow): void;
/**
* Return a string unique to the current display layout.
*/
protected getCurrentScreenLayout(): string;
/**
* Start the NodeJS backend server.
*
* @return Running server's port promise.
*/
protected startBackend(): Promise<number>;
protected getForkOptions(): Promise<ForkOptions>;
protected attachElectronSecurityToken(port: number): Promise<void>;
protected hookApplicationEvents(): void;
protected onWillQuit(event: ElectronEvent): void;
protected onSecondInstance(event: ElectronEvent, argv: string[], cwd: string): Promise<void>;
protected onWindowAllClosed(event: ElectronEvent): void;
restart(webContents: WebContents): Promise<void>;
protected startContributions(): Promise<void>;
protected stopContributions(): void;
}
//# sourceMappingURL=electron-main-application.d.ts.map