diff -Nru gnome-shell-3.28.3/debian/changelog gnome-shell-3.28.3+git20190124/debian/changelog --- gnome-shell-3.28.3/debian/changelog 2018-12-05 13:08:10.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/changelog 2019-01-25 18:29:40.000000000 +0000 @@ -1,3 +1,34 @@ +gnome-shell (3.28.3+git20190124-0ubuntu18.04.1) bionic; urgency=medium + + * New git snapshot release up to commit 24cdcc56d (LP: #1811900) + - Don't fill journal with osdWindow errors (LP: #1772677) + - Fix missing icon in keyboard indicator (LP: #1812266) + * d/p/authPrompt-Do-not-enable-sensitivity-if-retries-are-disal.patch, + d/p/authPrompt-Unset-preemptiveAnswer-on-reset.patch, + d/p/gdm-util-Always-allow-to-retry-login-in-unlock-mode.patch, + d/p/ibus-set-content-type-no-holdKeyboard.patch, + d/p/popupMenu-Don-t-handle-key-presses-directly-if-there-are-.patch, + d/p/st-button-Ignore-pointer-emulated-touch-events.patch, + d/p/shell-ignore-invalid-window-monitor-index.patch, + d/p/workspace-fix-repositioned-windows-in-activities.patch: + - Removed patches applied upstream + * d/p/StIcon-only-compute-shadow-pipeline-when-the-texture-is-p.patch, + d/p/js-fix-invalid-access-errors.patch, + d/p/js-ui-Choose-some-actors-to-cache-on-the-GPU.patch, + d/p/optional-hot-corner.patch, + d/p/st-texture-cache-Cancel-sliced-image-loading-on-target-ac.patch, + d/p/workaround_crasher_fractional_scaling.patch: + - Refreshed as per upstream changes + * d/p/keyboard-Filter-redundant-FocusTracker-position-changed-s.patch, + d/p/keyboard-Listen-to-IbusPanelService-focus-in-out-to-track.patch: + - Fix OSK activation on X11 (LP: #1760399) + * d/p/power-Label-the-PENDING_CHARGE-state-as-Not-Charging.patch: + - Label the PENDING_CHARGE state as "Not Charging" (LP: #1745032) + * d/p/debian/patches/volume-Add-back-sound-feedback-on-scroll.patch: + - Add missing include (LP: #1811908) + + -- Marco Trevisan (Treviño) Fri, 25 Jan 2019 18:29:40 +0000 + gnome-shell (3.28.3-0ubuntu0.18.04.4) bionic; urgency=medium * debian/patches/ibus-set-content-type-no-holdKeyboard.patch: diff -Nru gnome-shell-3.28.3/debian/patches/authPrompt-Do-not-enable-sensitivity-if-retries-are-disal.patch gnome-shell-3.28.3+git20190124/debian/patches/authPrompt-Do-not-enable-sensitivity-if-retries-are-disal.patch --- gnome-shell-3.28.3/debian/patches/authPrompt-Do-not-enable-sensitivity-if-retries-are-disal.patch 2018-12-05 13:08:10.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/authPrompt-Do-not-enable-sensitivity-if-retries-are-disal.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= -Date: Tue, 29 May 2018 02:00:04 +0200 -Subject: authPrompt: Do not enable sensitivity if retries are disallowed - -Set the sensitivity of the UI according to the canRetry parameter and thus -if no more logins are allowed don't take any input. - -Fixes #311 - -Bug-GNOME: https://gitlab.gnome.org/GNOME/gnome-shell/issues/311 -Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1777956 -Forwarded: yes, https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/116 ---- - js/gdm/authPrompt.js | 4 ++-- - js/gdm/util.js | 2 +- - 2 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index d9ec7ee..a0a4a21 100644 ---- a/js/gdm/authPrompt.js -+++ b/js/gdm/authPrompt.js -@@ -242,11 +242,11 @@ var AuthPrompt = new Lang.Class({ - this.emit('prompted'); - }, - -- _onVerificationFailed() { -+ _onVerificationFailed(userVerifier, canRetry) { - this._queryingService = null; - this.clear(); - -- this.updateSensitivity(true); -+ this.updateSensitivity(canRetry); - this.setActorInDefaultButtonWell(null); - this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED; - }, -diff --git a/js/gdm/util.js b/js/gdm/util.js -index 261e1e4..0532ca8 100644 ---- a/js/gdm/util.js -+++ b/js/gdm/util.js -@@ -562,7 +562,7 @@ var ShellUserVerifier = new Lang.Class({ - } - } - -- this.emit('verification-failed'); -+ this.emit('verification-failed', canRetry); - }, - - _onConversationStopped(client, serviceName) { diff -Nru gnome-shell-3.28.3/debian/patches/authPrompt-Unset-preemptiveAnswer-on-reset.patch gnome-shell-3.28.3+git20190124/debian/patches/authPrompt-Unset-preemptiveAnswer-on-reset.patch --- gnome-shell-3.28.3/debian/patches/authPrompt-Unset-preemptiveAnswer-on-reset.patch 2018-12-05 13:08:10.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/authPrompt-Unset-preemptiveAnswer-on-reset.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= -Date: Tue, 29 May 2018 01:51:00 +0200 -Subject: authPrompt: Unset preemptiveAnswer on reset - -When we get a reset signal the preemptiveAnswer should be also unset or it will -be used next time the user authPrompt will be activated, even without any further -user interaction. - -Fixes #311 - -Bug-GNOME: https://gitlab.gnome.org/GNOME/gnome-shell/issues/311 -Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1777956 -Forwarded: yes, https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/116 ---- - js/gdm/authPrompt.js | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index 481cd3a..d9ec7ee 100644 ---- a/js/gdm/authPrompt.js -+++ b/js/gdm/authPrompt.js -@@ -439,6 +439,7 @@ var AuthPrompt = new Lang.Class({ - this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; - this.cancelButton.reactive = true; - this.nextButton.label = _("Next"); -+ this._preemptiveAnswer = null; - - if (this._userVerifier) - this._userVerifier.cancel(); diff -Nru gnome-shell-3.28.3/debian/patches/gdm-util-Always-allow-to-retry-login-in-unlock-mode.patch gnome-shell-3.28.3+git20190124/debian/patches/gdm-util-Always-allow-to-retry-login-in-unlock-mode.patch --- gnome-shell-3.28.3/debian/patches/gdm-util-Always-allow-to-retry-login-in-unlock-mode.patch 2018-12-05 13:08:10.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/gdm-util-Always-allow-to-retry-login-in-unlock-mode.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= -Date: Tue, 29 May 2018 02:10:09 +0200 -Subject: gdm, util: Always allow to retry login in unlock mode - -When in lockscreen mode there's no point of resetting the auth login as there's -no welcome screen, and that would just cause the UI to freeze, with no reason. -This could have been useful if we were stopping the user to login for a given -time after ALLOWED_FAILURES attempts, but this is not the case yet. - -Bug-GNOME: https://gitlab.gnome.org/GNOME/gnome-shell/issues/311 -Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1777956 -Forwarded: yes, https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/116 ---- - js/gdm/util.js | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/js/gdm/util.js b/js/gdm/util.js -index 0532ca8..105a320 100644 ---- a/js/gdm/util.js -+++ b/js/gdm/util.js -@@ -534,12 +534,13 @@ var ShellUserVerifier = new Lang.Class({ - _verificationFailed(retry) { - // For Not Listed / enterprise logins, immediately reset - // the dialog -- // Otherwise, we allow ALLOWED_FAILURES attempts. After that, we -- // go back to the welcome screen. -+ // Otherwise, when in login mode we allow ALLOWED_FAILURES attempts. -+ // After that, we go back to the welcome screen. - - this._failCounter++; - let canRetry = retry && this._userName && -- this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY); -+ (this._reauthOnly || -+ this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY)); - - if (canRetry) { - if (!this.hasPendingMessages) { diff -Nru gnome-shell-3.28.3/debian/patches/ibus-set-content-type-no-holdKeyboard.patch gnome-shell-3.28.3+git20190124/debian/patches/ibus-set-content-type-no-holdKeyboard.patch --- gnome-shell-3.28.3/debian/patches/ibus-set-content-type-no-holdKeyboard.patch 2018-12-05 13:08:10.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/ibus-set-content-type-no-holdKeyboard.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -From 551e827841626cd8084daa2210b3bf60e5be96be Mon Sep 17 00:00:00 2001 -From: Takao Fujiwara -Date: Fri, 31 Aug 2018 20:22:23 +0900 -Subject: [PATCH] keyboard: Do not call KeyboardManager.holdKeyboard() with - set-content-type - -When gnome-shell receives the signal of 'set-content-type' from ibus, -gnome-shell calls KeyboardManager.holdKeyboard() and -KeyboardManager.releaseKeyboard() and the functions change the current -input focus in GNOME Xorg and it could result in closing a popup window -which has a password entry by focusing on the entry. -The solution is to stop to call the APIs on 'set-content-type' signal. - -Origin: https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/140 -Bug-Upstream: https://gitlab.gnome.org/GNOME/gnome-shell/issues/391 -Bug-Ubuntu: https://launchpad.net/bugs/1765304 ---- - js/ui/status/keyboard.js | 18 ++++++++++++++++-- - 1 file changed, 16 insertions(+), 2 deletions(-) - -diff --git a/js/ui/status/keyboard.js b/js/ui/status/keyboard.js -index 6d031d88c..980019cd4 100644 ---- a/js/ui/status/keyboard.js -+++ b/js/ui/status/keyboard.js -@@ -360,11 +360,14 @@ var InputSourceManager = new Lang.Class({ - this._settings.connect('per-window-changed', this._sourcesPerWindowChanged.bind(this)); - this._sourcesPerWindowChanged(); - this._disableIBus = false; -+ this._reloading = false; - }, - - reload() { -+ this._reloading = true; - this._keyboardManager.setKeyboardOptions(this._settings.keyboardOptions); - this._inputSourcesChanged(); -+ this._reloading = false; - }, - - _ibusReadyCallback(im, ready) { -@@ -458,7 +461,15 @@ var InputSourceManager = new Lang.Class({ - }, - - activateInputSource(is, interactive) { -- KeyboardManager.holdKeyboard(); -+ // The focus changes during holdKeyboard/releaseKeyboard may trick -+ // the client into hiding UI containing the currently focused entry. -+ // So holdKeyboard/releaseKeyboard are not called when -+ // 'set-content-type' signal is received. -+ // E.g. Focusing on a password entry in a popup in Xorg Firefox -+ // will emit 'set-content-type' signal. -+ // https://gitlab.gnome.org/GNOME/gnome-shell/issues/391 -+ if (!this._reloading) -+ KeyboardManager.holdKeyboard(); - this._keyboardManager.apply(is.xkbId); - - // All the "xkb:..." IBus engines simply "echo" back symbols, -@@ -473,7 +484,10 @@ var InputSourceManager = new Lang.Class({ - else - engine = 'xkb:us::eng'; - -- this._ibusManager.setEngine(engine, KeyboardManager.releaseKeyboard); -+ if (!this._reloading) -+ this._ibusManager.setEngine(engine, KeyboardManager.releaseKeyboard); -+ else -+ this._ibusManager.setEngine(engine); - this._currentInputSourceChanged(is); - - if (interactive) --- -2.18.1 - diff -Nru gnome-shell-3.28.3/debian/patches/js-fix-invalid-access-errors.patch gnome-shell-3.28.3+git20190124/debian/patches/js-fix-invalid-access-errors.patch --- gnome-shell-3.28.3/debian/patches/js-fix-invalid-access-errors.patch 2018-12-05 13:08:10.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/js-fix-invalid-access-errors.patch 2019-01-25 18:29:40.000000000 +0000 @@ -1,5 +1,5 @@ From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= -Date: Mon, 4 Dec 2017 19:41:50 -0600 +Date: Tue, 5 Dec 2017 02:41:50 +0100 Subject: js: fix invalid-access errors tweener: Save handlers on target and remove them on destroy @@ -24,92 +24,16 @@ https://bugzilla.gnome.org/show_bug.cgi?id=791233 -automountManager: remove allowAutorun expire timeout on volume removal - -If the volume is removed before AUTORUN_EXPIRE_TIMEOUT_SECS seconds, we can stop -the timeout earlier as there's nothing to unset, while the volume instance -won't be valid anymore. - -https://bugzilla.gnome.org/show_bug.cgi?id=791233 - -messageList: stop syncing if closeButton has been destroyed - -The _sync function for Message only updates the close button visibility, -so we can safely stop doing that if the close button get get destroyed earlier -(as it happens when clicking on it). - -https://bugzilla.gnome.org/show_bug.cgi?id=791233 - -workspaceThumbnail: Don't keep stale clones in list - -If a clone gets destroyed before the corresponding MetaWindow is -removed from the workspace, we will still find it in the list of -clones and try to destroy it again. Avoid the resulting warnings -by updating the list of clones immediately when a clone is destroyed. - -https://bugzilla.gnome.org/show_bug.cgi?id=791233 - -workspace: Don't keep stale clones in list - -If a clone gets destroyed before the corresponding MetaWindow is -removed from the workspace, we will still find it in the list of -clones and try to destroy it again. Avoid the resulting warnings -by updating the list of clones immediately when a clone is destroyed. - -https://bugzilla.gnome.org/show_bug.cgi?id=791233 - Bug-GNOME: https://bugzilla.gnome.org/show_bug.cgi?id=791233 Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/bionic/+source/gnome-shell/+bug/1747566 Forwarded: yes, https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/4 --- - js/ui/calendar.js | 2 ++ - js/ui/components/automountManager.js | 6 ++++ - js/ui/dnd.js | 65 +++++++++++++++++++++--------------- - js/ui/messageList.js | 3 +- - js/ui/tweener.js | 63 ++++++++++++++++++++++++++-------- - 5 files changed, 99 insertions(+), 40 deletions(-) + js/ui/dnd.js | 65 +++++++++++++++++++++++++++++++++----------------------- + js/ui/tweener.js | 63 ++++++++++++++++++++++++++++++++++++++++++------------ + 2 files changed, 89 insertions(+), 39 deletions(-) -diff --git a/js/ui/calendar.js b/js/ui/calendar.js -index 651aac6..fd133cc 100644 ---- a/js/ui/calendar.js -+++ b/js/ui/calendar.js -@@ -802,6 +802,8 @@ var NotificationMessage = new Lang.Class({ - }, - - _onDestroy() { -+ this.parent(); -+ - if (this._updatedId) - this.notification.disconnect(this._updatedId); - this._updatedId = 0; -diff --git a/js/ui/components/automountManager.js b/js/ui/components/automountManager.js -index 2d8f3f8..a6cd857 100644 ---- a/js/ui/components/automountManager.js -+++ b/js/ui/components/automountManager.js -@@ -210,6 +210,10 @@ var AutomountManager = new Lang.Class({ - }, - - _onVolumeRemoved(monitor, volume) { -+ if (volume._allowAutorunExpireId && volume._allowAutorunExpireId > 0) { -+ Mainloop.source_remove(volume._allowAutorunExpireId); -+ delete volume._allowAutorunExpireId; -+ } - this._volumeQueue = - this._volumeQueue.filter(element => (element != volume)); - }, -@@ -234,8 +238,10 @@ var AutomountManager = new Lang.Class({ - _allowAutorunExpire(volume) { - let id = Mainloop.timeout_add_seconds(AUTORUN_EXPIRE_TIMEOUT_SECS, () => { - volume.allowAutorun = false; -+ delete volume._allowAutorunExpireId; - return GLib.SOURCE_REMOVE; - }); -+ volume._allowAutorunExpireId = id; - GLib.Source.set_name_by_id(id, '[gnome-shell] volume.allowAutorun'); - } - }); diff --git a/js/ui/dnd.js b/js/ui/dnd.js -index a38607c..431c60d 100644 +index ec1ba1d..9e961a1 100644 --- a/js/ui/dnd.js +++ b/js/ui/dnd.js @@ -27,6 +27,12 @@ var DragMotionResult = { @@ -205,7 +129,7 @@ this._dragOrigOpacity = this._dragActor.opacity; if (this._dragActorOpacity != undefined) this._dragActor.opacity = this._dragActorOpacity; -@@ -500,7 +515,7 @@ var _Draggable = new Lang.Class({ +@@ -518,7 +533,7 @@ var _Draggable = new Lang.Class({ event.get_time())) { // If it accepted the drop without taking the actor, // handle it ourselves. @@ -214,7 +138,7 @@ if (this._restoreOnSuccess) { this._restoreDragActor(event.get_time()); return true; -@@ -508,7 +523,7 @@ var _Draggable = new Lang.Class({ +@@ -526,7 +541,7 @@ var _Draggable = new Lang.Class({ this._dragActor.destroy(); } @@ -223,7 +147,7 @@ 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({ +@@ -575,20 +590,22 @@ var _Draggable = new Lang.Class({ _cancelDrag(eventTime) { this.emit('drag-cancelled', eventTime); @@ -250,7 +174,7 @@ this._animateDragEnd(eventTime, { x: snapBackX, y: snapBackY, -@@ -581,7 +598,7 @@ var _Draggable = new Lang.Class({ +@@ -599,7 +616,7 @@ var _Draggable = new Lang.Class({ }, _restoreDragActor(eventTime) { @@ -259,7 +183,7 @@ let [restoreX, restoreY, restoreScale] = this._getRestoreLocation(); // fade the actor back in at its original location -@@ -596,12 +613,6 @@ var _Draggable = new Lang.Class({ +@@ -614,12 +631,6 @@ var _Draggable = new Lang.Class({ _animateDragEnd(eventTime, params) { this._animationInProgress = true; @@ -272,7 +196,7 @@ params['opacity'] = this._dragOrigOpacity; params['transition'] = 'easeOutQuad'; params['onComplete'] = this._onAnimationComplete; -@@ -624,9 +635,6 @@ var _Draggable = new Lang.Class({ +@@ -642,9 +653,6 @@ var _Draggable = new Lang.Class({ }, _onAnimationComplete(dragActor, eventTime) { @@ -282,7 +206,7 @@ if (this._dragOrigParent) { Main.uiGroup.remove_child(this._dragActor); this._dragOrigParent.add_actor(this._dragActor); -@@ -641,7 +649,7 @@ var _Draggable = new Lang.Class({ +@@ -659,7 +667,7 @@ var _Draggable = new Lang.Class({ }, _dragComplete() { @@ -291,7 +215,7 @@ Shell.util_set_hidden_from_pick(this._dragActor, false); this._ungrabEvents(); -@@ -652,7 +660,12 @@ var _Draggable = new Lang.Class({ +@@ -670,7 +678,12 @@ var _Draggable = new Lang.Class({ this._updateHoverId = 0; } @@ -305,20 +229,6 @@ currentDraggable = null; } }); -diff --git a/js/ui/messageList.js b/js/ui/messageList.js -index aff201e..2d397c1 100644 ---- a/js/ui/messageList.js -+++ b/js/ui/messageList.js -@@ -362,7 +362,8 @@ var Message = new Lang.Class({ - this.setBody(body); - - this._closeButton.connect('clicked', this.close.bind(this)); -- this.actor.connect('notify::hover', this._sync.bind(this)); -+ let actorHoverId = this.actor.connect('notify::hover', this._sync.bind(this)); -+ this._closeButton.connect('destroy', this.actor.disconnect.bind(this.actor, actorHoverId)); - this.actor.connect('clicked', this._onClicked.bind(this)); - this.actor.connect('destroy', this._onDestroy.bind(this)); - this._sync(); diff --git a/js/ui/tweener.js b/js/ui/tweener.js index 1a85e2f..22818ba 100644 --- a/js/ui/tweener.js diff -Nru gnome-shell-3.28.3/debian/patches/js-ui-Choose-some-actors-to-cache-on-the-GPU.patch gnome-shell-3.28.3+git20190124/debian/patches/js-ui-Choose-some-actors-to-cache-on-the-GPU.patch --- gnome-shell-3.28.3/debian/patches/js-ui-Choose-some-actors-to-cache-on-the-GPU.patch 2018-12-05 13:08:10.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/js-ui-Choose-some-actors-to-cache-on-the-GPU.patch 2019-01-25 18:29:40.000000000 +0000 @@ -1,5 +1,5 @@ From: Daniel van Vugt -Date: Fri, 6 Apr 2018 05:26:58 -0500 +Date: Fri, 6 Apr 2018 12:26:58 +0200 Subject: js/ui: Choose some actors to cache on the GPU Adds a wrapper function to flag actors that are good candidates for @@ -64,10 +64,10 @@ this._container.connect('get-preferred-height', this._getPreferredHeight.bind(this)); this._container.connect('allocate', this._allocate.bind(this)); diff --git a/js/ui/dash.js b/js/ui/dash.js -index 5ee2476..14864f1 100644 +index d75af65..4d3fe73 100644 --- a/js/ui/dash.js +++ b/js/ui/dash.js -@@ -402,6 +402,7 @@ var Dash = new Lang.Class({ +@@ -404,6 +404,7 @@ var Dash = new Lang.Class({ clip_to_allocation: true }); this._box._delegate = this; this._container.add_actor(this._box); @@ -96,10 +96,10 @@ this.contentLayout = new St.BoxLayout({ vertical: true, style_class: "modal-dialog-content-box" }); diff --git a/js/ui/main.js b/js/ui/main.js -index d86cf9e..5277cf7 100644 +index 2c54bb6..baca1c2 100644 --- a/js/ui/main.js +++ b/js/ui/main.js -@@ -716,3 +716,19 @@ function showRestartMessage(message) { +@@ -719,3 +719,19 @@ function showRestartMessage(message) { let restartMessage = new RestartMessage(message); restartMessage.open(); } @@ -120,7 +120,7 @@ + actor.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS); +} diff --git a/js/ui/panel.js b/js/ui/panel.js -index 2f59324..2237ead 100644 +index ef14ddf..a76916b 100644 --- a/js/ui/panel.js +++ b/js/ui/panel.js @@ -772,6 +772,7 @@ var Panel = new Lang.Class({ diff -Nru gnome-shell-3.28.3/debian/patches/keyboard-Filter-redundant-FocusTracker-position-changed-s.patch gnome-shell-3.28.3+git20190124/debian/patches/keyboard-Filter-redundant-FocusTracker-position-changed-s.patch --- gnome-shell-3.28.3/debian/patches/keyboard-Filter-redundant-FocusTracker-position-changed-s.patch 1970-01-01 00:00:00.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/keyboard-Filter-redundant-FocusTracker-position-changed-s.patch 2019-01-25 18:29:40.000000000 +0000 @@ -0,0 +1,38 @@ +From: Carlos Garnacho +Date: Mon, 17 Sep 2018 21:04:48 +0200 +Subject: keyboard: Filter redundant FocusTracker::position-changed signals + +Just emit the signal if it did actually change. + +Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1812735 +Origin: https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/239 +--- + js/ui/keyboard.js | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js +index 4413846..4a923ad 100644 +--- a/js/ui/keyboard.js ++++ b/js/ui/keyboard.js +@@ -491,6 +491,7 @@ var FocusTracker = new Lang.Class({ + _init() { + this._currentWindow = null; + this._currentWindowPositionId = 0; ++ this._rect = null; + + global.screen.get_display().connect('notify::focus-window', () => { + this._setCurrentWindow(global.screen.get_display().focus_window); +@@ -539,6 +540,13 @@ var FocusTracker = new Lang.Class({ + rect.y -= frameRect.y; + } + ++ if (this._rect && ++ this._rect.x == rect.x && ++ this._rect.y == rect.y && ++ this._rect.width == rect.width && ++ this._rect.height == rect.height) ++ return; ++ + this._rect = rect; + this.emit('position-changed'); + }, diff -Nru gnome-shell-3.28.3/debian/patches/keyboard-Listen-to-IbusPanelService-focus-in-out-to-track.patch gnome-shell-3.28.3+git20190124/debian/patches/keyboard-Listen-to-IbusPanelService-focus-in-out-to-track.patch --- gnome-shell-3.28.3/debian/patches/keyboard-Listen-to-IbusPanelService-focus-in-out-to-track.patch 1970-01-01 00:00:00.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/keyboard-Listen-to-IbusPanelService-focus-in-out-to-track.patch 2019-01-25 18:29:40.000000000 +0000 @@ -0,0 +1,65 @@ +From: Carlos Garnacho +Date: Tue, 18 Sep 2018 12:54:29 +0200 +Subject: keyboard: Listen to IbusPanelService::focus-in/out to track focus + changes + +In X11 there's no input panel state requests, so restore the previous behavior +that focused entries would always toggle the OSK on there. + +Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1760399 +Origin: https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/239 +--- + js/misc/ibusManager.js | 5 +++++ + js/ui/keyboard.js | 16 ++++++++++++++++ + 2 files changed, 21 insertions(+) + +diff --git a/js/misc/ibusManager.js b/js/misc/ibusManager.js +index ad2e0fc..33ad877 100644 +--- a/js/misc/ibusManager.js ++++ b/js/misc/ibusManager.js +@@ -119,6 +119,11 @@ var IBusManager = new Lang.Class({ + let cursorLocation = { x, y, width: w, height: h }; + this.emit('set-cursor-location', cursorLocation); + }); ++ this._panelService.connect('focus-in', (panel, path) => { ++ if (!GLib.str_has_suffix(path, '/InputContext_1')) ++ this.emit ('focus-in'); ++ }); ++ this._panelService.connect('focus-out', () => { this.emit('focus-out'); }); + + try { + // IBus versions older than 1.5.10 have a bug which +diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js +index 4a923ad..7dba1a8 100644 +--- a/js/ui/keyboard.js ++++ b/js/ui/keyboard.js +@@ -512,6 +512,12 @@ var FocusTracker = new Lang.Class({ + + this._setCurrentRect(rect); + }); ++ this._ibusManager.connect('focus-in', () => { ++ this.emit('focus-changed', true); ++ }); ++ this._ibusManager.connect('focus-out', () => { ++ this.emit('focus-changed', false); ++ }); + }, + + get currentWindow() { +@@ -594,6 +600,16 @@ var Keyboard = new Lang.Class({ + this._animFocusedWindow = null; + this._oskFocusWindow = null; + }); ++ this._focusTracker.connect('focus-changed', (tracker, focused) => { ++ // Valid only for X11 ++ if (Meta.is_wayland_compositor()) ++ return; ++ ++ if (focused) ++ this.show(Main.layoutManager.focusIndex); ++ else ++ this.hide(); ++ }); + + Meta.get_backend().connect('last-device-changed', + (backend, deviceId) => { diff -Nru gnome-shell-3.28.3/debian/patches/optional-hot-corner.patch gnome-shell-3.28.3+git20190124/debian/patches/optional-hot-corner.patch --- gnome-shell-3.28.3/debian/patches/optional-hot-corner.patch 2018-12-05 13:08:10.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/optional-hot-corner.patch 2019-01-25 18:29:40.000000000 +0000 @@ -33,10 +33,10 @@ [ 'epiphany.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ] List of desktop file IDs for favorite applications diff --git a/js/ui/layout.js b/js/ui/layout.js -index 6f81039..3d53bd4 100644 +index e615e56..fa21ef8 100644 --- a/js/ui/layout.js +++ b/js/ui/layout.js -@@ -268,6 +268,9 @@ var LayoutManager = new Lang.Class({ +@@ -269,6 +269,9 @@ var LayoutManager = new Lang.Class({ this._backgroundGroup.lower_bottom(); this._bgManagers = []; @@ -46,7 +46,7 @@ // Need to update struts on new workspaces when they are added global.screen.connect('notify::n-workspaces', this._queueUpdateRegions.bind(this)); -@@ -364,6 +367,11 @@ var LayoutManager = new Lang.Class({ +@@ -365,6 +368,11 @@ var LayoutManager = new Lang.Class({ }); this.hotCorners = []; diff -Nru gnome-shell-3.28.3/debian/patches/popupMenu-Don-t-handle-key-presses-directly-if-there-are-.patch gnome-shell-3.28.3+git20190124/debian/patches/popupMenu-Don-t-handle-key-presses-directly-if-there-are-.patch --- gnome-shell-3.28.3/debian/patches/popupMenu-Don-t-handle-key-presses-directly-if-there-are-.patch 2018-12-05 13:08:10.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/popupMenu-Don-t-handle-key-presses-directly-if-there-are-.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -From: Andrea Azzarone -Date: Thu, 21 Jun 2018 16:40:43 +0000 -Subject: popupMenu: Don't handle key presses directly if there are modifiers - -Key events involved in a keyboard shortcut are not completely consumed by -Mutter. That means that if the popupMenu is bound to a shortcut (e.g. -Alt) and the user keeps the keys pressed, the same key-event will be -delivered to the popupMenu. We can workaround this issue filtering out all the -events where a a modifier is down (except capslock). - -Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/372 - -(cherry picked from commit 2e90c5fa4b35ebe26c694223966834ee949cfce3) - -Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1784671 -Bug-GNOME: https://gitlab.gnome.org/GNOME/gnome-shell/issues/372 -Applied-Upstream: 3.28.4, commit:https://gitlab.gnome.org/GNOME/gnome-shell/commit/445eed40 ---- - js/ui/popupMenu.js | 11 ++++++++++- - 1 file changed, 10 insertions(+), 1 deletion(-) - -diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js -index 83194d7..f449d6e 100644 ---- a/js/ui/popupMenu.js -+++ b/js/ui/popupMenu.js -@@ -141,8 +141,17 @@ var PopupBaseMenuItem = new Lang.Class({ - }, - - _onKeyPressEvent(actor, event) { -- let symbol = event.get_key_symbol(); -+ let state = event.get_state(); - -+ // if user has a modifier down (except capslock) -+ // then don't handle the key press here -+ state &= ~Clutter.ModifierType.LOCK_MASK; -+ state &= Clutter.ModifierType.MODIFIER_MASK; -+ -+ if (state) -+ return Clutter.EVENT_PROPAGATE; -+ -+ let symbol = event.get_key_symbol(); - if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) { - this.activate(event); - return Clutter.EVENT_STOP; diff -Nru gnome-shell-3.28.3/debian/patches/power-Label-the-PENDING_CHARGE-state-as-Not-Charging.patch gnome-shell-3.28.3+git20190124/debian/patches/power-Label-the-PENDING_CHARGE-state-as-Not-Charging.patch --- gnome-shell-3.28.3/debian/patches/power-Label-the-PENDING_CHARGE-state-as-Not-Charging.patch 1970-01-01 00:00:00.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/power-Label-the-PENDING_CHARGE-state-as-Not-Charging.patch 2019-01-25 18:29:40.000000000 +0000 @@ -0,0 +1,212 @@ +From: =?utf-8?q?Jo=C3=A3o_Paulo_Rechi_Vita?= +Date: Fri, 2 Nov 2018 21:51:33 +0100 +Subject: 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. + +Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1745032 +Bug-GNOME: https://gitlab.gnome.org/GNOME/gnome-shell/issues/701 +Origin: https://gitlab.gnome.org/GNOME/gnome-shell/commit/52c59ac0dd7ddbe064 +--- + js/ui/status/power.js | 4 +++- + po/ca.po | 4 ++++ + po/de.po | 4 ++++ + po/el.po | 4 ++++ + po/eo.po | 4 ++++ + po/es.po | 4 ++++ + po/fur.po | 4 ++++ + po/it.po | 4 ++++ + po/ja.po | 4 ++++ + po/sl.po | 4 ++++ + po/sv.po | 4 ++++ + po/tr.po | 4 ++++ + 12 files changed, 47 insertions(+), 1 deletion(-) + +diff --git a/js/ui/status/power.js b/js/ui/status/power.js +index a2bfd75..bfd0de5 100644 +--- a/js/ui/status/power.js ++++ b/js/ui/status/power.js +@@ -79,7 +79,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…"); + +diff --git a/po/ca.po b/po/ca.po +index 5858f87..0bd69fd 100644 +--- a/po/ca.po ++++ b/po/ca.po +@@ -1922,6 +1922,10 @@ msgstr "Paràmetres d'energia" + msgid "Fully Charged" + msgstr "Totalment carregada" + ++#: js/ui/status/power.js:74 ++msgid "Not Charging" ++msgstr "" ++ + #. 0 is reported when UPower does not have enough data + #. to estimate battery life + #: js/ui/status/power.js:84 js/ui/status/power.js:90 +diff --git a/po/de.po b/po/de.po +index bb83a6e..5565f9e 100644 +--- a/po/de.po ++++ b/po/de.po +@@ -1935,6 +1935,10 @@ msgstr "Energieeinstellungen" + msgid "Fully Charged" + msgstr "Vollständig geladen" + ++#: js/ui/status/power.js:74 ++msgid "Not Charging" ++msgstr "Lädt nicht" ++ + #. 0 is reported when UPower does not have enough data + #. to estimate battery life + #: js/ui/status/power.js:84 js/ui/status/power.js:90 +diff --git a/po/el.po b/po/el.po +index c822608..2061c24 100644 +--- a/po/el.po ++++ b/po/el.po +@@ -1795,6 +1795,10 @@ msgstr "Ρυθμίσεις τροφοδοσίας" + msgid "Fully Charged" + msgstr "Πλήρως φορτισμένη" + ++#: js/ui/status/power.js:74 ++msgid "Not Charging" ++msgstr "Δεν φορτίζεται" ++ + #. 0 is reported when UPower does not have enough data + #. to estimate battery life + #: js/ui/status/power.js:84 js/ui/status/power.js:90 +diff --git a/po/eo.po b/po/eo.po +index 4ee0b5e..1d7278b 100644 +--- a/po/eo.po ++++ b/po/eo.po +@@ -1527,6 +1527,10 @@ msgstr "Energiagordoj" + msgid "Fully Charged" + msgstr "Plene ŝargita" + ++#: js/ui/status/power.js:74 ++msgid "Not Charging" ++msgstr "Ne ŝargante" ++ + #. 0 is reported when UPower does not have enough data + #. to estimate battery life + #: ../js/ui/status/power.js:84 ../js/ui/status/power.js:90 +diff --git a/po/es.po b/po/es.po +index e2c935c..28dd56c 100644 +--- a/po/es.po ++++ b/po/es.po +@@ -1914,6 +1914,10 @@ msgstr "Configuración de energía" + msgid "Fully Charged" + msgstr "Cargada completamente" + ++#: js/ui/status/power.js:74 ++msgid "Not Charging" ++msgstr "No está cargando" ++ + #. 0 is reported when UPower does not have enough data + #. to estimate battery life + #: js/ui/status/power.js:84 js/ui/status/power.js:90 +diff --git a/po/fur.po b/po/fur.po +index f416ed0..6e485a8 100644 +--- a/po/fur.po ++++ b/po/fur.po +@@ -1910,6 +1910,10 @@ msgstr "Impostazions di alimentazion" + msgid "Fully Charged" + msgstr "Cjarie" + ++#: js/ui/status/power.js:74 ++msgid "Not Charging" ++msgstr "Nol sta cjariant" ++ + #. 0 is reported when UPower does not have enough data + #. to estimate battery life + #: js/ui/status/power.js:84 js/ui/status/power.js:90 +diff --git a/po/it.po b/po/it.po +index ab18794..bcc2438 100644 +--- a/po/it.po ++++ b/po/it.po +@@ -1931,6 +1931,10 @@ msgstr "Impostazioni alimentazione" + msgid "Fully Charged" + msgstr "Carica" + ++#: js/ui/status/power.js:74 ++msgid "Not Charging" ++msgstr "Non in carica" ++ + #. 0 is reported when UPower does not have enough data + #. to estimate battery life + #: js/ui/status/power.js:84 js/ui/status/power.js:90 +diff --git a/po/ja.po b/po/ja.po +index 0264e97..e6ef9a6 100644 +--- a/po/ja.po ++++ b/po/ja.po +@@ -1800,6 +1800,10 @@ msgstr "電源設定" + msgid "Fully Charged" + msgstr "充電完了" + ++#: js/ui/status/power.js:74 ++msgid "Not Charging" ++msgstr "放電中" ++ + #. 0 is reported when UPower does not have enough data + #. to estimate battery life + #: js/ui/status/power.js:84 js/ui/status/power.js:90 +diff --git a/po/sl.po b/po/sl.po +index b7e9798..75b7b62 100644 +--- a/po/sl.po ++++ b/po/sl.po +@@ -1937,6 +1937,10 @@ msgstr "Upravljanje napajanja" + msgid "Fully Charged" + msgstr "Polno napolnjeno" + ++#: js/ui/status/power.js:74 ++msgid "Not Charging" ++msgstr "Naprava se ne polni" ++ + #. 0 is reported when UPower does not have enough data + #. to estimate battery life + #: js/ui/status/power.js:84 js/ui/status/power.js:90 +diff --git a/po/sv.po b/po/sv.po +index 5345657..edd66ff 100644 +--- a/po/sv.po ++++ b/po/sv.po +@@ -1899,6 +1899,10 @@ msgstr "Ströminställningar" + msgid "Fully Charged" + msgstr "Fulladdad" + ++#: js/ui/status/power.js:74 ++msgid "Not Charging" ++msgstr "Laddar inte" ++ + #. 0 is reported when UPower does not have enough data + #. to estimate battery life + #: js/ui/status/power.js:84 js/ui/status/power.js:90 +diff --git a/po/tr.po b/po/tr.po +index 0304eb8..409362e 100644 +--- a/po/tr.po ++++ b/po/tr.po +@@ -1889,6 +1889,10 @@ msgstr "Güç Ayarları" + msgid "Fully Charged" + msgstr "Tümüyle Dolu" + ++#: js/ui/status/power.js:74 ++msgid "Not Charging" ++msgstr "Şarj Olmuyor" ++ + #. 0 is reported when UPower does not have enough data + #. to estimate battery life + #: js/ui/status/power.js:84 js/ui/status/power.js:90 diff -Nru gnome-shell-3.28.3/debian/patches/series gnome-shell-3.28.3+git20190124/debian/patches/series --- gnome-shell-3.28.3/debian/patches/series 2018-12-05 13:08:10.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/series 2019-01-25 18:29:40.000000000 +0000 @@ -12,17 +12,12 @@ ubuntu_block_mode_extension_update.patch volume-Add-back-sound-feedback-on-scroll.patch workaround_crasher_fractional_scaling.patch -shell-ignore-invalid-window-monitor-index.patch StIcon-only-compute-shadow-pipeline-when-the-texture-is-p.patch js-fix-invalid-access-errors.patch -workspace-fix-repositioned-windows-in-activities.patch st-texture-cache-Cancel-sliced-image-loading-on-target-ac.patch js-ui-Choose-some-actors-to-cache-on-the-GPU.patch -authPrompt-Unset-preemptiveAnswer-on-reset.patch -authPrompt-Do-not-enable-sensitivity-if-retries-are-disal.patch -gdm-util-Always-allow-to-retry-login-in-unlock-mode.patch -popupMenu-Don-t-handle-key-presses-directly-if-there-are-.patch -st-button-Ignore-pointer-emulated-touch-events.patch st-scroll-view-Handle-the-case-where-scrollbars-are-NULL.patch st-scroll-view-Remove-scrollbars-references-on-dispose.patch -ibus-set-content-type-no-holdKeyboard.patch +keyboard-Filter-redundant-FocusTracker-position-changed-s.patch +keyboard-Listen-to-IbusPanelService-focus-in-out-to-track.patch +power-Label-the-PENDING_CHARGE-state-as-Not-Charging.patch diff -Nru gnome-shell-3.28.3/debian/patches/shell-ignore-invalid-window-monitor-index.patch gnome-shell-3.28.3+git20190124/debian/patches/shell-ignore-invalid-window-monitor-index.patch --- gnome-shell-3.28.3/debian/patches/shell-ignore-invalid-window-monitor-index.patch 2018-12-05 13:08:10.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/shell-ignore-invalid-window-monitor-index.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,98 +0,0 @@ -From: Sam Spilsbury -Date: Wed, 11 Oct 2017 05:42:04 -0500 -Subject: shell: ignore invalid window monitor index - -windowMenu: Check if monitorIndex is valid before using it - -Calling meta_window_get_monitor on an unmanaged window may return --1, so we need to check the return value. - -Fixes https://bugzilla.gnome.org/show_bug.cgi?id=788882 - -keyboard: Handle case where keyboardMonitor is unset - -This may be the case where keyboardIndex is -1, which may be the -case where either the keyboard monitor hasn't been set yet, or -the keyboard is being unmanaged and meta_window_get_monitor -returns -1 - -https://bugzilla.gnome.org/show_bug.cgi?id=788882 - -layout: Remove focusMonitor, as it is unused - -It also uses focusIndex to determine which monitor to -return and may occassionally return undefined if focusIndex -was -1. - -https://bugzilla.gnome.org/show_bug.cgi?id=788882 - -Bug-GNOME: https://bugzilla.gnome.org/show_bug.cgi?id=788882 -Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1724439 -Forwarded: yes ---- - js/ui/keyboard.js | 8 ++++++++ - js/ui/layout.js | 4 ---- - js/ui/windowMenu.js | 7 ++++--- - 3 files changed, 12 insertions(+), 7 deletions(-) - -diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js -index 5fcdf98..dd47676 100644 ---- a/js/ui/keyboard.js -+++ b/js/ui/keyboard.js -@@ -919,6 +919,12 @@ var Keyboard = new Lang.Class({ - if (this.actor == null) - return; - let monitor = Main.layoutManager.keyboardMonitor; -+ -+ // monitor may be null here if the underlying keyboard monitor -+ // index was still unset. -+ if (!monitor) -+ return; -+ - let maxHeight = monitor.height / 3; - this.actor.width = monitor.width; - this.actor.height = maxHeight; -@@ -981,6 +987,8 @@ var Keyboard = new Lang.Class({ - if (!this._enabled) - return; - -+ -+ - this._clearShowIdle(); - this._keyboardRequested = true; - -diff --git a/js/ui/layout.js b/js/ui/layout.js -index 3d53bd4..cf0dad0 100644 ---- a/js/ui/layout.js -+++ b/js/ui/layout.js -@@ -564,10 +564,6 @@ var LayoutManager = new Lang.Class({ - return i; - }, - -- get focusMonitor() { -- return this.monitors[this.focusIndex]; -- }, -- - set keyboardIndex(v) { - this._keyboardIndex = v; - this._updateKeyboardBox(); -diff --git a/js/ui/windowMenu.js b/js/ui/windowMenu.js -index f0e564b..9bd7d19 100644 ---- a/js/ui/windowMenu.js -+++ b/js/ui/windowMenu.js -@@ -128,11 +128,12 @@ var WindowMenu = new Lang.Class({ - - let screen = global.screen; - let nMonitors = screen.get_n_monitors(); -- if (nMonitors > 1) { -+ let monitorIndex = window.get_monitor(); -+ // meta_window_get_monitor can return -1, so handle that case -+ // appropriately. -+ if (nMonitors > 1 && monitorIndex >= 0) { - this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - -- let monitorIndex = window.get_monitor(); -- - let dir = Meta.ScreenDirection.UP; - let upMonitorIndex = - screen.get_monitor_neighbor_index(monitorIndex, dir); diff -Nru gnome-shell-3.28.3/debian/patches/st-button-Ignore-pointer-emulated-touch-events.patch gnome-shell-3.28.3+git20190124/debian/patches/st-button-Ignore-pointer-emulated-touch-events.patch --- gnome-shell-3.28.3/debian/patches/st-button-Ignore-pointer-emulated-touch-events.patch 2018-12-05 13:08:10.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/st-button-Ignore-pointer-emulated-touch-events.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= -Date: Thu, 25 Oct 2018 06:35:25 +0200 -Subject: 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. - -Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnome-shell/+bug/1745888 -Forwarded: yes, https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/272 ---- - 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 8f5c492..a3a7b24 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; - } diff -Nru gnome-shell-3.28.3/debian/patches/StIcon-only-compute-shadow-pipeline-when-the-texture-is-p.patch gnome-shell-3.28.3+git20190124/debian/patches/StIcon-only-compute-shadow-pipeline-when-the-texture-is-p.patch --- gnome-shell-3.28.3/debian/patches/StIcon-only-compute-shadow-pipeline-when-the-texture-is-p.patch 2018-12-05 13:08:10.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/StIcon-only-compute-shadow-pipeline-when-the-texture-is-p.patch 2019-01-25 18:29:40.000000000 +0000 @@ -1,5 +1,5 @@ From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= -Date: Wed, 18 Oct 2017 05:32:22 -0500 +Date: Wed, 18 Oct 2017 12:32:22 +0200 Subject: StIcon: only compute shadow pipeline when the texture is properly allocated diff -Nru gnome-shell-3.28.3/debian/patches/st-texture-cache-Cancel-sliced-image-loading-on-target-ac.patch gnome-shell-3.28.3+git20190124/debian/patches/st-texture-cache-Cancel-sliced-image-loading-on-target-ac.patch --- gnome-shell-3.28.3/debian/patches/st-texture-cache-Cancel-sliced-image-loading-on-target-ac.patch 2018-12-05 13:08:10.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/st-texture-cache-Cancel-sliced-image-loading-on-target-ac.patch 2019-01-25 18:29:40.000000000 +0000 @@ -1,5 +1,5 @@ From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= -Date: Wed, 29 Nov 2017 19:48:02 -0600 +Date: Thu, 30 Nov 2017 02:48:02 +0100 Subject: st-texture-cache: Cancel sliced image loading on target actor destroy @@ -19,7 +19,7 @@ 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/st/st-texture-cache.c b/src/st/st-texture-cache.c -index 0c794a3..c39464e 100644 +index 6219071..fc81189 100644 --- a/src/st/st-texture-cache.c +++ b/src/st/st-texture-cache.c @@ -1027,6 +1027,7 @@ typedef struct { diff -Nru gnome-shell-3.28.3/debian/patches/volume-Add-back-sound-feedback-on-scroll.patch gnome-shell-3.28.3+git20190124/debian/patches/volume-Add-back-sound-feedback-on-scroll.patch --- gnome-shell-3.28.3/debian/patches/volume-Add-back-sound-feedback-on-scroll.patch 2018-12-05 13:08:10.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/volume-Add-back-sound-feedback-on-scroll.patch 2019-01-25 18:29:40.000000000 +0000 @@ -1,5 +1,5 @@ From: =?utf-8?q?Florian_M=C3=BCllner?= -Date: Fri, 23 Feb 2018 16:58:22 -0600 +Date: Fri, 23 Feb 2018 23:58:22 +0100 Subject: volume: Add back sound feedback on scroll Commit 8d4855f1008 accidentally removed the volume change feedback @@ -34,8 +34,8 @@ Forwarded: yes, https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/51 --- js/ui/slider.js | 2 -- - js/ui/status/volume.js | 19 ++++++++++++++++++- - 2 files changed, 18 insertions(+), 3 deletions(-) + js/ui/status/volume.js | 20 +++++++++++++++++++- + 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/js/ui/slider.js b/js/ui/slider.js index 9853929..30295b4 100644 @@ -52,18 +52,20 @@ } return Clutter.EVENT_PROPAGATE; diff --git a/js/ui/status/volume.js b/js/ui/status/volume.js -index 65c4c42..c0f9cf3 100644 +index 65c4c42..de5f188 100644 --- a/js/ui/status/volume.js +++ b/js/ui/status/volume.js -@@ -4,6 +4,7 @@ const Clutter = imports.gi.Clutter; +@@ -3,7 +3,9 @@ + const Clutter = imports.gi.Clutter; const Lang = imports.lang; const Gio = imports.gi.Gio; ++const GLib = imports.gi.GLib; const Gvc = imports.gi.Gvc; +const Mainloop = imports.mainloop; const St = imports.gi.St; const Signals = imports.signals; -@@ -36,9 +37,16 @@ var StreamSlider = new Lang.Class({ +@@ -36,9 +38,16 @@ var StreamSlider = new Lang.Class({ this.item = new PopupMenu.PopupBaseMenuItem({ activate: false }); @@ -81,7 +83,7 @@ this._icon = new St.Icon({ style_class: 'popup-menu-icon' }); this.item.actor.add(this._icon); -@@ -135,6 +143,7 @@ var StreamSlider = new Lang.Class({ +@@ -135,6 +144,7 @@ var StreamSlider = new Lang.Class({ let volume = value * this._get_control_max_volume(); let prevMuted = this._stream.is_muted; @@ -89,7 +91,7 @@ if (volume < 1) { this._stream.volume = 0; if (!prevMuted) -@@ -145,6 +154,14 @@ var StreamSlider = new Lang.Class({ +@@ -145,6 +155,14 @@ var StreamSlider = new Lang.Class({ this._stream.change_is_muted(false); } this._stream.push_volume(); diff -Nru gnome-shell-3.28.3/debian/patches/workaround_crasher_fractional_scaling.patch gnome-shell-3.28.3+git20190124/debian/patches/workaround_crasher_fractional_scaling.patch --- gnome-shell-3.28.3/debian/patches/workaround_crasher_fractional_scaling.patch 2018-12-05 13:08:10.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/workaround_crasher_fractional_scaling.patch 2019-01-25 18:29:40.000000000 +0000 @@ -12,10 +12,10 @@ 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/st/st-theme-node-drawing.c b/src/st/st-theme-node-drawing.c -index 8942966..e57ca65 100644 +index 0637d97..7342c6c 100644 --- a/src/st/st-theme-node-drawing.c +++ b/src/st/st-theme-node-drawing.c -@@ -2505,7 +2505,7 @@ st_theme_node_paint (StThemeNode *node, +@@ -2531,7 +2531,7 @@ st_theme_node_paint (StThemeNode *node, allocation.x2 = width; allocation.y2 = height; diff -Nru gnome-shell-3.28.3/debian/patches/workspace-fix-repositioned-windows-in-activities.patch gnome-shell-3.28.3+git20190124/debian/patches/workspace-fix-repositioned-windows-in-activities.patch --- gnome-shell-3.28.3/debian/patches/workspace-fix-repositioned-windows-in-activities.patch 2018-12-05 13:08:10.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/debian/patches/workspace-fix-repositioned-windows-in-activities.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,129 +0,0 @@ -From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= -Date: Fri, 19 Jan 2018 08:00:10 -0600 -Subject: workspace: fix repositioned windows in activities - -workspace: Recompute bounding box on window 'position-changed' - -We need to update the clone position if window size changed -also, rename meta window 'size-changed' callback accordingly. - -https://bugzilla.gnome.org/show_bug.cgi?id=792681 - -workspaceThumbnail: Sync clone position changes with actor - -We need to update the clone position if window actor (not the meta window) -position changed. - -https://bugzilla.gnome.org/show_bug.cgi?id=792681 - -Bug-GNOME: https://bugzilla.gnome.org/show_bug.cgi?id=776588 -Bug-Ubuntu: https://bugs.launchpad.net/gnome-shell/+bug/1653153 -Forwarded: yes, https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/8 ---- - js/ui/workspace.js | 25 +++++++++++++------------ - js/ui/workspaceThumbnail.js | 7 +++---- - 2 files changed, 16 insertions(+), 16 deletions(-) - -diff --git a/js/ui/workspace.js b/js/ui/workspace.js -index 8b56932..112c54e 100644 ---- a/js/ui/workspace.js -+++ b/js/ui/workspace.js -@@ -137,8 +137,10 @@ var WindowClone = new Lang.Class({ - this._dragSlot = [0, 0, 0, 0]; - this._stackAbove = null; - -- this._windowClone._updateId = this.metaWindow.connect('size-changed', -- this._onRealWindowSizeChanged.bind(this)); -+ this._windowClone._sizeChangedId = this.metaWindow.connect('size-changed', -+ this._onMetaWindowSizeChanged.bind(this)); -+ this._windowClone._posChangedId = this.metaWindow.connect('position-changed', -+ this._computeBoundingBox.bind(this)); - this._windowClone._destroyId = - this.realWindow.connect('destroy', () => { - // First destroy the clone and then destroy everything -@@ -206,8 +208,7 @@ var WindowClone = new Lang.Class({ - - addAttachedDialog(win) { - this._doAddAttachedDialog(win, win.get_compositor_private()); -- this._computeBoundingBox(); -- this.emit('size-changed'); -+ this._onMetaWindowSizeChanged(); - }, - - hasAttachedDialogs() { -@@ -216,15 +217,14 @@ var WindowClone = new Lang.Class({ - - _doAddAttachedDialog(metaWin, realWin) { - let clone = new Clutter.Clone({ source: realWin }); -- clone._updateId = metaWin.connect('size-changed', () => { -- this._computeBoundingBox(); -- this.emit('size-changed'); -- }); -+ clone._sizeChangedId = metaWin.connect('size-changed', -+ this._onMetaWindowSizeChanged.bind(this)); -+ clone._posChangedId = metaWin.connect('position-changed', -+ this._onMetaWindowSizeChanged.bind(this)); - clone._destroyId = realWin.connect('destroy', () => { - clone.destroy(); - -- this._computeBoundingBox(); -- this.emit('size-changed'); -+ this._onMetaWindowSizeChanged(); - }); - this.actor.add_child(clone); - }, -@@ -321,12 +321,13 @@ var WindowClone = new Lang.Class({ - else - realWindow = child.source; - -- realWindow.meta_window.disconnect(child._updateId); -+ realWindow.meta_window.disconnect(child._sizeChangedId); -+ realWindow.meta_window.disconnect(child._posChangedId); - realWindow.disconnect(child._destroyId); - }); - }, - -- _onRealWindowSizeChanged() { -+ _onMetaWindowSizeChanged() { - this._computeBoundingBox(); - this.emit('size-changed'); - }, -diff --git a/js/ui/workspaceThumbnail.js b/js/ui/workspaceThumbnail.js -index 381169e..417296d 100644 ---- a/js/ui/workspaceThumbnail.js -+++ b/js/ui/workspaceThumbnail.js -@@ -68,7 +68,7 @@ var WindowClone = new Lang.Class({ - this.realWindow = realWindow; - this.metaWindow = realWindow.meta_window; - -- this.clone._updateId = this.metaWindow.connect('position-changed', -+ this.clone._updateId = this.realWindow.connect('notify::position', - this._onPositionChanged.bind(this)); - this.clone._destroyId = this.realWindow.connect('destroy', () => { - // First destroy the clone and then destroy everything -@@ -153,7 +153,7 @@ var WindowClone = new Lang.Class({ - let clone = new Clutter.Clone({ source: realDialog }); - this._updateDialogPosition(realDialog, clone); - -- clone._updateId = metaDialog.connect('position-changed', dialog => { -+ clone._updateId = realDialog.connect('notify::position', dialog => { - this._updateDialogPosition(dialog, clone); - }); - clone._destroyId = realDialog.connect('destroy', () => { -@@ -171,7 +171,6 @@ var WindowClone = new Lang.Class({ - }, - - _onPositionChanged() { -- let rect = this.metaWindow.get_frame_rect(); - this.actor.set_position(this.realWindow.x, this.realWindow.y); - }, - -@@ -179,7 +178,7 @@ var WindowClone = new Lang.Class({ - this.actor.get_children().forEach(child => { - let realWindow = child.source; - -- realWindow.meta_window.disconnect(child._updateId); -+ realWindow.disconnect(child._updateId); - realWindow.disconnect(child._destroyId); - }); - }, diff -Nru gnome-shell-3.28.3/js/gdm/authPrompt.js gnome-shell-3.28.3+git20190124/js/gdm/authPrompt.js --- gnome-shell-3.28.3/js/gdm/authPrompt.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/gdm/authPrompt.js 2019-01-22 00:25:23.000000000 +0000 @@ -242,11 +242,11 @@ this.emit('prompted'); }, - _onVerificationFailed() { + _onVerificationFailed(userVerifier, canRetry) { this._queryingService = null; this.clear(); - this.updateSensitivity(true); + this.updateSensitivity(canRetry); this.setActorInDefaultButtonWell(null); this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED; }, @@ -439,6 +439,7 @@ this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; this.cancelButton.reactive = true; this.nextButton.label = _("Next"); + this._preemptiveAnswer = null; if (this._userVerifier) this._userVerifier.cancel(); diff -Nru gnome-shell-3.28.3/js/gdm/util.js gnome-shell-3.28.3+git20190124/js/gdm/util.js --- gnome-shell-3.28.3/js/gdm/util.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/gdm/util.js 2019-01-22 00:25:23.000000000 +0000 @@ -534,12 +534,13 @@ _verificationFailed(retry) { // For Not Listed / enterprise logins, immediately reset // the dialog - // Otherwise, we allow ALLOWED_FAILURES attempts. After that, we - // go back to the welcome screen. + // Otherwise, when in login mode we allow ALLOWED_FAILURES attempts. + // After that, we go back to the welcome screen. this._failCounter++; let canRetry = retry && this._userName && - this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY); + (this._reauthOnly || + this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY)); if (canRetry) { if (!this.hasPendingMessages) { @@ -562,7 +563,7 @@ } } - this.emit('verification-failed'); + this.emit('verification-failed', canRetry); }, _onConversationStopped(client, serviceName) { diff -Nru gnome-shell-3.28.3/js/misc/ibusManager.js gnome-shell-3.28.3+git20190124/js/misc/ibusManager.js --- gnome-shell-3.28.3/js/misc/ibusManager.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/misc/ibusManager.js 2019-01-24 20:35:02.000000000 +0000 @@ -205,7 +205,7 @@ } this._ibus.set_global_engine_async(id, this._MAX_INPUT_SOURCE_ACTIVATION_TIME, - null, callback); + null, callback || null); }, preloadEngines(ids) { diff -Nru gnome-shell-3.28.3/js/misc/objectManager.js gnome-shell-3.28.3+git20190124/js/misc/objectManager.js --- gnome-shell-3.28.3/js/misc/objectManager.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/misc/objectManager.js 2019-01-22 00:25:23.000000000 +0000 @@ -236,11 +236,12 @@ _onNameVanished() { let objectPaths = Object.keys(this._objects); for (let i = 0; i < objectPaths.length; i++) { - let object = this._objects[objectPaths]; + let objectPath = objectPaths[i]; + let object = this._objects[objectPath]; let interfaceNames = Object.keys(object); - for (let j = 0; i < interfaceNames.length; i++) { - let interfaceName = interfaceNames[i]; + for (let j = 0; j < interfaceNames.length; j++) { + let interfaceName = interfaceNames[j]; if (object[interfaceName]) this._removeInterface(objectPath, interfaceName); diff -Nru gnome-shell-3.28.3/js/ui/calendar.js gnome-shell-3.28.3+git20190124/js/ui/calendar.js --- gnome-shell-3.28.3/js/ui/calendar.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/calendar.js 2019-01-22 00:25:23.000000000 +0000 @@ -802,6 +802,8 @@ }, _onDestroy() { + this.parent(); + if (this._updatedId) this.notification.disconnect(this._updatedId); this._updatedId = 0; diff -Nru gnome-shell-3.28.3/js/ui/components/automountManager.js gnome-shell-3.28.3+git20190124/js/ui/components/automountManager.js --- gnome-shell-3.28.3/js/ui/components/automountManager.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/components/automountManager.js 2019-01-22 00:25:23.000000000 +0000 @@ -210,6 +210,10 @@ }, _onVolumeRemoved(monitor, volume) { + if (volume._allowAutorunExpireId && volume._allowAutorunExpireId > 0) { + Mainloop.source_remove(volume._allowAutorunExpireId); + delete volume._allowAutorunExpireId; + } this._volumeQueue = this._volumeQueue.filter(element => (element != volume)); }, @@ -234,8 +238,10 @@ _allowAutorunExpire(volume) { let id = Mainloop.timeout_add_seconds(AUTORUN_EXPIRE_TIMEOUT_SECS, () => { volume.allowAutorun = false; + delete volume._allowAutorunExpireId; return GLib.SOURCE_REMOVE; }); + volume._allowAutorunExpireId = id; GLib.Source.set_name_by_id(id, '[gnome-shell] volume.allowAutorun'); } }); diff -Nru gnome-shell-3.28.3/js/ui/dash.js gnome-shell-3.28.3+git20190124/js/ui/dash.js --- gnome-shell-3.28.3/js/ui/dash.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/dash.js 2019-01-22 00:25:23.000000000 +0000 @@ -52,6 +52,8 @@ this.animatingOut = false; this.connect('destroy', () => { + if (this.child != null) + this.child.destroy(); this.label.destroy(); }); }, diff -Nru gnome-shell-3.28.3/js/ui/dnd.js gnome-shell-3.28.3+git20190124/js/ui/dnd.js --- gnome-shell-3.28.3/js/ui/dnd.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/dnd.js 2019-01-22 00:25:23.000000000 +0000 @@ -396,10 +396,15 @@ return true; }, + _pickTargetActor() { + return this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL, + this._dragX, this._dragY); + }, + _updateDragHover() { this._updateHoverId = 0; - let target = this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL, - this._dragX, this._dragY); + let target = this._pickTargetActor(); + let dragEvent = { x: this._dragX, y: this._dragY, @@ -407,6 +412,18 @@ source: this.actor._delegate, targetActor: target }; + + let targetActorDestroyHandlerId; + let handleTargetActorDestroyClosure; + handleTargetActorDestroyClosure = () => { + target = this._pickTargetActor(); + dragEvent.targetActor = target; + targetActorDestroyHandlerId = + target.connect('destroy', handleTargetActorDestroyClosure); + }; + targetActorDestroyHandlerId = + target.connect('destroy', handleTargetActorDestroyClosure); + for (let i = 0; i < dragMonitors.length; i++) { let motionFunc = dragMonitors[i].dragMotion; if (motionFunc) { @@ -417,6 +434,7 @@ } } } + dragEvent.targetActor.disconnect(targetActorDestroyHandlerId); while (target) { if (target._delegate && target._delegate.handleDragOver) { diff -Nru gnome-shell-3.28.3/js/ui/endSessionDialog.js gnome-shell-3.28.3+git20190124/js/ui/endSessionDialog.js --- gnome-shell-3.28.3/js/ui/endSessionDialog.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/endSessionDialog.js 2019-01-22 00:25:23.000000000 +0000 @@ -760,7 +760,7 @@ let updatePrepared = this._pkOfflineProxy.UpdatePrepared; let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed; - _setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText); + _setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText || ''); this._checkBox.actor.visible = (dialogContent.checkBoxText && updatePrepared && updatesAllowed); this._checkBox.actor.checked = (updatePrepared && updateTriggered); diff -Nru gnome-shell-3.28.3/js/ui/extensionSystem.js gnome-shell-3.28.3+git20190124/js/ui/extensionSystem.js --- gnome-shell-3.28.3/js/ui/extensionSystem.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/extensionSystem.js 2019-01-22 00:25:23.000000000 +0000 @@ -76,6 +76,7 @@ if (extension.stylesheet) { let theme = St.ThemeContext.get_for_stage(global.stage).get_theme(); theme.unload_stylesheet(extension.stylesheet); + delete extension.stylesheet; } try { @@ -115,13 +116,18 @@ extensionOrder.push(uuid); let stylesheetNames = [global.session_mode + '.css', 'stylesheet.css']; + let theme = St.ThemeContext.get_for_stage(global.stage).get_theme(); for (let i = 0; i < stylesheetNames.length; i++) { - let stylesheetFile = extension.dir.get_child(stylesheetNames[i]); - if (stylesheetFile.query_exists(null)) { - let theme = St.ThemeContext.get_for_stage(global.stage).get_theme(); + try { + let stylesheetFile = extension.dir.get_child(stylesheetNames[i]); theme.load_stylesheet(stylesheetFile); extension.stylesheet = stylesheetFile; break; + } catch (e) { + if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) + continue; // not an error + log(`Failed to load stylesheet for extension ${uuid}: ${e.message}`); + return; } } @@ -131,6 +137,10 @@ _signals.emit('extension-state-changed', extension); return; } catch(e) { + if (extension.stylesheet) { + theme.unload_stylesheet(extension.stylesheet); + delete extension.stylesheet; + } logExtensionError(uuid, e); return; } diff -Nru gnome-shell-3.28.3/js/ui/iconGrid.js gnome-shell-3.28.3+git20190124/js/ui/iconGrid.js --- gnome-shell-3.28.3/js/ui/iconGrid.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/iconGrid.js 2019-01-22 00:25:23.000000000 +0000 @@ -418,6 +418,11 @@ }, _animationDone() { + this._clonesAnimating.forEach(clone => { + clone.source.reactive = true; + clone.source.opacity = 255; + clone.destroy(); + }); this._clonesAnimating = []; this.emit('animation-done'); }, @@ -538,10 +543,6 @@ onComplete: () => { if (isLastItem) this._animationDone(); - - actor.opacity = 255; - actor.reactive = true; - actorClone.destroy(); }}; fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM, transition: 'easeInOutQuad', @@ -562,12 +563,8 @@ scale_x: scaleX, scale_y: scaleY, onComplete: () => { - if (isLastItem) { + if (isLastItem) this._animationDone(); - this._restoreItemsOpacity(); - } - actor.reactive = true; - actorClone.destroy(); }}; fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM, transition: 'easeInOutQuad', @@ -581,12 +578,6 @@ } }, - _restoreItemsOpacity() { - for (let index = 0; index < this._items.length; index++) { - this._items[index].actor.opacity = 255; - } - }, - _getAllocatedChildSizeAndSpacing(child) { let [,, natWidth, natHeight] = child.get_preferred_size(); let width = Math.min(this._getHItemSize(), natWidth); diff -Nru gnome-shell-3.28.3/js/ui/keyboard.js gnome-shell-3.28.3+git20190124/js/ui/keyboard.js --- gnome-shell-3.28.3/js/ui/keyboard.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/keyboard.js 2019-01-22 00:25:23.000000000 +0000 @@ -533,17 +533,25 @@ }, _setCurrentRect(rect) { - let frameRect = this._currentWindow.get_frame_rect(); - rect.x -= frameRect.x; - rect.y -= frameRect.y; + if (this._currentWindow) { + let frameRect = this._currentWindow.get_frame_rect(); + rect.x -= frameRect.x; + rect.y -= frameRect.y; + } this._rect = rect; this.emit('position-changed'); }, getCurrentRect() { - let frameRect = this._currentWindow.get_frame_rect(); - let rect = { x: this._rect.x + frameRect.x, y: this._rect.y + frameRect.y, width: this._rect.width, height: this._rect.height }; + let rect = { x: this._rect.x, y: this._rect.y, + width: this._rect.width, height: this._rect.height }; + + if (this._currentWindow) { + let frameRect = this._currentWindow.get_frame_rect(); + rect.x += frameRect.x; + rect.y += frameRect.y; + } return rect; } @@ -916,9 +924,11 @@ }, _relayout() { - if (this.actor == null) - return; let monitor = Main.layoutManager.keyboardMonitor; + + if (this.actor == null || monitor == null) + return; + let maxHeight = monitor.height / 3; this.actor.width = monitor.width; this.actor.height = maxHeight; diff -Nru gnome-shell-3.28.3/js/ui/layout.js gnome-shell-3.28.3+git20190124/js/ui/layout.js --- gnome-shell-3.28.3/js/ui/layout.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/layout.js 2019-01-22 00:25:23.000000000 +0000 @@ -203,6 +203,7 @@ // Set up stage hierarchy to group all UI actors under one container. this.uiGroup = new Shell.GenericContainer({ name: 'uiGroup' }); + this.uiGroup.set_flags(Clutter.ActorFlags.NO_LAYOUT); this.uiGroup.connect('allocate', (actor, box, flags) => { let children = actor.get_children(); for (let i = 0; i < children.length; i++) @@ -557,6 +558,8 @@ }, get focusMonitor() { + if (this.focusIndex < 0) + return null; return this.monitors[this.focusIndex]; }, diff -Nru gnome-shell-3.28.3/js/ui/main.js gnome-shell-3.28.3+git20190124/js/ui/main.js --- gnome-shell-3.28.3/js/ui/main.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/main.js 2019-01-22 00:25:23.000000000 +0000 @@ -343,6 +343,9 @@ let theme = new St.Theme ({ application_stylesheet: _cssStylesheet, default_stylesheet: _defaultCssStylesheet }); + if (theme.default_stylesheet == null) + throw new Error("No valid stylesheet found for '%s'".format(sessionMode.stylesheetName)); + if (previousTheme) { let customStylesheets = previousTheme.get_custom_stylesheets(); diff -Nru gnome-shell-3.28.3/js/ui/messageList.js gnome-shell-3.28.3+git20190124/js/ui/messageList.js --- gnome-shell-3.28.3/js/ui/messageList.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/messageList.js 2019-01-22 00:25:23.000000000 +0000 @@ -362,7 +362,8 @@ this.setBody(body); this._closeButton.connect('clicked', this.close.bind(this)); - this.actor.connect('notify::hover', this._sync.bind(this)); + let actorHoverId = this.actor.connect('notify::hover', this._sync.bind(this)); + this._closeButton.connect('destroy', this.actor.disconnect.bind(this.actor, actorHoverId)); this.actor.connect('clicked', this._onClicked.bind(this)); this.actor.connect('destroy', this._onDestroy.bind(this)); this._sync(); diff -Nru gnome-shell-3.28.3/js/ui/messageTray.js gnome-shell-3.28.3+git20190124/js/ui/messageTray.js --- gnome-shell-3.28.3/js/ui/messageTray.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/messageTray.js 2019-01-24 20:35:05.000000000 +0000 @@ -1320,6 +1320,7 @@ this._bannerBin.y = -this._banner.actor.height; this.actor.show(); + Meta.disable_unredirect_for_screen(global.screen); this._updateShowingNotification(); let [x, y, mods] = global.get_pointer(); @@ -1457,6 +1458,7 @@ this._pointerInNotification = false; this._notificationRemoved = false; + Meta.enable_unredirect_for_screen(global.screen); this._banner.actor.destroy(); this._banner = null; diff -Nru gnome-shell-3.28.3/js/ui/notificationDaemon.js gnome-shell-3.28.3+git20190124/js/ui/notificationDaemon.js --- gnome-shell-3.28.3/js/ui/notificationDaemon.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/notificationDaemon.js 2019-01-22 00:25:23.000000000 +0000 @@ -117,10 +117,8 @@ bitsPerSample, nChannels, data] = hints['image-data']; return Shell.util_create_pixbuf_from_data(data, GdkPixbuf.Colorspace.RGB, hasAlpha, bitsPerSample, width, height, rowStride); - } else if (hints['image-path']) { - return new Gio.FileIcon({ file: Gio.File.new_for_path(hints['image-path']) }); } - return null; + return this._iconForNotificationData(hints['image-path']); }, _fallbackIconForNotificationData(hints) { diff -Nru gnome-shell-3.28.3/js/ui/osdWindow.js gnome-shell-3.28.3+git20190124/js/ui/osdWindow.js --- gnome-shell-3.28.3/js/ui/osdWindow.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/osdWindow.js 2019-01-22 00:25:23.000000000 +0000 @@ -108,15 +108,30 @@ this._hideTimeoutId = 0; this._reset(); - Main.layoutManager.connect('monitors-changed', - this._relayout.bind(this)); + this.actor.connect('destroy', this._onDestroy.bind(this)); + + this._monitorsChangedId = + Main.layoutManager.connect('monitors-changed', + this._relayout.bind(this)); let themeContext = St.ThemeContext.get_for_stage(global.stage); - themeContext.connect('notify::scale-factor', - this._relayout.bind(this)); + this._scaleChangedId = + themeContext.connect('notify::scale-factor', + this._relayout.bind(this)); this._relayout(); Main.uiGroup.add_child(this.actor); }, + _onDestroy() { + if (this._monitorsChangedId) + Main.layoutManager.disconnect(this._monitorsChangedId); + this._monitorsChangedId = 0; + + let themeContext = St.ThemeContext.get_for_stage(global.stage); + if (this._scaleChangedId) + themeContext.disconnect(this._scaleChangedId); + this._scaleChangedId = 0; + }, + setIcon(icon) { this._icon.gicon = icon; }, diff -Nru gnome-shell-3.28.3/js/ui/overviewControls.js gnome-shell-3.28.3+git20190124/js/ui/overviewControls.js --- gnome-shell-3.28.3/js/ui/overviewControls.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/overviewControls.js 2019-01-22 00:25:23.000000000 +0000 @@ -284,6 +284,11 @@ return child.get_theme_node().get_length('visible-width'); }, + _onDragEnd() { + this.actor.sync_hover(); + this.parent(); + }, + _getSlide() { if (!this._visible) return 0; diff -Nru gnome-shell-3.28.3/js/ui/overview.js gnome-shell-3.28.3+git20190124/js/ui/overview.js --- gnome-shell-3.28.3/js/ui/overview.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/overview.js 2019-01-22 00:25:23.000000000 +0000 @@ -393,10 +393,8 @@ if (!Main.layoutManager.primaryMonitor) return; - let workArea = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex); - - this._coverPane.set_position(0, workArea.y); - this._coverPane.set_size(workArea.width, workArea.height); + this._coverPane.set_position(0, 0); + this._coverPane.set_size(global.screen_width, global.screen_height); this._updateBackgrounds(); }, diff -Nru gnome-shell-3.28.3/js/ui/panel.js gnome-shell-3.28.3+git20190124/js/ui/panel.js --- gnome-shell-3.28.3/js/ui/panel.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/panel.js 2019-01-22 00:25:23.000000000 +0000 @@ -796,6 +796,7 @@ this.actor.connect('get-preferred-height', this._getPreferredHeight.bind(this)); this.actor.connect('allocate', this._allocate.bind(this)); this.actor.connect('button-press-event', this._onButtonPress.bind(this)); + this.actor.connect('touch-event', this._onButtonPress.bind(this)); this.actor.connect('key-press-event', this._onKeyPress.bind(this)); Main.overview.connect('showing', () => { @@ -939,8 +940,13 @@ if (event.get_source() != actor) return Clutter.EVENT_PROPAGATE; - let button = event.get_button(); - if (button != 1) + let type = event.type(); + let isPress = type == Clutter.EventType.BUTTON_PRESS; + if (!isPress && type != Clutter.EventType.TOUCH_BEGIN) + return Clutter.EVENT_PROPAGATE; + + let button = isPress ? event.get_button() : -1; + if (isPress && button != 1) return Clutter.EVENT_PROPAGATE; let focusWindow = global.display.focus_window; @@ -1079,6 +1085,7 @@ let windows = activeWorkspace.list_windows().filter(metaWindow => { return metaWindow.is_on_primary_monitor() && metaWindow.showing_on_its_workspace() && + !metaWindow.is_hidden() && metaWindow.get_window_type() != Meta.WindowType.DESKTOP; }); diff -Nru gnome-shell-3.28.3/js/ui/popupMenu.js gnome-shell-3.28.3+git20190124/js/ui/popupMenu.js --- gnome-shell-3.28.3/js/ui/popupMenu.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/popupMenu.js 2019-01-22 00:25:23.000000000 +0000 @@ -141,8 +141,17 @@ }, _onKeyPressEvent(actor, event) { - let symbol = event.get_key_symbol(); + let state = event.get_state(); + + // if user has a modifier down (except capslock) + // then don't handle the key press here + state &= ~Clutter.ModifierType.LOCK_MASK; + state &= Clutter.ModifierType.MODIFIER_MASK; + if (state) + return Clutter.EVENT_PROPAGATE; + + let symbol = event.get_key_symbol(); if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) { this.activate(event); return Clutter.EVENT_STOP; diff -Nru gnome-shell-3.28.3/js/ui/runDialog.js gnome-shell-3.28.3+git20190124/js/ui/runDialog.js --- gnome-shell-3.28.3/js/ui/runDialog.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/runDialog.js 2019-01-22 00:25:23.000000000 +0000 @@ -114,18 +114,16 @@ this._history = new History.HistoryManager({ gsettingsKey: HISTORY_KEY, entry: this._entryText }); + this._entryText.connect('activate', (o) => { + this.popModal(); + this._run(o.get_text(), + Clutter.get_current_event().get_state() & Clutter.ModifierType.CONTROL_MASK); + if (!this._commandError || + !this.pushModal()) + this.close(); + }); this._entryText.connect('key-press-event', (o, e) => { let symbol = e.get_key_symbol(); - if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) { - this.popModal(); - this._run(o.get_text(), - e.get_state() & Clutter.ModifierType.CONTROL_MASK); - if (!this._commandError || - !this.pushModal()) - this.close(); - - return Clutter.EVENT_STOP; - } if (symbol == Clutter.Tab) { let text = o.get_text(); let prefix; diff -Nru gnome-shell-3.28.3/js/ui/search.js gnome-shell-3.28.3+git20190124/js/ui/search.js --- gnome-shell-3.28.3/js/ui/search.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/search.js 2019-01-22 00:25:23.000000000 +0000 @@ -192,6 +192,7 @@ }, clear() { + this._cancellable.cancel(); for (let resultId in this._resultDisplays) this._resultDisplays[resultId].actor.destroy(); this._resultDisplays = {}; @@ -225,6 +226,12 @@ this._cancellable.reset(); this.provider.getResultMetas(metasNeeded, metas => { + if (this._cancellable.is_cancelled()) { + if (metas.length > 0) + log(`Search provider ${this.provider.id} returned results after the request was canceled`); + callback(false); + return; + } if (metas.length != metasNeeded.length) { log('Wrong number of result metas returned by search provider ' + this.provider.id + ': expected ' + metasNeeded.length + ' but got ' + metas.length); diff -Nru gnome-shell-3.28.3/js/ui/status/keyboard.js gnome-shell-3.28.3+git20190124/js/ui/status/keyboard.js --- gnome-shell-3.28.3/js/ui/status/keyboard.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/status/keyboard.js 2019-01-22 00:25:23.000000000 +0000 @@ -360,11 +360,14 @@ this._settings.connect('per-window-changed', this._sourcesPerWindowChanged.bind(this)); this._sourcesPerWindowChanged(); this._disableIBus = false; + this._reloading = false; }, reload() { + this._reloading = true; this._keyboardManager.setKeyboardOptions(this._settings.keyboardOptions); this._inputSourcesChanged(); + this._reloading = false; }, _ibusReadyCallback(im, ready) { @@ -458,7 +461,15 @@ }, activateInputSource(is, interactive) { - KeyboardManager.holdKeyboard(); + // The focus changes during holdKeyboard/releaseKeyboard may trick + // the client into hiding UI containing the currently focused entry. + // So holdKeyboard/releaseKeyboard are not called when + // 'set-content-type' signal is received. + // E.g. Focusing on a password entry in a popup in Xorg Firefox + // will emit 'set-content-type' signal. + // https://gitlab.gnome.org/GNOME/gnome-shell/issues/391 + if (!this._reloading) + KeyboardManager.holdKeyboard(); this._keyboardManager.apply(is.xkbId); // All the "xkb:..." IBus engines simply "echo" back symbols, @@ -473,7 +484,10 @@ else engine = 'xkb:us::eng'; - this._ibusManager.setEngine(engine, KeyboardManager.releaseKeyboard); + if (!this._reloading) + this._ibusManager.setEngine(engine, KeyboardManager.releaseKeyboard); + else + this._ibusManager.setEngine(engine); this._currentInputSourceChanged(is); if (interactive) diff -Nru gnome-shell-3.28.3/js/ui/status/network.js gnome-shell-3.28.3+git20190124/js/ui/status/network.js --- gnome-shell-3.28.3/js/ui/status/network.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/status/network.js 2019-01-22 00:25:23.000000000 +0000 @@ -419,12 +419,14 @@ this._deactivateItem.actor.visible = this._device.state > NM.DeviceState.DISCONNECTED; if (this._activeConnection == null) { - this._activeConnection = this._device.active_connection; - - if (this._activeConnection) { - ensureActiveConnectionProps(this._activeConnection, this._client); - let item = this._connectionItems.get(this._activeConnection.connection.get_uuid()); - item.setActiveConnection(this._activeConnection); + let activeConnection = this._device.active_connection; + if (activeConnection && activeConnection.connection) { + let item = this._connectionItems.get(activeConnection.connection.get_uuid()); + if (item) { + this._activeConnection = activeConnection; + ensureActiveConnectionProps(this._activeConnection, this._client); + item.setActiveConnection(this._activeConnection); + } } } diff -Nru gnome-shell-3.28.3/js/ui/status/system.js gnome-shell-3.28.3+git20190124/js/ui/status/system.js --- gnome-shell-3.28.3/js/ui/status/system.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/status/system.js 2019-01-22 00:25:23.000000000 +0000 @@ -58,6 +58,9 @@ 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 @@ global.sync_pointer(); } - this.actor.visible = (childToShow != null); + this.actor.show(); }, _onDestroy() { diff -Nru gnome-shell-3.28.3/js/ui/viewSelector.js gnome-shell-3.28.3+git20190124/js/ui/viewSelector.js --- gnome-shell-3.28.3/js/ui/viewSelector.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/viewSelector.js 2019-01-22 00:25:23.000000000 +0000 @@ -311,6 +311,7 @@ }, hide() { + this.reset(); this._workspacesDisplay.hide(); }, @@ -459,7 +460,11 @@ }, reset() { - global.stage.set_key_focus(null); + // Don't drop the key focus on Clutter's side if anything but the + // overview has pushed a modal (e.g. system modals when activated using + // the overview). + if (Main.modalCount <= 1) + global.stage.set_key_focus(null); this._entry.text = ''; diff -Nru gnome-shell-3.28.3/js/ui/windowManager.js gnome-shell-3.28.3+git20190124/js/ui/windowManager.js --- gnome-shell-3.28.3/js/ui/windowManager.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/windowManager.js 2019-01-22 00:25:23.000000000 +0000 @@ -627,8 +627,8 @@ if (this.get_n_current_points() == 3) { for (let i = 0; i < this.get_n_current_points(); i++) { - [startX, startY] = this.get_press_coords(i); - [x, y] = this.get_motion_coords(i); + let [startX, startY] = this.get_press_coords(i); + let [x, y] = this.get_motion_coords(i); if (Math.abs(x - startX) > MOTION_THRESHOLD || Math.abs(y - startY) > MOTION_THRESHOLD) @@ -1173,6 +1173,10 @@ yScale = geom.height / actor.height; } else { let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()]; + if (!monitor) { + this._minimizeWindowDone(); + return; + } xDest = monitor.x; yDest = monitor.y; if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) @@ -1248,6 +1252,11 @@ geom.height / actor.height); } else { let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()]; + if (!monitor) { + actor.show(); + this._unminimizeWindowDone(); + return; + } actor.set_position(monitor.x, monitor.y); if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) actor.x += monitor.width; diff -Nru gnome-shell-3.28.3/js/ui/windowMenu.js gnome-shell-3.28.3+git20190124/js/ui/windowMenu.js --- gnome-shell-3.28.3/js/ui/windowMenu.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/windowMenu.js 2019-01-22 00:25:23.000000000 +0000 @@ -128,11 +128,10 @@ let screen = global.screen; let nMonitors = screen.get_n_monitors(); - if (nMonitors > 1) { + let monitorIndex = window.get_monitor(); + if (nMonitors > 1 && monitorIndex >= 0) { this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - let monitorIndex = window.get_monitor(); - let dir = Meta.ScreenDirection.UP; let upMonitorIndex = screen.get_monitor_neighbor_index(monitorIndex, dir); diff -Nru gnome-shell-3.28.3/js/ui/workspace.js gnome-shell-3.28.3+git20190124/js/ui/workspace.js --- gnome-shell-3.28.3/js/ui/workspace.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/workspace.js 2019-01-22 00:25:23.000000000 +0000 @@ -137,8 +137,10 @@ this._dragSlot = [0, 0, 0, 0]; this._stackAbove = null; - this._windowClone._updateId = this.metaWindow.connect('size-changed', - this._onRealWindowSizeChanged.bind(this)); + this._windowClone._sizeChangedId = this.metaWindow.connect('size-changed', + this._onMetaWindowSizeChanged.bind(this)); + this._windowClone._posChangedId = this.metaWindow.connect('position-changed', + this._computeBoundingBox.bind(this)); this._windowClone._destroyId = this.realWindow.connect('destroy', () => { // First destroy the clone and then destroy everything @@ -206,8 +208,7 @@ addAttachedDialog(win) { this._doAddAttachedDialog(win, win.get_compositor_private()); - this._computeBoundingBox(); - this.emit('size-changed'); + this._onMetaWindowSizeChanged(); }, hasAttachedDialogs() { @@ -216,15 +217,14 @@ _doAddAttachedDialog(metaWin, realWin) { let clone = new Clutter.Clone({ source: realWin }); - clone._updateId = metaWin.connect('size-changed', () => { - this._computeBoundingBox(); - this.emit('size-changed'); - }); + clone._sizeChangedId = metaWin.connect('size-changed', + this._onMetaWindowSizeChanged.bind(this)); + clone._posChangedId = metaWin.connect('position-changed', + this._onMetaWindowSizeChanged.bind(this)); clone._destroyId = realWin.connect('destroy', () => { clone.destroy(); - this._computeBoundingBox(); - this.emit('size-changed'); + this._onMetaWindowSizeChanged(); }); this.actor.add_child(clone); }, @@ -321,12 +321,13 @@ else realWindow = child.source; - realWindow.meta_window.disconnect(child._updateId); + realWindow.meta_window.disconnect(child._sizeChangedId); + realWindow.meta_window.disconnect(child._posChangedId); realWindow.disconnect(child._destroyId); }); }, - _onRealWindowSizeChanged() { + _onMetaWindowSizeChanged() { this._computeBoundingBox(); this.emit('size-changed'); }, @@ -469,7 +470,6 @@ this._windowAddedId = 0; button.hide(); - title.hide(); this.title = title; this.closeButton = button; @@ -544,12 +544,10 @@ let titleX = cloneX + (cloneWidth - title.width) / 2; let titleY = cloneY + cloneHeight - (title.height - this.borderSize) / 2; - if (animate) { - this._animateOverlayActor(title, Math.floor(titleX), Math.floor(titleY), title.width); - } else { - title.width = title.width; + if (animate) + this._animateOverlayActor(title, Math.floor(titleX), Math.floor(titleY)); + else title.set_position(Math.floor(titleX), Math.floor(titleY)); - } let borderX = cloneX - this.borderSize; let borderY = cloneY - this.borderSize; @@ -568,10 +566,12 @@ _animateOverlayActor(actor, x, y, width, height) { let params = { x: x, y: y, - width: width, time: Overview.ANIMATION_TIME, transition: 'easeOutQuad' }; + if (width !== undefined) + params.width = width; + if (height !== undefined) params.height = height; @@ -1506,7 +1506,7 @@ if (metaWin.is_attached_dialog()) { let parent = metaWin.get_transient_for(); while (parent.is_attached_dialog()) - parent = metaWin.get_transient_for(); + parent = parent.get_transient_for(); let idx = this._lookupIndex (parent); if (idx < 0) { diff -Nru gnome-shell-3.28.3/js/ui/workspacesView.js gnome-shell-3.28.3+git20190124/js/ui/workspacesView.js --- gnome-shell-3.28.3/js/ui/workspacesView.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/workspacesView.js 2019-01-22 00:25:23.000000000 +0000 @@ -470,6 +470,7 @@ this._switchWorkspaceNotifyId = 0; this._notifyOpacityId = 0; + this._restackedNotifyId = 0; this._scrollEventId = 0; this._keyPressEventId = 0; diff -Nru gnome-shell-3.28.3/js/ui/workspaceThumbnail.js gnome-shell-3.28.3+git20190124/js/ui/workspaceThumbnail.js --- gnome-shell-3.28.3/js/ui/workspaceThumbnail.js 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/js/ui/workspaceThumbnail.js 2019-01-22 00:25:23.000000000 +0000 @@ -68,7 +68,7 @@ this.realWindow = realWindow; this.metaWindow = realWindow.meta_window; - this.clone._updateId = this.metaWindow.connect('position-changed', + this.clone._updateId = this.realWindow.connect('notify::position', this._onPositionChanged.bind(this)); this.clone._destroyId = this.realWindow.connect('destroy', () => { // First destroy the clone and then destroy everything @@ -153,7 +153,7 @@ let clone = new Clutter.Clone({ source: realDialog }); this._updateDialogPosition(realDialog, clone); - clone._updateId = metaDialog.connect('position-changed', dialog => { + clone._updateId = realDialog.connect('notify::position', dialog => { this._updateDialogPosition(dialog, clone); }); clone._destroyId = realDialog.connect('destroy', () => { @@ -171,7 +171,6 @@ }, _onPositionChanged() { - let rect = this.metaWindow.get_frame_rect(); this.actor.set_position(this.realWindow.x, this.realWindow.y); }, @@ -179,7 +178,7 @@ this.actor.get_children().forEach(child => { let realWindow = child.source; - realWindow.meta_window.disconnect(child._updateId); + realWindow.disconnect(child._updateId); realWindow.disconnect(child._destroyId); }); }, @@ -417,7 +416,7 @@ } else if (metaWin.is_attached_dialog()) { let parent = metaWin.get_transient_for(); while (parent.is_attached_dialog()) - parent = metaWin.get_transient_for(); + parent = parent.get_transient_for(); let idx = this._lookupIndex (parent); if (idx < 0) { @@ -677,7 +676,11 @@ this._settings.connect('changed::dynamic-workspaces', this._updateSwitcherVisibility.bind(this)); - Main.layoutManager.connect('monitors-changed', this._rebuildThumbnails.bind(this)); + Main.layoutManager.connect('monitors-changed', () => { + this._destroyThumbnails(); + if (Main.overview.visible) + this._createThumbnails(); + }); }, _updateSwitcherVisibility() { @@ -870,9 +873,6 @@ Main.overview.connect('windows-restacked', this._syncStacking.bind(this)); - this._workareasChangedId = - global.screen.connect('workareas-changed', this._rebuildThumbnails.bind(this)); - this._targetScale = 0; this._scale = 0; this._pendingScaleUpdate = false; @@ -902,24 +902,12 @@ this._syncStackingId = 0; } - if (this._workareasChangedId > 0) { - global.screen.disconnect(this._workareasChangedId); - this._workareasChangedId = 0; - } - for (let w = 0; w < this._thumbnails.length; w++) this._thumbnails[w].destroy(); this._thumbnails = []; this._porthole = null; }, - _rebuildThumbnails() { - this._destroyThumbnails(); - - if (Main.overview.visible) - this._createThumbnails(); - }, - _workspacesChanged() { let validThumbnails = this._thumbnails.filter(t => t.state <= ThumbnailState.NORMAL); diff -Nru gnome-shell-3.28.3/po/cs.po gnome-shell-3.28.3+git20190124/po/cs.po --- gnome-shell-3.28.3/po/cs.po 2018-07-18 21:01:36.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/po/cs.po 2019-01-22 00:25:23.000000000 +0000 @@ -1064,7 +1064,7 @@ #: js/ui/dateMenu.js:321 #, javascript-format msgid "Feels like %s." -msgstr "Pocitově jako %s." +msgstr "Pocitová teplota %s." #: js/ui/dateMenu.js:324 msgid "Go online for weather information" diff -Nru gnome-shell-3.28.3/src/st/st-bin.c gnome-shell-3.28.3+git20190124/src/st/st-bin.c --- gnome-shell-3.28.3/src/st/st-bin.c 2018-07-18 21:01:37.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/src/st/st-bin.c 2019-01-22 00:25:24.000000000 +0000 @@ -177,15 +177,15 @@ } static void -st_bin_dispose (GObject *gobject) +st_bin_destroy (ClutterActor *actor) { - StBinPrivate *priv = st_bin_get_instance_private (ST_BIN (gobject)); + StBinPrivate *priv = st_bin_get_instance_private (ST_BIN (actor)); if (priv->child) clutter_actor_destroy (priv->child); g_assert (priv->child == NULL); - G_OBJECT_CLASS (st_bin_parent_class)->dispose (gobject); + CLUTTER_ACTOR_CLASS (st_bin_parent_class)->destroy (actor); } static void @@ -315,11 +315,11 @@ gobject_class->set_property = st_bin_set_property; gobject_class->get_property = st_bin_get_property; - gobject_class->dispose = st_bin_dispose; actor_class->get_preferred_width = st_bin_get_preferred_width; actor_class->get_preferred_height = st_bin_get_preferred_height; actor_class->allocate = st_bin_allocate; + actor_class->destroy = st_bin_destroy; widget_class->popup_menu = st_bin_popup_menu; widget_class->navigate_focus = st_bin_navigate_focus; diff -Nru gnome-shell-3.28.3/src/st/st-box-layout.c gnome-shell-3.28.3+git20190124/src/st/st-box-layout.c --- gnome-shell-3.28.3/src/st/st-box-layout.c 2018-07-18 21:01:37.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/src/st/st-box-layout.c 2019-01-22 00:25:24.000000000 +0000 @@ -90,7 +90,7 @@ GParamSpec *pspec, StBoxLayout *box) { - clutter_actor_queue_redraw (CLUTTER_ACTOR (box)); + clutter_actor_queue_relayout (CLUTTER_ACTOR (box)); } static void @@ -490,7 +490,7 @@ ClutterPaintVolume *volume) { StBoxLayout *self = ST_BOX_LAYOUT (actor); - gdouble x, y; + gdouble x, y, lower, upper; StBoxLayoutPrivate *priv = self->priv; StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor)); ClutterActorBox allocation_box; @@ -505,13 +505,42 @@ * our paint volume on that. */ if (priv->hadjustment || priv->vadjustment) { + gdouble width, height; + clutter_actor_get_allocation_box (actor, &allocation_box); st_theme_node_get_content_box (theme_node, &allocation_box, &content_box); origin.x = content_box.x1 - allocation_box.x1; origin.y = content_box.y1 - allocation_box.y2; origin.z = 0.f; - clutter_paint_volume_set_width (volume, content_box.x2 - content_box.x1); - clutter_paint_volume_set_height (volume, content_box.y2 - content_box.y1); + + if (priv->hadjustment) + { + g_object_get (priv->hadjustment, + "lower", &lower, + "upper", &upper, + NULL); + width = upper - lower; + } + else + { + width = content_box.x2 - content_box.x1; + } + + if (priv->vadjustment) + { + g_object_get (priv->vadjustment, + "lower", &lower, + "upper", &upper, + NULL); + height = upper - lower; + } + else + { + height = content_box.y2 - content_box.y1; + } + + clutter_paint_volume_set_width (volume, width); + clutter_paint_volume_set_height (volume, height); } else if (!CLUTTER_ACTOR_CLASS (st_box_layout_parent_class)->get_paint_volume (actor, volume)) return FALSE; diff -Nru gnome-shell-3.28.3/src/st/st-button.c gnome-shell-3.28.3+git20190124/src/st/st-button.c --- gnome-shell-3.28.3/src/st/st-button.c 2018-07-18 21:01:37.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/src/st/st-button.c 2019-01-22 00:25:24.000000000 +0000 @@ -248,14 +248,17 @@ 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; } diff -Nru gnome-shell-3.28.3/src/st/st-entry.c gnome-shell-3.28.3+git20190124/src/st/st-entry.c --- gnome-shell-3.28.3/src/st/st-entry.c 2018-07-18 21:01:37.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/src/st/st-entry.c 2019-01-22 00:25:24.000000000 +0000 @@ -906,6 +906,13 @@ CLUTTER_ACTOR_CLASS (st_entry_parent_class)->unmap (actor); } +static gboolean +st_entry_get_paint_volume (ClutterActor *actor, + ClutterPaintVolume *volume) +{ + return clutter_paint_volume_set_from_allocation (volume, actor); +} + static void st_entry_class_init (StEntryClass *klass) { @@ -923,6 +930,7 @@ actor_class->allocate = st_entry_allocate; actor_class->paint = st_entry_paint; actor_class->unmap = st_entry_unmap; + actor_class->get_paint_volume = st_entry_get_paint_volume; actor_class->key_press_event = st_entry_key_press_event; actor_class->key_focus_in = st_entry_key_focus_in; @@ -1287,10 +1295,10 @@ return clutter_text_get_input_hints (CLUTTER_TEXT (priv->entry)); } -static gboolean -_st_entry_icon_press_cb (ClutterActor *actor, - ClutterButtonEvent *event, - StEntry *entry) +static void +_st_entry_icon_clicked_cb (ClutterClickAction *action, + ClutterActor *actor, + StEntry *entry) { StEntryPrivate *priv = ST_ENTRY_PRIV (entry); @@ -1298,8 +1306,6 @@ g_signal_emit (entry, entry_signals[PRIMARY_ICON_CLICKED], 0); else g_signal_emit (entry, entry_signals[SECONDARY_ICON_CLICKED], 0); - - return FALSE; } static void @@ -1309,21 +1315,24 @@ { if (*icon) { - g_signal_handlers_disconnect_by_func (*icon, - _st_entry_icon_press_cb, - entry); + clutter_actor_remove_action_by_name (*icon, "entry-icon-action"); clutter_actor_remove_child (CLUTTER_ACTOR (entry), *icon); *icon = NULL; } if (new_icon) { + ClutterAction *action; + *icon = g_object_ref (new_icon); clutter_actor_set_reactive (*icon, TRUE); clutter_actor_add_child (CLUTTER_ACTOR (entry), *icon); - g_signal_connect (*icon, "button-release-event", - G_CALLBACK (_st_entry_icon_press_cb), entry); + + action = clutter_click_action_new (); + clutter_actor_add_action_with_name (*icon, "entry-icon-action", action); + g_signal_connect (action, "clicked", + G_CALLBACK (_st_entry_icon_clicked_cb), entry); } clutter_actor_queue_relayout (CLUTTER_ACTOR (entry)); diff -Nru gnome-shell-3.28.3/src/st/st-scroll-view.c gnome-shell-3.28.3+git20190124/src/st/st-scroll-view.c --- gnome-shell-3.28.3/src/st/st-scroll-view.c 2018-07-18 21:01:37.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/src/st/st-scroll-view.c 2019-01-22 00:25:24.000000000 +0000 @@ -304,6 +304,13 @@ clutter_actor_paint (priv->vscroll); } +static gboolean +st_scroll_view_get_paint_volume (ClutterActor *actor, + ClutterPaintVolume *volume) +{ + return clutter_paint_volume_set_from_allocation (volume, actor); +} + static double get_scrollbar_width (StScrollView *scroll, gfloat for_height) @@ -793,6 +800,7 @@ actor_class->paint = st_scroll_view_paint; actor_class->pick = st_scroll_view_pick; + actor_class->get_paint_volume = st_scroll_view_get_paint_volume; actor_class->get_preferred_width = st_scroll_view_get_preferred_width; actor_class->get_preferred_height = st_scroll_view_get_preferred_height; actor_class->allocate = st_scroll_view_allocate; diff -Nru gnome-shell-3.28.3/src/st/st-texture-cache.c gnome-shell-3.28.3+git20190124/src/st/st-texture-cache.c --- gnome-shell-3.28.3/src/st/st-texture-cache.c 2018-07-18 21:01:37.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/src/st/st-texture-cache.c 2019-01-22 00:25:24.000000000 +0000 @@ -780,13 +780,13 @@ if (!texture) { texture = load (cache, key, data, error); - if (texture) + if (texture && policy == ST_TEXTURE_CACHE_POLICY_FOREVER) g_hash_table_insert (cache->priv->keyed_cache, g_strdup (key), texture); - else - return NULL; } - cogl_object_ref (texture); + if (texture && policy == ST_TEXTURE_CACHE_POLICY_FOREVER) + cogl_object_ref (texture); + return texture; } @@ -984,7 +984,7 @@ char *key; guint file_hash; - if (event_type != G_FILE_MONITOR_EVENT_CHANGED) + if (event_type != G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT) return; file_hash = g_file_hash (file); diff -Nru gnome-shell-3.28.3/src/st/st-theme-node-drawing.c gnome-shell-3.28.3+git20190124/src/st/st-theme-node-drawing.c --- gnome-shell-3.28.3/src/st/st-theme-node-drawing.c 2018-07-18 21:01:37.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/src/st/st-theme-node-drawing.c 2019-01-22 00:25:24.000000000 +0000 @@ -229,9 +229,9 @@ { 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); } } @@ -402,7 +402,7 @@ return COGL_INVALID_HANDLE; key = corner_to_string (&corner); - texture = st_texture_cache_load (cache, key, ST_TEXTURE_CACHE_POLICY_NONE, load_corner, &corner, NULL); + texture = st_texture_cache_load (cache, key, ST_TEXTURE_CACHE_POLICY_FOREVER, load_corner, &corner, NULL); if (texture) { @@ -1414,6 +1414,32 @@ 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 @@ -2751,3 +2777,17 @@ 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 -Nru gnome-shell-3.28.3/src/st/st-theme-node.h gnome-shell-3.28.3+git20190124/src/st/st-theme-node.h --- gnome-shell-3.28.3/src/st/st-theme-node.h 2018-07-18 21:01:37.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/src/st/st-theme-node.h 2019-01-22 00:25:24.000000000 +0000 @@ -287,6 +287,9 @@ 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 -Nru gnome-shell-3.28.3/src/st/st-widget.c gnome-shell-3.28.3+git20190124/src/st/st-widget.c --- gnome-shell-3.28.3/src/st/st-widget.c 2018-07-18 21:01:37.000000000 +0000 +++ gnome-shell-3.28.3+git20190124/src/st/st-widget.c 2019-01-22 00:25:24.000000000 +0000 @@ -289,44 +289,17 @@ { 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; + int i; - 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; - } - - 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