fix: bug with window manager resizing a window during grab ops for 1 frame when the background had to be tiled

This commit is contained in:
Lucas Oskorep
2025-05-20 01:48:34 -04:00
parent 5e9bc796ea
commit ecb5a568cd
2 changed files with 28 additions and 9 deletions

View File

@ -48,6 +48,7 @@ export class WindowWrapper {
this._dragging = true; this._dragging = true;
} }
stopDragging(): void { stopDragging(): void {
Logger.log("STOPPED DRAGGING")
this._dragging = false; 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 { safelyResizeWindow(rect: Rect): void {
// Keep minimal logging // Keep minimal logging
if (this._dragging) { if (this._dragging) {
Logger.info("STOPPED RESIZE BECAUSE ITEM IS BEING DRAGGED") Logger.info("STOPPED RESIZE BECAUSE ITEM IS BEING DRAGGED")
return return;
} }
Logger.log("SAFELY RESIZE", rect.x, rect.y, rect.width, rect.height); Logger.log("SAFELY RESIZE", rect.x, rect.y, rect.width, rect.height);
const actor = this._window.get_compositor_private(); const actor = this._window.get_compositor_private();

View File

@ -190,10 +190,13 @@ export default class WindowManager implements IWindowManager {
handleGrabOpBegin(display: Meta.Display, window: Meta.Window, op: Meta.GrabOp): void { 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(display, window, op)
Logger.log(window.get_monitor()) Logger.log(window.get_monitor())
this._getWrappedWindow(window)?.startDragging();
this._grabbedWindowMonitor = window.get_monitor(); this._grabbedWindowMonitor = window.get_monitor();
this._grabbedWindowId = window.get_id(); this._grabbedWindowId = window.get_id();
} }
@ -203,35 +206,51 @@ export default class WindowManager implements IWindowManager {
Logger.log("primary display", display.get_primary_monitor()) Logger.log("primary display", display.get_primary_monitor())
this._grabbedWindowId = _UNUSED_WINDOW_ID; this._grabbedWindowId = _UNUSED_WINDOW_ID;
var rect = window.get_frame_rect() 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) 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. // previously window was moved to a new monitor here instead of it being fluid during drag events.
this._tileMonitors(); this._tileMonitors();
Logger.info("monitor_start and monitor_end", this._grabbedWindowMonitor, window.get_monitor()); Logger.info("monitor_start and monitor_end", this._grabbedWindowMonitor, window.get_monitor());
} }
_moveWindowToMonitor(window: Meta.Window, monitorId: number): void { _getWrappedWindow(window: Meta.Window): WindowWrapper | undefined {
Logger.info("MOVING WINDOW TO MONITOR", window.get_id(), monitorId); 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; let wrapped = undefined;
for (const monitor of this._monitors.values()) { for (const monitor of this._monitors.values()) {
wrapped = monitor.getWindow(window.get_id()); wrapped = monitor.getWindow(window.get_id());
if (wrapped !== undefined) { if (wrapped !== undefined) {
Logger.error("FOUND WINDOW IN MONITOR")
monitor.removeWindow(wrapped); monitor.removeWindow(wrapped);
break; 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) { if (wrapped === undefined) {
Logger.error("WINDOW NOT DEFINED") Logger.error("WINDOW NOT DEFINED")
wrapped = new WindowWrapper(window, this.handleWindowMinimized); wrapped = new WindowWrapper(window, this.handleWindowMinimized);
wrapped.connectWindowSignals(this); wrapped.connectWindowSignals(this);
} }
wrapped.startDragging() // wrapped.startDragging()
let new_mon = this._monitors.get(monitorId); let new_mon = this._monitors.get(monitorId);
new_mon?.addWindow(wrapped) new_mon?.addWindow(wrapped)
Logger.info("UPDATE MONITOR", new_mon); Logger.info("UPDATE MONITOR", new_mon);
this._grabbedWindowMonitor = monitorId; this._grabbedWindowMonitor = monitorId;
wrapped.stopDragging(); // wrapped.stopDragging();
} }
public handleWindowPositionChanged(winWrap: WindowWrapper): void { public handleWindowPositionChanged(winWrap: WindowWrapper): void {