update gnome-shell for 3.28
This commit is contained in:
parent
9624954dc8
commit
3c8a562fc8
@ -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"
|
||||
|
@ -0,0 +1,512 @@
|
||||
From fa873b3e84f52f2bd1ff397e7cae8bd8b31c700c Mon Sep 17 00:00:00 2001
|
||||
From: Bruce Leidl <bruce@subgraph.com>
|
||||
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
|
||||
|
@ -1,3 +0,0 @@
|
||||
require gnome-shell.inc
|
||||
SRC_URI[archive.md5sum] = "eee354999984c143a3eb60da8cf27ddf"
|
||||
SRC_URI[archive.sha256sum] = "38d98da06eb0118a0226623494b11765b3981414e804e270dc0cf03e37c708b9"
|
@ -1,3 +0,0 @@
|
||||
require gnome-shell.inc
|
||||
SRC_URI[archive.md5sum] = "d8b8521bad4f93f377c89240ceee3f33"
|
||||
SRC_URI[archive.sha256sum] = "1972d39d1bb1ab708da3534911ac1f89acf45801b7c2cdc9ff9515f4eae17cc6"
|
@ -0,0 +1,3 @@
|
||||
require gnome-shell.inc
|
||||
SRC_URI[archive.md5sum] = "a0bf48381d8f4f081055f73764618016"
|
||||
SRC_URI[archive.sha256sum] = "c7dec00d3c2b26e16611aac99630e3d41842179e9ec30cc873233b56c080ba4e"
|
Loading…
Reference in New Issue
Block a user