Date: Friday, August 2, 2019 @ 10:07:28 Author: heftig Revision: 358884
3.32.2+11+g1c6abf378-1: performance improvements picked from Pop!OS Added: gnome-shell/trunk/0001-js-ui-Use-captured-event-nonmotion.patch gnome-shell/trunk/0001-tweener-Remove-handlers-on-target.patch Modified: gnome-shell/trunk/PKGBUILD -----------------------------------------------+ 0001-js-ui-Use-captured-event-nonmotion.patch | 87 ++++++++++++++++++++ 0001-tweener-Remove-handlers-on-target.patch | 101 ++++++++++++++++++++++++ PKGBUILD | 20 +++- 3 files changed, 204 insertions(+), 4 deletions(-) Added: 0001-js-ui-Use-captured-event-nonmotion.patch =================================================================== --- 0001-js-ui-Use-captured-event-nonmotion.patch (rev 0) +++ 0001-js-ui-Use-captured-event-nonmotion.patch 2019-08-02 10:07:28 UTC (rev 358884) @@ -0,0 +1,87 @@ +From 81c17e5993001cf30d706642d67e09812136adf2 Mon Sep 17 00:00:00 2001 +From: Daniel van Vugt <daniel.van.v...@canonical.com> +Date: Fri, 2 Nov 2018 17:58:37 +0800 +Subject: [PATCH] js/ui: Use captured-event::nonmotion + +Cherry picked from commit 297a18f29a423da26fd86417e6c1fe82349d8f98. + +This new detail filters out mouse motion events so we don't waste CPU +translating them all into JavaScript handlers that don't care about them. + +This helps with https://gitlab.gnome.org/GNOME/mutter/issues/283 +--- + js/ui/padOsd.js | 2 +- + js/ui/panel.js | 2 +- + js/ui/status/system.js | 2 +- + js/ui/viewSelector.js | 2 +- + js/ui/windowManager.js | 2 +- + 5 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/js/ui/padOsd.js b/js/ui/padOsd.js +index a4af47297..6bff40849 100644 +--- a/js/ui/padOsd.js ++++ b/js/ui/padOsd.js +@@ -615,7 +615,7 @@ var PadOsd = class { + this._settings = settings; + this._imagePath = imagePath; + this._editionMode = editionMode; +- this._capturedEventId = global.stage.connect('captured-event', this._onCapturedEvent.bind(this)); ++ this._capturedEventId = global.stage.connect('captured-event::nonmotion', this._onCapturedEvent.bind(this)); + this._padChooser = null; + + let deviceManager = Clutter.DeviceManager.get_default(); +diff --git a/js/ui/panel.js b/js/ui/panel.js +index 16484850a..57f0778b1 100644 +--- a/js/ui/panel.js ++++ b/js/ui/panel.js +@@ -473,7 +473,7 @@ class ActivitiesButton extends PanelMenu.Button { + + this.actor.label_actor = this._label; + +- this.actor.connect('captured-event', this._onCapturedEvent.bind(this)); ++ this.actor.connect('captured-event::nonmotion', this._onCapturedEvent.bind(this)); + this.actor.connect_after('key-release-event', this._onKeyRelease.bind(this)); + + Main.overview.connect('showing', () => { +diff --git a/js/ui/status/system.js b/js/ui/status/system.js +index 1b0d10d8c..b25a6bf32 100644 +--- a/js/ui/status/system.js ++++ b/js/ui/status/system.js +@@ -23,7 +23,7 @@ var AltSwitcher = class { + this._alternate.connect('clicked', + () => { this._clickAction.release(); }); + +- this._capturedEventId = global.stage.connect('captured-event', this._onCapturedEvent.bind(this)); ++ this._capturedEventId = global.stage.connect('captured-event::nonmotion', this._onCapturedEvent.bind(this)); + + this._flipped = false; + +diff --git a/js/ui/viewSelector.js b/js/ui/viewSelector.js +index 77146552d..092ff8f1c 100644 +--- a/js/ui/viewSelector.js ++++ b/js/ui/viewSelector.js +@@ -44,7 +44,7 @@ function getTermsForSearchString(searchString) { + + var TouchpadShowOverviewAction = class { + constructor(actor) { +- actor.connect('captured-event', this._handleEvent.bind(this)); ++ actor.connect('captured-event::nonmotion', this._handleEvent.bind(this)); + } + + _handleEvent(actor, event) { +diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js +index b9f5fef46..97d980940 100644 +--- a/js/ui/windowManager.js ++++ b/js/ui/windowManager.js +@@ -461,7 +461,7 @@ var TouchpadWorkspaceSwitchAction = class { + this._dx = 0; + this._dy = 0; + this._enabled = true; +- actor.connect('captured-event', this._handleEvent.bind(this)); ++ actor.connect('captured-event::nonmotion', this._handleEvent.bind(this)); + this._touchpadSettings = new Gio.Settings({schema_id: 'org.gnome.desktop.peripherals.touchpad'}); + } + +-- +2.22.0 + Added: 0001-tweener-Remove-handlers-on-target.patch =================================================================== --- 0001-tweener-Remove-handlers-on-target.patch (rev 0) +++ 0001-tweener-Remove-handlers-on-target.patch 2019-08-02 10:07:28 UTC (rev 358884) @@ -0,0 +1,101 @@ +From 5cd8acebe8461850667215b4c6b19e9ebf4c82f2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= <m...@3v1n0.net> +Date: Tue, 5 Dec 2017 02:41:50 +0100 +Subject: [PATCH] tweener: Save handlers on target and remove them on destroy + +Cherry picked from commit 28ac564b568e4546d32728b426e9d0414e95d30d. + +A tweener onComplete handler could be called when the target actor has already +been destroyed, and this could lead accessing to invalid properties of it. + +So, wrap the handlers with lambda functions that we delete them when the object +state so that they are not called anymore after this point. + +https://bugzilla.gnome.org/show_bug.cgi?id=791233 +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/4 +--- + js/ui/tweener.js | 56 +++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 44 insertions(+), 12 deletions(-) + +diff --git a/js/ui/tweener.js b/js/ui/tweener.js +index bb9ea557c..25338367d 100644 +--- a/js/ui/tweener.js ++++ b/js/ui/tweener.js +@@ -63,30 +63,62 @@ function _getTweenState(target) { + return target.__ShellTweenerState; + } + ++function _ensureHandlers(target) { ++ if (!target.__ShellTweenerHandlers) ++ target.__ShellTweenerHandlers = new Map(); ++ return target.__ShellTweenerHandlers; ++} ++ + function _resetTweenState(target) { + let state = target.__ShellTweenerState; + + if (state) { +- if (state.destroyedId) ++ if (state.destroyedId) { + state.actor.disconnect(state.destroyedId); ++ delete state.destroyedId; ++ } + } + ++ _removeHandler(target, 'onComplete', _tweenCompleted); + target.__ShellTweenerState = {}; + } + + function _addHandler(target, params, name, handler) { +- if (params[name]) { +- let oldHandler = params[name]; +- let oldScope = params[name + 'Scope']; +- let oldParams = params[name + 'Params']; +- let eventScope = oldScope ? oldScope : target; ++ let wrapperNeeded = false; ++ let tweenerHandlers = _ensureHandlers(target); + +- params[name] = () => { +- oldHandler.apply(eventScope, oldParams); +- handler(target); +- }; +- } else +- params[name] = () => { handler(target); }; ++ if (!tweenerHandlers.has(name)) { ++ tweenerHandlers.set(name, []); ++ wrapperNeeded = true; ++ } ++ ++ let handlers = tweenerHandlers.get(name); ++ handlers.push(handler); ++ ++ if (wrapperNeeded) { ++ if (params[name]) { ++ let oldHandler = params[name]; ++ let oldScope = params[`${name}Scope`]; ++ let oldParams = params[`${name}Params`]; ++ let eventScope = oldScope ? oldScope : target; ++ ++ params[name] = () => { ++ oldHandler.apply(eventScope, oldParams); ++ handlers.forEach(h => h(target)); ++ }; ++ } else { ++ params[name] = () => handlers.forEach(h => h(target)); ++ } ++ } ++} ++ ++function _removeHandler(target, name, handler) { ++ let tweenerHandlers = _ensureHandlers(target); ++ ++ if (tweenerHandlers.has(name)) { ++ let handlers = tweenerHandlers.get(name).filter(h => h != handler); ++ tweenerHandlers.set(name, handlers); ++ } + } + + function _actorDestroyed(target) { +-- +2.22.0 + Modified: PKGBUILD =================================================================== --- PKGBUILD 2019-08-02 10:06:41 UTC (rev 358883) +++ PKGBUILD 2019-08-02 10:07:28 UTC (rev 358884) @@ -3,7 +3,7 @@ # Contributor: Flamelab <panosfi...@gmail.com pkgname=gnome-shell -pkgver=3.32.2+6+g8b9874089 +pkgver=3.32.2+11+g1c6abf378 pkgrel=1 epoch=1 pkgdesc="Next generation desktop shell" @@ -19,11 +19,15 @@ 'evolution-data-server: Evolution calendar integration') groups=(gnome) install=gnome-shell.install -_commit=8b98740897e016d2794add7f5094bd822692fbf4 # gnome-3-32 +_commit=1c6abf37855cd4f834569b6db32d32c1d8876f2a # gnome-3-32 source=("git+https://gitlab.gnome.org/GNOME/gnome-shell.git#commit=$_commit" - "git+https://gitlab.gnome.org/GNOME/libgnome-volume-control.git") + "git+https://gitlab.gnome.org/GNOME/libgnome-volume-control.git" + 0001-tweener-Remove-handlers-on-target.patch + 0001-js-ui-Use-captured-event-nonmotion.patch) sha256sums=('SKIP' - 'SKIP') + 'SKIP' + '241bea1273982bc97a58d0e25d610c6cbbc3e3be72a203015826dc599b3303c0' + '27b0e188bc25e59a4907e326bf890ac3e5164c660cf67366394d91000d5cee0c') pkgver() { cd $pkgname @@ -33,6 +37,14 @@ prepare() { cd $pkgname + # fix gjs errors + git apply -3 ../0001-tweener-Remove-handlers-on-target.patch # !4 + git cherry-pick -n aec015d5ca14c7e28355f3ef9520b0f01280a51f # !190 + git cherry-pick -n 2ef883dcada125bd8d5e54d7020c26cc3ec7e4f7 # !190 + + # reduce overhead moving cursor or windows + git apply -3 ../0001-js-ui-Use-captured-event-nonmotion.patch # !276 + git submodule init git config --local submodule.subprojects/gvc.url "$srcdir/libgnome-volume-control" git submodule update