From d641a9efb21c79fe5fc3f2cc8c4109a8eb4783d3 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Tue, 5 Nov 2019 14:43:42 -0500 Subject: [PATCH] import gnome-shell-3.32.2-9.el8 --- .gitignore | 2 +- .gnome-shell.metadata | 2 +- SOURCES/0001-Add-app-introspection-API.patch | 264 --------- ...remote-access-indication-and-control.patch | 153 ----- ...error-when-all-alternatives-are-disa.patch | 39 -- ...intentional-loop-while-polkit-dialog.patch | 40 ++ ...Close-all-closable-windows-from-quit.patch | 34 -- ...-to-window-title-instead-of-WM_CLASS.patch | 8 +- ...pDisplay-Show-full-app-name-on-hover.patch | 26 +- ...und-refresh-after-suspend-on-wayland.patch | 62 +-- ...ll-process-working.svg-to-filesystem.patch | 12 +- ...Notify-about-extension-issues-on-upd.patch | 23 +- ...ns-Add-a-SESSION_MODE-extension-type.patch | 10 +- SOURCES/0001-gdm-add-AuthList-control.patch | 6 +- ...Allow-overriding-the-override-schema.patch | 115 ---- ...Avoid-idempotent-calls-to-meta_backe.patch | 65 --- ...-layout-Make-the-hot-corner-optional.patch | 56 ++ ...oginDialog-make-info-messages-themed.patch | 8 +- ...Window-Disconnect-signals-on-destroy.patch | 58 -- ...-add-an-icon-to-the-ActivitiesButton.patch | 18 +- ...eld-unblank-when-inserting-smartcard.patch | 8 +- ...DBus-method-to-load-a-single-extensi.patch | 58 +- ...-back-workspaces-submenu-for-static-.patch | 17 +- ...ork-around-spurious-allocation-chang.patch | 37 ++ ...ld-background-not-just-animation-on-.patch | 62 +-- ...upport-for-GDM-s-ChoiceList-PAM-exte.patch | 74 +-- ...002-introspect-Add-GetWindows-method.patch | 136 ----- ...2-remoteAccess-Make-indicator-orange.patch | 43 -- ...003-st-texture-cache-purge-on-resume.patch | 186 +------ ...sh-background-on-gl-video-memory-pur.patch | 236 ++------ .../allow-timed-login-with-no-user-list.patch | 85 ++- SOURCES/backport-im-fixes.patch | 398 ------------- .../disable-unlock-entry-until-question.patch | 47 +- SOURCES/enforce-smartcard-at-unlock.patch | 45 +- SOURCES/fix-close-dialog-annoyances.patch | 231 -------- SOURCES/fix-invalid-access-warnings.patch | 526 +++++------------- .../gnome-shell-favourite-apps-firefox.patch | 35 +- .../gnome-shell-favourite-apps-terminal.patch | 6 +- SOURCES/gnome-shell-favourite-apps-yelp.patch | 6 +- SOURCES/horizontal-workspace-support.patch | 399 +++++++++++++ SPECS/gnome-shell.spec | 107 ++-- 41 files changed, 1051 insertions(+), 2692 deletions(-) delete mode 100644 SOURCES/0001-Add-app-introspection-API.patch delete mode 100644 SOURCES/0001-Add-remote-access-indication-and-control.patch delete mode 100644 SOURCES/0001-altSwitcher-Fix-error-when-all-alternatives-are-disa.patch create mode 100644 SOURCES/0001-animation-fix-unintentional-loop-while-polkit-dialog.patch delete mode 100644 SOURCES/0001-app-Close-all-closable-windows-from-quit.patch delete mode 100644 SOURCES/0001-global-Allow-overriding-the-override-schema.patch delete mode 100644 SOURCES/0001-keyboardManager-Avoid-idempotent-calls-to-meta_backe.patch create mode 100644 SOURCES/0001-layout-Make-the-hot-corner-optional.patch delete mode 100644 SOURCES/0001-osdWindow-Disconnect-signals-on-destroy.patch create mode 100644 SOURCES/0001-workspacesView-Work-around-spurious-allocation-chang.patch delete mode 100644 SOURCES/0002-introspect-Add-GetWindows-method.patch delete mode 100644 SOURCES/0002-remoteAccess-Make-indicator-orange.patch delete mode 100644 SOURCES/backport-im-fixes.patch delete mode 100644 SOURCES/fix-close-dialog-annoyances.patch create mode 100644 SOURCES/horizontal-workspace-support.patch diff --git a/.gitignore b/.gitignore index c007c9b..e984bcc 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/gnome-shell-3.28.3.tar.xz +SOURCES/gnome-shell-3.32.2.tar.xz diff --git a/.gnome-shell.metadata b/.gnome-shell.metadata index af6558d..06e249f 100644 --- a/.gnome-shell.metadata +++ b/.gnome-shell.metadata @@ -1 +1 @@ -767bea7e4715fb951c74a02c26d4b4d8ddecaaaf SOURCES/gnome-shell-3.28.3.tar.xz +331e9cf71cd1d2a4e9238d87d216da4c6f3a400e SOURCES/gnome-shell-3.32.2.tar.xz diff --git a/SOURCES/0001-Add-app-introspection-API.patch b/SOURCES/0001-Add-app-introspection-API.patch deleted file mode 100644 index e13f623..0000000 --- a/SOURCES/0001-Add-app-introspection-API.patch +++ /dev/null @@ -1,264 +0,0 @@ -From e9130f3502e36262743a8c1a423a6740b64bcf7f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jonas=20=C3=85dahl?= -Date: Wed, 5 Sep 2018 11:15:30 +0200 -Subject: [PATCH 1/2] Add app introspection API - -Add a D-Bus API that allows the API user to introspect the application -state of the shell. Currently the only exposed information is list of -running applications and which one is active (i.e. has focus). - -https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/326 -(cherry picked from commit 10c68c6b952959d105c3126fc61f22a199e8e848) ---- - data/meson.build | 3 +- - data/org.gnome.Shell.Introspect.xml | 37 +++++++++ - data/org.gnome.shell.gschema.xml.in | 8 ++ - js/js-resources.gresource.xml | 1 + - js/misc/introspect.js | 116 ++++++++++++++++++++++++++++ - js/ui/main.js | 4 + - 6 files changed, 168 insertions(+), 1 deletion(-) - create mode 100644 data/org.gnome.Shell.Introspect.xml - create mode 100644 js/misc/introspect.js - -diff --git a/data/meson.build b/data/meson.build -index 7c9807721..fee44f02e 100644 ---- a/data/meson.build -+++ b/data/meson.build -@@ -46,7 +46,8 @@ dbus_interfaces = [ - 'org.gnome.Shell.Screencast.xml', - 'org.gnome.Shell.Screenshot.xml', - 'org.gnome.ShellSearchProvider.xml', -- 'org.gnome.ShellSearchProvider2.xml' -+ 'org.gnome.ShellSearchProvider2.xml', -+ 'org.gnome.Shell.Introspect.xml' - ] - install_data(dbus_interfaces, install_dir: ifacedir) - -diff --git a/data/org.gnome.Shell.Introspect.xml b/data/org.gnome.Shell.Introspect.xml -new file mode 100644 -index 000000000..10c48d635 ---- /dev/null -+++ b/data/org.gnome.Shell.Introspect.xml -@@ -0,0 +1,37 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in -index 63a19032d..6917d753d 100644 ---- a/data/org.gnome.shell.gschema.xml.in -+++ b/data/org.gnome.shell.gschema.xml.in -@@ -90,6 +90,14 @@ - adapter is ever seen not to have devices associated to it. - - -+ -+ false -+ Enable introspection API -+ -+ Enables a D-Bus API that allows to introspect the application state of -+ the shell. -+ -+ - - - -diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml -index 883b62d66..77c2c2abb 100644 ---- a/js/js-resources.gresource.xml -+++ b/js/js-resources.gresource.xml -@@ -18,6 +18,7 @@ - misc/history.js - misc/ibusManager.js - misc/inputMethod.js -+ misc/introspect.js - misc/jsParse.js - misc/keyboardManager.js - misc/loginManager.js -diff --git a/js/misc/introspect.js b/js/misc/introspect.js -new file mode 100644 -index 000000000..05ef9e637 ---- /dev/null -+++ b/js/misc/introspect.js -@@ -0,0 +1,116 @@ -+const Gio = imports.gi.Gio; -+const GLib = imports.gi.GLib; -+const Lang = imports.lang; -+const Meta = imports.gi.Meta; -+const Shell = imports.gi.Shell; -+ -+const INTROSPECT_SCHEMA = 'org.gnome.shell'; -+const INTROSPECT_KEY = 'introspect'; -+const APP_WHITELIST = ['org.freedesktop.impl.portal.desktop.gtk']; -+ -+const IntrospectDBusIface = ' \ -+ \ -+ \ -+ \ -+ \ -+ \ -+ \ -+'; -+ -+var IntrospectService = new Lang.Class({ -+ Name: 'IntrospectService', -+ -+ _init() { -+ this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(IntrospectDBusIface, -+ this); -+ this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Introspect'); -+ Gio.DBus.session.own_name('org.gnome.Shell.Introspect', -+ Gio.BusNameOwnerFlags.REPLACE, -+ null, null); -+ -+ this._runningApplications = {}; -+ this._runningApplicationsDirty = true; -+ this._activeApplication = null; -+ this._activeApplicationDirty = true; -+ -+ this._appSystem = Shell.AppSystem.get_default(); -+ this._appSystem.connect('app-state-changed', -+ () => { -+ this._runningApplicationsDirty = true; -+ this._syncRunningApplications(); -+ }); -+ -+ this._settings = new Gio.Settings({ schema_id: INTROSPECT_SCHEMA }); -+ -+ let tracker = Shell.WindowTracker.get_default(); -+ tracker.connect('notify::focus-app', -+ () => { -+ this._activeApplicationDirty = true; -+ this._syncRunningApplications(); -+ }); -+ -+ this._syncRunningApplications(); -+ }, -+ -+ _isStandaloneApp(app) { -+ let windows = app.get_windows(); -+ -+ return app.get_windows().some(w => w.transient_for == null); -+ }, -+ -+ _isIntrospectEnabled() { -+ return this._settings.get_boolean(INTROSPECT_KEY); -+ }, -+ -+ _isSenderWhitelisted(sender) { -+ return APP_WHITELIST.includes(sender); -+ }, -+ -+ _syncRunningApplications() { -+ let tracker = Shell.WindowTracker.get_default(); -+ let apps = this._appSystem.get_running(); -+ let seatName = "seat0"; -+ let newRunningApplications = {}; -+ -+ let newActiveApplication = null; -+ let focusedApp = tracker.focus_app; -+ -+ for (let app of apps) { -+ let appInfo = {}; -+ let isAppActive = (focusedApp == app); -+ -+ if (!this._isStandaloneApp(app)) -+ continue; -+ -+ if (isAppActive) { -+ appInfo['active-on-seats'] = new GLib.Variant('as', [seatName]); -+ newActiveApplication = app.get_id(); -+ } -+ -+ newRunningApplications[app.get_id()] = appInfo; -+ } -+ -+ if (this._runningApplicationsDirty || -+ (this._activeApplicationDirty && -+ this._activeApplication != newActiveApplication)) { -+ this._runningApplications = newRunningApplications; -+ this._activeApplication = newActiveApplication; -+ -+ this._dbusImpl.emit_signal('RunningApplicationsChanged', null); -+ } -+ this._runningApplicationsDirty = false; -+ this._activeApplicationDirty = false; -+ }, -+ -+ GetRunningApplicationsAsync(params, invocation) { -+ if (!this._isIntrospectEnabled() && -+ !this._isSenderWhitelisted(invocation.get_sender())) { -+ invocation.return_error_literal(Gio.DBusError, -+ Gio.DBusError.ACCESS_DENIED, -+ 'App introspection not allowed'); -+ return; -+ } -+ -+ invocation.return_value(new GLib.Variant('(a{sa{sv}})', [this._runningApplications])); -+ } -+}); -diff --git a/js/ui/main.js b/js/ui/main.js -index 2c54bb680..0639b5e7d 100644 ---- a/js/ui/main.js -+++ b/js/ui/main.js -@@ -20,6 +20,7 @@ const Environment = imports.ui.environment; - const ExtensionSystem = imports.ui.extensionSystem; - const ExtensionDownloader = imports.ui.extensionDownloader; - const InputMethod = imports.misc.inputMethod; -+const Introspect = imports.misc.introspect; - const Keyboard = imports.ui.keyboard; - const MessageTray = imports.ui.messageTray; - const ModalDialog = imports.ui.modalDialog; -@@ -82,6 +83,7 @@ var keyboard = null; - var layoutManager = null; - var kbdA11yDialog = null; - var inputMethod = null; -+var introspectService = null; - let _startDate; - let _defaultCssStylesheet = null; - let _cssStylesheet = null; -@@ -187,6 +189,8 @@ function _initializeUI() { - windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler(); - componentManager = new Components.ComponentManager(); - -+ introspectService = new Introspect.IntrospectService(); -+ - layoutManager.init(); - overview.init(); - --- -2.20.1 - diff --git a/SOURCES/0001-Add-remote-access-indication-and-control.patch b/SOURCES/0001-Add-remote-access-indication-and-control.patch deleted file mode 100644 index 0dd67f4..0000000 --- a/SOURCES/0001-Add-remote-access-indication-and-control.patch +++ /dev/null @@ -1,153 +0,0 @@ -From 8b916620e32ee0b42734dd7896fe5058c8591d81 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jonas=20=C3=85dahl?= -Date: Fri, 20 Jul 2018 16:50:50 +0200 -Subject: [PATCH 1/2] Add remote access indication and control - -Add an indicator for when there is something access the display server -remotely. This could be 1) remote desktop, 2) screen cast or 3) remote -control, but all effectively applications using -org.freedesktop.portal.ScreenCast or org.gnome.portal.RemoteDesktop as -well as gnome-remote-desktop using the corresponding org.gnome.Mutter -APIs directly. - -As it is now, it'll simply show a single icon for when anything is -having an active session, and a single action "Turn off" that'll close -every active session. - -https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/160 ---- - js/js-resources.gresource.xml | 1 + - js/ui/panel.js | 3 ++ - js/ui/status/remoteAccess.js | 80 +++++++++++++++++++++++++++++++++++ - 3 files changed, 84 insertions(+) - create mode 100644 js/ui/status/remoteAccess.js - -diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml -index 883b62d66..cc1da4461 100644 ---- a/js/js-resources.gresource.xml -+++ b/js/js-resources.gresource.xml -@@ -130,6 +130,7 @@ - ui/status/rfkill.js - ui/status/volume.js - ui/status/bluetooth.js -+ ui/status/remoteAccess.js - ui/status/screencast.js - ui/status/system.js - ui/status/thunderbolt.js -diff --git a/js/ui/panel.js b/js/ui/panel.js -index d44ed9fec..53cc445f8 100644 ---- a/js/ui/panel.js -+++ b/js/ui/panel.js -@@ -709,6 +709,7 @@ var AggregateMenu = new Lang.Class({ - this._bluetooth = null; - } - -+ this._remoteAccess = new imports.ui.status.remoteAccess.RemoteAccessApplet(); - this._power = new imports.ui.status.power.Indicator(); - this._rfkill = new imports.ui.status.rfkill.Indicator(); - this._volume = new imports.ui.status.volume.Indicator(); -@@ -729,6 +730,7 @@ var AggregateMenu = new Lang.Class({ - if (this._bluetooth) { - this._indicators.add_child(this._bluetooth.indicators); - } -+ this._indicators.add_child(this._remoteAccess.indicators); - this._indicators.add_child(this._rfkill.indicators); - this._indicators.add_child(this._volume.indicators); - this._indicators.add_child(this._power.indicators); -@@ -743,6 +745,7 @@ var AggregateMenu = new Lang.Class({ - if (this._bluetooth) { - this.menu.addMenuItem(this._bluetooth.menu); - } -+ this.menu.addMenuItem(this._remoteAccess.menu); - this.menu.addMenuItem(this._location.menu); - this.menu.addMenuItem(this._rfkill.menu); - this.menu.addMenuItem(this._power.menu); -diff --git a/js/ui/status/remoteAccess.js b/js/ui/status/remoteAccess.js -new file mode 100644 -index 000000000..ffa334001 ---- /dev/null -+++ b/js/ui/status/remoteAccess.js -@@ -0,0 +1,80 @@ -+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- -+ -+const Lang = imports.lang; -+const Meta = imports.gi.Meta; -+ -+const PanelMenu = imports.ui.panelMenu; -+const PopupMenu = imports.ui.popupMenu; -+ -+var RemoteAccessApplet = new Lang.Class({ -+ Name: 'RemoteAccessApplet', -+ Extends: PanelMenu.SystemIndicator, -+ -+ _init() { -+ this.parent(); -+ -+ let backend = Meta.get_backend(); -+ let controller = backend.get_remote_access_controller(); -+ -+ if (!controller) -+ return; -+ -+ // We can't possibly know about all types of screen sharing on X11, so -+ // showing these controls on X11 might give a false sense of security. -+ // Thus, only enable these controls when using Wayland, where we are -+ // in control of sharing. -+ if (!Meta.is_wayland_compositor()) -+ return; -+ -+ this._handles = new Set(); -+ this._indicator = null; -+ this._menuSection = null; -+ -+ controller.connect('new-handle', (controller, handle) => { -+ this._onNewHandle(handle); -+ }); -+ }, -+ -+ _ensureControls() { -+ if (this._indicator) -+ return; -+ -+ this._indicator = this._addIndicator(); -+ this._indicator.icon_name = 'screen-shared-symbolic'; -+ this._item = -+ new PopupMenu.PopupSubMenuMenuItem(_("Screen is Being Shared"), -+ true); -+ this._item.menu.addAction(_("Turn off"), -+ () => { -+ for (let handle of this._handles) -+ handle.stop(); -+ }); -+ this._item.icon.icon_name = 'screen-shared-symbolic'; -+ this.menu.addMenuItem(this._item); -+ }, -+ -+ _sync() { -+ if (this._handles.size == 0) { -+ this._indicator.visible = false; -+ this._item.actor.visible = false; -+ } else { -+ this._indicator.visible = true; -+ this._item.actor.visible = true; -+ } -+ }, -+ -+ _onStopped(handle) { -+ this._handles.delete(handle); -+ this._sync(); -+ }, -+ -+ _onNewHandle(handle) { -+ this._handles.add(handle); -+ handle.connect('stopped', this._onStopped.bind(this)); -+ -+ if (this._handles.size == 1) { -+ this._ensureControls(); -+ this._sync(); -+ } -+ }, -+}); --- -2.17.1 - diff --git a/SOURCES/0001-altSwitcher-Fix-error-when-all-alternatives-are-disa.patch b/SOURCES/0001-altSwitcher-Fix-error-when-all-alternatives-are-disa.patch deleted file mode 100644 index 62f45d3..0000000 --- a/SOURCES/0001-altSwitcher-Fix-error-when-all-alternatives-are-disa.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 8f66d508bad63412f61d2162bb05224ee1637ab1 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -Date: Fri, 16 Nov 2018 11:39:08 +0100 -Subject: [PATCH] altSwitcher: Fix error when all alternatives are disabled - -While we do consider the case that we don't have a child to show for the -visibility, we are still trying to move the click action unconditionally. - -https://gitlab.gnome.org/GNOME/gnome-shell/issues/783 ---- - js/ui/status/system.js | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/js/ui/status/system.js b/js/ui/status/system.js -index 68a0b4b5b..cd6f3d8b0 100644 ---- a/js/ui/status/system.js -+++ b/js/ui/status/system.js -@@ -58,6 +58,9 @@ var AltSwitcher = new Lang.Class({ - childToShow = this._standard; - } else if (this._alternate.visible) { - childToShow = this._alternate; -+ } else { -+ this.actor.hide(); -+ return; - } - - let childShown = this.actor.get_child(); -@@ -79,7 +82,7 @@ var AltSwitcher = new Lang.Class({ - global.sync_pointer(); - } - -- this.actor.visible = (childToShow != null); -+ this.actor.show(); - }, - - _onDestroy() { --- -2.20.1 - diff --git a/SOURCES/0001-animation-fix-unintentional-loop-while-polkit-dialog.patch b/SOURCES/0001-animation-fix-unintentional-loop-while-polkit-dialog.patch new file mode 100644 index 0000000..748b73f --- /dev/null +++ b/SOURCES/0001-animation-fix-unintentional-loop-while-polkit-dialog.patch @@ -0,0 +1,40 @@ +From 34e6bbeebef37ae688ca0527bde03fa26b143bb7 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Thu, 27 Jun 2019 14:27:34 -0400 +Subject: [PATCH] animation: fix unintentional loop while polkit dialog is + active + +The polkit password dialog has a spinner that gets displayed +while the users password is being verified. + +Unfortunately, the spinner stop method unintentionally calls +back into itself after the stop fade out animation is complete. +The stop method is called at startup, so the looping begins as +soon as the dialog is visible and continues until the dialog is +dismissed. + +This commit fixes the loop by having the stop method cease +calling itself, and instead having it call the stop method on the +superclass. + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/602 +--- + js/ui/animation.js | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/js/ui/animation.js b/js/ui/animation.js +index c21b22565..58d7f4018 100644 +--- a/js/ui/animation.js ++++ b/js/ui/animation.js +@@ -162,7 +162,7 @@ var Spinner = class extends AnimatedIcon { + time: SPINNER_ANIMATION_TIME, + transition: 'linear', + onComplete: () => { +- this.stop(false); ++ super.stop(); + } + }); + } else { +-- +2.21.0 + diff --git a/SOURCES/0001-app-Close-all-closable-windows-from-quit.patch b/SOURCES/0001-app-Close-all-closable-windows-from-quit.patch deleted file mode 100644 index 0088eba..0000000 --- a/SOURCES/0001-app-Close-all-closable-windows-from-quit.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 9b8a85d42d1c74f6a0815d23a484af3883284538 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -Date: Mon, 3 Sep 2018 17:10:27 +0200 -Subject: [PATCH] app: Close all closable windows from quit() - -There's no relation between a window being hidden from overview/taskbars -and a window not being closable - currently we effectively disable the -fallback quit action for any application with open transients, which -simply doesn't make sense. - -Instead, only exclude windows for which the close action has been -explicitly disabled. - -https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/217 ---- - src/shell-app.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/shell-app.c b/src/shell-app.c -index 84fcc97bf..1a6d5888d 100644 ---- a/src/shell-app.c -+++ b/src/shell-app.c -@@ -1159,7 +1159,7 @@ shell_app_request_quit (ShellApp *app) - { - MetaWindow *win = iter->data; - -- if (meta_window_is_skip_taskbar (win)) -+ if (!meta_window_can_close (win)) - continue; - - meta_window_delete (win, shell_global_get_current_time (shell_global_get ())); --- -2.20.1 - diff --git a/SOURCES/0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch b/SOURCES/0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch index dab20cc..77f7cb1 100644 --- a/SOURCES/0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch +++ b/SOURCES/0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch @@ -1,4 +1,4 @@ -From e4049af3ca6fa37b5d8b09e6bdcbb32e3d9b0849 Mon Sep 17 00:00:00 2001 +From 23755cc20f3c05b97f769e27553f2ab482d60137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Wed, 20 May 2015 16:44:00 +0200 Subject: [PATCH] app: Fall back to window title instead of WM_CLASS @@ -11,10 +11,10 @@ a .desktop file ... 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shell-app.c b/src/shell-app.c -index dbf537ce9..84fcc97bf 100644 +index 10efa9135..7d40186c9 100644 --- a/src/shell-app.c +++ b/src/shell-app.c -@@ -265,7 +265,7 @@ shell_app_get_name (ShellApp *app) +@@ -259,7 +259,7 @@ shell_app_get_name (ShellApp *app) const char *name = NULL; if (window) @@ -24,5 +24,5 @@ index dbf537ce9..84fcc97bf 100644 name = C_("program", "Unknown"); return name; -- -2.20.1 +2.21.0 diff --git a/SOURCES/0001-appDisplay-Show-full-app-name-on-hover.patch b/SOURCES/0001-appDisplay-Show-full-app-name-on-hover.patch index 934965a..ddd3d97 100644 --- a/SOURCES/0001-appDisplay-Show-full-app-name-on-hover.patch +++ b/SOURCES/0001-appDisplay-Show-full-app-name-on-hover.patch @@ -1,4 +1,4 @@ -From fb3165447d4dac048d0b085bf0266027da66df2c Mon Sep 17 00:00:00 2001 +From a1c35ebb8f29103035526e6f48eba4ff37551964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Thu, 21 Jun 2018 18:03:31 +0200 Subject: [PATCH] appDisplay: Show full app name on hover @@ -9,10 +9,10 @@ Subject: [PATCH] appDisplay: Show full app name on hover 2 files changed, 56 insertions(+) diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss -index f1aaea689..5bf01a540 100644 +index 3b0d2bf04..293ea2ab9 100644 --- a/data/theme/gnome-shell-sass/_common.scss +++ b/data/theme/gnome-shell-sass/_common.scss -@@ -1402,6 +1402,14 @@ StScrollBar { +@@ -1411,6 +1411,14 @@ StScrollBar { } @@ -28,10 +28,10 @@ index f1aaea689..5bf01a540 100644 width: 10px; height: 3px; background-color: $selected_bg_color; diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js -index 74c772d50..070057c69 100644 +index adaefa7dd..a07db6573 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js -@@ -1628,6 +1628,20 @@ var AppIcon = new Lang.Class({ +@@ -1478,6 +1478,20 @@ var AppIcon = class AppIcon { this.actor.connect('clicked', this._onClicked.bind(this)); this.actor.connect('popup-menu', this._onKeyboardPopupMenu.bind(this)); @@ -52,7 +52,7 @@ index 74c772d50..070057c69 100644 this._menu = null; this._menuManager = new PopupMenu.PopupMenuManager(this); -@@ -1659,12 +1673,39 @@ var AppIcon = new Lang.Class({ +@@ -1509,12 +1523,39 @@ var AppIcon = class AppIcon { this.app.disconnect(this._stateChangedId); this._stateChangedId = 0; this._removeMenuTimeout(); @@ -60,11 +60,11 @@ index 74c772d50..070057c69 100644 + if (this._hoverText) + this._hoverText.destroy(); + this._hoverText = null; - }, + } _createIcon(iconSize) { return this.app.create_icon_texture(iconSize); - }, + } + _syncHoverText() { + if (this.shouldShowTooltip()) { @@ -87,25 +87,25 @@ index 74c772d50..070057c69 100644 + this._removeHoverTimeout(); + this._hoverText.hide(); + } -+ }, ++ } + _removeMenuTimeout() { if (this._menuTimeoutId > 0) { Mainloop.source_remove(this._menuTimeoutId); -@@ -1672,6 +1713,13 @@ var AppIcon = new Lang.Class({ +@@ -1522,6 +1563,13 @@ var AppIcon = class AppIcon { } - }, + } + _removeHoverTimeout() { + if (this._hoverTimeoutId > 0) { + Mainloop.source_remove(this._hoverTimeoutId); + this._hoverTimeoutId = 0; + } -+ }, ++ } + _updateRunningStyle() { if (this.app.state != Shell.AppState.STOPPED) this._dot.show(); -- -2.20.1 +2.21.0 diff --git a/SOURCES/0001-background-refresh-after-suspend-on-wayland.patch b/SOURCES/0001-background-refresh-after-suspend-on-wayland.patch index f0c4f57..ffcbca0 100644 --- a/SOURCES/0001-background-refresh-after-suspend-on-wayland.patch +++ b/SOURCES/0001-background-refresh-after-suspend-on-wayland.patch @@ -1,4 +1,4 @@ -From 2d63749878c1afa7d83a44c4d5e6c1aec3414b71 Mon Sep 17 00:00:00 2001 +From 165fc5147cd2c9bf4bc10a1c5a9a940ec4ddd8d9 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 15 Jan 2019 12:51:16 -0500 Subject: [PATCH 1/4] background: refresh after suspend on wayland @@ -11,37 +11,10 @@ We need to do it on wayland, too. 1 file changed, 3 deletions(-) diff --git a/src/shell-util.c b/src/shell-util.c -index 70b8c0611..c43bf4cc5 100644 +index 31bb18e70..c6e5abed6 100644 --- a/src/shell-util.c +++ b/src/shell-util.c -@@ -372,63 +372,60 @@ shell_util_cursor_tracker_to_clutter (MetaCursorTracker *tracker, - clutter_actor_show (CLUTTER_ACTOR (texture)); - clutter_texture_set_cogl_texture (texture, sprite); - } - else - { - clutter_actor_hide (CLUTTER_ACTOR (texture)); - } - } - - typedef const gchar *(*ShellGLGetString) (GLenum); - - static const gchar * - get_gl_vendor (void) - { - static const gchar *vendor = NULL; - - if (!vendor) - { - ShellGLGetString gl_get_string; - gl_get_string = (ShellGLGetString) cogl_get_proc_address ("glGetString"); - if (gl_get_string) - vendor = gl_get_string (GL_VENDOR); - } - - return vendor; - } - +@@ -395,9 +395,6 @@ get_gl_vendor (void) gboolean shell_util_need_background_refresh (void) { @@ -51,33 +24,6 @@ index 70b8c0611..c43bf4cc5 100644 if (g_strcmp0 (get_gl_vendor (), "NVIDIA Corporation") == 0) return TRUE; - return FALSE; - } - - static gboolean - canvas_draw_cb (ClutterContent *content, - cairo_t *cr, - gint width, - gint height, - gpointer user_data) - { - cairo_surface_t *surface = user_data; - - cairo_set_source_surface (cr, surface, 0, 0); - cairo_paint (cr); - - return FALSE; - } - - /** - * shell_util_get_content_for_window_actor: - * @window_actor: a #MetaWindowActor - * @window_rect: a #MetaRectangle - * - * Returns: (transfer full): a new #ClutterContent - */ - ClutterContent * - shell_util_get_content_for_window_actor (MetaWindowActor *window_actor, -- -2.18.1 +2.21.0 diff --git a/SOURCES/0001-data-install-process-working.svg-to-filesystem.patch b/SOURCES/0001-data-install-process-working.svg-to-filesystem.patch index e855e02..9782372 100644 --- a/SOURCES/0001-data-install-process-working.svg-to-filesystem.patch +++ b/SOURCES/0001-data-install-process-working.svg-to-filesystem.patch @@ -1,4 +1,4 @@ -From 23a06b9b965f6de4d58d3addf2a73dd7b6c15e29 Mon Sep 17 00:00:00 2001 +From 1dcae7bbba222a1c8bdfc2d76a9f716e638b0334 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 8 Jun 2017 12:04:31 -0400 Subject: [PATCH] data: install process-working.svg to filesystem @@ -21,17 +21,17 @@ index 22bae3dd2..d5acb8d10 100644 + +install_data('process-working.svg', install_dir: themedir) diff --git a/meson.build b/meson.build -index 663a4d06f..353eff05a 100644 +index 21a80bcc8..0acaba705 100644 --- a/meson.build +++ b/meson.build -@@ -56,6 +56,7 @@ mozplugindir = join_paths(libdir, 'mozilla', 'plugins') +@@ -57,6 +57,7 @@ localedir = join_paths(datadir, 'locale') portaldir = join_paths(datadir, 'xdg-desktop-portal', 'portals') schemadir = join_paths(datadir, 'glib-2.0', 'schemas') servicedir = join_paths(datadir, 'dbus-1', 'services') +themedir = join_paths(pkgdatadir, 'theme') - plugindir = get_variable('BROWSER_PLUGIN_DIR', mozplugindir) - + # XXX: Once https://github.com/systemd/systemd/issues/9595 is fixed and we can + # depend on this version, replace with something like: -- -2.20.1 +2.21.0 diff --git a/SOURCES/0001-extensionSystem-Notify-about-extension-issues-on-upd.patch b/SOURCES/0001-extensionSystem-Notify-about-extension-issues-on-upd.patch index fff3c71..e5efa14 100644 --- a/SOURCES/0001-extensionSystem-Notify-about-extension-issues-on-upd.patch +++ b/SOURCES/0001-extensionSystem-Notify-about-extension-issues-on-upd.patch @@ -1,25 +1,28 @@ -From 45730de08bf34ac5e3e55eeac843bf640af031bb Mon Sep 17 00:00:00 2001 +From d1a20dc80c3414ba4cb7bf839a25de49d30ab400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Mon, 21 Sep 2015 20:18:12 +0200 Subject: [PATCH] extensionSystem: Notify about extension issues on update --- - js/ui/extensionSystem.js | 32 ++++++++++++++++++++++++++++++++ - 1 file changed, 32 insertions(+) + js/ui/extensionSystem.js | 34 +++++++++++++++++++++++++++++++++- + 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js -index a013a3ee7..9b6fcb60b 100644 +index 9ffdb4f3d..eb820ba4f 100644 --- a/js/ui/extensionSystem.js +++ b/js/ui/extensionSystem.js -@@ -7,6 +7,7 @@ const GLib = imports.gi.GLib; - const Gio = imports.gi.Gio; - const St = imports.gi.St; +@@ -1,8 +1,9 @@ + // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +-const { Gio, St } = imports.gi; ++const { Gio, GLib, St } = imports.gi; + const Signals = imports.signals; +const Config = imports.misc.config; const ExtensionUtils = imports.misc.extensionUtils; const Main = imports.ui.main; -@@ -306,6 +307,36 @@ function _onVersionValidationChanged() { +@@ -312,6 +313,36 @@ function _onVersionValidationChanged() { } } @@ -56,7 +59,7 @@ index a013a3ee7..9b6fcb60b 100644 function _loadExtensions() { global.settings.connect('changed::' + ENABLED_EXTENSIONS_KEY, onEnabledExtensionsChanged); global.settings.connect('changed::' + DISABLE_USER_EXTENSIONS_KEY, onEnabledExtensionsChanged); -@@ -320,6 +351,7 @@ function _loadExtensions() { +@@ -326,6 +357,7 @@ function _loadExtensions() { extension.type = ExtensionUtils.ExtensionType.SESSION_MODE; }); finder.scanExtensions(); @@ -65,5 +68,5 @@ index a013a3ee7..9b6fcb60b 100644 function enableAllExtensions() { -- -2.20.1 +2.21.0 diff --git a/SOURCES/0001-extensions-Add-a-SESSION_MODE-extension-type.patch b/SOURCES/0001-extensions-Add-a-SESSION_MODE-extension-type.patch index d7b04e1..dc7619b 100644 --- a/SOURCES/0001-extensions-Add-a-SESSION_MODE-extension-type.patch +++ b/SOURCES/0001-extensions-Add-a-SESSION_MODE-extension-type.patch @@ -1,4 +1,4 @@ -From 55bd98676e92f181c85813b1d16e92a9769c901f Mon Sep 17 00:00:00 2001 +From 720eb83ba0b0e5e37185d7e7ed86fe9175cf18f4 Mon Sep 17 00:00:00 2001 From: Rui Matos Date: Fri, 8 Nov 2013 13:58:09 +0100 Subject: [PATCH] extensions: Add a SESSION_MODE extension type @@ -11,7 +11,7 @@ different way since they can't be disabled. 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/js/misc/extensionUtils.js b/js/misc/extensionUtils.js -index 9f77b4c40..1e25da335 100644 +index cf308b31f..fb1e2b506 100644 --- a/js/misc/extensionUtils.js +++ b/js/misc/extensionUtils.js @@ -13,7 +13,8 @@ const FileUtils = imports.misc.fileUtils; @@ -25,10 +25,10 @@ index 9f77b4c40..1e25da335 100644 // Maps uuid -> metadata object diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js -index e35c01ab8..a013a3ee7 100644 +index 6244c39b4..9ffdb4f3d 100644 --- a/js/ui/extensionSystem.js +++ b/js/ui/extensionSystem.js -@@ -316,6 +316,8 @@ function _loadExtensions() { +@@ -322,6 +322,8 @@ function _loadExtensions() { let finder = new ExtensionUtils.ExtensionFinder(); finder.connect('extension-found', (finder, extension) => { loadExtension(extension); @@ -38,5 +38,5 @@ index e35c01ab8..a013a3ee7 100644 finder.scanExtensions(); } -- -2.20.1 +2.21.0 diff --git a/SOURCES/0001-gdm-add-AuthList-control.patch b/SOURCES/0001-gdm-add-AuthList-control.patch index e681ed6..0ca4a8f 100644 --- a/SOURCES/0001-gdm-add-AuthList-control.patch +++ b/SOURCES/0001-gdm-add-AuthList-control.patch @@ -1,4 +1,4 @@ -From e2e03a9e78b63712fd2c322d4f1aaab6ba1fdc7f Mon Sep 17 00:00:00 2001 +From 592bf9b4ba879a365375a7edcb6c48258386e413 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 18 Jul 2017 12:58:14 -0400 Subject: [PATCH 1/2] gdm: add AuthList control @@ -221,7 +221,7 @@ index 000000000..fc1c3d6e4 +}); +Signals.addSignalMethods(AuthList.prototype); diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml -index 883b62d66..58035d303 100644 +index 836d1c674..002b202f8 100644 --- a/js/js-resources.gresource.xml +++ b/js/js-resources.gresource.xml @@ -1,6 +1,7 @@ @@ -233,5 +233,5 @@ index 883b62d66..58035d303 100644 gdm/batch.js gdm/fingerprint.js -- -2.20.1 +2.21.0 diff --git a/SOURCES/0001-global-Allow-overriding-the-override-schema.patch b/SOURCES/0001-global-Allow-overriding-the-override-schema.patch deleted file mode 100644 index 1667362..0000000 --- a/SOURCES/0001-global-Allow-overriding-the-override-schema.patch +++ /dev/null @@ -1,115 +0,0 @@ -From 1a614826eea7ba5da2796e0eb3b62a6bb7609040 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -Date: Wed, 11 Oct 2017 00:36:18 +0200 -Subject: [PATCH] global: Allow overriding the override schema - ---- - src/main.c | 11 ++++++++++- - src/shell-global.c | 20 +++++++++++++++++++- - 2 files changed, 29 insertions(+), 2 deletions(-) - -diff --git a/src/main.c b/src/main.c -index 857877b0b..6ebea4809 100644 ---- a/src/main.c -+++ b/src/main.c -@@ -38,6 +38,7 @@ extern GType gnome_shell_plugin_get_type (void); - - static gboolean is_gdm_mode = FALSE; - static char *session_mode = NULL; -+static char *override_schema = NULL; - static int caught_signal = 0; - - #define DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER 1 -@@ -450,6 +451,12 @@ GOptionEntry gnome_shell_options[] = { - N_("List possible modes"), - NULL - }, -+ { -+ "override-schema", 0, 0, G_OPTION_ARG_STRING, -+ &override_schema, -+ N_("Override the override schema"), -+ "SCHEMA" -+ }, - { NULL } - }; - -@@ -507,7 +514,9 @@ main (int argc, char **argv) - if (session_mode == NULL) - session_mode = is_gdm_mode ? (char *)"gdm" : (char *)"user"; - -- _shell_global_init ("session-mode", session_mode, NULL); -+ _shell_global_init ("session-mode", session_mode, -+ "override-schema", override_schema, -+ NULL); - - shell_prefs_init (); - -diff --git a/src/shell-global.c b/src/shell-global.c -index c67ac4e4a..961fd3a70 100644 ---- a/src/shell-global.c -+++ b/src/shell-global.c -@@ -65,6 +65,7 @@ struct _ShellGlobal { - MetaScreen *meta_screen; - - char *session_mode; -+ char *override_schema; - - XserverRegion input_region; - -@@ -96,6 +97,7 @@ enum { - PROP_0, - - PROP_SESSION_MODE, -+ PROP_OVERRIDE_SCHEMA, - PROP_SCREEN, - PROP_DISPLAY, - PROP_SCREEN_WIDTH, -@@ -138,6 +140,10 @@ shell_global_set_property(GObject *object, - g_clear_pointer (&global->session_mode, g_free); - global->session_mode = g_ascii_strdown (g_value_get_string (value), -1); - break; -+ case PROP_OVERRIDE_SCHEMA: -+ g_clear_pointer (&global->override_schema, g_free); -+ global->override_schema = g_value_dup_string (value); -+ break; - case PROP_FRAME_TIMESTAMPS: - global->frame_timestamps = g_value_get_boolean (value); - break; -@@ -163,6 +169,9 @@ shell_global_get_property(GObject *object, - case PROP_SESSION_MODE: - g_value_set_string (value, shell_global_get_session_mode (global)); - break; -+ case PROP_OVERRIDE_SCHEMA: -+ g_value_set_string (value, global->override_schema); -+ break; - case PROP_SCREEN: - g_value_set_object (value, global->meta_screen); - break; -@@ -368,6 +377,13 @@ shell_global_class_init (ShellGlobalClass *klass) - g_param_spec_string ("session-mode", - "Session Mode", - "The session mode to use", -+ NULL, -+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); -+ g_object_class_install_property (gobject_class, -+ PROP_OVERRIDE_SCHEMA, -+ g_param_spec_string ("override-schema", -+ "Override Schema", -+ "The override schema to use", - "user", - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (gobject_class, -@@ -1360,7 +1376,9 @@ shell_global_get_overrides_settings (ShellGlobal *global) - - if (!settings) - { -- if (strcmp (global->session_mode, "classic") == 0) -+ if (global->override_schema != NULL) -+ schema = global->override_schema; -+ else if (strcmp (global->session_mode, "classic") == 0) - schema = "org.gnome.shell.extensions.classic-overrides"; - else if (strcmp (global->session_mode, "user") == 0) - schema = "org.gnome.shell.overrides"; --- -2.20.1 - diff --git a/SOURCES/0001-keyboardManager-Avoid-idempotent-calls-to-meta_backe.patch b/SOURCES/0001-keyboardManager-Avoid-idempotent-calls-to-meta_backe.patch deleted file mode 100644 index 305119f..0000000 --- a/SOURCES/0001-keyboardManager-Avoid-idempotent-calls-to-meta_backe.patch +++ /dev/null @@ -1,65 +0,0 @@ -From d9f64462b40125d5b1728c6d276811d6c4bbfb80 Mon Sep 17 00:00:00 2001 -From: Carlos Garnacho -Date: Tue, 23 Oct 2018 00:06:36 +0200 -Subject: [PATCH] keyboardManager: Avoid idempotent calls to - meta_backend_set_keymap() - -But still try to apply the keymap whenever the input sources changed. This -is a different approach to gnome-shell#240 that still avoid redundant -changes to the current keymap, but actually trigger one when input sources -are added. - -https://bugzilla.redhat.com/show_bug.cgi?id=1637418 - -Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/691 ---- - js/misc/keyboardManager.js | 14 +++++++++----- - 1 file changed, 9 insertions(+), 5 deletions(-) - -diff --git a/js/misc/keyboardManager.js b/js/misc/keyboardManager.js -index ae59f0014..f4001f130 100644 ---- a/js/misc/keyboardManager.js -+++ b/js/misc/keyboardManager.js -@@ -52,11 +52,20 @@ var KeyboardManager = new Lang.Class({ - this._current = null; - this._localeLayoutInfo = this._getLocaleLayout(); - this._layoutInfos = {}; -+ this._currentKeymap = null; - }, - - _applyLayoutGroup(group) { - let options = this._buildOptionsString(); - let [layouts, variants] = this._buildGroupStrings(group); -+ -+ if (this._currentKeymap && -+ this._currentKeymap.layouts == layouts && -+ this._currentKeymap.variants == variants && -+ this._currentKeymap.options == options) -+ return; -+ -+ this._currentKeymap = {layouts, variants, options}; - Meta.get_backend().set_keymap(layouts, variants, options); - }, - -@@ -89,8 +98,6 @@ var KeyboardManager = new Lang.Class({ - }, - - setUserLayouts(ids) { -- let currentId = this._current ? this._current.id : null; -- let currentGroupIndex = this._current ? this._current.groupIndex : null; - this._current = null; - this._layoutInfos = {}; - -@@ -117,9 +124,6 @@ var KeyboardManager = new Lang.Class({ - info.group = group; - info.groupIndex = groupIndex; - -- if (currentId == id && currentGroupIndex == groupIndex) -- this._current = info; -- - i += 1; - } - }, --- -2.20.1 - diff --git a/SOURCES/0001-layout-Make-the-hot-corner-optional.patch b/SOURCES/0001-layout-Make-the-hot-corner-optional.patch new file mode 100644 index 0000000..c77310c --- /dev/null +++ b/SOURCES/0001-layout-Make-the-hot-corner-optional.patch @@ -0,0 +1,56 @@ +From 35cbad572120125d3b823f37d2100b2beee4c1d8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Thu, 8 Jun 2017 17:07:56 +0200 +Subject: [PATCH] layout: Make the hot corner optional + +Whether people love or hate the hot corner depends in large extents +on hardware sensitivity and habits, which is hard to get right +universally. So bite the bullet and support an option to enable or +disable hot corners ... + +https://bugzilla.gnome.org/show_bug.cgi?id=688320 +--- + js/ui/layout.js | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/js/ui/layout.js b/js/ui/layout.js +index 2b3bb7442..beb4c0a5d 100644 +--- a/js/ui/layout.js ++++ b/js/ui/layout.js +@@ -1,6 +1,6 @@ + // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +-const { Clutter, GLib, GObject, Meta, Shell, St } = imports.gi; ++const { Clutter, Gio, GLib, GObject, Meta, Shell, St } = imports.gi; + const Signals = imports.signals; + + const Background = imports.ui.background; +@@ -267,6 +267,13 @@ var LayoutManager = GObject.registerClass({ + this._backgroundGroup.lower_bottom(); + this._bgManagers = []; + ++ this._interfaceSettings = new Gio.Settings({ ++ schema_id: 'org.gnome.desktop.interface' ++ }); ++ ++ this._interfaceSettings.connect('changed::enable-hot-corners', ++ this._updateHotCorners.bind(this)); ++ + // Need to update struts on new workspaces when they are added + let workspaceManager = global.workspace_manager; + workspaceManager.connect('notify::n-workspaces', +@@ -358,6 +365,11 @@ var LayoutManager = GObject.registerClass({ + }); + this.hotCorners = []; + ++ if (!this._interfaceSettings.get_boolean('enable-hot-corners')) { ++ this.emit('hot-corners-changed'); ++ return; ++ } ++ + let size = this.panelBox.height; + + // build new hot corners +-- +2.21.0 + diff --git a/SOURCES/0001-loginDialog-make-info-messages-themed.patch b/SOURCES/0001-loginDialog-make-info-messages-themed.patch index b17c624..483f615 100644 --- a/SOURCES/0001-loginDialog-make-info-messages-themed.patch +++ b/SOURCES/0001-loginDialog-make-info-messages-themed.patch @@ -1,4 +1,4 @@ -From 297959c1a7bcf5e0b24c5215cfc94042da490d4f Mon Sep 17 00:00:00 2001 +From 9cfa56d4f3c5fe513630c58c09bd2421f3ca580b Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 26 Jun 2017 14:35:05 -0400 Subject: [PATCH] loginDialog: make info messages themed @@ -10,10 +10,10 @@ show up invisible. 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss -index 4e82ef58b..ee643c440 100644 +index c2df28279..a382ce561 100644 --- a/data/theme/gnome-shell-sass/_common.scss +++ b/data/theme/gnome-shell-sass/_common.scss -@@ -1769,7 +1769,12 @@ StScrollBar { +@@ -1801,7 +1801,12 @@ StScrollBar { .login-dialog-banner { color: darken($osd_fg_color,10%); } .login-dialog-button-box { spacing: 5px; } .login-dialog-message-warning { color: $warning_color; } @@ -28,5 +28,5 @@ index 4e82ef58b..ee643c440 100644 .login-dialog-not-listed-label { padding-left: 2px; -- -2.20.1 +2.21.0 diff --git a/SOURCES/0001-osdWindow-Disconnect-signals-on-destroy.patch b/SOURCES/0001-osdWindow-Disconnect-signals-on-destroy.patch deleted file mode 100644 index 221cc12..0000000 --- a/SOURCES/0001-osdWindow-Disconnect-signals-on-destroy.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 952ad185cc54eea2e9915b8d93dded1ac0ddf8ac Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -Date: Sun, 23 Sep 2018 03:06:21 +0200 -Subject: [PATCH] osdWindow: Disconnect signals on destroy - -Since we started to show OSD windows on all monitors, OSD windows are -destroyed when the corresponding monitor is disconnected. We shouldn't -leave any signal handlers around in that case - they prevent the object -from being garbage collected, and trigger warnings for accessing proper- -ties of invalidated GObjects. - -https://gitlab.gnome.org/GNOME/gnome-shell/issues/602 ---- - js/ui/osdWindow.js | 23 +++++++++++++++++++---- - 1 file changed, 19 insertions(+), 4 deletions(-) - -diff --git a/js/ui/osdWindow.js b/js/ui/osdWindow.js -index a73912413..97e0498a7 100644 ---- a/js/ui/osdWindow.js -+++ b/js/ui/osdWindow.js -@@ -108,15 +108,30 @@ var OsdWindow = new Lang.Class({ - 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; - }, --- -2.20.1 - diff --git a/SOURCES/0001-panel-add-an-icon-to-the-ActivitiesButton.patch b/SOURCES/0001-panel-add-an-icon-to-the-ActivitiesButton.patch index 2e06799..24c0d81 100644 --- a/SOURCES/0001-panel-add-an-icon-to-the-ActivitiesButton.patch +++ b/SOURCES/0001-panel-add-an-icon-to-the-ActivitiesButton.patch @@ -1,4 +1,4 @@ -From 2fbce93b61f2a59871910c46f1e99ef28146a6db Mon Sep 17 00:00:00 2001 +From aadb0e19999c339ac1d6501a2e52b363e57e26ef Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 15 Jan 2014 16:45:34 -0500 Subject: [PATCH] panel: add an icon to the ActivitiesButton @@ -10,10 +10,10 @@ Requested by brand 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss -index ee643c440..f1aaea689 100644 +index a382ce561..3b0d2bf04 100644 --- a/data/theme/gnome-shell-sass/_common.scss +++ b/data/theme/gnome-shell-sass/_common.scss -@@ -776,6 +776,11 @@ StScrollBar { +@@ -769,6 +769,11 @@ StScrollBar { //dimensions of the icon are hardcoded } @@ -22,14 +22,14 @@ index ee643c440..f1aaea689 100644 + icon-size: 1em; + } + - .system-status-icon, - .app-menu-icon > StIcon, - .popup-menu-arrow { + &:hover { + color: lighten($fg_color, 10%); + } diff --git a/js/ui/panel.js b/js/ui/panel.js -index 2f593247d..d1a572503 100644 +index 16484850a..ede1c2b82 100644 --- a/js/ui/panel.js +++ b/js/ui/panel.js -@@ -406,11 +406,18 @@ var ActivitiesButton = new Lang.Class({ +@@ -465,11 +465,18 @@ class ActivitiesButton extends PanelMenu.Button { this.actor.name = 'panelActivities'; @@ -50,5 +50,5 @@ index 2f593247d..d1a572503 100644 this.actor.label_actor = this._label; -- -2.20.1 +2.21.0 diff --git a/SOURCES/0001-screenShield-unblank-when-inserting-smartcard.patch b/SOURCES/0001-screenShield-unblank-when-inserting-smartcard.patch index 9454bc3..3dc3cb9 100644 --- a/SOURCES/0001-screenShield-unblank-when-inserting-smartcard.patch +++ b/SOURCES/0001-screenShield-unblank-when-inserting-smartcard.patch @@ -1,4 +1,4 @@ -From 7d34369b7a011a3a0377f19d342e1663a04d6027 Mon Sep 17 00:00:00 2001 +From cacce594f07295bb1b9e0685913a287e3cea2453 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 3 Jul 2015 13:54:36 -0400 Subject: [PATCH] screenShield: unblank when inserting smartcard @@ -13,10 +13,10 @@ action to get the screen to unblank. 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js -index 2d8d9b3f6..ebba6c82a 100644 +index a005a206b..cd38f11fc 100644 --- a/js/ui/screenShield.js +++ b/js/ui/screenShield.js -@@ -515,8 +515,10 @@ var ScreenShield = new Lang.Class({ +@@ -513,8 +513,10 @@ var ScreenShield = class { this._smartcardManager = SmartcardManager.getSmartcardManager(); this._smartcardManager.connect('smartcard-inserted', (manager, token) => { @@ -29,5 +29,5 @@ index 2d8d9b3f6..ebba6c82a 100644 this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager(); -- -2.20.1 +2.21.0 diff --git a/SOURCES/0001-shellDBus-Add-a-DBus-method-to-load-a-single-extensi.patch b/SOURCES/0001-shellDBus-Add-a-DBus-method-to-load-a-single-extensi.patch index 7387a43..5649937 100644 --- a/SOURCES/0001-shellDBus-Add-a-DBus-method-to-load-a-single-extensi.patch +++ b/SOURCES/0001-shellDBus-Add-a-DBus-method-to-load-a-single-extensi.patch @@ -1,4 +1,4 @@ -From f6023e2f4ae939a03bb9285e32444be909340bcf Mon Sep 17 00:00:00 2001 +From 660ebe0125b591355116934ee57b08010e05246c Mon Sep 17 00:00:00 2001 From: Rui Matos Date: Fri, 8 Nov 2013 11:36:04 +0100 Subject: [PATCH] shellDBus: Add a DBus method to load a single extension @@ -6,27 +6,41 @@ Subject: [PATCH] shellDBus: Add a DBus method to load a single extension This allows e.g. gnome-tweak-tool to install an extension from a zip file and load it into the running shell. --- - js/ui/shellDBus.js | 20 ++++++++++++++++++++ - 1 file changed, 20 insertions(+) + .../org.gnome.Shell.Extensions.xml | 13 +++++++++++++ + js/ui/shellDBus.js | 16 ++++++++++++++++ + 2 files changed, 29 insertions(+) +diff --git a/data/dbus-interfaces/org.gnome.Shell.Extensions.xml b/data/dbus-interfaces/org.gnome.Shell.Extensions.xml +index 34a65af44..ce69439fc 100644 +--- a/data/dbus-interfaces/org.gnome.Shell.Extensions.xml ++++ b/data/dbus-interfaces/org.gnome.Shell.Extensions.xml +@@ -189,6 +189,19 @@ + --> + + ++ ++ ++ ++ ++ ++ ++ + + + diff --git a/js/ui/shellDBus.js b/js/ui/shellDBus.js -index c35e7f19c..3a095ae5c 100644 +index 19d07acce..112d60feb 100644 --- a/js/ui/shellDBus.js +++ b/js/ui/shellDBus.js -@@ -322,6 +322,10 @@ const GnomeShellExtensionsIface = ' \ - \ - \ - \ -+ \ -+ \ -+ \ -+ \ - \ - \ - '; -@@ -424,6 +428,22 @@ var GnomeShellExtensions = new Lang.Class({ +@@ -341,6 +341,22 @@ var GnomeShellExtensions = class { ExtensionDownloader.checkForUpdates(); - }, + } + LoadUserExtension(uuid) { + let extension = ExtensionUtils.extensions[uuid]; @@ -42,11 +56,11 @@ index c35e7f19c..3a095ae5c 100644 + return false; + } + return true; -+ }, ++ } + - ShellVersion: Config.PACKAGE_VERSION, - - _extensionStateChanged(_, newState) { + get ShellVersion() { + return Config.PACKAGE_VERSION; + } -- -2.20.1 +2.21.0 diff --git a/SOURCES/0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch b/SOURCES/0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch index 5d064f2..810a27a 100644 --- a/SOURCES/0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch +++ b/SOURCES/0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch @@ -1,4 +1,4 @@ -From fc6c039871827fb7ec26362b39b515f438122af5 Mon Sep 17 00:00:00 2001 +From 20640a92f98e2145b9b6581209c978e9f6f78801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Tue, 14 Mar 2017 17:04:36 +0100 Subject: [PATCH] windowMenu: Bring back workspaces submenu for static @@ -9,24 +9,25 @@ moving to a specific workspace was intentionally left out; some people are quite attached to it though, so bring it back when static workspaces are used. --- - js/ui/windowMenu.js | 16 ++++++++++++++++ - 1 file changed, 16 insertions(+) + js/ui/windowMenu.js | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) diff --git a/js/ui/windowMenu.js b/js/ui/windowMenu.js -index f0e564b7e..8c97a1eec 100644 +index 628f145ea..f8eb4398c 100644 --- a/js/ui/windowMenu.js +++ b/js/ui/windowMenu.js -@@ -123,6 +123,22 @@ var WindowMenu = new Lang.Class({ +@@ -115,6 +115,23 @@ var WindowMenu = class extends PopupMenu.PopupMenu { window.change_workspace(workspace.get_neighbor(dir)); }); } + -+ let nWorkspaces = global.screen.n_workspaces; ++ let { workspaceManager } = global; ++ let nWorkspaces = workspaceManager.n_workspaces; + if (nWorkspaces > 1 && !Meta.prefs_get_dynamic_workspaces()) { + item = new PopupMenu.PopupSubMenuMenuItem(_("Move to another workspace")); + this.addMenuItem(item); + -+ let currentIndex = global.screen.get_active_workspace_index(); ++ let currentIndex = workspaceManager.get_active_workspace_index(); + for (let i = 0; i < nWorkspaces; i++) { + let index = i; + let name = Meta.prefs_get_workspace_name(i); @@ -40,5 +41,5 @@ index f0e564b7e..8c97a1eec 100644 } -- -2.20.1 +2.21.0 diff --git a/SOURCES/0001-workspacesView-Work-around-spurious-allocation-chang.patch b/SOURCES/0001-workspacesView-Work-around-spurious-allocation-chang.patch new file mode 100644 index 0000000..f51e8e2 --- /dev/null +++ b/SOURCES/0001-workspacesView-Work-around-spurious-allocation-chang.patch @@ -0,0 +1,37 @@ +From b69b404118852f7955f60d1814f5e19ad61ce449 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Fri, 12 Jul 2019 03:26:51 +0000 +Subject: [PATCH] workspacesView: Work around spurious allocation changes + +For some reason, people are still seeing those after commit d5ebd8c8. +While this is something we really should figure out, we can work around +the issue by keeping the view actors hidden until the update is complete. + +https://gitlab.gnome.org/GNOME/gnome-shell/issues/1065 +--- + js/ui/workspacesView.js | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js +index 069937d5a..e302296a6 100644 +--- a/js/ui/workspacesView.js ++++ b/js/ui/workspacesView.js +@@ -666,10 +666,15 @@ var WorkspacesDisplay = class { + this._scrollValueChanged.bind(this)); + } + ++ // HACK: Avoid spurious allocation changes while updating views ++ view.actor.hide(); ++ + this._workspacesViews.push(view); + Main.layoutManager.overviewGroup.add_actor(view.actor); + } + ++ this._workspacesViews.forEach(v => v.actor.show()); ++ + this._updateWorkspacesFullGeometry(); + this._updateWorkspacesActualGeometry(); + } +-- +2.21.0 + diff --git a/SOURCES/0002-background-rebuild-background-not-just-animation-on-.patch b/SOURCES/0002-background-rebuild-background-not-just-animation-on-.patch index 79c18b6..de5f77a 100644 --- a/SOURCES/0002-background-rebuild-background-not-just-animation-on-.patch +++ b/SOURCES/0002-background-rebuild-background-not-just-animation-on-.patch @@ -1,4 +1,4 @@ -From 2b3f696c8cde01f23bd16b8671de536ae0e001e4 Mon Sep 17 00:00:00 2001 +From 1a546d4df199f498b838efdccf081ada8ed1960b Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 15 Jan 2019 12:52:49 -0500 Subject: [PATCH 2/4] background: rebuild background, not just animation on @@ -14,37 +14,10 @@ so we should just do a full background change. 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/ui/background.js b/js/ui/background.js -index b24f82536..c61d946a4 100644 +index 06e038816..75b76a57e 100644 --- a/js/ui/background.js +++ b/js/ui/background.js -@@ -237,61 +237,61 @@ var Background = new Lang.Class({ - params = Params.parse(params, { monitorIndex: 0, - layoutManager: Main.layoutManager, - settings: null, - file: null, - style: null }); - - this.background = new Meta.Background({ meta_screen: global.screen }); - this.background._delegate = this; - - this._settings = params.settings; - this._file = params.file; - this._style = params.style; - this._monitorIndex = params.monitorIndex; - this._layoutManager = params.layoutManager; - this._fileWatches = {}; - this._cancellable = new Gio.Cancellable(); - this.isLoaded = false; - - this._clock = new GnomeDesktop.WallClock(); - this._timezoneChangedId = this._clock.connect('notify::timezone', - () => { - if (this._animation) - this._loadAnimation(this._animation.file); - }); - - let loginManager = LoginManager.getLoginManager(); - this._prepareForSleepId = loginManager.connect('prepare-for-sleep', +@@ -254,7 +254,7 @@ var Background = class Background { (lm, aboutToSuspend) => { if (aboutToSuspend) return; @@ -53,33 +26,6 @@ index b24f82536..c61d946a4 100644 }); this._settingsChangedSignalId = this._settings.connect('changed', () => { - this.emit('changed'); - }); - - this._load(); - }, - - destroy() { - this._cancellable.cancel(); - this._removeAnimationTimeout(); - - let i; - let keys = Object.keys(this._fileWatches); - for (i = 0; i < keys.length; i++) { - this._cache.disconnect(this._fileWatches[keys[i]]); - } - this._fileWatches = null; - - if (this._timezoneChangedId != 0) - this._clock.disconnect(this._timezoneChangedId); - this._timezoneChangedId = 0; - - this._clock = null; - - if (this._prepareForSleepId != 0) - LoginManager.getLoginManager().disconnect(this._prepareForSleepId); - this._prepareForSleepId = 0; - -- -2.18.1 +2.21.0 diff --git a/SOURCES/0002-gdmUtil-enable-support-for-GDM-s-ChoiceList-PAM-exte.patch b/SOURCES/0002-gdmUtil-enable-support-for-GDM-s-ChoiceList-PAM-exte.patch index 5cfd0ba..b396e1c 100644 --- a/SOURCES/0002-gdmUtil-enable-support-for-GDM-s-ChoiceList-PAM-exte.patch +++ b/SOURCES/0002-gdmUtil-enable-support-for-GDM-s-ChoiceList-PAM-exte.patch @@ -1,4 +1,4 @@ -From 87e7f4ea023cac3b4573ea0c7012b77c588f35ae Mon Sep 17 00:00:00 2001 +From c3ab03f8721ea96df6ac91c0393ed13ba750ab7e Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 17 Jul 2017 16:48:03 -0400 Subject: [PATCH 2/2] gdmUtil: enable support for GDM's ChoiceList PAM @@ -13,18 +13,18 @@ This commit hooks up support for GDM's ChoiceList PAM extension. 4 files changed, 114 insertions(+), 2 deletions(-) diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index e44281117..27a55246a 100644 +index cf77b3f26..71069e93b 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js -@@ -9,6 +9,7 @@ const Signals = imports.signals; - const St = imports.gi.St; +@@ -4,6 +4,7 @@ const { Clutter, GLib, Pango, Shell, St } = imports.gi; + const Signals = imports.signals; const Animation = imports.ui.animation; +const AuthList = imports.gdm.authList; const Batch = imports.gdm.batch; const GdmUtil = imports.gdm.util; const Meta = imports.gi.Meta; -@@ -61,6 +62,7 @@ var AuthPrompt = new Lang.Class({ +@@ -54,6 +55,7 @@ var AuthPrompt = class { this._userVerifier.connect('ask-question', this._onAskQuestion.bind(this)); this._userVerifier.connect('show-message', this._onShowMessage.bind(this)); @@ -32,7 +32,7 @@ index e44281117..27a55246a 100644 this._userVerifier.connect('verification-failed', this._onVerificationFailed.bind(this)); this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this)); this._userVerifier.connect('reset', this._onReset.bind(this)); -@@ -123,6 +125,28 @@ var AuthPrompt = new Lang.Class({ +@@ -116,6 +118,28 @@ var AuthPrompt = class { this.actor.add(this._timedLoginIndicator); @@ -61,9 +61,9 @@ index e44281117..27a55246a 100644 this._message = new St.Label({ opacity: 0, styleClass: 'login-dialog-message' }); this._message.clutter_text.line_wrap = true; -@@ -266,6 +290,21 @@ var AuthPrompt = new Lang.Class({ +@@ -258,6 +282,21 @@ var AuthPrompt = class { this.emit('prompted'); - }, + } + _onShowChoiceList(userVerifier, serviceName, promptMessage, choiceList) { + if (this._queryingService) @@ -78,21 +78,21 @@ index e44281117..27a55246a 100644 + this.setChoiceList(promptMessage, choiceList); + this.updateSensitivity(true); + this.emit('prompted'); -+ }, ++ } + _onOVirtUserAuthenticated() { if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED) this.reset(); -@@ -394,6 +433,8 @@ var AuthPrompt = new Lang.Class({ +@@ -386,6 +425,8 @@ var AuthPrompt = class { clear() { this._entry.text = ''; this.stopSpinning(); + this._authList.clear(); + this._authList.actor.hide(); - }, + } setPasswordChar(passwordChar) { -@@ -409,12 +450,42 @@ var AuthPrompt = new Lang.Class({ +@@ -401,12 +442,42 @@ var AuthPrompt = class { this._label.set_text(question); @@ -101,7 +101,7 @@ index e44281117..27a55246a 100644 this._entry.show(); this._entry.grab_key_focus(); - }, + } + _fadeInChoiceList() { + this._authList.actor.opacity = 0; @@ -115,7 +115,7 @@ index e44281117..27a55246a 100644 + this._authList.actor.reactive = true; + } + }); -+ }, ++ } + + setChoiceList(promptMessage, choiceList) { + this._authList.clear(); @@ -130,12 +130,12 @@ index e44281117..27a55246a 100644 + if (this._message.text == "") + this._message.hide(); + this._fadeInChoiceList(); -+ }, ++ } + getAnswer() { let text; -@@ -450,6 +521,7 @@ var AuthPrompt = new Lang.Class({ +@@ -442,6 +513,7 @@ var AuthPrompt = class { else this._message.remove_style_class_name('login-dialog-message-hint'); @@ -143,20 +143,20 @@ index e44281117..27a55246a 100644 if (message) { Tweener.removeTweens(this._message); this._message.text = message; -@@ -465,7 +537,7 @@ var AuthPrompt = new Lang.Class({ - }, +@@ -457,7 +529,7 @@ var AuthPrompt = class { + } updateSensitivity(sensitive) { - this._updateNextButtonSensitivity(sensitive && (this._entry.text.length > 0 || this.verificationStatus == AuthPromptStatus.VERIFYING)); + this._updateNextButtonSensitivity(sensitive && !this._authList.actor.visible && (this._entry.text.length > 0 || this.verificationStatus == AuthPromptStatus.VERIFYING)); this._entry.reactive = sensitive; this._entry.clutter_text.editable = sensitive; - }, + } diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js -index 65d9edf1a..912c0e0ca 100644 +index 9aaa013d8..942f5a0e5 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js -@@ -418,6 +418,11 @@ var LoginDialog = new Lang.Class({ +@@ -406,6 +406,11 @@ var LoginDialog = GObject.registerClass({ this._userManager = AccountsService.UserManager.get_default() this._gdmClient = new Gdm.Client(); @@ -169,10 +169,10 @@ index 65d9edf1a..912c0e0ca 100644 this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY, diff --git a/js/gdm/util.js b/js/gdm/util.js -index f5f9d5e5d..04a0cb9bf 100644 +index 6e940d2ab..9e249139d 100644 --- a/js/gdm/util.js +++ b/js/gdm/util.js -@@ -200,6 +200,10 @@ var ShellUserVerifier = new Lang.Class({ +@@ -192,6 +192,10 @@ var ShellUserVerifier = class { if (this._userVerifier) { this._userVerifier.run_dispose(); this._userVerifier = null; @@ -181,20 +181,20 @@ index f5f9d5e5d..04a0cb9bf 100644 + this._userVerifierChoiceList = null; + } } - }, + } -@@ -227,6 +231,10 @@ var ShellUserVerifier = new Lang.Class({ +@@ -219,6 +223,10 @@ var ShellUserVerifier = class { this._oVirtCredentialsManager = null; - }, + } + selectChoice(serviceName, key) { + this._userVerifierChoiceList.call_select_choice(serviceName, key, this._cancellable, null); -+ }, ++ } + answerQuery(serviceName, answer) { if (!this.hasPendingMessages) { this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null); -@@ -367,6 +375,11 @@ var ShellUserVerifier = new Lang.Class({ +@@ -362,6 +370,11 @@ var ShellUserVerifier = class { return; } @@ -206,7 +206,7 @@ index f5f9d5e5d..04a0cb9bf 100644 this.reauthenticating = true; this._connectSignals(); this._beginVerification(); -@@ -384,6 +397,11 @@ var ShellUserVerifier = new Lang.Class({ +@@ -379,6 +392,11 @@ var ShellUserVerifier = class { return; } @@ -218,35 +218,35 @@ index f5f9d5e5d..04a0cb9bf 100644 this._connectSignals(); this._beginVerification(); this._hold.release(); -@@ -397,6 +415,9 @@ var ShellUserVerifier = new Lang.Class({ +@@ -392,6 +410,9 @@ var ShellUserVerifier = class { this._userVerifier.connect('conversation-stopped', this._onConversationStopped.bind(this)); this._userVerifier.connect('reset', this._onReset.bind(this)); this._userVerifier.connect('verification-complete', this._onVerificationComplete.bind(this)); + + if (this._userVerifierChoiceList) + this._userVerifierChoiceList.connect('choice-query', this._onChoiceListQuery.bind(this)); - }, + } _getForegroundService() { -@@ -473,6 +494,13 @@ var ShellUserVerifier = new Lang.Class({ +@@ -468,6 +489,13 @@ var ShellUserVerifier = class { this._startService(FINGERPRINT_SERVICE_NAME); - }, + } + _onChoiceListQuery(client, serviceName, promptMessage, list) { + if (!this.serviceIsForeground(serviceName)) + return; + + this.emit('show-choice-list', serviceName, promptMessage, list.deep_unpack()); -+ }, ++ } + _onInfo(client, serviceName, info) { if (this.serviceIsForeground(serviceName)) { this._queueMessage(info, MessageType.INFO); diff --git a/js/ui/unlockDialog.js b/js/ui/unlockDialog.js -index 1adaf417e..b5272be20 100644 +index 5c9d46021..4b0470f4b 100644 --- a/js/ui/unlockDialog.js +++ b/js/ui/unlockDialog.js -@@ -51,7 +51,14 @@ var UnlockDialog = new Lang.Class({ +@@ -33,7 +33,14 @@ var UnlockDialog = class { y_expand: true }); this.actor.add_child(this._promptBox); @@ -263,5 +263,5 @@ index 1adaf417e..b5272be20 100644 this._authPrompt.connect('cancelled', this._fail.bind(this)); this._authPrompt.connect('reset', this._onReset.bind(this)); -- -2.20.1 +2.21.0 diff --git a/SOURCES/0002-introspect-Add-GetWindows-method.patch b/SOURCES/0002-introspect-Add-GetWindows-method.patch deleted file mode 100644 index c639a69..0000000 --- a/SOURCES/0002-introspect-Add-GetWindows-method.patch +++ /dev/null @@ -1,136 +0,0 @@ -From 13afa15130a50aab36e7a61dea5f6d595cd978a1 Mon Sep 17 00:00:00 2001 -From: Olivier Fourdan -Date: Wed, 12 Dec 2018 16:02:29 +0100 -Subject: [PATCH 2/2] introspect: Add GetWindows method - -The `GetWindows` method gives access to the list of windows for each -application with some of their properties, so utilities such as dogtail -can pick the window of their choice to interfere with using the provided -window id. - -https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/326 -(cherry picked from commit 0f45b438e2b956d3cf52622db875dedab45e49b9) ---- - data/org.gnome.Shell.Introspect.xml | 24 ++++++++++++ - js/misc/introspect.js | 58 +++++++++++++++++++++++++++++ - 2 files changed, 82 insertions(+) - -diff --git a/data/org.gnome.Shell.Introspect.xml b/data/org.gnome.Shell.Introspect.xml -index 10c48d635..9508681af 100644 ---- a/data/org.gnome.Shell.Introspect.xml -+++ b/data/org.gnome.Shell.Introspect.xml -@@ -33,5 +33,29 @@ - - - -+ -+ -+ -+ -+ - - -diff --git a/js/misc/introspect.js b/js/misc/introspect.js -index 05ef9e637..5999fc1f0 100644 ---- a/js/misc/introspect.js -+++ b/js/misc/introspect.js -@@ -14,6 +14,9 @@ const IntrospectDBusIface = ' \ - \ - \ - \ -+ \ -+ \ -+ \ - \ - '; - -@@ -102,6 +105,17 @@ var IntrospectService = new Lang.Class({ - this._activeApplicationDirty = false; - }, - -+ _isEligibleWindow(window) { -+ if (window.is_override_redirect()) -+ return false; -+ -+ let type = window.get_window_type(); -+ return (type == Meta.WindowType.NORMAL || -+ type == Meta.WindowType.DIALOG || -+ type == Meta.WindowType.MODAL_DIALOG || -+ type == Meta.WindowType.UTILITY); -+ }, -+ - GetRunningApplicationsAsync(params, invocation) { - if (!this._isIntrospectEnabled() && - !this._isSenderWhitelisted(invocation.get_sender())) { -@@ -112,5 +126,49 @@ var IntrospectService = new Lang.Class({ - } - - invocation.return_value(new GLib.Variant('(a{sa{sv}})', [this._runningApplications])); -+ }, -+ -+ GetWindowsAsync(params, invocation) { -+ let focusWindow = global.display.get_focus_window(); -+ let apps = this._appSystem.get_running(); -+ let windowsList = {}; -+ -+ if (!this._isIntrospectEnabled()) { -+ invocation.return_error_literal(Gio.DBusError, -+ Gio.DBusError.ACCESS_DENIED, -+ 'App introspection not allowed'); -+ return; -+ } -+ -+ for (let app of apps) { -+ let windows = app.get_windows(); -+ for (let window of windows) { -+ -+ if (!this._isEligibleWindow(window)) -+ continue; -+ -+ let windowId = window.get_id(); -+ let frameRect = window.get_frame_rect(); -+ let title = window.get_title(); -+ let wmClass = window.get_wm_class(); -+ -+ windowsList[windowId] = { -+ 'app-id': GLib.Variant.new('s', app.get_id()), -+ 'client-type': GLib.Variant.new('u', window.get_client_type()), -+ 'is-hidden': GLib.Variant.new('b', window.is_hidden()), -+ 'has-focus': GLib.Variant.new('b', (window == focusWindow)), -+ 'width': GLib.Variant.new('u', frameRect.width), -+ 'height': GLib.Variant.new('u', frameRect.height) -+ }; -+ -+ // These properties may not be available for all windows: -+ if (title != null) -+ windowsList[windowId]['title'] = GLib.Variant.new('s', title); -+ -+ if (wmClass != null) -+ windowsList[windowId]['wm-class'] = GLib.Variant.new('s', wmClass); -+ } -+ } -+ invocation.return_value(new GLib.Variant('(a{ta{sv}})', [windowsList])); - } - }); --- -2.20.1 - diff --git a/SOURCES/0002-remoteAccess-Make-indicator-orange.patch b/SOURCES/0002-remoteAccess-Make-indicator-orange.patch deleted file mode 100644 index 8434b31..0000000 --- a/SOURCES/0002-remoteAccess-Make-indicator-orange.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 31da6717085567c044322d722df5b735925583ce Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jonas=20=C3=85dahl?= -Date: Fri, 27 Jul 2018 18:07:52 +0200 -Subject: [PATCH 2/2] remoteAccess: Make indicator orange - -Make the indicator for active remote access use the warning color, to -indicate the severity of allowing remote access. - -This only makes the indicator icon orange; the icon in the system menu -is still white. ---- - data/theme/gnome-shell-sass/_common.scss | 2 ++ - js/ui/status/remoteAccess.js | 1 + - 2 files changed, 3 insertions(+) - -diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss -index 2f05098df..24ac2c974 100644 ---- a/data/theme/gnome-shell-sass/_common.scss -+++ b/data/theme/gnome-shell-sass/_common.scss -@@ -824,6 +824,8 @@ StScrollBar { - - .screencast-indicator { color: $warning_color; } - -+ .remote-access-indicator { color: $warning_color; } -+ - &.solid { - background-color: black; - /* transition from transparent to solid */ -diff --git a/js/ui/status/remoteAccess.js b/js/ui/status/remoteAccess.js -index ffa334001..db94d130d 100644 ---- a/js/ui/status/remoteAccess.js -+++ b/js/ui/status/remoteAccess.js -@@ -41,6 +41,7 @@ var RemoteAccessApplet = new Lang.Class({ - - this._indicator = this._addIndicator(); - this._indicator.icon_name = 'screen-shared-symbolic'; -+ this._indicator.add_style_class_name('remote-access-indicator'); - this._item = - new PopupMenu.PopupSubMenuMenuItem(_("Screen is Being Shared"), - true); --- -2.17.1 - diff --git a/SOURCES/0003-st-texture-cache-purge-on-resume.patch b/SOURCES/0003-st-texture-cache-purge-on-resume.patch index 75ecb42..41c288d 100644 --- a/SOURCES/0003-st-texture-cache-purge-on-resume.patch +++ b/SOURCES/0003-st-texture-cache-purge-on-resume.patch @@ -1,4 +1,4 @@ -From fd9a803159ca7e7fbe6bee1842cc78deff0da7fa Mon Sep 17 00:00:00 2001 +From 2ebeda3385fb679df4bc13ba4b80bdeba5e2ad13 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 15 Jan 2019 12:54:32 -0500 Subject: [PATCH 3/4] st-texture-cache: purge on resume @@ -7,42 +7,15 @@ With the proprietary nvidia driver, textures get garbled on suspend, so the texture cache needs to evict all textures in that situation. --- js/ui/main.js | 6 +++++- - src/st/st-texture-cache.c | 12 ++++++++++++ + src/st/st-texture-cache.c | 10 ++++++++++ src/st/st-texture-cache.h | 1 + - 3 files changed, 18 insertions(+), 1 deletion(-) + 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/js/ui/main.js b/js/ui/main.js -index a8779bf09..faaf07399 100644 +index 061303cf3..8d1755cf1 100644 --- a/js/ui/main.js +++ b/js/ui/main.js -@@ -184,61 +184,65 @@ function _initializeUI() { - - messageTray = new MessageTray.MessageTray(); - panel = new Panel.Panel(); - keyboard = new Keyboard.Keyboard(); - notificationDaemon = new NotificationDaemon.NotificationDaemon(); - windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler(); - componentManager = new Components.ComponentManager(); - - introspectService = new Introspect.IntrospectService(); - - layoutManager.init(); - overview.init(); - - _a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA }); - - global.display.connect('overlay-key', () => { - if (!_a11ySettings.get_boolean (STICKY_KEYS_ENABLE)) - overview.toggle(); - }); - - global.display.connect('show-restart-message', (display, message) => { - showRestartMessage(message); - return true; - }); - - global.display.connect('restart', () => { - global.reexec_self(); +@@ -200,7 +200,11 @@ function _initializeUI() { return true; }); @@ -55,65 +28,11 @@ index a8779bf09..faaf07399 100644 // Provide the bus object for gnome-session to // initiate logouts. - EndSessionDialog.init(); - - // We're ready for the session manager to move to the next phase - Meta.register_with_session(); - - _startDate = new Date(); - - let perfModuleName = GLib.getenv("SHELL_PERF_MODULE"); - if (perfModuleName) { - let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT"); - let module = eval('imports.perf.' + perfModuleName + ';'); - Scripting.runPerfScript(module, perfOutput); - } - - ExtensionDownloader.init(); - ExtensionSystem.init(); - - if (sessionMode.isGreeter && screenShield) { - layoutManager.connect('startup-prepared', () => { - screenShield.showDialog(); - }); - } - - layoutManager.connect('startup-complete', () => { - if (actionMode == Shell.ActionMode.NONE) { - actionMode = Shell.ActionMode.NORMAL; - } diff --git a/src/st/st-texture-cache.c b/src/st/st-texture-cache.c -index 0c794a3ab..5a3dcd81f 100644 +index cbe3afaba..40a11dd6d 100644 --- a/src/st/st-texture-cache.c +++ b/src/st/st-texture-cache.c -@@ -78,60 +78,72 @@ set_texture_cogl_texture (ClutterTexture *clutter_texture, CoglTexture *cogl_tex - { - clutter_texture_set_cogl_texture (clutter_texture, cogl_texture); - g_object_set (clutter_texture, "opacity", 255, NULL); - } - - static void - st_texture_cache_class_init (StTextureCacheClass *klass) - { - GObjectClass *gobject_class = (GObjectClass *)klass; - - gobject_class->dispose = st_texture_cache_dispose; - gobject_class->finalize = st_texture_cache_finalize; - - signals[ICON_THEME_CHANGED] = - g_signal_new ("icon-theme-changed", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - 0, /* no default handler slot */ - NULL, NULL, NULL, - G_TYPE_NONE, 0); - - signals[TEXTURE_FILE_CHANGED] = - g_signal_new ("texture-file-changed", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - 0, /* no default handler slot */ - NULL, NULL, NULL, +@@ -113,6 +113,16 @@ st_texture_cache_class_init (StTextureCacheClass *klass) G_TYPE_NONE, 1, G_TYPE_FILE); } @@ -121,9 +40,7 @@ index 0c794a3ab..5a3dcd81f 100644 +void +st_texture_cache_clear (StTextureCache *cache) +{ -+ GHashTableIter iter; -+ gpointer key; -+ gpointer value; ++ g_return_if_fail (ST_IS_TEXTURE_CACHE (cache)); + + g_hash_table_remove_all (cache->priv->keyed_cache); + g_signal_emit (cache, signals[ICON_THEME_CHANGED], 0); @@ -132,65 +49,11 @@ index 0c794a3ab..5a3dcd81f 100644 /* Evicts all cached textures for named icons */ static void st_texture_cache_evict_icons (StTextureCache *cache) - { - GHashTableIter iter; - gpointer key; - gpointer value; - - g_hash_table_iter_init (&iter, cache->priv->keyed_cache); - while (g_hash_table_iter_next (&iter, &key, &value)) - { - const char *cache_key = key; - - /* This is too conservative - it takes out all cached textures - * for GIcons even when they aren't named icons, but it's not - * worth the complexity of parsing the key and calling - * g_icon_new_for_string(); icon theme changes aren't normal */ - if (g_str_has_prefix (cache_key, CACHE_PREFIX_ICON)) - g_hash_table_iter_remove (&iter); - } - } - - static void - on_icon_theme_changed (GtkIconTheme *icon_theme, - StTextureCache *cache) - { - st_texture_cache_evict_icons (cache); - g_signal_emit (cache, signals[ICON_THEME_CHANGED], 0); - } - diff --git a/src/st/st-texture-cache.h b/src/st/st-texture-cache.h -index 26f9c30ac..b87adc4d5 100644 +index 11d1c4e64..9079d1fda 100644 --- a/src/st/st-texture-cache.h +++ b/src/st/st-texture-cache.h -@@ -25,60 +25,61 @@ - #if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION) - #error "Only can be included directly.h" - #endif - - #include - #include - #include - - #include - #include - - #define ST_TYPE_TEXTURE_CACHE (st_texture_cache_get_type ()) - G_DECLARE_FINAL_TYPE (StTextureCache, st_texture_cache, - ST, TEXTURE_CACHE, GObject) - - typedef struct _StTextureCachePrivate StTextureCachePrivate; - - struct _StTextureCache - { - GObject parent; - - StTextureCachePrivate *priv; - }; - - typedef enum { - ST_TEXTURE_CACHE_POLICY_NONE, - ST_TEXTURE_CACHE_POLICY_FOREVER +@@ -53,6 +53,7 @@ typedef enum { } StTextureCachePolicy; StTextureCache* st_texture_cache_get_default (void); @@ -198,33 +61,6 @@ index 26f9c30ac..b87adc4d5 100644 ClutterActor * st_texture_cache_load_sliced_image (StTextureCache *cache, - GFile *file, - gint grid_width, - gint grid_height, - gint scale, - GFunc load_callback, - gpointer user_data); - - ClutterActor *st_texture_cache_bind_cairo_surface_property (StTextureCache *cache, - GObject *object, - const char *property_name); - - ClutterActor *st_texture_cache_load_gicon (StTextureCache *cache, - StThemeNode *theme_node, - GIcon *icon, - gint size, - gint scale); - - ClutterActor *st_texture_cache_load_file_async (StTextureCache *cache, - GFile *file, - int available_width, - int available_height, - int scale); - - CoglTexture *st_texture_cache_load_file_to_cogl_texture (StTextureCache *cache, - GFile *file, - gint scale); - -- -2.18.1 +2.21.0 diff --git a/SOURCES/0004-background-refresh-background-on-gl-video-memory-pur.patch b/SOURCES/0004-background-refresh-background-on-gl-video-memory-pur.patch index ded56c5..0f81f47 100644 --- a/SOURCES/0004-background-refresh-background-on-gl-video-memory-pur.patch +++ b/SOURCES/0004-background-refresh-background-on-gl-video-memory-pur.patch @@ -1,4 +1,4 @@ -From b440c4c529aee18ecc36a7b8a24809bc684cfe5b Mon Sep 17 00:00:00 2001 +From 055bc14c70af66fe1893dcd4c42c65662ae1f9d0 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 21 Jan 2019 15:07:15 -0500 Subject: [PATCH 4/4] background: refresh background on gl-video-memory-purged @@ -10,119 +10,39 @@ and the signal is only emitted for NVIDIA, so use that instead. --- js/ui/background.js | 9 +++++++-- js/ui/layout.js | 12 ------------ - src/shell-util.c | 9 --------- - 3 files changed, 7 insertions(+), 23 deletions(-) + src/shell-util.c | 27 --------------------------- + src/shell-util.h | 2 -- + 4 files changed, 7 insertions(+), 43 deletions(-) diff --git a/js/ui/background.js b/js/ui/background.js -index c61d946a4..ae7ef275e 100644 +index 75b76a57e..466cc4de7 100644 --- a/js/ui/background.js +++ b/js/ui/background.js -@@ -512,64 +512,69 @@ var SystemBackground = new Lang.Class({ - let image = cache.load(file); - if (image.is_loaded()) { - image = null; - let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { - this.emit('loaded'); - return GLib.SOURCE_REMOVE; - }); - GLib.Source.set_name_by_id(id, '[gnome-shell] SystemBackground.loaded'); - } else { - let id = image.connect('loaded', () => { - this.emit('loaded'); - image.disconnect(id); - image = null; - }); - } - }, - }); - Signals.addSignalMethods(SystemBackground.prototype); - - var BackgroundSource = new Lang.Class({ - Name: 'BackgroundSource', - - _init(layoutManager, settingsSchema) { - // Allow override the background image setting for performance testing - this._layoutManager = layoutManager; - this._overrideImage = GLib.getenv('SHELL_BACKGROUND_IMAGE'); - this._settings = new Gio.Settings({ schema_id: settingsSchema }); - this._backgrounds = []; - - this._monitorsChangedId = global.screen.connect('monitors-changed', -- this._onMonitorsChanged.bind(this)); -+ this._refresh.bind(this)); +@@ -527,10 +527,15 @@ var BackgroundSource = class BackgroundSource { + let monitorManager = Meta.MonitorManager.get(); + this._monitorsChangedId = + monitorManager.connect('monitors-changed', +- this._onMonitorsChanged.bind(this)); ++ this._refresh.bind(this)); + + global.display.connect('gl-video-memory-purged', () => { -+ Meta.Background.refresh_all(); -+ this._refresh(); -+ }); - }, ++ Meta.Background.refresh_all(); ++ this._refresh(); ++ }); + } - _onMonitorsChanged() { + _refresh() { for (let monitorIndex in this._backgrounds) { let background = this._backgrounds[monitorIndex]; - if (monitorIndex < this._layoutManager.monitors.length) { - background.updateResolution(); - } else { - background.disconnect(background._changedId); - background.destroy(); - delete this._backgrounds[monitorIndex]; - } - } - }, - - getBackground(monitorIndex) { - let file = null; - let style; - - // We don't watch changes to settings here, - // instead we rely on Background to watch those - // and emit 'changed' at the right time - - if (this._overrideImage != null) { - file = Gio.File.new_for_path(this._overrideImage); - style = GDesktopEnums.BackgroundStyle.ZOOM; // Hardcode - } else { - style = this._settings.get_enum(BACKGROUND_STYLE_KEY); - if (style != GDesktopEnums.BackgroundStyle.NONE) { - let uri = this._settings.get_string(PICTURE_URI_KEY); - file = Gio.File.new_for_commandline_arg(uri); - } diff --git a/js/ui/layout.js b/js/ui/layout.js -index 6f810395d..2cd1e5bd3 100644 +index 30e750dc5..2b3bb7442 100644 --- a/js/ui/layout.js +++ b/js/ui/layout.js -@@ -251,72 +251,60 @@ var LayoutManager = new Lang.Class({ - this.addChrome(this.keyboardBox); - this._keyboardHeightNotifyId = 0; - - // A dummy actor that tracks the mouse or text cursor, based on the - // position and size set in setDummyCursorGeometry. - this.dummyCursor = new St.Widget({ width: 0, height: 0, visible: false }); - this.uiGroup.add_actor(this.dummyCursor); - - global.stage.remove_actor(global.top_window_group); - this.uiGroup.add_actor(global.top_window_group); - - let feedbackGroup = Meta.get_feedback_group_for_screen(global.screen); - global.stage.remove_actor(feedbackGroup); - this.uiGroup.add_actor(feedbackGroup); - - this._backgroundGroup = new Meta.BackgroundGroup(); - global.window_group.add_child(this._backgroundGroup); - this._backgroundGroup.lower_bottom(); - this._bgManagers = []; - - // Need to update struts on new workspaces when they are added - global.screen.connect('notify::n-workspaces', - this._queueUpdateRegions.bind(this)); - global.screen.connect('restacked', - this._windowsRestacked.bind(this)); - global.screen.connect('monitors-changed', - this._monitorsChanged.bind(this)); - global.screen.connect('in-fullscreen-changed', - this._updateFullscreen.bind(this)); +@@ -282,18 +282,6 @@ var LayoutManager = GObject.registerClass({ + monitorManager.connect('monitors-changed', + this._monitorsChanged.bind(this)); this._monitorsChanged(); - - // NVIDIA drivers don't preserve FBO contents across @@ -136,71 +56,35 @@ index 6f810395d..2cd1e5bd3 100644 - Meta.Background.refresh_all(); - }); - } - }, + } // This is called by Main after everything else is constructed - init() { - Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); - - this._loadBackground(); - }, - - showOverview() { - this.overviewGroup.show(); - - this._inOverview = true; - this._updateVisibility(); - }, - - hideOverview() { - this.overviewGroup.hide(); - - this._inOverview = false; - this._updateVisibility(); - }, - - _sessionUpdated() { - this._updateVisibility(); - this._queueUpdateRegions(); - }, - - _updateMonitors() { - let screen = global.screen; diff --git a/src/shell-util.c b/src/shell-util.c -index c43bf4cc5..c63c6efb7 100644 +index c6e5abed6..9c25643c6 100644 --- a/src/shell-util.c +++ b/src/shell-util.c -@@ -369,69 +369,60 @@ shell_util_cursor_tracker_to_clutter (MetaCursorTracker *tracker, - sprite = meta_cursor_tracker_get_sprite (tracker); - if (sprite) - { - clutter_actor_show (CLUTTER_ACTOR (texture)); - clutter_texture_set_cogl_texture (texture, sprite); - } - else - { - clutter_actor_hide (CLUTTER_ACTOR (texture)); - } - } - - typedef const gchar *(*ShellGLGetString) (GLenum); - - static const gchar * - get_gl_vendor (void) - { - static const gchar *vendor = NULL; - - if (!vendor) - { - ShellGLGetString gl_get_string; - gl_get_string = (ShellGLGetString) cogl_get_proc_address ("glGetString"); - if (gl_get_string) - vendor = gl_get_string (GL_VENDOR); - } - - return vendor; +@@ -374,33 +374,6 @@ shell_util_create_pixbuf_from_data (const guchar *data, + (GdkPixbufDestroyNotify) g_free, NULL); } +-typedef const gchar *(*ShellGLGetString) (GLenum); +- +-static const gchar * +-get_gl_vendor (void) +-{ +- static const gchar *vendor = NULL; +- +- if (!vendor) +- { +- ShellGLGetString gl_get_string; +- gl_get_string = (ShellGLGetString) cogl_get_proc_address ("glGetString"); +- if (gl_get_string) +- vendor = gl_get_string (GL_VENDOR); +- } +- +- return vendor; +-} +- -gboolean -shell_util_need_background_refresh (void) -{ @@ -213,33 +97,19 @@ index c43bf4cc5..c63c6efb7 100644 static gboolean canvas_draw_cb (ClutterContent *content, cairo_t *cr, - gint width, - gint height, - gpointer user_data) - { - cairo_surface_t *surface = user_data; +diff --git a/src/shell-util.h b/src/shell-util.h +index 6904f43bc..049c3fe18 100644 +--- a/src/shell-util.h ++++ b/src/shell-util.h +@@ -44,8 +44,6 @@ GdkPixbuf *shell_util_create_pixbuf_from_data (const guchar *data, + int height, + int rowstride); - cairo_set_source_surface (cr, surface, 0, 0); - cairo_paint (cr); +-gboolean shell_util_need_background_refresh (void); +- + ClutterContent * shell_util_get_content_for_window_actor (MetaWindowActor *window_actor, + MetaRectangle *window_rect); - return FALSE; - } - - /** - * shell_util_get_content_for_window_actor: - * @window_actor: a #MetaWindowActor - * @window_rect: a #MetaRectangle - * - * Returns: (transfer full): a new #ClutterContent - */ - ClutterContent * - shell_util_get_content_for_window_actor (MetaWindowActor *window_actor, - MetaRectangle *window_rect) - { - ClutterActor *texture; - ClutterContent *content; - cairo_surface_t *surface; - cairo_rectangle_int_t clip; -- -2.18.1 +2.21.0 diff --git a/SOURCES/allow-timed-login-with-no-user-list.patch b/SOURCES/allow-timed-login-with-no-user-list.patch index 19890fa..bc5b56e 100644 --- a/SOURCES/allow-timed-login-with-no-user-list.patch +++ b/SOURCES/allow-timed-login-with-no-user-list.patch @@ -1,4 +1,4 @@ -From ca59b5fa9e089177676c0590924e734910377102 Mon Sep 17 00:00:00 2001 +From de891fadb0b40a9b6e84131b82086e42d86992a1 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 19 Apr 2016 13:12:46 -0400 Subject: [PATCH] loginDialog: allow timed login with disabled user list @@ -12,15 +12,15 @@ It accomplishes this by putting the timed login indicator on the auth prompt, in that scenario. --- data/theme/gnome-shell-sass/_common.scss | 4 +++ - js/gdm/authPrompt.js | 40 ++++++++++++++++++++++++ - js/gdm/loginDialog.js | 28 +++++++++++++++-- - 3 files changed, 70 insertions(+), 2 deletions(-) + js/gdm/authPrompt.js | 41 +++++++++++++++++++++++- + js/gdm/loginDialog.js | 23 ++++++++++++- + 3 files changed, 66 insertions(+), 2 deletions(-) diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss -index 2f05098df..4e82ef58b 100644 +index a6357baad..c2df28279 100644 --- a/data/theme/gnome-shell-sass/_common.scss +++ b/data/theme/gnome-shell-sass/_common.scss -@@ -1825,6 +1825,10 @@ StScrollBar { +@@ -1856,6 +1856,10 @@ StScrollBar { padding-bottom: 12px; spacing: 8px; width: 23em; @@ -32,18 +32,18 @@ index 2f05098df..4e82ef58b 100644 .login-dialog-prompt-label { diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index 89cef4d5d..e44281117 100644 +index 27eb31a89..cf77b3f26 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js -@@ -2,6 +2,7 @@ +@@ -1,6 +1,6 @@ + // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - const Clutter = imports.gi.Clutter; - const Gio = imports.gi.Gio; -+const GLib = imports.gi.GLib; - const Lang = imports.lang; - const Pango = imports.gi.Pango; +-const { Clutter, Pango, Shell, St } = imports.gi; ++const { Clutter, GLib, Pango, Shell, St } = imports.gi; const Signals = imports.signals; -@@ -117,6 +118,11 @@ var AuthPrompt = new Lang.Class({ + + const Animation = imports.ui.animation; +@@ -111,6 +111,11 @@ var AuthPrompt = class { this._entry.grab_key_focus(); @@ -55,9 +55,9 @@ index 89cef4d5d..e44281117 100644 this._message = new St.Label({ opacity: 0, styleClass: 'login-dialog-message' }); this._message.clutter_text.line_wrap = true; -@@ -142,6 +148,40 @@ var AuthPrompt = new Lang.Class({ +@@ -135,6 +140,40 @@ var AuthPrompt = class { this._defaultButtonWell.add_child(this._spinner.actor); - }, + } + showTimedLoginIndicator(time) { + let hold = new Batch.Hold(); @@ -83,7 +83,7 @@ index 89cef4d5d..e44281117 100644 + GLib.Source.set_name_by_id(this._timedLoginTimeoutId, '[gnome-shell] this._timedLoginTimeoutId'); + + return hold; -+ }, ++ } + + hideTimedLoginIndicator() { + if (this._timedLoginTimeoutId) { @@ -91,16 +91,16 @@ index 89cef4d5d..e44281117 100644 + this._timedLoginTimeoutId = 0; + } + this._timedLoginIndicator.scale_x = 0.; -+ }, ++ } + _onDestroy() { if (this._preemptiveAnswerWatchId) { this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId); diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js -index 4a93545af..65d9edf1a 100644 +index 6c4d1357d..9aaa013d8 100644 --- a/js/gdm/loginDialog.js +++ b/js/gdm/loginDialog.js -@@ -738,6 +738,9 @@ var LoginDialog = new Lang.Class({ +@@ -734,6 +734,9 @@ var LoginDialog = GObject.registerClass({ if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING) this._authPrompt.reset(); @@ -108,16 +108,11 @@ index 4a93545af..65d9edf1a 100644 + if (this._disableUserList && this._timedLoginUserListHold) + this._timedLoginUserListHold.release(); } - }, + } -@@ -1019,17 +1022,33 @@ var LoginDialog = new Lang.Class({ - }, - - _startTimedLogin(userName, delay) { -+ this._timedLoginUserName = userName; - this._timedLoginItem = null; - this._timedLoginDelay = delay; - this._timedLoginAnimationTime = delay; +@@ -1020,9 +1023,21 @@ var LoginDialog = GObject.registerClass({ + let loginItem = null; + let animationTime; - let tasks = [() => this._waitForItemForUser(userName), + let tasks = [() => { @@ -135,37 +130,29 @@ index 4a93545af..65d9edf1a 100644 + if (this._disableUserList) + return; + - this._timedLoginItem = this._userList.getItemFromUserName(userName); + loginItem = this._userList.getItemFromUserName(userName); + + // If there is an animation running on the item, reset it. +@@ -1030,6 +1045,9 @@ var LoginDialog = GObject.registerClass({ }, () => { + if (this._disableUserList) + return; + - // If we're just starting out, start on the right - // item. + // If we're just starting out, start on the right item. if (!this._userManager.is_loaded) { -@@ -1040,6 +1059,9 @@ var LoginDialog = new Lang.Class({ - this._blockTimedLoginUntilIdle, + this._userList.jumpToItem(loginItem); +@@ -1051,6 +1069,9 @@ var LoginDialog = GObject.registerClass({ + }, () => { + if (this._disableUserList) + return; + - this._userList.scrollToItem(this._timedLoginItem); - }, - -@@ -1064,7 +1086,9 @@ var LoginDialog = new Lang.Class({ - if (this._timedLoginItem) - this._timedLoginItem.hideTimedLoginIndicator(); - -- let userName = this._timedLoginItem.user.get_user_name(); -+ this._authPrompt.hideTimedLoginIndicator(); -+ -+ let userName = this._timedLoginUserName; - - if (userName) - this._startTimedLogin(userName, this._timedLoginDelay); + // If idle timeout is done, make sure the timed login indicator is shown + if (delay > _TIMED_LOGIN_IDLE_THRESHOLD && + this._authPrompt.actor.visible) -- -2.20.1 +2.21.0 diff --git a/SOURCES/backport-im-fixes.patch b/SOURCES/backport-im-fixes.patch deleted file mode 100644 index aa5b3e3..0000000 --- a/SOURCES/backport-im-fixes.patch +++ /dev/null @@ -1,398 +0,0 @@ -From 99c77e85b3514e885641ebdc3dee3d4508e08fbf Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -Date: Mon, 16 Jul 2018 23:36:38 +0000 -Subject: [PATCH 1/6] keyboard: Handle no-window case in FocusTracker - -For windows, the cursor location needs to be adjusted by the frame -offsets. However we cannot assume that there is a window, as the -shell itself can have the key focus. - -https://gitlab.gnome.org/GNOME/gnome-shell/issues/414 - - -(cherry picked from commit 0dee82fb9fa974ebdb4dd77fd85535a6edf207fd) ---- - js/ui/keyboard.js | 18 +++++++++++++----- - 1 file changed, 13 insertions(+), 5 deletions(-) - -diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js -index 5fcdf988a..66653d602 100644 ---- a/js/ui/keyboard.js -+++ b/js/ui/keyboard.js -@@ -533,17 +533,25 @@ var FocusTracker = new Lang.Class({ - }, - - _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; - } --- -2.20.1 - - -From b89224c37afc9cbedbd776bfdd27c57849669fba Mon Sep 17 00:00:00 2001 -From: Carlos Garnacho -Date: Fri, 29 Jun 2018 17:35:39 +0200 -Subject: [PATCH 2/6] inputMethod: Handle IBusInputContext::forward-key-press - -The input method may hint that certain keycodes should be pressed/released -besides the textual information in ::commit. An example is hitting space -in some IMs to commit text, where both ::commit happens, and an space is -visibly inserted. In order to handle this properly, we must honor -::forward-key-press. - -In order to cater for the case that a keypress is forwarded while handling -that same keypress in a physical keyboard, check the current event being -handled and just forward it as-is if it matches. This is necessary to -prevent state from being doubly set, and the second event silenced away. - -https://gitlab.gnome.org/GNOME/gnome-shell/issues/275 - -Closes: #275 ---- - js/misc/inputMethod.js | 34 ++++++++++++++++++++++++++++++++++ - 1 file changed, 34 insertions(+) - -diff --git a/js/misc/inputMethod.js b/js/misc/inputMethod.js -index 621483243..59b3d78d6 100644 ---- a/js/misc/inputMethod.js -+++ b/js/misc/inputMethod.js -@@ -15,6 +15,8 @@ var InputMethod = new Lang.Class({ - this._purpose = 0; - this._enabled = true; - this._currentFocus = null; -+ this._currentEvent = null; -+ this._doForwardEvent = false; - this._ibus = IBus.Bus.new_async(); - this._ibus.connect('connected', this._onConnected.bind(this)); - this._ibus.connect('disconnected', this._clear.bind(this)); -@@ -25,6 +27,9 @@ var InputMethod = new Lang.Class({ - this._onSourceChanged.bind(this)); - this._currentSource = this._inputSourceManager.currentSource; - -+ let deviceManager = Clutter.DeviceManager.get_default(); -+ this._virtualDevice = deviceManager.create_virtual_device(Clutter.InputDeviceType.KEYBOARD_DEVICE); -+ - if (this._ibus.is_connected()) - this._onConnected(); - }, -@@ -64,6 +69,7 @@ var InputMethod = new Lang.Class({ - this._context.connect('commit-text', this._onCommitText.bind(this)); - this._context.connect('delete-surrounding-text', this._onDeleteSurroundingText.bind(this)); - this._context.connect('update-preedit-text', this._onUpdatePreeditText.bind(this)); -+ this._context.connect('forward-key-event', this._onForwardKeyEvent.bind(this)); - - this._updateCapabilities(); - }, -@@ -96,6 +102,24 @@ var InputMethod = new Lang.Class({ - this.set_preedit_text(str, pos); - }, - -+ _onForwardKeyEvent(context, keyval, keycode, state) { -+ let press = (state & IBus.ModifierType.RELEASE_MASK) == 0; -+ -+ if (this._currentEvent) { -+ // If we are handling this same event in filter_key_press(), -+ // just let it go through, sending the same event again will -+ // be silenced away because the key counts as pressed. -+ if (this._currentEvent.get_key_symbol() == keyval && -+ (this._currentEvent.type() == Clutter.EventType.KEY_PRESS) == press) { -+ this._doForwardEvent = true; -+ return; -+ } -+ } -+ -+ this._virtualDevice.notify_key(Clutter.get_current_event_time(), keycode, -+ press ? Clutter.KeyState.PRESSED : Clutter.KeyState.RELEASED); -+ }, -+ - vfunc_focus_in(focus) { - this._currentFocus = focus; - if (this._context) { -@@ -197,13 +221,23 @@ var InputMethod = new Lang.Class({ - - if (event.type() == Clutter.EventType.KEY_RELEASE) - state |= IBus.ModifierType.RELEASE_MASK; -+ -+ this._currentEvent = event; -+ this._doForwardEvent = false; -+ - this._context.process_key_event_async(event.get_key_symbol(), - event.get_key_code() - 8, // Convert XKB keycodes to evcodes - state, -1, null, - (context, res) => { - try { - let retval = context.process_key_event_async_finish(res); -+ -+ if (this._doForwardEvent) -+ retval = false; -+ - this.notify_key_event(event, retval); -+ this._doForwardEvent = false; -+ this._currentEvent = null; - } catch (e) { - log('Error processing key on IM: ' + e.message); - } --- -2.20.1 - - -From f8040e59811cd28d9c55d766d6f4c80cf45a226d Mon Sep 17 00:00:00 2001 -From: Takao Fujiwara -Date: Tue, 21 Aug 2018 20:21:53 +0900 -Subject: [PATCH 3/6] inputMethod: Fix to hide preedit text - -ibus_engine_update_preedit_text() should hide the pre-edit text -when visible == false. - -https://gitlab.gnome.org/GNOME/gnome-shell/issues/431 ---- - js/misc/inputMethod.js | 25 +++++++++++++++++++++---- - 1 file changed, 21 insertions(+), 4 deletions(-) - -diff --git a/js/misc/inputMethod.js b/js/misc/inputMethod.js -index 59b3d78d6..320a6cc33 100644 ---- a/js/misc/inputMethod.js -+++ b/js/misc/inputMethod.js -@@ -17,6 +17,8 @@ var InputMethod = new Lang.Class({ - this._currentFocus = null; - this._currentEvent = null; - this._doForwardEvent = false; -+ this._preeditStr = ''; -+ this._preeditPos = 0; - this._ibus = IBus.Bus.new_async(); - this._ibus.connect('connected', this._onConnected.bind(this)); - this._ibus.connect('disconnected', this._clear.bind(this)); -@@ -69,6 +71,8 @@ var InputMethod = new Lang.Class({ - this._context.connect('commit-text', this._onCommitText.bind(this)); - this._context.connect('delete-surrounding-text', this._onDeleteSurroundingText.bind(this)); - this._context.connect('update-preedit-text', this._onUpdatePreeditText.bind(this)); -+ this._context.connect('show-preedit-text', this._onShowPreeditText.bind(this)); -+ this._context.connect('hide-preedit-text', this._onHidePreeditText.bind(this)); - this._context.connect('forward-key-event', this._onForwardKeyEvent.bind(this)); - - this._updateCapabilities(); -@@ -79,6 +83,8 @@ var InputMethod = new Lang.Class({ - this._hints = 0; - this._purpose = 0; - this._enabled = false; -+ this._preeditStr = '' -+ this._preeditPos = 0; - }, - - _emitRequestSurrounding() { -@@ -95,11 +101,22 @@ var InputMethod = new Lang.Class({ - }, - - _onUpdatePreeditText(context, text, pos, visible) { -- let str = null; -- if (visible && text != null) -- str = text.get_text(); -+ if (text == null) -+ return; -+ this._preeditStr = text.get_text(); -+ this._preeditPos = pos; -+ if (visible) -+ this.set_preedit_text(this._preeditStr, pos); -+ else -+ this.set_preedit_text(null, pos); -+ }, -+ -+ _onShowPreeditText(context) { -+ this.set_preedit_text(this._preeditStr, this._preeditPos); -+ }, - -- this.set_preedit_text(str, pos); -+ _onHidePreeditText(context) { -+ this.set_preedit_text(null, this._preeditPos); - }, - - _onForwardKeyEvent(context, keyval, keycode, state) { --- -2.20.1 - - -From 43c841a6b9f79b136f8bfe34a28b5c9681006ae7 Mon Sep 17 00:00:00 2001 -From: Andrea Azzarone -Date: Mon, 17 Sep 2018 18:00:04 +0200 -Subject: [PATCH 4/6] inputMethod: Add a null-check for text in - vfunc_set_surrounding. - -Fixes https://gitlab.gnome.org/GNOME/gnome-shell/issues/579 ---- - js/misc/inputMethod.js | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/js/misc/inputMethod.js b/js/misc/inputMethod.js -index 320a6cc33..ec84f7277 100644 ---- a/js/misc/inputMethod.js -+++ b/js/misc/inputMethod.js -@@ -176,7 +176,7 @@ var InputMethod = new Lang.Class({ - }, - - vfunc_set_surrounding(text, cursor, anchor) { -- if (this._context) -+ if (this._context && text) - this._context.set_surrounding_text(text, cursor, anchor); - }, - --- -2.20.1 - - -From 5f03edcadcada801100bab027188660fb2a4c3f6 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -Date: Tue, 11 Sep 2018 15:36:35 +0200 -Subject: [PATCH 5/6] inputMethod: Fix setting surrounding text - -The underlying ibus method expects an object of type IBusText rather -than a plain string. - -https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/228 ---- - js/misc/inputMethod.js | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/js/misc/inputMethod.js b/js/misc/inputMethod.js -index ec84f7277..7fb78178a 100644 ---- a/js/misc/inputMethod.js -+++ b/js/misc/inputMethod.js -@@ -176,8 +176,11 @@ var InputMethod = new Lang.Class({ - }, - - vfunc_set_surrounding(text, cursor, anchor) { -- if (this._context && text) -- this._context.set_surrounding_text(text, cursor, anchor); -+ if (!this._context || !text) -+ return; -+ -+ let ibusText = IBus.Text.new_from_string(text); -+ this._context.set_surrounding_text(ibusText, cursor, anchor); - }, - - vfunc_update_content_hints(hints) { --- -2.20.1 - - -From 4ed4039ae031f1ed16bac2e7729c84e300f90534 Mon Sep 17 00:00:00 2001 -From: Carlos Garnacho -Date: Thu, 27 Sep 2018 21:09:02 +0200 -Subject: [PATCH 6/6] inputMethod: Use forward_key() method to forward key - events - -ClutterVirtualInputDevice has the limitation that event flags won't be -made to contain CLUTTER_EVENT_FLAG_INPUT_METHOD, possibly causing feedback -loops. - -As the event gets injected up the platform dependent bits, we can avoid -care on not pressing the same key twice, we still expect coherence between -key presses and releases from the IM though. - -https://gitlab.gnome.org/GNOME/gnome-shell/issues/531 ---- - js/misc/inputMethod.js | 34 ++++++++-------------------------- - 1 file changed, 8 insertions(+), 26 deletions(-) - -diff --git a/js/misc/inputMethod.js b/js/misc/inputMethod.js -index 7fb78178a..4a92dc49b 100644 ---- a/js/misc/inputMethod.js -+++ b/js/misc/inputMethod.js -@@ -15,8 +15,6 @@ var InputMethod = new Lang.Class({ - this._purpose = 0; - this._enabled = true; - this._currentFocus = null; -- this._currentEvent = null; -- this._doForwardEvent = false; - this._preeditStr = ''; - this._preeditPos = 0; - this._ibus = IBus.Bus.new_async(); -@@ -29,9 +27,6 @@ var InputMethod = new Lang.Class({ - this._onSourceChanged.bind(this)); - this._currentSource = this._inputSourceManager.currentSource; - -- let deviceManager = Clutter.DeviceManager.get_default(); -- this._virtualDevice = deviceManager.create_virtual_device(Clutter.InputDeviceType.KEYBOARD_DEVICE); -- - if (this._ibus.is_connected()) - this._onConnected(); - }, -@@ -121,20 +116,16 @@ var InputMethod = new Lang.Class({ - - _onForwardKeyEvent(context, keyval, keycode, state) { - let press = (state & IBus.ModifierType.RELEASE_MASK) == 0; -+ state &= ~(IBus.ModifierType.RELEASE_MASK); - -- if (this._currentEvent) { -- // If we are handling this same event in filter_key_press(), -- // just let it go through, sending the same event again will -- // be silenced away because the key counts as pressed. -- if (this._currentEvent.get_key_symbol() == keyval && -- (this._currentEvent.type() == Clutter.EventType.KEY_PRESS) == press) { -- this._doForwardEvent = true; -- return; -- } -- } -+ let curEvent = Clutter.get_current_event(); -+ let time; -+ if (curEvent) -+ time = curEvent.get_time(); -+ else -+ time = global.display.get_current_time_roundtrip(); - -- this._virtualDevice.notify_key(Clutter.get_current_event_time(), keycode, -- press ? Clutter.KeyState.PRESSED : Clutter.KeyState.RELEASED); -+ this.forward_key(keyval, keycode + 8, state & Clutter.ModifierType.MODIFIER_MASK, time, press); - }, - - vfunc_focus_in(focus) { -@@ -242,22 +233,13 @@ var InputMethod = new Lang.Class({ - if (event.type() == Clutter.EventType.KEY_RELEASE) - state |= IBus.ModifierType.RELEASE_MASK; - -- this._currentEvent = event; -- this._doForwardEvent = false; -- - this._context.process_key_event_async(event.get_key_symbol(), - event.get_key_code() - 8, // Convert XKB keycodes to evcodes - state, -1, null, - (context, res) => { - try { - let retval = context.process_key_event_async_finish(res); -- -- if (this._doForwardEvent) -- retval = false; -- - this.notify_key_event(event, retval); -- this._doForwardEvent = false; -- this._currentEvent = null; - } catch (e) { - log('Error processing key on IM: ' + e.message); - } --- -2.20.1 - diff --git a/SOURCES/disable-unlock-entry-until-question.patch b/SOURCES/disable-unlock-entry-until-question.patch index 6432366..d238ae8 100644 --- a/SOURCES/disable-unlock-entry-until-question.patch +++ b/SOURCES/disable-unlock-entry-until-question.patch @@ -1,4 +1,4 @@ -From bd6220c0450ab117c851fb1d21ca35ceb76739f8 Mon Sep 17 00:00:00 2001 +From a57132816ac7bd93d6875fee0a6c5b273177ac8d Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 30 Sep 2015 12:51:24 -0400 Subject: [PATCH 1/3] authPrompt: don't fade out auth messages if user types @@ -12,10 +12,10 @@ front, before a password is asked. 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index 481cd3a77..0ad3d2338 100644 +index d7f53a92e..d421a8856 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js -@@ -176,7 +176,7 @@ var AuthPrompt = new Lang.Class({ +@@ -169,7 +169,7 @@ var AuthPrompt = class { this._updateNextButtonSensitivity(this._entry.text.length > 0); this._entry.clutter_text.connect('text-changed', () => { @@ -25,10 +25,10 @@ index 481cd3a77..0ad3d2338 100644 this._updateNextButtonSensitivity(this._entry.text.length > 0 || this.verificationStatus == AuthPromptStatus.VERIFYING); -- -2.20.1 +2.21.0 -From 1aeff45d29983f8b0e970eb9bf15e5d19aa27903 Mon Sep 17 00:00:00 2001 +From 50af703ea95f2b73733c38e66c9c251663a51744 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 30 Sep 2015 14:36:33 -0400 Subject: [PATCH 2/3] authPrompt: don't spin unless answering question @@ -38,10 +38,10 @@ Subject: [PATCH 2/3] authPrompt: don't spin unless answering question 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index 0ad3d2338..f18ef41f2 100644 +index d421a8856..62c5bd078 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js -@@ -66,8 +66,8 @@ var AuthPrompt = new Lang.Class({ +@@ -60,8 +60,8 @@ var AuthPrompt = class { this.connect('next', () => { this.updateSensitivity(false); @@ -52,10 +52,10 @@ index 0ad3d2338..f18ef41f2 100644 } else { this._preemptiveAnswer = this._entry.text; -- -2.20.1 +2.21.0 -From 6afeaae067b5ad280a0899bd6b10931a9b2f02e4 Mon Sep 17 00:00:00 2001 +From b89be880936ad9dd145eb43890ac72d03c37785d Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 5 Oct 2015 15:26:18 -0400 Subject: [PATCH 3/3] authPrompt: stop accepting preemptive answer if user @@ -73,10 +73,10 @@ all. 1 file changed, 37 insertions(+) diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js -index f18ef41f2..89cef4d5d 100644 +index 62c5bd078..27eb31a89 100644 --- a/js/gdm/authPrompt.js +++ b/js/gdm/authPrompt.js -@@ -10,6 +10,7 @@ const St = imports.gi.St; +@@ -6,6 +6,7 @@ const Signals = imports.signals; const Animation = imports.ui.animation; const Batch = imports.gdm.batch; const GdmUtil = imports.gdm.util; @@ -84,7 +84,7 @@ index f18ef41f2..89cef4d5d 100644 const Params = imports.misc.params; const ShellEntry = imports.ui.shellEntry; const Tweener = imports.ui.tweener; -@@ -47,6 +48,8 @@ var AuthPrompt = new Lang.Class({ +@@ -41,6 +42,8 @@ var AuthPrompt = class { this._gdmClient = gdmClient; this._mode = mode; @@ -93,7 +93,7 @@ index f18ef41f2..89cef4d5d 100644 let reauthenticationOnly; if (this._mode == AuthPromptMode.UNLOCK_ONLY) reauthenticationOnly = true; -@@ -71,6 +74,11 @@ var AuthPrompt = new Lang.Class({ +@@ -65,6 +68,11 @@ var AuthPrompt = class { this._userVerifier.answerQuery(this._queryingService, this._entry.text); } else { this._preemptiveAnswer = this._entry.text; @@ -105,8 +105,8 @@ index f18ef41f2..89cef4d5d 100644 } }); -@@ -135,6 +143,11 @@ var AuthPrompt = new Lang.Class({ - }, +@@ -128,6 +136,11 @@ var AuthPrompt = class { + } _onDestroy() { + if (this._preemptiveAnswerWatchId) { @@ -116,9 +116,9 @@ index f18ef41f2..89cef4d5d 100644 + this._userVerifier.destroy(); this._userVerifier = null; - }, -@@ -349,6 +362,11 @@ var AuthPrompt = new Lang.Class({ - }, + } +@@ -342,6 +355,11 @@ var AuthPrompt = class { + } setQuestion(question) { + if (this._preemptiveAnswerWatchId) { @@ -129,9 +129,9 @@ index f18ef41f2..89cef4d5d 100644 this._label.set_text(question); this._label.show(); -@@ -434,12 +452,31 @@ var AuthPrompt = new Lang.Class({ +@@ -427,6 +445,19 @@ var AuthPrompt = class { } - }, + } + _onUserStoppedTypePreemptiveAnswer() { + if (!this._preemptiveAnswerWatchId || @@ -144,13 +144,14 @@ index f18ef41f2..89cef4d5d 100644 + + this._entry.text = ''; + this.updateSensitivity(false); -+ }, ++ } + reset() { let oldStatus = this.verificationStatus; this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; - this.cancelButton.reactive = true; +@@ -434,6 +465,12 @@ var AuthPrompt = class { this.nextButton.label = _("Next"); + this._preemptiveAnswer = null; + if (this._preemptiveAnswerWatchId) { + this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId); @@ -162,5 +163,5 @@ index f18ef41f2..89cef4d5d 100644 this._userVerifier.cancel(); -- -2.20.1 +2.21.0 diff --git a/SOURCES/enforce-smartcard-at-unlock.patch b/SOURCES/enforce-smartcard-at-unlock.patch index 32e473c..60274e5 100644 --- a/SOURCES/enforce-smartcard-at-unlock.patch +++ b/SOURCES/enforce-smartcard-at-unlock.patch @@ -1,4 +1,4 @@ -From 483ac09afb6503432e48bc30a57194a490ec98c9 Mon Sep 17 00:00:00 2001 +From 8ce91c85fe052d1a9f4fed0743bceae7d9654aa0 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 28 Sep 2015 10:57:02 -0400 Subject: [PATCH 1/3] smartcardManager: add way to detect if user logged using @@ -16,28 +16,27 @@ This commit adds the necessary api to detect that case. 1 file changed, 7 insertions(+) diff --git a/js/misc/smartcardManager.js b/js/misc/smartcardManager.js -index 60808b371..a9a748fb3 100644 +index fda782d1e..bb43c96e7 100644 --- a/js/misc/smartcardManager.js +++ b/js/misc/smartcardManager.js -@@ -112,6 +112,13 @@ var SmartcardManager = new Lang.Class({ - return false; - +@@ -112,5 +112,12 @@ var SmartcardManager = class { return true; -+ }, -+ + } + + loggedInWithToken() { + if (this._loginToken) + return true; + + return false; - } - - }); ++ } ++ + }; + Signals.addSignalMethods(SmartcardManager.prototype); -- -2.20.1 +2.21.0 -From 5da6b6393ac89eaae91d2b250fb432c7e1cbe676 Mon Sep 17 00:00:00 2001 +From 6decf5560d309579760e10048533d3bd9bc56c3c Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 28 Sep 2015 19:56:53 -0400 Subject: [PATCH 2/3] gdm: only unlock with smartcard, if smartcard used for @@ -50,10 +49,10 @@ gets used for unlock, too. 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/js/gdm/util.js b/js/gdm/util.js -index 261e1e433..3d6d69c10 100644 +index 2e9935250..2b80e1dd9 100644 --- a/js/gdm/util.js +++ b/js/gdm/util.js -@@ -134,7 +134,6 @@ var ShellUserVerifier = new Lang.Class({ +@@ -126,7 +126,6 @@ var ShellUserVerifier = class { this._settings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA }); this._settings.connect('changed', this._updateDefaultService.bind(this)); @@ -61,7 +60,7 @@ index 261e1e433..3d6d69c10 100644 this._fprintManager = Fprint.FprintManager(); this._smartcardManager = SmartcardManager.getSmartcardManager(); -@@ -146,6 +145,8 @@ var ShellUserVerifier = new Lang.Class({ +@@ -138,6 +137,8 @@ var ShellUserVerifier = class { this.smartcardDetected = false; this._checkForSmartcard(); @@ -70,8 +69,8 @@ index 261e1e433..3d6d69c10 100644 this._smartcardInsertedId = this._smartcardManager.connect('smartcard-inserted', this._checkForSmartcard.bind(this)); this._smartcardRemovedId = this._smartcardManager.connect('smartcard-removed', -@@ -412,7 +413,9 @@ var ShellUserVerifier = new Lang.Class({ - }, +@@ -407,7 +408,9 @@ var ShellUserVerifier = class { + } _updateDefaultService() { - if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY)) @@ -82,10 +81,10 @@ index 261e1e433..3d6d69c10 100644 else if (this._settings.get_boolean(SMARTCARD_AUTHENTICATION_KEY)) this._defaultService = SMARTCARD_SERVICE_NAME; -- -2.20.1 +2.21.0 -From 1d6de184a8bfbd54b9472eea822380b89f70509a Mon Sep 17 00:00:00 2001 +From dd844c98c3450dd1b21bcc580b51162c1b00ed2a Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 28 Sep 2015 19:57:36 -0400 Subject: [PATCH 3/3] gdm: update default service when smartcard inserted @@ -98,10 +97,10 @@ after we get a smartcard insertion event. 1 file changed, 2 insertions(+) diff --git a/js/gdm/util.js b/js/gdm/util.js -index 3d6d69c10..f5f9d5e5d 100644 +index 2b80e1dd9..6e940d2ab 100644 --- a/js/gdm/util.js +++ b/js/gdm/util.js -@@ -335,6 +335,8 @@ var ShellUserVerifier = new Lang.Class({ +@@ -327,6 +327,8 @@ var ShellUserVerifier = class { else if (this._preemptingService == SMARTCARD_SERVICE_NAME) this._preemptingService = null; @@ -109,7 +108,7 @@ index 3d6d69c10..f5f9d5e5d 100644 + this.emit('smartcard-status-changed'); } - }, + } -- -2.20.1 +2.21.0 diff --git a/SOURCES/fix-close-dialog-annoyances.patch b/SOURCES/fix-close-dialog-annoyances.patch deleted file mode 100644 index b7028be..0000000 --- a/SOURCES/fix-close-dialog-annoyances.patch +++ /dev/null @@ -1,231 +0,0 @@ -From fe9d88cf790282811719ea3343831ce5923687a3 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -Date: Mon, 21 May 2018 21:21:05 +0200 -Subject: [PATCH 1/3] closeDialog: Disable unredirection while showing - -The dialog won't be visible when unredirection is in place (for example -while a fullscreen window is focused), so disable unredirection while -the dialog is up. - -https://gitlab.gnome.org/GNOME/gnome-shell/issues/298 ---- - js/ui/closeDialog.js | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/js/ui/closeDialog.js b/js/ui/closeDialog.js -index aa0b5ceaf..821480a9c 100644 ---- a/js/ui/closeDialog.js -+++ b/js/ui/closeDialog.js -@@ -97,6 +97,8 @@ var CloseDialog = new Lang.Class({ - if (this._dialog != null) - return; - -+ Meta.disable_unredirect_for_screen(global.screen); -+ - this._addWindowEffect(); - this._initDialog(); - -@@ -117,6 +119,8 @@ var CloseDialog = new Lang.Class({ - if (this._dialog == null) - return; - -+ Meta.enable_unredirect_for_screen(global.screen); -+ - let dialog = this._dialog; - this._dialog = null; - this._removeWindowEffect(); --- -2.20.1 - - -From 0ba4c8fc447338740199cf0250d888716a8181fd Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -Date: Mon, 21 May 2018 23:12:35 +0200 -Subject: [PATCH 2/3] closeDialog: Periodically check for window to become - responsive again - -The close dialog for non-responding windows is closed automatically -when we detect that the window is responding again. However as we -currently only ping the window in response to certain user actions -(like focusing the window or opening the window menu), this can -easily go undetected. - -Address this by periodically pinging the window while the close -dialog is shown. - -https://gitlab.gnome.org/GNOME/gnome-shell/issues/298 ---- - js/ui/closeDialog.js | 12 ++++++++++++ - 1 file changed, 12 insertions(+) - -diff --git a/js/ui/closeDialog.js b/js/ui/closeDialog.js -index 821480a9c..7943880d8 100644 ---- a/js/ui/closeDialog.js -+++ b/js/ui/closeDialog.js -@@ -2,6 +2,7 @@ - - const Clutter = imports.gi.Clutter; - const Gio = imports.gi.Gio; -+const GLib = imports.gi.GLib; - const GObject = imports.gi.GObject; - const Lang = imports.lang; - const Meta = imports.gi.Meta; -@@ -13,6 +14,7 @@ const Tweener = imports.ui.tweener; - - var FROZEN_WINDOW_BRIGHTNESS = -0.3 - var DIALOG_TRANSITION_TIME = 0.15 -+var ALIVE_TIMEOUT = 5000; - - var CloseDialog = new Lang.Class({ - Name: 'CloseDialog', -@@ -26,6 +28,7 @@ var CloseDialog = new Lang.Class({ - this.parent(); - this._window = window; - this._dialog = null; -+ this._timeoutId = 0; - }, - - get window() { -@@ -99,6 +102,12 @@ var CloseDialog = new Lang.Class({ - - Meta.disable_unredirect_for_screen(global.screen); - -+ this._timeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, ALIVE_TIMEOUT, -+ () => { -+ this._window.check_alive(global.display.get_current_time_roundtrip()); -+ return GLib.SOURCE_CONTINUE; -+ }); -+ - this._addWindowEffect(); - this._initDialog(); - -@@ -121,6 +130,9 @@ var CloseDialog = new Lang.Class({ - - Meta.enable_unredirect_for_screen(global.screen); - -+ GLib.source_remove(this._timeoutId); -+ this._timeoutId = 0; -+ - let dialog = this._dialog; - this._dialog = null; - this._removeWindowEffect(); --- -2.20.1 - - -From 7e41beb3fca2bf4809a852cbf6699669fff4cd6f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -Date: Tue, 4 Sep 2018 13:53:24 +0200 -Subject: [PATCH 3/3] closeDialog: Untrack chrome when window loses focus - -On X11, reactive chrome must be added to the input region in order -to work as expected. However that region works independently from -any window stacking, with the result that the unresponsive-app dialog -currently blocks all input in the "covered" area, even in windows -stacked above the unresponsive window. - -The correct fix would be to track the unobscured parts of the dialog -and set the input region from that, but that's quite cumbersome. So -instead, only track chrome when the corresponding window is focused -(or the dialog itself of course). - -https://gitlab.gnome.org/GNOME/gnome-shell/issues/273 ---- - js/ui/closeDialog.js | 52 +++++++++++++++++++++++++++++++++++++++++--- - 1 file changed, 49 insertions(+), 3 deletions(-) - -diff --git a/js/ui/closeDialog.js b/js/ui/closeDialog.js -index 7943880d8..c4b033230 100644 ---- a/js/ui/closeDialog.js -+++ b/js/ui/closeDialog.js -@@ -28,7 +28,10 @@ var CloseDialog = new Lang.Class({ - this.parent(); - this._window = window; - this._dialog = null; -+ this._tracked = undefined; - this._timeoutId = 0; -+ this._windowFocusChangedId = 0; -+ this._keyFocusChangedId = 0; - }, - - get window() { -@@ -96,6 +99,37 @@ var CloseDialog = new Lang.Class({ - this.response(Meta.CloseDialogResponse.FORCE_CLOSE); - }, - -+ _onFocusChanged() { -+ if (Meta.is_wayland_compositor()) -+ return; -+ -+ let focusWindow = global.display.focus_window; -+ let keyFocus = global.stage.key_focus; -+ -+ let shouldTrack; -+ if (focusWindow != null) -+ shouldTrack = focusWindow == this._window; -+ else -+ shouldTrack = keyFocus && this._dialog.contains(keyFocus); -+ -+ if (this._tracked === shouldTrack) -+ return; -+ -+ if (shouldTrack) -+ Main.layoutManager.trackChrome(this._dialog, -+ { affectsInputRegion: true }); -+ else -+ Main.layoutManager.untrackChrome(this._dialog); -+ -+ // The buttons are broken when they aren't added to the input region, -+ // so disable them properly in that case -+ this._dialog.buttonLayout.get_children().forEach(b => { -+ b.reactive = shouldTrack; -+ }); -+ -+ this._tracked = shouldTrack; -+ }, -+ - vfunc_show() { - if (this._dialog != null) - return; -@@ -108,6 +142,14 @@ var CloseDialog = new Lang.Class({ - return GLib.SOURCE_CONTINUE; - }); - -+ this._windowFocusChangedId = -+ global.display.connect('notify::focus-window', -+ this._onFocusChanged.bind(this)); -+ -+ this._keyFocusChangedId = -+ global.stage.connect('notify::key-focus', -+ this._onFocusChanged.bind(this)); -+ - this._addWindowEffect(); - this._initDialog(); - -@@ -118,9 +160,7 @@ var CloseDialog = new Lang.Class({ - { scale_y: 1, - transition: 'linear', - time: DIALOG_TRANSITION_TIME, -- onComplete: () => { -- Main.layoutManager.trackChrome(this._dialog, { affectsInputRegion: true }); -- } -+ onComplete: this._onFocusChanged.bind(this) - }); - }, - -@@ -133,6 +173,12 @@ var CloseDialog = new Lang.Class({ - GLib.source_remove(this._timeoutId); - this._timeoutId = 0; - -+ global.display.disconnect(this._windowFocusChangedId) -+ this._windowFocusChangedId = 0; -+ -+ global.stage.disconnect(this._keyFocusChangedId); -+ this._keyFocusChangedId = 0; -+ - let dialog = this._dialog; - this._dialog = null; - this._removeWindowEffect(); --- -2.20.1 - diff --git a/SOURCES/fix-invalid-access-warnings.patch b/SOURCES/fix-invalid-access-warnings.patch index aa3ba14..8fbdb93 100644 --- a/SOURCES/fix-invalid-access-warnings.patch +++ b/SOURCES/fix-invalid-access-warnings.patch @@ -1,403 +1,7 @@ -From 1c838205dcd99a0a2a901f7449197da3df7b3954 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= -Date: Tue, 5 Dec 2017 22:41:17 +0100 -Subject: [PATCH 1/6] dnd: Nullify _dragActor after we've destroyed it, and - avoid invalid access - -We need to avoid that we use the _dragActor instance after that it has -been destroyed or we'll get errors. We now set it to null when this -happens, protecting any access to that. - -Add a DragState enum-like object to keep track of the state -instead of using booleans. - -Remove duplicated handler on 'destroy' and just use a generic one. - -https://bugzilla.gnome.org/show_bug.cgi?id=791233 ---- - js/ui/dnd.js | 65 +++++++++++++++++++++++++++++++--------------------- - 1 file changed, 39 insertions(+), 26 deletions(-) - -diff --git a/js/ui/dnd.js b/js/ui/dnd.js -index a38607c24..431c60d6c 100644 ---- a/js/ui/dnd.js -+++ b/js/ui/dnd.js -@@ -27,6 +27,12 @@ var DragMotionResult = { - CONTINUE: 3 - }; - -+var DragState = { -+ INIT: 0, -+ DRAGGING: 1, -+ CANCELLED: 2, -+}; -+ - var DRAG_CURSOR_MAP = { - 0: Meta.Cursor.DND_UNSUPPORTED_TARGET, - 1: Meta.Cursor.DND_COPY, -@@ -78,6 +84,8 @@ var _Draggable = new Lang.Class({ - dragActorOpacity: undefined }); - - this.actor = actor; -+ this._dragState = DragState.INIT; -+ - if (!params.manualMode) { - this.actor.connect('button-press-event', - this._onButtonPress.bind(this)); -@@ -88,7 +96,7 @@ var _Draggable = new Lang.Class({ - this.actor.connect('destroy', () => { - this._actorDestroyed = true; - -- if (this._dragInProgress && this._dragCancellable) -+ if (this._dragState == DragState.DRAGGING && this._dragCancellable) - this._cancelDrag(global.get_current_time()); - this.disconnectAll(); - }); -@@ -100,7 +108,6 @@ var _Draggable = new Lang.Class({ - this._dragActorOpacity = params.dragActorOpacity; - - this._buttonDown = false; // The mouse button has been pressed and has not yet been released. -- this._dragInProgress = false; // The drag has been started, and has not been dropped or cancelled yet. - this._animationInProgress = false; // The drag is over and the item is in the process of animating to its original position (snapping back or reverting). - this._dragCancellable = true; - -@@ -206,9 +213,10 @@ var _Draggable = new Lang.Class({ - (event.type() == Clutter.EventType.TOUCH_END && - global.display.is_pointer_emulating_sequence(event.get_event_sequence()))) { - this._buttonDown = false; -- if (this._dragInProgress) { -+ if (this._dragState == DragState.DRAGGING) { - return this._dragActorDropped(event); -- } else if (this._dragActor != null && !this._animationInProgress) { -+ } else if ((this._dragActor != null || this._dragState == DragState.CANCELLED) && -+ !this._animationInProgress) { - // Drag must have been cancelled with Esc. - this._dragComplete(); - return Clutter.EVENT_STOP; -@@ -222,14 +230,14 @@ var _Draggable = new Lang.Class({ - } else if (event.type() == Clutter.EventType.MOTION || - (event.type() == Clutter.EventType.TOUCH_UPDATE && - global.display.is_pointer_emulating_sequence(event.get_event_sequence()))) { -- if (this._dragInProgress) { -+ if (this._dragActor && this._dragState == DragState.DRAGGING) { - return this._updateDragPosition(event); -- } else if (this._dragActor == null) { -+ } else if (this._dragActor == null && this._dragState != DragState.CANCELLED) { - return this._maybeStartDrag(event); - } - // We intercept KEY_PRESS event so that we can process Esc key press to cancel - // dragging and ignore all other key presses. -- } else if (event.type() == Clutter.EventType.KEY_PRESS && this._dragInProgress) { -+ } else if (event.type() == Clutter.EventType.KEY_PRESS && this._dragState == DragState.DRAGGING) { - let symbol = event.get_key_symbol(); - if (symbol == Clutter.Escape) { - this._cancelDrag(event.get_time()); -@@ -265,7 +273,7 @@ var _Draggable = new Lang.Class({ - */ - startDrag(stageX, stageY, time, sequence) { - currentDraggable = this; -- this._dragInProgress = true; -+ this._dragState = DragState.DRAGGING; - - // Special-case St.Button: the pointer grab messes with the internal - // state, so force a reset to a reasonable state here -@@ -342,6 +350,13 @@ var _Draggable = new Lang.Class({ - Shell.util_set_hidden_from_pick(this._dragActor, true); - } - -+ this._dragActorDestroyId = this._dragActor.connect('destroy', () => { -+ // Cancel ongoing animation (if any) -+ this._finishAnimation(); -+ -+ this._dragActor = null; -+ this._dragState = DragState.CANCELLED; -+ }); - this._dragOrigOpacity = this._dragActor.opacity; - if (this._dragActorOpacity != undefined) - this._dragActor.opacity = this._dragActorOpacity; -@@ -500,7 +515,7 @@ var _Draggable = new Lang.Class({ - event.get_time())) { - // If it accepted the drop without taking the actor, - // handle it ourselves. -- if (this._dragActor.get_parent() == Main.uiGroup) { -+ if (this._dragActor && this._dragActor.get_parent() == Main.uiGroup) { - if (this._restoreOnSuccess) { - this._restoreDragActor(event.get_time()); - return true; -@@ -508,7 +523,7 @@ var _Draggable = new Lang.Class({ - this._dragActor.destroy(); - } - -- this._dragInProgress = false; -+ this._dragState = DragState.INIT; - global.screen.set_cursor(Meta.Cursor.DEFAULT); - this.emit('drag-end', event.get_time(), true); - this._dragComplete(); -@@ -557,20 +572,22 @@ var _Draggable = new Lang.Class({ - - _cancelDrag(eventTime) { - this.emit('drag-cancelled', eventTime); -- this._dragInProgress = false; -- let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation(); -+ let wasCancelled = (this._dragState == DragState.CANCELLED); -+ this._dragState = DragState.CANCELLED; - -- if (this._actorDestroyed) { -+ if (this._actorDestroyed || wasCancelled) { - global.screen.set_cursor(Meta.Cursor.DEFAULT); - if (!this._buttonDown) - this._dragComplete(); - this.emit('drag-end', eventTime, false); -- if (!this._dragOrigParent) -+ if (!this._dragOrigParent && this._dragActor) - this._dragActor.destroy(); - - return; - } - -+ let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation(); -+ - this._animateDragEnd(eventTime, - { x: snapBackX, - y: snapBackY, -@@ -581,7 +598,7 @@ var _Draggable = new Lang.Class({ - }, - - _restoreDragActor(eventTime) { -- this._dragInProgress = false; -+ this._dragState = DragState.INIT; - let [restoreX, restoreY, restoreScale] = this._getRestoreLocation(); - - // fade the actor back in at its original location -@@ -596,12 +613,6 @@ var _Draggable = new Lang.Class({ - _animateDragEnd(eventTime, params) { - this._animationInProgress = true; - -- // finish animation if the actor gets destroyed -- // during it -- this._dragActorDestroyId = -- this._dragActor.connect('destroy', -- this._finishAnimation.bind(this)); -- - params['opacity'] = this._dragOrigOpacity; - params['transition'] = 'easeOutQuad'; - params['onComplete'] = this._onAnimationComplete; -@@ -624,9 +635,6 @@ var _Draggable = new Lang.Class({ - }, - - _onAnimationComplete(dragActor, eventTime) { -- dragActor.disconnect(this._dragActorDestroyId); -- this._dragActorDestroyId = 0; -- - if (this._dragOrigParent) { - Main.uiGroup.remove_child(this._dragActor); - this._dragOrigParent.add_actor(this._dragActor); -@@ -641,7 +649,7 @@ var _Draggable = new Lang.Class({ - }, - - _dragComplete() { -- if (!this._actorDestroyed) -+ if (!this._actorDestroyed && this._dragActor) - Shell.util_set_hidden_from_pick(this._dragActor, false); - - this._ungrabEvents(); -@@ -652,7 +660,12 @@ var _Draggable = new Lang.Class({ - this._updateHoverId = 0; - } - -- this._dragActor = undefined; -+ if (this._dragActor) { -+ this._dragActor.disconnect(this._dragActorDestroyId); -+ this._dragActor = null; -+ } -+ -+ this._dragState = DragState.INIT; - currentDraggable = null; - } - }); --- -2.20.1 - - -From 98fd633f3b124f72f71aa5da38df9c69121fd4ed Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Jonas=20=C3=85dahl?= -Date: Thu, 3 Jan 2019 11:53:13 +0100 -Subject: [PATCH 2/6] dnd: Repick target actor if destroyed mid iteration - -The picked target actor may be destroyed (e.g. hover style change -resulting in the ClutterTexture to be destroyed). If we don't handle -this, GJS will abort when it sees the exception caused by Javascript -code trying to access the destroyed target actor. - -To handle it, listen on the 'destroy' signal on the target actor, and -repick, so a valid actor is passed to the next motion callback. - -Fixes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/632 ---- - js/ui/dnd.js | 22 ++++++++++++++++++++-- - 1 file changed, 20 insertions(+), 2 deletions(-) - -diff --git a/js/ui/dnd.js b/js/ui/dnd.js -index 431c60d6c..9e961a186 100644 ---- a/js/ui/dnd.js -+++ b/js/ui/dnd.js -@@ -411,10 +411,15 @@ var _Draggable = new Lang.Class({ - 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, -@@ -422,6 +427,18 @@ var _Draggable = new Lang.Class({ - 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) { -@@ -432,6 +449,7 @@ var _Draggable = new Lang.Class({ - } - } - } -+ dragEvent.targetActor.disconnect(targetActorDestroyHandlerId); - - while (target) { - if (target._delegate && target._delegate.handleDragOver) { --- -2.20.1 - - -From 2dfae7213f0d3849dfcc38bb2fbaeaf80d4e8b19 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= -Date: Wed, 4 Jul 2018 15:56:25 +0200 -Subject: [PATCH 3/6] 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 ---- - js/ui/messageList.js | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/js/ui/messageList.js b/js/ui/messageList.js -index aff201ed6..2d397c1d7 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(); --- -2.20.1 - - -From 41bde330384ba7021c96ea3d4575bfa12295dff1 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= -Date: Wed, 4 Jul 2018 16:55:28 +0200 -Subject: [PATCH 4/6] 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 ---- - js/ui/components/automountManager.js | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/js/ui/components/automountManager.js b/js/ui/components/automountManager.js -index 2d8f3f8fb..a6cd85792 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'); - } - }); --- -2.20.1 - - -From f0d608cea903538683b2eaafadbdefe7ff41475e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Florian=20M=C3=BCllner?= -Date: Mon, 9 Jul 2018 13:31:26 +0200 -Subject: [PATCH 5/6] calendar: chain up to parent on _onDestroy - ---- - js/ui/calendar.js | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/js/ui/calendar.js b/js/ui/calendar.js -index a46017ad0..65133d9f7 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; --- -2.20.1 - - -From dc75a4e785e5f19f61bfd8f58e079c0bdfd0fca8 Mon Sep 17 00:00:00 2001 +From 76eebb42ed4c76970a9debfc0cd41537923eccde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 5 Dec 2017 02:41:50 +0100 -Subject: [PATCH 6/6] tweener: Save handlers on target and remove them on +Subject: [PATCH 1/2] tweener: Save handlers on target and remove them on destroy Saving handlers we had using the wrapper as a property of the object and delete @@ -411,10 +15,10 @@ https://bugzilla.gnome.org/show_bug.cgi?id=791233 1 file changed, 50 insertions(+), 13 deletions(-) diff --git a/js/ui/tweener.js b/js/ui/tweener.js -index 1a85e2fb1..22818ba4b 100644 +index bb9ea557c..c04cede25 100644 --- a/js/ui/tweener.js +++ b/js/ui/tweener.js -@@ -69,30 +69,67 @@ function _getTweenState(target) { +@@ -63,30 +63,67 @@ function _getTweenState(target) { return target.__ShellTweenerState; } @@ -496,5 +100,125 @@ index 1a85e2fb1..22818ba4b 100644 function _actorDestroyed(target) { -- -2.20.1 +2.21.0 + + +From 730f6f7d708a0cbcfcc75e4a1fba8512ac7c4c82 Mon Sep 17 00:00:00 2001 +From: Cosimo Cecchi +Date: Sun, 26 May 2019 08:31:07 -0700 +Subject: [PATCH 2/2] windowAttentionHandler: disconnect signals before + destruction +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The 'destroy' signal is emitted at the end of the destroy() method. +However the implementation of destroy() can end up emitting one of the +signals we connect to on the window, causing us to re-enter destroy +from its callback. +That will in turn lead to some objects getting disposed twice, which +produces a stack trace like the following one. + +This commit fixes the issue by overriding the destroy() method instead +of connecting to the signal, which allows us to disconnect the signal +handlers from the window at an earlier time and avoid re-entrancy. + +-- + +gnome-shell[1082]: Object Gio.Settings (0x7f0af8143f00), has been already deallocated — impossible to access it. This might be caused by the object having been destroyed from C code using something such as destroy(), dispose(), or remove() vfuncs. +org.gnome.Shell.desktop[1082]: == Stack trace for context 0x5627f7d1e220 == +org.gnome.Shell.desktop[1082]: #0 5627f9e801a8 i resource:///org/gnome/shell/ui/messageTray.js:238 (7f0aefa9eca0 @ 22) +org.gnome.Shell.desktop[1082]: #1 5627f9e80108 i resource:///org/gnome/shell/ui/messageTray.js:802 (7f0aefaa2ee0 @ 28) +org.gnome.Shell.desktop[1082]: #2 5627f9e80070 i resource:///org/gnome/shell/ui/windowAttentionHandler.js:79 (7f0aef7b29d0 @ 62) +org.gnome.Shell.desktop[1082]: #3 7fffa69fbfc0 b self-hosted:979 (7f0aefa515e0 @ 440) +org.gnome.Shell.desktop[1082]: #4 5627f9e7ffe0 i resource:///org/gnome/shell/ui/messageTray.js:121 (7f0aefa9e1f0 @ 71) +org.gnome.Shell.desktop[1082]: #5 5627f9e7ff38 i resource:///org/gnome/shell/ui/messageTray.js:1408 (7f0aefaa58b0 @ 22) +org.gnome.Shell.desktop[1082]: #6 5627f9e7fe80 i resource:///org/gnome/shell/ui/messageTray.js:1237 (7f0aefaa51f0 @ 729) +org.gnome.Shell.desktop[1082]: #7 5627f9e7fde8 i resource:///org/gnome/shell/ui/messageTray.js:1055 (7f0aefaa3d30 @ 124) +org.gnome.Shell.desktop[1082]: #8 7fffa69ff8e0 b self-hosted:979 (7f0aefa515e0 @ 440) +org.gnome.Shell.desktop[1082]: #9 7fffa69ff9d0 b resource:///org/gnome/gjs/modules/signals.js:142 (7f0aefccb670 @ 386) +org.gnome.Shell.desktop[1082]: #10 5627f9e7fd58 i resource:///org/gnome/shell/ui/messageTray.js:479 (7f0aefaa0940 @ 50) +org.gnome.Shell.desktop[1082]: #11 5627f9e7fcb8 i resource:///org/gnome/shell/ui/messageTray.js:808 (7f0aefaa2ee0 @ 99) +org.gnome.Shell.desktop[1082]: #12 5627f9e7fc28 i resource:///org/gnome/shell/ui/windowAttentionHandler.js:69 (7f0aef7b28b0 @ 13) +org.gnome.Shell.desktop[1082]: #13 5627f9e7fb80 i resource:///org/gnome/shell/ui/main.js:566 (7f0aefcd8820 @ 216) +org.gnome.Shell.desktop[1082]: #14 5627f9e7fad0 i resource:///org/gnome/shell/ui/windowAttentionHandler.js:103 (7f0aef7b2c10 @ 27) +org.gnome.Shell.desktop[1082]: #15 5627f9e7fa58 i resource:///org/gnome/shell/ui/windowAttentionHandler.js:43 (7f0aef7b2700 @ 17) +org.gnome.Shell.desktop[1082]: #16 7fffa6a03350 b resource:///org/gnome/gjs/modules/signals.js:142 (7f0aefccb670 @ 386) +org.gnome.Shell.desktop[1082]: #17 5627f9e7f9d0 i resource:///org/gnome/shell/ui/messageTray.js:471 (7f0aefaa08b0 @ 22) +org.gnome.Shell.desktop[1082]: #18 5627f9e7f950 i resource:///org/gnome/shell/ui/calendar.js:752 (7f0aefaabdc0 @ 22) +org.gnome.Shell.desktop[1082]: #19 7fffa6a048f0 b self-hosted:979 (7f0aefa515e0 @ 440) +org.gnome.Shell.desktop[1082]: == Stack trace for context 0x5627f7d1e220 == +org.gnome.Shell.desktop[1082]: #0 5627f9e801a8 i resource:///org/gnome/shell/ui/messageTray.js:239 (7f0aefa9eca0 @ 42) +org.gnome.Shell.desktop[1082]: #1 5627f9e80108 i resource:///org/gnome/shell/ui/messageTray.js:802 (7f0aefaa2ee0 @ 28) +org.gnome.Shell.desktop[1082]: #2 5627f9e80070 i resource:///org/gnome/shell/ui/windowAttentionHandler.js:79 (7f0aef7b29d0 @ 62) +org.gnome.Shell.desktop[1082]: #3 7fffa69fbfc0 b self-hosted:979 (7f0aefa515e0 @ 440) +org.gnome.Shell.desktop[1082]: #4 5627f9e7ffe0 i resource:///org/gnome/shell/ui/messageTray.js:121 (7f0aefa9e1f0 @ 71) +org.gnome.Shell.desktop[1082]: #5 5627f9e7ff38 i resource:///org/gnome/shell/ui/messageTray.js:1408 (7f0aefaa58b0 @ 22) +org.gnome.Shell.desktop[1082]: #6 5627f9e7fe80 i resource:///org/gnome/shell/ui/messageTray.js:1237 (7f0aefaa51f0 @ 729) +org.gnome.Shell.desktop[1082]: #7 5627f9e7fde8 i resource:///org/gnome/shell/ui/messageTray.js:1055 (7f0aefaa3d30 @ 124) +org.gnome.Shell.desktop[1082]: #8 7fffa69ff8e0 b self-hosted:979 (7f0aefa515e0 @ 440) +org.gnome.Shell.desktop[1082]: #9 7fffa69ff9d0 b resource:///org/gnome/gjs/modules/signals.js:142 (7f0aefccb670 @ 386) +org.gnome.Shell.desktop[1082]: #10 5627f9e7fd58 i resource:///org/gnome/shell/ui/messageTray.js:479 (7f0aefaa0940 @ 50) +org.gnome.Shell.desktop[1082]: #11 5627f9e7fcb8 i resource:///org/gnome/shell/ui/messageTray.js:808 (7f0aefaa2ee0 @ 99) +org.gnome.Shell.desktop[1082]: #12 5627f9e7fc28 i resource:///org/gnome/shell/ui/windowAttentionHandler.js:69 (7f0aef7b28b0 @ 13) +org.gnome.Shell.desktop[1082]: #13 5627f9e7fb80 i resource:///org/gnome/shell/ui/main.js:566 (7f0aefcd8820 @ 216) +org.gnome.Shell.desktop[1082]: #14 5627f9e7fad0 i resource:///org/gnome/shell/ui/windowAttentionHandler.js:103 (7f0aef7b2c10 @ 27) +org.gnome.Shell.desktop[1082]: #15 5627f9e7fa58 i resource:///org/gnome/shell/ui/windowAttentionHandler.js:43 (7f0aef7b2700 @ 17) +org.gnome.Shell.desktop[1082]: #16 7fffa6a03350 b resource:///org/gnome/gjs/modules/signals.js:142 (7f0aefccb670 @ 386) +org.gnome.Shell.desktop[1082]: #17 5627f9e7f9d0 i resource:///org/gnome/shell/ui/messageTray.js:471 (7f0aefaa08b0 @ 22) +org.gnome.Shell.desktop[1082]: #18 5627f9e7f950 i resource:///org/gnome/shell/ui/calendar.js:752 (7f0aefaabdc0 @ 22) +org.gnome.Shell.desktop[1082]: #19 7fffa6a048f0 b self-hosted:979 (7f0aefa515e0 @ 440) +gnome-shell[1082]: g_object_run_dispose: assertion 'G_IS_OBJECT (object)' failed +gnome-shell[1082]: Object Gio.Settings (0x7f0af8161750), has been already deallocated — impossible to access it. This might be caused by the object having been destroyed from C code using something such as destroy(), dispose(), or remove() vfuncs. +gnome-shell[1082]: g_object_run_dispose: assertion 'G_IS_OBJECT (object)' failed + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/555 +--- + js/ui/windowAttentionHandler.js | 17 ++++++++--------- + 1 file changed, 8 insertions(+), 9 deletions(-) + +diff --git a/js/ui/windowAttentionHandler.js b/js/ui/windowAttentionHandler.js +index abdb8a444..a9a7111ba 100644 +--- a/js/ui/windowAttentionHandler.js ++++ b/js/ui/windowAttentionHandler.js +@@ -69,8 +69,6 @@ var Source = class WindowAttentionSource extends MessageTray.Source { + () => { this.destroy(); })); + this.signalIDs.push(this._window.connect('unmanaged', + () => { this.destroy(); })); +- +- this.connect('destroy', this._onDestroy.bind(this)); + } + + _sync() { +@@ -79,13 +77,6 @@ var Source = class WindowAttentionSource extends MessageTray.Source { + this.destroy(); + } + +- _onDestroy() { +- for(let i = 0; i < this.signalIDs.length; i++) { +- this._window.disconnect(this.signalIDs[i]); +- } +- this.signalIDs = []; +- } +- + _createPolicy() { + if (this._app && this._app.get_app_info()) { + let id = this._app.get_id().replace(/\.desktop$/,''); +@@ -99,6 +90,14 @@ var Source = class WindowAttentionSource extends MessageTray.Source { + return this._app.create_icon_texture(size); + } + ++ destroy(params) { ++ for (let i = 0; i < this.signalIDs.length; i++) ++ this._window.disconnect(this.signalIDs[i]); ++ this.signalIDs = []; ++ ++ super.destroy(params); ++ } ++ + open() { + Main.activateWindow(this._window); + } +-- +2.21.0 diff --git a/SOURCES/gnome-shell-favourite-apps-firefox.patch b/SOURCES/gnome-shell-favourite-apps-firefox.patch index 56c498b..888491e 100644 --- a/SOURCES/gnome-shell-favourite-apps-firefox.patch +++ b/SOURCES/gnome-shell-favourite-apps-firefox.patch @@ -1,6 +1,18 @@ ---- gnome-shell-3.13.90/data/org.gnome.shell.gschema.xml.in.firefox 2014-08-20 20:28:07.601133033 +0200 -+++ gnome-shell-3.13.90/data/org.gnome.shell.gschema.xml.in 2014-08-20 20:28:41.741503518 +0200 -@@ -31,7 +31,7 @@ +From 87104647f061892525236a71f304b63609960626 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Thu, 9 Mar 2017 14:43:30 +0100 +Subject: [PATCH] appFavorites: Make firefox the default browser + +--- + data/org.gnome.shell.gschema.xml.in | 2 +- + js/ui/appFavorites.js | 1 + + 2 files changed, 2 insertions(+), 1 deletion(-) + +diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in +index 24e2a75b0..2f50036d0 100644 +--- a/data/org.gnome.shell.gschema.xml.in ++++ b/data/org.gnome.shell.gschema.xml.in +@@ -39,7 +39,7 @@ @@ -9,13 +21,18 @@ List of desktop file IDs for favorite applications The applications corresponding to these identifiers +diff --git a/js/ui/appFavorites.js b/js/ui/appFavorites.js +index 657e15965..1e44a1655 100644 --- a/js/ui/appFavorites.js +++ b/js/ui/appFavorites.js -@@ -31,6 +31,7 @@ const RENAMED_DESKTOP_IDS = { - 'gnotravex.desktop': 'gnome-tetravex.desktop', - 'gnotski.desktop': 'gnome-klotski.desktop', - 'gtali.desktop': 'tali.desktop', +@@ -49,6 +49,7 @@ const RENAMED_DESKTOP_IDS = { + 'gnotski.desktop': 'org.gnome.Klotski.desktop', + 'gtali.desktop': 'org.gnome.Tali.desktop', + 'iagno.desktop': 'org.gnome.Reversi.desktop', + 'mozilla-firefox.desktop': 'firefox.desktop', 'nautilus.desktop': 'org.gnome.Nautilus.desktop', - 'polari.desktop': 'org.gnome.Polari.desktop', - 'totem.desktop': 'org.gnome.Totem.desktop', + 'org.gnome.gnome-2048.desktop': 'org.gnome.TwentyFortyEight.desktop', + 'org.gnome.taquin.desktop': 'org.gnome.Taquin.desktop', +-- +2.21.0 + diff --git a/SOURCES/gnome-shell-favourite-apps-terminal.patch b/SOURCES/gnome-shell-favourite-apps-terminal.patch index b800cef..d3f0377 100644 --- a/SOURCES/gnome-shell-favourite-apps-terminal.patch +++ b/SOURCES/gnome-shell-favourite-apps-terminal.patch @@ -1,4 +1,4 @@ -From 78386767ec5e7b249186133333462d9866c6e18e Mon Sep 17 00:00:00 2001 +From d15a92aeaa075230f711921f4bcd929c49bfc97d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Thu, 9 Mar 2017 14:44:32 +0100 Subject: [PATCH] appFavorites: Add terminal @@ -8,7 +8,7 @@ Subject: [PATCH] appFavorites: Add terminal 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in -index 8fb7f7291..6f1459c86 100644 +index 40526187e..9d7e011fc 100644 --- a/data/org.gnome.shell.gschema.xml.in +++ b/data/org.gnome.shell.gschema.xml.in @@ -39,7 +39,7 @@ @@ -21,5 +21,5 @@ index 8fb7f7291..6f1459c86 100644 The applications corresponding to these identifiers -- -2.20.1 +2.21.0 diff --git a/SOURCES/gnome-shell-favourite-apps-yelp.patch b/SOURCES/gnome-shell-favourite-apps-yelp.patch index c87dbd9..d96597a 100644 --- a/SOURCES/gnome-shell-favourite-apps-yelp.patch +++ b/SOURCES/gnome-shell-favourite-apps-yelp.patch @@ -1,4 +1,4 @@ -From e2a0880744b7e508fba7728c6810ac43f3ea2a87 Mon Sep 17 00:00:00 2001 +From 53eba56c29c2c3f25bdfc4b73d1b9ce74ce2504b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Thu, 9 Mar 2017 14:44:03 +0100 Subject: [PATCH] Add 'yelp' to default favorites @@ -9,7 +9,7 @@ Help should be easily available, so add it to the default favorites. 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in -index 868d8edc9..8fb7f7291 100644 +index 2f50036d0..40526187e 100644 --- a/data/org.gnome.shell.gschema.xml.in +++ b/data/org.gnome.shell.gschema.xml.in @@ -39,7 +39,7 @@ @@ -22,5 +22,5 @@ index 868d8edc9..8fb7f7291 100644 The applications corresponding to these identifiers -- -2.20.1 +2.21.0 diff --git a/SOURCES/horizontal-workspace-support.patch b/SOURCES/horizontal-workspace-support.patch new file mode 100644 index 0000000..8605e1d --- /dev/null +++ b/SOURCES/horizontal-workspace-support.patch @@ -0,0 +1,399 @@ +From b42dd3f87ad5fb6c7ee139cb0de22e0fbb393ba2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Tue, 4 Jun 2019 19:22:26 +0000 +Subject: [PATCH 1/2] workspaceSwitcherPopup: Support horizontal layout + +While mutter supports a variety of different grid layouts (n columns/rows, +growing vertically or horizontally from any of the four corners), we +hardcode a fixed vertical layout of a single column. + +Now that mutter exposes the actual layout to us, add support for a more +traditional horizontal layout as well. + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/575 +--- + data/theme/gnome-shell-sass/_common.scss | 3 +- + js/ui/windowManager.js | 36 ++++++++-- + js/ui/workspaceSwitcherPopup.js | 86 ++++++++++++++++++------ + 3 files changed, 98 insertions(+), 27 deletions(-) + +diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss +index 293ea2ab9..b1eeb0ce9 100644 +--- a/data/theme/gnome-shell-sass/_common.scss ++++ b/data/theme/gnome-shell-sass/_common.scss +@@ -680,7 +680,8 @@ StScrollBar { + spacing: 8px; + } + +- .ws-switcher-active-up, .ws-switcher-active-down { ++ .ws-switcher-active-up, .ws-switcher-active-down, ++ .ws-switcher-active-left, .ws-switcher-active-right { + height: 50px; + background-color: $selected_bg_color; + color: $selected_fg_color; +diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js +index b9f5fef46..dfe1b4460 100644 +--- a/js/ui/windowManager.js ++++ b/js/ui/windowManager.js +@@ -2145,6 +2145,8 @@ var WindowManager = class { + let [action,,,target] = binding.get_name().split('-'); + let newWs; + let direction; ++ let vertical = workspaceManager.layout_rows == -1; ++ let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL; + + if (action == 'move') { + // "Moving" a window to another workspace doesn't make sense when +@@ -2157,7 +2159,12 @@ var WindowManager = class { + } + + if (target == 'last') { +- direction = Meta.MotionDirection.DOWN; ++ if (vertical) ++ direction = Meta.MotionDirection.DOWN; ++ else if (rtl) ++ direction = Meta.MotionDirection.LEFT; ++ else ++ direction = Meta.MotionDirection.RIGHT; + newWs = workspaceManager.get_workspace_by_index(workspaceManager.n_workspaces - 1); + } else if (isNaN(target)) { + // Prepend a new workspace dynamically +@@ -2173,16 +2180,33 @@ var WindowManager = class { + target--; + newWs = workspaceManager.get_workspace_by_index(target); + +- if (workspaceManager.get_active_workspace().index() > target) +- direction = Meta.MotionDirection.UP; +- else +- direction = Meta.MotionDirection.DOWN; ++ if (workspaceManager.get_active_workspace().index() > target) { ++ if (vertical) ++ direction = Meta.MotionDirection.UP; ++ else if (rtl) ++ direction = Meta.MotionDirection.RIGHT; ++ else ++ direction = Meta.MotionDirection.LEFT; ++ } else { ++ if (vertical) ++ direction = Meta.MotionDirection.DOWN; ++ else if (rtl) ++ direction = Meta.MotionDirection.LEFT; ++ else ++ direction = Meta.MotionDirection.RIGHT; ++ } + } + +- if (direction != Meta.MotionDirection.UP && ++ if (workspaceManager.layout_rows == -1 && ++ direction != Meta.MotionDirection.UP && + direction != Meta.MotionDirection.DOWN) + return; + ++ if (workspaceManager.layout_columns == -1 && ++ direction != Meta.MotionDirection.LEFT && ++ direction != Meta.MotionDirection.RIGHT) ++ return; ++ + if (action == 'switch') + this.actionMoveWorkspace(newWs); + else +diff --git a/js/ui/workspaceSwitcherPopup.js b/js/ui/workspaceSwitcherPopup.js +index 26404eaab..d21c5de4d 100644 +--- a/js/ui/workspaceSwitcherPopup.js ++++ b/js/ui/workspaceSwitcherPopup.js +@@ -17,41 +17,75 @@ class WorkspaceSwitcherPopupList extends St.Widget { + this._itemSpacing = 0; + this._childHeight = 0; + this._childWidth = 0; ++ this._orientation = global.workspace_manager.layout_rows == -1 ++ ? Clutter.Orientation.VERTICAL ++ : Clutter.Orientation.HORIZONTAL; + + this.connect('style-changed', () => { + this._itemSpacing = this.get_theme_node().get_length('spacing'); + }); + } + +- vfunc_get_preferred_height(forWidth) { ++ _getPreferredSizeForOrientation(forSize) { + let workArea = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex); + let themeNode = this.get_theme_node(); + +- let availHeight = workArea.height; +- availHeight -= themeNode.get_vertical_padding(); ++ let availSize; ++ if (this._orientation == Clutter.Orientation.HORIZONTAL) ++ availSize = workArea.width - themeNode.get_horizontal_padding(); ++ else ++ availSize = workArea.height - themeNode.get_vertical_padding(); + +- let height = 0; ++ let size = 0; + for (let child of this.get_children()) { + let [childMinHeight, childNaturalHeight] = child.get_preferred_height(-1); +- let [childMinWidth, childNaturalWidth] = child.get_preferred_width(childNaturalHeight); +- height += childNaturalHeight * workArea.width / workArea.height; ++ let height = childNaturalHeight * workArea.width / workArea.height; ++ ++ if (this._orientation == Clutter.Orientation.HORIZONTAL) { ++ size += height * workArea.width / workArea.height; ++ } else { ++ size += height; ++ } + } + + let workspaceManager = global.workspace_manager; + let spacing = this._itemSpacing * (workspaceManager.n_workspaces - 1); +- height += spacing; +- height = Math.min(height, availHeight); ++ size += spacing; ++ size = Math.min(size, availSize); ++ ++ if (this._orientation == Clutter.Orientation.HORIZONTAL) { ++ this._childWidth = (size - spacing) / workspaceManager.n_workspaces; ++ return themeNode.adjust_preferred_width(size, size); ++ } else { ++ this._childHeight = (size - spacing) / workspaceManager.n_workspaces; ++ return themeNode.adjust_preferred_height(size, size); ++ } ++ } ++ ++ _getSizeForOppositeOrientation() { ++ let workArea = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex); + +- this._childHeight = (height - spacing) / workspaceManager.n_workspaces; ++ if (this._orientation == Clutter.Orientation.HORIZONTAL) { ++ this._childHeight = Math.round(this._childWidth * workArea.height / workArea.width); ++ return [this._childHeight, this._childHeight]; ++ } else { ++ this._childWidth = Math.round(this._childHeight * workArea.width / workArea.height); ++ return [this._childWidth, this._childWidth]; ++ } ++ } + +- return themeNode.adjust_preferred_height(height, height); ++ vfunc_get_preferred_height(forWidth) { ++ if (this._orientation == Clutter.Orientation.HORIZONTAL) ++ return this._getSizeForOppositeOrientation(); ++ else ++ return this._getPreferredSizeForOrientation(forWidth); + } + + vfunc_get_preferred_width(forHeight) { +- let workArea = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex); +- this._childWidth = Math.round(this._childHeight * workArea.width / workArea.height); +- +- return [this._childWidth, this._childWidth]; ++ if (this._orientation == Clutter.Orientation.HORIZONTAL) ++ return this._getPreferredSizeForOrientation(forHeight); ++ else ++ return this._getSizeForOppositeOrientation(); + } + + vfunc_allocate(box, flags) { +@@ -62,15 +96,23 @@ class WorkspaceSwitcherPopupList extends St.Widget { + + let childBox = new Clutter.ActorBox(); + ++ let rtl = this.text_direction == Clutter.TextDirection.RTL; ++ let x = rtl ? box.x2 - this._childWidth : box.x1; + let y = box.y1; +- let prevChildBoxY2 = box.y1 - this._itemSpacing; + for (let child of this.get_children()) { +- childBox.x1 = box.x1; +- childBox.x2 = box.x1 + this._childWidth; +- childBox.y1 = prevChildBoxY2 + this._itemSpacing; ++ childBox.x1 = Math.round(x); ++ childBox.x2 = Math.round(x + this._childWidth); ++ childBox.y1 = Math.round(y); + childBox.y2 = Math.round(y + this._childHeight); +- y += this._childHeight + this._itemSpacing; +- prevChildBoxY2 = childBox.y2; ++ ++ if (this._orientation == Clutter.Orientation.HORIZONTAL) { ++ if (rtl) ++ x -= this._childWidth + this._itemSpacing; ++ else ++ x += this._childWidth + this._itemSpacing; ++ } else { ++ y += this._childHeight + this._itemSpacing; ++ } + child.allocate(childBox, flags); + } + } +@@ -123,6 +165,10 @@ class WorkspaceSwitcherPopup extends St.Widget { + indicator = new St.Bin({ style_class: 'ws-switcher-active-up' }); + else if(i == this._activeWorkspaceIndex && this._direction == Meta.MotionDirection.DOWN) + indicator = new St.Bin({ style_class: 'ws-switcher-active-down' }); ++ else if(i == this._activeWorkspaceIndex && this._direction == Meta.MotionDirection.LEFT) ++ indicator = new St.Bin({ style_class: 'ws-switcher-active-left' }); ++ else if(i == this._activeWorkspaceIndex && this._direction == Meta.MotionDirection.RIGHT) ++ indicator = new St.Bin({ style_class: 'ws-switcher-active-right' }); + else + indicator = new St.Bin({ style_class: 'ws-switcher-box' }); + +-- +2.21.0 + + +From 813976ff69b15ab884d44f5f6a56ae66f407acfd Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Tue, 4 Jun 2019 19:49:23 +0000 +Subject: [PATCH 2/2] workspacesView: Support horizontal layout + +Just as we did for the workspace switcher popup, support workspaces +being laid out in a single row in the window picker. + +Note that this takes care of the various workspace switch actions in +the overview (scrolling, panning, touch(pad) gestures) as well as the +switch animation, but not of the overview's workspace switcher component. + +There are currently no plans to support other layouts there, as the +component is inherently vertical (in fact, it was the whole reason for +switching the layout in the first place). + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/575 +--- + js/ui/workspacesView.js | 81 ++++++++++++++++++++++++++++++----------- + 1 file changed, 60 insertions(+), 21 deletions(-) + +diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js +index fe06d9dae..069937d5a 100644 +--- a/js/ui/workspacesView.js ++++ b/js/ui/workspacesView.js +@@ -181,26 +181,32 @@ var WorkspacesView = class extends WorkspacesViewBase { + + Tweener.removeTweens(workspace.actor); + +- let y = (w - active) * this._fullGeometry.height; ++ let params = {}; ++ if (workspaceManager.layout_rows == -1) ++ params.y = (w - active) * this._fullGeometry.height; ++ else if (this.actor.text_direction == Clutter.TextDirection.RTL) ++ params.x = (active - w) * this._fullGeometry.width; ++ else ++ params.x = (w - active) * this._fullGeometry.width; + + if (showAnimation) { +- let params = { y: y, +- time: WORKSPACE_SWITCH_TIME, +- transition: 'easeOutQuad' +- }; ++ let tweenParams = Object.assign(params, { ++ time: WORKSPACE_SWITCH_TIME, ++ transition: 'easeOutQuad' ++ }); + // we have to call _updateVisibility() once before the + // animation and once afterwards - it does not really + // matter which tween we use, so we pick the first one ... + if (w == 0) { + this._updateVisibility(); +- params.onComplete = () => { ++ tweenParams.onComplete = () => { + this._animating = false; + this._updateVisibility(); + }; + } +- Tweener.addTween(workspace.actor, params); ++ Tweener.addTween(workspace.actor, tweenParams); + } else { +- workspace.actor.set_position(0, y); ++ workspace.actor.set(params); + if (w == 0) + this._updateVisibility(); + } +@@ -338,22 +344,39 @@ var WorkspacesView = class extends WorkspacesViewBase { + metaWorkspace.activate(global.get_current_time()); + } + +- let last = this._workspaces.length - 1; +- let firstWorkspaceY = this._workspaces[0].actor.y; +- let lastWorkspaceY = this._workspaces[last].actor.y; +- let workspacesHeight = lastWorkspaceY - firstWorkspaceY; +- + if (adj.upper == 1) + return; + +- let currentY = firstWorkspaceY; +- let newY = - adj.value / (adj.upper - 1) * workspacesHeight; ++ let last = this._workspaces.length - 1; ++ ++ if (workspaceManager.layout_rows == -1) { ++ let firstWorkspaceY = this._workspaces[0].actor.y; ++ let lastWorkspaceY = this._workspaces[last].actor.y; ++ let workspacesHeight = lastWorkspaceY - firstWorkspaceY; ++ ++ let currentY = firstWorkspaceY; ++ let newY = -adj.value / (adj.upper - 1) * workspacesHeight; + +- let dy = newY - currentY; ++ let dy = newY - currentY; ++ ++ for (let i = 0; i < this._workspaces.length; i++) { ++ this._workspaces[i].actor.visible = Math.abs(i - adj.value) <= 1; ++ this._workspaces[i].actor.y += dy; ++ } ++ } else { ++ let firstWorkspaceX = this._workspaces[0].actor.x; ++ let lastWorkspaceX = this._workspaces[last].actor.x; ++ let workspacesWidth = lastWorkspaceX - firstWorkspaceX; + +- for (let i = 0; i < this._workspaces.length; i++) { +- this._workspaces[i].actor.visible = Math.abs(i - adj.value) <= 1; +- this._workspaces[i].actor.y += dy; ++ let currentX = firstWorkspaceX; ++ let newX = -adj.value / (adj.upper - 1) * workspacesWidth; ++ ++ let dx = newX - currentX; ++ ++ for (let i = 0; i < this._workspaces.length; i++) { ++ this._workspaces[i].actor.visible = Math.abs(i - adj.value) <= 1; ++ this._workspaces[i].actor.x += dx; ++ } + } + } + }; +@@ -504,7 +527,12 @@ var WorkspacesDisplay = class { + _onPan(action) { + let [dist, dx, dy] = action.get_motion_delta(0); + let adjustment = this._scrollAdjustment; +- adjustment.value -= (dy / this.actor.height) * adjustment.page_size; ++ if (global.workspace_manager.layout_rows == -1) ++ adjustment.value -= (dy / this.actor.height) * adjustment.page_size; ++ else if (this.actor.text_direction == Clutter.TextDirection.RTL) ++ adjustment.value += (dx / this.actor.width) * adjustment.page_size; ++ else ++ adjustment.value -= (dx / this.actor.width) * adjustment.page_size; + return false; + } + +@@ -536,7 +564,12 @@ var WorkspacesDisplay = class { + let workspaceManager = global.workspace_manager; + let active = workspaceManager.get_active_workspace_index(); + let adjustment = this._scrollAdjustment; +- adjustment.value = (active - yRel / this.actor.height) * adjustment.page_size; ++ if (workspaceManager.layout_rows == -1) ++ adjustment.value = (active - yRel / this.actor.height) * adjustment.page_size; ++ else if (this.actor.text_direction == Clutter.TextDirection.RTL) ++ adjustment.value = (active + xRel / this.actor.width) * adjustment.page_size; ++ else ++ adjustment.value = (active - xRel / this.actor.width) * adjustment.page_size; + } + + _onSwitchWorkspaceActivated(action, direction) { +@@ -755,6 +788,12 @@ var WorkspacesDisplay = class { + case Clutter.ScrollDirection.DOWN: + ws = activeWs.get_neighbor(Meta.MotionDirection.DOWN); + break; ++ case Clutter.ScrollDirection.LEFT: ++ ws = activeWs.get_neighbor(Meta.MotionDirection.LEFT); ++ break; ++ case Clutter.ScrollDirection.RIGHT: ++ ws = activeWs.get_neighbor(Meta.MotionDirection.RIGHT); ++ break; + default: + return Clutter.EVENT_PROPAGATE; + } +-- +2.21.0 + diff --git a/SPECS/gnome-shell.spec b/SPECS/gnome-shell.spec index ccf8ed4..8dacd95 100644 --- a/SPECS/gnome-shell.spec +++ b/SPECS/gnome-shell.spec @@ -1,6 +1,6 @@ Name: gnome-shell -Version: 3.28.3 -Release: 10%{?dist} +Version: 3.32.2 +Release: 9%{?dist} Summary: Window management and application launching for GNOME Group: User Interface/Desktops @@ -8,7 +8,7 @@ License: GPLv2+ Provides: desktop-notification-daemon URL: https://wiki.gnome.org/Projects/GnomeShell #VCS: git:git://git.gnome.org/gnome-shell -Source0: http://download.gnome.org/sources/gnome-shell/3.28/%{name}-%{version}.tar.xz +Source0: http://download.gnome.org/sources/gnome-shell/3.32/%{name}-%{version}.tar.xz # Replace Epiphany with Firefox in the default favourite apps list Patch1: gnome-shell-favourite-apps-firefox.patch @@ -32,29 +32,14 @@ Patch32: 0001-extensionSystem-Notify-about-extension-issues-on-upd.patch Patch33: 0001-panel-add-an-icon-to-the-ActivitiesButton.patch Patch34: 0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch Patch35: 0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch -Patch36: 0001-global-Allow-overriding-the-override-schema.patch -Patch37: 0001-altSwitcher-Fix-error-when-all-alternatives-are-disa.patch Patch38: 0001-appDisplay-Show-full-app-name-on-hover.patch -Patch39: 0001-app-Close-all-closable-windows-from-quit.patch -Patch40: fix-close-dialog-annoyances.patch - -# Backport remote access control UI from gnome 3.30 -Patch50: 0001-Add-remote-access-indication-and-control.patch -Patch51: 0002-remoteAccess-Make-indicator-orange.patch - -# Backport Introspect API from gnome 3.32 -Patch52: 0001-Add-app-introspection-API.patch -Patch53: 0002-introspect-Add-GetWindows-method.patch +Patch39: horizontal-workspace-support.patch +Patch40: 0001-animation-fix-unintentional-loop-while-polkit-dialog.patch +Patch41: 0001-workspacesView-Work-around-spurious-allocation-chang.patch +Patch42: 0001-layout-Make-the-hot-corner-optional.patch # Backport JS invalid access warnings (#1651894, #1663171, #1642482, #1637622) Patch54: fix-invalid-access-warnings.patch -Patch55: 0001-osdWindow-Disconnect-signals-on-destroy.patch - -# Fix added input sources working only after re-login (#1628154) -Patch56: 0001-keyboardManager-Avoid-idempotent-calls-to-meta_backe.patch - -# Backport IM support fixes -Patch57: backport-im-fixes.patch # suspend/resume fix on nvidia (#1663440) Patch10001: 0001-background-refresh-after-suspend-on-wayland.patch @@ -67,29 +52,26 @@ Patch10004: 0004-background-refresh-background-on-gl-video-memory-pur.patch %define gnome_desktop_version 3.7.90 %define glib2_version 2.56.0 %define gobject_introspection_version 1.49.1 -%define gjs_version 1.51.90 +%define gjs_version 1.54.0 %define gtk3_version 3.15.0 -%define json_glib_version 0.13.2 -%define mutter_version 3.28.0 +%define mutter_version 3.32 %define polkit_version 0.100 -%define gsettings_desktop_schemas_version 3.21.3 +%define gsettings_desktop_schemas_version 3.32.0-3 %define ibus_version 1.5.2 %define gnome_bluetooth_version 1:3.9.0 %define gstreamer_version 1.4.5 +BuildRequires: gcc BuildRequires: meson BuildRequires: git BuildRequires: ibus-devel >= %{ibus_version} BuildRequires: chrpath -BuildRequires: dbus-glib-devel BuildRequires: desktop-file-utils BuildRequires: evolution-data-server-devel >= %{eds_version} BuildRequires: gcr-devel BuildRequires: gjs-devel >= %{gjs_version} BuildRequires: glib2-devel >= %{glib2_version} BuildRequires: gobject-introspection >= %{gobject_introspection_version} -BuildRequires: json-glib-devel >= %{json_glib_version} -BuildRequires: upower-devel BuildRequires: mesa-libGL-devel BuildRequires: NetworkManager-libnm-devel BuildRequires: polkit-devel >= %{polkit_version} @@ -102,7 +84,8 @@ BuildRequires: gtk3-devel >= %{gtk3_version} BuildRequires: gettext >= 0.19.6 BuildRequires: libcanberra-devel BuildRequires: libcroco-devel >= %{libcroco_version} -BuildRequires: python3-devel +BuildRequires: pkgconfig(libsystemd) +BuildRequires: python3 # for barriers BuildRequires: libXfixes-devel >= 5.0 @@ -132,10 +115,6 @@ Requires: gtk3%{?_isa} >= %{gtk3_version} Requires: libnma%{?_isa} # needed for loading SVG's via gdk-pixbuf Requires: librsvg2%{?_isa} -# needed as it is now split from Clutter -Requires: json-glib%{?_isa} >= %{json_glib_version} -# For $libdir/mozilla/plugins -Requires: mozilla-filesystem%{?_isa} Requires: mutter%{?_isa} >= %{mutter_version} Requires: upower%{?_isa} Requires: polkit%{?_isa} >= %{polkit_version} @@ -154,12 +133,16 @@ Requires: gdm-libs%{?_isa} # needed for settings items in menus Requires: control-center # needed by some utilities -Requires: %{__python3} +Requires: python3%{_isa} # needed for the dual-GPU launch menu Requires: switcheroo-control # needed for clocks/weather integration Requires: geoclue2-libs%{?_isa} Requires: libgweather%{?_isa} +# needed for thunderbolt support +Requires: bolt%{?_isa} +# Needed for launching flatpak apps etc +Requires: xdg-desktop-portal-gtk %description GNOME Shell provides core user interface functions for the GNOME 3 desktop, @@ -189,20 +172,15 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/org.gnome.Shell.deskt desktop-file-validate %{buildroot}%{_datadir}/applications/gnome-shell-extension-prefs.desktop desktop-file-validate %{buildroot}%{_datadir}/applications/evolution-calendar.desktop -%preun -glib-compile-schemas --allow-any-name %{_datadir}/glib-2.0/schemas &> /dev/null ||: - -%posttrans -glib-compile-schemas --allow-any-name %{_datadir}/glib-2.0/schemas &> /dev/null ||: - %files -f %{name}.lang %license COPYING -%doc README +%doc README.md %{_bindir}/gnome-shell %{_bindir}/gnome-shell-extension-tool %{_bindir}/gnome-shell-perf-tool %{_bindir}/gnome-shell-extension-prefs %{_datadir}/glib-2.0/schemas/*.xml +%{_datadir}/glib-2.0/schemas/00_org.gnome.shell.gschema.override %{_datadir}/applications/org.gnome.Shell.desktop %{_datadir}/applications/gnome-shell-extension-prefs.desktop %{_datadir}/applications/evolution-calendar.desktop @@ -212,22 +190,27 @@ glib-compile-schemas --allow-any-name %{_datadir}/glib-2.0/schemas &> /dev/null %{_datadir}/dbus-1/services/org.gnome.Shell.CalendarServer.service %{_datadir}/dbus-1/services/org.gnome.Shell.HotplugSniffer.service %{_datadir}/dbus-1/services/org.gnome.Shell.PortalHelper.service +%{_datadir}/dbus-1/interfaces/org.gnome.Shell.Extensions.xml +%{_datadir}/dbus-1/interfaces/org.gnome.Shell.Introspect.xml %{_datadir}/dbus-1/interfaces/org.gnome.Shell.PadOsd.xml %{_datadir}/dbus-1/interfaces/org.gnome.Shell.Screencast.xml %{_datadir}/dbus-1/interfaces/org.gnome.Shell.Screenshot.xml %{_datadir}/dbus-1/interfaces/org.gnome.ShellSearchProvider.xml %{_datadir}/dbus-1/interfaces/org.gnome.ShellSearchProvider2.xml -%{_datadir}/dbus-1/interfaces/org.gnome.Shell.Introspect.xml +%{_userunitdir}/gnome-shell.service +%{_userunitdir}/gnome-shell-wayland.target +%{_userunitdir}/gnome-shell-x11.target +%{_sysconfdir}/xdg/autostart/gnome-shell-overrides-migration.desktop # Co own directory instead of pulling in xdg-desktop-portal - we # are providing a backend to the portal, not depending on it %dir %{_datadir}/xdg-desktop-portal/portals/ %{_datadir}/xdg-desktop-portal/portals/gnome-shell.portal %{_libdir}/gnome-shell/ -%{_libdir}/mozilla/plugins/*.so %{_libexecdir}/gnome-shell-calendar-server %{_libexecdir}/gnome-shell-perf-helper %{_libexecdir}/gnome-shell-hotplug-sniffer %{_libexecdir}/gnome-shell-portal-helper +%{_libexecdir}/gnome-shell-overrides-migration.sh # Co own these directories instead of pulling in GConf # after all, we are trying to get rid of GConf with these files %dir %{_datadir}/GConf @@ -236,6 +219,42 @@ glib-compile-schemas --allow-any-name %{_datadir}/glib-2.0/schemas &> /dev/null %{_mandir}/man1/%{name}.1.gz %changelog +* Thu Aug 15 2019 Jonas Ådahl - 3.32.2-9 +- Depend on correct gsettings-desktop-schemas version + Related: #1704355 + +* Wed Aug 14 2019 Jonas Ådahl - 3.32.2-8 +- Depend on required gsettings-desktop-schemas version + Related: #1704355 + +* Tue Jul 23 2019 Florian Müllner - 3.32.2-7 +- Make the hot corner optional + Resolves: #1704355 + +* Fri Jul 12 2019 Florian Müllner - 3.32.2-6 +- Fix warnings triggered by spurious allocations + Resolves: #1719279 + +* Wed Jul 10 2019 Florian Müllner - 3.32.2-5 +- Fix infinite loop in spinner animation + Resolves: #1725555 + +* Tue Jun 18 2019 Florian Müllner - 3.32.2-4 +- Adjust more shortcut handlers for horizontal workspaces + Related: #1704360 + +* Wed Jun 12 2019 Florian Müllner - 3.32.2-3 +- Support horizontal workspaces in gestures/keybindings/animations + Related: #1704360 + +* Fri May 31 2019 Florian Müllner - 3.32.2-2 +- Adjust downstream patch to mutter changes + Resolves: #1715738 + +* Thu May 23 2019 Florian Müllner - 3.32.2-1 +- Update to 3.32.2 + Resolves: #1698520 + * Mon Feb 11 2019 Florian Müllner - 3.28.3-10 - Backport another IM fix (#1668979)