147 lines
4.1 KiB
TypeScript
147 lines
4.1 KiB
TypeScript
import GObject, { register, property, signal } from "astal/gobject";
|
|
import { ConnectionInstantiationError, NotImplementedError } from "./errors";
|
|
import {
|
|
OutputAdapter,
|
|
OutputConfig,
|
|
VSOutputAdapter,
|
|
VSOutputEvent,
|
|
VSWorkspaceAdapter,
|
|
VSWorkspaceEvent,
|
|
} from "./types";
|
|
|
|
/**
|
|
* Mid-level abstract compositor connection providing raw data about the compositor to the rest of VoidShell.
|
|
* Wraps the low-level compositor-specific IPC APIs with a common interface that other services can build on top of.
|
|
*
|
|
* This should generally only be utilized directly by the high-level compositor-related services (workspaces,
|
|
* contexts, etc.). Other services should generally interact with the compositor via these high-level services.
|
|
*/
|
|
@register({
|
|
GTypeName: "AbstractCompositorConnection",
|
|
})
|
|
export class CompositorConnection extends GObject.Object {
|
|
constructor() {
|
|
if (CompositorConnection._instance !== undefined) {
|
|
throw new ConnectionInstantiationError(
|
|
"Cannot create a CompositorConnection where one already exists",
|
|
);
|
|
}
|
|
super();
|
|
if (Object.getPrototypeOf(this) === CompositorConnection.prototype) {
|
|
throw new ConnectionInstantiationError(
|
|
"Cannnot instantiate abstract CompositorConnection",
|
|
);
|
|
}
|
|
CompositorConnection._instance = this;
|
|
}
|
|
|
|
static _instance: CompositorConnection | undefined;
|
|
|
|
static get instance() {
|
|
if (this._instance === undefined) {
|
|
throw new Error(
|
|
"Must instantiate a CompositorConnection before attempting to retrieve instance",
|
|
);
|
|
}
|
|
return this._instance;
|
|
}
|
|
|
|
/**
|
|
* Focus a workspace by ID
|
|
* @param workspaceId The workspace to focus
|
|
*/
|
|
async focusWorkspace(workspaceId: string): Promise<void> {
|
|
throw new NotImplementedError();
|
|
}
|
|
|
|
/**
|
|
* Move a workspace to a different output
|
|
* @param workspaceId The workspace to move
|
|
* @param outputName The output to move the workspace to
|
|
*/
|
|
async moveWorkspace(workspaceId: string, outputName: string): Promise<void> {
|
|
throw new NotImplementedError();
|
|
}
|
|
|
|
/**
|
|
* Focus an output
|
|
* @param outputName The output to focus
|
|
*/
|
|
async focusOutput(outputName: string): Promise<void> {
|
|
throw new NotImplementedError();
|
|
}
|
|
/**
|
|
* Move the focused container to the given workspace
|
|
* @param workspaceId The workspace to move the container to
|
|
*/
|
|
async moveContainer(workspaceId: string): Promise<void> {
|
|
throw new NotImplementedError();
|
|
}
|
|
|
|
/**
|
|
* Configure an output
|
|
* @param outputName The name of the output to configure
|
|
* @param config The configuration object for the output
|
|
*/
|
|
async configureOutput(
|
|
outputName: string,
|
|
config: OutputConfig,
|
|
): Promise<void> {
|
|
throw new NotImplementedError();
|
|
}
|
|
|
|
/**
|
|
* Gets a list of all connected outputs
|
|
* @returns a list of VSOutputAdapter objects representing the connected outputs
|
|
*/
|
|
async getOutputs(): Promise<VSOutputAdapter[]> {
|
|
throw new NotImplementedError();
|
|
}
|
|
|
|
/**
|
|
* Gets a list of all workspaces
|
|
* @returns a list of VSWorkspaceAdapter objects representing the workspaces presently known to the compositor
|
|
*/
|
|
async getWorkspaces(): Promise<VSWorkspaceAdapter[]> {
|
|
throw new NotImplementedError();
|
|
}
|
|
|
|
/**
|
|
* Disable an output
|
|
* @param outputName The name of the output to disable
|
|
*/
|
|
async disableOutput(outputName: string): Promise<void> {
|
|
throw new NotImplementedError();
|
|
}
|
|
|
|
/**
|
|
* Set an output property without fully reconfiguring the output
|
|
*/
|
|
async setOutputProperty<Prop extends string & keyof OutputConfig>(
|
|
outputName: string,
|
|
property: Prop,
|
|
value: Exclude<OutputConfig[Prop], undefined>,
|
|
) {
|
|
throw new NotImplementedError();
|
|
}
|
|
|
|
/**
|
|
* Emitted when a workspace's data changes
|
|
*/
|
|
@signal(VSWorkspaceEvent)
|
|
declare workspaceChange: (event: VSWorkspaceEvent) => void;
|
|
|
|
/**
|
|
* Emitted when an output's data changes
|
|
* For example, it is enabled or disabled, or its mode changes
|
|
*/
|
|
@signal(VSOutputEvent)
|
|
declare outputChange: (event: VSOutputEvent) => void;
|
|
|
|
/**
|
|
* Emitted when the binding mode changes
|
|
*/
|
|
@signal(String)
|
|
declare modeChange: (event: string) => void;
|
|
}
|