From 1b72aab47446b3d9b759aa1c3c3318f7ed40ef47 Mon Sep 17 00:00:00 2001 From: waynemwashuma <94756970+waynemwashuma@users.noreply.github.com> Date: Sat, 18 Jul 2026 10:42:49 +0300 Subject: [PATCH 1/4] Simplify `WindowResize` constructor --- packages/window/src/events/window/resize.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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 } } From a9318aec56857a2250194c61aa2020e75f50d595 Mon Sep 17 00:00:00 2001 From: waynemwashuma <94756970+waynemwashuma@users.noreply.github.com> Date: Sat, 18 Jul 2026 10:43:26 +0300 Subject: [PATCH 2/4] Remove dom window resize setup --- packages/window-dom/src/core/index.js | 1 - packages/window-dom/src/core/window.js | 18 ------------------ 2 files changed, 19 deletions(-) delete mode 100644 packages/window-dom/src/core/window.js 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)) - }) -} From b635821966b304bca751de83f075eedbbc09658d Mon Sep 17 00:00:00 2001 From: waynemwashuma <94756970+waynemwashuma@users.noreply.github.com> Date: Sat, 18 Jul 2026 10:50:06 +0300 Subject: [PATCH 3/4] Sync window canvas size on resize --- packages/window-dom/src/hooks/window.js | 25 +++++++++++++++--- packages/window-dom/src/plugin.js | 7 ++++++ packages/window-dom/src/systems/index.js | 32 ++++++++++++++++++++++++ packages/window/src/commands/window.js | 12 +++++++-- 4 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 packages/window-dom/src/systems/index.js 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..a6c79252 --- /dev/null +++ b/packages/window-dom/src/systems/index.js @@ -0,0 +1,32 @@ +import { Events } from "@wimaengine/event" +import { typeidGeneric } from "@wimaengine/type" +import { EntityHandle, Query, World } from "@wimaengine/ecs" +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)) + }) +} \ No newline at end of file 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: From 9fb6a239be98de733a60f9c9cf20ada05c140698 Mon Sep 17 00:00:00 2001 From: waynemwashuma <94756970+waynemwashuma@users.noreply.github.com> Date: Sat, 18 Jul 2026 10:54:22 +0300 Subject: [PATCH 4/4] Lint files --- packages/window-dom/src/systems/index.js | 46 ++++++++++++------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/packages/window-dom/src/systems/index.js b/packages/window-dom/src/systems/index.js index a6c79252..2b6827c9 100644 --- a/packages/window-dom/src/systems/index.js +++ b/packages/window-dom/src/systems/index.js @@ -1,32 +1,32 @@ -import { Events } from "@wimaengine/event" -import { typeidGeneric } from "@wimaengine/type" -import { EntityHandle, Query, World } from "@wimaengine/ecs" -import { Window, Windows, WindowResize } from "@wimaengine/window" - +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 + * @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])) + 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) + windows.each(([entity, window]) => { + const canvas = canvases.getWindow(entity) - if (!(canvas instanceof HTMLCanvasElement)) { - return - } + if (!(canvas instanceof HTMLCanvasElement)) { + return + } - const rect = canvas.getBoundingClientRect() + const rect = canvas.getBoundingClientRect() - if (rect.width === window.getWidth() || rect.height === window.getHeight()) { - return - } + if (rect.width === window.getWidth() || rect.height === window.getHeight()) { + return + } - window.set(rect.width, rect.height) - dispatch.write(new WindowResize(rect.width, rect.height)) - }) -} \ No newline at end of file + window.set(rect.width, rect.height) + dispatch.write(new WindowResize(rect.width, rect.height)) + }) +}