Skip to content

Commit f6285c5

Browse files
feat(web): add canvasResizedCallback method to SessionBuilder (#842)
Co-authored-by: Benoît Cortier <3809077+CBenoit@users.noreply.github.com>
1 parent 7c4a496 commit f6285c5

File tree

6 files changed

+43
-2
lines changed

6 files changed

+43
-2
lines changed

crates/iron-remote-desktop/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,11 @@ macro_rules! make_bridge {
287287
))
288288
}
289289

290+
#[wasm_bindgen(js_name = canvasResizedCallback)]
291+
pub fn canvas_resized_callback(&self, callback: $crate::internal::web_sys::js_sys::Function) -> Self {
292+
Self($crate::SessionBuilder::canvas_resized_callback(&self.0, callback))
293+
}
294+
290295
pub fn extension(&self, ext: $crate::Extension) -> Self {
291296
Self($crate::SessionBuilder::extension(&self.0, ext))
292297
}

crates/iron-remote-desktop/src/session.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ pub trait SessionBuilder {
5151
#[must_use]
5252
fn force_clipboard_update_callback(&self, callback: js_sys::Function) -> Self;
5353

54+
#[must_use]
55+
fn canvas_resized_callback(&self, callback: js_sys::Function) -> Self;
56+
5457
#[must_use]
5558
fn extension(&self, ext: Extension) -> Self;
5659

crates/ironrdp-web/src/session.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,11 @@ impl iron_remote_desktop::SessionBuilder for SessionBuilder {
205205
self.clone()
206206
}
207207

208+
/// Because the server does not resize the framebuffer in the RDP protocol, this feature is unused in IronRDP.
209+
fn canvas_resized_callback(&self, _callback: js_sys::Function) -> Self {
210+
self.clone()
211+
}
212+
208213
fn extension(&self, ext: Extension) -> Self {
209214
iron_remote_desktop::extension_match! {
210215
match ext;

web-client/iron-remote-desktop/src/interfaces/SessionBuilder.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ export interface SessionBuilder {
6161
* Optional
6262
*/
6363
forceClipboardUpdateCallback(callback: ForceClipboardUpdateCallback): SessionBuilder;
64+
/**
65+
* Optional
66+
*/
67+
canvasResizedCallback(callback: CanvasResizedCallback): SessionBuilder;
6468
extension(value: unknown): SessionBuilder;
6569
connect(): Promise<Session>;
6670
}
@@ -85,3 +89,7 @@ interface RemoteReceiveForwardListCallback {
8589
interface ForceClipboardUpdateCallback {
8690
(): void;
8791
}
92+
93+
interface CanvasResizedCallback {
94+
(): void;
95+
}

web-client/iron-remote-desktop/src/iron-remote-desktop.svelte

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@
5454
let remoteDesktopService = new RemoteDesktopService(module);
5555
let publicAPI = new PublicAPI(remoteDesktopService);
5656
57+
let currentScreenScale = ScreenScale.Fit;
58+
5759
// Firefox's clipboard API is very limited, and doesn't support reading from the clipboard
5860
// without changing browser settings via `about:config`.
5961
//
@@ -491,25 +493,32 @@
491493
});
492494
}
493495
494-
function scaleSession(currentSize: ScreenScale | string) {
496+
function canvasResized() {
497+
scaleSession(currentScreenScale);
498+
}
499+
500+
function scaleSession(screenScale: ScreenScale | string) {
495501
resetHostStyle();
496502
if (isVisible) {
497-
switch (currentSize) {
503+
switch (screenScale) {
498504
case 'fit':
499505
case ScreenScale.Fit:
500506
loggingService.info('Size to fit');
507+
currentScreenScale = ScreenScale.Fit;
501508
scale = 'fit';
502509
fitResize();
503510
break;
504511
case 'full':
505512
case ScreenScale.Full:
506513
loggingService.info('Size to full');
514+
currentScreenScale = ScreenScale.Full;
507515
fullResize();
508516
scale = 'full';
509517
break;
510518
case 'real':
511519
case ScreenScale.Real:
512520
loggingService.info('Size to real');
521+
currentScreenScale = ScreenScale.Real;
513522
realResize();
514523
scale = 'real';
515524
break;
@@ -666,6 +675,7 @@
666675
canvas.height = 600;
667676
668677
remoteDesktopService.setCanvas(canvas);
678+
remoteDesktopService.setOnCanvasResized(canvasResized);
669679
670680
initListeners();
671681

web-client/iron-remote-desktop/src/services/remote-desktop.service.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import type { SessionTerminationInfo } from '../interfaces/SessionTerminationInf
2323
type OnRemoteClipboardChanged = (data: ClipboardData) => void;
2424
type OnRemoteReceivedFormatsList = () => void;
2525
type OnForceClipboardUpdate = () => void;
26+
type OnCanvasResized = () => void;
2627

2728
export class RemoteDesktopService {
2829
private module: RemoteDesktopModule;
@@ -32,6 +33,7 @@ export class RemoteDesktopService {
3233
private onRemoteClipboardChanged?: OnRemoteClipboardChanged;
3334
private onRemoteReceivedFormatList?: OnRemoteReceivedFormatsList;
3435
private onForceClipboardUpdate?: OnForceClipboardUpdate;
36+
private onCanvasResized?: OnCanvasResized;
3537
private cursorHasOverride: boolean = false;
3638
private lastCursorStyle: string = 'default';
3739
private enableClipboard: boolean = true;
@@ -74,6 +76,11 @@ export class RemoteDesktopService {
7476
this.onForceClipboardUpdate = callback;
7577
}
7678

79+
/// Callback which is called when the canvas is resized.
80+
setOnCanvasResized(callback: OnCanvasResized) {
81+
this.onCanvasResized = callback;
82+
}
83+
7784
mouseIn(event: MouseEvent) {
7885
this.syncModifier(event);
7986
}
@@ -135,6 +142,9 @@ export class RemoteDesktopService {
135142
if (this.onForceClipboardUpdate != null && this.enableClipboard) {
136143
sessionBuilder.forceClipboardUpdateCallback(this.onForceClipboardUpdate);
137144
}
145+
if (this.onCanvasResized != null) {
146+
sessionBuilder.canvasResizedCallback(this.onCanvasResized);
147+
}
138148

139149
if (config.desktopSize != null) {
140150
sessionBuilder.desktopSize(

0 commit comments

Comments
 (0)