From 9e08221a2d18248995b3ff62704055b2ca113306 Mon Sep 17 00:00:00 2001 From: Lucas Oskorep Date: Tue, 20 May 2025 01:48:34 -0400 Subject: [PATCH] fix: bug with window manager resizing a window during grab ops for 1 frame when the background had to be tiled --- src/wm/window.ts | 4 ++-- src/wm/windowManager.ts | 33 ++++++++++++++++++++++++++------- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/wm/window.ts b/src/wm/window.ts index 92176a7..944f1e5 100644 --- a/src/wm/window.ts +++ b/src/wm/window.ts @@ -48,6 +48,7 @@ export class WindowWrapper { this._dragging = true; } stopDragging(): void { + Logger.log("STOPPED DRAGGING") this._dragging = false; } @@ -120,12 +121,11 @@ export class WindowWrapper { } } - // This is meant to be an exact copy of Forge's move function, renamed to maintain your API safelyResizeWindow(rect: Rect): void { // Keep minimal logging if (this._dragging) { Logger.info("STOPPED RESIZE BECAUSE ITEM IS BEING DRAGGED") - return + return; } Logger.log("SAFELY RESIZE", rect.x, rect.y, rect.width, rect.height); const actor = this._window.get_compositor_private(); diff --git a/src/wm/windowManager.ts b/src/wm/windowManager.ts index 0514120..71c8dd4 100644 --- a/src/wm/windowManager.ts +++ b/src/wm/windowManager.ts @@ -190,10 +190,13 @@ export default class WindowManager implements IWindowManager { handleGrabOpBegin(display: Meta.Display, window: Meta.Window, op: Meta.GrabOp): void { - Logger.log("Grab Op Start"); + if (op === Meta.GrabOp.MOVING_UNCONSTRAINED){ + + } + Logger.log("Grab Op Start", op); Logger.log(display, window, op) Logger.log(window.get_monitor()) - + this._getWrappedWindow(window)?.startDragging(); this._grabbedWindowMonitor = window.get_monitor(); this._grabbedWindowId = window.get_id(); } @@ -203,35 +206,51 @@ export default class WindowManager implements IWindowManager { Logger.log("primary display", display.get_primary_monitor()) this._grabbedWindowId = _UNUSED_WINDOW_ID; var rect = window.get_frame_rect() + this._getWrappedWindow(window)?.stopDragging(); Logger.info("Release Location", window.get_monitor(), rect.x, rect.y, rect.width, rect.height) // previously window was moved to a new monitor here instead of it being fluid during drag events. this._tileMonitors(); Logger.info("monitor_start and monitor_end", this._grabbedWindowMonitor, window.get_monitor()); } - _moveWindowToMonitor(window: Meta.Window, monitorId: number): void { - Logger.info("MOVING WINDOW TO MONITOR", window.get_id(), monitorId); + _getWrappedWindow(window: Meta.Window): WindowWrapper | undefined { + let wrapped = undefined; + for (const monitor of this._monitors.values()) { + wrapped = monitor.getWindow(window.get_id()); + if (wrapped !== undefined) { + break; + } + } + return wrapped; + } + + _getAndRemoveWrappedWindow(window: Meta.Window): WindowWrapper | undefined { let wrapped = undefined; for (const monitor of this._monitors.values()) { wrapped = monitor.getWindow(window.get_id()); if (wrapped !== undefined) { - Logger.error("FOUND WINDOW IN MONITOR") monitor.removeWindow(wrapped); break; } } + return wrapped; + } + + _moveWindowToMonitor(window: Meta.Window, monitorId: number): void { + Logger.info("MOVING WINDOW TO MONITOR", window.get_id(), monitorId); + let wrapped = this._getAndRemoveWrappedWindow(window); if (wrapped === undefined) { Logger.error("WINDOW NOT DEFINED") wrapped = new WindowWrapper(window, this.handleWindowMinimized); wrapped.connectWindowSignals(this); } - wrapped.startDragging() + // wrapped.startDragging() let new_mon = this._monitors.get(monitorId); new_mon?.addWindow(wrapped) Logger.info("UPDATE MONITOR", new_mon); this._grabbedWindowMonitor = monitorId; - wrapped.stopDragging(); + // wrapped.stopDragging(); } public handleWindowPositionChanged(winWrap: WindowWrapper): void {