diff --git a/webapp/src/client/app/modules/web-client/form/form-components/vnc/vnc-form.component.html b/webapp/src/client/app/modules/web-client/form/form-components/vnc/vnc-form.component.html index 9d3c478ad..6bfa03187 100644 --- a/webapp/src/client/app/modules/web-client/form/form-components/vnc/vnc-form.component.html +++ b/webapp/src/client/app/modules/web-client/form/form-components/vnc/vnc-form.component.html @@ -40,20 +40,39 @@
- +
-
- + @if (showTightOptions) { +
+ +
+ +
-
+ [inputFormData]="inputFormData" + (controlReady)="subscribeToJpegEnabledChanges()"> +
+ } + + @if (showPixelFormatSelector) { +
+ +
+ }
+ [inputFormData]="inputFormData">
diff --git a/webapp/src/client/app/modules/web-client/form/form-components/vnc/vnc-form.component.ts b/webapp/src/client/app/modules/web-client/form/form-components/vnc/vnc-form.component.ts index 1db4e9d04..8ea5cc297 100644 --- a/webapp/src/client/app/modules/web-client/form/form-components/vnc/vnc-form.component.ts +++ b/webapp/src/client/app/modules/web-client/form/form-components/vnc/vnc-form.component.ts @@ -2,6 +2,7 @@ import { ChangeDetectorRef, Component, Input, OnInit } from '@angular/core'; import { FormGroup } from '@angular/forms'; import { BaseComponent } from '@shared/bases/base.component'; +import { Encoding } from '@shared/enums/encoding.enum'; import { VncAuthMode } from '@shared/enums/web-client-auth-mode.enum'; import { WebFormService } from '@shared/services/web-form.service'; import { SelectItem } from 'primeng/api'; @@ -14,6 +15,11 @@ interface FormInputVisibility { showPasswordInput?: boolean; } +interface TightOptions { + jpeg: boolean; + png: boolean; +} + @Component({ selector: 'vnc-form', templateUrl: 'vnc-form.component.html', @@ -31,9 +37,16 @@ export class VncFormComponent extends BaseComponent implements OnInit { }; showMoreSettings = false; + showPixelFormatSelector = false; + showTightOptions = false; showExtendedClipboardCheckbox = false; showAutoClipboardCheckbox = false; + pixelFormatSelectorDisabled = false; + + selectedEncoding = Encoding.Default; + tightOptions: TightOptions = { jpeg: true, png: true }; + constructor( private formService: WebFormService, private cdr: ChangeDetectorRef, @@ -97,6 +110,75 @@ export class VncFormComponent extends BaseComponent implements OnInit { this.showAutoClipboardCheckbox = new UAParser().getEngine().name === 'Blink' && window.isSecureContext; } + subscribeToSelectedEncodingChanges(): void { + this.form + .get('enabledEncoding') + .valueChanges.pipe( + takeUntil(this.destroyed$), + startWith(this.form.get('enabledEncoding').value as Encoding), + switchMap((encoding: Encoding) => { + this.showPixelFormatSelector = encoding !== Encoding.Default; + this.showTightOptions = encoding === Encoding.Tight; + this.selectedEncoding = encoding; + + return of(undefined); + }), + ) + .subscribe({ + error: (error) => console.error('Failed to subscribe to selected encoding changes', error), + }); + } + + subscribeToJpegEnabledChanges(): void { + this.form + .get('jpegEnabled') + .valueChanges.pipe( + takeUntil(this.destroyed$), + startWith(this.form.get('jpegEnabled').value as boolean), + switchMap((jpegEnabled: boolean) => { + this.tightOptions.jpeg = jpegEnabled; + this.updatePixelFormatOptionState(); + this.cdr.detectChanges(); + + return of(undefined); + }), + ) + .subscribe({ + error: (error) => console.error('Failed to subscribe to jpeg enabled changes', error), + }); + } + + subscribeToPngEnabledChanges(): void { + this.form + .get('pngEnabled') + .valueChanges.pipe( + takeUntil(this.destroyed$), + startWith(this.form.get('pngEnabled').value as boolean), + switchMap((pngEnabled: boolean) => { + this.tightOptions.png = pngEnabled; + this.updatePixelFormatOptionState(); + this.cdr.detectChanges(); + + return of(undefined); + }), + ) + .subscribe({ + error: (error) => console.error('Failed to subscribe to jpeg enabled changes', error), + }); + } + + private updatePixelFormatOptionState(): void { + const { jpeg, png } = this.tightOptions; + + // Disable PixelFormat option for Tight JPEG and Tight PNG. + if (this.selectedEncoding === Encoding.Tight && (jpeg || png)) { + this.pixelFormatSelectorDisabled = true; + return; + } + + this.pixelFormatSelectorDisabled = false; + } + private subscribeToAuthModeChanges(): void { this.form .get('authMode') diff --git a/webapp/src/client/app/modules/web-client/form/form-controls/color-format-control/color-format-control.component.ts b/webapp/src/client/app/modules/web-client/form/form-controls/color-format-control/color-format-control.component.ts index 6c3a0d78c..19608804a 100644 --- a/webapp/src/client/app/modules/web-client/form/form-controls/color-format-control/color-format-control.component.ts +++ b/webapp/src/client/app/modules/web-client/form/form-controls/color-format-control/color-format-control.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core'; import { FormGroup } from '@angular/forms'; import { BaseComponent } from '@shared/bases/base.component'; import { ColorFormat } from '@shared/enums/color-format.enum'; @@ -10,9 +10,11 @@ import { WebFormService } from '@shared/services/web-form.service'; templateUrl: 'color-format-control.component.html', styleUrls: ['color-format-control.component.scss'], }) -export class ColorFormatControlComponent extends BaseComponent implements OnInit { +export class ColorFormatControlComponent extends BaseComponent implements OnInit, OnDestroy, OnChanges { @Input() parentForm: FormGroup; @Input() inputFormData; + @Input() disabled: boolean; + @Input() disabledTooltip: string; colorFormatOptions: SelectItemWithTooltip[]; @@ -22,16 +24,51 @@ export class ColorFormatControlComponent extends BaseComponent implements OnInit ngOnInit(): void { this.colorFormatOptions = this.formService.getColorFormatOptions(); - this.formService.addControlToForm({ - formGroup: this.parentForm, - controlName: 'colorFormat', - inputFormData: this.inputFormData, - isRequired: false, - defaultValue: ColorFormat.Default, - }); + + if (!this.parentForm.contains('colorFormat')) { + this.formService.addControlToForm({ + formGroup: this.parentForm, + controlName: 'colorFormat', + inputFormData: this.inputFormData, + isRequired: false, + defaultValue: ColorFormat.Default, + }); + } else { + this.parentForm.get('colorFormat').enable(); + } + + if (this.disabled) { + this.parentForm.get('colorFormat').disable(); + } + } + + ngOnChanges(changes: SimpleChanges): void { + const disabled = changes.disabled; + if (disabled) { + // First `ngOnChanges` runs before `ngOnInit`. + if (disabled.firstChange) { + return; + } + + if (disabled.currentValue) { + this.parentForm.get('colorFormat').disable(); + } else { + this.parentForm.get('colorFormat').enable(); + } + } + } + + ngOnDestroy() { + super.ngOnDestroy(); + // Disable the control to ignore it when reading the form. At the same time, the value is preserved. + this.parentForm.get('colorFormat').disable(); } getSelectedTooltip(): string { + if (this.disabled) { + return this.disabledTooltip; + } + const selectedOptionValue = this.parentForm.get('colorFormat')?.value; return this.colorFormatOptions.find((item) => item.value === selectedOptionValue)?.tooltipText || ''; } diff --git a/webapp/src/client/app/modules/web-client/form/form-controls/enabled-encoding-control/enabled-encoding-control.component.html b/webapp/src/client/app/modules/web-client/form/form-controls/enabled-encoding-control/enabled-encoding-control.component.html new file mode 100644 index 000000000..a95cbf293 --- /dev/null +++ b/webapp/src/client/app/modules/web-client/form/form-controls/enabled-encoding-control/enabled-encoding-control.component.html @@ -0,0 +1,10 @@ +
+ +
+ +
+
diff --git a/webapp/src/client/app/modules/web-client/form/form-controls/enabled-encodings-control/enabled-encodings-control.component.scss b/webapp/src/client/app/modules/web-client/form/form-controls/enabled-encoding-control/enabled-encoding-control.component.scss similarity index 100% rename from webapp/src/client/app/modules/web-client/form/form-controls/enabled-encodings-control/enabled-encodings-control.component.scss rename to webapp/src/client/app/modules/web-client/form/form-controls/enabled-encoding-control/enabled-encoding-control.component.scss diff --git a/webapp/src/client/app/modules/web-client/form/form-controls/enabled-encodings-control/enabled-encodings-control.component.ts b/webapp/src/client/app/modules/web-client/form/form-controls/enabled-encoding-control/enabled-encoding-control.component.ts similarity index 59% rename from webapp/src/client/app/modules/web-client/form/form-controls/enabled-encodings-control/enabled-encodings-control.component.ts rename to webapp/src/client/app/modules/web-client/form/form-controls/enabled-encoding-control/enabled-encoding-control.component.ts index b0f952d1b..c55e43ff0 100644 --- a/webapp/src/client/app/modules/web-client/form/form-controls/enabled-encodings-control/enabled-encodings-control.component.ts +++ b/webapp/src/client/app/modules/web-client/form/form-controls/enabled-encoding-control/enabled-encoding-control.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { FormGroup } from '@angular/forms'; import { Encoding } from '@gateway/shared/enums/encoding.enum'; import { BaseComponent } from '@shared/bases/base.component'; @@ -6,14 +6,16 @@ import { WebFormService } from '@shared/services/web-form.service'; import { SelectItem } from 'primeng/api'; @Component({ - selector: 'web-client-enabled-encodings-control', - templateUrl: 'enabled-encodings-control.component.html', - styleUrls: ['enabled-encodings-control.component.scss'], + selector: 'web-client-enabled-encoding-control', + templateUrl: 'enabled-encoding-control.component.html', + styleUrls: ['enabled-encoding-control.component.scss'], }) -export class EnabledEncodingsControlComponent extends BaseComponent implements OnInit { +export class EnabledEncodingControlComponent extends BaseComponent implements OnInit { @Input() parentForm: FormGroup; @Input() inputFormData; + @Output() controlReady = new EventEmitter(); + supportedEncodings: SelectItem[]; constructor(private formService: WebFormService) { @@ -24,10 +26,12 @@ export class EnabledEncodingsControlComponent extends BaseComponent implements O this.supportedEncodings = this.formService.getSupportedEncodings(); this.formService.addControlToForm({ formGroup: this.parentForm, - controlName: 'enabledEncodings', + controlName: 'enabledEncoding', inputFormData: this.inputFormData, isRequired: false, - defaultValue: Encoding.getAllEncodings(), + defaultValue: Encoding.Default, }); + + this.controlReady.emit(); } } diff --git a/webapp/src/client/app/modules/web-client/form/form-controls/enabled-encodings-control/enabled-encodings-control.component.html b/webapp/src/client/app/modules/web-client/form/form-controls/enabled-encodings-control/enabled-encodings-control.component.html deleted file mode 100644 index ba445466d..000000000 --- a/webapp/src/client/app/modules/web-client/form/form-controls/enabled-encodings-control/enabled-encodings-control.component.html +++ /dev/null @@ -1,9 +0,0 @@ -
- -
- -
-
diff --git a/webapp/src/client/app/modules/web-client/form/form-controls/jpeg-quality-level-control/jpeg-quality-level-control.component.ts b/webapp/src/client/app/modules/web-client/form/form-controls/jpeg-quality-level-control/jpeg-quality-level-control.component.ts index de8ce796b..5e11d3ece 100644 --- a/webapp/src/client/app/modules/web-client/form/form-controls/jpeg-quality-level-control/jpeg-quality-level-control.component.ts +++ b/webapp/src/client/app/modules/web-client/form/form-controls/jpeg-quality-level-control/jpeg-quality-level-control.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; import { FormGroup } from '@angular/forms'; import { BaseComponent } from '@shared/bases/base.component'; @@ -9,10 +9,12 @@ import { WebFormService } from '@shared/services/web-form.service'; templateUrl: 'jpeg-quality-level-control.component.html', styleUrls: ['jpeg-quality-level-control.component.scss'], }) -export class JpegQualityLevelControlComponent extends BaseComponent implements OnInit { +export class JpegQualityLevelControlComponent extends BaseComponent implements OnInit, OnDestroy { @Input() parentForm: FormGroup; @Input() inputFormData; + @Output() controlReady = new EventEmitter(); + jpegEnabled = true; constructor(private formService: WebFormService) { @@ -24,20 +26,34 @@ export class JpegQualityLevelControlComponent extends BaseComponent implements O } ngOnInit(): void { - this.formService.addControlToForm({ - formGroup: this.parentForm, - controlName: 'jpegEnabled', - inputFormData: this.inputFormData, - isRequired: false, - defaultValue: true, - }); - - this.formService.addControlToForm({ - formGroup: this.parentForm, - controlName: 'jpegQualityLevel', - inputFormData: this.inputFormData, - isRequired: false, - defaultValue: 9, - }); + if (!this.parentForm.contains('jpegEnabled')) { + this.formService.addControlToForm({ + formGroup: this.parentForm, + controlName: 'jpegEnabled', + inputFormData: this.inputFormData, + isRequired: false, + defaultValue: true, + }); + + this.formService.addControlToForm({ + formGroup: this.parentForm, + controlName: 'jpegQualityLevel', + inputFormData: this.inputFormData, + isRequired: false, + defaultValue: 9, + }); + + this.controlReady.emit(); + } else { + this.parentForm.get('jpegEnabled').enable(); + } + + this.jpegEnabled = this.parentForm.get('jpegEnabled').value; + } + + ngOnDestroy() { + super.ngOnDestroy(); + // Disable the control to ignore it when reading the form. At the same time, the value is preserved. + this.parentForm.get('jpegEnabled').disable(); } } diff --git a/webapp/src/client/app/modules/web-client/form/form-controls/tight-png-enabled-control/tight-png-enabled-control.component.html b/webapp/src/client/app/modules/web-client/form/form-controls/tight-png-enabled-control/tight-png-enabled-control.component.html new file mode 100644 index 000000000..6f246e73f --- /dev/null +++ b/webapp/src/client/app/modules/web-client/form/form-controls/tight-png-enabled-control/tight-png-enabled-control.component.html @@ -0,0 +1,7 @@ +
+
+ +
+
diff --git a/webapp/src/client/app/modules/web-client/form/form-controls/tight-png-enabled-control/tight-png-enabled-control.component.scss b/webapp/src/client/app/modules/web-client/form/form-controls/tight-png-enabled-control/tight-png-enabled-control.component.scss new file mode 100644 index 000000000..8fed1ca0d --- /dev/null +++ b/webapp/src/client/app/modules/web-client/form/form-controls/tight-png-enabled-control/tight-png-enabled-control.component.scss @@ -0,0 +1,22 @@ +@import '../../../../../../../assets/css/style/mixins'; +@import "../../../../../../../assets/css/style/variables"; +@import "../../../../../../../assets/css/theme/theme-mode-variables"; + +.gateway-form-input { + display: flex; + align-items: center; +} + +.form-helper-text { + line-height: 11px; + word-wrap: break-word; + color: var(--status-error-text-color); + font-size: 11px; + font-family: Open Sans; + font-weight: 400; + padding-left: 0; + justify-content: flex-start; + align-items: flex-start; + gap: 10px; + display: inline-flex; +} diff --git a/webapp/src/client/app/modules/web-client/form/form-controls/tight-png-enabled-control/tight-png-enabled-control.component.ts b/webapp/src/client/app/modules/web-client/form/form-controls/tight-png-enabled-control/tight-png-enabled-control.component.ts new file mode 100644 index 000000000..f6fb2d841 --- /dev/null +++ b/webapp/src/client/app/modules/web-client/form/form-controls/tight-png-enabled-control/tight-png-enabled-control.component.ts @@ -0,0 +1,43 @@ +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; +import { FormGroup } from '@angular/forms'; + +import { BaseComponent } from '@shared/bases/base.component'; +import { WebFormService } from '@shared/services/web-form.service'; + +@Component({ + selector: 'web-client-tight-png-enabled-control', + templateUrl: 'tight-png-enabled-control.component.html', + styleUrls: ['tight-png-enabled-control.component.scss'], +}) +export class TightPngEnabledControlComponent extends BaseComponent implements OnInit, OnDestroy { + @Input() parentForm: FormGroup; + @Input() inputFormData; + + @Output() controlReady = new EventEmitter(); + + constructor(private formService: WebFormService) { + super(); + } + + ngOnInit(): void { + if (!this.parentForm.contains('pngEnabled')) { + this.formService.addControlToForm({ + formGroup: this.parentForm, + controlName: 'pngEnabled', + inputFormData: this.inputFormData, + isRequired: false, + defaultValue: true, + }); + + this.controlReady.emit(); + } else { + this.parentForm.get('pngEnabled').enable(); + } + } + + ngOnDestroy() { + super.ngOnDestroy(); + // Disable the control to ignore it when reading the form. At the same time, the value is preserved. + this.parentForm.get('pngEnabled').disable(); + } +} diff --git a/webapp/src/client/app/modules/web-client/vnc/web-client-vnc.component.ts b/webapp/src/client/app/modules/web-client/vnc/web-client-vnc.component.ts index 134cd7a9a..d2fe458af 100644 --- a/webapp/src/client/app/modules/web-client/vnc/web-client-vnc.component.ts +++ b/webapp/src/client/app/modules/web-client/vnc/web-client-vnc.component.ts @@ -445,17 +445,18 @@ export class WebClientVncComponent extends WebClientBaseComponent implements OnI } private fetchParameters(formData: VncFormDataInput): Observable { - const { + let { hostname, username, password, enableCursor, enableExtendedClipboard, - enabledEncodings, + enabledEncoding, colorFormat, - ultraVirtualDisplay, jpegEnabled, jpegQualityLevel, + pngEnabled, + ultraVirtualDisplay, wheelSpeedFactor = 1, } = formData; const extractedData: ExtractedHostnamePort = this.utils.string.extractHostnameAndPort(hostname, DefaultVncPort); @@ -467,6 +468,10 @@ export class WebClientVncComponent extends WebClientBaseComponent implements OnI const desktopScreenSize: DesktopSize = this.webClientService.getDesktopSize(this.formData) ?? this.webSessionService.getWebSessionScreenSizeSnapshot(); + if (enabledEncoding === Encoding.Tight && pngEnabled) { + enabledEncoding = Encoding.TightPng; + } + const connectionParameters: IronVNCConnectionParameters = { username, password, @@ -475,7 +480,7 @@ export class WebClientVncComponent extends WebClientBaseComponent implements OnI gatewayAddress, screenSize: desktopScreenSize, sessionId, - enabledEncodings: enabledEncodings.join(','), + enabledEncoding, colorFormat, jpegQualityLevel: jpegEnabled ? jpegQualityLevel : undefined, enableCursor, @@ -521,10 +526,12 @@ export class WebClientVncComponent extends WebClientBaseComponent implements OnI configBuilder.withDesktopSize(connectionParameters.screenSize); } - if (connectionParameters.enabledEncodings !== '') { - configBuilder.withExtension(enabledEncodings(connectionParameters.enabledEncodings)); - } else { + if (connectionParameters.enabledEncoding === Encoding.Default) { + // When the Default option is selected, we enable all encodings and use server's pixel format. configBuilder.withExtension(enabledEncodings(Encoding.getAllEncodings().join(','))); + configBuilder.withExtension(jpegQualityLevel(9)); + } else { + configBuilder.withExtension(enabledEncodings(connectionParameters.enabledEncoding)); } if (connectionParameters.colorFormat) { diff --git a/webapp/src/client/app/modules/web-client/web-client.module.ts b/webapp/src/client/app/modules/web-client/web-client.module.ts index 3ab8f41f6..4de984ede 100644 --- a/webapp/src/client/app/modules/web-client/web-client.module.ts +++ b/webapp/src/client/app/modules/web-client/web-client.module.ts @@ -35,11 +35,12 @@ import { ColorFormatControlComponent } from './form/form-controls/color-format-c // import { ForceWsPortControlComponent } from './form/form-controls/force-ws-port-control/force-ws-port-control.component'; // import { RequestSharedSessionControlComponent } from './form/form-controls/request-shared-session-control/request-shared-session-control.component'; // import { SharingApprovalModeControlComponent } from './form/form-controls/sharing-approval-mode-control/sharing-approval-mode-control.component'; -import { EnabledEncodingsControlComponent } from './form/form-controls/enabled-encodings-control/enabled-encodings-control.component'; +import { EnabledEncodingControlComponent } from './form/form-controls/enabled-encoding-control/enabled-encoding-control.component'; import { ExtendedClipboardControlComponent } from './form/form-controls/extended-clipboard-control/extended-clipboard-control.component'; import { FileControlComponent } from './form/form-controls/file-control/file-control.component'; import { JpegQualityLevelControlComponent } from './form/form-controls/jpeg-quality-level-control/jpeg-quality-level-control.component'; import { ResolutionQualityControlComponent } from './form/form-controls/resolution-quality-control/resolution-quality-control.component'; +import { TightPngEnabledControlComponent } from './form/form-controls/tight-png-enabled-control/tight-png-enabled-control.component'; import { UltraVirtualDisplayControlComponent } from './form/form-controls/ultra-virtual-display-control/ultra-virtual-display-control.component'; import { NetScanComponent } from './net-scan/net-scan.component'; import { WebClientRdpComponent } from './rdp/web-client-rdp.component'; @@ -82,11 +83,12 @@ const routes: Routes = [ PasswordControlComponent, ExtendedClipboardControlComponent, JpegQualityLevelControlComponent, + TightPngEnabledControlComponent, ScreenSizeControlComponent, EnableDisplayConfigurationControlComponent, KdcUrlControlComponent, PreConnectionBlobControlComponent, - EnabledEncodingsControlComponent, + EnabledEncodingControlComponent, ColorFormatControlComponent, EnableCursorControlComponent, AutoClipboardControlComponent, diff --git a/webapp/src/client/app/shared/enums/encoding.enum.ts b/webapp/src/client/app/shared/enums/encoding.enum.ts index 992522fe3..3933443ac 100644 --- a/webapp/src/client/app/shared/enums/encoding.enum.ts +++ b/webapp/src/client/app/shared/enums/encoding.enum.ts @@ -1,6 +1,7 @@ import { SelectItem } from 'primeng/api'; enum Encoding { + Default = '', Raw = 'raw', Zlib = 'zlib', Hextile = 'hextile', @@ -14,6 +15,9 @@ namespace Encoding { Object.entries(Encoding) // Filter out properties that are not from enum values (like function `getSelectItems`). .filter(([_, value]) => typeof value === 'string') + // We don't want to add the Tight PNG to the selector with other encodings. + // We make a separate option for PNG. + .filter(([_, value]) => value !== Encoding.TightPng) .map(([key, value]) => ({ label: key, value, @@ -26,6 +30,7 @@ namespace Encoding { Object.values(Encoding) // Filter out properties that are not from enum values (like function `getSelectItems`). .filter((value) => typeof value === 'string') + .filter((value) => value !== Encoding.Default) ); } } diff --git a/webapp/src/client/app/shared/interfaces/connection-params.interfaces.ts b/webapp/src/client/app/shared/interfaces/connection-params.interfaces.ts index 354301157..3f670f98b 100644 --- a/webapp/src/client/app/shared/interfaces/connection-params.interfaces.ts +++ b/webapp/src/client/app/shared/interfaces/connection-params.interfaces.ts @@ -1,3 +1,4 @@ +import { Encoding } from '@shared/enums/encoding.enum'; import { DesktopSize } from '@shared/models/desktop-size'; export interface SessionTokenParameters { @@ -35,7 +36,7 @@ export interface IronVNCConnectionParameters { gatewayAddress?: string; token?: string; screenSize?: DesktopSize; - enabledEncodings?: string; + enabledEncoding: Encoding; colorFormat: string; jpegQualityLevel?: number; enableCursor: boolean; diff --git a/webapp/src/client/app/shared/interfaces/forms.interfaces.ts b/webapp/src/client/app/shared/interfaces/forms.interfaces.ts index bce396ced..62452d31b 100644 --- a/webapp/src/client/app/shared/interfaces/forms.interfaces.ts +++ b/webapp/src/client/app/shared/interfaces/forms.interfaces.ts @@ -44,10 +44,11 @@ export interface VncFormDataInput { // The extended clipboard control may not be initialized if the browser does not support the clipboard API. enableExtendedClipboard?: boolean; ultraVirtualDisplay: boolean; - enabledEncodings: Encoding[]; + enabledEncoding: Encoding; colorFormat: ColorFormat; jpegEnabled: boolean; jpegQualityLevel: number; + pngEnabled: boolean; wheelSpeedFactor: number; screenSize: ScreenSize; autoClipboard?: boolean;