diff --git a/app/lib/window.ts b/app/lib/window.ts index bad3db3d..35dea3df 100644 --- a/app/lib/window.ts +++ b/app/lib/window.ts @@ -22,11 +22,16 @@ export interface WindowOptions { hidden?: boolean } +abstract class GlasstronWindow extends BrowserWindow { + blurType: string + abstract setBlur (_: boolean) +} + export class Window { ready: Promise private visible = new Subject() private closed = new Subject() - private window: BrowserWindow + private window: GlasstronWindow private windowConfig: ElectronConfig private windowBounds: Rectangle private closing = false @@ -84,7 +89,7 @@ export class Window { } } - this.window = new BrowserWindow(bwOptions) + this.window = new glasstron.BrowserWindow(bwOptions) this.window.once('ready-to-show', () => { if (process.platform === 'darwin') { @@ -129,21 +134,20 @@ export class Window { }) } - setVibrancy (enabled: boolean, type?: string): void { - this.lastVibrancy = { enabled, type } + setVibrancy (enabled: boolean, type?: string, userRequested?: boolean): void { + if (userRequested ?? true) { + this.lastVibrancy = { enabled, type } + } if (process.platform === 'win32') { if (parseFloat(os.release()) >= 10) { - glasstron.update(this.window, { - windows: { blurType: enabled ? type === 'fluent' ? 'acrylic' : 'blurbehind' : null }, - }) + this.window.blurType = enabled ? type === 'fluent' ? 'acrylic' : 'blurbehind' : null + this.window.setBlur(enabled) } else { DwmEnableBlurBehindWindow(this.window, enabled) } } else if (process.platform === 'linux') { - glasstron.update(this.window, { - linux: { requestBlur: enabled }, - }) this.window.setBackgroundColor(enabled ? '#00000000' : '#131d27') + this.window.setBlur(enabled) } else { this.window.setVibrancy(enabled ? 'dark' : null as any) // electron issue 20269 } @@ -360,24 +364,21 @@ export class Window { this.disableVibrancyWhileDragging = value }) - this.window.on('will-move', () => { + let moveEndedTimeout: number|null = null + const onBoundsChange = () => { if (!this.lastVibrancy?.enabled || !this.disableVibrancyWhileDragging) { return } - let timeout: number|null = null - const oldVibrancy = this.lastVibrancy - this.setVibrancy(false) - const onMove = () => { - if (timeout) { - clearTimeout(timeout) - } - timeout = setTimeout(() => { - this.window.off('move', onMove) - this.setVibrancy(oldVibrancy.enabled, oldVibrancy.type) - }, 500) + this.setVibrancy(false, undefined, false) + if (moveEndedTimeout) { + clearTimeout(moveEndedTimeout) } - this.window.on('move', onMove) - }) + moveEndedTimeout = setTimeout(() => { + this.setVibrancy(this.lastVibrancy.enabled, this.lastVibrancy.type) + }, 50) + } + this.window.on('move', onBoundsChange) + this.window.on('resize', onBoundsChange) } private destroy () { diff --git a/package.json b/package.json index df3475ee..0d5632af 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "graceful-fs": "^4.2.4", "html-loader": "0.5.5", "json-loader": "0.5.7", + "lru-cache": "^6.0.0", "node-abi": "^2.19.3", "node-gyp": "^7.1.2", "node-sass": "^5.0.0", diff --git a/terminus-core/src/services/hostApp.service.ts b/terminus-core/src/services/hostApp.service.ts index 1c294a02..3f17a486 100644 --- a/terminus-core/src/services/hostApp.service.ts +++ b/terminus-core/src/services/hostApp.service.ts @@ -5,7 +5,7 @@ import { Observable, Subject } from 'rxjs' import { Injectable, NgZone, EventEmitter } from '@angular/core' import { ElectronService } from './electron.service' import { Logger, LogService } from './log.service' -import { isWindowsBuild, WIN_BUILD_FLUENT_BG_MOVE_BUG_FIXED, WIN_BUILD_FLUENT_BG_SUPPORTED } from '../utils' +import { isWindowsBuild, WIN_BUILD_FLUENT_BG_SUPPORTED } from '../utils' export enum Platform { Linux = 'Linux', @@ -176,10 +176,7 @@ export class HostAppService { this.configChangeBroadcast.next() })) - if ( - isWindowsBuild(WIN_BUILD_FLUENT_BG_SUPPORTED) && - !isWindowsBuild(WIN_BUILD_FLUENT_BG_MOVE_BUG_FIXED) - ) { + if (isWindowsBuild(WIN_BUILD_FLUENT_BG_SUPPORTED)) { electron.ipcRenderer.send('window-set-disable-vibrancy-while-dragging', true) } } diff --git a/terminus-core/src/utils.ts b/terminus-core/src/utils.ts index 4dfa171f..6f74d512 100644 --- a/terminus-core/src/utils.ts +++ b/terminus-core/src/utils.ts @@ -4,7 +4,6 @@ export const WIN_BUILD_CONPTY_SUPPORTED = 17692 export const WIN_BUILD_CONPTY_STABLE = 18309 export const WIN_BUILD_WSL_EXE_DISTRO_FLAG = 17763 export const WIN_BUILD_FLUENT_BG_SUPPORTED = 17063 -export const WIN_BUILD_FLUENT_BG_MOVE_BUG_FIXED = 18917 export function isWindowsBuild (build: number): boolean { return process.platform === 'win32' && parseFloat(os.release()) >= 10 && parseInt(os.release().split('.')[2]) >= build diff --git a/yarn.lock b/yarn.lock index 82a959e2..0cd40ede 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4712,7 +4712,7 @@ lru-cache@^4.0.1: lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0"