diff --git a/packages/window-dom/src/core/index.js b/packages/window-dom/src/core/index.js index fd151932..9cfae98f 100644 --- a/packages/window-dom/src/core/index.js +++ b/packages/window-dom/src/core/index.js @@ -1,4 +1,3 @@ export * from './keyboard' export * from './pointer' -export * from './window' export * from './file' diff --git a/packages/window-dom/src/core/window.js b/packages/window-dom/src/core/window.js deleted file mode 100644 index 0bf2a397..00000000 --- a/packages/window-dom/src/core/window.js +++ /dev/null @@ -1,18 +0,0 @@ -import { World } from '@wimaengine/ecs' -import { Events } from '@wimaengine/event' -import { typeidGeneric } from '@wimaengine/type' -import { WindowResize } from '@wimaengine/window' - -/** - * @param {World} world - * @param {HTMLElement } target - */ -export function setUpWindowEvents(world, target) { - target.addEventListener('resize', (event) => { - - /** @type {Events} */ - const dispatch = world.getResourceByTypeId(typeidGeneric(Events, [WindowResize])) - - dispatch.write(new WindowResize(event)) - }) -} diff --git a/packages/window-dom/src/hooks/window.js b/packages/window-dom/src/hooks/window.js index e22c9e56..c042f912 100644 --- a/packages/window-dom/src/hooks/window.js +++ b/packages/window-dom/src/hooks/window.js @@ -2,7 +2,7 @@ /** @import {ComponentHook} from '@wimaengine/ecs' */ import { warn } from '@wimaengine/logger' import { Window, Windows } from '@wimaengine/window' -import { setUpKeyboardEvents, setupPointerEvents, setUpWindowEvents, setUpFileEvents } from '../core' +import { setUpKeyboardEvents, setupPointerEvents, setUpFileEvents } from '../core' /** * @type {ComponentHook} @@ -31,6 +31,25 @@ export function openWindow(entity, world) { registerWindow(world, entity, canvas, window) } +/** + * @param {HTMLCanvasElement} canvas + * @param {Window} window + */ +function syncWindowSize(canvas, window) { + canvas.width = window.getWidth() + canvas.height = window.getHeight() + canvas.style.width = `${canvas.width}px` + canvas.style.height = `${canvas.height}px` + + const rect = canvas.getBoundingClientRect() + const width = Math.round(rect.width) || canvas.width + const height = Math.round(rect.height) || canvas.height + + canvas.width = width + canvas.height = height + window.set(width, height) +} + /** * @param {import("@wimaengine/ecs").World} world * @param {import("@wimaengine/ecs").EntityHandle} entity @@ -40,8 +59,7 @@ export function openWindow(entity, world) { function registerWindow(world, entity, canvas, window) { const windows = world.getResource(Windows) - canvas.width = window.getWidth() - canvas.height = window.getHeight() + syncWindowSize(canvas, window) windows.setWindow(entity, canvas) // setting tabindex and focus to enable keyboard events @@ -51,7 +69,6 @@ function registerWindow(world, entity, canvas, window) { setupPointerEvents(world, canvas) setUpKeyboardEvents(world, canvas) - setUpWindowEvents(world, canvas) setUpFileEvents(world, canvas) } diff --git a/packages/window-dom/src/plugin.js b/packages/window-dom/src/plugin.js index f71c4f5c..7a92d787 100644 --- a/packages/window-dom/src/plugin.js +++ b/packages/window-dom/src/plugin.js @@ -1,7 +1,9 @@ import { App, Plugin } from '@wimaengine/app' +import { AppSchedule, CoreSystems } from '@wimaengine/core' import { ComponentHooks } from '@wimaengine/ecs' import { Window } from '@wimaengine/window' import { closeWindow, openWindow } from './hooks' +import { resizeWindow } from './systems' export class DOMWindowPlugin extends Plugin { @@ -11,5 +13,10 @@ export class DOMWindowPlugin extends Plugin { register(app) { app .setComponentHooks(Window, new ComponentHooks(openWindow, closeWindow)) + .registerSystem({ + schedule: AppSchedule.Update, + systemGroup: CoreSystems.End, + system: resizeWindow + }) } } diff --git a/packages/window-dom/src/systems/index.js b/packages/window-dom/src/systems/index.js new file mode 100644 index 00000000..2b6827c9 --- /dev/null +++ b/packages/window-dom/src/systems/index.js @@ -0,0 +1,32 @@ +import { EntityHandle, Query, World } from '@wimaengine/ecs' +import { Events } from '@wimaengine/event' +import { typeidGeneric } from '@wimaengine/type' +import { Window, Windows, WindowResize } from '@wimaengine/window' + +/** + * @param {World} world + */ +export function resizeWindow(world) { + const windows = new Query(world, [EntityHandle, Window]) + const canvases = world.getResource(Windows) + + /** @type {Events} */ + const dispatch = world.getResourceByTypeId(typeidGeneric(Events, [WindowResize])) + + windows.each(([entity, window]) => { + const canvas = canvases.getWindow(entity) + + if (!(canvas instanceof HTMLCanvasElement)) { + return + } + + const rect = canvas.getBoundingClientRect() + + if (rect.width === window.getWidth() || rect.height === window.getHeight()) { + return + } + + window.set(rect.width, rect.height) + dispatch.write(new WindowResize(rect.width, rect.height)) + }) +} diff --git a/packages/window/src/commands/window.js b/packages/window/src/commands/window.js index 2b5883f8..f0affef5 100644 --- a/packages/window/src/commands/window.js +++ b/packages/window/src/commands/window.js @@ -66,8 +66,16 @@ function execute(command, canvas, window) { canvas.width = command.data.x canvas.height = command.data.y - window.set(canvas.width, canvas.height) - canvas.dispatchEvent(new Event('resize')) + canvas.style.width = `${canvas.width}px` + canvas.style.height = `${canvas.height}px` + + const rect = canvas.getBoundingClientRect() + const width = Math.round(rect.width) || canvas.width + const height = Math.round(rect.height) || canvas.height + + canvas.width = width + canvas.height = height + window.set(width, height) break case WindowRequest.Reposition: diff --git a/packages/window/src/events/window/resize.js b/packages/window/src/events/window/resize.js index 4b3679d3..ffb3db53 100644 --- a/packages/window/src/events/window/resize.js +++ b/packages/window/src/events/window/resize.js @@ -13,10 +13,11 @@ export class WindowResize { height /** - * @param {UIEvent} event + * @param {number} width + * @param {number} height */ - constructor(event) { - this.width = /** @type {HTMLCanvasElement}*/(event.target).width - this.height = /** @type {HTMLCanvasElement}*/(event.target).height + constructor(width, height) { + this.width = width + this.height = height } }