From 35159f3c62355550b49dafd5a3932538eb004d85 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Apr 23 2020 22:17:19 +0000 Subject: import gnome-shell-3.32.2-14.el8 --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e984bcc --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/gnome-shell-3.32.2.tar.xz diff --git a/.gnome-shell.metadata b/.gnome-shell.metadata new file mode 100644 index 0000000..06e249f --- /dev/null +++ b/.gnome-shell.metadata @@ -0,0 +1 @@ +331e9cf71cd1d2a4e9238d87d216da4c6f3a400e SOURCES/gnome-shell-3.32.2.tar.xz diff --git a/SOURCES/0001-Do-not-change-Wacom-LEDs-through-g-s-d.patch b/SOURCES/0001-Do-not-change-Wacom-LEDs-through-g-s-d.patch new file mode 100644 index 0000000..9eb76be --- /dev/null +++ b/SOURCES/0001-Do-not-change-Wacom-LEDs-through-g-s-d.patch @@ -0,0 +1,25 @@ +From f5ddd0fc02e99597e4b8506ac35523a6fa8ac22f Mon Sep 17 00:00:00 2001 +From: rpm-build +Date: Wed, 4 Mar 2020 16:08:31 +0100 +Subject: [PATCH] Do not change Wacom LEDs through g-s-d + +Let the wacom kernel driver sort it out by itself. +--- + js/ui/windowManager.js | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js +index dfe1b44..b2e938c 100644 +--- a/js/ui/windowManager.js ++++ b/js/ui/windowManager.js +@@ -1037,7 +1037,6 @@ var WindowManager = class { + + if (this._gsdWacomProxy) { + this._gsdWacomProxy.SetOLEDLabelsRemote(pad.get_device_node(), labels); +- this._gsdWacomProxy.SetGroupModeLEDRemote(pad.get_device_node(), group, mode); + } + }); + +-- +2.24.1 + diff --git a/SOURCES/0001-a11y-Change-HC-icon-theme-first.patch b/SOURCES/0001-a11y-Change-HC-icon-theme-first.patch new file mode 100644 index 0000000..f5eebd6 --- /dev/null +++ b/SOURCES/0001-a11y-Change-HC-icon-theme-first.patch @@ -0,0 +1,58 @@ +From a94260b4f2f72ea9328a0194b8656f1fb3e98675 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Sat, 14 Dec 2019 19:15:53 +0100 +Subject: [PATCH] a11y: Change HC icon theme first + +There are two ways for applications to provide a high contrast icon: + + 1. install an icon into the HighContrast theme + 2. install a symbolic icon into the default hicolor theme + +The latter is preferred nowadays, and implemented in the high-contrast +CSS variant by enforcing the symbolic icon style. + +However together with the way we currently enable/disable high-contrast, +this can lead to the following race: + 1. the GTK theme is changed from HighContrast + 2. we reload the default stylesheet + 3. the icon style changes to "regular", so we request a + new icon from the HighContrast icon theme + 4. the icon theme is changed from HighContrast + 5. we evict existing icons from the cache + 6. we reload icons for the new icon theme; however as we + find a pending request (from 3), we re-use it + 7. the request from 3 finishes, and we end up with a + wrong icon in the cache + +The simplest fix is to change the icon theme before the GTK theme: Unlike the +theme name, the icon style is encoded in the cache key, so we won't re-use +an old (and incorrect) request in that case. +--- + js/ui/status/accessibility.js | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/js/ui/status/accessibility.js b/js/ui/status/accessibility.js +index 10223ec84..90948d465 100644 +--- a/js/ui/status/accessibility.js ++++ b/js/ui/status/accessibility.js +@@ -154,14 +154,14 @@ class ATIndicator extends PanelMenu.Button { + interfaceSettings.is_writable(KEY_ICON_THEME), + enabled => { + if (enabled) { +- interfaceSettings.set_string(KEY_GTK_THEME, HIGH_CONTRAST_THEME); + interfaceSettings.set_string(KEY_ICON_THEME, HIGH_CONTRAST_THEME); ++ interfaceSettings.set_string(KEY_GTK_THEME, HIGH_CONTRAST_THEME); + } else if(!hasHC) { +- interfaceSettings.set_string(KEY_GTK_THEME, gtkTheme); + interfaceSettings.set_string(KEY_ICON_THEME, iconTheme); ++ interfaceSettings.set_string(KEY_GTK_THEME, gtkTheme); + } else { +- interfaceSettings.reset(KEY_GTK_THEME); + interfaceSettings.reset(KEY_ICON_THEME); ++ interfaceSettings.reset(KEY_GTK_THEME); + } + }); + return highContrast; +-- +2.23.0 + 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-Fall-back-to-window-title-instead-of-WM_CLASS.patch b/SOURCES/0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch new file mode 100644 index 0000000..77f7cb1 --- /dev/null +++ b/SOURCES/0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch @@ -0,0 +1,28 @@ +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 + +It's a bad fallback as it's clearly window-specific (rather than +app-specific), but it likely looks prettier when we fail to associate +a .desktop file ... +--- + 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 10efa9135..7d40186c9 100644 +--- a/src/shell-app.c ++++ b/src/shell-app.c +@@ -259,7 +259,7 @@ shell_app_get_name (ShellApp *app) + const char *name = NULL; + + if (window) +- name = meta_window_get_wm_class (window); ++ name = meta_window_get_title (window); + if (!name) + name = C_("program", "Unknown"); + return name; +-- +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 new file mode 100644 index 0000000..ddd3d97 --- /dev/null +++ b/SOURCES/0001-appDisplay-Show-full-app-name-on-hover.patch @@ -0,0 +1,111 @@ +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 + +--- + data/theme/gnome-shell-sass/_common.scss | 8 ++++ + js/ui/appDisplay.js | 48 ++++++++++++++++++++++++ + 2 files changed, 56 insertions(+) + +diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss +index 3b0d2bf04..293ea2ab9 100644 +--- a/data/theme/gnome-shell-sass/_common.scss ++++ b/data/theme/gnome-shell-sass/_common.scss +@@ -1411,6 +1411,14 @@ StScrollBar { + + } + ++ .app-well-hover-text { ++ text-align: center; ++ color: $osd_fg_color; ++ background-color: $osd_bg_color; ++ border-radius: 5px; ++ padding: 3px; ++ } ++ + .app-well-app-running-dot { //running apps indicator + width: 10px; height: 3px; + background-color: $selected_bg_color; +diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js +index adaefa7dd..a07db6573 100644 +--- a/js/ui/appDisplay.js ++++ b/js/ui/appDisplay.js +@@ -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)); + ++ this._hoverText = null; ++ this._hoverTimeoutId = 0; ++ ++ if (this.icon.label) { ++ this._hoverText = new St.Label({ style_class: 'app-well-hover-text', ++ text: this.icon.label.text, ++ visible: false }); ++ this._hoverText.clutter_text.line_wrap = true; ++ Main.layoutManager.addChrome(this._hoverText); ++ ++ this.actor.connect('notify::hover', this._syncHoverText.bind(this)); ++ this.connect('sync-tooltip', this._syncHoverText.bind(this)); ++ } ++ + this._menu = null; + this._menuManager = new PopupMenu.PopupMenuManager(this); + +@@ -1509,12 +1523,39 @@ var AppIcon = class AppIcon { + this.app.disconnect(this._stateChangedId); + this._stateChangedId = 0; + this._removeMenuTimeout(); ++ this._removeHoverTimeout(); ++ if (this._hoverText) ++ this._hoverText.destroy(); ++ this._hoverText = null; + } + + _createIcon(iconSize) { + return this.app.create_icon_texture(iconSize); + } + ++ _syncHoverText() { ++ if (this.shouldShowTooltip()) { ++ if (this._hoverTimeoutId) ++ return; ++ ++ this._hoverTimeoutId = Mainloop.timeout_add(300, () => { ++ this._hoverText.style = `max-width: ${2 * this.icon.iconSize}px;`; ++ this._hoverText.ensure_style(); ++ ++ let [x, y] = this.icon.label.get_transformed_position(); ++ let offset = (this._hoverText.width - this.icon.label.width) / 2; ++ this._hoverText.set_position(Math.floor(x - offset), Math.floor(y)); ++ this._hoverText.show(); ++ ++ this._hoverTimeoutId = 0; ++ return GLib.SOURCE_REMOVE; ++ }); ++ } else { ++ this._removeHoverTimeout(); ++ this._hoverText.hide(); ++ } ++ } ++ + _removeMenuTimeout() { + if (this._menuTimeoutId > 0) { + Mainloop.source_remove(this._menuTimeoutId); +@@ -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.21.0 + diff --git a/SOURCES/0001-background-refresh-after-suspend-on-wayland.patch b/SOURCES/0001-background-refresh-after-suspend-on-wayland.patch new file mode 100644 index 0000000..ffcbca0 --- /dev/null +++ b/SOURCES/0001-background-refresh-after-suspend-on-wayland.patch @@ -0,0 +1,29 @@ +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 + +At the moment we only refresh after suspend on Xorg. + +We need to do it on wayland, too. +--- + src/shell-util.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/src/shell-util.c b/src/shell-util.c +index 31bb18e70..c6e5abed6 100644 +--- a/src/shell-util.c ++++ b/src/shell-util.c +@@ -395,9 +395,6 @@ get_gl_vendor (void) + gboolean + shell_util_need_background_refresh (void) + { +- if (!clutter_check_windowing_backend (CLUTTER_WINDOWING_X11)) +- return FALSE; +- + if (g_strcmp0 (get_gl_vendor (), "NVIDIA Corporation") == 0) + return TRUE; + +-- +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 new file mode 100644 index 0000000..9782372 --- /dev/null +++ b/SOURCES/0001-data-install-process-working.svg-to-filesystem.patch @@ -0,0 +1,37 @@ +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 + +This helps prevent unlock failure on inplace upgrades between +7.3 and 7.4 +--- + data/theme/meson.build | 2 ++ + meson.build | 1 + + 2 files changed, 3 insertions(+) + +diff --git a/data/theme/meson.build b/data/theme/meson.build +index 22bae3dd2..d5acb8d10 100644 +--- a/data/theme/meson.build ++++ b/data/theme/meson.build +@@ -23,3 +23,5 @@ foreach style: styles + ], + depend_files: theme_sources) + endforeach ++ ++install_data('process-working.svg', install_dir: themedir) +diff --git a/meson.build b/meson.build +index 21a80bcc8..0acaba705 100644 +--- a/meson.build ++++ b/meson.build +@@ -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') + + # XXX: Once https://github.com/systemd/systemd/issues/9595 is fixed and we can + # depend on this version, replace with something like: +-- +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 new file mode 100644 index 0000000..e5efa14 --- /dev/null +++ b/SOURCES/0001-extensionSystem-Notify-about-extension-issues-on-upd.patch @@ -0,0 +1,72 @@ +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 | 34 +++++++++++++++++++++++++++++++++- + 1 file changed, 33 insertions(+), 1 deletion(-) + +diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js +index 9ffdb4f3d..eb820ba4f 100644 +--- a/js/ui/extensionSystem.js ++++ b/js/ui/extensionSystem.js +@@ -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; + +@@ -312,6 +313,36 @@ function _onVersionValidationChanged() { + } + } + ++function _doUpdateCheck() { ++ let version = Config.PACKAGE_VERSION.split('.'); ++ if (parseInt(version[1]) % 2 == 0) ++ version.pop(); ++ ++ let pkgCacheDir = GLib.get_user_cache_dir() + '/gnome-shell/'; ++ let updateStamp = Gio.file_new_for_path(pkgCacheDir + ++ 'update-check-' + version.join('.')); ++ if (updateStamp.query_exists(null)) ++ return; ++ ++ GLib.mkdir_with_parents (pkgCacheDir, 0o755); ++ updateStamp.create(0, null).close(null); ++ ++ let nOutdated = enabledExtensions.reduce(function(n, uuid) { ++ let extension = ExtensionUtils.extensions[uuid]; ++ if (extension && extension.state == ExtensionState.OUT_OF_DATE) ++ n++; ++ return n; ++ }, 0); ++ ++ if (nOutdated == 0) ++ return; ++ ++ Main.notify(ngettext("%d extension is out of date", ++ "%d extensions are out of date", ++ nOutdated).format(nOutdated), ++ _("You can visit http://extensions.gnome.org for updates")); ++} ++ + function _loadExtensions() { + global.settings.connect('changed::' + ENABLED_EXTENSIONS_KEY, onEnabledExtensionsChanged); + global.settings.connect('changed::' + DISABLE_USER_EXTENSIONS_KEY, onEnabledExtensionsChanged); +@@ -326,6 +357,7 @@ function _loadExtensions() { + extension.type = ExtensionUtils.ExtensionType.SESSION_MODE; + }); + finder.scanExtensions(); ++ _doUpdateCheck(); + } + + function enableAllExtensions() { +-- +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 new file mode 100644 index 0000000..dc7619b --- /dev/null +++ b/SOURCES/0001-extensions-Add-a-SESSION_MODE-extension-type.patch @@ -0,0 +1,42 @@ +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 + +This allows e.g. gnome-tweak-tool to present these extensions in a +different way since they can't be disabled. +--- + js/misc/extensionUtils.js | 3 ++- + js/ui/extensionSystem.js | 2 ++ + 2 files changed, 4 insertions(+), 1 deletion(-) + +diff --git a/js/misc/extensionUtils.js b/js/misc/extensionUtils.js +index cf308b31f..fb1e2b506 100644 +--- a/js/misc/extensionUtils.js ++++ b/js/misc/extensionUtils.js +@@ -13,7 +13,8 @@ const FileUtils = imports.misc.fileUtils; + + var ExtensionType = { + SYSTEM: 1, +- PER_USER: 2 ++ PER_USER: 2, ++ SESSION_MODE: 3 + }; + + // Maps uuid -> metadata object +diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js +index 6244c39b4..9ffdb4f3d 100644 +--- a/js/ui/extensionSystem.js ++++ b/js/ui/extensionSystem.js +@@ -322,6 +322,8 @@ function _loadExtensions() { + let finder = new ExtensionUtils.ExtensionFinder(); + finder.connect('extension-found', (finder, extension) => { + loadExtension(extension); ++ if (Main.sessionMode.enabledExtensions.indexOf(extension.uuid) != -1) ++ extension.type = ExtensionUtils.ExtensionType.SESSION_MODE; + }); + finder.scanExtensions(); + } +-- +2.21.0 + diff --git a/SOURCES/0001-gdm-add-AuthList-control.patch b/SOURCES/0001-gdm-add-AuthList-control.patch new file mode 100644 index 0000000..0ca4a8f --- /dev/null +++ b/SOURCES/0001-gdm-add-AuthList-control.patch @@ -0,0 +1,237 @@ +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 + +Ultimately, we want to add support for GDM's new ChoiceList +PAM extension. That extension allows PAM modules to present +a list of choices to the user. Before we can support that +extension, however, we need to have a list control in the +login-screen/unlock screen. This commit adds that control. + +For the most part, it's a copy-and-paste of the gdm userlist, +but with less features. It lacks API specific to the users, +lacks the built in timed login indicator, etc. It does feature +a label heading. +--- + js/gdm/authList.js | 195 ++++++++++++++++++++++++++++++++++ + js/js-resources.gresource.xml | 1 + + 2 files changed, 196 insertions(+) + create mode 100644 js/gdm/authList.js + +diff --git a/js/gdm/authList.js b/js/gdm/authList.js +new file mode 100644 +index 000000000..fc1c3d6e4 +--- /dev/null ++++ b/js/gdm/authList.js +@@ -0,0 +1,195 @@ ++// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- ++/* ++ * Copyright 2017 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2, or (at your option) ++ * any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ */ ++ ++const Clutter = imports.gi.Clutter; ++const GObject = imports.gi.GObject; ++const Gtk = imports.gi.Gtk; ++const Lang = imports.lang; ++const Meta = imports.gi.Meta; ++const Signals = imports.signals; ++const St = imports.gi.St; ++ ++const Tweener = imports.ui.tweener; ++ ++const _SCROLL_ANIMATION_TIME = 0.5; ++ ++const AuthListItem = new Lang.Class({ ++ Name: 'AuthListItem', ++ ++ _init(key, text) { ++ this.key = key; ++ let label = new St.Label({ style_class: 'auth-list-item-label', ++ y_align: Clutter.ActorAlign.CENTER }); ++ label.text = text; ++ ++ this.actor = new St.Button({ style_class: 'login-dialog-user-list-item', ++ button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE, ++ can_focus: true, ++ child: label, ++ reactive: true, ++ x_align: St.Align.START, ++ x_fill: true }); ++ ++ this.actor.connect('key-focus-in', () => { ++ this._setSelected(true); ++ }); ++ this.actor.connect('key-focus-out', () => { ++ this._setSelected(false); ++ }); ++ this.actor.connect('notify::hover', () => { ++ this._setSelected(this.actor.hover); ++ }); ++ ++ this.actor.connect('clicked', this._onClicked.bind(this)); ++ }, ++ ++ _onClicked() { ++ this.emit('activate'); ++ }, ++ ++ _setSelected(selected) { ++ if (selected) { ++ this.actor.add_style_pseudo_class('selected'); ++ this.actor.grab_key_focus(); ++ } else { ++ this.actor.remove_style_pseudo_class('selected'); ++ } ++ } ++}); ++Signals.addSignalMethods(AuthListItem.prototype); ++ ++const AuthList = new Lang.Class({ ++ Name: 'AuthList', ++ ++ _init() { ++ this.actor = new St.BoxLayout({ vertical: true, ++ style_class: 'login-dialog-auth-list-layout' }); ++ ++ this.label = new St.Label({ style_class: 'prompt-dialog-headline' }); ++ this.actor.add_actor(this.label); ++ ++ this._scrollView = new St.ScrollView({ style_class: 'login-dialog-user-list-view'}); ++ this._scrollView.set_policy(Gtk.PolicyType.NEVER, ++ Gtk.PolicyType.AUTOMATIC); ++ this.actor.add_actor(this._scrollView); ++ ++ this._box = new St.BoxLayout({ vertical: true, ++ style_class: 'login-dialog-user-list', ++ pseudo_class: 'expanded' }); ++ ++ this._scrollView.add_actor(this._box); ++ this._items = {}; ++ ++ this.actor.connect('key-focus-in', this._moveFocusToItems.bind(this)); ++ }, ++ ++ _moveFocusToItems() { ++ let hasItems = Object.keys(this._items).length > 0; ++ ++ if (!hasItems) ++ return; ++ ++ if (global.stage.get_key_focus() != this.actor) ++ return; ++ ++ let focusSet = this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false); ++ if (!focusSet) { ++ Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { ++ this._moveFocusToItems(); ++ return false; ++ }); ++ } ++ }, ++ ++ _onItemActivated(activatedItem) { ++ this.emit('activate', activatedItem.key); ++ }, ++ ++ scrollToItem(item) { ++ let box = item.actor.get_allocation_box(); ++ ++ let adjustment = this._scrollView.get_vscroll_bar().get_adjustment(); ++ ++ let value = (box.y1 + adjustment.step_increment / 2.0) - (adjustment.page_size / 2.0); ++ Tweener.removeTweens(adjustment); ++ Tweener.addTween (adjustment, ++ { value: value, ++ time: _SCROLL_ANIMATION_TIME, ++ transition: 'easeOutQuad' }); ++ }, ++ ++ jumpToItem(item) { ++ let box = item.actor.get_allocation_box(); ++ ++ let adjustment = this._scrollView.get_vscroll_bar().get_adjustment(); ++ ++ let value = (box.y1 + adjustment.step_increment / 2.0) - (adjustment.page_size / 2.0); ++ ++ adjustment.set_value(value); ++ }, ++ ++ getItem(key) { ++ let item = this._items[key]; ++ ++ if (!item) ++ return null; ++ ++ return item; ++ }, ++ ++ addItem(key, text) { ++ this.removeItem(key); ++ ++ let item = new AuthListItem(key, text); ++ this._box.add(item.actor, { x_fill: true }); ++ ++ this._items[key] = item; ++ ++ item.connect('activate', ++ this._onItemActivated.bind(this)); ++ ++ // Try to keep the focused item front-and-center ++ item.actor.connect('key-focus-in', ++ () => { this.scrollToItem(item); }); ++ ++ this._moveFocusToItems(); ++ ++ this.emit('item-added', item); ++ }, ++ ++ removeItem(key) { ++ let item = this._items[key]; ++ ++ if (!item) ++ return; ++ ++ item.actor.destroy(); ++ delete this._items[key]; ++ }, ++ ++ numItems() { ++ return Object.keys(this._items).length; ++ }, ++ ++ clear() { ++ this.label.text = ""; ++ this._box.destroy_all_children(); ++ this._items = {}; ++ } ++}); ++Signals.addSignalMethods(AuthList.prototype); +diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml +index 836d1c674..002b202f8 100644 +--- a/js/js-resources.gresource.xml ++++ b/js/js-resources.gresource.xml +@@ -1,6 +1,7 @@ + + + ++ gdm/authList.js + gdm/authPrompt.js + gdm/batch.js + gdm/fingerprint.js +-- +2.21.0 + 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 new file mode 100644 index 0000000..483f615 --- /dev/null +++ b/SOURCES/0001-loginDialog-make-info-messages-themed.patch @@ -0,0 +1,32 @@ +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 + +They were lacking a definition before leading them to +show up invisible. +--- + data/theme/gnome-shell-sass/_common.scss | 7 ++++++- + 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 c2df28279..a382ce561 100644 +--- a/data/theme/gnome-shell-sass/_common.scss ++++ b/data/theme/gnome-shell-sass/_common.scss +@@ -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; } +- .login-dialog-message-hint { padding-top: 0; padding-bottom: 20px; } ++ .login-dialog-message-hint, .login-dialog-message { ++ color: darken($osd_fg_color, 20%); ++ padding-top: 0; ++ padding-bottom: 20px; ++ min-height: 2.75em; ++ } + .login-dialog-user-selection-box { padding: 100px 0px; } + .login-dialog-not-listed-label { + padding-left: 2px; +-- +2.21.0 + diff --git a/SOURCES/0001-padOsd-Re-query-action-labels-after-mode-switches.patch b/SOURCES/0001-padOsd-Re-query-action-labels-after-mode-switches.patch new file mode 100644 index 0000000..bdbfc65 --- /dev/null +++ b/SOURCES/0001-padOsd-Re-query-action-labels-after-mode-switches.patch @@ -0,0 +1,80 @@ +From 2bb826291c420dd1b601758c7a686ac48e1086a6 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Mon, 16 Dec 2019 12:39:49 +0100 +Subject: [PATCH] padOsd: Re-query action labels after mode switches + +Do this so the pad OSD is able to update dynamically to mode changes, +showing immediately the new actions for the current mode(s). + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/898 +--- + js/ui/padOsd.js | 31 ++++++++++++++++++++++++++++--- + 1 file changed, 28 insertions(+), 3 deletions(-) + +diff --git a/js/ui/padOsd.js b/js/ui/padOsd.js +index a4af47297..b4b3fe453 100644 +--- a/js/ui/padOsd.js ++++ b/js/ui/padOsd.js +@@ -555,6 +555,14 @@ var PadDiagram = GObject.registerClass({ + this.add_actor(label); + } + ++ updateLabels(callback) { ++ for (let i = 0; i < this._labels.length; i++) { ++ let [label, action, idx, dir] = this._labels[i]; ++ let str = callback(action, idx, dir); ++ label.set_text(str); ++ } ++ } ++ + _applyLabel(label, action, idx, dir, str) { + if (str != null) { + label.set_text(str); +@@ -758,17 +766,29 @@ var PadOsd = class { + global.display.request_pad_osd(pad, editionMode); + } + +- _createLabel(type, number, dir) { ++ _getActionText(type, number) { + let str = global.display.get_pad_action_label(this.padDevice, type, number); +- let label = new St.Label({ text: str ? str : _("None") }); ++ return str ? str : _("None"); ++ } ++ ++ _createLabel(type, number, dir) { ++ let label = new St.Label({ text: this._getActionText(type, number) }); + this._padDiagram.addLabel(label, type, number, dir); + } + ++ _updateActionLabels() { ++ this._padDiagram.updateLabels(this._getActionText.bind(this)); ++ } ++ + _onCapturedEvent(actor, event) { ++ let isModeSwitch = ++ (event.type() == Clutter.EventType.PAD_BUTTON_PRESS || ++ event.type() == Clutter.EventType.PAD_BUTTON_RELEASE) && ++ this.padDevice.get_mode_switch_button_group(event.get_button()) >= 0; ++ + if (event.type() == Clutter.EventType.PAD_BUTTON_PRESS && + event.get_source_device() == this.padDevice) { + this._padDiagram.activateButton(event.get_button()); +- let isModeSwitch = this.padDevice.get_mode_switch_button_group(event.get_button()) >= 0; + + /* Buttons that switch between modes cannot be edited */ + if (this._editionMode && !isModeSwitch) +@@ -777,6 +797,11 @@ var PadOsd = class { + } else if (event.type() == Clutter.EventType.PAD_BUTTON_RELEASE && + event.get_source_device() == this.padDevice) { + this._padDiagram.deactivateButton(event.get_button()); ++ ++ if (isModeSwitch) { ++ this._endActionEdition(); ++ this._updateActionLabels(); ++ } + return Clutter.EVENT_STOP; + } else if (event.type() == Clutter.EventType.KEY_PRESS && + (!this._editionMode || event.get_key_symbol() == Clutter.Escape)) { +-- +2.24.0 + diff --git a/SOURCES/0001-panel-add-an-icon-to-the-ActivitiesButton.patch b/SOURCES/0001-panel-add-an-icon-to-the-ActivitiesButton.patch new file mode 100644 index 0000000..24c0d81 --- /dev/null +++ b/SOURCES/0001-panel-add-an-icon-to-the-ActivitiesButton.patch @@ -0,0 +1,54 @@ +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 + +Requested by brand +--- + data/theme/gnome-shell-sass/_common.scss | 5 +++++ + js/ui/panel.js | 9 ++++++++- + 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 a382ce561..3b0d2bf04 100644 +--- a/data/theme/gnome-shell-sass/_common.scss ++++ b/data/theme/gnome-shell-sass/_common.scss +@@ -769,6 +769,11 @@ StScrollBar { + //dimensions of the icon are hardcoded + } + ++ .panel-logo-icon { ++ padding-right: .4em; ++ icon-size: 1em; ++ } ++ + &:hover { + color: lighten($fg_color, 10%); + } +diff --git a/js/ui/panel.js b/js/ui/panel.js +index 16484850a..ede1c2b82 100644 +--- a/js/ui/panel.js ++++ b/js/ui/panel.js +@@ -465,11 +465,18 @@ class ActivitiesButton extends PanelMenu.Button { + + this.actor.name = 'panelActivities'; + ++ let box = new St.BoxLayout(); ++ this.actor.add_actor(box); ++ let iconFile = Gio.File.new_for_path('/usr/share/icons/hicolor/scalable/apps/start-here.svg'); ++ this._icon = new St.Icon({ gicon: new Gio.FileIcon({ file: iconFile }), ++ style_class: 'panel-logo-icon' }); ++ box.add_actor(this._icon); ++ + /* Translators: If there is no suitable word for "Activities" + in your language, you can use the word for "Overview". */ + this._label = new St.Label({ text: _("Activities"), + y_align: Clutter.ActorAlign.CENTER }); +- this.actor.add_actor(this._label); ++ box.add_actor(this._label); + + this.actor.label_actor = this._label; + +-- +2.21.0 + diff --git a/SOURCES/0001-screenShield-unblank-when-inserting-smartcard.patch b/SOURCES/0001-screenShield-unblank-when-inserting-smartcard.patch new file mode 100644 index 0000000..3dc3cb9 --- /dev/null +++ b/SOURCES/0001-screenShield-unblank-when-inserting-smartcard.patch @@ -0,0 +1,33 @@ +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 + +If a user inserts the smartcard when the screen is locked/blanked +we should ask them their pin right away. + +At the moment they have to wiggle the mouse or do some other +action to get the screen to unblank. +--- + js/ui/screenShield.js | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js +index a005a206b..cd38f11fc 100644 +--- a/js/ui/screenShield.js ++++ b/js/ui/screenShield.js +@@ -513,8 +513,10 @@ var ScreenShield = class { + this._smartcardManager = SmartcardManager.getSmartcardManager(); + this._smartcardManager.connect('smartcard-inserted', + (manager, token) => { +- if (this._isLocked && token.UsedToLogin) ++ if (this._isLocked && token.UsedToLogin) { ++ this._wakeUpScreen(); + this._liftShield(true, 0); ++ } + }); + + this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager(); +-- +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 new file mode 100644 index 0000000..5649937 --- /dev/null +++ b/SOURCES/0001-shellDBus-Add-a-DBus-method-to-load-a-single-extensi.patch @@ -0,0 +1,66 @@ +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 + +This allows e.g. gnome-tweak-tool to install an extension from a zip +file and load it into the running shell. +--- + .../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 19d07acce..112d60feb 100644 +--- a/js/ui/shellDBus.js ++++ b/js/ui/shellDBus.js +@@ -341,6 +341,22 @@ var GnomeShellExtensions = class { + ExtensionDownloader.checkForUpdates(); + } + ++ LoadUserExtension(uuid) { ++ let extension = ExtensionUtils.extensions[uuid]; ++ if (extension) ++ return true; ++ ++ let dir = Gio.File.new_for_path(GLib.build_filenamev([global.userdatadir, 'extensions', uuid])); ++ try { ++ extension = ExtensionUtils.createExtensionObject(uuid, dir, ExtensionUtils.ExtensionType.PER_USER); ++ ExtensionSystem.loadExtension(extension); ++ } catch (e) { ++ log('Could not load user extension from %s'.format(dir.get_path())); ++ return false; ++ } ++ return true; ++ } ++ + get ShellVersion() { + return Config.PACKAGE_VERSION; + } +-- +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 new file mode 100644 index 0000000..810a27a --- /dev/null +++ b/SOURCES/0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch @@ -0,0 +1,45 @@ +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 + workspaces + +When the titlebar context menu was moved to the shell, the submenu for +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 | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +diff --git a/js/ui/windowMenu.js b/js/ui/windowMenu.js +index 628f145ea..f8eb4398c 100644 +--- a/js/ui/windowMenu.js ++++ b/js/ui/windowMenu.js +@@ -115,6 +115,23 @@ var WindowMenu = class extends PopupMenu.PopupMenu { + window.change_workspace(workspace.get_neighbor(dir)); + }); + } ++ ++ 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 = workspaceManager.get_active_workspace_index(); ++ for (let i = 0; i < nWorkspaces; i++) { ++ let index = i; ++ let name = Meta.prefs_get_workspace_name(i); ++ let subitem = item.menu.addAction(name, () => { ++ window.change_workspace_by_index(index, false); ++ }); ++ subitem.setSensitive(currentIndex != i); ++ } ++ } + } + } + +-- +2.21.0 + diff --git a/SOURCES/0001-workspace-Pass-device-to-startDrag.patch b/SOURCES/0001-workspace-Pass-device-to-startDrag.patch new file mode 100644 index 0000000..7b4afba --- /dev/null +++ b/SOURCES/0001-workspace-Pass-device-to-startDrag.patch @@ -0,0 +1,31 @@ +From 9115f6e7962b97c3ee2fbef7b195b7116e62c070 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Fri, 13 Dec 2019 18:14:51 +0100 +Subject: [PATCH] workspace: Pass device to startDrag() + +This is necessary to make DnD operations work from tablet devices on +wayland, as it's not the same onscreen pointer sprite than mice. Fixes +window DnD in the overview on tablet devices, no longer having them stick +to the wrong pointer. + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/897 +--- + js/ui/workspace.js | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/js/ui/workspace.js b/js/ui/workspace.js +index 1e9bedc28..d470f7f40 100644 +--- a/js/ui/workspace.js ++++ b/js/ui/workspace.js +@@ -431,7 +431,7 @@ var WindowClone = GObject.registerClass({ + return; + let [x, y] = action.get_coords(); + action.release(); +- this._draggable.startDrag(x, y, global.get_current_time(), this._dragTouchSequence); ++ this._draggable.startDrag(x, y, global.get_current_time(), this._dragTouchSequence, event.get_device()); + }); + } else { + this.emit('show-chrome'); +-- +2.23.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 new file mode 100644 index 0000000..de5f77a --- /dev/null +++ b/SOURCES/0002-background-rebuild-background-not-just-animation-on-.patch @@ -0,0 +1,31 @@ +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 + resume + +Previously, we would only refresh the animation on resume +(to handle clock skew). + +But we actually need to rebuild the background, too, on nvidia, +so we should just do a full background change. +--- + js/ui/background.js | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/js/ui/background.js b/js/ui/background.js +index 06e038816..75b76a57e 100644 +--- a/js/ui/background.js ++++ b/js/ui/background.js +@@ -254,7 +254,7 @@ var Background = class Background { + (lm, aboutToSuspend) => { + if (aboutToSuspend) + return; +- this._refreshAnimation(); ++ this.emit('changed'); + }); + + this._settingsChangedSignalId = this._settings.connect('changed', () => { +-- +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 new file mode 100644 index 0000000..b396e1c --- /dev/null +++ b/SOURCES/0002-gdmUtil-enable-support-for-GDM-s-ChoiceList-PAM-exte.patch @@ -0,0 +1,267 @@ +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 + extension + +This commit hooks up support for GDM's ChoiceList PAM extension. +--- + js/gdm/authPrompt.js | 74 ++++++++++++++++++++++++++++++++++++++++++- + js/gdm/loginDialog.js | 5 +++ + js/gdm/util.js | 28 ++++++++++++++++ + js/ui/unlockDialog.js | 9 +++++- + 4 files changed, 114 insertions(+), 2 deletions(-) + +diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js +index cf77b3f26..71069e93b 100644 +--- a/js/gdm/authPrompt.js ++++ b/js/gdm/authPrompt.js +@@ -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; +@@ -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)); ++ this._userVerifier.connect('show-choice-list', this._onShowChoiceList.bind(this)); + 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)); +@@ -116,6 +118,28 @@ var AuthPrompt = class { + + this.actor.add(this._timedLoginIndicator); + ++ this._authList = new AuthList.AuthList(); ++ this._authList.connect('activate', (list, key) => { ++ this._authList.actor.reactive = false; ++ Tweener.addTween(this._authList.actor, ++ { opacity: 0, ++ time: MESSAGE_FADE_OUT_ANIMATION_TIME, ++ transition: 'easeOutQuad', ++ onComplete: () => { ++ this._authList.clear(); ++ this._authList.actor.hide(); ++ this._userVerifier.selectChoice(this._queryingService, key); ++ ++ } ++ }); ++ }); ++ this._authList.actor.hide(); ++ this.actor.add(this._authList.actor, ++ { expand: true, ++ x_fill: true, ++ y_fill: false, ++ x_align: St.Align.START }); ++ + this._message = new St.Label({ opacity: 0, + styleClass: 'login-dialog-message' }); + this._message.clutter_text.line_wrap = true; +@@ -258,6 +282,21 @@ var AuthPrompt = class { + this.emit('prompted'); + } + ++ _onShowChoiceList(userVerifier, serviceName, promptMessage, choiceList) { ++ if (this._queryingService) ++ this.clear(); ++ ++ this._queryingService = serviceName; ++ ++ if (this._preemptiveAnswer) ++ this._preemptiveAnswer = null; ++ ++ this.nextButton.label = _("Next"); ++ this.setChoiceList(promptMessage, choiceList); ++ this.updateSensitivity(true); ++ this.emit('prompted'); ++ } ++ + _onOVirtUserAuthenticated() { + if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED) + this.reset(); +@@ -386,6 +425,8 @@ var AuthPrompt = class { + clear() { + this._entry.text = ''; + this.stopSpinning(); ++ this._authList.clear(); ++ this._authList.actor.hide(); + } + + setPasswordChar(passwordChar) { +@@ -401,12 +442,42 @@ var AuthPrompt = class { + + this._label.set_text(question); + ++ this._authList.actor.hide(); + this._label.show(); + this._entry.show(); + + this._entry.grab_key_focus(); + } + ++ _fadeInChoiceList() { ++ this._authList.actor.opacity = 0; ++ this._authList.actor.show(); ++ this._authList.actor.reactive = false; ++ Tweener.addTween(this._authList.actor, ++ { opacity: 255, ++ time: MESSAGE_FADE_OUT_ANIMATION_TIME, ++ transition: 'easeOutQuad', ++ onComplete: () => { ++ this._authList.actor.reactive = true; ++ } ++ }); ++ } ++ ++ setChoiceList(promptMessage, choiceList) { ++ this._authList.clear(); ++ this._authList.label.text = promptMessage; ++ for (let key in choiceList) { ++ let text = choiceList[key]; ++ this._authList.addItem(key, text); ++ } ++ ++ this._label.hide(); ++ this._entry.hide(); ++ if (this._message.text == "") ++ this._message.hide(); ++ this._fadeInChoiceList(); ++ } ++ + getAnswer() { + let text; + +@@ -442,6 +513,7 @@ var AuthPrompt = class { + else + this._message.remove_style_class_name('login-dialog-message-hint'); + ++ this._message.show(); + if (message) { + Tweener.removeTweens(this._message); + this._message.text = message; +@@ -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 9aaa013d8..942f5a0e5 100644 +--- a/js/gdm/loginDialog.js ++++ b/js/gdm/loginDialog.js +@@ -406,6 +406,11 @@ var LoginDialog = GObject.registerClass({ + this._userManager = AccountsService.UserManager.get_default() + this._gdmClient = new Gdm.Client(); + ++ try { ++ this._gdmClient.set_enabled_extensions([Gdm.UserVerifierChoiceList.interface_info().name]); ++ } catch(e) { ++ } ++ + this._settings = new Gio.Settings({ schema_id: GdmUtil.LOGIN_SCREEN_SCHEMA }); + + this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY, +diff --git a/js/gdm/util.js b/js/gdm/util.js +index 6e940d2ab..9e249139d 100644 +--- a/js/gdm/util.js ++++ b/js/gdm/util.js +@@ -192,6 +192,10 @@ var ShellUserVerifier = class { + if (this._userVerifier) { + this._userVerifier.run_dispose(); + this._userVerifier = null; ++ if (this._userVerifierChoiceList) { ++ this._userVerifierChoiceList.run_dispose(); ++ this._userVerifierChoiceList = null; ++ } + } + } + +@@ -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); +@@ -362,6 +370,11 @@ var ShellUserVerifier = class { + return; + } + ++ if (client.get_user_verifier_choice_list) ++ this._userVerifierChoiceList = client.get_user_verifier_choice_list(); ++ else ++ this._userVerifierChoiceList = null; ++ + this.reauthenticating = true; + this._connectSignals(); + this._beginVerification(); +@@ -379,6 +392,11 @@ var ShellUserVerifier = class { + return; + } + ++ if (client.get_user_verifier_choice_list) ++ this._userVerifierChoiceList = client.get_user_verifier_choice_list(); ++ else ++ this._userVerifierChoiceList = null; ++ + this._connectSignals(); + this._beginVerification(); + this._hold.release(); +@@ -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() { +@@ -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 5c9d46021..4b0470f4b 100644 +--- a/js/ui/unlockDialog.js ++++ b/js/ui/unlockDialog.js +@@ -33,7 +33,14 @@ var UnlockDialog = class { + y_expand: true }); + this.actor.add_child(this._promptBox); + +- this._authPrompt = new AuthPrompt.AuthPrompt(new Gdm.Client(), AuthPrompt.AuthPromptMode.UNLOCK_ONLY); ++ this._gdmClient = new Gdm.Client(); ++ ++ try { ++ this._gdmClient.set_enabled_extensions([Gdm.UserVerifierChoiceList.interface_info().name]); ++ } catch(e) { ++ } ++ ++ this._authPrompt = new AuthPrompt.AuthPrompt(this._gdmClient, AuthPrompt.AuthPromptMode.UNLOCK_ONLY); + this._authPrompt.connect('failed', this._fail.bind(this)); + this._authPrompt.connect('cancelled', this._fail.bind(this)); + this._authPrompt.connect('reset', this._onReset.bind(this)); +-- +2.21.0 + diff --git a/SOURCES/0003-st-texture-cache-purge-on-resume.patch b/SOURCES/0003-st-texture-cache-purge-on-resume.patch new file mode 100644 index 0000000..41c288d --- /dev/null +++ b/SOURCES/0003-st-texture-cache-purge-on-resume.patch @@ -0,0 +1,66 @@ +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 + +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 | 10 ++++++++++ + src/st/st-texture-cache.h | 1 + + 3 files changed, 16 insertions(+), 1 deletion(-) + +diff --git a/js/ui/main.js b/js/ui/main.js +index 061303cf3..8d1755cf1 100644 +--- a/js/ui/main.js ++++ b/js/ui/main.js +@@ -200,7 +200,11 @@ function _initializeUI() { + return true; + }); + +- global.display.connect('gl-video-memory-purged', loadTheme); ++ global.display.connect('gl-video-memory-purged', () => { ++ let cache = St.TextureCache.get_default(); ++ cache.clear(); ++ loadTheme(); ++ }); + + // Provide the bus object for gnome-session to + // initiate logouts. +diff --git a/src/st/st-texture-cache.c b/src/st/st-texture-cache.c +index cbe3afaba..40a11dd6d 100644 +--- a/src/st/st-texture-cache.c ++++ b/src/st/st-texture-cache.c +@@ -113,6 +113,16 @@ st_texture_cache_class_init (StTextureCacheClass *klass) + G_TYPE_NONE, 1, G_TYPE_FILE); + } + ++/* Evicts all cached textures */ ++void ++st_texture_cache_clear (StTextureCache *cache) ++{ ++ 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); ++} ++ + /* Evicts all cached textures for named icons */ + static void + st_texture_cache_evict_icons (StTextureCache *cache) +diff --git a/src/st/st-texture-cache.h b/src/st/st-texture-cache.h +index 11d1c4e64..9079d1fda 100644 +--- a/src/st/st-texture-cache.h ++++ b/src/st/st-texture-cache.h +@@ -53,6 +53,7 @@ typedef enum { + } StTextureCachePolicy; + + StTextureCache* st_texture_cache_get_default (void); ++void st_texture_cache_clear (StTextureCache *cache); + + ClutterActor * + st_texture_cache_load_sliced_image (StTextureCache *cache, +-- +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 new file mode 100644 index 0000000..0f81f47 --- /dev/null +++ b/SOURCES/0004-background-refresh-background-on-gl-video-memory-pur.patch @@ -0,0 +1,115 @@ +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 + signal + +Right now we refresh the background when resuming and when NVIDIA. +But mutter has a signal to tell us specifically when to refresh, +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 | 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 75b76a57e..466cc4de7 100644 +--- a/js/ui/background.js ++++ b/js/ui/background.js +@@ -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(); ++ }); + } + +- _onMonitorsChanged() { ++ _refresh() { + for (let monitorIndex in this._backgrounds) { + let background = this._backgrounds[monitorIndex]; + +diff --git a/js/ui/layout.js b/js/ui/layout.js +index 30e750dc5..2b3bb7442 100644 +--- a/js/ui/layout.js ++++ b/js/ui/layout.js +@@ -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 +- // suspend/resume, see +- // https://bugzilla.gnome.org/show_bug.cgi?id=739178 +- if (Shell.util_need_background_refresh()) { +- LoginManager.getLoginManager().connect('prepare-for-sleep', +- (lm, suspending) => { +- if (suspending) +- return; +- Meta.Background.refresh_all(); +- }); +- } + } + + // This is called by Main after everything else is constructed +diff --git a/src/shell-util.c b/src/shell-util.c +index c6e5abed6..9c25643c6 100644 +--- a/src/shell-util.c ++++ b/src/shell-util.c +@@ -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) +-{ +- if (g_strcmp0 (get_gl_vendor (), "NVIDIA Corporation") == 0) +- return TRUE; +- +- return FALSE; +-} +- + static gboolean + canvas_draw_cb (ClutterContent *content, + cairo_t *cr, +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); + +-gboolean shell_util_need_background_refresh (void); +- + ClutterContent * shell_util_get_content_for_window_actor (MetaWindowActor *window_actor, + MetaRectangle *window_rect); + +-- +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 new file mode 100644 index 0000000..bc5b56e --- /dev/null +++ b/SOURCES/allow-timed-login-with-no-user-list.patch @@ -0,0 +1,158 @@ +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 + +At the moment the timed login feature is implemented in the user list. +If there's no user list, we don't show the indicator anywhere and +don't proceed with timed login. + +This commit allows timed login to work when the user list is disabled. +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 | 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 a6357baad..c2df28279 100644 +--- a/data/theme/gnome-shell-sass/_common.scss ++++ b/data/theme/gnome-shell-sass/_common.scss +@@ -1856,6 +1856,10 @@ StScrollBar { + padding-bottom: 12px; + spacing: 8px; + width: 23em; ++ .login-dialog-timed-login-indicator { ++ height: 2px; ++ background-color: darken($fg_color,40%); ++ } + } + + .login-dialog-prompt-label { +diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js +index 27eb31a89..cf77b3f26 100644 +--- a/js/gdm/authPrompt.js ++++ b/js/gdm/authPrompt.js +@@ -1,6 +1,6 @@ + // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +-const { Clutter, Pango, Shell, St } = imports.gi; ++const { Clutter, GLib, Pango, Shell, St } = imports.gi; + const Signals = imports.signals; + + const Animation = imports.ui.animation; +@@ -111,6 +111,11 @@ var AuthPrompt = class { + + this._entry.grab_key_focus(); + ++ this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator', ++ scale_x: 0 }); ++ ++ this.actor.add(this._timedLoginIndicator); ++ + this._message = new St.Label({ opacity: 0, + styleClass: 'login-dialog-message' }); + this._message.clutter_text.line_wrap = true; +@@ -135,6 +140,40 @@ var AuthPrompt = class { + this._defaultButtonWell.add_child(this._spinner.actor); + } + ++ showTimedLoginIndicator(time) { ++ let hold = new Batch.Hold(); ++ ++ this.hideTimedLoginIndicator(); ++ ++ let startTime = GLib.get_monotonic_time(); ++ ++ this._timedLoginTimeoutId = GLib.timeout_add (GLib.PRIORITY_DEFAULT, 33, ++ () => { ++ let currentTime = GLib.get_monotonic_time(); ++ let elapsedTime = (currentTime - startTime) / GLib.USEC_PER_SEC; ++ this._timedLoginIndicator.scale_x = elapsedTime / time; ++ if (elapsedTime >= time) { ++ this._timedLoginTimeoutId = 0; ++ hold.release(); ++ return GLib.SOURCE_REMOVE; ++ } ++ ++ return GLib.SOURCE_CONTINUE; ++ }); ++ ++ GLib.Source.set_name_by_id(this._timedLoginTimeoutId, '[gnome-shell] this._timedLoginTimeoutId'); ++ ++ return hold; ++ } ++ ++ hideTimedLoginIndicator() { ++ if (this._timedLoginTimeoutId) { ++ GLib.source_remove(this._timedLoginTimeoutId); ++ 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 6c4d1357d..9aaa013d8 100644 +--- a/js/gdm/loginDialog.js ++++ b/js/gdm/loginDialog.js +@@ -734,6 +734,9 @@ var LoginDialog = GObject.registerClass({ + + if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING) + this._authPrompt.reset(); ++ ++ if (this._disableUserList && this._timedLoginUserListHold) ++ this._timedLoginUserListHold.release(); + } + } + +@@ -1020,9 +1023,21 @@ var LoginDialog = GObject.registerClass({ + let loginItem = null; + let animationTime; + +- let tasks = [() => this._waitForItemForUser(userName), ++ let tasks = [() => { ++ if (this._disableUserList) ++ return; ++ ++ this._timedLoginUserListHold = this._waitForItemForUser(userName); ++ ++ return this._timedLoginUserListHold; ++ }, + + () => { ++ this._timedLoginUserListHold = null; ++ ++ if (this._disableUserList) ++ return; ++ + 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 (!this._userManager.is_loaded) { + this._userList.jumpToItem(loginItem); +@@ -1051,6 +1069,9 @@ var LoginDialog = GObject.registerClass({ + }, + + () => { ++ if (this._disableUserList) ++ return; ++ + // If idle timeout is done, make sure the timed login indicator is shown + if (delay > _TIMED_LOGIN_IDLE_THRESHOLD && + this._authPrompt.actor.visible) +-- +2.21.0 + diff --git a/SOURCES/disable-unlock-entry-until-question.patch b/SOURCES/disable-unlock-entry-until-question.patch new file mode 100644 index 0000000..d238ae8 --- /dev/null +++ b/SOURCES/disable-unlock-entry-until-question.patch @@ -0,0 +1,167 @@ +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 + password up front + +Right now we fade out any stale auth messages as soon as the user starts +typing. This behavior doesn't really make sense if the user is typing up +front, before a password is asked. +--- + js/gdm/authPrompt.js | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js +index d7f53a92e..d421a8856 100644 +--- a/js/gdm/authPrompt.js ++++ b/js/gdm/authPrompt.js +@@ -169,7 +169,7 @@ var AuthPrompt = class { + this._updateNextButtonSensitivity(this._entry.text.length > 0); + + this._entry.clutter_text.connect('text-changed', () => { +- if (!this._userVerifier.hasPendingMessages) ++ if (!this._userVerifier.hasPendingMessages && this._queryingService && !this._preemptiveAnswer) + this._fadeOutMessage(); + + this._updateNextButtonSensitivity(this._entry.text.length > 0 || this.verificationStatus == AuthPromptStatus.VERIFYING); +-- +2.21.0 + + +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 + +--- + js/gdm/authPrompt.js | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js +index d421a8856..62c5bd078 100644 +--- a/js/gdm/authPrompt.js ++++ b/js/gdm/authPrompt.js +@@ -60,8 +60,8 @@ var AuthPrompt = class { + + this.connect('next', () => { + this.updateSensitivity(false); +- this.startSpinning(); + if (this._queryingService) { ++ this.startSpinning(); + this._userVerifier.answerQuery(this._queryingService, this._entry.text); + } else { + this._preemptiveAnswer = this._entry.text; +-- +2.21.0 + + +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 + stops typing + +We only want to allow the user to type the preemptive password in +one smooth motion. If they start to type, and then stop typing, +we should discard their preemptive password as expired. + +Typing ahead the password is just a convenience for users who don't +want to manually lift the shift before typing their passwords, after +all. +--- + js/gdm/authPrompt.js | 37 +++++++++++++++++++++++++++++++++++++ + 1 file changed, 37 insertions(+) + +diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js +index 62c5bd078..27eb31a89 100644 +--- a/js/gdm/authPrompt.js ++++ b/js/gdm/authPrompt.js +@@ -6,6 +6,7 @@ const Signals = imports.signals; + const Animation = imports.ui.animation; + const Batch = imports.gdm.batch; + const GdmUtil = imports.gdm.util; ++const Meta = imports.gi.Meta; + const Params = imports.misc.params; + const ShellEntry = imports.ui.shellEntry; + const Tweener = imports.ui.tweener; +@@ -41,6 +42,8 @@ var AuthPrompt = class { + this._gdmClient = gdmClient; + this._mode = mode; + ++ this._idleMonitor = Meta.IdleMonitor.get_core(); ++ + let reauthenticationOnly; + if (this._mode == AuthPromptMode.UNLOCK_ONLY) + reauthenticationOnly = true; +@@ -65,6 +68,11 @@ var AuthPrompt = class { + this._userVerifier.answerQuery(this._queryingService, this._entry.text); + } else { + this._preemptiveAnswer = this._entry.text; ++ ++ if (this._preemptiveAnswerWatchId) { ++ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId); ++ this._preemptiveAnswerWatchId = 0; ++ } + } + }); + +@@ -128,6 +136,11 @@ var AuthPrompt = class { + } + + _onDestroy() { ++ if (this._preemptiveAnswerWatchId) { ++ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId); ++ this._preemptiveAnswerWatchId = 0; ++ } ++ + this._userVerifier.destroy(); + this._userVerifier = null; + } +@@ -342,6 +355,11 @@ var AuthPrompt = class { + } + + setQuestion(question) { ++ if (this._preemptiveAnswerWatchId) { ++ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId); ++ this._preemptiveAnswerWatchId = 0; ++ } ++ + this._label.set_text(question); + + this._label.show(); +@@ -427,6 +445,19 @@ var AuthPrompt = class { + } + } + ++ _onUserStoppedTypePreemptiveAnswer() { ++ if (!this._preemptiveAnswerWatchId || ++ this._preemptiveAnswer || ++ this._queryingService) ++ return; ++ ++ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId); ++ this._preemptiveAnswerWatchId = 0; ++ ++ this._entry.text = ''; ++ this.updateSensitivity(false); ++ } ++ + reset() { + let oldStatus = this.verificationStatus; + this.verificationStatus = AuthPromptStatus.NOT_VERIFYING; +@@ -434,6 +465,12 @@ var AuthPrompt = class { + this.nextButton.label = _("Next"); + this._preemptiveAnswer = null; + ++ if (this._preemptiveAnswerWatchId) { ++ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId); ++ } ++ this._preemptiveAnswerWatchId = this._idleMonitor.add_idle_watch (500, ++ this._onUserStoppedTypePreemptiveAnswer.bind(this)); ++ + if (this._userVerifier) + this._userVerifier.cancel(); + +-- +2.21.0 + diff --git a/SOURCES/enforce-smartcard-at-unlock.patch b/SOURCES/enforce-smartcard-at-unlock.patch new file mode 100644 index 0000000..60274e5 --- /dev/null +++ b/SOURCES/enforce-smartcard-at-unlock.patch @@ -0,0 +1,114 @@ +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 + (any) token + +If a user uses a token at login time, we need to make sure they continue +to use the token at unlock time. + +As a prerequisite for addressing that problem we need to know up front +if a user logged in with a token at all. + +This commit adds the necessary api to detect that case. +--- + js/misc/smartcardManager.js | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/js/misc/smartcardManager.js b/js/misc/smartcardManager.js +index fda782d1e..bb43c96e7 100644 +--- a/js/misc/smartcardManager.js ++++ b/js/misc/smartcardManager.js +@@ -112,5 +112,12 @@ var SmartcardManager = class { + return true; + } + ++ loggedInWithToken() { ++ if (this._loginToken) ++ return true; ++ ++ return false; ++ } ++ + }; + Signals.addSignalMethods(SmartcardManager.prototype); +-- +2.21.0 + + +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 + login + +If a smartcard is used for login, we need to make sure the smartcard +gets used for unlock, too. +--- + js/gdm/util.js | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/js/gdm/util.js b/js/gdm/util.js +index 2e9935250..2b80e1dd9 100644 +--- a/js/gdm/util.js ++++ b/js/gdm/util.js +@@ -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)); +- this._updateDefaultService(); + + this._fprintManager = Fprint.FprintManager(); + this._smartcardManager = SmartcardManager.getSmartcardManager(); +@@ -138,6 +137,8 @@ var ShellUserVerifier = class { + this.smartcardDetected = false; + this._checkForSmartcard(); + ++ this._updateDefaultService(); ++ + this._smartcardInsertedId = this._smartcardManager.connect('smartcard-inserted', + this._checkForSmartcard.bind(this)); + this._smartcardRemovedId = this._smartcardManager.connect('smartcard-removed', +@@ -407,7 +408,9 @@ var ShellUserVerifier = class { + } + + _updateDefaultService() { +- if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY)) ++ if (this._smartcardManager.loggedInWithToken()) ++ this._defaultService = SMARTCARD_SERVICE_NAME; ++ else if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY)) + this._defaultService = PASSWORD_SERVICE_NAME; + else if (this._settings.get_boolean(SMARTCARD_AUTHENTICATION_KEY)) + this._defaultService = SMARTCARD_SERVICE_NAME; +-- +2.21.0 + + +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 + +Early on at start up we may not know if a smartcard is +available. Make sure we reupdate the default service +after we get a smartcard insertion event. +--- + js/gdm/util.js | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/js/gdm/util.js b/js/gdm/util.js +index 2b80e1dd9..6e940d2ab 100644 +--- a/js/gdm/util.js ++++ b/js/gdm/util.js +@@ -327,6 +327,8 @@ var ShellUserVerifier = class { + else if (this._preemptingService == SMARTCARD_SERVICE_NAME) + this._preemptingService = null; + ++ this._updateDefaultService(); ++ + this.emit('smartcard-status-changed'); + } + } +-- +2.21.0 + diff --git a/SOURCES/fix-app-view-leaks.patch b/SOURCES/fix-app-view-leaks.patch new file mode 100644 index 0000000..b74b9b2 --- /dev/null +++ b/SOURCES/fix-app-view-leaks.patch @@ -0,0 +1,421 @@ +From a518c9f57e5fe9c6b5ece5c6cb0534a83f0b2f2d Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 15 Jul 2019 13:52:58 -0400 +Subject: [PATCH 1/8] appDisplay: Don't leak duplicate items in AppView + +If an icon already exists in an app view with the same id, the +duplicate is not added on a call to addItem. Unfortunately, +since it's not added, the icon actor gets orphaned and leaked. + +This commit address the problem by introducing a new hasItem +method and disallowing callers to call addItem with a duplicate +in the first place. + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/628 +--- + js/ui/appDisplay.js | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js +index a07db6573..fa22f47e0 100644 +--- a/js/ui/appDisplay.js ++++ b/js/ui/appDisplay.js +@@ -143,10 +143,14 @@ class BaseAppView { + return this._allItems; + } + ++ hasItem(id) { ++ return this._items[id] !== undefined; ++ } ++ + addItem(icon) { + let id = icon.id; +- if (this._items[id] !== undefined) +- return; ++ if (this.hasItem(id)) ++ throw new Error(`icon with id ${id} already added to view`) + + this._allItems.push(icon); + this._items[id] = icon; +@@ -386,6 +390,8 @@ var AllView = class AllView extends BaseAppView { + + let folders = this._folderSettings.get_strv('folder-children'); + folders.forEach(id => { ++ if (this.hasItem(id)) ++ return; + let path = this._folderSettings.path + 'folders/' + id + '/'; + let icon = new FolderIcon(id, path, this); + icon.connect('name-changed', this._itemNameChanged.bind(this)); +@@ -1165,7 +1171,10 @@ var FolderIcon = class FolderIcon { + let excludedApps = this._folder.get_strv('excluded-apps'); + let appSys = Shell.AppSystem.get_default(); + let addAppId = appId => { +- if (excludedApps.indexOf(appId) >= 0) ++ if (this.view.hasItem(appId)) ++ return; ++ ++ if (excludedApps.includes(appId)) + return; + + let app = appSys.lookup_app(appId); +-- +2.23.0 + + +From 2b6aa9aed98c4854c2ad015879ddcb8d2bf91e9e Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 22 Jul 2019 11:06:30 -0400 +Subject: [PATCH 2/8] iconGrid: Clear meta_later callback on destruction + +The IconGrid code sometimes sets up a callback to be invoked +later right before being destroyed. + +This commit adds a destroy handler to cancel the callback. + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/628 +--- + js/ui/iconGrid.js | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +diff --git a/js/ui/iconGrid.js b/js/ui/iconGrid.js +index d51a443e8..1f05e67f3 100644 +--- a/js/ui/iconGrid.js ++++ b/js/ui/iconGrid.js +@@ -210,6 +210,8 @@ var IconGrid = GObject.registerClass({ + this.rightPadding = 0; + this.leftPadding = 0; + ++ this._updateIconSizesLaterId = 0; ++ + this._items = []; + this._clonesAnimating = []; + // Pulled from CSS, but hardcode some defaults here +@@ -227,6 +229,14 @@ var IconGrid = GObject.registerClass({ + + this.connect('actor-added', this._childAdded.bind(this)); + this.connect('actor-removed', this._childRemoved.bind(this)); ++ this.connect('destroy', this._onDestroy.bind(this)); ++ } ++ ++ _onDestroy() { ++ if (this._updateIconSizesLaterId) { ++ Meta.later_remove (this._updateIconSizesLaterId); ++ this._updateIconSizesLaterId = 0; ++ } + } + + _keyFocusIn(actor) { +@@ -757,12 +767,14 @@ var IconGrid = GObject.registerClass({ + + this._updateSpacingForSize(availWidth, availHeight); + } +- Meta.later_add(Meta.LaterType.BEFORE_REDRAW, +- this._updateIconSizes.bind(this)); ++ if (!this._updateIconSizesLaterId) ++ this._updateIconSizesLaterId = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, ++ this._updateIconSizes.bind(this)); + } + + // Note that this is ICON_SIZE as used by BaseIcon, not elsewhere in IconGrid; it's a bit messed up + _updateIconSizes() { ++ this._updateIconSizesLaterId = 0; + let scale = Math.min(this._fixedHItemSize, this._fixedVItemSize) / Math.max(this._hItemSize, this._vItemSize); + let newIconSize = Math.floor(ICON_SIZE * scale); + for (let i in this._items) { +-- +2.23.0 + + +From 14a2650548a5104d6a3ec7a1174a23264d79030a Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 22 Jul 2019 11:02:10 -0400 +Subject: [PATCH 3/8] appDisplay: Add AppFolderPopup destroy handler + +At the moment AppFolderPopup calls popdown on destruction, +which leads to open-state-changed getting emitted after +the actor associated with the popup is destroyed. + +This commit handles ungrabbing and closing from an +actor destroy handler to side-step the open-state-changed +signal. + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/628 +--- + js/ui/appDisplay.js | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js +index fa22f47e0..b75d095d5 100644 +--- a/js/ui/appDisplay.js ++++ b/js/ui/appDisplay.js +@@ -1329,6 +1329,15 @@ var AppFolderPopup = class AppFolderPopup { + }); + this._grabHelper.addActor(Main.layoutManager.overviewGroup); + this.actor.connect('key-press-event', this._onKeyPress.bind(this)); ++ this.actor.connect('destroy', this._onDestroy.bind(this)); ++ } ++ ++ _onDestroy() { ++ if (this._isOpen) { ++ this._isOpen = false; ++ this._grabHelper.ungrab({ actor: this.actor }); ++ this._grabHelper = null; ++ } + } + + _onKeyPress(actor, event) { +-- +2.23.0 + + +From c9fcb2d23141694ffa2182df20ba75687b01dacc Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Thu, 18 Jul 2019 10:06:38 -0400 +Subject: [PATCH 4/8] appDisplay: Clear AllView reference to current popup when + destroyed + +AllView contains a reference to the current popup that lingers after +the popup is destroyed. + +This commit fixes that, by explicitly nullifying when appropriate. + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/628 +--- + js/ui/appDisplay.js | 18 +++++++++++++++++- + 1 file changed, 17 insertions(+), 1 deletion(-) + +diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js +index b75d095d5..dabf63bfd 100644 +--- a/js/ui/appDisplay.js ++++ b/js/ui/appDisplay.js +@@ -300,6 +300,7 @@ var AllView = class AllView extends BaseAppView { + this._eventBlocker.add_action(this._clickAction); + + this._displayingPopup = false; ++ this._currentPopupDestroyId = 0; + + this._availWidth = 0; + this._availHeight = 0; +@@ -589,7 +590,22 @@ var AllView = class AllView extends BaseAppView { + this._stack.add_actor(popup.actor); + popup.connect('open-state-changed', (popup, isOpen) => { + this._eventBlocker.reactive = isOpen; +- this._currentPopup = isOpen ? popup : null; ++ ++ if (this._currentPopup) { ++ this._currentPopup.actor.disconnect(this._currentPopupDestroyId); ++ this._currentPopupDestroyId = 0; ++ } ++ ++ this._currentPopup = null; ++ ++ if (isOpen) { ++ this._currentPopup = popup; ++ this._currentPopupDestroyId = popup.actor.connect('destroy', () => { ++ this._currentPopup = null; ++ this._currentPopupDestroyId = 0; ++ this._eventBlocker.reactive = false; ++ }); ++ } + this._updateIconOpacities(isOpen); + if(!isOpen) + this._closeSpaceForPopup(); +-- +2.23.0 + + +From b7a3fd7fa4527ba9411dcd18debe6ccf88c34dc0 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Mon, 22 Jul 2019 10:57:57 -0400 +Subject: [PATCH 5/8] appDisplay: Add destroy handler for FolderIcon + +It is important that the FolderView of a FolderIcon always +gets destroyed before the AppFolderPopup, since the view +may or may not be in the popup, and the view should +get cleaned up exactly once in either case. + +This commit adds a destroy handler on FolderIcon to ensure +things get taken down in the right order, and to make sure +the view isn't leaked if it's not yet part of the popup. + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/628 +--- + js/ui/appDisplay.js | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js +index dabf63bfd..5a8f4f1bf 100644 +--- a/js/ui/appDisplay.js ++++ b/js/ui/appDisplay.js +@@ -1156,6 +1156,7 @@ var FolderIcon = class FolderIcon { + this.view.actor.vscroll.adjustment.value = 0; + this._openSpaceForPopup(); + }); ++ this.actor.connect('destroy', this.onDestroy.bind(this)); + this.actor.connect('notify::mapped', () => { + if (!this.actor.mapped && this._popup) + this._popup.popdown(); +@@ -1165,6 +1166,13 @@ var FolderIcon = class FolderIcon { + this._redisplay(); + } + ++ onDestroy() { ++ this.view.actor.destroy(); ++ ++ if (this._popup) ++ this._popup.actor.destroy(); ++ } ++ + getAppIds() { + return this.view.getAllItems().map(item => item.id); + } +-- +2.23.0 + + +From a90d7a97d21ffa596747cc8ecd0e3f500cb8a77c Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Thu, 18 Jul 2019 14:49:30 -0400 +Subject: [PATCH 6/8] appDisplay: Stop watching FolderIcon parent view when + destroyed + +When a FolderIcon is opened, it asks the parent view to allocate +space for it, which takes time. Eventually, the space-ready +signal is emitted on the view and the icon can make use of the new +space with its popup. If the icon gets destroyed in the +interim, though, space-ready signal handler still fires. + +This commit disconnects the signal handler so it doesn't get called +on a destroyed icon. + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/628 +--- + js/ui/appDisplay.js | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js +index 5a8f4f1bf..062ff222c 100644 +--- a/js/ui/appDisplay.js ++++ b/js/ui/appDisplay.js +@@ -1169,6 +1169,11 @@ var FolderIcon = class FolderIcon { + onDestroy() { + this.view.actor.destroy(); + ++ if (this._spaceReadySignalId) { ++ this._parentView.disconnect(this._spaceReadySignalId); ++ this._spaceReadySignalId = 0; ++ } ++ + if (this._popup) + this._popup.actor.destroy(); + } +@@ -1240,8 +1245,9 @@ var FolderIcon = class FolderIcon { + } + + _openSpaceForPopup() { +- let id = this._parentView.connect('space-ready', () => { +- this._parentView.disconnect(id); ++ this._spaceReadySignalId = this._parentView.connect('space-ready', () => { ++ this._parentView.disconnect(this._spaceReadySignalId); ++ this._spaceReadySignalId = 0; + this._popup.popup(); + this._updatePopupPosition(); + }); +-- +2.23.0 + + +From b57ab33dadf0f31c5bf2c800806593e94784050c Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Thu, 18 Jul 2019 10:19:13 -0400 +Subject: [PATCH 7/8] appDisplay: Add open method to FolderIcon + +At the moment the only way to open a folder icon is to click on it; +there's no API to open the icon programmatically. + +This commits adds an open method and makes the click handler use +it. + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/628 +--- + js/ui/appDisplay.js | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js +index 062ff222c..c0c6e3663 100644 +--- a/js/ui/appDisplay.js ++++ b/js/ui/appDisplay.js +@@ -1151,11 +1151,7 @@ var FolderIcon = class FolderIcon { + + this.view = new FolderView(); + +- this.actor.connect('clicked', () => { +- this._ensurePopup(); +- this.view.actor.vscroll.adjustment.value = 0; +- this._openSpaceForPopup(); +- }); ++ this.actor.connect('clicked', this.open.bind(this)); + this.actor.connect('destroy', this.onDestroy.bind(this)); + this.actor.connect('notify::mapped', () => { + if (!this.actor.mapped && this._popup) +@@ -1178,6 +1174,12 @@ var FolderIcon = class FolderIcon { + this._popup.actor.destroy(); + } + ++ open() { ++ this._ensurePopup(); ++ this.view.actor.vscroll.adjustment.value = 0; ++ this._openSpaceForPopup(); ++ } ++ + getAppIds() { + return this.view.getAllItems().map(item => item.id); + } +-- +2.23.0 + + +From baacab7922a56957d041aa59944c419b82e7a7e1 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Thu, 18 Jul 2019 11:13:27 -0400 +Subject: [PATCH 8/8] appDisplay: Keep popup open on refresh + +If the list of applications is refreshed we currently close +the open app folder. + +This commit adds logic to reopen the app folder on reload. + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/628 +--- + js/ui/appDisplay.js | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js +index c0c6e3663..7fad02cd0 100644 +--- a/js/ui/appDisplay.js ++++ b/js/ui/appDisplay.js +@@ -345,6 +345,21 @@ var AllView = class AllView extends BaseAppView { + super.removeAll(); + } + ++ _redisplay() { ++ let openFolderId = null; ++ if (this._displayingPopup && this._currentPopup) ++ openFolderId = this._currentPopup._source.id; ++ ++ super._redisplay(); ++ ++ if (openFolderId) { ++ let [folderToReopen] = this.folderIcons.filter(folder => folder.id == openFolderId); ++ ++ if (folderToReopen) ++ folderToReopen.open(); ++ } ++ } ++ + _itemNameChanged(item) { + // If an item's name changed, we can pluck it out of where it's + // supposed to be and reinsert it where it's sorted. +-- +2.23.0 + diff --git a/SOURCES/fix-invalid-access-warnings.patch b/SOURCES/fix-invalid-access-warnings.patch new file mode 100644 index 0000000..8fbdb93 --- /dev/null +++ b/SOURCES/fix-invalid-access-warnings.patch @@ -0,0 +1,224 @@ +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 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 +them when resetting the object state. +Without doing this an handler could be called on a destroyed target when this +happens on the onComplete callback. + +https://bugzilla.gnome.org/show_bug.cgi?id=791233 +--- + js/ui/tweener.js | 63 ++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 50 insertions(+), 13 deletions(-) + +diff --git a/js/ui/tweener.js b/js/ui/tweener.js +index bb9ea557c..c04cede25 100644 +--- a/js/ui/tweener.js ++++ b/js/ui/tweener.js +@@ -63,30 +63,67 @@ function _getTweenState(target) { + return target.__ShellTweenerState; + } + ++function _ensureHandlers(target) { ++ if (!target.__ShellTweenerHandlers) ++ target.__ShellTweenerHandlers = {}; ++ return target.__ShellTweenerHandlers; ++} ++ + function _resetTweenState(target) { + let state = target.__ShellTweenerState; + + if (state) { +- if (state.destroyedId) ++ if (state.destroyedId) { + state.actor.disconnect(state.destroyedId); ++ delete state.destroyedId; ++ } + } + ++ _removeHandler(target, 'onComplete', _tweenCompleted); + target.__ShellTweenerState = {}; + } + + function _addHandler(target, params, name, handler) { +- if (params[name]) { +- let oldHandler = params[name]; +- let oldScope = params[name + 'Scope']; +- let oldParams = params[name + 'Params']; +- let eventScope = oldScope ? oldScope : target; +- +- params[name] = () => { +- oldHandler.apply(eventScope, oldParams); +- handler(target); +- }; +- } else +- params[name] = () => { handler(target); }; ++ let wrapperNeeded = false; ++ let tweenerHandlers = _ensureHandlers(target); ++ ++ if (!(name in tweenerHandlers)) { ++ tweenerHandlers[name] = []; ++ wrapperNeeded = true; ++ } ++ ++ let handlers = tweenerHandlers[name]; ++ handlers.push(handler); ++ ++ if (wrapperNeeded) { ++ if (params[name]) { ++ let oldHandler = params[name]; ++ let oldScope = params[name + 'Scope']; ++ let oldParams = params[name + 'Params']; ++ let eventScope = oldScope ? oldScope : target; ++ ++ params[name] = () => { ++ oldHandler.apply(eventScope, oldParams); ++ handlers.forEach((h) => h(target)); ++ }; ++ } else { ++ params[name] = () => { handlers.forEach((h) => h(target)); }; ++ } ++ } ++} ++ ++function _removeHandler(target, name, handler) { ++ let tweenerHandlers = _ensureHandlers(target); ++ ++ if (name in tweenerHandlers) { ++ let handlers = tweenerHandlers[name]; ++ let handlerIndex = handlers.indexOf(handler); ++ ++ while (handlerIndex > -1) { ++ handlers.splice(handlerIndex, 1); ++ handlerIndex = handlers.indexOf(handler); ++ } ++ } + } + + function _actorDestroyed(target) { +-- +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 new file mode 100644 index 0000000..888491e --- /dev/null +++ b/SOURCES/gnome-shell-favourite-apps-firefox.patch @@ -0,0 +1,38 @@ +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 @@ + + + +- [ 'epiphany.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ] ++ [ 'firefox.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ] + 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 +@@ -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', + '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 new file mode 100644 index 0000000..d3f0377 --- /dev/null +++ b/SOURCES/gnome-shell-favourite-apps-terminal.patch @@ -0,0 +1,25 @@ +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 + +--- + data/org.gnome.shell.gschema.xml.in | 2 +- + 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 40526187e..9d7e011fc 100644 +--- a/data/org.gnome.shell.gschema.xml.in ++++ b/data/org.gnome.shell.gschema.xml.in +@@ -39,7 +39,7 @@ + + + +- [ 'firefox.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop', 'yelp.desktop' ] ++ [ 'firefox.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop', 'yelp.desktop', 'gnome-terminal.desktop' ] + List of desktop file IDs for favorite applications + + The applications corresponding to these identifiers +-- +2.21.0 + diff --git a/SOURCES/gnome-shell-favourite-apps-yelp.patch b/SOURCES/gnome-shell-favourite-apps-yelp.patch new file mode 100644 index 0000000..d96597a --- /dev/null +++ b/SOURCES/gnome-shell-favourite-apps-yelp.patch @@ -0,0 +1,26 @@ +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 + +Help should be easily available, so add it to the default favorites. +--- + data/org.gnome.shell.gschema.xml.in | 2 +- + 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 2f50036d0..40526187e 100644 +--- a/data/org.gnome.shell.gschema.xml.in ++++ b/data/org.gnome.shell.gschema.xml.in +@@ -39,7 +39,7 @@ + + + +- [ 'firefox.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ] ++ [ 'firefox.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop', 'yelp.desktop' ] + List of desktop file IDs for favorite applications + + The applications corresponding to these identifiers +-- +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/SOURCES/perf-tool-wayland.patch b/SOURCES/perf-tool-wayland.patch new file mode 100644 index 0000000..c7530a6 --- /dev/null +++ b/SOURCES/perf-tool-wayland.patch @@ -0,0 +1,124 @@ +From 3c4c37e4d0668d748ee792f7580defdf4780624a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Thu, 5 Dec 2019 14:12:47 +0100 +Subject: [PATCH 1/2] perf-helper: Add content for custom drawing + +Drawing windows got a lot more involved with the advent of client-side +decorations. Instead of accounting for visible and invisible borders, +titlebar and shadows when necessary, just add an empty child for the +custom drawing. + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/887 +--- + src/shell-perf-helper.c | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +diff --git a/src/shell-perf-helper.c b/src/shell-perf-helper.c +index f115dcbdc..ba1754e02 100644 +--- a/src/shell-perf-helper.c ++++ b/src/shell-perf-helper.c +@@ -119,9 +119,9 @@ on_window_map_event (GtkWidget *window, + } + + static gboolean +-on_window_draw (GtkWidget *window, +- cairo_t *cr, +- WindowInfo *info) ++on_child_draw (GtkWidget *window, ++ cairo_t *cr, ++ WindowInfo *info) + { + cairo_rectangle_int_t allocation; + double x_offset, y_offset; +@@ -203,6 +203,7 @@ create_window (int width, + gboolean redraws) + { + WindowInfo *info; ++ GtkWidget *child; + + info = g_new0 (WindowInfo, 1); + info->width = width; +@@ -218,10 +219,13 @@ create_window (int width, + info->pending = TRUE; + info->start_time = -1; + ++ child = g_object_new (GTK_TYPE_BOX, "visible", TRUE, "app-paintable", TRUE, NULL); ++ gtk_container_add (GTK_CONTAINER (info->window), child); ++ + gtk_widget_set_size_request (info->window, width, height); + gtk_widget_set_app_paintable (info->window, TRUE); + g_signal_connect (info->window, "map-event", G_CALLBACK (on_window_map_event), info); +- g_signal_connect (info->window, "draw", G_CALLBACK (on_window_draw), info); ++ g_signal_connect (child, "draw", G_CALLBACK (on_child_draw), info); + gtk_widget_show (info->window); + + if (info->redraws) +-- +2.23.0 + + +From 0185c288c3e6b82b76f2a0704aab0e2ab20b75b8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Thu, 5 Dec 2019 13:29:38 +0100 +Subject: [PATCH 2/2] perf-helper: Remove unused atoms + +Those aren't used for anything, but make the helper dependent on X11. + +https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/887 +--- + src/shell-perf-helper.c | 18 ------------------ + 1 file changed, 18 deletions(-) + +diff --git a/src/shell-perf-helper.c b/src/shell-perf-helper.c +index ba1754e02..a50376e2e 100644 +--- a/src/shell-perf-helper.c ++++ b/src/shell-perf-helper.c +@@ -12,7 +12,6 @@ + #include + + #include +-#include + + #define BUS_NAME "org.gnome.Shell.PerfHelper" + +@@ -60,12 +59,6 @@ static GOptionEntry opt_entries[] = + { NULL } + }; + +-static Display *xdisplay; +-static Window xroot; +-static Atom atom_wm_state; +-static Atom atom__net_wm_name; +-static Atom atom_utf8_string; +- + static guint timeout_id; + static GList *our_windows; + static GList *wait_windows_invocations; +@@ -350,8 +343,6 @@ on_name_lost (GDBusConnection *connection, + int + main (int argc, char **argv) + { +- GdkDisplay *display; +- GdkScreen *screen; + GOptionContext *context; + GError *error = NULL; + +@@ -367,15 +358,6 @@ main (int argc, char **argv) + return 1; + } + +- display = gdk_display_get_default (); +- screen = gdk_screen_get_default (); +- +- xdisplay = gdk_x11_display_get_xdisplay (display); +- xroot = gdk_x11_window_get_xid (gdk_screen_get_root_window (screen)); +- atom_wm_state = gdk_x11_get_xatom_by_name_for_display (display, "WM_STATE"); +- atom__net_wm_name = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_NAME"); +- atom_utf8_string = gdk_x11_get_xatom_by_name_for_display (display, "UTF8_STRING"); +- + g_bus_own_name (G_BUS_TYPE_SESSION, + BUS_NAME, + G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT | +-- +2.23.0 + diff --git a/SOURCES/root-warning.patch b/SOURCES/root-warning.patch new file mode 100644 index 0000000..35b2c44 --- /dev/null +++ b/SOURCES/root-warning.patch @@ -0,0 +1,71 @@ +From 45ddeeaa317fb0ffd045600d9e4b95143c9ca8b8 Mon Sep 17 00:00:00 2001 +From: Matthias Clasen +Date: Sat, 8 Jun 2013 13:32:35 -0400 +Subject: [PATCH 1/2] main: Show a warning when running as root + +gnome-session used to show a dialog in this case, but a +notification is more natural nowadays. Doing it in gnome-shell +avoids complicated synchronization between gnome-session and +gnome-shell. + +https://bugzilla.gnome.org/show_bug.cgi?id=701212 +--- + js/ui/main.js | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/js/ui/main.js b/js/ui/main.js +index 8d1755cf1..abf8a8765 100644 +--- a/js/ui/main.js ++++ b/js/ui/main.js +@@ -237,6 +237,12 @@ function _initializeUI() { + ['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]); + } + ++ let credentials = new Gio.Credentials(); ++ if (credentials.get_unix_user() === 0) { ++ notify(_('Logged in as a privileged user'), ++ _('Running a session as a privileged user should be avoided for security reasons. If possible, you should log in as a normal user.')); ++ } ++ + let perfModuleName = GLib.getenv("SHELL_PERF_MODULE"); + if (perfModuleName) { + let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT"); +-- +2.23.0 + + +From 8e82907909b6a2e5af5da3f93b087df4b7eb48b5 Mon Sep 17 00:00:00 2001 +From: Matthias Clasen +Date: Sat, 8 Jun 2013 13:33:58 -0400 +Subject: [PATCH 2/2] main: Show a warning when gdm is missing + +If we are not running under gdm, some functionaliy (such as +the lock screen) does not work, and we should inform the +user about this. + +https://bugzilla.gnome.org/show_bug.cgi?id=701212 +--- + js/ui/main.js | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/js/ui/main.js b/js/ui/main.js +index abf8a8765..be49c750e 100644 +--- a/js/ui/main.js ++++ b/js/ui/main.js +@@ -243,6 +243,13 @@ function _initializeUI() { + _('Running a session as a privileged user should be avoided for security reasons. If possible, you should log in as a normal user.')); + } + ++ if (sessionMode.currentMode !== 'gdm' && ++ sessionMode.currentMode !== 'initial-setup' && ++ screenShield === null) { ++ notify(_('Screen Lock disabled'), ++ _('Screen Locking requires the GNOME display manager.')); ++ } ++ + let perfModuleName = GLib.getenv("SHELL_PERF_MODULE"); + if (perfModuleName) { + let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT"); +-- +2.23.0 + diff --git a/SPECS/gnome-shell.spec b/SPECS/gnome-shell.spec new file mode 100644 index 0000000..ee37be1 --- /dev/null +++ b/SPECS/gnome-shell.spec @@ -0,0 +1,1295 @@ +Name: gnome-shell +Version: 3.32.2 +Release: 14%{?dist} +Summary: Window management and application launching for GNOME + +Group: User Interface/Desktops +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.32/%{name}-%{version}.tar.xz + +# Replace Epiphany with Firefox in the default favourite apps list +Patch1: gnome-shell-favourite-apps-firefox.patch +Patch2: gnome-shell-favourite-apps-yelp.patch +Patch3: gnome-shell-favourite-apps-terminal.patch + +# GDM/Lock stuff +Patch12: 0001-screenShield-unblank-when-inserting-smartcard.patch +Patch13: enforce-smartcard-at-unlock.patch +Patch14: disable-unlock-entry-until-question.patch +Patch15: allow-timed-login-with-no-user-list.patch +Patch16: 0001-data-install-process-working.svg-to-filesystem.patch +Patch17: 0001-loginDialog-make-info-messages-themed.patch +Patch18: 0001-gdm-add-AuthList-control.patch +Patch19: 0002-gdmUtil-enable-support-for-GDM-s-ChoiceList-PAM-exte.patch + +# Misc. +Patch30: 0001-shellDBus-Add-a-DBus-method-to-load-a-single-extensi.patch +Patch31: 0001-extensions-Add-a-SESSION_MODE-extension-type.patch +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 +Patch38: 0001-appDisplay-Show-full-app-name-on-hover.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 +Patch43: fix-app-view-leaks.patch +Patch44: root-warning.patch +Patch45: 0001-workspace-Pass-device-to-startDrag.patch +Patch46: 0001-a11y-Change-HC-icon-theme-first.patch +Patch47: perf-tool-wayland.patch +Patch48: 0001-padOsd-Re-query-action-labels-after-mode-switches.patch +Patch49: 0001-Do-not-change-Wacom-LEDs-through-g-s-d.patch + +# Backport JS invalid access warnings (#1651894, #1663171, #1642482, #1637622) +Patch54: fix-invalid-access-warnings.patch + +# suspend/resume fix on nvidia (#1663440) +Patch10001: 0001-background-refresh-after-suspend-on-wayland.patch +Patch10002: 0002-background-rebuild-background-not-just-animation-on-.patch +Patch10003: 0003-st-texture-cache-purge-on-resume.patch +Patch10004: 0004-background-refresh-background-on-gl-video-memory-pur.patch + +%define libcroco_version 0.6.8 +%define eds_version 3.17.2 +%define gnome_desktop_version 3.7.90 +%define glib2_version 2.56.0 +%define gobject_introspection_version 1.49.1 +%define gjs_version 1.54.0 +%define gtk3_version 3.15.0 +%define mutter_version 3.32 +%define polkit_version 0.100 +%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: 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: mesa-libGL-devel +BuildRequires: mesa-libEGL-devel +BuildRequires: NetworkManager-libnm-devel +BuildRequires: polkit-devel >= %{polkit_version} +BuildRequires: startup-notification-devel +# for theme generation +BuildRequires: sassc +# for screencast recorder functionality +BuildRequires: gstreamer1-devel >= %{gstreamer_version} +BuildRequires: gtk3-devel >= %{gtk3_version} +BuildRequires: gettext >= 0.19.6 +BuildRequires: libcanberra-devel +BuildRequires: libcroco-devel >= %{libcroco_version} +BuildRequires: pkgconfig(libsystemd) +BuildRequires: python3 + +# for barriers +BuildRequires: libXfixes-devel >= 5.0 +# used in unused BigThemeImage +BuildRequires: librsvg2-devel +BuildRequires: mutter-devel >= %{mutter_version} +BuildRequires: pulseaudio-libs-devel +%ifnarch s390 s390x ppc ppc64 ppc64p7 +BuildRequires: gnome-bluetooth-libs-devel >= %{gnome_bluetooth_version} +%endif +#BuildRequires: control-center +# Bootstrap requirements +BuildRequires: gtk-doc +%ifnarch s390 s390x +Requires: gnome-bluetooth%{?_isa} >= %{gnome_bluetooth_version} +%endif +Requires: gnome-desktop3%{?_isa} >= %{gnome_desktop_version} +%if 0%{?rhel} != 7 +# Disabled on RHEL 7 to allow logging into KDE session by default +Requires: gnome-session-xsession +%endif +# wrapper script uses to restart old GNOME session if run --replace +# from the command line +Requires: gobject-introspection%{?_isa} >= %{gobject_introspection_version} +Requires: gjs%{?_isa} >= %{gjs_version} +Requires: gtk3%{?_isa} >= %{gtk3_version} +Requires: libnma%{?_isa} +# needed for loading SVG's via gdk-pixbuf +Requires: librsvg2%{?_isa} +Requires: mutter%{?_isa} >= %{mutter_version} +Requires: upower%{?_isa} +Requires: polkit%{?_isa} >= %{polkit_version} +Requires: gnome-desktop3%{?_isa} >= %{gnome_desktop_version} +Requires: glib2%{?_isa} >= %{glib2_version} +Requires: gsettings-desktop-schemas%{?_isa} >= %{gsettings_desktop_schemas_version} +Requires: libcroco%{?_isa} >= %{libcroco_version} +Requires: gstreamer1%{?_isa} >= %{gstreamer_version} +# needed for schemas +Requires: at-spi2-atk%{?_isa} +# needed for on-screen keyboard +Requires: ibus%{?_isa} >= %{ibus_version} +# needed for the user menu +Requires: accountsservice-libs%{?_isa} +Requires: gdm-libs%{?_isa} +# needed for settings items in menus +Requires: control-center +# needed by some utilities +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, +like switching to windows and launching applications. GNOME Shell takes +advantage of the capabilities of modern graphics hardware and introduces +innovative user interface concepts to provide a visually attractive and +easy to use experience. + +%prep +%autosetup -S git + +%build +%meson +%meson_build + +%install +%meson_install + +# Create empty directories where other packages can drop extensions +mkdir -p %{buildroot}%{_datadir}/gnome-shell/extensions +mkdir -p %{buildroot}%{_datadir}/gnome-shell/search-providers + +%find_lang %{name} + +%check +desktop-file-validate %{buildroot}%{_datadir}/applications/org.gnome.Shell.desktop +desktop-file-validate %{buildroot}%{_datadir}/applications/gnome-shell-extension-prefs.desktop +desktop-file-validate %{buildroot}%{_datadir}/applications/evolution-calendar.desktop + +%files -f %{name}.lang +%license COPYING +%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 +%{_datadir}/applications/org.gnome.Shell.PortalHelper.desktop +%{_datadir}/gnome-control-center/keybindings/50-gnome-shell-system.xml +%{_datadir}/gnome-shell/ +%{_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 +%{_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/ +%{_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 +%dir %{_datadir}/GConf/gsettings +%{_datadir}/GConf/gsettings/gnome-shell-overrides.convert +%{_mandir}/man1/%{name}.1.gz + +%changelog +* Wed Mar 04 2020 Carlos Garnacho - 3.32.2-14 +- Do not set Wacom LEDs through gnome-settings-daemon, rely on kernel driver + Resolves: #1687979 + +* Mon Dec 16 2019 Carlos Garnacho - 3.32.2-13 +- Update pad OSD on mode switching + Resolves: #1716774 + +* Fri Dec 13 2019 Carlos Garnacho - 3.32.2-12 +- Fix window dragging with tablets in the overview + Resolves: #1716767 +- Fix high-contrast/symbolic race + Resolves: #1730612 +- Make perf-tool usable on wayland + Resolves: #1652178 + +* Mon Dec 02 2019 Florian Müllner - 3.32.2-11 +- Warn when logging in as root + Resolves: #1746327 + +* Wed Nov 27 2019 Florian Müllner - 3.32.2-10 +- Fix leaks in app picker + Related: #1719819 + +* 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) + +* Mon Feb 11 2019 Florian Müllner - 3.28.3-9 +- Fix JS "invalid access" warnings (#1642482, #1637622) +- Fix new input sources only working after re-login (#1628154) +- Backport IM support fixes (#1668979) + +* Fri Feb 08 2019 Florian Müllner - 3.28.3-8 +- Re-add dropped downstream patches (rhbz#1668884) + +* Tue Feb 05 2019 Jonas Ådahl - 3.28.3-7 +- Backport dnd crash fix (#1663171) + +* Thu Jan 31 2019 Ray Strode - 3.28.3-6 +- Fix suspend and resume corruption on NVidia + Resolves: #1663440 + +* Wed Jan 16 2019 Jonas Ådahl - 3.28.3-5 +- Backport dnd fix (#1651894) + +* Fri Jan 11 2019 Olivier Fourdan - 3.28.3-4 +- Backport Introspection D-BUS API (rhbz#1658967) + +* Tue Sep 18 2018 David King - 3.28.3-3 +- Improve Python 3 dependency (#1630148) + +* Fri Aug 10 2018 Jonas Ådahl - 3.28.3-2 +- Backport remote access control UI (rhbz#1613749) + +* Fri Aug 10 2018 Kalev Lember - 3.28.3-1 +- Update to 3.28.3 + +* Mon Aug 06 2018 Charalampos Stratakis - 3.28.1-6 +- Remove telepathy-logger and telepathy-glib runtime dependencies + +* Wed Aug 01 2018 Stef Walter - 3.28.1-5 +- Remove unneeded libgnome-keyring dependency (#1589078) + +* Wed Aug 01 2018 Charalampos Stratakis - 3.28.1-4 +- BuildRequire python3-devel + +* Sun Apr 29 2018 Adam Williamson - 3.28.1-3 +- Backport fix for password entry modifier key issues (#1569211) + +* Tue Apr 24 2018 Ray Strode - 3.28.1-2 +- pull polkit cancel lock up from upstream + Resolves: #1568213 + +* Fri Apr 13 2018 Florian Müllner - 3.28.1-1 +- Update to 3.28.1 + +* Mon Mar 12 2018 Florian Müllner - 3.28.0-1 +- Update to 3.28.0 + +* Mon Mar 05 2018 Florian Müllner - 3.27.92-1 +- Update to 3.27.92 + +* Thu Feb 22 2018 Lubomir Rintel - 3.27.91-2 +- Replace libnm-gtk with libnma + +* Wed Feb 21 2018 Florian Müllner - 3.27.91-1 +- Update to 3.27.91 + +* Wed Feb 07 2018 Kalev Lember - 3.27.1-5 +- Rebuilt for evolution-data-server soname bump + +* Mon Jan 22 2018 Adam Williamson - 3.27.1-4 +- Backport fix for crasher bug BGO #788931 (#1469129) + +* Tue Dec 19 2017 Kalev Lember - 3.27.1-3 +- Explicitly require libnm-gtk (#1509496) + +* Wed Nov 08 2017 Milan Crha - 3.27.1-2 +- Rebuild for newer libical + +* Tue Oct 17 2017 Florian Müllner - 3.27.1-1 +- Update to 3.27.1 + +* Wed Oct 04 2017 Florian Müllner - 3.26.1-1 +- Update to 3.26.1 + +* Thu Sep 21 2017 Florian Müllner - 3.26.0-2 +- Fix crash on fast status icon remapping + +* Tue Sep 12 2017 Florian Müllner - 3.26.0-1 +- Update to 3.26.0 + +* Tue Aug 22 2017 Florian Müllner - 3.25.91-1 +- Update to 3.25.91 + +* Fri Aug 11 2017 Kevin Fenzi - 3.25.90-2 +- Rebuild with older working rpm + +* Thu Aug 10 2017 Florian Müllner - 3.25.90-1 +- Update to 3.25.90 + +* Wed Aug 02 2017 Fedora Release Engineering - 3.25.4-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 3.25.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Thu Jul 20 2017 Florian Müllner - 3.25.4-1 +- Update to 3.25.4 + +* Wed Jun 21 2017 Florian Müllner - 3.25.3-1 +- Update to 3.25.3 + +* Thu May 25 2017 Florian Müllner - 3.25.2-1 +- Update to 3.25.2 + +* Thu Apr 27 2017 Florian Müllner - 3.25.1-1 +- Update to 3.25.1 + +* Tue Apr 11 2017 Florian Müllner - 3.24.1-1 +- Update to 3.24.1 + +* Mon Mar 20 2017 Florian Müllner - 3.24.0-1 +- Update to 3.24.0 + +* Thu Mar 16 2017 Igor Gnatenko - 3.23.92-2 +- Fix wrong runtime requirements + +* Tue Mar 14 2017 Florian Müllner - 3.23.92-1 +- Update to 3.23.92 + +* Wed Mar 01 2017 Florian Müllner - 3.23.91-1 +- Update to 3.23.91 + +* Thu Feb 16 2017 Florian Müllner - 3.23.90-1 +- Update to 3.23.90 + +* Tue Feb 14 2017 Richard Hughes - 3.23.3-1 +- Update to 3.23.3 + +* Fri Feb 10 2017 Fedora Release Engineering - 3.23.2-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Mon Dec 19 2016 Miro Hrončok - 3.23.2-3 +- Rebuild for Python 3.6 + +* Tue Dec 6 2016 Rui Matos - 3.23.2-2 +- Tighten mutter version dependency for plugin API changes + Resolves: #1401886 + +* Wed Nov 23 2016 Florian Müllner - 3.23.2-1 +- Update to 3.23.2 + +* Sun Oct 30 2016 Florian Müllner - 3.23.1-1 +- Update to 3.23.1 + +* Fri Oct 21 2016 Bastien Nocera - 3.22.1-2 +- Add patches to allow launching on discrete GPU when available + +* Tue Oct 11 2016 Florian Müllner - 3.22.1 +- Update to 3.22.1 + +* Mon Sep 19 2016 Florian Müllner - 3.22.0 +- Update to 3.22.0 + +* Tue Sep 13 2016 Florian Müllner - 3.21.92 +- Update to 3.21.92 + +* Fri Sep 09 2016 Kalev Lember - 3.21.91-2 +- Drop libgsystem dependency + +* Tue Aug 30 2016 Florian Müllner - 3.21.91 +- Update to 3.21.91 + +* Sat Aug 20 2016 Florian Müllner - 3.21.90.1-1 +- Update to 3.21.90.1 + (Fixes a corrupt .desktop file that made it from the build directory into + the 3.21.90 tarball) + +* Fri Aug 19 2016 Florian Müllner - 3.21.90-1 +- Update to 3.21.90 + +* Wed Jul 20 2016 Florian Müllner - 3.21.4-1 +- Update to 3.21.4 + +* Mon Jul 18 2016 Milan Crha - 3.21.3-2 +- Rebuild for newer evolution-data-server + +* Tue Jun 21 2016 Florian Müllner - 3.21.3-1 +- Update to 3.21.3 + +* Tue Jun 21 2016 Milan Crha - 3.21.2-2 +- Rebuild for newer evolution-data-server + +* Thu May 26 2016 Florian Müllner - 3.21.2-1 +- Update to 3.21.2 + +* Fri Apr 29 2016 Florian Müllner - 3.21.1-1 +- Update to 3.21.1 + +* Fri Apr 15 2016 David Tardon - 3.20.1-2 +- rebuild for ICU 57.1 + +* Wed Apr 13 2016 Florian Müllner - 3.20.1-1 +- Update to 3.20.1 + +* Tue Mar 22 2016 Florian Müllner - 3.20.0-1 +- Update to 3.20.0 + +* Wed Mar 16 2016 Florian Müllner - 3.19.92-1 +- Update to 3.19.92 + +* Thu Mar 03 2016 Florian Müllner - 3.19.91-1 +- Update to 3.19.91 + +* Fri Feb 19 2016 Florian Müllner - 3.19.90-1 +- Update to 3.19.90 + +* Tue Feb 16 2016 Milan Crha - 3.19.4-3 +- Rebuild for newer evolution-data-server + +* Wed Feb 03 2016 Fedora Release Engineering - 3.19.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Thu Jan 21 2016 Florian Müllner - 3.19.4-1 +- Update to 3.19.4 + +* Mon Jan 18 2016 David Tardon - 3.19.3-2 +- rebuild for libical 2.0.0 + +* Thu Dec 17 2015 Florian Müllner - 3.19.3-1 +- Update to 3.19.3 + +* Tue Dec 01 2015 Kalev Lember - 3.19.2-2 +- Bump gsettings-desktop-schemas dep to 3.19.2 + +* Wed Nov 25 2015 Florian Müllner - 3.19.2-1 +- Update to 3.19.2 + +* Tue Nov 10 2015 Ray Strode 3.19.1-3.20151110 +- Update to git snapshot + +* Sun Nov 01 2015 Kalev Lember - 3.19.1-2 +- Fix gnome-shell crashing in gdm mode (#1276833) + +* Thu Oct 29 2015 Florian Müllner - 3.19.1-1 +- Update to 3.19.1 + +* Thu Oct 15 2015 Florian Müllner - 3.18.1-1 +- Update to 3.18.1 + +* Mon Sep 21 2015 Florian Müllner - 3.18.0-1 +- Update to 3.18.0 + +* Wed Sep 16 2015 Florian Müllner - 3.17.92-1 +- Update to 3.17.92 + +* Thu Sep 03 2015 Florian Müllner - 3.17.91-1 +- Update to 3.17.91 + +* Thu Aug 20 2015 Florian Müllner - 3.17.90-1 +- Update to 3.17.90 + +* Wed Aug 19 2015 Kalev Lember - 3.17.4-2 +- Create empty directories for extensions and search providers +- Move desktop file validation to %%check section +- Use make_install macro + +* Thu Jul 23 2015 Florian Müllner - 3.17.4-1 +- Update to 3.17.4 + +* Wed Jul 22 2015 Milan Crha - 3.17.3-3 +- Rebuild for newer evolution-data-server + +* Sat Jul 04 2015 Kalev Lember - 3.17.3-2 +- Require gobject-introspection 1.45.3 + +* Thu Jul 02 2015 Florian Müllner - 3.17.3-1 +- Update to 3.17.3 + +* Wed Jun 17 2015 Fedora Release Engineering - 3.17.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Wed May 27 2015 Florian Müllner - 3.17.2-1 +- Update to 3.17.2 + +* Thu Apr 30 2015 Florian Müllner - 3.17.1-1 +- Update to 3.17.1 + +* Tue Apr 28 2015 Milan Crha - 3.16.1-2 +- Rebuild for newer evolution-data-server + +* Tue Apr 14 2015 Florian Müllner - 3.16.1-1 +- Update to 3.16.1 + +* Mon Mar 23 2015 Florian Müllner - 3.16.0-1 +- Update to 3.16.0 + +* Tue Mar 17 2015 Kalev Lember - 3.15.92-2 +- Update minimum dep versions +- Use license macro for the COPYING file + +* Tue Mar 17 2015 Florian Müllner - 3.15.92-1 +- Update to 3.15.92 + +* Tue Mar 17 2015 Ray Strode 3.15.91-2 +- Drop dep on NetworkManager-config-connectivity-fedora + It's already required by fedora-release-workstation + +* Wed Mar 04 2015 Florian Müllner - 3.15.91-1 +- Update to 3.15.91 + +* Fri Feb 20 2015 Florian Müllner - 3.15.90-1 +- Update to 3.15.90 + +* Tue Feb 17 2015 Milan Crha - 3.15.4-2 +- Rebuild against newer evolution-data-server + +* Wed Jan 21 2015 Florian Müllner - 3.15.4-1 +- Update to 3.15.4 + +* Fri Dec 19 2014 Florian Müllner - 3.15.3-1 +- Update to 3.15.3 + +* Thu Nov 27 2014 Florian Müllner - 3.15.2-1 +- Update to 3.15.2 + +* Thu Oct 30 2014 Florian Müllner - 3.15.1-1 +- Update to 3.15.1 + +* Tue Oct 14 2014 Florian Müllner - 3.14.1-1 +- Update to 3.14.1 + +* Tue Sep 23 2014 Kalev Lember - 3.14.0-2 +- Drop unused gnome-menus dependency + +* Mon Sep 22 2014 Florian Müllner - 3.14.0-1 +- Update to 3.14.0 + +* Wed Sep 17 2014 Florian Müllner - 3.13.92-1 +- Update to 3.13.92 + +* Wed Sep 03 2014 Florian Müllner - 3.13.91-1 +- Update to 3.13.91 + +* Wed Aug 20 2014 Florian Müllner - 3.13.90-1 +- Update to 3.13.90 + +* Sat Aug 16 2014 Fedora Release Engineering - 3.13.4-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Thu Jul 31 2014 Milan Crha - 3.13.4-3 +- Rebuild against newer evolution-data-server + +* Mon Jul 28 2014 Adel Gadllah - 3.13.4-2 +- Require NetworkManager-config-connectivity-fedora + +* Wed Jul 23 2014 Florian Müllner - 3.13.4-1 +- Update to 3.13.4 + +* Tue Jul 22 2014 Kalev Lember - 3.13.3-2 +- Rebuilt for gobject-introspection 1.41.4 + +* Fri Jun 27 2014 Florian Müllner - 3.13.3-1 +- New gobject-introspection has been built, drop the last patch again + +* Wed Jun 25 2014 Florian Müllner - 3.13.3-1 +- Revert annotation updates until we get a new gobject-introspection build + +* Wed Jun 25 2014 Florian Müllner - 3.13.3-1 +- Update to 3.13.3 + +* Sat Jun 07 2014 Fedora Release Engineering - 3.13.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Tue May 27 2014 Florian Müllner - 3.13.2-1 +- Update to 3.13.2 + +* Thu May 01 2014 Kalev Lember - 3.13.1-2 +- Pull in libgsystem + +* Wed Apr 30 2014 Florian Müllner - 3.13.1-1 +- Update to 3.13.1 + +* Tue Apr 15 2014 Florian Müllner - 3.12.1-1 +- Update to 3.12.1 + +* Sat Apr 05 2014 Kalev Lember - 3.12.0-2 +- Update dep versions + +* Tue Mar 25 2014 Florian Müllner - 3.12.0-1 +- Update to 3.12.0 + +* Wed Mar 19 2014 Florian Müllner - 3.11.92-1 +- Update to 3.11.92 + +* Wed Mar 12 2014 Adam Williamson - 3.11.91-2 +- update to final revision of background bug fix from upstream (BGO #722149) + +* Thu Mar 06 2014 Florian Müllner - 3.11.91-1 +- Update to 3.11.91 + +* Mon Mar 03 2014 Adam Williamson - 3.11.90-5 +- backport fixes to fix drag-and-drop workspace creation (BGO #724686) + +* Wed Feb 26 2014 Adam Williamson - 3.11.90-4 +- backport a couple of bugfixes from BGO for things that annoy me + +* Sat Feb 22 2014 Florian Müllner - 3.11.90-3 +- Add dependency on gnome-control-center - several panels are referenced + by a number of menu items + +* Thu Feb 20 2014 Kalev Lember - 3.11.90-2 +- Rebuilt for cogl soname bump + +* Thu Feb 20 2014 Florian Müllner - 3.11.90-1 +- Update to 3.11.90 + +* Mon Feb 10 2014 Peter Hutterer - 3.11.5-3 +- Rebuild for libevdev soname bump + +* Wed Feb 05 2014 Adam Williamson - 3.11.5-2 +- build against new gjs (and hence mozjs24) + +* Wed Feb 05 2014 Richard Hughes - 3.11.5-1 +- Update to 3.11.5 + +* Mon Feb 03 2014 Milan Crha - 3.11.4-2 +- Rebuild against newer evolution-data-server + +* Thu Jan 16 2014 Florian Müllner - 3.11.4-1 +- Update to 3.11.4 + +* Tue Jan 14 2014 Milan Crha - 3.11.3-2 +- Rebuild against newer evolution-data-server + +* Fri Dec 20 2013 Florian Müllner - 3.11.3-1 +- Update to 3.11.3 + +* Thu Nov 21 2013 Milan Crha - 3.11.2-3 +- Rebuild for new libical (RH bug #1023020) + +* Tue Nov 19 2013 Milan Crha - 3.11.2-2 +- Rebuild against newer evolution-data-server + +* Wed Nov 13 2013 Florian Müllner - 3.11.2-1 +- Update to 3.11.2 + +* Wed Oct 30 2013 Florian Müllner - 3.11.1-1 +- Update to 3.11.1 + +* Fri Oct 25 2013 Florian Müllner - 3.10.1-2 +- Rebuild for new e-d-s + +* Tue Oct 15 2013 Florian Müllner - 3.10.1-1 +- Update to 3.10.1 + +* Wed Sep 25 2013 Kalev Lember - 3.10.0.1-1 +- Update to 3.10.0.1 + +* Tue Sep 24 2013 Florian Müllner - 3.10.0-1 +- Update to 3.10.0 + +* Wed Sep 18 2013 Matthias Clasen - 3.9.92-3 +- Build against mutter-wayland + +* Tue Sep 17 2013 Florian Müllner - 3.9.92-1 +- Update to 3.9.92 + +* Tue Sep 03 2013 Florian Müllner - 3.9.91-1 +- Update to 3.9.91 + +* Thu Aug 22 2013 Florian Müllner - 3.9.90-1 +- Update to 3.9.90 + +* Mon Aug 19 2013 Adam Williamson - 3.9.5-3 +- Rebuild for new e-d-s + +* Sat Aug 10 2013 Kalev Lember - 3.9.5-2 +- Drop the bluez revert patch as we now have new enough gnome-bluetooth + +* Tue Jul 30 2013 Florian Müllner - 3.9.5 +- Update to 3.9.5 + +* Mon Jul 29 2013 Adam Williamson - 3.9.4-2 +- rebuild against updated evolution-data-server + +* Wed Jul 10 2013 Florian Müllner - 3.9.4-1 +- Update to 3.9.4 + +* Wed Jul 10 2013 Milan Crha - 3.9.3-3 +- Rebuild against newer evolution-data-server + +* Wed Jul 10 2013 Kalev Lember - 3.9.3-2 +- Add a downstream patch to revert back to bluez 4 + +* Tue Jun 18 2013 Florian Müllner - 3.9.3-1 +- Update to 3.9.3 + +* Tue May 28 2013 Florian Müllner - 3.9.2-1 +- Update to 3.9.2 + +* Sat May 25 2013 Rex Dieter 3.9.1-3 +- rebuild (libical) + +* Wed May 01 2013 Kalev Lember - 3.9.1-2 +- Add missing telepathy-logger runtime dep +- Depend on gnome-session-xsession so that it gets pulled in for + typical GNOME installs + +* Wed May 01 2013 Florian Müllner - 3.9.1-1 +- Update to 3.9.1 + +* Tue Apr 16 2013 Florian Müllner - 3.8.1-1 +- Update to 3.8.1 + +* Thu Mar 28 2013 Adel Gadllah - 3.8.0.1-2 +- Ship the perf tool + +* Wed Mar 27 2013 Ray Strode - 3.8.0.1-1 +- Update to 3.8.0.1 + +* Tue Mar 26 2013 Florian Müllner - 3.8.0-1 +- Update to 3.8.0 + +* Tue Mar 19 2013 Florian Müllner - 3.7.92-1 +- Update to 3.7.92 + +* Tue Mar 05 2013 Florian Müllner - 3.7.91-1 +- Update to 3.7.91 + +* Wed Feb 20 2013 Florian Müllner - 3.7.90-1 +- Update to 3.7.90 + +* Wed Feb 06 2013 Kalev Lember - 3.7.5-2 +- Rebuilt for libgcr soname bump + +* Wed Feb 06 2013 Florian Müllner - 3.7.5-1 +- Update to 3.7.5 + +* Fri Jan 25 2013 Peter Robinson 3.7.4.1-2 +- Rebuild for new cogl + +* Thu Jan 17 2013 Florian Müllner - 3.7.4.1-1 +- Update to 3.7.4.1 + +* Tue Jan 15 2013 Florian Müllner - 3.7.4-1 +- Update to 3.7.4 + +* Wed Jan 09 2013 Richard Hughes - 3.7.3.1-1 +- Update to 3.7.3.1 + +* Tue Dec 18 2012 Florian Müllner 3.7.3-1 +- Update to 3.7.3 + +* Mon Dec 17 2012 Adam Jackson 3.7.2-3 +- Also don't mangle rpath on power + +* Mon Dec 10 2012 Adam Jackson 3.7.2-2 +- Disable bluetooth on power + +* Mon Nov 19 2012 Florian Müllner - 3.7.2-1 +- Update to 3.7.2 + +* Tue Nov 13 2012 Dan Horák - 3.7.1-2 +- don't Require: gnome-bluetooth on s390(x) + +* Fri Nov 09 2012 Kalev Lember - 3.7.1-1 +- Update to 3.7.1 + +* Wed Oct 31 2012 Brian Pepple - 3.6.1-5 +- Rebuild against latest telepathy-logger + +* Thu Oct 25 2012 Milan Crha - 3.6.1-4 +- Rebuild against newer evolution-data-server + +* Sat Oct 20 2012 Dan Horák - 3.6.1-3 +- explicit BR: control-center as it isn't brought in indirectly on s390(x) + +* Thu Oct 18 2012 Florian Müllner - 3.6.1-2 +- Remove avoid-redhat-menus patch + + The standard way of supporting a desktop-specific menu layout is + to set XDG_MENU_PREFIX (which we made gnome-session do now). + +* Mon Oct 15 2012 Florian Müllner - 3.6.1-1 +- Update to 3.6.1 + +* Tue Sep 25 2012 Florian Müllner - 3.6.0-1 +- Update to 3.6.0 + +* Wed Sep 19 2012 Florian Müllner - 3.5.92-1 +- Update to 3.5.92 + +* Tue Sep 11 2012 Florian Müllner - 3.5.91-1 +- Update dependencies + +* Tue Sep 04 2012 Richard Hughes - 3.5.91-1 +- Update to 3.5.91 + +* Tue Aug 28 2012 Matthias Clasen - 3.5.90-3 +- Rebuild against new cogl/clutter + +* Mon Aug 27 2012 Debarshi Ray - 3.5.90-2 +- Rebuild for new libcamel and synchronize gnome-bluetooth Requires with + BuildRequires. + +* Wed Aug 22 2012 Richard Hughes - 3.5.90-1 +- Update to 3.5.90 + +* Tue Aug 14 2012 Debarshi Ray - 3.5.5-2 +- Add Requires: gnome-bluetooth >= 3.5.5 + +* Mon Aug 13 2012 Debarshi Ray - 3.5.5-1 +- Update to 3.5.5 + +* Fri Jul 27 2012 Fedora Release Engineering - 3.5.4-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Sat Jul 21 2012 Kalev Lember - 3.5.4-4 +- Tighten runtime requires + +* Thu Jul 19 2012 Matthias Clasen - 3.5.4-3 +- Add a gdm-libs dependency + +* Wed Jul 18 2012 Colin Walters - 3.5.4-2 +- Bump release + +* Wed Jul 18 2012 Ray Strode 3.5.4-1 +- Update to 3.5.4 + +* Tue Jun 26 2012 Matthias Clasen - 3.5.3-2 +- Rebuild against new e-d-s + +* Tue Jun 26 2012 Matthias Clasen - 3.5.3-1 +- Update to 3.5.3 + +* Thu Jun 07 2012 Richard Hughes - 3.5.2-2 +- Remove upstreamed patch + +* Thu Jun 07 2012 Richard Hughes - 3.5.2-1 +- Update to 3.5.2 + +* Mon May 28 2012 Peter Robinson - 3.4.1-6 +- Cherry pick F17 changes, bump build for new evo soname + +* Wed May 16 2012 Owen Taylor - 3.4.1-5 +- New version of unmount notification + +* Tue May 15 2012 Owen Taylor - 3.4.1-4 +- Add a patch to display a notification until it's safe to remove a drive (#819492) + +* Fri Apr 20 2012 Owen Taylor - 3.4.1-3 +- Add a patch from upstream to avoid a crash when Evolution is not installed (#814401) + +* Wed Apr 18 2012 Kalev Lember - 3.4.1-2 +- Silence glib-compile-schemas scriplets + +* Wed Apr 18 2012 Kalev Lember - 3.4.1-1 +- Update to 3.4.1 + +* Thu Apr 5 2012 Owen Taylor - 3.4.0-2 +- Change gnome-shell-favourite-apps-firefox.patch to also patch the JS code + to handle the transition from mozilla-firefox.desktop to firefox.desktop. + (#808894, reported by Jonathan Kamens) + +* Tue Mar 27 2012 Richard Hughes - 3.4.0-1 +- Update to 3.4.0 + +* Wed Mar 21 2012 Matthias Clasen - 3.3.92-1 +- Update to 3.3.92 + +* Sat Mar 10 2012 Matthias Clasen - 3.3.90-2 +- Rebuild for new cogl + +* Sat Feb 25 2012 Matthias Clasen - 3.3.90-1 +- Update to 3.3.90 + +* Thu Feb 9 2012 Matthias Clasen - 3.3.5-2 +- Depend on accountsservice-libs (#755112) + +* Tue Feb 7 2012 Matthias Clasen - 3.3.5-1 +- Update to 3.3.5 + +* Fri Jan 20 2012 Matthias Clasen - 3.3.4-1 +- Update to 3.3.4 + +* Thu Jan 19 2012 Matthias Clasen - 3.3.3-2 +- Rebuild for new cogl + +* Thu Jan 5 2012 Matthias Clasen - 3.3.3-1 +- Update to 3.3.3 + +* Sun Nov 27 2011 Peter Robinson - 3.3.2-2 +- Rebuild for new clutter and e-d-s + +* Wed Nov 23 2011 Matthias Clasen - 3.3.2-1 +- Update to 3.3.2 + +* Wed Nov 09 2011 Kalev Lember - 3.2.1-6 +- Adapt to firefox desktop file name change in F17 + +* Thu Nov 03 2011 Adam Jackson 3.2.1-5 +- Build with -Wno-error=disabled-declarations for the moment + +* Wed Nov 02 2011 Brian Pepple - 3.2.1-4 +- Rebuld against tp-logger. + +* Sun Oct 30 2011 Bruno Wolff III - 3.2.1-3 +- Rebuild for new evolution-data-server + +* Wed Oct 26 2011 Fedora Release Engineering - 3.2.1-2 +- Rebuilt for glibc bug#747377 + +* Wed Oct 19 2011 Matthias Clasen - 3.2.1-1 +- Update to 3.2.1 + +* Wed Sep 28 2011 Ray Strode 3.2.0-2 +- rebuild + +* Mon Sep 26 2011 Owen Taylor - 3.2.0-1 +- Update to 3.2.0 + +* Tue Sep 20 2011 Matthias Clasen - 3.1.92-1 +- Update to 3.1.92 + +* Fri Sep 16 2011 Kalev Lember - 3.1.91.1-2 +- Tighten dependencies by specifying the required arch (#739130) + +* Wed Sep 14 2011 Owen Taylor - 3.1.91.1-1 +- Update to 3.1.91.1 (adds browser plugin) + Update Requires + +* Thu Sep 08 2011 Dan Horák - 3.1.91-3 +- workaround a chrpath issue on s390(x) + +* Wed Sep 07 2011 Kalev Lember - 3.1.91-2 +- Replace Epiphany with Firefox in the default favourite apps + +* Wed Sep 7 2011 Matthias Clasen - 3.1.91-1 +- Update to 3.1.91 + +* Thu Sep 1 2011 Matthias Clasen - 3.1.90.1-2 +- Require caribou + +* Wed Aug 31 2011 Matthias Clasen - 3.1.90.1-1 +- Update to 3.1.90.1 + +* Wed Aug 31 2011 Adam Williamson - 3.1.4-3.gite7b9933 +- rebuild against e-d-s + +* Fri Aug 19 2011 Matthias Clasen - 3.1.4-2.gite7b9933 +- git snapshot that builds against gnome-menus 3.1.5 + +* Thu Aug 18 2011 Matthew Barnes - 3.1.5-1 +- Rebuild against newer eds libraries. + +* Wed Jul 27 2011 Matthias Clasen - 3.1.4-1 +- Update to 3.1.4 + +* Wed Jul 27 2011 Matthias Clasen - 3.1.3-4 +- Rebuild + +* Tue Jul 26 2011 Matthias Clasen - 3.1.3-3 +- Add necessary requires + +* Mon Jul 25 2011 Matthias Clasen - 3.1.3-2 +- Rebuild + +* Tue Jul 5 2011 Peter Robinson - 3.1.3-1 +- Upstream 3.1.3 dev release + +* Mon Jun 27 2011 Adam Williamson - 3.0.2-4 +- add fixes from f15 branch (gjs dep and rpath) + +* Wed Jun 22 2011 Owen Taylor - 3.0.2-3 +- Add a patch from upstream to avoid g_file_get_contents() + +* Fri Jun 17 2011 Tomas Bzatek - 3.0.2-2 +- Rebuilt for new gtk3 and gnome-desktop3 + +* Wed May 25 2011 Owen Taylor - 3.0.2-1 +- Update to 3.0.2 + +* Tue May 10 2011 Dan Williams - 3.0.1-4 +- Fix initial connections to WPA Enterprise access points (#699014) +- Fix initial connections to mobile broadband networks + +* Thu Apr 28 2011 Dan Horák - 3.0.1-3 +- no bluetooth on s390(x) + +* Wed Apr 27 2011 Owen Taylor - 3.0.1-2 +- Add a patch from upstream to fix duplicate applications in application display + +* Mon Apr 25 2011 Owen Taylor - 3.0.1-1 +- Update to 3.0.1 + +* Mon Apr 11 2011 Colin Walters - 3.0.0.2-2 +- We want to use the GNOME menus which has the designed categories, + not the legacy redhat-menus. + +* Fri Apr 08 2011 Nils Philippsen - 3.0.0.2-1 +- Update to 3.0.0.2 (fixes missing import that was preventing extensions from + loading.) +- Update source URL + +* Tue Apr 5 2011 Owen Taylor - 3.0.0.1-1 +- Update to 3.0.0.1 (fixes bug where network menu could leave + Clutter event handling stuck.) + +* Mon Apr 4 2011 Owen Taylor - 3.0.0-1 +- Update to 3.0.0 + +* Tue Mar 29 2011 Brian Pepple - 2.91.93-3 +- Bump + +* Tue Mar 29 2011 Brian Pepple - 2.91.93-2 +- Rebuild for new tp-logger + +* Mon Mar 28 2011 Owen Taylor - 2.91.93-1 +- Update to 2.91.93. + +* Fri Mar 25 2011 Ray Strode 2.91.92-3 +- Adjustments for More nm-client api changes. +- Fix VPN indicator + +* Thu Mar 24 2011 Christopher Aillon - 2.91.92-2 +- Make activating vpn connections work from the shell indicator + +* Wed Mar 23 2011 Matthias Clasen - 2.91.92-1 +- Update to 2.91.92 + +* Wed Mar 16 2011 Michel Salim - 2.91.91-2 +- Fix alt-tab behavior on when primary display is not leftmost (# 683932) + +* Tue Mar 8 2011 Owen Taylor - 2.91.91-1 +- Update to 2.91.91 + +* Tue Feb 22 2011 Matthias Clasen - 2.91.90-2 +- Require upower and polkit at runtime + +* Tue Feb 22 2011 Matthias Clasen - 2.91.90-1 +- Update to 2.91.90 + +* Thu Feb 10 2011 Matthias Clasen - 2.91.6-6 +- Rebuild against newer gtk + +* Tue Feb 08 2011 Fedora Release Engineering - 2.91.6-5 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Thu Feb 3 2011 Bill Nottingham - 2.91.6-4 +- buildrequire gnome-bluetooth to fix bluetooth status icon (#674874) + +* Wed Feb 2 2011 Matthias Clasen - 2.91.6-3 +- Rebuild against newer gtk + +* Tue Feb 1 2011 Owen Taylor - 2.91.6-2 +- Build-requires evolution-data-server-devel + +* Tue Feb 1 2011 Owen Taylor - 2.91.6-1 +- Update to 2.91.6 + +* Thu Jan 13 2011 Mattihas Clasen - 2.91.5-3 +- Drop desktop-effects dependency + +* Wed Jan 12 2011 Colin Walters - 2.91.5-2 +- BR latest g-i, handles flags as arguments better + +* Tue Jan 11 2011 Matthias Clasen - 2.91.5-1 +- Update to 2.91.5 + +* Sat Jan 8 2011 Matthias Clasen - 2.91.4-1 +- Update to 2.91.4 +- Rebuild against new gtk + +* Fri Dec 3 2010 Matthias Clasen - 2.91.3-2 +- Rebuild aginst new gtk + +* Mon Nov 29 2010 Owen Taylor - 2.91.2-1 +- Update to 2.91.3 + +* Thu Nov 18 2010 Owen Taylor - 2.91.2-3 +- Add another memory-management crasher fix from upstream + +* Mon Nov 15 2010 Owen Taylor - 2.91.2-2 +- Add a patch from upstream fixing a memory-management crasher + +* Tue Nov 9 2010 Owen Taylor - 2.91.2-1 +- Update to 2.91.2 + +* Mon Nov 1 2010 Owen Taylor - 2.91.1-1 +- Update to 2.91.1 +- Add libcroco-devel to BuildRequires, apparently it was getting + pulled in indirectly before +- Add libcanberra-devel and pulseaudio-libs-devel BuildRequires + +* Mon Oct 4 2010 Owen Taylor - 2.91.0-1 +- Update to 2.91.0 +- Remove patch to disable VBlank syncing + +* Thu Aug 12 2010 Colin Walters - 2.31.5-7 +- Add patch to disable vblank syncing + +* Tue Jul 13 2010 Colin Walters - 2.31.5-5 +- Run glib-compile-schemas + +* Tue Jul 13 2010 Colin Walters - 2.31.5-4 +- Bless stuff in files section + +* Tue Jul 13 2010 Colin Walters - 2.31.5-3 +- Axe gnome-desktop-devel + +* Tue Jul 13 2010 Adel Gadllah - 2.31.5-2 +- BuildRequire gnome-desktop3-devel, gtk3 + +* Mon Jul 12 2010 Colin Walters - 2.31.5-1 +- New upstream version +- Drop rpath goop, shouldn't be necessary any more + +* Fri Jun 25 2010 Colin Walters - 2.31.2-3 +- Drop gir-repository-devel build dependency + +* Fri May 28 2010 Adam Miller - 2.31.2-2 +- Added new version requirements for dependencies based on upstream releases +- Added new file listings for gnome-shell-clock-preferences binary and .desktop +- Added gnome-shell man page file listing + +* Wed May 26 2010 Adam Miller - 2.31.2-1 +- New upstream release + +* Fri Mar 26 2010 Colin Walters - 2.29.1-3 +- Specify V=1 for build, readd smp_mflags since parallel is fixed upstream + +* Thu Mar 25 2010 Adam Miller - 2.29.1-2 +- Bumped for new version of mutter and clutter +- Added version requirement to gjs-devel because of dependency of build + +* Wed Mar 24 2010 Adam Miller - 2.29.1-1 +- Update to latest version 2.29.1 + +* Sun Feb 21 2010 Bastien Nocera 2.28.1-0.2.20100128git +- Require json-glib +- Rebuild for new clutter with json split out +- Fix deprecation in COGL + +* Thu Jan 28 2010 Adam Miller - 2.28.1-0.1.20100128git +- New git snapshot +- Fixed Version for alphatag use + +* Fri Jan 15 2010 Adam Miller - 2.28.0.20101015git-1 +- Added dependency on a git build of gobject-introspect to solve some breakage +- Also went ahead and made a new git tarball + +* Tue Jan 12 2010 Adam Miller - 2.28.0.20100112git-1 +- New git snapshot + +* Mon Dec 07 2009 Adam Miller - 2.28.0.20091206git-5 +- Added libtool, glib-gettext for the libtoolize dep of git snapshot + +* Mon Dec 07 2009 Adam Miller - 2.28.0.20091206git-4 +- Added gnome-common needed by autogen.sh in git snapshot build + +* Sun Dec 06 2009 Adam Miller - 2.28.0.20091206git-3 +- Added the autotools needed to build the git snapshot to the build requires + +* Sun Dec 06 2009 Adam Miller - 2.28.0.20091206git-2 +- Fixed the setup naming issue with the git snapshot directory naming + +* Sun Dec 06 2009 Adam Miller - 2.28.0.20091206git-1 +- Update to git snapshot on 20091206 + +* Wed Oct 7 2009 Owen Taylor - 2.28.0-2 +- Update to 2.28.0 + +* Tue Sep 15 2009 Owen Taylor - 2.27.3-1 +- Update to 2.27.3 + +* Fri Sep 4 2009 Owen Taylor - 2.27.2-2 +- Test for gobject-introspection version should be >= not > + +* Fri Sep 4 2009 Owen Taylor - 2.27.2-1 +- Update to 2.27.2 +- Add an explicit dep on gobject-introspection 0.6.5 which is required + for the new version + +* Sat Aug 29 2009 Owen Taylor - 2.27.1-4 +- Fix GConf %%preun script to properly be for package removal + +* Fri Aug 28 2009 Owen Taylor - 2.27.1-3 +- Replace libgnomeui with gnome-desktop in BuildRequires + +* Fri Aug 28 2009 Owen Taylor - 2.27.1-2 +- BuildRequire intltool +- Add find_lang + +* Fri Aug 28 2009 Owen Taylor - 2.27.1-1 +- Update to 2.27.1 +- Update Requires, add desktop-effects + +* Wed Aug 12 2009 Owen Taylor - 2.27.0-4 +- Add an explicit dependency on GConf2 for pre/post + +* Tue Aug 11 2009 Owen Taylor - 2.27.0-3 +- Add missing BuildRequires on gir-repository-devel + +* Tue Aug 11 2009 Owen Taylor - 2.27.0-2 +- Temporarily use a non-parallel-build until gnome-shell is fixed + +* Mon Aug 10 2009 Owen Taylor - 2.27.0-1 +- Initial version