panel: Drag topmost maximized window
This makes it possible to drag a window which appears connected with the panel, even if it is not in focus. As a result, it should be easier to manipulate side-by-side windows. https://bugzilla.gnome.org/show_bug.cgi?id=679290
This commit is contained in:
parent
5520bb3890
commit
03117d65b2
@ -971,22 +971,11 @@ class Panel extends St.Widget {
|
|||||||
if (isPress && button != 1)
|
if (isPress && button != 1)
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
let focusWindow = global.display.focus_window;
|
|
||||||
if (!focusWindow)
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
|
|
||||||
let dragWindow = focusWindow.is_attached_dialog() ? focusWindow.get_transient_for()
|
|
||||||
: focusWindow;
|
|
||||||
if (!dragWindow)
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
|
|
||||||
let rect = dragWindow.get_frame_rect();
|
|
||||||
let [stageX, stageY] = event.get_coords();
|
let [stageX, stageY] = event.get_coords();
|
||||||
|
|
||||||
let allowDrag = dragWindow.maximized_vertically &&
|
let dragWindow = this._getDraggableWindowForPosition(stageX);
|
||||||
stageX > rect.x && stageX < rect.x + rect.width;
|
|
||||||
|
|
||||||
if (!allowDrag)
|
if (!dragWindow)
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
global.display.begin_grab_op(dragWindow,
|
global.display.begin_grab_op(dragWindow,
|
||||||
@ -1196,4 +1185,21 @@ class Panel extends St.Widget {
|
|||||||
Main.messageTray.bannerBlocked = isOpen;
|
Main.messageTray.bannerBlocked = isOpen;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_getDraggableWindowForPosition(stageX) {
|
||||||
|
let workspaceManager = global.workspace_manager;
|
||||||
|
let workspace = workspaceManager.get_active_workspace()
|
||||||
|
let allWindowsByStacking = global.display.sort_windows_by_stacking(
|
||||||
|
workspace.list_windows()
|
||||||
|
).reverse();
|
||||||
|
|
||||||
|
return allWindowsByStacking.find(metaWindow => {
|
||||||
|
let rect = metaWindow.get_frame_rect();
|
||||||
|
return metaWindow.is_on_primary_monitor() &&
|
||||||
|
metaWindow.showing_on_its_workspace() &&
|
||||||
|
metaWindow.get_window_type() != Meta.WindowType.DESKTOP &&
|
||||||
|
metaWindow.maximized_vertically &&
|
||||||
|
stageX > rect.x && stageX < rect.x + rect.width
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user