Merge ~3v1n0/ubuntu/+source/gnome-shell:ubuntu/bionic into ~ubuntu-desktop/ubuntu/+source/gnome-shell:ubuntu/bionic

Proposed by Marco Trevisan (Treviño)
Status: Merged
Merge reported by: Iain Lane
Merged at revision: 7d48524cf3055aa3e23d7762d81b730c5261be78
Proposed branch: ~3v1n0/ubuntu/+source/gnome-shell:ubuntu/bionic
Merge into: ~ubuntu-desktop/ubuntu/+source/gnome-shell:ubuntu/bionic
Diff against target: 439 lines (+102/-210)
3 files modified
debian/changelog (+3/-1)
debian/patches/js-fix-invalid-access-errors.patch (+81/-172)
debian/patches/workspace-fix-repositioned-windows-in-activities.patch (+18/-37)
Reviewer Review Type Date Requested Status
Iain Lane Approve
Review via email: mp+350755@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Iain Lane (laney) wrote :

Thanks.

Since the previous SRU was uploaded + tagged, I rebased this on top of the ubuntu/bionic branch and made a new changelog entry for .2. I checked the diff vs. the upload that went to cosmic just now and there's nothing in the content, just metadata.

This is merged but since there was a rebase Launchpad isn't going to know that.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/debian/changelog b/debian/changelog
index 8468ec3..6839363 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -9,7 +9,9 @@ gnome-shell (3.28.3-0ubuntu0.18.04.1) bionic; urgency=medium
9 debian/patches/ui-Theme-lookup-should-respect-XDG_DATA_DIRS.patch:9 debian/patches/ui-Theme-lookup-should-respect-XDG_DATA_DIRS.patch:
10 - Drop patches applied on the 3.28 branch10 - Drop patches applied on the 3.28 branch
11 * debian/patches/js-fix-invalid-access-errors.patch:11 * debian/patches/js-fix-invalid-access-errors.patch:
12 - Refreshed to reflect upstream changes12 - Updated to include upstream requested changes
13 * debian/patches/workspace-fix-repositioned-windows-in-activities.patch:
14 - Cherry-pick from upstream 3.28 branch
1315
14 -- Marco Trevisan (Treviño) <marco@ubuntu.com> Tue, 24 Jul 2018 12:46:27 +010016 -- Marco Trevisan (Treviño) <marco@ubuntu.com> Tue, 24 Jul 2018 12:46:27 +0100
1517
diff --git a/debian/patches/js-fix-invalid-access-errors.patch b/debian/patches/js-fix-invalid-access-errors.patch
index c86fc8b..a272d79 100644
--- a/debian/patches/js-fix-invalid-access-errors.patch
+++ b/debian/patches/js-fix-invalid-access-errors.patch
@@ -24,47 +24,37 @@ Remove duplicated handler on 'destroy' and just use a generic one.
2424
25https://bugzilla.gnome.org/show_bug.cgi?id=79123325https://bugzilla.gnome.org/show_bug.cgi?id=791233
2626
27workspaceThumbnail: Disconnect from window signals on destruction27automountManager: remove allowAutorun expire timeout on volume removal
2828
29Avoid to try to destroy the window clone content more than once29If the volume is removed before AUTORUN_EXPIRE_TIMEOUT_SECS seconds, we can stop
30when a window is destroyed, and do it in proper order.30the timeout earlier as there's nothing to unset, while the volume instance
31won't be valid anymore.
3132
32https://bugzilla.gnome.org/show_bug.cgi?id=79123333https://bugzilla.gnome.org/show_bug.cgi?id=791233
3334
34workspaceThumbnail: Remove WindowClone's from _windows when destroyed35messageList: stop syncing if closeButton has been destroyed
35
36A WindowClone might be destroyed earlier than its MetaWindow counterpart
37as its WindowActor could be destroyed earlier, thus when happens it's safer
38to remove the clone from the windows list, without waiting for the workspace
39to request to do so.
4036
41WindowClone now emits a 'destroy' signals earlier enough and this now37The _sync function for Message only updates the close button visibility,
42triggers a _doRemoveWindow on WorkspaceThumbnail which will lead38so we can safely stop doing that if the close button get get destroyed earlier
43to the proper cleanup; keeping track of the signal connections, in39(as it happens when clicking on it).
44order to avoid callback loops (not really harmful in this case, but
45good practice).
4640
47https://bugzilla.gnome.org/show_bug.cgi?id=79123341https://bugzilla.gnome.org/show_bug.cgi?id=791233
4842
49workspace: Disconnect from window signals on destruction43workspaceThumbnail: Don't keep stale clones in list
5044
51Avoid to try to destroy the window clone content more than once45If a clone gets destroyed before the corresponding MetaWindow is
52when a window is destroyed, and do it in proper order.46removed from the workspace, we will still find it in the list of
47clones and try to destroy it again. Avoid the resulting warnings
48by updating the list of clones immediately when a clone is destroyed.
5349
54https://bugzilla.gnome.org/show_bug.cgi?id=79123350https://bugzilla.gnome.org/show_bug.cgi?id=791233
5551
56workspace: Remove WindowClone's from _windows when destroyed52workspace: Don't keep stale clones in list
57
58A WindowClone might be destroyed earlier than its MetaWindow counterpart
59as its WindowActor could be destroyed earlier, thus when happens it's safer
60to remove the clone from the windows list, without waiting for the workspace
61to request to do so.
6253
63WindowClone now emits a 'destroy' signals earlier enough and this now54If a clone gets destroyed before the corresponding MetaWindow is
64triggers a _doRemoveWindow on WorkspaceThumbnail which will lead55removed from the workspace, we will still find it in the list of
65to the proper cleanup; keeping track of the signal connections, in56clones and try to destroy it again. Avoid the resulting warnings
66order to avoid callback loops (not really harmful in this case, but57by updating the list of clones immediately when a clone is destroyed.
67good practice).
6858
69https://bugzilla.gnome.org/show_bug.cgi?id=79123359https://bugzilla.gnome.org/show_bug.cgi?id=791233
7060
@@ -72,12 +62,52 @@ Bug-GNOME: https://bugzilla.gnome.org/show_bug.cgi?id=791233
72Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/bionic/+source/gnome-shell/+bug/174756662Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/bionic/+source/gnome-shell/+bug/1747566
73Forwarded: yes, https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/463Forwarded: yes, https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/4
74---64---
75 js/ui/dnd.js | 65 +++++++++++++++++++++++++++------------------65 js/ui/calendar.js | 2 ++
76 js/ui/tweener.js | 64 +++++++++++++++++++++++++++++++++++---------66 js/ui/components/automountManager.js | 6 ++++
77 js/ui/workspace.js | 26 +++++++++++-------67 js/ui/dnd.js | 65 +++++++++++++++++++++---------------
78 js/ui/workspaceThumbnail.js | 21 ++++++++++-----68 js/ui/messageList.js | 3 +-
79 4 files changed, 122 insertions(+), 54 deletions(-)69 js/ui/tweener.js | 63 ++++++++++++++++++++++++++--------
70 5 files changed, 99 insertions(+), 40 deletions(-)
8071
72diff --git a/js/ui/calendar.js b/js/ui/calendar.js
73index 651aac6..fd133cc 100644
74--- a/js/ui/calendar.js
75+++ b/js/ui/calendar.js
76@@ -802,6 +802,8 @@ var NotificationMessage = new Lang.Class({
77 },
78
79 _onDestroy() {
80+ this.parent();
81+
82 if (this._updatedId)
83 this.notification.disconnect(this._updatedId);
84 this._updatedId = 0;
85diff --git a/js/ui/components/automountManager.js b/js/ui/components/automountManager.js
86index 2d8f3f8..a6cd857 100644
87--- a/js/ui/components/automountManager.js
88+++ b/js/ui/components/automountManager.js
89@@ -210,6 +210,10 @@ var AutomountManager = new Lang.Class({
90 },
91
92 _onVolumeRemoved(monitor, volume) {
93+ if (volume._allowAutorunExpireId && volume._allowAutorunExpireId > 0) {
94+ Mainloop.source_remove(volume._allowAutorunExpireId);
95+ delete volume._allowAutorunExpireId;
96+ }
97 this._volumeQueue =
98 this._volumeQueue.filter(element => (element != volume));
99 },
100@@ -234,8 +238,10 @@ var AutomountManager = new Lang.Class({
101 _allowAutorunExpire(volume) {
102 let id = Mainloop.timeout_add_seconds(AUTORUN_EXPIRE_TIMEOUT_SECS, () => {
103 volume.allowAutorun = false;
104+ delete volume._allowAutorunExpireId;
105 return GLib.SOURCE_REMOVE;
106 });
107+ volume._allowAutorunExpireId = id;
108 GLib.Source.set_name_by_id(id, '[gnome-shell] volume.allowAutorun');
109 }
110 });
81diff --git a/js/ui/dnd.js b/js/ui/dnd.js111diff --git a/js/ui/dnd.js b/js/ui/dnd.js
82index a38607c..431c60d 100644112index a38607c..431c60d 100644
83--- a/js/ui/dnd.js113--- a/js/ui/dnd.js
@@ -275,11 +305,25 @@ index a38607c..431c60d 100644
275 currentDraggable = null;305 currentDraggable = null;
276 }306 }
277 });307 });
308diff --git a/js/ui/messageList.js b/js/ui/messageList.js
309index aff201e..2d397c1 100644
310--- a/js/ui/messageList.js
311+++ b/js/ui/messageList.js
312@@ -362,7 +362,8 @@ var Message = new Lang.Class({
313 this.setBody(body);
314
315 this._closeButton.connect('clicked', this.close.bind(this));
316- this.actor.connect('notify::hover', this._sync.bind(this));
317+ let actorHoverId = this.actor.connect('notify::hover', this._sync.bind(this));
318+ this._closeButton.connect('destroy', this.actor.disconnect.bind(this.actor, actorHoverId));
319 this.actor.connect('clicked', this._onClicked.bind(this));
320 this.actor.connect('destroy', this._onDestroy.bind(this));
321 this._sync();
278diff --git a/js/ui/tweener.js b/js/ui/tweener.js322diff --git a/js/ui/tweener.js b/js/ui/tweener.js
279index 1a85e2f..663b97b 100644323index 1a85e2f..22818ba 100644
280--- a/js/ui/tweener.js324--- a/js/ui/tweener.js
281+++ b/js/ui/tweener.js325+++ b/js/ui/tweener.js
282@@ -69,30 +69,68 @@ function _getTweenState(target) {326@@ -69,30 +69,67 @@ function _getTweenState(target) {
283 return target.__ShellTweenerState;327 return target.__ShellTweenerState;
284 }328 }
285 329
@@ -320,8 +364,7 @@ index 1a85e2f..663b97b 100644
320+ let wrapperNeeded = false;364+ let wrapperNeeded = false;
321+ let tweenerHandlers = _ensureHandlers(target);365+ let tweenerHandlers = _ensureHandlers(target);
322+366+
323+ if (!(name in tweenerHandlers))367+ if (!(name in tweenerHandlers)) {
324+ {
325+ tweenerHandlers[name] = [];368+ tweenerHandlers[name] = [];
326+ wrapperNeeded = true;369+ wrapperNeeded = true;
327+ }370+ }
@@ -361,137 +404,3 @@ index 1a85e2f..663b97b 100644
361 }404 }
362 405
363 function _actorDestroyed(target) {406 function _actorDestroyed(target) {
364diff --git a/js/ui/workspace.js b/js/ui/workspace.js
365index 8b56932..c148ccb 100644
366--- a/js/ui/workspace.js
367+++ b/js/ui/workspace.js
368@@ -139,14 +139,8 @@ var WindowClone = new Lang.Class({
369
370 this._windowClone._updateId = this.metaWindow.connect('size-changed',
371 this._onRealWindowSizeChanged.bind(this));
372- this._windowClone._destroyId =
373- this.realWindow.connect('destroy', () => {
374- // First destroy the clone and then destroy everything
375- // This will ensure that we never see it in the
376- // _disconnectSignals loop
377- this._windowClone.destroy();
378- this.destroy();
379- });
380+ this._windowClone._destroyId = this.realWindow.connect('destroy',
381+ this.destroy.bind(this));
382
383 this._updateAttachedDialogs();
384 this._computeBoundingBox();
385@@ -310,6 +304,14 @@ var WindowClone = new Lang.Class({
386 },
387
388 destroy() {
389+ this.emit('destroy');
390+
391+ // First destroy the clone and then destroy everything
392+ // This will ensure that we never see it in the _disconnectSignals loop
393+ this.metaWindow.disconnect(this._windowClone._updateId);
394+ this.realWindow.disconnect(this._windowClone._destroyId);
395+ this._windowClone.destroy();
396+
397 this.actor.destroy();
398 },
399
400@@ -1131,6 +1133,7 @@ var Workspace = new Lang.Class({
401 // Create clones for windows that should be
402 // visible in the Overview
403 this._windows = [];
404+ this._windowsDestroyedIds = [];
405 this._windowOverlays = [];
406 for (let i = 0; i < windows.length; i++) {
407 if (this._isOverviewWindow(windows[i])) {
408@@ -1428,7 +1431,7 @@ var Workspace = new Lang.Class({
409 return GLib.SOURCE_REMOVE;
410 },
411
412- _doRemoveWindow(metaWin) {
413+ _doRemoveWindow(metaWin, {cloneDestroy}={cloneDestroy: true}) {
414 let win = metaWin.get_compositor_private();
415
416 let clone = this._removeWindowClone(metaWin);
417@@ -1792,7 +1795,11 @@ var Workspace = new Lang.Class({
418 this._actualGeometryLater = 0;
419 }
420
421+ for (let index = 0; index < this._windows.length; ++index)
422+ this._windows[index].disconnect(this._windowsDestroyedIds[index]);
423+
424 this._windows = [];
425+ this._windowsDestroyedIds = [];
426 },
427
428 // Sets this.leavingOverview flag to false.
429@@ -1859,6 +1866,7 @@ var Workspace = new Lang.Class({
430 clone.setStackAbove(this._windows[this._windows.length - 1].actor);
431
432 this._windows.push(clone);
433+ this._windowsDestroyedIds.push(cloneDestroyedId);
434 this._windowOverlays.push(overlay);
435
436 return [clone, overlay];
437diff --git a/js/ui/workspaceThumbnail.js b/js/ui/workspaceThumbnail.js
438index 381169e..016dda6 100644
439--- a/js/ui/workspaceThumbnail.js
440+++ b/js/ui/workspaceThumbnail.js
441@@ -70,12 +70,7 @@ var WindowClone = new Lang.Class({
442
443 this.clone._updateId = this.metaWindow.connect('position-changed',
444 this._onPositionChanged.bind(this));
445- this.clone._destroyId = this.realWindow.connect('destroy', () => {
446- // First destroy the clone and then destroy everything
447- // This will ensure that we never see it in the _disconnectSignals loop
448- this.clone.destroy();
449- this.destroy();
450- });
451+ this.clone._destroyId = this.realWindow.connect('destroy', this.destroy.bind(this));
452 this._onPositionChanged();
453
454 this.actor.connect('button-release-event',
455@@ -142,6 +137,14 @@ var WindowClone = new Lang.Class({
456 },
457
458 destroy() {
459+ this.emit('destroy');
460+
461+ // First destroy the clone and then destroy everything
462+ // This will ensure that we never see it in the _disconnectSignals loop
463+ this.metaWindow.disconnect(this.clone._updateId);
464+ this.realWindow.disconnect(this.clone._destroyId);
465+ this.clone.destroy();
466+
467 this.actor.destroy();
468 },
469
470@@ -285,6 +288,7 @@ var WorkspaceThumbnail = new Lang.Class({
471
472 // Create clones for windows that should be visible in the Overview
473 this._windows = [];
474+ this._windowsDestroyedIds = [];
475 this._allWindows = [];
476 this._minimizedChangedIds = [];
477 for (let i = 0; i < windows.length; i++) {
478@@ -493,7 +497,11 @@ var WorkspaceThumbnail = new Lang.Class({
479 this._bgManager = null;
480 }
481
482+ for (let index = 0; index < this._windows.length; ++index)
483+ this._windows[index].disconnect(this._windowsDestroyedIds[index]);
484+
485 this._windows = [];
486+ this._windowsDestroyedIds = [];
487 this.actor = null;
488 },
489
490@@ -537,6 +545,7 @@ var WorkspaceThumbnail = new Lang.Class({
491 clone.setStackAbove(this._windows[this._windows.length - 1].actor);
492
493 this._windows.push(clone);
494+ this._windowsDestroyedIds.push(cloneDestroyedId);
495
496 return clone;
497 },
diff --git a/debian/patches/workspace-fix-repositioned-windows-in-activities.patch b/debian/patches/workspace-fix-repositioned-windows-in-activities.patch
index 5ff0ae2..7da103a 100644
--- a/debian/patches/workspace-fix-repositioned-windows-in-activities.patch
+++ b/debian/patches/workspace-fix-repositioned-windows-in-activities.patch
@@ -20,12 +20,12 @@ Bug-GNOME: https://bugzilla.gnome.org/show_bug.cgi?id=776588
20Bug-Ubuntu: https://bugs.launchpad.net/gnome-shell/+bug/165315320Bug-Ubuntu: https://bugs.launchpad.net/gnome-shell/+bug/1653153
21Forwarded: yes, https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/821Forwarded: yes, https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/8
22---22---
23 js/ui/workspace.js | 28 +++++++++++++++-------------23 js/ui/workspace.js | 25 +++++++++++++------------
24 js/ui/workspaceThumbnail.js | 9 ++++-----24 js/ui/workspaceThumbnail.js | 7 +++----
25 2 files changed, 19 insertions(+), 18 deletions(-)25 2 files changed, 16 insertions(+), 16 deletions(-)
2626
27diff --git a/js/ui/workspace.js b/js/ui/workspace.js27diff --git a/js/ui/workspace.js b/js/ui/workspace.js
28index 8836537..f06b78e 10064428index 8b56932..112c54e 100644
29--- a/js/ui/workspace.js29--- a/js/ui/workspace.js
30+++ b/js/ui/workspace.js30+++ b/js/ui/workspace.js
31@@ -137,8 +137,10 @@ var WindowClone = new Lang.Class({31@@ -137,8 +137,10 @@ var WindowClone = new Lang.Class({
@@ -38,10 +38,10 @@ index 8836537..f06b78e 100644
38+ this._onMetaWindowSizeChanged.bind(this));38+ this._onMetaWindowSizeChanged.bind(this));
39+ this._windowClone._posChangedId = this.metaWindow.connect('position-changed',39+ this._windowClone._posChangedId = this.metaWindow.connect('position-changed',
40+ this._computeBoundingBox.bind(this));40+ this._computeBoundingBox.bind(this));
41 this._windowClone._destroyId = this.realWindow.connect('destroy',41 this._windowClone._destroyId =
42 this.destroy.bind(this));42 this.realWindow.connect('destroy', () => {
43 43 // First destroy the clone and then destroy everything
44@@ -200,8 +202,7 @@ var WindowClone = new Lang.Class({44@@ -206,8 +208,7 @@ var WindowClone = new Lang.Class({
45 45
46 addAttachedDialog(win) {46 addAttachedDialog(win) {
47 this._doAddAttachedDialog(win, win.get_compositor_private());47 this._doAddAttachedDialog(win, win.get_compositor_private());
@@ -51,7 +51,7 @@ index 8836537..f06b78e 100644
51 },51 },
52 52
53 hasAttachedDialogs() {53 hasAttachedDialogs() {
54@@ -210,15 +211,14 @@ var WindowClone = new Lang.Class({54@@ -216,15 +217,14 @@ var WindowClone = new Lang.Class({
55 55
56 _doAddAttachedDialog(metaWin, realWin) {56 _doAddAttachedDialog(metaWin, realWin) {
57 let clone = new Clutter.Clone({ source: realWin });57 let clone = new Clutter.Clone({ source: realWin });
@@ -68,21 +68,11 @@ index 8836537..f06b78e 100644
68 68
69- this._computeBoundingBox();69- this._computeBoundingBox();
70- this.emit('size-changed');70- this.emit('size-changed');
71+ this._onMetaWindowSizeChanged.bind(this);71+ this._onMetaWindowSizeChanged();
72 });72 });
73 this.actor.add_child(clone);73 this.actor.add_child(clone);
74 },74 },
75@@ -308,7 +308,8 @@ var WindowClone = new Lang.Class({75@@ -321,12 +321,13 @@ var WindowClone = new Lang.Class({
76
77 // First destroy the clone and then destroy everything
78 // This will ensure that we never see it in the _disconnectSignals loop
79- this.metaWindow.disconnect(this._windowClone._updateId);
80+ this.metaWindow.disconnect(this._windowClone._sizeChangedId);
81+ this.metaWindow.disconnect(this._windowClone._posChangedId);
82 this.realWindow.disconnect(this._windowClone._destroyId);
83 this._windowClone.destroy();
84
85@@ -323,12 +324,13 @@ var WindowClone = new Lang.Class({
86 else76 else
87 realWindow = child.source;77 realWindow = child.source;
88 78
@@ -99,7 +89,7 @@ index 8836537..f06b78e 100644
99 this.emit('size-changed');89 this.emit('size-changed');
100 },90 },
101diff --git a/js/ui/workspaceThumbnail.js b/js/ui/workspaceThumbnail.js91diff --git a/js/ui/workspaceThumbnail.js b/js/ui/workspaceThumbnail.js
102index 0c72e74..4db8c19 10064492index 381169e..417296d 100644
103--- a/js/ui/workspaceThumbnail.js93--- a/js/ui/workspaceThumbnail.js
104+++ b/js/ui/workspaceThumbnail.js94+++ b/js/ui/workspaceThumbnail.js
105@@ -68,7 +68,7 @@ var WindowClone = new Lang.Class({95@@ -68,7 +68,7 @@ var WindowClone = new Lang.Class({
@@ -109,27 +99,18 @@ index 0c72e74..4db8c19 100644
109- this.clone._updateId = this.metaWindow.connect('position-changed',99- this.clone._updateId = this.metaWindow.connect('position-changed',
110+ this.clone._updateId = this.realWindow.connect('notify::position',100+ this.clone._updateId = this.realWindow.connect('notify::position',
111 this._onPositionChanged.bind(this));101 this._onPositionChanged.bind(this));
112 this.clone._destroyId = this.realWindow.connect('destroy', this.destroy.bind(this));102 this.clone._destroyId = this.realWindow.connect('destroy', () => {
113 this._onPositionChanged();103 // First destroy the clone and then destroy everything
114@@ -141,7 +141,7 @@ var WindowClone = new Lang.Class({104@@ -153,7 +153,7 @@ var WindowClone = new Lang.Class({
115
116 // First destroy the clone and then destroy everything
117 // This will ensure that we never see it in the _disconnectSignals loop
118- this.metaWindow.disconnect(this.clone._updateId);
119+ this.realWindow.disconnect(this.clone._updateId);
120 this.realWindow.disconnect(this.clone._destroyId);
121 this.clone.destroy();
122
123@@ -156,7 +156,7 @@ var WindowClone = new Lang.Class({
124 let clone = new Clutter.Clone({ source: realDialog });105 let clone = new Clutter.Clone({ source: realDialog });
125 this._updateDialogPosition(realDialog, clone);106 this._updateDialogPosition(realDialog, clone);
126 107
127- clone._updateId = metaDialog.connect('position-changed', dialog => {108- clone._updateId = metaDialog.connect('position-changed', dialog => {
128+ clone._updateId = metaDialog.connect('notify::position', dialog => {109+ clone._updateId = realDialog.connect('notify::position', dialog => {
129 this._updateDialogPosition(dialog, clone);110 this._updateDialogPosition(dialog, clone);
130 });111 });
131 clone._destroyId = realDialog.connect('destroy', () => {112 clone._destroyId = realDialog.connect('destroy', () => {
132@@ -174,7 +174,6 @@ var WindowClone = new Lang.Class({113@@ -171,7 +171,6 @@ var WindowClone = new Lang.Class({
133 },114 },
134 115
135 _onPositionChanged() {116 _onPositionChanged() {
@@ -137,7 +118,7 @@ index 0c72e74..4db8c19 100644
137 this.actor.set_position(this.realWindow.x, this.realWindow.y);118 this.actor.set_position(this.realWindow.x, this.realWindow.y);
138 },119 },
139 120
140@@ -182,7 +181,7 @@ var WindowClone = new Lang.Class({121@@ -179,7 +178,7 @@ var WindowClone = new Lang.Class({
141 this.actor.get_children().forEach(child => {122 this.actor.get_children().forEach(child => {
142 let realWindow = child.source;123 let realWindow = child.source;
143 124

Subscribers

People subscribed via source and target branches