diff --git a/meta-gnome/recipes-gnome/gnome-shell/gnome-shell.inc b/meta-gnome/recipes-gnome/gnome-shell/gnome-shell.inc index 2cb9a10..73f0a62 100644 --- a/meta-gnome/recipes-gnome/gnome-shell/gnome-shell.inc +++ b/meta-gnome/recipes-gnome/gnome-shell/gnome-shell.inc @@ -7,13 +7,13 @@ def gnome_verdir(v): return oe.utils.trim_version(v, 2) GNOMEBN ?= "${BPN}" -SRC_URI = "${GNOME_MIRROR}/${GNOMEBN}/${@gnome_verdir("${PV}")}/${GNOMEBN}-${PV}.tar.xz;name=archive" - -SRC_URI += "file://0001-do-no-build-calendar-server.patch \ +SRC_URI = "${GNOME_MIRROR}/${GNOMEBN}/${@gnome_verdir("${PV}")}/${GNOMEBN}-${PV}.tar.xz;name=archive \ + file://0001-do-no-build-calendar-server.patch \ file://0001-do-not-use-python-path-from-build-environment.patch \ -" + file://0001-javascript-invalid-access-fixes.patch \ + " -DEPENDS = "glib-2.0-native systemd libcanberra gtk+3 glib-2.0 libxml2 libcroco mutter libsoup-2.4 gsettings-desktop-schemas gcr atk polkit startup-notification libx11 gnome-bluetooth libsecret networkmanager gjs mozjs52 network-manager-applet pulseaudio libxml2-native paxctl-native" +DEPENDS = "glib-2.0-native systemd libcanberra gtk+3 glib-2.0 libxml2 libcroco mutter libsoup-2.4 gsettings-desktop-schemas gcr atk polkit startup-notification libx11 gnome-bluetooth libsecret networkmanager gjs mozjs52 network-manager-applet pulseaudio libxml2-native paxctl-native ibus xmlto-native sassc-native" RDEPENDS_${PN} = "xserver-xorg-xwayland cantarell-fonts gnome-theme-adwaita gnome-theme-adwaita-dark gnome-backgrounds gnome-control-center gnome-session adwaita-icon-theme dconf" @@ -53,4 +53,4 @@ do_install_append() { paxctl -cm ${D}${bindir}/gnome-shell } -EXTRA_OEMESON = "--buildtype=release -Denable-browser-plugin=false -Denable-man=false -Denable-systemd=yes -Denable-networkmanager=yes" +EXTRA_OEMESON = "--buildtype=release -Dbrowser_plugin=false -Dman=false -Dsystemd=true -Dnetworkmanager=true" diff --git a/meta-gnome/recipes-gnome/gnome-shell/gnome-shell/0001-javascript-invalid-access-fixes.patch b/meta-gnome/recipes-gnome/gnome-shell/gnome-shell/0001-javascript-invalid-access-fixes.patch new file mode 100644 index 0000000..781f910 --- /dev/null +++ b/meta-gnome/recipes-gnome/gnome-shell/gnome-shell/0001-javascript-invalid-access-fixes.patch @@ -0,0 +1,512 @@ +From fa873b3e84f52f2bd1ff397e7cae8bd8b31c700c Mon Sep 17 00:00:00 2001 +From: Bruce Leidl +Date: Thu, 22 Mar 2018 22:24:17 -0400 +Subject: [PATCH] javascript invalid access fixes + +Attempt to rebase this +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/4 +--- + js/ui/dnd.js | 65 +++++++++++++++++++++++++----------------- + js/ui/tweener.js | 69 ++++++++++++++++++++++++++++++++++++--------- + js/ui/workspace.js | 38 +++++++++++++++++-------- + js/ui/workspaceThumbnail.js | 36 +++++++++++++++++------ + 4 files changed, 150 insertions(+), 58 deletions(-) + +diff --git a/js/ui/dnd.js b/js/ui/dnd.js +index a38607c..431c60d 100644 +--- a/js/ui/dnd.js ++++ b/js/ui/dnd.js +@@ -27,6 +27,12 @@ var DragMotionResult = { + CONTINUE: 3 + }; + ++var DragState = { ++ INIT: 0, ++ DRAGGING: 1, ++ CANCELLED: 2, ++}; ++ + var DRAG_CURSOR_MAP = { + 0: Meta.Cursor.DND_UNSUPPORTED_TARGET, + 1: Meta.Cursor.DND_COPY, +@@ -78,6 +84,8 @@ var _Draggable = new Lang.Class({ + dragActorOpacity: undefined }); + + this.actor = actor; ++ this._dragState = DragState.INIT; ++ + if (!params.manualMode) { + this.actor.connect('button-press-event', + this._onButtonPress.bind(this)); +@@ -88,7 +96,7 @@ var _Draggable = new Lang.Class({ + this.actor.connect('destroy', () => { + this._actorDestroyed = true; + +- if (this._dragInProgress && this._dragCancellable) ++ if (this._dragState == DragState.DRAGGING && this._dragCancellable) + this._cancelDrag(global.get_current_time()); + this.disconnectAll(); + }); +@@ -100,7 +108,6 @@ var _Draggable = new Lang.Class({ + this._dragActorOpacity = params.dragActorOpacity; + + this._buttonDown = false; // The mouse button has been pressed and has not yet been released. +- this._dragInProgress = false; // The drag has been started, and has not been dropped or cancelled yet. + this._animationInProgress = false; // The drag is over and the item is in the process of animating to its original position (snapping back or reverting). + this._dragCancellable = true; + +@@ -206,9 +213,10 @@ var _Draggable = new Lang.Class({ + (event.type() == Clutter.EventType.TOUCH_END && + global.display.is_pointer_emulating_sequence(event.get_event_sequence()))) { + this._buttonDown = false; +- if (this._dragInProgress) { ++ if (this._dragState == DragState.DRAGGING) { + return this._dragActorDropped(event); +- } else if (this._dragActor != null && !this._animationInProgress) { ++ } else if ((this._dragActor != null || this._dragState == DragState.CANCELLED) && ++ !this._animationInProgress) { + // Drag must have been cancelled with Esc. + this._dragComplete(); + return Clutter.EVENT_STOP; +@@ -222,14 +230,14 @@ var _Draggable = new Lang.Class({ + } else if (event.type() == Clutter.EventType.MOTION || + (event.type() == Clutter.EventType.TOUCH_UPDATE && + global.display.is_pointer_emulating_sequence(event.get_event_sequence()))) { +- if (this._dragInProgress) { ++ if (this._dragActor && this._dragState == DragState.DRAGGING) { + return this._updateDragPosition(event); +- } else if (this._dragActor == null) { ++ } else if (this._dragActor == null && this._dragState != DragState.CANCELLED) { + return this._maybeStartDrag(event); + } + // We intercept KEY_PRESS event so that we can process Esc key press to cancel + // dragging and ignore all other key presses. +- } else if (event.type() == Clutter.EventType.KEY_PRESS && this._dragInProgress) { ++ } else if (event.type() == Clutter.EventType.KEY_PRESS && this._dragState == DragState.DRAGGING) { + let symbol = event.get_key_symbol(); + if (symbol == Clutter.Escape) { + this._cancelDrag(event.get_time()); +@@ -265,7 +273,7 @@ var _Draggable = new Lang.Class({ + */ + startDrag(stageX, stageY, time, sequence) { + currentDraggable = this; +- this._dragInProgress = true; ++ this._dragState = DragState.DRAGGING; + + // Special-case St.Button: the pointer grab messes with the internal + // state, so force a reset to a reasonable state here +@@ -342,6 +350,13 @@ var _Draggable = new Lang.Class({ + Shell.util_set_hidden_from_pick(this._dragActor, true); + } + ++ this._dragActorDestroyId = this._dragActor.connect('destroy', () => { ++ // Cancel ongoing animation (if any) ++ this._finishAnimation(); ++ ++ this._dragActor = null; ++ this._dragState = DragState.CANCELLED; ++ }); + this._dragOrigOpacity = this._dragActor.opacity; + if (this._dragActorOpacity != undefined) + this._dragActor.opacity = this._dragActorOpacity; +@@ -500,7 +515,7 @@ var _Draggable = new Lang.Class({ + event.get_time())) { + // If it accepted the drop without taking the actor, + // handle it ourselves. +- if (this._dragActor.get_parent() == Main.uiGroup) { ++ if (this._dragActor && this._dragActor.get_parent() == Main.uiGroup) { + if (this._restoreOnSuccess) { + this._restoreDragActor(event.get_time()); + return true; +@@ -508,7 +523,7 @@ var _Draggable = new Lang.Class({ + this._dragActor.destroy(); + } + +- this._dragInProgress = false; ++ this._dragState = DragState.INIT; + global.screen.set_cursor(Meta.Cursor.DEFAULT); + this.emit('drag-end', event.get_time(), true); + this._dragComplete(); +@@ -557,20 +572,22 @@ var _Draggable = new Lang.Class({ + + _cancelDrag(eventTime) { + this.emit('drag-cancelled', eventTime); +- this._dragInProgress = false; +- let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation(); ++ let wasCancelled = (this._dragState == DragState.CANCELLED); ++ this._dragState = DragState.CANCELLED; + +- if (this._actorDestroyed) { ++ if (this._actorDestroyed || wasCancelled) { + global.screen.set_cursor(Meta.Cursor.DEFAULT); + if (!this._buttonDown) + this._dragComplete(); + this.emit('drag-end', eventTime, false); +- if (!this._dragOrigParent) ++ if (!this._dragOrigParent && this._dragActor) + this._dragActor.destroy(); + + return; + } + ++ let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation(); ++ + this._animateDragEnd(eventTime, + { x: snapBackX, + y: snapBackY, +@@ -581,7 +598,7 @@ var _Draggable = new Lang.Class({ + }, + + _restoreDragActor(eventTime) { +- this._dragInProgress = false; ++ this._dragState = DragState.INIT; + let [restoreX, restoreY, restoreScale] = this._getRestoreLocation(); + + // fade the actor back in at its original location +@@ -596,12 +613,6 @@ var _Draggable = new Lang.Class({ + _animateDragEnd(eventTime, params) { + this._animationInProgress = true; + +- // finish animation if the actor gets destroyed +- // during it +- this._dragActorDestroyId = +- this._dragActor.connect('destroy', +- this._finishAnimation.bind(this)); +- + params['opacity'] = this._dragOrigOpacity; + params['transition'] = 'easeOutQuad'; + params['onComplete'] = this._onAnimationComplete; +@@ -624,9 +635,6 @@ var _Draggable = new Lang.Class({ + }, + + _onAnimationComplete(dragActor, eventTime) { +- dragActor.disconnect(this._dragActorDestroyId); +- this._dragActorDestroyId = 0; +- + if (this._dragOrigParent) { + Main.uiGroup.remove_child(this._dragActor); + this._dragOrigParent.add_actor(this._dragActor); +@@ -641,7 +649,7 @@ var _Draggable = new Lang.Class({ + }, + + _dragComplete() { +- if (!this._actorDestroyed) ++ if (!this._actorDestroyed && this._dragActor) + Shell.util_set_hidden_from_pick(this._dragActor, false); + + this._ungrabEvents(); +@@ -652,7 +660,12 @@ var _Draggable = new Lang.Class({ + this._updateHoverId = 0; + } + +- this._dragActor = undefined; ++ if (this._dragActor) { ++ this._dragActor.disconnect(this._dragActorDestroyId); ++ this._dragActor = null; ++ } ++ ++ this._dragState = DragState.INIT; + currentDraggable = null; + } + }); +diff --git a/js/ui/tweener.js b/js/ui/tweener.js +index 1a85e2f..c9b5018 100644 +--- a/js/ui/tweener.js ++++ b/js/ui/tweener.js +@@ -69,30 +69,73 @@ function _getTweenState(target) { + return target.__ShellTweenerState; + } + ++function _getExtraHandlers(target) { ++ if (!target.__ShellTweenerHandlers) ++ target.__ShellTweenerHandlers = {}; ++ 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; +- +- params[name] = () => { +- oldHandler.apply(eventScope, oldParams); +- handler(target); +- }; +- } else +- params[name] = () => { handler(target); }; ++ let wrapperNeeded = false; ++ let extraHandlers = _getExtraHandlers(target); ++ ++ if (!(name in extraHandlers)) { ++ extraHandlers[name] = []; ++ wrapperNeeded = true; ++ } ++ ++ let handlers = extraHandlers[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] = function () { ++ oldHandler.apply(eventScope, oldParams); ++ handlers.forEach((h) => h(target)); ++ }; ++ } else ++ params[name] = function () { handlers.forEach((h) => h(target)); }; ++ } ++} ++ ++function _removeHandler(target, name, handler) { ++ let extraHandlers = _getExtraHandlers(target); ++ ++ if (name in extraHandlers) { ++ let handlers = extraHandlers[name]; ++ let handlerIndex = handlers.indexOf(handler); ++ ++ while (handlerIndex > -1) { ++ handlers.splice(handlerIndex, 1); ++ handlerIndex = handlers.indexOf(handler); ++ } ++ } ++} ++ ++function _removeHandlers(target) { ++ let extraHandlers = _getExtraHandlers(target); ++ ++ for (let name in extraHandlers) ++ extraHandlers[name].length = 0; + } + + function _actorDestroyed(target) { +diff --git a/js/ui/workspace.js b/js/ui/workspace.js +index d049eae..e2f3582 100644 +--- a/js/ui/workspace.js ++++ b/js/ui/workspace.js +@@ -139,14 +139,9 @@ var WindowClone = new Lang.Class({ + + this._windowClone._updateId = this.metaWindow.connect('size-changed', + this._onRealWindowSizeChanged.bind(this)); +- this._windowClone._destroyId = +- this.realWindow.connect('destroy', () => { +- // First destroy the clone and then destroy everything +- // This will ensure that we never see it in the +- // _disconnectSignals loop +- this._windowClone.destroy(); +- this.destroy(); +- }); ++ ++ this._windowClone._destroyId = this.realWindow.connect('destroy', ++ this.destroy.bind(this)); + + this._updateAttachedDialogs(); + this._computeBoundingBox(); +@@ -310,7 +305,14 @@ var WindowClone = new Lang.Class({ + }, + + destroy() { +- this.actor.destroy(); ++ this.emit('destroy'); ++ ++ // First destroy the clone and then destroy everything ++ // This will ensure that we never see it in the _disconnectSignals loop ++ this.metaWindow.disconnect(this._windowClone._updateId); ++ this.realWindow.disconnect(this._windowClone._destroyId); ++ this._windowClone.destroy(); ++ + }, + + _disconnectSignals() { +@@ -1132,6 +1134,7 @@ var Workspace = new Lang.Class({ + // Create clones for windows that should be + // visible in the Overview + this._windows = []; ++ this._windowsDestroyedIds = []; + this._windowOverlays = []; + for (let i = 0; i < windows.length; i++) { + if (this._isOverviewWindow(windows[i])) { +@@ -1429,7 +1432,7 @@ var Workspace = new Lang.Class({ + return GLib.SOURCE_REMOVE; + }, + +- _doRemoveWindow(metaWin) { ++ _doRemoveWindow : function(metaWin, {cloneDestroy}={cloneDestroy: true}) { + let win = metaWin.get_compositor_private(); + + // find the position of the window in our list +@@ -1439,8 +1442,10 @@ var Workspace = new Lang.Class({ + return; + + let clone = this._windows[index]; ++ clone.disconnect(this._windowsDestroyedIds[index]); + + this._windows.splice(index, 1); ++ this._windowsDestroyedIds.splice(index, 1); + this._windowOverlays.splice(index, 1); + + // If metaWin.get_compositor_private() returned non-NULL, that +@@ -1458,7 +1463,9 @@ var Workspace = new Lang.Class({ + scale: stageWidth / clone.actor.width + }; + } +- clone.destroy(); ++ ++ if (cloneDestroy) ++ clone.destroy(); + + + // We need to reposition the windows; to avoid shuffling windows +@@ -1801,7 +1808,11 @@ var Workspace = new Lang.Class({ + this._actualGeometryLater = 0; + } + ++ for (let index = 0; index < this._windows.length; ++index) ++ this._windows[index].disconnect(this._windowsDestroyedIds[index]); ++ + this._windows = []; ++ this._windowsDestroyedIds = []; + }, + + // Sets this.leavingOverview flag to false. +@@ -1850,6 +1861,10 @@ var Workspace = new Lang.Class({ + this._recalculateWindowPositions(WindowPositionFlags.NONE); + }); + ++ let cloneDestroyedId = clone.connect('destroy', () => { ++ this._doRemoveWindow(clone.metaWindow, {cloneDestroy: false}); ++ }); ++ + this.actor.add_actor(clone.actor); + + overlay.connect('show-close-button', this._onShowOverlayClose.bind(this)); +@@ -1860,6 +1875,7 @@ var Workspace = new Lang.Class({ + clone.setStackAbove(this._windows[this._windows.length - 1].actor); + + this._windows.push(clone); ++ this._windowsDestroyedIds.push(cloneDestroyedId); + this._windowOverlays.push(overlay); + + return [clone, overlay]; +diff --git a/js/ui/workspaceThumbnail.js b/js/ui/workspaceThumbnail.js +index 7d5d2c0..fef3f6a 100644 +--- a/js/ui/workspaceThumbnail.js ++++ b/js/ui/workspaceThumbnail.js +@@ -70,12 +70,9 @@ var WindowClone = new Lang.Class({ + + this.clone._updateId = this.metaWindow.connect('position-changed', + this._onPositionChanged.bind(this)); +- this.clone._destroyId = this.realWindow.connect('destroy', () => { +- // First destroy the clone and then destroy everything +- // This will ensure that we never see it in the _disconnectSignals loop +- this.clone.destroy(); +- this.destroy(); +- }); ++ ++ this.clone._destroyId = this.realWindow.connect('destroy', this.destroy.bind(this)); ++ + this._onPositionChanged(); + + this.actor.connect('button-release-event', +@@ -142,6 +139,14 @@ var WindowClone = new Lang.Class({ + }, + + destroy() { ++ this.emit('destroy'); ++ ++ // First destroy the clone and then destroy everything ++ // This will ensure that we never see it in the _disconnectSignals loop ++ this.metaWindow.disconnect(this.clone._updateId); ++ this.realWindow.disconnect(this.clone._destroyId); ++ this.clone.destroy(); ++ + this.actor.destroy(); + }, + +@@ -285,6 +290,7 @@ var WorkspaceThumbnail = new Lang.Class({ + + // Create clones for windows that should be visible in the Overview + this._windows = []; ++ this._windowsDestroyedIds = []; + this._allWindows = []; + this._minimizedChangedIds = []; + for (let i = 0; i < windows.length; i++) { +@@ -373,7 +379,7 @@ var WorkspaceThumbnail = new Lang.Class({ + return this._collapseFraction; + }, + +- _doRemoveWindow(metaWin) { ++ _doRemoveWindow : function(metaWin, {cloneDestroy}={cloneDestroy: true}) { + let win = metaWin.get_compositor_private(); + + // find the position of the window in our list +@@ -383,9 +389,13 @@ var WorkspaceThumbnail = new Lang.Class({ + return; + + let clone = this._windows[index]; ++ clone.disconnect(this._windowsDestroyedIds[index]); ++ + this._windows.splice(index, 1); ++ this._windowsDestroyedIds.splice(index, 1); + +- clone.destroy(); ++ if (cloneDestroy) ++ clone.destroy(); + }, + + _doAddWindow(metaWin) { +@@ -504,7 +514,11 @@ var WorkspaceThumbnail = new Lang.Class({ + this._bgManager = null; + } + ++ for (let index = 0; index < this._windows.length; ++index) ++ this._windows[index].disconnect(this._windowsDestroyedIds[index]); ++ + this._windows = []; ++ this._windowsDestroyedIds = []; + this.actor = null; + }, + +@@ -537,6 +551,11 @@ var WorkspaceThumbnail = new Lang.Class({ + clone.connect('drag-end', () => { + Main.overview.endWindowDrag(clone.metaWindow); + }); ++ ++ let cloneDestroyedId = clone.connect('destroy', () => { ++ this._doRemoveWindow(clone.metaWindow, {cloneDestroy: false}); ++ }); ++ + this._contents.add_actor(clone.actor); + + if (this._windows.length == 0) +@@ -545,6 +564,7 @@ var WorkspaceThumbnail = new Lang.Class({ + clone.setStackAbove(this._windows[this._windows.length - 1].actor); + + this._windows.push(clone); ++ this._windowsDestroyedIds.push(cloneDestroyedId); + + return clone; + }, +-- +2.16.2 + diff --git a/meta-gnome/recipes-gnome/gnome-shell/gnome-shell_3.26.1.bb b/meta-gnome/recipes-gnome/gnome-shell/gnome-shell_3.26.1.bb deleted file mode 100644 index 5f5119e..0000000 --- a/meta-gnome/recipes-gnome/gnome-shell/gnome-shell_3.26.1.bb +++ /dev/null @@ -1,3 +0,0 @@ -require gnome-shell.inc -SRC_URI[archive.md5sum] = "eee354999984c143a3eb60da8cf27ddf" -SRC_URI[archive.sha256sum] = "38d98da06eb0118a0226623494b11765b3981414e804e270dc0cf03e37c708b9" diff --git a/meta-gnome/recipes-gnome/gnome-shell/gnome-shell_3.27.1.bb b/meta-gnome/recipes-gnome/gnome-shell/gnome-shell_3.27.1.bb deleted file mode 100644 index 65a9dac..0000000 --- a/meta-gnome/recipes-gnome/gnome-shell/gnome-shell_3.27.1.bb +++ /dev/null @@ -1,3 +0,0 @@ -require gnome-shell.inc -SRC_URI[archive.md5sum] = "d8b8521bad4f93f377c89240ceee3f33" -SRC_URI[archive.sha256sum] = "1972d39d1bb1ab708da3534911ac1f89acf45801b7c2cdc9ff9515f4eae17cc6" diff --git a/meta-gnome/recipes-gnome/gnome-shell/gnome-shell_3.28.0.bb b/meta-gnome/recipes-gnome/gnome-shell/gnome-shell_3.28.0.bb new file mode 100644 index 0000000..2f09c7c --- /dev/null +++ b/meta-gnome/recipes-gnome/gnome-shell/gnome-shell_3.28.0.bb @@ -0,0 +1,3 @@ +require gnome-shell.inc +SRC_URI[archive.md5sum] = "a0bf48381d8f4f081055f73764618016" +SRC_URI[archive.sha256sum] = "c7dec00d3c2b26e16611aac99630e3d41842179e9ec30cc873233b56c080ba4e"