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:
@ -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();
|
||||||
|
@ -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 {
|
||||||
|
Reference in New Issue
Block a user