diff --git a/0001-windowAttentionHandler-Handle-XUrgencyHint-as-well.patch b/0001-windowAttentionHandler-Handle-XUrgencyHint-as-well.patch new file mode 100644 index 0000000..26057fa --- /dev/null +++ b/0001-windowAttentionHandler-Handle-XUrgencyHint-as-well.patch @@ -0,0 +1,53 @@ +From 284978757ee6b13dc9678700e2b1972507dbaaa5 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Fri, 13 Jul 2018 19:16:14 +0200 +Subject: [PATCH 01/25] windowAttentionHandler: Handle XUrgencyHint as well + +While it's not commonly used, it is easy enough to handle it the +same as the demands-attention hint, so do just that. + +https://bugzilla.gnome.org/show_bug.cgi?id=643595 +--- + js/ui/windowAttentionHandler.js | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +diff --git a/js/ui/windowAttentionHandler.js b/js/ui/windowAttentionHandler.js +index 524e47c0f..a8c688ef3 100644 +--- a/js/ui/windowAttentionHandler.js ++++ b/js/ui/windowAttentionHandler.js +@@ -13,6 +13,8 @@ var WindowAttentionHandler = new Lang.Class({ + this._tracker = Shell.WindowTracker.get_default(); + this._windowDemandsAttentionId = global.display.connect('window-demands-attention', + this._onWindowDemandsAttention.bind(this)); ++ this._windowMarkedUrgentId = global.display.connect('window-marked-urgent', ++ this._onWindowDemandsAttention.bind(this)); + }, + + _getTitleAndBanner(app, window) { +@@ -66,7 +68,9 @@ var Source = new Lang.Class({ + + this.signalIDs = []; + this.signalIDs.push(this._window.connect('notify::demands-attention', +- () => { this.destroy(); })); ++ this._sync.bind(this)); ++ this.signalIDs.push(this._window.connect('notify::urgent', ++ this._sync.bind(this)); + this.signalIDs.push(this._window.connect('focus', + () => { this.destroy(); })); + this.signalIDs.push(this._window.connect('unmanaged', +@@ -75,6 +79,12 @@ var Source = new Lang.Class({ + this.connect('destroy', this._onDestroy.bind(this)); + }, + ++ _sync() { ++ if (this._window.demands_attention || this._window.urgent) ++ return; ++ this.destroy(); ++ }, ++ + _onDestroy() { + for(let i = 0; i < this.signalIDs.length; i++) { + this._window.disconnect(this.signalIDs[i]); +-- +2.20.0 + diff --git a/0002-keyboard-split-out-a-function-to-udpate-the-MRU-list.patch b/0002-keyboard-split-out-a-function-to-udpate-the-MRU-list.patch new file mode 100644 index 0000000..7333411 --- /dev/null +++ b/0002-keyboard-split-out-a-function-to-udpate-the-MRU-list.patch @@ -0,0 +1,80 @@ +From f81887772ac0e5adc4fac1c3a1839bbd8c87ff13 Mon Sep 17 00:00:00 2001 +From: Cosimo Cecchi +Date: Wed, 25 May 2016 11:28:57 -0700 +Subject: [PATCH 2/4] keyboard: split out a function to udpate the MRU list + +We're going to add saving of the MRU list in the function in a later +commit. + +https://bugzilla.gnome.org/show_bug.cgi?id=766826 +--- + js/ui/status/keyboard.js | 46 +++++++++++++++++++++++++--------------------- + 1 file changed, 25 insertions(+), 21 deletions(-) + +diff --git a/js/ui/status/keyboard.js b/js/ui/status/keyboard.js +index 895b73c..8f45b0d 100644 +--- a/js/ui/status/keyboard.js ++++ b/js/ui/status/keyboard.js +@@ -440,6 +440,30 @@ const InputSourceManager = new Lang.Class({ + this._currentInputSourceChanged(is); + }, + ++ _updateMruSources: function() { ++ let sourcesList = []; ++ for (let i in this._inputSources) ++ sourcesList.push(this._inputSources[i]); ++ ++ this._keyboardManager.setUserLayouts(sourcesList.map(function(x) { return x.xkbId; })); ++ ++ if (!this._disableIBus && this._mruSourcesBackup) { ++ this._mruSources = this._mruSourcesBackup; ++ this._mruSourcesBackup = null; ++ } ++ ++ let mruSources = []; ++ for (let i = 0; i < this._mruSources.length; i++) { ++ for (let j = 0; j < sourcesList.length; j++) ++ if (this._mruSources[i].type == sourcesList[j].type && ++ this._mruSources[i].id == sourcesList[j].id) { ++ mruSources = mruSources.concat(sourcesList.splice(j, 1)); ++ break; ++ } ++ } ++ this._mruSources = mruSources.concat(sourcesList); ++ }, ++ + _inputSourcesChanged: function() { + let sources = this._settings.inputSources; + let nSources = sources.length; +@@ -514,27 +538,7 @@ const InputSourceManager = new Lang.Class({ + + this.emit('sources-changed'); + +- let sourcesList = []; +- for (let i in this._inputSources) +- sourcesList.push(this._inputSources[i]); +- +- this._keyboardManager.setUserLayouts(sourcesList.map(function(x) { return x.xkbId; })); +- +- if (!this._disableIBus && this._mruSourcesBackup) { +- this._mruSources = this._mruSourcesBackup; +- this._mruSourcesBackup = null; +- } +- +- let mruSources = []; +- for (let i = 0; i < this._mruSources.length; i++) { +- for (let j = 0; j < sourcesList.length; j++) +- if (this._mruSources[i].type == sourcesList[j].type && +- this._mruSources[i].id == sourcesList[j].id) { +- mruSources = mruSources.concat(sourcesList.splice(j, 1)); +- break; +- } +- } +- this._mruSources = mruSources.concat(sourcesList); ++ this._updateMruSources(); + + if (this._mruSources.length > 0) + this._mruSources[0].activate(); +-- +2.7.4 + diff --git a/0002-windowAttentionHandler-Fix-syntax-errors.patch b/0002-windowAttentionHandler-Fix-syntax-errors.patch new file mode 100644 index 0000000..dc432a1 --- /dev/null +++ b/0002-windowAttentionHandler-Fix-syntax-errors.patch @@ -0,0 +1,29 @@ +From 240f3faf6e58070fa98cab30bd2b9ff83f759a1c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Wed, 14 Nov 2018 19:38:33 +0100 +Subject: [PATCH 02/25] windowAttentionHandler: Fix syntax errors + +Gah, why didn't we catch those?! +--- + js/ui/windowAttentionHandler.js | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/js/ui/windowAttentionHandler.js b/js/ui/windowAttentionHandler.js +index a8c688ef3..3e53f60b5 100644 +--- a/js/ui/windowAttentionHandler.js ++++ b/js/ui/windowAttentionHandler.js +@@ -68,9 +68,9 @@ var Source = new Lang.Class({ + + this.signalIDs = []; + this.signalIDs.push(this._window.connect('notify::demands-attention', +- this._sync.bind(this)); ++ this._sync.bind(this))); + this.signalIDs.push(this._window.connect('notify::urgent', +- this._sync.bind(this)); ++ this._sync.bind(this))); + this.signalIDs.push(this._window.connect('focus', + () => { this.destroy(); })); + this.signalIDs.push(this._window.connect('unmanaged', +-- +2.20.0 + diff --git a/0003-keyboard-add-an-interactive-argument-to-input-source.patch b/0003-keyboard-add-an-interactive-argument-to-input-source.patch new file mode 100644 index 0000000..e0dc246 --- /dev/null +++ b/0003-keyboard-add-an-interactive-argument-to-input-source.patch @@ -0,0 +1,89 @@ +From 5c0eba7d3be5997d973c3f0a06f2ecd4aa3e5db5 Mon Sep 17 00:00:00 2001 +From: Cosimo Cecchi +Date: Wed, 25 May 2016 11:54:33 -0700 +Subject: [PATCH 3/4] keyboard: add an interactive argument to input source + activation + +This is useful to differentiate between a change due to user interaction +or automatic loading. + +https://bugzilla.gnome.org/show_bug.cgi?id=766826 +--- + js/ui/status/keyboard.js | 19 +++++++++++-------- + 1 file changed, 11 insertions(+), 8 deletions(-) + +diff --git a/js/ui/status/keyboard.js b/js/ui/status/keyboard.js +index 8f45b0d..1020994 100644 +--- a/js/ui/status/keyboard.js ++++ b/js/ui/status/keyboard.js +@@ -61,8 +61,8 @@ const InputSource = new Lang.Class({ + this.emit('changed'); + }, + +- activate: function() { +- this.emit('activate'); ++ activate: function(interactive) { ++ this.emit('activate', !!interactive); + }, + + _getXkbId: function() { +@@ -109,7 +109,7 @@ const InputSourcePopup = new Lang.Class({ + _finish : function() { + this.parent(); + +- this._items[this._selectedIndex].activate(); ++ this._items[this._selectedIndex].activate(true); + }, + }); + +@@ -376,7 +376,7 @@ const InputSourceManager = new Lang.Class({ + while (!(is = this._inputSources[nextIndex])) + nextIndex += 1; + +- is.activate(); ++ is.activate(true); + return true; + }, + +@@ -420,7 +420,7 @@ const InputSourceManager = new Lang.Class({ + this._changePerWindowSource(); + }, + +- _activateInputSource: function(is) { ++ _activateInputSource: function(is, interactive) { + KeyboardManager.holdKeyboard(); + this._keyboardManager.apply(is.xkbId); + +@@ -541,7 +541,7 @@ const InputSourceManager = new Lang.Class({ + this._updateMruSources(); + + if (this._mruSources.length > 0) +- this._mruSources[0].activate(); ++ this._mruSources[0].activate(false); + + // All ibus engines are preloaded here to reduce the launching time + // when users switch the input sources. +@@ -650,7 +650,7 @@ const InputSourceManager = new Lang.Class({ + } + + if (window._currentSource) +- window._currentSource.activate(); ++ window._currentSource.activate(false); + }, + + _sourcesPerWindowChanged: function() { +@@ -771,7 +771,10 @@ const InputSourceIndicator = new Lang.Class({ + let is = this._inputSourceManager.inputSources[i]; + + let menuItem = new LayoutMenuItem(is.displayName, is.shortName); +- menuItem.connect('activate', Lang.bind(is, is.activate)); ++ menuItem.connect('activate', function() { ++ is.activate(true); ++ }); ++ + let indicatorLabel = new St.Label({ text: is.shortName, + visible: false }); + +-- +2.7.4 + diff --git a/0003-power-Label-the-PENDING_CHARGE-state-as-Not-Charging.patch b/0003-power-Label-the-PENDING_CHARGE-state-as-Not-Charging.patch new file mode 100644 index 0000000..f381cd9 --- /dev/null +++ b/0003-power-Label-the-PENDING_CHARGE-state-as-Not-Charging.patch @@ -0,0 +1,36 @@ +From 52c59ac0dd7ddbe064ea4b9873492ec76e289c65 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Rechi=20Vita?= +Date: Fri, 2 Nov 2018 13:51:33 -0700 +Subject: [PATCH 03/25] power: Label the PENDING_CHARGE state as "Not Charging" + +The pending-charge state means AC power is on but the battery is not +being charged. This can happen because its charge is above a certain +threshold, to avoid short charging cycles and prolong the battery's +life, or because the PSU is not powerful enough to charge the batteries. + +Instead of lying to the user about something being estimated, we should +simply tell the truth and set the label to "Not Charging". + +Closes: #701. +--- + js/ui/status/power.js | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/js/ui/status/power.js b/js/ui/status/power.js +index f21693f53..4a6ce2c24 100644 +--- a/js/ui/status/power.js ++++ b/js/ui/status/power.js +@@ -70,7 +70,9 @@ var Indicator = new Lang.Class({ + seconds = this._proxy.TimeToFull; + else if (this._proxy.State == UPower.DeviceState.DISCHARGING) + seconds = this._proxy.TimeToEmpty; +- // state is one of PENDING_CHARGING, PENDING_DISCHARGING ++ else if (this._proxy.State == UPower.DeviceState.PENDING_CHARGE) ++ return _("Not Charging"); ++ // state is PENDING_DISCHARGE + else + return _("Estimating…"); + +-- +2.20.0 + diff --git a/0004-keyboard-save-the-MRU-input-sources-list-when-switch.patch b/0004-keyboard-save-the-MRU-input-sources-list-when-switch.patch new file mode 100644 index 0000000..72315e4 --- /dev/null +++ b/0004-keyboard-save-the-MRU-input-sources-list-when-switch.patch @@ -0,0 +1,123 @@ +From 2ea6ae05e579e07f03063e10e560c1339f6599c8 Mon Sep 17 00:00:00 2001 +From: Cosimo Cecchi +Date: Mon, 23 May 2016 16:24:50 -0700 +Subject: [PATCH 4/4] keyboard: save the MRU input sources list when switching + +And restore it when reloading the current list of sources, if +appropriate. + +https://bugzilla.gnome.org/show_bug.cgi?id=766826 +--- + js/ui/status/keyboard.js | 61 ++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 61 insertions(+) + +diff --git a/js/ui/status/keyboard.js b/js/ui/status/keyboard.js +index 1020994..d4b14d5 100644 +--- a/js/ui/status/keyboard.js ++++ b/js/ui/status/keyboard.js +@@ -159,6 +159,14 @@ const InputSourceSettings = new Lang.Class({ + return []; + }, + ++ get mruSources() { ++ return []; ++ }, ++ ++ set mruSources(sourcesList) { ++ // do nothing ++ }, ++ + get keyboardOptions() { + return []; + }, +@@ -251,6 +259,7 @@ const InputSourceSessionSettings = new Lang.Class({ + + _DESKTOP_INPUT_SOURCES_SCHEMA: 'org.gnome.desktop.input-sources', + _KEY_INPUT_SOURCES: 'sources', ++ _KEY_MRU_SOURCES: 'mru-sources', + _KEY_KEYBOARD_OPTIONS: 'xkb-options', + _KEY_PER_WINDOW: 'per-window', + +@@ -277,6 +286,15 @@ const InputSourceSessionSettings = new Lang.Class({ + return this._getSourcesList(this._KEY_INPUT_SOURCES); + }, + ++ get mruSources() { ++ return this._getSourcesList(this._KEY_MRU_SOURCES); ++ }, ++ ++ set mruSources(sourcesList) { ++ let sources = GLib.Variant.new('a(ss)', sourcesList); ++ this._settings.set_value(this._KEY_MRU_SOURCES, sources); ++ }, ++ + get keyboardOptions() { + return this._settings.get_strv(this._KEY_KEYBOARD_OPTIONS); + }, +@@ -404,6 +422,25 @@ const InputSourceManager = new Lang.Class({ + this._keyboardManager.reapply(); + }, + ++ _updateMruSettings: function() { ++ // If IBus is not ready we don't have a full picture of all ++ // the available sources, so don't update the setting ++ if (!this._ibusReady) ++ return; ++ ++ // If IBus is temporarily disabled, don't update the setting ++ if (this._disableIBus) ++ return; ++ ++ let sourcesList = []; ++ for (let i = 0; i < this._mruSources.length; ++i) { ++ let source = this._mruSources[i]; ++ sourcesList.push([source.type, source.id]); ++ } ++ ++ this._settings.mruSources = sourcesList; ++ }, ++ + _currentInputSourceChanged: function(newSource) { + let oldSource; + [oldSource, this._currentSource] = [this._currentSource, newSource]; +@@ -438,6 +475,9 @@ const InputSourceManager = new Lang.Class({ + + this._ibusManager.setEngine(engine, KeyboardManager.releaseKeyboard); + this._currentInputSourceChanged(is); ++ ++ if (interactive) ++ this._updateMruSettings(); + }, + + _updateMruSources: function() { +@@ -452,6 +492,27 @@ const InputSourceManager = new Lang.Class({ + this._mruSourcesBackup = null; + } + ++ // Initialize from settings when we have no MRU sources list ++ if (this._mruSources.length == 0) { ++ let mruSettings = this._settings.mruSources; ++ for (let i = 0; i < mruSettings.length; i++) { ++ let mruSettingSource = mruSettings[i]; ++ let mruSource = null; ++ ++ for (let j = 0; j < sourcesList.length; j++) { ++ let source = sourcesList[j]; ++ if (source.type == mruSettingSource.type && ++ source.id == mruSettingSource.id) { ++ mruSource = source; ++ break; ++ } ++ } ++ ++ if (mruSource) ++ this._mruSources.push(mruSource); ++ } ++ } ++ + let mruSources = []; + for (let i = 0; i < this._mruSources.length; i++) { + for (let j = 0; j < sourcesList.length; j++) +-- +2.7.4 + diff --git a/0001-ibusManager-Don-t-pass-undefined-callback-to-ibus.patch b/0007-ibusManager-Don-t-pass-undefined-callback-to-ibus.patch similarity index 93% rename from 0001-ibusManager-Don-t-pass-undefined-callback-to-ibus.patch rename to 0007-ibusManager-Don-t-pass-undefined-callback-to-ibus.patch index 2fba78b..f25e128 100644 --- a/0001-ibusManager-Don-t-pass-undefined-callback-to-ibus.patch +++ b/0007-ibusManager-Don-t-pass-undefined-callback-to-ibus.patch @@ -1,7 +1,7 @@ From 74bb9e62492bacda372904d30891eb97685e9b0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Thu, 15 Nov 2018 18:47:55 +0100 -Subject: [PATCH] ibusManager: Don't pass undefined callback to ibus +Subject: [PATCH 07/25] ibusManager: Don't pass undefined callback to ibus Since commit 551e8278416, we don't always pass a callback parameter. However passing it on as undefined to ibus doesn't work, as gjs doesn't @@ -29,5 +29,5 @@ index 34f198c35..33ad8777e 100644 preloadEngines(ids) { -- -2.19.1 +2.20.0 diff --git a/0008-altSwitcher-Fix-error-when-all-alternatives-are-disa.patch b/0008-altSwitcher-Fix-error-when-all-alternatives-are-disa.patch new file mode 100644 index 0000000..088897b --- /dev/null +++ b/0008-altSwitcher-Fix-error-when-all-alternatives-are-disa.patch @@ -0,0 +1,40 @@ +From e77463b875311ff35bb94daadf2d96cb1886e2c1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Fri, 16 Nov 2018 11:39:08 +0100 +Subject: [PATCH 08/25] altSwitcher: Fix error when all alternatives are + disabled + +While we do consider the case that we don't have a child to show for the +visibility, we are still trying to move the click action unconditionally. + +https://gitlab.gnome.org/GNOME/gnome-shell/issues/783 +--- + js/ui/status/system.js | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/js/ui/status/system.js b/js/ui/status/system.js +index c695f37be..41bcacd94 100644 +--- a/js/ui/status/system.js ++++ b/js/ui/status/system.js +@@ -58,6 +58,9 @@ var AltSwitcher = new Lang.Class({ + childToShow = this._standard; + } else if (this._alternate.visible) { + childToShow = this._alternate; ++ } else { ++ this.actor.hide(); ++ return; + } + + let childShown = this.actor.get_child(); +@@ -79,7 +82,7 @@ var AltSwitcher = new Lang.Class({ + global.sync_pointer(); + } + +- this.actor.visible = (childToShow != null); ++ this.actor.show(); + }, + + _onDestroy() { +-- +2.20.0 + diff --git a/0009-dash-destroy-items-s-child-before-tooltip.patch b/0009-dash-destroy-items-s-child-before-tooltip.patch new file mode 100644 index 0000000..8d11baa --- /dev/null +++ b/0009-dash-destroy-items-s-child-before-tooltip.patch @@ -0,0 +1,30 @@ +From ff2fbf5ae40561b403b721e932d1bc5492532156 Mon Sep 17 00:00:00 2001 +From: Andrea Azzarone +Date: Fri, 16 Nov 2018 18:31:56 +0000 +Subject: [PATCH 09/25] dash: destroy items's child before tooltip + +Destroy the DashItemContainer's child from the same handler as the tooltip. This +will prevent invalid reads when the item is destroyed while its quicklist is +still open. + +Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/781 +--- + js/ui/dash.js | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/js/ui/dash.js b/js/ui/dash.js +index 60d030941..ce970a610 100644 +--- a/js/ui/dash.js ++++ b/js/ui/dash.js +@@ -55,6 +55,8 @@ var DashItemContainer = new Lang.Class({ + this.animatingOut = false; + + this.connect('destroy', () => { ++ if (this.child != null) ++ this.child.destroy(); + this.label.destroy(); + }); + }, +-- +2.20.0 + diff --git a/0010-theme-Replace-corner-ripple-png-assets-with-css.patch b/0010-theme-Replace-corner-ripple-png-assets-with-css.patch new file mode 100644 index 0000000..f30c96e --- /dev/null +++ b/0010-theme-Replace-corner-ripple-png-assets-with-css.patch @@ -0,0 +1,172 @@ +From 8e7c90b930fd6bd52bfc0976d6e0750a48219cb4 Mon Sep 17 00:00:00 2001 +From: Sam Hewitt +Date: Fri, 16 Nov 2018 14:05:05 -0500 +Subject: [PATCH 10/25] theme: Replace corner ripple png assets with css + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/298 +--- + data/gnome-shell-theme.gresource.xml | 2 -- + data/theme/corner-ripple-ltr.png | Bin 2493 -> 0 bytes + data/theme/corner-ripple-rtl.png | Bin 2386 -> 0 bytes + data/theme/gnome-shell-sass/_common.scss | 11 +++++------ + 4 files changed, 5 insertions(+), 8 deletions(-) + delete mode 100644 data/theme/corner-ripple-ltr.png + delete mode 100644 data/theme/corner-ripple-rtl.png + +diff --git a/data/gnome-shell-theme.gresource.xml b/data/gnome-shell-theme.gresource.xml +index c99b71ddf..e292d33a3 100644 +--- a/data/gnome-shell-theme.gresource.xml ++++ b/data/gnome-shell-theme.gresource.xml +@@ -11,8 +11,6 @@ + close-window.svg + close-window-active.svg + close-window-hover.svg +- corner-ripple-ltr.png +- corner-ripple-rtl.png + dash-placeholder.svg + gnome-shell.css + gnome-shell-high-contrast.css +diff --git a/data/theme/corner-ripple-ltr.png b/data/theme/corner-ripple-ltr.png +deleted file mode 100644 +index 326ecaa52e4adc662c8c83f26c79640944eb6def..0000000000000000000000000000000000000000 +GIT binary patch +literal 0 +HcmV?d00001 + +literal 2493 +zcmV;u2}1UXP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2igJ# +z00tQn>y{G$000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000RXNkl7bF-R651Pg+QB4wL_1%xmwgjgjD7VO{$ +z1n~#VE`kkafrJqMz(hiVMFbX#63<}AZpU`Jzq_id>V2Pc&!XBun9Pu2VyF9Amrm(= +z&N=sUK3@IB-~Q9@a1M@8*macVilmBYZw-TXnrxjBhZ3KB@84B4l& +z)UFjkoFAMpkdnF(9Z)4DKy}sA-<=B}g)MAJHJu%fR;b!C3Q9;#iSy&3+8Kys5pG?o +ztF{v|GP7~2WS3>wZ**>QNZ2(qg{mCY7!(oE01cFw9L?h#iNa~<8G}I*&LXKe-B5^? +zm6h`&3JWh4YzZSF0ZJ1Hxk~f-ROd(KoDvS>f+)5leJX&83`O>O)#n1JNJK%IG$qsn +zdXl1qGN7~Fx>23A=LE=-G9wU8nxWAUvay}UbD?=ux>S?rDCD{#JP;lMOAw8u3QTQJ +zTin)Wkmo|>j1;C(XepBmzzWKyCaus!#gn2sCx^8;AL`~%L@$$N<5i&%1VuhEI#e=l +zY3H>!IVT~f42T|Lsf0#|o^hLSVAuUDd6dDdsiS)4fihFBQfBsmp-~?&aEx;=B6e$P +z+^_xl!C>p`dq`0@eS7-A0A*vl#T-f6t?2{YO=f*}SMT3D`?9^rpV9!s5JMa#B4&sK +zh&|z>oGrrb#+z@QZ6GfSwj$S|@Uqd!cGy0_c~Geb&N}g^Z4U-px%b+uXS+$;E^<&;WZ1?4#Im)pvFH!eid-d$L;6^fTgqMZZjW&Rh +zYh4-_Z?;$O-}9|ox6Yu46n;9gVo`*y8n0t60N6gn`6!)_va(<5c)B`% +zQg6KZmY!;Oq3+y1aBH}?Ww9}S@lNWZQd+&`C|4$onmSD*2C9K%mNOQ&LlC6R`w*5%> +z0cN|)JbH2U>TEv$Aa8DNoJ}C9Hj+ld>xdU6UltxIG_$=8Y}tNjYkxBBrnjfJ>x~<4 +z`G4Cv8#$B|6aykJD!Bq&2391s;3uGaw(p~6dp?_vr<3FM-9LCE^;`NOp!g~kO<^0! +zaxaw^$k>pyiDCt!%j5}gNAmZ9t!_TuU)fwa;U(&|Yu7&4>{kLL+gUrDQkY&SE)?r) +zIIpBx6PDyX#NAA8liZcc<2qV8US4b4cfa#SK7Dt-av;TGV-OJ%?kl`%`*OmI3T+7W +zZI5j~5dOaKomTZz)sutqqwU%JgAY=Yf0X^_4wRWnML6p)&Ba>%BIHXUuA~_OQ=^B# +z-87#VKLieTR>sq--0QAizwRGr|GA4o5RuNILu-MqK>m!;CTIwr8b1uUW8zNq;?usG +z{dRgZeR=2g?hoG?<^N^>xdGXdG&_!7hc~&ZhE0$DUn{W&q9+9jGZAQckwl{(PqFM8OtdA@{a@M<|JYMRx +zN5}mK^WJzbZ*IQgFZ$ol1jv$}mNF&E2yJ~kXC881tT>8rU-q)(MR+NGHpDlCuFBpB5t8;pai^v~wEdwe +z|Jn57QLGOSKY4sS|LfoW`JWi(OY_j_FeAvWr-;6-CCCd#>zK;~>uHu1l3|8(AG`&8 +zFABGVxYxQq(fDxuu&MJ~zxT=y6`fxmkit0iRH;7WUZrdW&c@DxqAaC-LC!Tvmq6>5 +zFJ|UI(%k8N#5U-Gq`Lukg|=#~yIo)7gJE3=!2c8GbAfCLak};Mf59yJc?UwWl+G|} +zYSuw1Wr)j)@fvW^(i-T3@kl5T6W~!q+(+EU`9RK3UFvqN!~MwVWZaCqfBdsQ{gEZj +z7Y15v#s2%|RV +ztq)2m+pXfDnYZJOudPjE>leGfdiU4-)4~8WMoWuNG*Shrc8*X82xB2d$W11L(#r5|{ZW+>E86QIOQ(;P(b*!E*Pwr#et +zAGz^%X$E^u%qJ)9rTOZ2zFq%r@-6=~`SQ6yA-*YrovKD!#7YTKa(7*};iL30q% +z99GYcOz)^)`;*CFI+yR&!w**S{XhA}XU0v>3`qDkwr#3Vi)oG9B6Vr10Qsj5J?klvW7cuJ=ko!csPQL{FMZklavn`t*{yKei*q#k%Je|7XL`Q979 +zut@lK-g&P5R#RR7JqkvV=`O=mI@P4hU|7vKvkbakQ8!kpO)k~`^r5p1b7^(zZqA-+aq^uf59kXOQea!8_!wX1MG;JY?SQe4!cSNxR~uS@rUT*85}m;K`o9 +z^-CN1_{p|k-g(_8C;!abZ@+DT-+Z#m&CLz}4e-3Z@pC + +diff --git a/data/theme/corner-ripple-rtl.png b/data/theme/corner-ripple-rtl.png +deleted file mode 100644 +index 26cf965f63064f996d5a2e6199bfc154f56fe24c..0000000000000000000000000000000000000000 +GIT binary patch +literal 0 +HcmV?d00001 + +literal 2386 +zcmV-Y39a^tP)gm7pL_57tSZ~(veUs9f{-AnQ^UjTq6&sMRgh5`>;X#0-g#kTA$3$d($A(%m?*iCw9(%k}x*yJxQ+ymHhL +zY1#&VR4wW0Ug_yxopsJWd#}CD)t|iek84fSy~rZJoaFBUzY(Gs-M0Oc5O<_DSU`-8S2LMJL@OM>>}4kb(bRFxV3s9!?Rr09$9REgOK6N3 +zL9{4O2cez8t?X(yuc`fr*v5Ge*aK|T0mIB}U8T&EpT6Vr#~*ptxySuMP47tB#_ZZ& +zplpBvqBAavlb;*ntv`IjO&!;qF%#Z}xQEz@h#8I&Vh9Wsr8y1zDDHjzYwQeerN@hf +zvmR9H4$d9hhql9LEIg6xP`I4*Y!^3f-0&+~zwhy3-^U;hipqUS+rXZr#5opPC79Ui +zPWmbZ!1up-=*`_)S;Wj)AE4L*?%SRl4HDK!&KQp|jZUy?2!MNE{~BDPLd>GcU6fnE +zr@+2Y2(1C@z#3xc^oh+50dV8S4PXBFBNuNhY8~wdu`P60(zfIUFg98jIww3aKC#N- +zvzgxgiy!dX^_$F_Lz$)|IS`%#YoIBnMf6CAm?J3`%Tg5vpBQqVZSZ$C)?Lb1@@Ux2 +zQ_TaRyG9>Fe1h1Q)BtO;&nh$#UM7eW)+>E3V}1Xdhkju@`bF6}Y(rZSaT{?9*a8;9 +zW8-tO&)Icqt37F<_c=oEY^-}e{~*7#dU@7o?qW8DZ`;0u*t1oP&ZfC&Ydv8~=7}Qp +zKeE;C?hly0_HTH%p>0}0wxAI(IS#dvM2m!AA!(t=%F=Cp?)bu)wXJWx`F1;bM{p5NFnjP?;XU};9uKzxH6f$zet}i3IA5Y%fO40hPID{H&NV5@{X*X5J!H- +z+3%4==Jxg8mAG{zumh?H!BL6&Wz@U-;bBM10H6|vXdo{!qa +z1K^X){E4N17y1v$AF(u7I^aSmE@3X!^o5GoG8t9Z#*&m3`ROE#$DSqI`tEn%E1#|n +zyTN>aW!}Vw!oN!LN{E+h`m&@c&`Y|PnOl;!W#1#>zS9RpES}bxQ}ehFNb=Rqt$O9J +zZ_I!5*GCVU!#?{;;y$aXp{R&U!mHTpLgNstCRS~aC2wQzNuC>3qbGWx_Sl4A8GdYT +z)wTED^~QeL^I+9&iA=I5bAg!|eg(xDiE-K^i4~F+OH+~CcI-+%bk;dh7Eg-U|B2Ag +zk;>QKdv`wRahaz}Db?~K;lTC->=!W`h_%c-BQ0x}V9m~ZiFTy2>sk*{%#eD?nf|<5}sex`oPo7O4YC`-(V_G&h!{fzZf!3>sUE +zfe|o}qE)D=SsN(=J3K0!jT)P47FT<06F{c(;i9Mz-U-9_JY +zhehmVt@}s^wilAT>~Pgc>THigOav1z>)1$WC}|+6W0@`6<6i)QGeDupA~_Vxqtl1~ +z3+suvH+S#e<--sEhOfMI-g~23CyR~wT>CRw2RIK(DTgT^31$(R8&Xn)G&GtBPeWQs +zdj(iAoPtOluh;>GRi=9aFFN4oQOKPsbkx9hVT +zXZB~aXG7?sqz%XoNf$D?z_B&Pa+VXAA4{g0?YZr_q@&~O9A}TB7p_2k`1y{pZ9je; +zdK6r_az)p#U*}tY`*uwFvu*C}4F}z1(v(=K)n_QI%X-1~i$WKS&jM3m2oxbBs_m3i +zm&c^k5>(gJYS|Fd^v`sKaw;Bpzy +zhF#TcT(wv!8my#qHR;!i%StLIjbgBLl-z|F+8)~;Lktj&?T82+lWrc8xBYB8%B!1O +zdgF(0>E7A1#e>Ubcr@?&rt9irHtfo9sHh{U43g-Si_W3WRYOT*XPqcCvekts2@R%| +z)TXnI_+v}!!ao}uu- +zs10abTwK*cwggQO;pfrw|2(c-xuUcG@K3z)!?*M=gJJy6c%+TBH9fdLRMexG4_{Cp +z^D>EAW(zl^&Kfa^@)tS87IgyqWp^Z9cCy!qyv8jY^;pX-0Gm(H*2 +z!wv;BSj46KJO-NuR^1^@s607*qoM6N<$ +Ef{zodu>b%7 + +diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss +index 06c50d1d9..829791419 100644 +--- a/data/theme/gnome-shell-sass/_common.scss ++++ b/data/theme/gnome-shell-sass/_common.scss +@@ -1142,17 +1142,16 @@ StScrollBar { + & > StIcon { icon-size: 16px; } + } + +-//Activities Ripples ++// Activities Ripples + .ripple-box { + width: 52px; + height: 52px; +- background-image: url("resource:///org/gnome/shell/theme/corner-ripple-ltr.png"); +- background-size: contain; ++ border-radius: 0 0 52px 0; // radius the size of the box give us the curve ++ background-color: lighten(transparentize($selected_bg_color, 0.7), 40%); ++ box-shadow: 0 0 2px 2px lighten($selected_bg_color, 20%); + } + +-.ripple-box:rtl { +- background-image: url("resource:///org/gnome/shell/theme/corner-ripple-rtl.png"); +-} ++.ripple-box:rtl { border-radius: 0 0 0 52px; } // just a simple change to the border radius position + + // not really top bar only + .popup-menu-arrow { width: 16px; height: 16px; } +-- +2.20.0 + diff --git a/0011-theme-Replace-page-indicator-assets-with-css.patch b/0011-theme-Replace-page-indicator-assets-with-css.patch new file mode 100644 index 0000000..6d6b93f --- /dev/null +++ b/0011-theme-Replace-page-indicator-assets-with-css.patch @@ -0,0 +1,361 @@ +From 27c660d2a9204bf423103bc83dc8e2f162b4474b Mon Sep 17 00:00:00 2001 +From: Sam Hewitt +Date: Fri, 16 Nov 2018 13:44:52 -0500 +Subject: [PATCH 11/25] theme: Replace page indicator assets with css + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/297 +--- + data/gnome-shell-theme.gresource.xml | 4 -- + data/theme/gnome-shell-sass/_common.scss | 14 +++-- + data/theme/page-indicator-active.svg | 71 ------------------------ + data/theme/page-indicator-checked.svg | 67 ---------------------- + data/theme/page-indicator-hover.svg | 67 ---------------------- + data/theme/page-indicator-inactive.svg | 67 ---------------------- + 6 files changed, 8 insertions(+), 282 deletions(-) + delete mode 100644 data/theme/page-indicator-active.svg + delete mode 100644 data/theme/page-indicator-checked.svg + delete mode 100644 data/theme/page-indicator-hover.svg + delete mode 100644 data/theme/page-indicator-inactive.svg + +diff --git a/data/gnome-shell-theme.gresource.xml b/data/gnome-shell-theme.gresource.xml +index e292d33a3..451d0980e 100644 +--- a/data/gnome-shell-theme.gresource.xml ++++ b/data/gnome-shell-theme.gresource.xml +@@ -25,10 +25,6 @@ + no-notifications.svg + noise-texture.png + pad-osd.css +- page-indicator-active.svg +- page-indicator-inactive.svg +- page-indicator-checked.svg +- page-indicator-hover.svg + process-working.svg + toggle-off-us.svg + toggle-off-intl.svg +diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss +index 829791419..c905b3b75 100644 +--- a/data/theme/gnome-shell-sass/_common.scss ++++ b/data/theme/gnome-shell-sass/_common.scss +@@ -1446,15 +1446,17 @@ StScrollBar { + padding: 15px 20px; + + .page-indicator-icon { +- width: 18px; +- height: 18px; +- background-image: url(resource:///org/gnome/shell/theme/page-indicator-inactive.svg); ++ width: 12px; ++ height: 12px; ++ background-color: transparent; ++ border: 2px solid rgba(255, 255, 255, 0.4); ++ border-radius:12px; + } + +- &:hover .page-indicator-icon { background-image: url(resource:///org/gnome/shell/theme/page-indicator-hover.svg); } +- &:active .page-indicator-icon { background-image: url(resource:///org/gnome/shell/theme/page-indicator-active.svg); } ++ &:hover .page-indicator-icon { border-color: white; } ++ &:active .page-indicator-icon { border: none; margin: 2px; background-color:#fff; } + &:checked .page-indicator-icon, +- &:checked:active { background-image: url(resource:///org/gnome/shell/theme/page-indicator-checked.svg); } ++ &:checked:active { background-color: #fff;} + } + + .no-frequent-applications-label { @extend %status_text; } +diff --git a/data/theme/page-indicator-active.svg b/data/theme/page-indicator-active.svg +deleted file mode 100644 +index 51a76024e..000000000 +--- a/data/theme/page-indicator-active.svg ++++ /dev/null +@@ -1,71 +0,0 @@ +- +- +- +- +- +- +- +- +- +- +- +- image/svg+xml +- +- +- +- +- +- +- +- +- +diff --git a/data/theme/page-indicator-checked.svg b/data/theme/page-indicator-checked.svg +deleted file mode 100644 +index 38b720f86..000000000 +--- a/data/theme/page-indicator-checked.svg ++++ /dev/null +@@ -1,67 +0,0 @@ +- +- +- +- +- +- +- +- +- +- image/svg+xml +- +- +- +- +- +- +- +- +- +diff --git a/data/theme/page-indicator-hover.svg b/data/theme/page-indicator-hover.svg +deleted file mode 100644 +index a4ea72ffd..000000000 +--- a/data/theme/page-indicator-hover.svg ++++ /dev/null +@@ -1,67 +0,0 @@ +- +- +- +- +- +- +- +- +- +- image/svg+xml +- +- +- +- +- +- +- +- +- +diff --git a/data/theme/page-indicator-inactive.svg b/data/theme/page-indicator-inactive.svg +deleted file mode 100644 +index 4ff2246c8..000000000 +--- a/data/theme/page-indicator-inactive.svg ++++ /dev/null +@@ -1,67 +0,0 @@ +- +- +- +- +- +- +- +- +- +- image/svg+xml +- +- +- +- +- +- +- +- +- +-- +2.20.0 + diff --git a/0016-theme-Replace-calendar-arrow-images-with-symbolic-ic.patch b/0016-theme-Replace-calendar-arrow-images-with-symbolic-ic.patch new file mode 100644 index 0000000..8380a72 --- /dev/null +++ b/0016-theme-Replace-calendar-arrow-images-with-symbolic-ic.patch @@ -0,0 +1,257 @@ +From 3217c10ff272f44d50afc881ce2a2dbb911dc1e8 Mon Sep 17 00:00:00 2001 +From: daniruiz +Date: Tue, 20 Nov 2018 17:55:31 +0100 +Subject: [PATCH 16/25] theme: Replace calendar arrow images with symbolic + icons and CSS + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/301 +--- + data/gnome-shell-theme.gresource.xml | 2 - + data/theme/calendar-arrow-left.svg | 82 ------------------------ + data/theme/calendar-arrow-right.svg | 82 ------------------------ + data/theme/gnome-shell-sass/_common.scss | 10 +-- + js/ui/calendar.js | 2 + + 5 files changed, 4 insertions(+), 174 deletions(-) + delete mode 100644 data/theme/calendar-arrow-left.svg + delete mode 100644 data/theme/calendar-arrow-right.svg + +diff --git a/data/gnome-shell-theme.gresource.xml b/data/gnome-shell-theme.gresource.xml +index 4a4a0edfc..b77825414 100644 +--- a/data/gnome-shell-theme.gresource.xml ++++ b/data/gnome-shell-theme.gresource.xml +@@ -1,8 +1,6 @@ + + + +- calendar-arrow-left.svg +- calendar-arrow-right.svg + calendar-today.svg + checkbox-focused.svg + checkbox-off-focused.svg +diff --git a/data/theme/calendar-arrow-left.svg b/data/theme/calendar-arrow-left.svg +deleted file mode 100644 +index d5d97b3c3..000000000 +--- a/data/theme/calendar-arrow-left.svg ++++ /dev/null +@@ -1,82 +0,0 @@ +- +- +- +- +- +- +- +- +- +- +- +- image/svg+xml +- +- +- +- +- +- +- +- +- +diff --git a/data/theme/calendar-arrow-right.svg b/data/theme/calendar-arrow-right.svg +deleted file mode 100644 +index 545da7ec5..000000000 +--- a/data/theme/calendar-arrow-right.svg ++++ /dev/null +@@ -1,82 +0,0 @@ +- +- +- +- +- +- +- +- +- +- +- +- image/svg+xml +- +- +- +- +- +- +- +- +- +diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss +index 528202161..22f9e826e 100644 +--- a/data/theme/gnome-shell-sass/_common.scss ++++ b/data/theme/gnome-shell-sass/_common.scss +@@ -938,7 +938,6 @@ StScrollBar { + } + + .pager-button { +- color: white; + background-color: transparent; + width: 32px; + border-radius: 4px; +@@ -946,13 +945,8 @@ StScrollBar { + &:active { background-color: transparentize($bg_color,0.95); } + } + +- .calendar-change-month-back { //arrow back +- background-image: url("resource:///org/gnome/shell/theme/calendar-arrow-left.svg"); +- &:rtl { background-image: url("resource:///org/gnome/shell/theme/calendar-arrow-right.svg"); } +- } +- .calendar-change-month-forward { //arrow foreward +- background-image: url("resource:///org/gnome/shell/theme/calendar-arrow-right.svg"); +- &:rtl { background-image: url("resource:///org/gnome/shell/theme/calendar-arrow-left.svg"); } ++ .calendar-change-month-back StIcon, .calendar-change-month-forward StIcon { // arrows ++ icon-size: 1.09em; + } + + .calendar-day-base { +diff --git a/js/ui/calendar.js b/js/ui/calendar.js +index 432986391..c4d362537 100644 +--- a/js/ui/calendar.js ++++ b/js/ui/calendar.js +@@ -446,6 +446,7 @@ var Calendar = new Lang.Class({ + this._backButton = new St.Button({ style_class: 'calendar-change-month-back pager-button', + accessible_name: _("Previous month"), + can_focus: true }); ++ this._backButton.add_actor(new St.Icon({ icon_name: 'pan-start-symbolic' })); + this._topBox.add(this._backButton); + this._backButton.connect('clicked', this._onPrevMonthButtonClicked.bind(this)); + +@@ -456,6 +457,7 @@ var Calendar = new Lang.Class({ + this._forwardButton = new St.Button({ style_class: 'calendar-change-month-forward pager-button', + accessible_name: _("Next month"), + can_focus: true }); ++ this._forwardButton.add_actor(new St.Icon({ icon_name: 'pan-end-symbolic' })); + this._topBox.add(this._forwardButton); + this._forwardButton.connect('clicked', this._onNextMonthButtonClicked.bind(this)); + +-- +2.20.0 + diff --git a/0017-st-button-Ignore-pointer-emulated-touch-events.patch b/0017-st-button-Ignore-pointer-emulated-touch-events.patch new file mode 100644 index 0000000..02dc3ec --- /dev/null +++ b/0017-st-button-Ignore-pointer-emulated-touch-events.patch @@ -0,0 +1,43 @@ +From 4c11d15a074aeca72627c44e327e2dc2afa93ae3 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= +Date: Thu, 25 Oct 2018 06:35:25 +0200 +Subject: [PATCH 17/25] st-button: Ignore pointer emulated touch events + +In X11, pointer emulated touch events are replicated with normal PRESS, RELEASE +pair events which are generated by the server. Thus for a single tap we get: + - TOUCH_BEGIN -> TOUCH_END, PRESS -> RELEASE + +This will cause st-button to send two "clicked" signals, instead of just one, +breaking extensions (like dash-to-dock) that show buttons in the main stage +which will be checked two times or that will receive the same signal two times. +--- + src/st/st-button.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/src/st/st-button.c b/src/st/st-button.c +index 8f5c4922f..a3a7b2442 100644 +--- a/src/st/st-button.c ++++ b/src/st/st-button.c +@@ -248,14 +248,17 @@ st_button_touch_event (ClutterActor *actor, + if (event->type == CLUTTER_TOUCH_BEGIN && !priv->press_sequence) + { + clutter_input_device_sequence_grab (device, sequence, actor); +- st_button_press (button, device, 0, sequence); ++ if (!clutter_event_is_pointer_emulated ((ClutterEvent*) event)) ++ st_button_press (button, device, 0, sequence); + return CLUTTER_EVENT_STOP; + } + else if (event->type == CLUTTER_TOUCH_END && + priv->device == device && + priv->press_sequence == sequence) + { +- st_button_release (button, device, mask, 0, sequence); ++ if (!clutter_event_is_pointer_emulated ((ClutterEvent*) event)) ++ st_button_release (button, device, mask, 0, sequence); ++ + clutter_input_device_sequence_ungrab (device, sequence); + return CLUTTER_EVENT_STOP; + } +-- +2.20.0 + diff --git a/0018-iconGrid-Eliminate-JavaScript-for-painting-picking.patch b/0018-iconGrid-Eliminate-JavaScript-for-painting-picking.patch new file mode 100644 index 0000000..e7c1d3a --- /dev/null +++ b/0018-iconGrid-Eliminate-JavaScript-for-painting-picking.patch @@ -0,0 +1,102 @@ +From 0e0574a0b448a28235ec056f2397c4568f5c9338 Mon Sep 17 00:00:00 2001 +From: Daniel van Vugt +Date: Fri, 23 Nov 2018 16:43:34 +0800 +Subject: [PATCH 18/25] iconGrid: Eliminate JavaScript for painting/picking + +The only reason for `vfunc_paint` and `vfunc_pick` existing was to +implement a culling optimization. Although that optimization actually +made performance worse than none at all because it forced the painting +and picking cycles to spend more time calling into JavaScript. + +Turns out we don't have to choose between native code and culling though. +Just reimplement the culling using native ClutterActor functions and we +get the benefits of both. + +Performance on an i7-7700: + +Moving the cursor over the icon grid: +Before: 70% CPU, 5.5ms per frame +After : 60% CPU, 4.5ms per frame + +Scrolling the icon grid: +Before: 60% CPU, 4.4ms per frame +After : 50% CPU, 3.3ms per frame + +Helps with https://gitlab.gnome.org/GNOME/gnome-shell/issues/174 +--- + js/ui/iconGrid.js | 29 ++++------------------------- + 1 file changed, 4 insertions(+), 25 deletions(-) + +diff --git a/js/ui/iconGrid.js b/js/ui/iconGrid.js +index 94387a333..82b335cc5 100644 +--- a/js/ui/iconGrid.js ++++ b/js/ui/iconGrid.js +@@ -344,10 +344,10 @@ var IconGrid = new Lang.Class({ + + if (this._rowLimit && rowIndex >= this._rowLimit || + this._fillParent && childBox.y2 > availHeight - this.bottomPadding) { +- children[i]._skipPaint = true; ++ children[i].hide(); + } else { + children[i].allocate(childBox, flags); +- children[i]._skipPaint = false; ++ children[i].show(); + } + + columnIndex++; +@@ -365,24 +365,6 @@ var IconGrid = new Lang.Class({ + } + }, + +- vfunc_paint() { +- this.paint_background(); +- +- this.get_children().forEach(c => { +- if (!c._skipPaint) +- c.paint(); +- }); +- }, +- +- vfunc_pick(color) { +- this.parent(color); +- +- this.get_children().forEach(c => { +- if (!c._skipPaint) +- c.paint(); +- }); +- }, +- + vfunc_get_paint_volume(paintVolume) { + // Setting the paint volume does not make sense when we don't have + // any allocation +@@ -412,9 +394,6 @@ var IconGrid = new Lang.Class({ + if (!child.visible) + continue; + +- if (child._skipPaint) +- continue; +- + let childVolume = child.get_transformed_paint_volume(this); + if (!childVolume) + return false +@@ -714,7 +693,7 @@ var IconGrid = new Lang.Class({ + }, + + visibleItemsCount() { +- return this.get_children().filter(c => !c._skipPaint).length; ++ return this.get_children().filter(c => c.is_visible()).length; + }, + + setSpacing(spacing) { +@@ -859,7 +838,7 @@ var PaginatedIconGrid = new Lang.Class({ + for (let i = 0; i < children.length; i++) { + let childBox = this._calculateChildBox(children[i], x, y, box); + children[i].allocate(childBox, flags); +- children[i]._skipPaint = false; ++ children[i].show(); + + columnIndex++; + if (columnIndex == nColumns) { +-- +2.20.0 + diff --git a/0022-StWidget-don-t-forget-to-invalidate-the-paint-state-.patch b/0022-StWidget-don-t-forget-to-invalidate-the-paint-state-.patch new file mode 100644 index 0000000..65fbb62 --- /dev/null +++ b/0022-StWidget-don-t-forget-to-invalidate-the-paint-state-.patch @@ -0,0 +1,156 @@ +From 6743c18fdfa6dc48fb7d920640debe863018dd38 Mon Sep 17 00:00:00 2001 +From: Cosimo Cecchi +Date: Tue, 20 Nov 2018 18:25:51 -0800 +Subject: [PATCH 22/25] StWidget: don't forget to invalidate the paint state if + not on stage + +If the actor is not on the stage yet (i.e. does not have a theme +node), but has a paint state cached, we currently fail to invalidate +it, which will lead to the actor painting with old contents once it +gets onto the stage. + +This commit fixes the issue by changing our invalidation strategy; +previously we were looking at the widget's own theme node to determine +if it should be invalidated or not. +Now we look at the theme nodes of our cached paint states. When the +widget is mapped on stage, those are the same as the widget's own +theme node, but when the widget is not on the stage, we'll still be +able to invalidate them. + +As part of this, we move the invalidation API to StThemeNodePaintState, +which is a more natural place for our use case. + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/314 +--- + src/st/st-theme-node-drawing.c | 40 ++++++++++++++++++++++++++++++++++ + src/st/st-theme-node.h | 3 +++ + src/st/st-widget.c | 39 +++++---------------------------- + 3 files changed, 49 insertions(+), 33 deletions(-) + +diff --git a/src/st/st-theme-node-drawing.c b/src/st/st-theme-node-drawing.c +index f59065aef..9f7e6b6ca 100644 +--- a/src/st/st-theme-node-drawing.c ++++ b/src/st/st-theme-node-drawing.c +@@ -1414,6 +1414,32 @@ st_theme_node_load_background_image (StThemeNode *node) + return node->background_texture != COGL_INVALID_HANDLE; + } + ++static gboolean ++st_theme_node_invalidate_resources_for_file (StThemeNode *node, ++ GFile *file) ++{ ++ StBorderImage *border_image; ++ gboolean changed = FALSE; ++ GFile *theme_file; ++ ++ theme_file = st_theme_node_get_background_image (node); ++ if ((theme_file != NULL) && g_file_equal (theme_file, file)) ++ { ++ st_theme_node_invalidate_background_image (node); ++ changed = TRUE; ++ } ++ ++ border_image = st_theme_node_get_border_image (node); ++ theme_file = border_image ? st_border_image_get_file (border_image) : NULL; ++ if ((theme_file != NULL) && g_file_equal (theme_file, file)) ++ { ++ st_theme_node_invalidate_border_image (node); ++ changed = TRUE; ++ } ++ ++ return changed; ++} ++ + static void st_theme_node_prerender_shadow (StThemeNodePaintState *state); + + static void +@@ -2753,3 +2779,17 @@ st_theme_node_paint_state_invalidate (StThemeNodePaintState *state) + state->alloc_width = 0; + state->alloc_height = 0; + } ++ ++gboolean ++st_theme_node_paint_state_invalidate_for_file (StThemeNodePaintState *state, ++ GFile *file) ++{ ++ if (state->node != NULL && ++ st_theme_node_invalidate_resources_for_file (state->node, file)) ++ { ++ st_theme_node_paint_state_invalidate (state); ++ return TRUE; ++ } ++ ++ return FALSE; ++} +diff --git a/src/st/st-theme-node.h b/src/st/st-theme-node.h +index e71c1d522..1b43c9afe 100644 +--- a/src/st/st-theme-node.h ++++ b/src/st/st-theme-node.h +@@ -291,6 +291,9 @@ void st_theme_node_paint_state_free (StThemeNodePaintState *state); + void st_theme_node_paint_state_copy (StThemeNodePaintState *state, + StThemeNodePaintState *other); + void st_theme_node_paint_state_invalidate (StThemeNodePaintState *state); ++gboolean st_theme_node_paint_state_invalidate_for_file (StThemeNodePaintState *state, ++ GFile *file); ++ + void st_theme_node_paint_state_set_node (StThemeNodePaintState *state, + StThemeNode *node); + +diff --git a/src/st/st-widget.c b/src/st/st-widget.c +index db984ac9b..7c39b3585 100644 +--- a/src/st/st-widget.c ++++ b/src/st/st-widget.c +@@ -289,44 +289,17 @@ st_widget_texture_cache_changed (StTextureCache *cache, + { + StWidget *actor = ST_WIDGET (user_data); + StWidgetPrivate *priv = st_widget_get_instance_private (actor); +- StThemeNode *node = priv->theme_node; +- StBorderImage *border_image; + gboolean changed = FALSE; +- GFile *theme_file; +- +- if (node == NULL) +- return; +- +- theme_file = st_theme_node_get_background_image (node); +- if ((theme_file != NULL) && g_file_equal (theme_file, file)) +- { +- st_theme_node_invalidate_background_image (node); +- changed = TRUE; +- } ++ int i; + +- border_image = st_theme_node_get_border_image (node); +- theme_file = border_image ? st_border_image_get_file (border_image) : NULL; +- if ((theme_file != NULL) && g_file_equal (theme_file, file)) ++ for (i = 0; i < G_N_ELEMENTS (priv->paint_states); i++) + { +- st_theme_node_invalidate_border_image (node); +- changed = TRUE; ++ StThemeNodePaintState *paint_state = &priv->paint_states[i]; ++ changed |= st_theme_node_paint_state_invalidate_for_file (paint_state, file); + } + +- if (changed) +- { +- /* If we prerender the background / border, we need to update +- * the paint state. We should probably implement a method to +- * the theme node to determine this, but for now, just wipe +- * the entire paint state. +- * +- * Use the existing state instead of a new one because it's +- * assumed the rest of the state will stay the same. +- */ +- st_theme_node_paint_state_invalidate (current_paint_state (actor)); +- +- if (clutter_actor_is_mapped (CLUTTER_ACTOR (actor))) +- clutter_actor_queue_redraw (CLUTTER_ACTOR (actor)); +- } ++ if (changed && clutter_actor_is_mapped (CLUTTER_ACTOR (actor))) ++ clutter_actor_queue_redraw (CLUTTER_ACTOR (actor)); + } + + static void +-- +2.20.0 + diff --git a/0023-st-Avoid-integer-overflow-on-unpremultiply.patch b/0023-st-Avoid-integer-overflow-on-unpremultiply.patch new file mode 100644 index 0000000..1a93d58 --- /dev/null +++ b/0023-st-Avoid-integer-overflow-on-unpremultiply.patch @@ -0,0 +1,36 @@ +From 925a25da17986bf60f61bb4e06ec22e2c59fa14f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Thu, 22 Nov 2018 20:41:44 +0100 +Subject: [PATCH 23/25] st: Avoid integer overflow on unpremultiply + +When computing the effective border color, we operate on colors with +premultiplied alpha to simplify the calculations, then unpremultiply +the result. However we miss a bounds check in the last check, so any +color component can overflow the allowed maximum of 0xff and shift the +result in unexpected ways. + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/305 +--- + src/st/st-theme-node-drawing.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/st/st-theme-node-drawing.c b/src/st/st-theme-node-drawing.c +index 9f7e6b6ca..a7fb24ab8 100644 +--- a/src/st/st-theme-node-drawing.c ++++ b/src/st/st-theme-node-drawing.c +@@ -229,9 +229,9 @@ unpremultiply (ClutterColor *color) + { + if (color->alpha != 0) + { +- color->red = (color->red * 255 + 127) / color->alpha; +- color->green = (color->green * 255 + 127) / color->alpha; +- color->blue = (color->blue * 255 + 127) / color->alpha; ++ color->red = MIN((color->red * 255 + 127) / color->alpha, 255); ++ color->green = MIN((color->green * 255 + 127) / color->alpha, 255); ++ color->blue = MIN((color->blue * 255 + 127) / color->alpha, 255); + } + } + +-- +2.20.0 + diff --git a/0024-messageTray-Re-enable-unredirection-when-banner-is-d.patch b/0024-messageTray-Re-enable-unredirection-when-banner-is-d.patch new file mode 100644 index 0000000..58936e4 --- /dev/null +++ b/0024-messageTray-Re-enable-unredirection-when-banner-is-d.patch @@ -0,0 +1,47 @@ +From e5ce3d541e48dd75c9218312cd74ecb760ab857a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Thu, 22 Nov 2018 18:18:34 +0100 +Subject: [PATCH 24/25] messageTray: Re-enable unredirection when banner is + destroyed + +The intention of commit 4dc20398 was to disable unredirection while +banners are shown, but the ::done-displaying signal currently used for +re-enabling unredirection is only emitted under some circumstances, so +it's possible that unredirection is left disabled indefinitely, whoops. + +Fix this by tying disabling unredirection explicitly to the lifetime +of the banner actor. + +https://gitlab.gnome.org/GNOME/gnome-shell/issues/799 +--- + js/ui/messageTray.js | 7 +++---- + 1 file changed, 3 insertions(+), 4 deletions(-) + +diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js +index f8e2f0b9f..eebc93fdf 100644 +--- a/js/ui/messageTray.js ++++ b/js/ui/messageTray.js +@@ -1298,10 +1298,8 @@ var MessageTray = new Lang.Class({ + } + + this._banner = this._notification.createBanner(); +- this._bannerClickedId = this._banner.connect('done-displaying', () => { +- Meta.enable_unredirect_for_display(global.display); +- this._escapeTray(); +- }); ++ this._bannerClickedId = this._banner.connect('done-displaying', ++ this._escapeTray.bind(this)); + this._bannerUnfocusedId = this._banner.connect('unfocused', () => { + this._updateState(); + }); +@@ -1451,6 +1449,7 @@ var MessageTray = new Lang.Class({ + + this._pointerInNotification = false; + this._notificationRemoved = false; ++ Meta.enable_unredirect_for_display(global.display); + + this._banner.actor.destroy(); + this._banner = null; +-- +2.20.0 + diff --git a/0025-thunderbolt-fix-missing-variable-underscore-for-enro.patch b/0025-thunderbolt-fix-missing-variable-underscore-for-enro.patch new file mode 100644 index 0000000..aa73a66 --- /dev/null +++ b/0025-thunderbolt-fix-missing-variable-underscore-for-enro.patch @@ -0,0 +1,29 @@ +From 616852cf2b1f235a5671013fbf3f1564be79ea1b Mon Sep 17 00:00:00 2001 +From: RyuzakiKK +Date: Fri, 7 Dec 2018 10:51:39 +0100 +Subject: [PATCH 25/25] thunderbolt: fix missing variable underscore for + `enrolling` + +The variable `this.enrolling` is a typo because it has not been defined +before and is also never used. +`this._enrolling` is what it was meant to be. +--- + js/ui/status/thunderbolt.js | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/js/ui/status/thunderbolt.js b/js/ui/status/thunderbolt.js +index 4584748ed..3d7a9614a 100644 +--- a/js/ui/status/thunderbolt.js ++++ b/js/ui/status/thunderbolt.js +@@ -195,7 +195,7 @@ var AuthRobot = new Lang.Class({ + if (this._enrolling) + return; + +- this.enrolling = true; ++ this._enrolling = true; + GLib.idle_add(GLib.PRIORITY_DEFAULT, + this._enrollDevicesIdle.bind(this)); + }, +-- +2.20.0 + diff --git a/gnome-shell.spec b/gnome-shell.spec index 9ad9486..56795ea 100644 --- a/gnome-shell.spec +++ b/gnome-shell.spec @@ -1,6 +1,6 @@ Name: gnome-shell Version: 3.31.2 -Release: 2%{?dist} +Release: 3%{?dist} Summary: Window management and application launching for GNOME Group: User Interface/Desktops @@ -18,9 +18,23 @@ Patch1: gnome-shell-favourite-apps-firefox.patch Patch2: 0001-endSessionDialog-Immediately-add-buttons-to-the-dial.patch Patch3: 0002-endSessionDialog-Support-rebooting-into-the-bootload.patch -# Fix empty input method indicator -# https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/293 -Patch4: 0001-ibusManager-Don-t-pass-undefined-callback-to-ibus.patch +# Various bugfixes from current git master +Patch4: 0001-windowAttentionHandler-Handle-XUrgencyHint-as-well.patch +Patch5: 0002-windowAttentionHandler-Fix-syntax-errors.patch +Patch6: 0003-power-Label-the-PENDING_CHARGE-state-as-Not-Charging.patch +Patch7: 0007-ibusManager-Don-t-pass-undefined-callback-to-ibus.patch +Patch8: 0008-altSwitcher-Fix-error-when-all-alternatives-are-disa.patch +Patch9: 0009-dash-destroy-items-s-child-before-tooltip.patch +Patch10: 0010-theme-Replace-corner-ripple-png-assets-with-css.patch +Patch11: 0011-theme-Replace-page-indicator-assets-with-css.patch +Patch12: 0012-theme-Drop-custom-assets-for-window-close-buttons-in.patch +Patch13: 0016-theme-Replace-calendar-arrow-images-with-symbolic-ic.patch +Patch14: 0017-st-button-Ignore-pointer-emulated-touch-events.patch +Patch15: 0018-iconGrid-Eliminate-JavaScript-for-painting-picking.patch +Patch16: 0022-StWidget-don-t-forget-to-invalidate-the-paint-state-.patch +Patch17: 0023-st-Avoid-integer-overflow-on-unpremultiply.patch +Patch18: 0024-messageTray-Re-enable-unredirection-when-banner-is-d.patch +Patch19: 0025-thunderbolt-fix-missing-variable-underscore-for-enro.patch %define libcroco_version 0.6.8 %define eds_version 3.17.2 @@ -218,6 +232,9 @@ glib-compile-schemas --allow-any-name %{_datadir}/glib-2.0/schemas &> /dev/null %{_mandir}/man1/%{name}.1.gz %changelog +* Fri Dec 14 2018 Adam Williamson - 3.31.2-3 +- Backport several bugfix commits from current git master + * Fri Nov 30 2018 Adam Williamson - 3.31.2-2 - Backport PR #293 to fix 'empty input method indicator' bug