windowManager: Allow switching workspaces with super-scroll

So far, we couldn't allow workspace scrolling outside the overview
because scroll events were always sent to clients. However mutter
was changed recently to pass on scroll events when the mouse button
modifier (usually super) is pressed, which allows us to enable the
same workspace scrolling as in the overview now.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1612>
This commit is contained in:
Florian Müllner 2021-01-29 20:33:23 +01:00 committed by Marge Bot
parent ac8246050d
commit 7aa36ad239
2 changed files with 19 additions and 1 deletions

View File

@ -862,6 +862,16 @@ var WindowManager = class {
Shell.ActionMode.OVERVIEW, Shell.ActionMode.OVERVIEW,
this._switchToApplication.bind(this)); this._switchToApplication.bind(this));
global.stage.connect('scroll-event', (stage, event) => {
if (this._workspaceAnimation.canHandleScrollEvent(event))
return Clutter.EVENT_PROPAGATE;
if ((event.get_state() & global.display.compositor_modifiers) === 0)
return Clutter.EVENT_PROPAGATE;
return this.handleWorkspaceScroll(event);
});
global.display.connect('show-resize-popup', this._showResizePopup.bind(this)); global.display.connect('show-resize-popup', this._showResizePopup.bind(this));
global.display.connect('show-pad-osd', this._showPadOsd.bind(this)); global.display.connect('show-pad-osd', this._showPadOsd.bind(this));
global.display.connect('show-osd', (display, monitorIndex, iconName, label) => { global.display.connect('show-osd', (display, monitorIndex, iconName, label) => {

View File

@ -284,11 +284,15 @@ var WorkspaceAnimationController = class {
}); });
const swipeTracker = new SwipeTracker.SwipeTracker(global.stage, const swipeTracker = new SwipeTracker.SwipeTracker(global.stage,
Shell.ActionMode.NORMAL, { allowDrag: false, allowScroll: false }); Shell.ActionMode.NORMAL, { allowDrag: false });
swipeTracker.connect('begin', this._switchWorkspaceBegin.bind(this)); swipeTracker.connect('begin', this._switchWorkspaceBegin.bind(this));
swipeTracker.connect('update', this._switchWorkspaceUpdate.bind(this)); swipeTracker.connect('update', this._switchWorkspaceUpdate.bind(this));
swipeTracker.connect('end', this._switchWorkspaceEnd.bind(this)); swipeTracker.connect('end', this._switchWorkspaceEnd.bind(this));
this._swipeTracker = swipeTracker; this._swipeTracker = swipeTracker;
global.display.bind_property('compositor-modifiers',
this._swipeTracker, 'scroll-modifiers',
GObject.BindingFlags.SYNC_CREATE);
} }
_prepareWorkspaceSwitch(workspaceIndices) { _prepareWorkspaceSwitch(workspaceIndices) {
@ -390,6 +394,10 @@ var WorkspaceAnimationController = class {
} }
} }
canHandleScrollEvent(event) {
return this._swipeTracker.canHandleScrollEvent(event);
}
_findMonitorGroup(monitorIndex) { _findMonitorGroup(monitorIndex) {
return this._switchData.monitors.find(m => m.index === monitorIndex); return this._switchData.monitors.find(m => m.index === monitorIndex);
} }