diff --git a/packages/compositor-shell/src/App.tsx b/packages/compositor-shell/src/App.tsx index 04f760c3..dc480ca2 100644 --- a/packages/compositor-shell/src/App.tsx +++ b/packages/compositor-shell/src/App.tsx @@ -47,7 +47,7 @@ export async function main() { await wasmLibs // create new compositor context - const session = await createCompositorSession() + const session = await createCompositorSession({ mode: 'floating' }) const remoteAppLauncher = createAppLauncher(session, 'remote') const webAppLauncher = createAppLauncher(session, 'web') diff --git a/packages/compositor-shell/src/AppBar.tsx b/packages/compositor-shell/src/AppBar.tsx index 4506ceb0..d464fe6b 100644 --- a/packages/compositor-shell/src/AppBar.tsx +++ b/packages/compositor-shell/src/AppBar.tsx @@ -156,7 +156,7 @@ function AppLaunchInput(props: AppInputProps) { onKeyPress={onKeyPress} placeholder="Type a web: or rem:// URL" name="remote" - onfocusin={selectAllOnFocus} + onFocusIn={selectAllOnFocus} /> ) diff --git a/packages/compositor/src/Session.ts b/packages/compositor/src/Session.ts index 1a60eb8d..bbc8c7d4 100644 --- a/packages/compositor/src/Session.ts +++ b/packages/compositor/src/Session.ts @@ -17,18 +17,15 @@ import { Display } from '@gfld/compositor-protocol' import Globals from './Globals' -import { ButtonCode, CompositorSession } from './index' +import { ButtonCode, CompositorSession, SessionConfig } from './index' import { FrameDecoder } from './remote/buffer-decoder' import { createWasmFrameDecoder } from './remote/wasm-buffer-decoder' -import { - hardwareDecoderConfig, - softwareDecoderConfig, - webCodecFrameDecoderFactory, -} from './remote/webcodec-buffer-decoder' +import { softwareDecoderConfig, webCodecFrameDecoderFactory } from './remote/webcodec-buffer-decoder' import Renderer from './render/Renderer' import { createUserShellApi, UserShellApi } from './UserShellApi' import { InputQueue } from './InputQueue' import { KeyboardModifier } from './Seat' +import { s } from '@gfld/common/dist' export interface LogFn { /* tslint:disable:no-unnecessary-generics */ @@ -119,7 +116,7 @@ class Session implements CompositorSession { private constructor( public readonly display: Display, - public readonly compositorSessionId: string, + public readonly config: Required, public readonly logger: GreenfieldLogger, frameDecoderFactory: FrameDecoderFactory, ) { @@ -131,7 +128,7 @@ class Session implements CompositorSession { } static async create( - sessionId?: string, + sessionConfig: SessionConfig, logger: GreenfieldLogger = { error: console.error, warn: console.warn, @@ -145,8 +142,8 @@ class Session implements CompositorSession { }, ): Promise { const display = new Display() - const compositorSessionId = - sessionId ?? + const id = + sessionConfig.id ?? ((): string => { const randomBytes = new Uint8Array(8) crypto.getRandomValues(randomBytes) @@ -163,11 +160,11 @@ class Session implements CompositorSession { decoderFactory = createWasmFrameDecoder } - const session = new Session(display, compositorSessionId, logger, decoderFactory) + const session = new Session(display, { ...sessionConfig, id }, logger, decoderFactory) session.globals.seat.buttonBindings.push({ modifiers: 0, button: ButtonCode.MAIN, - handler: (pointer, event) => { + handler: (pointer, _event) => { if (pointer.grab !== pointer.defaultGrab) { return } @@ -181,7 +178,7 @@ class Session implements CompositorSession { session.globals.seat.buttonBindings.push({ modifiers: KeyboardModifier.NONE, button: ButtonCode.SECONDARY, - handler: (pointer, event) => { + handler: (pointer, _event) => { if (pointer.grab !== pointer.defaultGrab) { return } diff --git a/packages/compositor/src/desktop/Desktop.ts b/packages/compositor/src/desktop/Desktop.ts index 32e9cef9..a01ac00c 100644 --- a/packages/compositor/src/desktop/Desktop.ts +++ b/packages/compositor/src/desktop/Desktop.ts @@ -4,6 +4,7 @@ import { RectWithInfo } from '../math/Rect' import { Size } from '../math/Size' import SurfaceRole from '../SurfaceRole' import { AlwaysFullscreenDesktopSurface } from './AlwaysFullScreenDesktopSurface' +import { FloatingDesktopSurface } from './FloatingDesktopSurface' export interface DesktopSurfaceRole extends SurfaceRole { requestClose(): void @@ -55,7 +56,11 @@ export interface DesktopSurface { } export function createDesktopSurface(surface: Surface, desktopSurfaceRole: DesktopSurfaceRole): DesktopSurface { - // TODO from session config - // return new FloatingDesktopSurface(surface, desktopSurfaceRole) - return new AlwaysFullscreenDesktopSurface(surface, desktopSurfaceRole) + switch (surface.session.config.mode) { + case 'fullscreen': + return new AlwaysFullscreenDesktopSurface(surface, desktopSurfaceRole) + case 'floating': + default: + return new FloatingDesktopSurface(surface, desktopSurfaceRole) + } } diff --git a/packages/compositor/src/index.ts b/packages/compositor/src/index.ts index 497bea83..01b99d2c 100644 --- a/packages/compositor/src/index.ts +++ b/packages/compositor/src/index.ts @@ -29,8 +29,11 @@ export * from './KeyEvent' export type { nrmlvo } export type { GreenfieldLogger } -export function createCompositorSession(sessionId?: string, logger?: GreenfieldLogger): Promise { - return Session.create(sessionId, logger) +export function createCompositorSession( + sessionConfig: SessionConfig, + logger?: GreenfieldLogger, +): Promise { + return Session.create(sessionConfig, logger) } export interface CompositorPointer { @@ -51,7 +54,7 @@ export interface CompositorSeat { export interface CompositorSession { userShell: UserShellApi globals: CompositorGlobals - compositorSessionId: string + config: SessionConfig } export interface CompositorGlobals { @@ -107,3 +110,8 @@ export function createAppLauncher(session: CompositorSession, type: 'web' | 'rem throw new Error(`Connector type must be 'remote' or 'web'.`) } } + +export interface SessionConfig { + id?: string + mode: 'floating' | 'fullscreen' +} diff --git a/packages/compositor/src/remote/RemoteAppLauncher.ts b/packages/compositor/src/remote/RemoteAppLauncher.ts index 38a35898..15c10c8c 100644 --- a/packages/compositor/src/remote/RemoteAppLauncher.ts +++ b/packages/compositor/src/remote/RemoteAppLauncher.ts @@ -115,7 +115,7 @@ export class RemoteAppLauncher implements AppLauncher { launch(appURL: URL, onChildAppContext: (childAppContext: AppContext) => void): AppContext { const remoteAppContext = new RemoteAppContext(this.session, onChildAppContext) const headers: HeadersInit = { - 'x-compositor-session-id': this.session.compositorSessionId, + 'x-compositor-session-id': this.session.config.id, } const user = appURL.username @@ -331,7 +331,7 @@ class RemoteAppContext implements AppContext { throw new Error(`BUG. Unknown channel description: ${JSON.stringify(desc)}`) } this.clientConnections.push(channel) - this.onChannel(channel, this.session.compositorSessionId, proxySessionProps) + this.onChannel(channel, this.session.config.id, proxySessionProps) break } case SignalingMessageType.DISCONNECT_CHANNEL: {