diff --git a/crates/iron-remote-desktop/src/lib.rs b/crates/iron-remote-desktop/src/lib.rs index 3f2e86cc..f618afa7 100644 --- a/crates/iron-remote-desktop/src/lib.rs +++ b/crates/iron-remote-desktop/src/lib.rs @@ -287,6 +287,11 @@ macro_rules! make_bridge { )) } + #[wasm_bindgen(js_name = canvasResizedCallback)] + pub fn canvas_resized_callback(&self, callback: $crate::internal::web_sys::js_sys::Function) -> Self { + Self($crate::SessionBuilder::canvas_resized_callback(&self.0, callback)) + } + pub fn extension(&self, ext: $crate::Extension) -> Self { Self($crate::SessionBuilder::extension(&self.0, ext)) } diff --git a/crates/iron-remote-desktop/src/session.rs b/crates/iron-remote-desktop/src/session.rs index a1b8dc51..c618b05d 100644 --- a/crates/iron-remote-desktop/src/session.rs +++ b/crates/iron-remote-desktop/src/session.rs @@ -51,6 +51,9 @@ pub trait SessionBuilder { #[must_use] fn force_clipboard_update_callback(&self, callback: js_sys::Function) -> Self; + #[must_use] + fn canvas_resized_callback(&self, callback: js_sys::Function) -> Self; + #[must_use] fn extension(&self, ext: Extension) -> Self; diff --git a/crates/ironrdp-web/src/session.rs b/crates/ironrdp-web/src/session.rs index a3d7200e..e960e9c6 100644 --- a/crates/ironrdp-web/src/session.rs +++ b/crates/ironrdp-web/src/session.rs @@ -205,6 +205,11 @@ impl iron_remote_desktop::SessionBuilder for SessionBuilder { self.clone() } + /// Because the server does not resize the framebuffer in the RDP protocol, this feature is unused in IronRDP. + fn canvas_resized_callback(&self, _callback: js_sys::Function) -> Self { + self.clone() + } + fn extension(&self, ext: Extension) -> Self { iron_remote_desktop::extension_match! { match ext; diff --git a/web-client/iron-remote-desktop/src/interfaces/SessionBuilder.ts b/web-client/iron-remote-desktop/src/interfaces/SessionBuilder.ts index 33cb965e..57e74c70 100644 --- a/web-client/iron-remote-desktop/src/interfaces/SessionBuilder.ts +++ b/web-client/iron-remote-desktop/src/interfaces/SessionBuilder.ts @@ -61,6 +61,10 @@ export interface SessionBuilder { * Optional */ forceClipboardUpdateCallback(callback: ForceClipboardUpdateCallback): SessionBuilder; + /** + * Optional + */ + canvasResizedCallback(callback: CanvasResizedCallback): SessionBuilder; extension(value: unknown): SessionBuilder; connect(): Promise; } @@ -85,3 +89,7 @@ interface RemoteReceiveForwardListCallback { interface ForceClipboardUpdateCallback { (): void; } + +interface CanvasResizedCallback { + (): void; +} diff --git a/web-client/iron-remote-desktop/src/iron-remote-desktop.svelte b/web-client/iron-remote-desktop/src/iron-remote-desktop.svelte index 04a03268..48ceb4a9 100644 --- a/web-client/iron-remote-desktop/src/iron-remote-desktop.svelte +++ b/web-client/iron-remote-desktop/src/iron-remote-desktop.svelte @@ -54,6 +54,8 @@ let remoteDesktopService = new RemoteDesktopService(module); let publicAPI = new PublicAPI(remoteDesktopService); + let currentScreenScale = ScreenScale.Fit; + // Firefox's clipboard API is very limited, and doesn't support reading from the clipboard // without changing browser settings via `about:config`. // @@ -491,25 +493,32 @@ }); } - function scaleSession(currentSize: ScreenScale | string) { + function canvasResized() { + scaleSession(currentScreenScale); + } + + function scaleSession(screenScale: ScreenScale | string) { resetHostStyle(); if (isVisible) { - switch (currentSize) { + switch (screenScale) { case 'fit': case ScreenScale.Fit: loggingService.info('Size to fit'); + currentScreenScale = ScreenScale.Fit; scale = 'fit'; fitResize(); break; case 'full': case ScreenScale.Full: loggingService.info('Size to full'); + currentScreenScale = ScreenScale.Full; fullResize(); scale = 'full'; break; case 'real': case ScreenScale.Real: loggingService.info('Size to real'); + currentScreenScale = ScreenScale.Real; realResize(); scale = 'real'; break; @@ -666,6 +675,7 @@ canvas.height = 600; remoteDesktopService.setCanvas(canvas); + remoteDesktopService.setOnCanvasResized(canvasResized); initListeners(); diff --git a/web-client/iron-remote-desktop/src/services/remote-desktop.service.ts b/web-client/iron-remote-desktop/src/services/remote-desktop.service.ts index c21d19b5..26b0e2e4 100644 --- a/web-client/iron-remote-desktop/src/services/remote-desktop.service.ts +++ b/web-client/iron-remote-desktop/src/services/remote-desktop.service.ts @@ -23,6 +23,7 @@ import type { SessionTerminationInfo } from '../interfaces/SessionTerminationInf type OnRemoteClipboardChanged = (data: ClipboardData) => void; type OnRemoteReceivedFormatsList = () => void; type OnForceClipboardUpdate = () => void; +type OnCanvasResized = () => void; export class RemoteDesktopService { private module: RemoteDesktopModule; @@ -32,6 +33,7 @@ export class RemoteDesktopService { private onRemoteClipboardChanged?: OnRemoteClipboardChanged; private onRemoteReceivedFormatList?: OnRemoteReceivedFormatsList; private onForceClipboardUpdate?: OnForceClipboardUpdate; + private onCanvasResized?: OnCanvasResized; private cursorHasOverride: boolean = false; private lastCursorStyle: string = 'default'; private enableClipboard: boolean = true; @@ -74,6 +76,11 @@ export class RemoteDesktopService { this.onForceClipboardUpdate = callback; } + /// Callback which is called when the canvas is resized. + setOnCanvasResized(callback: OnCanvasResized) { + this.onCanvasResized = callback; + } + mouseIn(event: MouseEvent) { this.syncModifier(event); } @@ -135,6 +142,9 @@ export class RemoteDesktopService { if (this.onForceClipboardUpdate != null && this.enableClipboard) { sessionBuilder.forceClipboardUpdateCallback(this.onForceClipboardUpdate); } + if (this.onCanvasResized != null) { + sessionBuilder.canvasResizedCallback(this.onCanvasResized); + } if (config.desktopSize != null) { sessionBuilder.desktopSize(