Browse Source

gnome-shell package update

Signed-off-by: guibuilder_pel7x64builder0 <guibuilder@powerel.org>
master
guibuilder_pel7x64builder0 6 years ago
parent
commit
b91185d2ae
  1. 111
      SOURCES/0001-appDisplay-Show-full-app-name-on-hover.patch
  2. 120
      SOURCES/0001-data-install-process-working.svg-to-filesystem.patch
  3. 107
      SOURCES/0001-extensions-Add-a-SESSION_MODE-extension-type.patch
  4. 57
      SOURCES/0001-gdm-add-AuthList-control.patch
  5. 421
      SOURCES/0001-global-Allow-overriding-the-override-schema.patch
  6. 55
      SOURCES/0001-keyboard-Handle-no-window-case-in-FocusTracker.patch
  7. 67
      SOURCES/0001-keyboard-Listen-to-IbusPanelService-focus-in-out-to-.patch
  8. 63
      SOURCES/0001-loginDialog-make-info-messages-themed.patch
  9. 160
      SOURCES/0001-panel-add-an-icon-to-the-ActivitiesButton.patch
  10. 12
      SOURCES/0001-screenShield-unblank-when-inserting-smartcard.patch
  11. 4
      SOURCES/0001-shellDBus-Add-a-DBus-method-to-load-a-single-extensi.patch
  12. 22
      SOURCES/0001-system-don-t-throw-an-exception-if-power-off-disable.patch
  13. 16
      SOURCES/0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch
  14. 97
      SOURCES/0002-gdmUtil-enable-support-for-GDM-s-ChoiceList-PAM-exte.patch
  15. 139
      SOURCES/allow-timed-login-with-no-user-list.patch
  16. 87
      SOURCES/disable-unlock-entry-until-question.patch
  17. 30
      SOURCES/enforce-smartcard-at-unlock.patch
  18. 265
      SOURCES/gnome-shell-python3.patch
  19. 182
      SPECS/gnome-shell.spec

111
SOURCES/0001-appDisplay-Show-full-app-name-on-hover.patch

@ -0,0 +1,111 @@ @@ -0,0 +1,111 @@
From 2b643e95ed25fff907d46591dd7acd8ae86cf5e4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
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 f1aaea689..5bf01a540 100644
--- a/data/theme/gnome-shell-sass/_common.scss
+++ b/data/theme/gnome-shell-sass/_common.scss
@@ -1402,6 +1402,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 74c772d50..070057c69 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -1628,6 +1628,20 @@ var AppIcon = new Lang.Class({
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);
@@ -1659,12 +1673,39 @@ var AppIcon = new Lang.Class({
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);
@@ -1672,6 +1713,13 @@ var AppIcon = new Lang.Class({
}
},
+ _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.17.1

120
SOURCES/0001-data-install-process-working.svg-to-filesystem.patch

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
From fa1ec00431d9c0b1592e1b7c56784ef8d8c26a98 Mon Sep 17 00:00:00 2001
From 77663ec7d0391254ff6e5afb73257d075fcb109e Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Thu, 8 Jun 2017 12:04:31 -0400
Subject: [PATCH] data: install process-working.svg to filesystem
@ -6,23 +6,109 @@ Subject: [PATCH] data: install process-working.svg to filesystem @@ -6,23 +6,109 @@ Subject: [PATCH] data: install process-working.svg to filesystem
This helps prevent unlock failure on inplace upgrades between
7.3 and 7.4
---
data/Makefile.am | 3 +++
1 file changed, 3 insertions(+)
data/theme/meson.build | 2 ++
meson.build | 2 ++
2 files changed, 4 insertions(+)

diff --git a/data/Makefile.am b/data/Makefile.am
index 8c01e49d1..f9c198c1c 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -73,6 +73,9 @@ dist_theme_files = \
$(SASSC) -a $< $@; \
fi
+themedir = $(pkgdatadir)/theme
+dist_theme_DATA = theme/process-working.svg
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
@@ -1,25 +1,27 @@
theme_sources = files([
'gnome-shell-high-contrast.scss',
'gnome-shell.scss',
'gnome-shell-sass/_colors.scss',
'gnome-shell-sass/_common.scss',
'gnome-shell-sass/_drawing.scss',
'gnome-shell-sass/_high-contrast-colors.scss'
])
styles = [
'gnome-shell-high-contrast',
'gnome-shell'
]
theme_deps = []
foreach style: styles
theme_deps += custom_target('style-' + style,
input: '@0@.scss'.format(style),
output: '@0@.css'.format(style),
command: [
sassc, '-a', '@INPUT@', '@OUTPUT@'
],
depend_files: theme_sources)
endforeach
+
resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir)/theme --generate-dependencies $(srcdir)/gnome-shell-theme.gresource.xml)
gnome-shell-theme.gresource: gnome-shell-theme.gresource.xml $(resource_files)
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir)/theme $<
+install_data('process-working.svg', install_dir: themedir)
diff --git a/meson.build b/meson.build
index 663a4d06f..7d60d25e2 100644
--- a/meson.build
+++ b/meson.build
@@ -30,60 +30,62 @@ startup_req = '>= 0.11'
ibus_req = '>= 1.5.2'
bt_req = '>= 3.9.0'
gst_req = '>= 0.11.92'
nm_req = '>= 0.9.8'
secret_req = '>= 0.18'
gnome = import('gnome')
i18n = import('i18n')
prefix = get_option('prefix')
bindir = join_paths(prefix, get_option('bindir'))
datadir = join_paths(prefix, get_option('datadir'))
libdir = join_paths(prefix, get_option('libdir'))
libexecdir = join_paths(prefix, get_option('libexecdir'))
mandir = join_paths(prefix, get_option('mandir'))
pkgdatadir = join_paths(datadir, meson.project_name())
pkglibdir = join_paths(libdir, meson.project_name())
convertdir = join_paths(datadir, 'GConf', 'gsettings')
desktopdir = join_paths(datadir, 'applications')
ifacedir = join_paths(datadir, 'dbus-1', 'interfaces')
localedir = join_paths(datadir, 'locale')
mozplugindir = join_paths(libdir, 'mozilla', 'plugins')
portaldir = join_paths(datadir, 'xdg-desktop-portal', 'portals')
schemadir = join_paths(datadir, 'glib-2.0', 'schemas')
servicedir = join_paths(datadir, 'dbus-1', 'services')
+themedir = join_paths(pkgdatadir, 'theme')
+
plugindir = get_variable('BROWSER_PLUGIN_DIR', mozplugindir)
keybindings_dep = dependency('gnome-keybindings', required: false)
if keybindings_dep.found()
keysdir = keybindings_dep.get_pkgconfig_variable('keysdir')
else
keysdir = join_paths(datadir, 'gnome-control-center', 'keybindings')
endif
atk_bridge_dep = dependency('atk-bridge-2.0')
canberra_dep = dependency('libcanberra')
canberra_gtk_dep = dependency('libcanberra-gtk3')
ecal_dep = dependency('libecal-1.2', version: ecal_req)
eds_dep = dependency('libedataserver-1.2', version: eds_req)
gcr_dep = dependency('gcr-base-3', version: gcr_req)
gdk_x11_dep = dependency('gdk-x11-3.0')
gdk_pixbuf_dep = dependency('gdk-pixbuf-2.0')
gi_dep = dependency('gobject-introspection-1.0', version: gi_req)
gio_dep = dependency('gio-2.0', version: gio_req)
gio_unix_dep = dependency('gio-unix-2.0', version: gio_req)
gjs_dep = dependency('gjs-1.0', version: gjs_req)
gtk_dep = dependency('gtk+-3.0', version: gtk_req)
libxml_dep = dependency('libxml-2.0')
croco_dep = dependency('libcroco-0.6', version: croco_req)
clutter_dep = dependency(clutter_pc, version: mutter_req)
cogl_dep = dependency(cogl_pc, version: mutter_req)
cogl_pango_dep = dependency(cogl_pango_pc, version: mutter_req)
mutter_dep = dependency(libmutter_pc, version: mutter_req)
polkit_dep = dependency('polkit-agent-1', version: polkit_req)
soup_dep = dependency('libsoup-2.4')
--
2.14.2
2.17.1


107
SOURCES/0001-extensions-Add-a-SESSION_MODE-extension-type.patch

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
From 446b7a65536ea60b75f1ec705cd8fa287fda968e Mon Sep 17 00:00:00 2001
From 7002431540fb01c8ce6bd8781e35ba1072741d94 Mon Sep 17 00:00:00 2001
From: Rui Matos <tiagomatos@gmail.com>
Date: Fri, 8 Nov 2013 13:58:09 +0100
Subject: [PATCH] extensions: Add a SESSION_MODE extension type
@ -11,10 +11,22 @@ different way since they can't be disabled. @@ -11,10 +11,22 @@ different way since they can't be disabled.
2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/js/misc/extensionUtils.js b/js/misc/extensionUtils.js
index ca02582c9..3eea38565 100644
index 9f77b4c40..1e25da335 100644
--- a/js/misc/extensionUtils.js
+++ b/js/misc/extensionUtils.js
@@ -13,7 +13,8 @@ const FileUtils = imports.misc.fileUtils;
@@ -1,46 +1,47 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
// Common utils for the extension system and the extension
// preferences tool
const Lang = imports.lang;
const Signals = imports.signals;
const Gio = imports.gi.Gio;
const Config = imports.misc.config;
const FileUtils = imports.misc.fileUtils;
var ExtensionType = {
SYSTEM: 1,
@ -24,19 +36,100 @@ index ca02582c9..3eea38565 100644 @@ -24,19 +36,100 @@ index ca02582c9..3eea38565 100644
};
// Maps uuid -> metadata object
var extensions = {};
/**
* getCurrentExtension:
*
* Returns the current extension, or null if not called from an extension.
*/
function getCurrentExtension() {
let stack = (new Error()).stack.split('\n');
let extensionStackLine;
// Search for an occurrence of an extension stack frame
// Start at 1 because 0 is the stack frame of this function
for (let i = 1; i < stack.length; i++) {
if (stack[i].indexOf('/gnome-shell/extensions/') > -1) {
extensionStackLine = stack[i];
break;
}
}
if (!extensionStackLine)
return null;
// The stack line is like:
// init([object Object])@/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8
//
// In the case that we're importing from
// module scope, the first field is blank:
diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js
index 51ce234c2..c2a11b8a5 100644
index e35c01ab8..a013a3ee7 100644
--- a/js/ui/extensionSystem.js
+++ b/js/ui/extensionSystem.js
@@ -316,6 +316,8 @@ function _loadExtensions() {
@@ -289,60 +289,62 @@ function onEnabledExtensionsChanged() {
enabledExtensions = newEnabledExtensions;
}
function _onVersionValidationChanged() {
// we want to reload all extensions, but only enable
// extensions when allowed by the sessionMode, so
// temporarily disable them all
enabledExtensions = [];
for (let uuid in ExtensionUtils.extensions)
reloadExtension(ExtensionUtils.extensions[uuid]);
enabledExtensions = getEnabledExtensions();
if (Main.sessionMode.allowExtensions) {
enabledExtensions.forEach(uuid => {
enableExtension(uuid);
});
}
}
function _loadExtensions() {
global.settings.connect('changed::' + ENABLED_EXTENSIONS_KEY, onEnabledExtensionsChanged);
global.settings.connect('changed::' + DISABLE_USER_EXTENSIONS_KEY, onEnabledExtensionsChanged);
global.settings.connect('changed::' + EXTENSION_DISABLE_VERSION_CHECK_KEY, _onVersionValidationChanged);
enabledExtensions = getEnabledExtensions();
let finder = new ExtensionUtils.ExtensionFinder();
finder.connect('extension-found', function(finder, extension) {
finder.connect('extension-found', (finder, extension) => {
loadExtension(extension);
+ if (Main.sessionMode.enabledExtensions.indexOf(extension.uuid) != -1)
+ extension.type = ExtensionUtils.ExtensionType.SESSION_MODE;
});
finder.scanExtensions();
}
function enableAllExtensions() {
if (enabled)
return;
if (!initted) {
_loadExtensions();
initted = true;
} else {
enabledExtensions.forEach(uuid => {
enableExtension(uuid);
});
}
enabled = true;
}
function disableAllExtensions() {
if (!enabled)
return;
if (initted) {
extensionOrder.slice().reverse().forEach(uuid => {
disableExtension(uuid);
});
}
enabled = false;
--
2.14.2
2.17.1


57
SOURCES/0001-gdm-add-AuthList-control.patch

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
From 356171d85579d27da3180fd78ffb353f23c9073f Mon Sep 17 00:00:00 2001
From fd39875612bb6895e820924608c7a9719a9d326e Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Tue, 18 Jul 2017 12:58:14 -0400
Subject: [PATCH 1/2] gdm: add AuthList control
Subject: [PATCH] gdm: add AuthList control

Ultimately, we want to add support for GDM's new ChoiceList
PAM extension. That extension allows PAM modules to present
@ -14,17 +14,17 @@ but with less features. It lacks API specific to the users, @@ -14,17 +14,17 @@ 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 | 198 ++++++++++++++++++++++++++++++++++++++++++
js/gdm/authList.js | 195 ++++++++++++++++++++++++++++++++++
js/js-resources.gresource.xml | 1 +
2 files changed, 199 insertions(+)
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..893e35075
index 000000000..fc1c3d6e4
--- /dev/null
+++ b/js/gdm/authList.js
@@ -0,0 +1,198 @@
@@ -0,0 +1,195 @@
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+/*
+ * Copyright 2017 Red Hat, Inc
@ -58,7 +58,7 @@ index 000000000..893e35075 @@ -58,7 +58,7 @@ index 000000000..893e35075
+const AuthListItem = new Lang.Class({
+ Name: 'AuthListItem',
+
+ _init: function(key, text) {
+ _init(key, text) {
+ this.key = key;
+ let label = new St.Label({ style_class: 'auth-list-item-label',
+ y_align: Clutter.ActorAlign.CENTER });
@ -82,14 +82,14 @@ index 000000000..893e35075 @@ -82,14 +82,14 @@ index 000000000..893e35075
+ this._setSelected(this.actor.hover);
+ });
+
+ this.actor.connect('clicked', Lang.bind(this, this._onClicked));
+ this.actor.connect('clicked', this._onClicked.bind(this));
+ },
+
+ _onClicked: function() {
+ _onClicked() {
+ this.emit('activate');
+ },
+
+ _setSelected: function(selected) {
+ _setSelected(selected) {
+ if (selected) {
+ this.actor.add_style_pseudo_class('selected');
+ this.actor.grab_key_focus();
@ -103,7 +103,7 @@ index 000000000..893e35075 @@ -103,7 +103,7 @@ index 000000000..893e35075
+const AuthList = new Lang.Class({
+ Name: 'AuthList',
+
+ _init: function() {
+ _init() {
+ this.actor = new St.BoxLayout({ vertical: true,
+ style_class: 'login-dialog-auth-list-layout' });
+
@ -122,10 +122,10 @@ index 000000000..893e35075 @@ -122,10 +122,10 @@ index 000000000..893e35075
+ this._scrollView.add_actor(this._box);
+ this._items = {};
+
+ this.actor.connect('key-focus-in', Lang.bind(this, this._moveFocusToItems));
+ this.actor.connect('key-focus-in', this._moveFocusToItems.bind(this));
+ },
+
+ _moveFocusToItems: function() {
+ _moveFocusToItems() {
+ let hasItems = Object.keys(this._items).length > 0;
+
+ if (!hasItems)
@ -136,18 +136,18 @@ index 000000000..893e35075 @@ -136,18 +136,18 @@ index 000000000..893e35075
+
+ let focusSet = this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
+ if (!focusSet) {
+ Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
+ Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => {
+ this._moveFocusToItems();
+ return false;
+ }));
+ });
+ }
+ },
+
+ _onItemActivated: function(activatedItem) {
+ _onItemActivated(activatedItem) {
+ this.emit('activate', activatedItem.key);
+ },
+
+ scrollToItem: function(item) {
+ scrollToItem(item) {
+ let box = item.actor.get_allocation_box();
+
+ let adjustment = this._scrollView.get_vscroll_bar().get_adjustment();
@ -160,7 +160,7 @@ index 000000000..893e35075 @@ -160,7 +160,7 @@ index 000000000..893e35075
+ transition: 'easeOutQuad' });
+ },
+
+ jumpToItem: function(item) {
+ jumpToItem(item) {
+ let box = item.actor.get_allocation_box();
+
+ let adjustment = this._scrollView.get_vscroll_bar().get_adjustment();
@ -170,7 +170,7 @@ index 000000000..893e35075 @@ -170,7 +170,7 @@ index 000000000..893e35075
+ adjustment.set_value(value);
+ },
+
+ getItem: function(key) {
+ getItem(key) {
+ let item = this._items[key];
+
+ if (!item)
@ -179,7 +179,7 @@ index 000000000..893e35075 @@ -179,7 +179,7 @@ index 000000000..893e35075
+ return item;
+ },
+
+ addItem: function(key, text) {
+ addItem(key, text) {
+ this.removeItem(key);
+
+ let item = new AuthListItem(key, text);
@ -188,21 +188,18 @@ index 000000000..893e35075 @@ -188,21 +188,18 @@ index 000000000..893e35075
+ this._items[key] = item;
+
+ item.connect('activate',
+ Lang.bind(this, this._onItemActivated));
+ this._onItemActivated.bind(this));
+
+ // Try to keep the focused item front-and-center
+ item.actor.connect('key-focus-in',
+ Lang.bind(this,
+ function() {
+ this.scrollToItem(item);
+ }));
+ () => { this.scrollToItem(item); });
+
+ this._moveFocusToItems();
+
+ this.emit('item-added', item);
+ },
+
+ removeItem: function(key) {
+ removeItem(key) {
+ let item = this._items[key];
+
+ if (!item)
@ -212,11 +209,11 @@ index 000000000..893e35075 @@ -212,11 +209,11 @@ index 000000000..893e35075
+ delete this._items[key];
+ },
+
+ numItems: function() {
+ numItems() {
+ return Object.keys(this._items).length;
+ },
+
+ clear: function() {
+ clear() {
+ this.label.text = "";
+ this._box.destroy_all_children();
+ this._items = {};
@ -224,7 +221,7 @@ index 000000000..893e35075 @@ -224,7 +221,7 @@ index 000000000..893e35075
+});
+Signals.addSignalMethods(AuthList.prototype);
diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml
index 7a5c8ca6f..c0a80f564 100644
index 883b62d66..58035d303 100644
--- a/js/js-resources.gresource.xml
+++ b/js/js-resources.gresource.xml
@@ -1,6 +1,7 @@
@ -236,5 +233,5 @@ index 7a5c8ca6f..c0a80f564 100644 @@ -236,5 +233,5 @@ index 7a5c8ca6f..c0a80f564 100644
<file>gdm/batch.js</file>
<file>gdm/fingerprint.js</file>
--
2.14.2
2.17.1


421
SOURCES/0001-global-Allow-overriding-the-override-schema.patch

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
From c2a8239044f350a6548e0e8314b4f40b49a726b2 Mon Sep 17 00:00:00 2001
From 96c97daca0db1ef56125873a8eebef86bdc8087a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Wed, 11 Oct 2017 00:36:18 +0200
Date: Mon, 4 Jun 2018 13:45:06 -0400
Subject: [PATCH] global: Allow overriding the override schema

---
@ -9,10 +9,37 @@ Subject: [PATCH] global: Allow overriding the override schema @@ -9,10 +9,37 @@ Subject: [PATCH] global: Allow overriding the override schema
2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/src/main.c b/src/main.c
index 9a89aa4d6..085399b68 100644
index 857877b0b..9d51ee5d1 100644
--- a/src/main.c
+++ b/src/main.c
@@ -39,6 +39,7 @@ extern GType gnome_shell_plugin_get_type (void);
@@ -12,60 +12,61 @@
#include <clutter/clutter.h>
#include <clutter/x11/clutter-x11.h>
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <gtk/gtk.h>
#include <glib/gi18n-lib.h>
#include <girepository.h>
#include <meta/main.h>
#include <meta/meta-plugin.h>
#include <meta/prefs.h>
#include <atk-bridge.h>
#include "shell-global.h"
#include "shell-global-private.h"
#include "shell-perf-log.h"
#include "st.h"
extern GType gnome_shell_plugin_get_type (void);
#define SHELL_DBUS_SERVICE "org.gnome.Shell"
#define MAGNIFIER_DBUS_SERVICE "org.gnome.Magnifier"
#define OVERRIDES_SCHEMA "org.gnome.shell.overrides"
#define WM_NAME "GNOME Shell"
#define GNOME_WM_KEYBINDINGS "Mutter,GNOME Shell"
static gboolean is_gdm_mode = FALSE;
static char *session_mode = NULL;
static int caught_signal = 0;
@ -20,7 +47,61 @@ index 9a89aa4d6..085399b68 100644 @@ -20,7 +47,61 @@ index 9a89aa4d6..085399b68 100644
#define DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER 1
#define DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER 4
@@ -455,6 +456,12 @@ GOptionEntry gnome_shell_options[] = {
enum {
SHELL_DEBUG_BACKTRACE_WARNINGS = 1,
SHELL_DEBUG_BACKTRACE_SEGFAULTS = 2,
};
static int _shell_debug;
static gboolean _tracked_signals[NSIG] = { 0 };
static void
shell_dbus_acquire_name (GDBusProxy *bus,
guint32 request_name_flags,
guint32 *request_name_result,
const gchar *name,
gboolean fatal)
{
GError *error = NULL;
GVariant *request_name_variant;
if (!(request_name_variant = g_dbus_proxy_call_sync (bus,
"RequestName",
g_variant_new ("(su)", name, request_name_flags),
0, /* call flags */
-1, /* timeout */
NULL, /* cancellable */
&error)))
{
g_printerr ("failed to acquire %s: %s\n", name, error->message);
@@ -423,110 +424,118 @@ print_version (const gchar *option_name,
{
g_print ("GNOME Shell %s\n", VERSION);
exit (0);
}
GOptionEntry gnome_shell_options[] = {
{
"version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
print_version,
N_("Print version"),
NULL
},
{
"gdm-mode", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE,
&is_gdm_mode,
N_("Mode used by GDM for login screen"),
NULL
},
{
"mode", 0, 0, G_OPTION_ARG_STRING,
&session_mode,
N_("Use a specific mode, e.g. “gdm” for login screen"),
"MODE"
},
{
"list-modes", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
list_modes,
N_("List possible modes"),
NULL
},
@ -33,7 +114,57 @@ index 9a89aa4d6..085399b68 100644 @@ -33,7 +114,57 @@ index 9a89aa4d6..085399b68 100644
{ NULL }
};
@@ -512,7 +519,9 @@ main (int argc, char **argv)
int
main (int argc, char **argv)
{
GOptionContext *ctx;
GError *error = NULL;
int ecode;
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
session_mode = (char *) g_getenv ("GNOME_SHELL_SESSION_MODE");
ctx = meta_get_option_context ();
g_option_context_add_main_entries (ctx, gnome_shell_options, GETTEXT_PACKAGE);
g_option_context_add_group (ctx, g_irepository_get_option_group ());
if (!g_option_context_parse (ctx, &argc, &argv, &error))
{
g_printerr ("%s: %s\n", argv[0], error->message);
exit (1);
}
g_option_context_free (ctx);
meta_plugin_manager_set_plugin_type (gnome_shell_plugin_get_type ());
meta_set_wm_name (WM_NAME);
meta_set_gnome_wm_keybindings (GNOME_WM_KEYBINDINGS);
/* Prevent meta_init() from causing gtk to load the atk-bridge*/
g_setenv ("NO_AT_BRIDGE", "1", TRUE);
meta_init ();
g_unsetenv ("NO_AT_BRIDGE");
/* FIXME: Add gjs API to set this stuff and don't depend on the
* environment. These propagate to child processes.
*/
g_setenv ("GJS_DEBUG_OUTPUT", "stderr", TRUE);
g_setenv ("GJS_DEBUG_TOPICS", "JS ERROR;JS LOG", TRUE);
shell_init_debug (g_getenv ("SHELL_DEBUG"));
shell_dbus_init (meta_get_replace_current_wm ());
shell_a11y_init ();
shell_perf_log_init ();
shell_introspection_init ();
shell_fonts_init ();
g_log_set_default_handler (default_log_handler, NULL);
/* Initialize the global object */
if (session_mode == NULL)
session_mode = is_gdm_mode ? (char *)"gdm" : (char *)"user";
@ -44,27 +175,132 @@ index 9a89aa4d6..085399b68 100644 @@ -44,27 +175,132 @@ index 9a89aa4d6..085399b68 100644
shell_prefs_init ();
dump_gjs_stack_on_signal (SIGABRT);
dump_gjs_stack_on_signal (SIGFPE);
dump_gjs_stack_on_signal (SIGIOT);
dump_gjs_stack_on_signal (SIGTRAP);
if ((_shell_debug & SHELL_DEBUG_BACKTRACE_SEGFAULTS))
{
dump_gjs_stack_on_signal (SIGBUS);
dump_gjs_stack_on_signal (SIGSEGV);
}
ecode = meta_run ();
g_debug ("Doing final cleanup");
_shell_global_destroy_gjs_context (shell_global_get ());
g_object_unref (shell_global_get ());
return ecode;
}
diff --git a/src/shell-global.c b/src/shell-global.c
index 855f6257c..181dbb825 100644
index c67ac4e4a..961fd3a70 100644
--- a/src/shell-global.c
+++ b/src/shell-global.c
@@ -67,6 +67,7 @@ struct _ShellGlobal {
GdkScreen *gdk_screen;
@@ -38,158 +38,167 @@
/* Memory report bits */
#ifdef HAVE_MALLINFO
#include <malloc.h>
#endif
#if defined __OpenBSD__ || defined __FreeBSD__
#include <sys/sysctl.h>
#endif
#include "shell-enum-types.h"
#include "shell-global-private.h"
#include "shell-perf-log.h"
#include "shell-window-tracker.h"
#include "shell-wm.h"
#include "st.h"
static ShellGlobal *the_object = NULL;
struct _ShellGlobal {
GObject parent;
ClutterStage *stage;
Window stage_xwindow;
MetaDisplay *meta_display;
GdkDisplay *gdk_display;
Display *xdisplay;
MetaScreen *meta_screen;
char *session_mode;
+ char *override_schema;
XserverRegion input_region;
@@ -98,6 +99,7 @@ enum {
GjsContext *js_context;
MetaPlugin *plugin;
ShellWM *wm;
GSettings *settings;
const char *datadir;
char *imagedir;
char *userdatadir;
GFile *userdatadir_path;
GFile *runtime_state_path;
StFocusManager *focus_manager;
guint work_count;
GSList *leisure_closures;
guint leisure_function_id;
/* For sound notifications */
ca_context *sound_context;
gboolean has_modal;
gboolean frame_timestamps;
gboolean frame_finish_timestamp;
};
enum {
PROP_0,
PROP_SESSION_MODE,
+ PROP_OVERRIDE_SCHEMA,
PROP_SCREEN,
PROP_GDK_SCREEN,
PROP_DISPLAY,
@@ -141,6 +143,10 @@ shell_global_set_property(GObject *object,
PROP_SCREEN_WIDTH,
PROP_SCREEN_HEIGHT,
PROP_STAGE,
PROP_WINDOW_GROUP,
PROP_TOP_WINDOW_GROUP,
PROP_WINDOW_MANAGER,
PROP_SETTINGS,
PROP_DATADIR,
PROP_IMAGEDIR,
PROP_USERDATADIR,
PROP_FOCUS_MANAGER,
PROP_FRAME_TIMESTAMPS,
PROP_FRAME_FINISH_TIMESTAMP,
};
/* Signals */
enum
{
NOTIFY_ERROR,
LAST_SIGNAL
};
G_DEFINE_TYPE(ShellGlobal, shell_global, G_TYPE_OBJECT);
static guint shell_global_signals [LAST_SIGNAL] = { 0 };
static void
shell_global_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
ShellGlobal *global = SHELL_GLOBAL (object);
switch (prop_id)
{
case PROP_SESSION_MODE:
g_clear_pointer (&global->session_mode, g_free);
global->session_mode = g_ascii_strdown (g_value_get_string (value), -1);
break;
@ -75,7 +311,25 @@ index 855f6257c..181dbb825 100644 @@ -75,7 +311,25 @@ index 855f6257c..181dbb825 100644
case PROP_FRAME_TIMESTAMPS:
global->frame_timestamps = g_value_get_boolean (value);
break;
@@ -166,6 +172,9 @@ shell_global_get_property(GObject *object,
case PROP_FRAME_FINISH_TIMESTAMP:
global->frame_finish_timestamp = g_value_get_boolean (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
shell_global_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
ShellGlobal *global = SHELL_GLOBAL (object);
switch (prop_id)
{
case PROP_SESSION_MODE:
g_value_set_string (value, shell_global_get_session_mode (global));
break;
@ -85,7 +339,61 @@ index 855f6257c..181dbb825 100644 @@ -85,7 +339,61 @@ index 855f6257c..181dbb825 100644
case PROP_SCREEN:
g_value_set_object (value, global->meta_screen);
break;
@@ -370,6 +379,13 @@ shell_global_class_init (ShellGlobalClass *klass)
case PROP_DISPLAY:
g_value_set_object (value, global->meta_display);
break;
case PROP_SCREEN_WIDTH:
{
int width, height;
meta_screen_get_size (global->meta_screen, &width, &height);
g_value_set_int (value, width);
}
break;
case PROP_SCREEN_HEIGHT:
{
int width, height;
meta_screen_get_size (global->meta_screen, &width, &height);
g_value_set_int (value, height);
}
break;
case PROP_STAGE:
g_value_set_object (value, global->stage);
break;
case PROP_WINDOW_GROUP:
g_value_set_object (value, meta_get_window_group_for_screen (global->meta_screen));
break;
case PROP_TOP_WINDOW_GROUP:
g_value_set_object (value, meta_get_top_window_group_for_screen (global->meta_screen));
@@ -341,60 +350,67 @@ shell_global_finalize (GObject *object)
g_free (global->imagedir);
g_free (global->userdatadir);
G_OBJECT_CLASS(shell_global_parent_class)->finalize (object);
}
static void
shell_global_class_init (ShellGlobalClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->get_property = shell_global_get_property;
gobject_class->set_property = shell_global_set_property;
gobject_class->finalize = shell_global_finalize;
shell_global_signals[NOTIFY_ERROR] =
g_signal_new ("notify-error",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL, NULL,
G_TYPE_NONE, 2,
G_TYPE_STRING,
G_TYPE_STRING);
g_object_class_install_property (gobject_class,
PROP_SESSION_MODE,
g_param_spec_string ("session-mode",
"Session Mode",
"The session mode to use",
@ -99,7 +407,61 @@ index 855f6257c..181dbb825 100644 @@ -99,7 +407,61 @@ index 855f6257c..181dbb825 100644
"user",
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (gobject_class,
@@ -1495,7 +1511,9 @@ shell_global_get_overrides_settings (ShellGlobal *global)
PROP_SCREEN,
g_param_spec_object ("screen",
"Screen",
"Metacity screen object for the shell",
META_TYPE_SCREEN,
G_PARAM_READABLE));
g_object_class_install_property (gobject_class,
PROP_SCREEN_WIDTH,
g_param_spec_int ("screen-width",
"Screen Width",
"Screen width, in pixels",
0, G_MAXINT, 1,
G_PARAM_READABLE));
g_object_class_install_property (gobject_class,
PROP_SCREEN_HEIGHT,
g_param_spec_int ("screen-height",
"Screen Height",
"Screen height, in pixels",
0, G_MAXINT, 1,
G_PARAM_READABLE));
g_object_class_install_property (gobject_class,
PROP_DISPLAY,
g_param_spec_object ("display",
"Display",
"Metacity display object for the shell",
@@ -1333,61 +1349,63 @@ shell_global_sync_pointer (ShellGlobal *global)
* @global: A #ShellGlobal
*
* Get the global GSettings instance.
*
* Return value: (transfer none): The GSettings object
*/
GSettings *
shell_global_get_settings (ShellGlobal *global)
{
return global->settings;
}
/**
* shell_global_get_overrides_settings:
* @global: A #ShellGlobal
*
* Get the session overrides GSettings instance.
*
* Return value: (transfer none): The GSettings object
*/
GSettings *
shell_global_get_overrides_settings (ShellGlobal *global)
{
static GSettings *settings = NULL;
const char *schema;
g_return_val_if_fail (SHELL_IS_GLOBAL (global), NULL);
if (!settings)
{
@ -110,6 +472,33 @@ index 855f6257c..181dbb825 100644 @@ -110,6 +472,33 @@ index 855f6257c..181dbb825 100644
schema = "org.gnome.shell.extensions.classic-overrides";
else if (strcmp (global->session_mode, "user") == 0)
schema = "org.gnome.shell.overrides";
else
return NULL;
settings = g_settings_new (schema);
}
return settings;
}
/**
* shell_global_get_current_time:
* @global: A #ShellGlobal
*
* Returns: the current X server time from the current Clutter, Gdk, or X
* event. If called from outside an event handler, this may return
* %Clutter.CURRENT_TIME (aka 0), or it may return a slightly
* out-of-date timestamp.
*/
guint32
shell_global_get_current_time (ShellGlobal *global)
{
guint32 time;
/* meta_display_get_current_time() will return the correct time
when handling an X or Gdk event, but will return CurrentTime
from some Clutter event callbacks.
--
2.14.2
2.17.1


55
SOURCES/0001-keyboard-Handle-no-window-case-in-FocusTracker.patch

@ -0,0 +1,55 @@ @@ -0,0 +1,55 @@
From 6a796675bd7815087881b799ff5fc79e9ce2b0bf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Mon, 16 Jul 2018 23:36:38 +0000
Subject: [PATCH] keyboard: Handle no-window case in FocusTracker

For windows, the cursor location needs to be adjusted by the frame
offsets. However we cannot assume that there is a window, as the
shell itself can have the key focus.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/414


(cherry picked from commit 0dee82fb9fa974ebdb4dd77fd85535a6edf207fd)
---
js/ui/keyboard.js | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js
index 5fcdf988a7..66653d6027 100644
--- a/js/ui/keyboard.js
+++ b/js/ui/keyboard.js
@@ -533,17 +533,25 @@ var FocusTracker = new Lang.Class({
},
_setCurrentRect(rect) {
- let frameRect = this._currentWindow.get_frame_rect();
- rect.x -= frameRect.x;
- rect.y -= frameRect.y;
+ if (this._currentWindow) {
+ let frameRect = this._currentWindow.get_frame_rect();
+ rect.x -= frameRect.x;
+ rect.y -= frameRect.y;
+ }
this._rect = rect;
this.emit('position-changed');
},
getCurrentRect() {
- let frameRect = this._currentWindow.get_frame_rect();
- let rect = { x: this._rect.x + frameRect.x, y: this._rect.y + frameRect.y, width: this._rect.width, height: this._rect.height };
+ let rect = { x: this._rect.x, y: this._rect.y,
+ width: this._rect.width, height: this._rect.height };
+
+ if (this._currentWindow) {
+ let frameRect = this._currentWindow.get_frame_rect();
+ rect.x += frameRect.x;
+ rect.y += frameRect.y;
+ }
return rect;
}
--
2.17.1

67
SOURCES/0001-keyboard-Listen-to-IbusPanelService-focus-in-out-to-.patch

@ -0,0 +1,67 @@ @@ -0,0 +1,67 @@
From 04a4a100e34e3ce8c34212ebb79e77b92ef8238d Mon Sep 17 00:00:00 2001
From: Carlos Garnacho <carlosg@gnome.org>
Date: Tue, 18 Sep 2018 12:54:29 +0200
Subject: [PATCH] keyboard: Listen to IbusPanelService::focus-in/out to track
focus changes

In X11 there's no input panel state requests, so restore the previous behavior
that focused entries would always toggle the OSK on there.
---
js/misc/ibusManager.js | 6 ++++++
js/ui/keyboard.js | 16 ++++++++++++++++
2 files changed, 22 insertions(+)

diff --git a/js/misc/ibusManager.js b/js/misc/ibusManager.js
index 6452e492f..e6d4b5aec 100644
--- a/js/misc/ibusManager.js
+++ b/js/misc/ibusManager.js
@@ -119,6 +119,12 @@ var IBusManager = new Lang.Class({
let cursorLocation = { x, y, width: w, height: h };
this.emit('set-cursor-location', cursorLocation);
});
+ this._panelService.connect('focus-in', (panel, path) => {
+ // This is ibus' "no focus" input context, so should be ignored
+ if (!GLib.str_has_suffix(path, '/InputContext_1'))
+ this.emit ('focus-in');
+ });
+ this._panelService.connect('focus-out', () => { this.emit('focus-out'); });
try {
// IBus versions older than 1.5.10 have a bug which
diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js
index be0146344..491495c57 100644
--- a/js/ui/keyboard.js
+++ b/js/ui/keyboard.js
@@ -519,6 +519,12 @@ var FocusTracker = new Lang.Class({
this._setCurrentRect(rect);
});
+ this._ibusManager.connect('focus-in', () => {
+ this.emit('focus-changed', true);
+ });
+ this._ibusManager.connect('focus-out', () => {
+ this.emit('focus-changed', false);
+ });
},
get currentWindow() {
@@ -590,6 +596,16 @@ var Keyboard = new Lang.Class({
this._animFocusedWindow = null;
this._oskFocusWindow = null;
});
+ this._focusTracker.connect('focus-changed', (tracker, focused) => {
+ // Valid only for X11
+ if (Meta.is_wayland_compositor())
+ return;
+
+ if (focused)
+ this.show(Main.layoutManager.focusIndex);
+ else
+ this.hide();
+ });
Meta.get_backend().connect('last-device-changed',
(backend, deviceId) => {
--
2.19.0

63
SOURCES/0001-loginDialog-make-info-messages-themed.patch

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
From b82109bd0c04a8b050a7ad18cd4b2c1d4186fa61 Mon Sep 17 00:00:00 2001
From e407e1f6843258fff417ff9d5e558d256fe10a03 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 26 Jun 2017 14:35:05 -0400
Subject: [PATCH] loginDialog: make info messages themed
@ -6,46 +6,27 @@ Subject: [PATCH] loginDialog: make info messages themed @@ -6,46 +6,27 @@ Subject: [PATCH] loginDialog: make info messages themed
They were lacking a definition before leading them to
show up invisible.
---
data/theme/gnome-shell-high-contrast.css | 6 ++++--
data/theme/gnome-shell.css | 6 ++++--
2 files changed, 8 insertions(+), 4 deletions(-)
data/theme/gnome-shell-sass/_common.scss | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/data/theme/gnome-shell-high-contrast.css b/data/theme/gnome-shell-high-contrast.css
index 52dc81863..b807db8ae 100644
--- a/data/theme/gnome-shell-high-contrast.css
+++ b/data/theme/gnome-shell-high-contrast.css
@@ -1647,9 +1647,11 @@ StScrollBar {
.login-dialog-message-warning {
color: #f57900; }
-.login-dialog-message-hint {
+.login-dialog-message-hint, .login-dialog-message {
+ color: #bebeb6;
padding-top: 0;
- padding-bottom: 20px; }
+ padding-bottom: 20px;
+ min-height: 2.75em; }
.login-dialog-user-selection-box {
padding: 100px 0px; }
diff --git a/data/theme/gnome-shell.css b/data/theme/gnome-shell.css
index a320f41a0..dd37cdf7b 100644
--- a/data/theme/gnome-shell.css
+++ b/data/theme/gnome-shell.css
@@ -1647,9 +1647,11 @@ StScrollBar {
.login-dialog-message-warning {
color: #f57900; }
-.login-dialog-message-hint {
+.login-dialog-message-hint, .login-dialog-message {
+ color: #bebeb6;
padding-top: 0;
- padding-bottom: 20px; }
+ padding-bottom: 20px;
+ min-height: 2.75em; }
.login-dialog-user-selection-box {
padding: 100px 0px; }
diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss
index 4e82ef58b..ee643c440 100644
--- a/data/theme/gnome-shell-sass/_common.scss
+++ b/data/theme/gnome-shell-sass/_common.scss
@@ -1769,7 +1769,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.14.2
2.17.1


160
SOURCES/0001-panel-add-an-icon-to-the-ActivitiesButton.patch

@ -1,48 +1,115 @@ @@ -1,48 +1,115 @@
From 7196f5d0a60243e218d6a906b9db4f3b6608b47c Mon Sep 17 00:00:00 2001
From 519df156f73419d83fbd043e73abc8d3f93233b0 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
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-high-contrast.css | 3 +++
data/theme/gnome-shell.css | 3 +++
data/theme/gnome-shell-sass/_common.scss | 5 +++++
js/ui/panel.js | 9 ++++++++-
3 files changed, 14 insertions(+), 1 deletion(-)
2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/data/theme/gnome-shell-high-contrast.css b/data/theme/gnome-shell-high-contrast.css
index 51477e713..e7b94624a 100644
--- a/data/theme/gnome-shell-high-contrast.css
+++ b/data/theme/gnome-shell-high-contrast.css
@@ -688,6 +688,9 @@ StScrollBar {
-st-icon-style: symbolic;
margin-left: 4px;
margin-right: 4px; }
+ #panel .panel-button .panel-logo-icon {
+ padding-right: .4em;
+ icon-size: 1em; }
#panel .panel-button .system-status-icon,
#panel .panel-button .app-menu-icon > StIcon,
#panel .panel-button .popup-menu-arrow {
diff --git a/data/theme/gnome-shell.css b/data/theme/gnome-shell.css
index 6aab70867..c1207dcd5 100644
--- a/data/theme/gnome-shell.css
+++ b/data/theme/gnome-shell.css
@@ -688,6 +688,9 @@ StScrollBar {
diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss
index 1b0c20650..639f062f1 100644
--- a/data/theme/gnome-shell-sass/_common.scss
+++ b/data/theme/gnome-shell-sass/_common.scss
@@ -749,60 +749,65 @@ StScrollBar {
-panel-corner-background-color: rgba(0, 0, 0, 0.35);
-panel-corner-border-width: 2px;
-panel-corner-border-color: transparent;
&:active, &:overview, &:focus {
-panel-corner-border-color: lighten($selected_bg_color,5%);
}
&.lock-screen, &.login-screen, &.unlock-screen {
-panel-corner-radius: 0;
-panel-corner-background-color: transparent;
-panel-corner-border-color: transparent;
}
}
.panel-button {
-natural-hpadding: 12px;
-minimum-hpadding: 6px;
font-weight: bold;
color: #eee;
text-shadow: 0px 1px 2px rgba(0, 0, 0, 0.9);
transition-duration: 100ms;
.app-menu-icon {
-st-icon-style: symbolic;
margin-left: 4px;
margin-right: 4px; }
+ #panel .panel-button .panel-logo-icon {
margin-right: 4px;
//dimensions of the icon are hardcoded
}
+ .panel-logo-icon {
+ padding-right: .4em;
+ icon-size: 1em; }
#panel .panel-button .system-status-icon,
#panel .panel-button .app-menu-icon > StIcon,
#panel .panel-button .popup-menu-arrow {
+ icon-size: 1em;
+ }
+
.system-status-icon,
.app-menu-icon > StIcon,
.popup-menu-arrow {
icon-shadow: 0px 1px 2px rgba(0, 0, 0, 0.9);
}
&:hover {
color: lighten($fg_color, 10%);
text-shadow: 0px 1px 6px rgba(0, 0, 0, 1);
.system-status-icon,
.app-menu-icon > StIcon,
.popup-menu-arrow {
icon-shadow: 0px 1px 6px rgba(0, 0, 0, 1);
}
}
&:active, &:overview, &:focus, &:checked {
// Trick due to St limitations. It needs a background to draw
// a box-shadow
background-color: rgba(0, 0, 0, 0.01);
box-shadow: inset 0 -2px 0px lighten($selected_bg_color,5%);
color: lighten($fg_color,10%);
& > .system-status-icon { icon-shadow: black 0 2px 2px; }
}
.system-status-icon { icon-size: 1.09em; padding: 0 5px; }
.unlock-screen &,
.login-screen &,
diff --git a/js/ui/panel.js b/js/ui/panel.js
index d7c8397b5..3ec43210e 100644
index 2f593247d..d1a572503 100644
--- a/js/ui/panel.js
+++ b/js/ui/panel.js
@@ -409,11 +409,18 @@ var ActivitiesButton = new Lang.Class({
@@ -379,65 +379,72 @@ var AppMenuButton = new Lang.Class({
}
if (this._overviewShowingId > 0) {
Main.overview.disconnect(this._overviewShowingId);
this._overviewShowingId = 0;
}
if (this._showsAppMenuId > 0) {
this._gtkSettings.disconnect(this._showsAppMenuId);
this._showsAppMenuId = 0;
}
if (this._switchWorkspaceNotifyId > 0) {
global.window_manager.disconnect(this._switchWorkspaceNotifyId);
this._switchWorkspaceNotifyId = 0;
}
this.parent();
}
});
Signals.addSignalMethods(AppMenuButton.prototype);
var ActivitiesButton = new Lang.Class({
Name: 'ActivitiesButton',
Extends: PanelMenu.Button,
_init() {
this.parent(0.0, null, true);
this.actor.accessible_role = Atk.Role.TOGGLE_BUTTON;
this.actor.name = 'panelActivities';
@ -62,6 +129,33 @@ index d7c8397b5..3ec43210e 100644 @@ -62,6 +129,33 @@ index d7c8397b5..3ec43210e 100644
this.actor.label_actor = this._label;
this.actor.connect('captured-event', this._onCapturedEvent.bind(this));
this.actor.connect_after('key-release-event', this._onKeyRelease.bind(this));
Main.overview.connect('showing', () => {
this.actor.add_style_pseudo_class('overview');
this.actor.add_accessible_state (Atk.StateType.CHECKED);
});
Main.overview.connect('hiding', () => {
this.actor.remove_style_pseudo_class('overview');
this.actor.remove_accessible_state (Atk.StateType.CHECKED);
});
this._xdndTimeOut = 0;
},
handleDragOver(source, actor, x, y, time) {
if (source != Main.xdndHandler)
return DND.DragMotionResult.CONTINUE;
if (this._xdndTimeOut != 0)
Mainloop.source_remove(this._xdndTimeOut);
this._xdndTimeOut = Mainloop.timeout_add(BUTTON_DND_ACTIVATION_TIMEOUT, () => {
this._xdndToggleOverview(actor);
});
GLib.Source.set_name_by_id(this._xdndTimeOut, '[gnome-shell] this._xdndToggleOverview');
return DND.DragMotionResult.CONTINUE;
--
2.14.2
2.17.1


12
SOURCES/0001-screenShield-unblank-when-inserting-smartcard.patch

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
From 7d9fa52a96cd5698ccb4773ffb71ab23b2a22a3d Mon Sep 17 00:00:00 2001
From c4fc8a8db952a1ab349014db2e1429479ec8a7a5 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Fri, 3 Jul 2015 13:54:36 -0400
Subject: [PATCH] screenShield: unblank when inserting smartcard
@ -13,21 +13,21 @@ action to get the screen to unblank. @@ -13,21 +13,21 @@ action to get the screen to unblank.
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js
index 9f3ff84ad..8d3eb43d4 100644
index 2d8d9b3f6..ebba6c82a 100644
--- a/js/ui/screenShield.js
+++ b/js/ui/screenShield.js
@@ -516,8 +516,10 @@ var ScreenShield = new Lang.Class({
@@ -515,8 +515,10 @@ var ScreenShield = new Lang.Class({
this._smartcardManager = SmartcardManager.getSmartcardManager();
this._smartcardManager.connect('smartcard-inserted',
Lang.bind(this, function(manager, token) {
(manager, token) => {
- if (this._isLocked && token.UsedToLogin)
+ if (this._isLocked && token.UsedToLogin) {
+ this._wakeUpScreen();
this._liftShield(true, 0);
+ }
}));
});
this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
--
2.14.2
1.8.3.1


4
SOURCES/0001-shellDBus-Add-a-DBus-method-to-load-a-single-extensi.patch

@ -28,7 +28,7 @@ index 3fd24d275..d9f36b281 100644 @@ -28,7 +28,7 @@ index 3fd24d275..d9f36b281 100644
ExtensionDownloader.checkForUpdates();
},
+ LoadUserExtension: function(uuid) {
+ LoadUserExtension(uuid) {
+ let extension = ExtensionUtils.extensions[uuid];
+ if (extension)
+ return true;
@ -46,7 +46,7 @@ index 3fd24d275..d9f36b281 100644 @@ -46,7 +46,7 @@ index 3fd24d275..d9f36b281 100644
+
ShellVersion: Config.PACKAGE_VERSION,
_extensionStateChanged: function(_, newState) {
_extensionStateChanged(_, newState) {
--
2.14.2


22
SOURCES/0001-system-don-t-throw-an-exception-if-power-off-disable.patch

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
From 3ff1be9fe127a51092b1f5b97d65af7fff75041d Mon Sep 17 00:00:00 2001
From: rpm-build <rpm-build>
Date: Mon, 13 Nov 2017 14:17:18 -0500
From 5bd84b34622a3e5919e979b99d1d4872d355d18d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Mon, 4 Jun 2018 13:48:02 -0400
Subject: [PATCH] system: don't throw an exception if power off disabled

---
@ -8,18 +8,18 @@ Subject: [PATCH] system: don't throw an exception if power off disabled @@ -8,18 +8,18 @@ Subject: [PATCH] system: don't throw an exception if power off disabled
1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/js/ui/status/system.js b/js/ui/status/system.js
index 2a8ca47..37d140a 100644
index 68a0b4b5b..2ab38419f 100644
--- a/js/ui/status/system.js
+++ b/js/ui/status/system.js
@@ -40,66 +40,69 @@ var AltSwitcher = new Lang.Class({
this._clickAction.connect('long-press', Lang.bind(this, this._onLongPress));
this._clickAction.connect('long-press', this._onLongPress.bind(this));
this.actor = new St.Bin();
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this.actor.connect('destroy', this._onDestroy.bind(this));
this.actor.connect('notify::mapped', () => { this._flipped = false; });
},
_sync: function() {
_sync() {
let childToShow = null;
if (this._standard.visible && this._alternate.visible) {
@ -65,14 +65,14 @@ index 2a8ca47..37d140a 100644 @@ -65,14 +65,14 @@ index 2a8ca47..37d140a 100644
this.actor.visible = (childToShow != null);
},
_onDestroy: function() {
_onDestroy() {
if (this._capturedEventId > 0) {
global.stage.disconnect(this._capturedEventId);
this._capturedEventId = 0;
}
},
_onCapturedEvent: function(actor, event) {
_onCapturedEvent(actor, event) {
let type = event.type();
if (type == Clutter.EventType.KEY_PRESS || type == Clutter.EventType.KEY_RELEASE) {
let key = event.get_key_symbol();
@ -83,9 +83,9 @@ index 2a8ca47..37d140a 100644 @@ -83,9 +83,9 @@ index 2a8ca47..37d140a 100644
return Clutter.EVENT_PROPAGATE;
},
_onLongPress: function(action, actor, state) {
_onLongPress(action, actor, state) {
if (state == Clutter.LongPressState.QUERY ||
state == Clutter.LongPressState.CANCEL)
--
2.14.3
2.17.1


16
SOURCES/0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
From 8d085a574b5b5d1055451a1b430fcf5cb9af4859 Mon Sep 17 00:00:00 2001
From aa5dbcf4cd7caa9ff1ba2c2c8b65f007314f521a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Tue, 14 Mar 2017 17:04:36 +0100
Subject: [PATCH] windowMenu: Bring back workspaces submenu for static
@ -13,12 +13,12 @@ are used. @@ -13,12 +13,12 @@ are used.
1 file changed, 16 insertions(+)

diff --git a/js/ui/windowMenu.js b/js/ui/windowMenu.js
index 7aa57beb3..8751c4c4d 100644
index f0e564b7e..8c97a1eec 100644
--- a/js/ui/windowMenu.js
+++ b/js/ui/windowMenu.js
@@ -119,6 +119,22 @@ var WindowMenu = new Lang.Class({
window.change_workspace(workspace.get_neighbor(Meta.MotionDirection.DOWN));
}));
@@ -123,6 +123,22 @@ var WindowMenu = new Lang.Class({
window.change_workspace(workspace.get_neighbor(dir));
});
}
+
+ let nWorkspaces = global.screen.n_workspaces;
@ -30,9 +30,9 @@ index 7aa57beb3..8751c4c4d 100644 @@ -30,9 +30,9 @@ index 7aa57beb3..8751c4c4d 100644
+ for (let i = 0; i < nWorkspaces; i++) {
+ let index = i;
+ let name = Meta.prefs_get_workspace_name(i);
+ let subitem = item.menu.addAction(name, Lang.bind(this, function() {
+ let subitem = item.menu.addAction(name, () => {
+ window.change_workspace_by_index(index, false);
+ }));
+ });
+ subitem.setSensitive(currentIndex != i);
+ }
+ }
@ -40,5 +40,5 @@ index 7aa57beb3..8751c4c4d 100644 @@ -40,5 +40,5 @@ index 7aa57beb3..8751c4c4d 100644
}
--
2.14.2
2.17.1


97
SOURCES/0002-gdmUtil-enable-support-for-GDM-s-ChoiceList-PAM-exte.patch

@ -1,19 +1,18 @@ @@ -1,19 +1,18 @@
From 1383483a7c9707c2528c5a47fd71217cf253c6ff Mon Sep 17 00:00:00 2001
From e5214fb2992c1ef5d8bde63295d9f54dbb3daa24 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 17 Jul 2017 16:48:03 -0400
Subject: [PATCH 2/2] gdmUtil: enable support for GDM's ChoiceList PAM
extension
Subject: [PATCH] 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 ++++++-
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 366f34687..7f23f0087 100644
index e44281117..27a55246a 100644
--- a/js/gdm/authPrompt.js
+++ b/js/gdm/authPrompt.js
@@ -9,6 +9,7 @@ const Signals = imports.signals;
@ -26,13 +25,13 @@ index 366f34687..7f23f0087 100644 @@ -26,13 +25,13 @@ index 366f34687..7f23f0087 100644
const Meta = imports.gi.Meta;
@@ -61,6 +62,7 @@ var AuthPrompt = new Lang.Class({
this._userVerifier.connect('ask-question', Lang.bind(this, this._onAskQuestion));
this._userVerifier.connect('show-message', Lang.bind(this, this._onShowMessage));
+ this._userVerifier.connect('show-choice-list', Lang.bind(this, this._onShowChoiceList));
this._userVerifier.connect('verification-failed', Lang.bind(this, this._onVerificationFailed));
this._userVerifier.connect('verification-complete', Lang.bind(this, this._onVerificationComplete));
this._userVerifier.connect('reset', Lang.bind(this, this._onReset));
@@ -125,6 +127,28 @@ var AuthPrompt = new Lang.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));
@@ -123,6 +125,28 @@ var AuthPrompt = new Lang.Class({
this.actor.add(this._timedLoginIndicator);
@ -61,11 +60,11 @@ index 366f34687..7f23f0087 100644 @@ -61,11 +60,11 @@ index 366f34687..7f23f0087 100644
this._message = new St.Label({ opacity: 0,
styleClass: 'login-dialog-message' });
this._message.clutter_text.line_wrap = true;
@@ -276,6 +300,21 @@ var AuthPrompt = new Lang.Class({
@@ -266,6 +290,21 @@ var AuthPrompt = new Lang.Class({
this.emit('prompted');
},
+ _onShowChoiceList: function(userVerifier, serviceName, promptMessage, choiceList) {
+ _onShowChoiceList(userVerifier, serviceName, promptMessage, choiceList) {
+ if (this._queryingService)
+ this.clear();
+
@ -80,19 +79,19 @@ index 366f34687..7f23f0087 100644 @@ -80,19 +79,19 @@ index 366f34687..7f23f0087 100644
+ this.emit('prompted');
+ },
+
_onOVirtUserAuthenticated: function() {
_onOVirtUserAuthenticated() {
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
this.reset();
@@ -404,6 +443,8 @@ var AuthPrompt = new Lang.Class({
clear: function() {
@@ -394,6 +433,8 @@ var AuthPrompt = new Lang.Class({
clear() {
this._entry.text = '';
this.stopSpinning();
+ this._authList.clear();
+ this._authList.actor.hide();
},
setPasswordChar: function(passwordChar) {
@@ -419,12 +460,42 @@ var AuthPrompt = new Lang.Class({
setPasswordChar(passwordChar) {
@@ -409,12 +450,42 @@ var AuthPrompt = new Lang.Class({
this._label.set_text(question);
@ -103,7 +102,7 @@ index 366f34687..7f23f0087 100644 @@ -103,7 +102,7 @@ index 366f34687..7f23f0087 100644
this._entry.grab_key_focus();
},
+ _fadeInChoiceList: function() {
+ _fadeInChoiceList() {
+ this._authList.actor.opacity = 0;
+ this._authList.actor.show();
+ this._authList.actor.reactive = false;
@ -117,7 +116,7 @@ index 366f34687..7f23f0087 100644 @@ -117,7 +116,7 @@ index 366f34687..7f23f0087 100644
+ });
+ },
+
+ setChoiceList: function(promptMessage, choiceList) {
+ setChoiceList(promptMessage, choiceList) {
+ this._authList.clear();
+ this._authList.label.text = promptMessage;
+ for (let key in choiceList) {
@ -132,10 +131,10 @@ index 366f34687..7f23f0087 100644 @@ -132,10 +131,10 @@ index 366f34687..7f23f0087 100644
+ this._fadeInChoiceList();
+ },
+
getAnswer: function() {
getAnswer() {
let text;
@@ -460,6 +531,7 @@ var AuthPrompt = new Lang.Class({
@@ -450,6 +521,7 @@ var AuthPrompt = new Lang.Class({
else
this._message.remove_style_class_name('login-dialog-message-hint');
@ -143,20 +142,20 @@ index 366f34687..7f23f0087 100644 @@ -143,20 +142,20 @@ index 366f34687..7f23f0087 100644
if (message) {
Tweener.removeTweens(this._message);
this._message.text = message;
@@ -475,7 +547,7 @@ var AuthPrompt = new Lang.Class({
@@ -465,7 +537,7 @@ var AuthPrompt = new Lang.Class({
},
updateSensitivity: function(sensitive) {
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 6f6de00da..764a96e06 100644
index 65d9edf1a..912c0e0ca 100644
--- a/js/gdm/loginDialog.js
+++ b/js/gdm/loginDialog.js
@@ -435,6 +435,11 @@ var LoginDialog = new Lang.Class({
@@ -418,6 +418,11 @@ var LoginDialog = new Lang.Class({
this._userManager = AccountsService.UserManager.get_default()
this._gdmClient = new Gdm.Client();
@ -169,7 +168,7 @@ index 6f6de00da..764a96e06 100644 @@ -169,7 +168,7 @@ index 6f6de00da..764a96e06 100644
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY,
diff --git a/js/gdm/util.js b/js/gdm/util.js
index 83a12fb6c..9fc61f55a 100644
index f5f9d5e5d..04a0cb9bf 100644
--- a/js/gdm/util.js
+++ b/js/gdm/util.js
@@ -200,6 +200,10 @@ var ShellUserVerifier = new Lang.Class({
@ -187,14 +186,14 @@ index 83a12fb6c..9fc61f55a 100644 @@ -187,14 +186,14 @@ index 83a12fb6c..9fc61f55a 100644
this._oVirtCredentialsManager = null;
},
+ selectChoice: function(serviceName, key) {
+ selectChoice(serviceName, key) {
+ this._userVerifierChoiceList.call_select_choice(serviceName, key, this._cancellable, null);
+ },
+
answerQuery: function(serviceName, answer) {
answerQuery(serviceName, answer) {
if (!this.hasPendingMessages) {
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
@@ -368,6 +376,11 @@ var ShellUserVerifier = new Lang.Class({
@@ -367,6 +375,11 @@ var ShellUserVerifier = new Lang.Class({
return;
}
@ -206,7 +205,7 @@ index 83a12fb6c..9fc61f55a 100644 @@ -206,7 +205,7 @@ index 83a12fb6c..9fc61f55a 100644
this.reauthenticating = true;
this._connectSignals();
this._beginVerification();
@@ -385,6 +398,11 @@ var ShellUserVerifier = new Lang.Class({
@@ -384,6 +397,11 @@ var ShellUserVerifier = new Lang.Class({
return;
}
@ -218,32 +217,32 @@ index 83a12fb6c..9fc61f55a 100644 @@ -218,32 +217,32 @@ index 83a12fb6c..9fc61f55a 100644
this._connectSignals();
this._beginVerification();
this._hold.release();
@@ -398,6 +416,9 @@ var ShellUserVerifier = new Lang.Class({
this._userVerifier.connect('conversation-stopped', Lang.bind(this, this._onConversationStopped));
this._userVerifier.connect('reset', Lang.bind(this, this._onReset));
this._userVerifier.connect('verification-complete', Lang.bind(this, this._onVerificationComplete));
@@ -397,6 +415,9 @@ var ShellUserVerifier = new Lang.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', Lang.bind(this, this._onChoiceListQuery));
+ this._userVerifierChoiceList.connect('choice-query', this._onChoiceListQuery.bind(this));
},
_getForegroundService: function() {
@@ -474,6 +495,13 @@ var ShellUserVerifier = new Lang.Class({
_getForegroundService() {
@@ -473,6 +494,13 @@ var ShellUserVerifier = new Lang.Class({
this._startService(FINGERPRINT_SERVICE_NAME);
},
+ _onChoiceListQuery: function(client, serviceName, promptMessage, list) {
+ _onChoiceListQuery(client, serviceName, promptMessage, list) {
+ if (!this.serviceIsForeground(serviceName))
+ return;
+
+ this.emit('show-choice-list', serviceName, promptMessage, list.deep_unpack());
+ },
+
_onInfo: function(client, serviceName, info) {
_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 baead5a6f..d525959c5 100644
index 1adaf417e..b5272be20 100644
--- a/js/ui/unlockDialog.js
+++ b/js/ui/unlockDialog.js
@@ -51,7 +51,14 @@ var UnlockDialog = new Lang.Class({
@ -259,9 +258,9 @@ index baead5a6f..d525959c5 100644 @@ -259,9 +258,9 @@ index baead5a6f..d525959c5 100644
+ }
+
+ this._authPrompt = new AuthPrompt.AuthPrompt(this._gdmClient, AuthPrompt.AuthPromptMode.UNLOCK_ONLY);
this._authPrompt.connect('failed', Lang.bind(this, this._fail));
this._authPrompt.connect('cancelled', Lang.bind(this, this._fail));
this._authPrompt.connect('reset', Lang.bind(this, this._onReset));
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.14.2
2.17.1


139
SOURCES/allow-timed-login-with-no-user-list.patch

@ -1,45 +1,38 @@ @@ -1,45 +1,38 @@
From fb872747e5697098c87e97bab13c4095b653053b Mon Sep 17 00:00:00 2001
From 10a47a23aab29d805a4e87ef181d4141d5500707 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
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-high-contrast.css | 3 +++
data/theme/gnome-shell.css | 3 +++
js/gdm/authPrompt.js | 41 ++++++++++++++++++++++++++++++++
js/gdm/loginDialog.js | 29 +++++++++++++++++++---
4 files changed, 73 insertions(+), 3 deletions(-)
data/theme/gnome-shell-sass/_common.scss | 4 +++
js/gdm/authPrompt.js | 40 ++++++++++++++++++++++++
js/gdm/loginDialog.js | 28 +++++++++++++++--
3 files changed, 70 insertions(+), 2 deletions(-)

diff --git a/data/theme/gnome-shell-high-contrast.css b/data/theme/gnome-shell-high-contrast.css
index e7b94624a..364725de3 100644
--- a/data/theme/gnome-shell-high-contrast.css
+++ b/data/theme/gnome-shell-high-contrast.css
@@ -1716,6 +1716,9 @@ StScrollBar {
padding-bottom: 12px;
spacing: 8px;
width: 23em; }
+ .login-dialog-prompt-layout .login-dialog-timed-login-indicator {
+ height: 2px;
+ background-color: #8b8b8b; }
.login-dialog-prompt-label {
color: #bebeb6;
diff --git a/data/theme/gnome-shell.css b/data/theme/gnome-shell.css
index c1207dcd5..5d754a2bb 100644
--- a/data/theme/gnome-shell.css
+++ b/data/theme/gnome-shell.css
@@ -1716,6 +1716,9 @@ StScrollBar {
padding-bottom: 12px;
spacing: 8px;
width: 23em; }
+ .login-dialog-prompt-layout .login-dialog-timed-login-indicator {
+ height: 2px;
+ background-color: #8b8b8b; }
.login-dialog-prompt-label {
color: #bebeb6;
diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss
index 2f05098df..4e82ef58b 100644
--- a/data/theme/gnome-shell-sass/_common.scss
+++ b/data/theme/gnome-shell-sass/_common.scss
@@ -1825,6 +1825,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 9affbdd5f..366f34687 100644
index 89cef4d5d..e44281117 100644
--- a/js/gdm/authPrompt.js
+++ b/js/gdm/authPrompt.js
@@ -2,6 +2,7 @@
@ -50,7 +43,7 @@ index 9affbdd5f..366f34687 100644 @@ -50,7 +43,7 @@ index 9affbdd5f..366f34687 100644
const Lang = imports.lang;
const Pango = imports.gi.Pango;
const Signals = imports.signals;
@@ -119,6 +120,11 @@ var AuthPrompt = new Lang.Class({
@@ -117,6 +118,11 @@ var AuthPrompt = new Lang.Class({
this._entry.grab_key_focus();
@ -62,38 +55,37 @@ index 9affbdd5f..366f34687 100644 @@ -62,38 +55,37 @@ index 9affbdd5f..366f34687 100644
this._message = new St.Label({ opacity: 0,
styleClass: 'login-dialog-message' });
this._message.clutter_text.line_wrap = true;
@@ -144,6 +150,41 @@ var AuthPrompt = new Lang.Class({
@@ -142,6 +148,40 @@ var AuthPrompt = new Lang.Class({
this._defaultButtonWell.add_child(this._spinner.actor);
},
+ showTimedLoginIndicator: function(time) {
+ showTimedLoginIndicator(time) {
+ let hold = new Batch.Hold();
+
+ this.hideTimedLoginIndicator();
+
+ let startTime = GLib.get_monotonic_time();
+
+ this._timedLoginTimeoutId = GLib.timeout_add (GLib.PRIORITY_DEFAULT,
+ 33,
+ Lang.bind(this, function() {
+ 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;
+ }));
+ 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: function() {
+ hideTimedLoginIndicator() {
+ if (this._timedLoginTimeoutId) {
+ GLib.source_remove(this._timedLoginTimeoutId);
+ this._timedLoginTimeoutId = 0;
@ -101,14 +93,14 @@ index 9affbdd5f..366f34687 100644 @@ -101,14 +93,14 @@ index 9affbdd5f..366f34687 100644
+ this._timedLoginIndicator.scale_x = 0.;
+ },
+
_onDestroy: function() {
_onDestroy() {
if (this._preemptiveAnswerWatchId) {
this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js
index c1262b1e8..6f6de00da 100644
index 4a93545af..65d9edf1a 100644
--- a/js/gdm/loginDialog.js
+++ b/js/gdm/loginDialog.js
@@ -756,6 +756,9 @@ var LoginDialog = new Lang.Class({
@@ -738,6 +738,9 @@ var LoginDialog = new Lang.Class({
if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
this._authPrompt.reset();
@ -118,61 +110,52 @@ index c1262b1e8..6f6de00da 100644 @@ -118,61 +110,52 @@ index c1262b1e8..6f6de00da 100644
}
},
@@ -1014,6 +1017,9 @@ var LoginDialog = new Lang.Class({
@@ -1019,17 +1022,33 @@ var LoginDialog = new Lang.Class({
},
_showTimedLoginAnimation: function() {
+ if (this._disableUserList) {
+ return this._authPrompt.showTimedLoginIndicator(this._timedLoginAnimationTime);
+ }
this._timedLoginItem.actor.grab_key_focus();
return this._timedLoginItem.showTimedLoginIndicator(this._timedLoginAnimationTime);
},
@@ -1041,19 +1047,31 @@ var LoginDialog = new Lang.Class({
},
_startTimedLogin: function(userName, delay) {
_startTimedLogin(userName, delay) {
+ this._timedLoginUserName = userName;
this._timedLoginItem = null;
this._timedLoginDelay = delay;
this._timedLoginAnimationTime = delay;
-
let tasks = [function() {
- return this._waitForItemForUser(userName);
- let tasks = [() => this._waitForItemForUser(userName),
+ let tasks = [() => {
+ if (this._disableUserList)
+ return;
+
+ this._timedLoginUserListHold = this._waitForItemForUser(userName);
+
+ return this._timedLoginUserListHold;
},
+ },
function() {
() => {
+ this._timedLoginUserListHold = null;
+
+ if (this._disableUserList)
+ return;
+
this._timedLoginItem = this._userList.getItemFromUserName(userName);
},
function() {
() => {
+ if (this._disableUserList)
+ return;
+
// If we're just starting out, start on the right
// item.
if (!this._userManager.is_loaded) {
@@ -1064,6 +1082,9 @@ var LoginDialog = new Lang.Class({
@@ -1040,6 +1059,9 @@ var LoginDialog = new Lang.Class({
this._blockTimedLoginUntilIdle,
function() {
() => {
+ if (this._disableUserList)
+ return;
+
this._userList.scrollToItem(this._timedLoginItem);
},
@@ -1088,7 +1109,9 @@ var LoginDialog = new Lang.Class({
@@ -1064,7 +1086,9 @@ var LoginDialog = new Lang.Class({
if (this._timedLoginItem)
this._timedLoginItem.hideTimedLoginIndicator();
@ -184,5 +167,5 @@ index c1262b1e8..6f6de00da 100644 @@ -184,5 +167,5 @@ index c1262b1e8..6f6de00da 100644
if (userName)
this._startTimedLogin(userName, this._timedLoginDelay);
--
2.14.2
2.17.1


87
SOURCES/disable-unlock-entry-until-question.patch

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
From f941682d22a0e6f40e1109df8043291398783ff4 Mon Sep 17 00:00:00 2001
From 6a698c70044709e53f1a517165360037c070770d Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Wed, 30 Sep 2015 12:51:24 -0400
Subject: [PATCH 1/3] authPrompt: don't fade out auth messages if user types
@ -12,23 +12,23 @@ front, before a password is asked. @@ -12,23 +12,23 @@ front, before a password is asked.
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
index a436431be..dedf39f99 100644
index 481cd3a77..0ad3d2338 100644
--- a/js/gdm/authPrompt.js
+++ b/js/gdm/authPrompt.js
@@ -185,7 +185,7 @@ var AuthPrompt = new Lang.Class({
@@ -176,7 +176,7 @@ var AuthPrompt = new Lang.Class({
this._updateNextButtonSensitivity(this._entry.text.length > 0);
this._entry.clutter_text.connect('text-changed',
Lang.bind(this, function() {
- if (!this._userVerifier.hasPendingMessages)
+ if (!this._userVerifier.hasPendingMessages && this._queryingService && !this._preemptiveAnswer)
this._fadeOutMessage();
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);
this._updateNextButtonSensitivity(this._entry.text.length > 0 || this.verificationStatus == AuthPromptStatus.VERIFYING);
--
2.14.2
1.8.3.1


From 7b83ebcdc1d667438de5a0f41cb7b194b2792d1f Mon Sep 17 00:00:00 2001
From 867988ad707dfc7a7e2bae2ead774bc7369add8c Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Wed, 30 Sep 2015 14:36:33 -0400
Subject: [PATCH 2/3] authPrompt: don't spin unless answering question
@ -38,24 +38,24 @@ Subject: [PATCH 2/3] authPrompt: don't spin unless answering question @@ -38,24 +38,24 @@ Subject: [PATCH 2/3] authPrompt: don't spin unless answering question
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
index dedf39f99..b3ff91789 100644
index 0ad3d2338..f18ef41f2 100644
--- a/js/gdm/authPrompt.js
+++ b/js/gdm/authPrompt.js
@@ -66,8 +66,8 @@ var AuthPrompt = new Lang.Class({
this.connect('next', Lang.bind(this, function() {
this.updateSensitivity(false);
- this.startSpinning();
if (this._queryingService) {
+ this.startSpinning();
this._userVerifier.answerQuery(this._queryingService, this._entry.text);
} else {
this._preemptiveAnswer = this._entry.text;
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.14.2
1.8.3.1


From 76e455916f6411c695f4528bffbb49c5832ec568 Mon Sep 17 00:00:00 2001
From bcbb4c2044344a6ab4fda5975478b8bee07e01f5 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 5 Oct 2015 15:26:18 -0400
Subject: [PATCH 3/3] authPrompt: stop accepting preemptive answer if user
@ -69,11 +69,11 @@ Typing ahead the password is just a convenience for users who don't @@ -69,11 +69,11 @@ 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 | 38 ++++++++++++++++++++++++++++++++++++++
1 file changed, 38 insertions(+)
js/gdm/authPrompt.js | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)

diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
index b3ff91789..9affbdd5f 100644
index f18ef41f2..89cef4d5d 100644
--- a/js/gdm/authPrompt.js
+++ b/js/gdm/authPrompt.js
@@ -10,6 +10,7 @@ const St = imports.gi.St;
@ -94,21 +94,21 @@ index b3ff91789..9affbdd5f 100644 @@ -94,21 +94,21 @@ index b3ff91789..9affbdd5f 100644
if (this._mode == AuthPromptMode.UNLOCK_ONLY)
reauthenticationOnly = true;
@@ -71,6 +74,11 @@ var AuthPrompt = new Lang.Class({
this._userVerifier.answerQuery(this._queryingService, this._entry.text);
} else {
this._preemptiveAnswer = this._entry.text;
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;
+ }
}
}));
+ if (this._preemptiveAnswerWatchId) {
+ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
+ this._preemptiveAnswerWatchId = 0;
+ }
}
});
@@ -137,6 +145,11 @@ var AuthPrompt = new Lang.Class({
@@ -135,6 +143,11 @@ var AuthPrompt = new Lang.Class({
},
_onDestroy: function() {
_onDestroy() {
+ if (this._preemptiveAnswerWatchId) {
+ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
+ this._preemptiveAnswerWatchId = 0;
@ -117,10 +117,10 @@ index b3ff91789..9affbdd5f 100644 @@ -117,10 +117,10 @@ index b3ff91789..9affbdd5f 100644
this._userVerifier.destroy();
this._userVerifier = null;
},
@@ -358,6 +371,11 @@ var AuthPrompt = new Lang.Class({
@@ -349,6 +362,11 @@ var AuthPrompt = new Lang.Class({
},
setQuestion: function(question) {
setQuestion(question) {
+ if (this._preemptiveAnswerWatchId) {
+ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
+ this._preemptiveAnswerWatchId = 0;
@ -129,11 +129,11 @@ index b3ff91789..9affbdd5f 100644 @@ -129,11 +129,11 @@ index b3ff91789..9affbdd5f 100644
this._label.set_text(question);
this._label.show();
@@ -443,12 +461,32 @@ var AuthPrompt = new Lang.Class({
@@ -434,12 +452,31 @@ var AuthPrompt = new Lang.Class({
}
},
+ _onUserStoppedTypePreemptiveAnswer: function() {
+ _onUserStoppedTypePreemptiveAnswer() {
+ if (!this._preemptiveAnswerWatchId ||
+ this._preemptiveAnswer ||
+ this._queryingService)
@ -146,7 +146,7 @@ index b3ff91789..9affbdd5f 100644 @@ -146,7 +146,7 @@ index b3ff91789..9affbdd5f 100644
+ this.updateSensitivity(false);
+ },
+
reset: function() {
reset() {
let oldStatus = this.verificationStatus;
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
this.cancelButton.reactive = true;
@ -156,12 +156,11 @@ index b3ff91789..9affbdd5f 100644 @@ -156,12 +156,11 @@ index b3ff91789..9affbdd5f 100644
+ this._idleMonitor.remove_watch(this._preemptiveAnswerWatchId);
+ }
+ this._preemptiveAnswerWatchId = this._idleMonitor.add_idle_watch (500,
+ Lang.bind(this,
+ this._onUserStoppedTypePreemptiveAnswer));
+ this._onUserStoppedTypePreemptiveAnswer.bind(this));
+
if (this._userVerifier)
this._userVerifier.cancel();
--
2.14.2
1.8.3.1


30
SOURCES/enforce-smartcard-at-unlock.patch

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
From 59b6d50061f3c8e5858230a881267014e8395594 Mon Sep 17 00:00:00 2001
From b675ef2be8b5938b036714cbe42e9653b348227b Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 28 Sep 2015 10:57:02 -0400
Subject: [PATCH 1/3] smartcardManager: add way to detect if user logged using
@ -16,10 +16,10 @@ This commit adds the necessary api to detect that case. @@ -16,10 +16,10 @@ This commit adds the necessary api to detect that case.
1 file changed, 7 insertions(+)

diff --git a/js/misc/smartcardManager.js b/js/misc/smartcardManager.js
index 4388f286d..75e9836e9 100644
index 60808b371..503f78836 100644
--- a/js/misc/smartcardManager.js
+++ b/js/misc/smartcardManager.js
@@ -113,6 +113,13 @@ var SmartcardManager = new Lang.Class({
@@ -112,6 +112,13 @@ var SmartcardManager = new Lang.Class({
return false;
return true;
@ -34,10 +34,10 @@ index 4388f286d..75e9836e9 100644 @@ -34,10 +34,10 @@ index 4388f286d..75e9836e9 100644
});
--
2.14.2
1.8.3.1


From b25d32c8fef60dec567f05e6681214a6995656fc Mon Sep 17 00:00:00 2001
From 8af02156a99145ebfb5cea9488b78495e25002b8 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 28 Sep 2015 19:56:53 -0400
Subject: [PATCH 2/3] gdm: only unlock with smartcard, if smartcard used for
@ -50,13 +50,13 @@ gets used for unlock, too. @@ -50,13 +50,13 @@ gets used for unlock, too.
1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/js/gdm/util.js b/js/gdm/util.js
index bae46bfe0..a44184c17 100644
index 261e1e433..3d6d69c10 100644
--- a/js/gdm/util.js
+++ b/js/gdm/util.js
@@ -134,7 +134,6 @@ var ShellUserVerifier = new Lang.Class({
this._settings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
this._settings.connect('changed',
Lang.bind(this, this._updateDefaultService));
this._updateDefaultService.bind(this));
- this._updateDefaultService();
this._fprintManager = Fprint.FprintManager();
@ -68,12 +68,12 @@ index bae46bfe0..a44184c17 100644 @@ -68,12 +68,12 @@ index bae46bfe0..a44184c17 100644
+ this._updateDefaultService();
+
this._smartcardInsertedId = this._smartcardManager.connect('smartcard-inserted',
Lang.bind(this, this._checkForSmartcard));
this._checkForSmartcard.bind(this));
this._smartcardRemovedId = this._smartcardManager.connect('smartcard-removed',
@@ -413,7 +414,9 @@ var ShellUserVerifier = new Lang.Class({
@@ -412,7 +413,9 @@ var ShellUserVerifier = new Lang.Class({
},
_updateDefaultService: function() {
_updateDefaultService() {
- if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY))
+ if (this._smartcardManager.loggedInWithToken())
+ this._defaultService = SMARTCARD_SERVICE_NAME;
@ -82,10 +82,10 @@ index bae46bfe0..a44184c17 100644 @@ -82,10 +82,10 @@ index bae46bfe0..a44184c17 100644
else if (this._settings.get_boolean(SMARTCARD_AUTHENTICATION_KEY))
this._defaultService = SMARTCARD_SERVICE_NAME;
--
2.14.2
1.8.3.1


From 3309c476c6815e03f17359155f565118a2ad57b2 Mon Sep 17 00:00:00 2001
From 49557edf36b817e33fb9f008f88e28a805b7665b Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 28 Sep 2015 19:57:36 -0400
Subject: [PATCH 3/3] gdm: update default service when smartcard inserted
@ -98,10 +98,10 @@ after we get a smartcard insertion event. @@ -98,10 +98,10 @@ after we get a smartcard insertion event.
1 file changed, 2 insertions(+)

diff --git a/js/gdm/util.js b/js/gdm/util.js
index a44184c17..83a12fb6c 100644
index 3d6d69c10..f5f9d5e5d 100644
--- a/js/gdm/util.js
+++ b/js/gdm/util.js
@@ -336,6 +336,8 @@ var ShellUserVerifier = new Lang.Class({
@@ -335,6 +335,8 @@ var ShellUserVerifier = new Lang.Class({
else if (this._preemptingService == SMARTCARD_SERVICE_NAME)
this._preemptingService = null;
@ -111,5 +111,5 @@ index a44184c17..83a12fb6c 100644 @@ -111,5 +111,5 @@ index a44184c17..83a12fb6c 100644
}
},
--
2.14.2
1.8.3.1


265
SOURCES/gnome-shell-python3.patch

@ -0,0 +1,265 @@ @@ -0,0 +1,265 @@
From 5e252bd9d9c64cae3ef153338dfdd7638c4cd9e5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=BCllner?= <fmuellner@gnome.org>
Date: Thu, 14 Jun 2018 17:11:30 +0200
Subject: [PATCH] build: Revert Python3 port

This is mostly a revert of commit be3c3c64c1, with slight adjustments
due to the build system switch.
---
meson.build | 2 +-
src/gnome-shell-extension-tool.in | 40 +++++++++++++++---------------
src/gnome-shell-perf-tool.in | 41 ++++++++++++++++---------------
3 files changed, 42 insertions(+), 41 deletions(-)

diff --git a/meson.build b/meson.build
index 978ed6506..663a4d06f 100644
--- a/meson.build
+++ b/meson.build
@@ -137,7 +137,7 @@ if get_option('man')
endif
mutter_typelibdir = mutter_dep.get_pkgconfig_variable('typelibdir')
-python = find_program('python3')
+python = find_program('python2')
sassc = find_program('sassc')
cc = meson.get_compiler('c')
diff --git a/src/gnome-shell-extension-tool.in b/src/gnome-shell-extension-tool.in
index f6c37629c..ab9c951ba 100755
--- a/src/gnome-shell-extension-tool.in
+++ b/src/gnome-shell-extension-tool.in
@@ -14,7 +14,7 @@ except ImportError:
try:
import simplejson as json
except ImportError:
- print('The Python simplejson module is required')
+ print 'The Python simplejson module is required'
sys.exit(1)
from gi.repository import Gio, GLib
@@ -88,36 +88,36 @@ function disable() {
}
def create_extension():
- print()
- print('''Name should be a very short (ideally descriptive) string.
+ print
+ print '''Name should be a very short (ideally descriptive) string.
Examples are: "Click To Focus", "Adblock", "Shell Window Shrinker".
-''')
- name = input('Name: ').strip()
- print()
- print('''Description is a single-sentence explanation of what your extension does.
+'''
+ name = raw_input('Name: ').strip()
+ print
+ print '''Description is a single-sentence explanation of what your extension does.
Examples are: "Make windows visible on click", "Block advertisement popups"
"Animate windows shrinking on minimize"
-''')
- description = input('Description: ').strip()
+'''
+ description = raw_input('Description: ').strip()
underifier = re.compile('[^A-Za-z]')
sample_uuid = underifier.sub('_', name)
# TODO use evolution data server
hostname = socket.gethostname()
sample_uuid = sample_uuid + '@' + hostname
- print()
- print('''Uuid is a globally-unique identifier for your extension.
+ print
+ print '''Uuid is a globally-unique identifier for your extension.
This should be in the format of an email address (foo.bar@extensions.example.com), but
need not be an actual email address, though it's a good idea to base the uuid on your
email address. For example, if your email address is janedoe@example.com, you might
-use an extension title clicktofocus@janedoe.example.com.''')
- uuid = input('Uuid [%s]: ' % (sample_uuid, )).strip()
+use an extension title clicktofocus@janedoe.example.com.'''
+ uuid = raw_input('Uuid [%s]: ' % (sample_uuid, )).strip()
if uuid == '':
uuid = sample_uuid
extension_path = os.path.join(os.path.expanduser('~/.local'), 'share', 'gnome-shell', 'extensions', uuid)
if os.path.exists(extension_path):
- print("Extension path %r already exists" % (extension_path, ))
+ print "Extension path %r already exists" % (extension_path, )
sys.exit(0)
os.makedirs(extension_path)
meta = { 'name': name,
@@ -132,13 +132,13 @@ use an extension title clicktofocus@janedoe.example.com.''')
f.write(json.write(meta) + '\n')
f.close()
- for filename, contents in SAMPLE_EXTENSION_FILES.items():
+ for filename, contents in SAMPLE_EXTENSION_FILES.iteritems():
path = os.path.join(extension_path, filename)
f = open(path, 'w')
f.write(contents)
f.close()
- print("Created extension in %r" % (extension_path, ))
+ print "Created extension in %r" % (extension_path, )
extensionjs_path = os.path.join(extension_path, 'extension.js')
subprocess.Popen(['xdg-open', extensionjs_path])
@@ -149,19 +149,19 @@ def enable_extension(uuid):
extensions = settings.get_strv(ENABLED_EXTENSIONS_KEY)
if uuid in extensions:
- print("%r is already enabled." % (uuid,), file=sys.stderr)
+ print >> sys.stderr, "%r is already enabled." % (uuid,)
sys.exit(1)
extensions.append(uuid)
settings.set_strv(ENABLED_EXTENSIONS_KEY, extensions)
- print("%r is now enabled." % (uuid,), file=sys.stderr)
+ print >> sys.stderr, "%r is now enabled." % (uuid,)
def disable_extension(uuid):
settings = Gio.Settings(schema='org.gnome.shell')
extensions = settings.get_strv(ENABLED_EXTENSIONS_KEY)
if uuid not in extensions:
- print("%r is not enabled or installed." % (uuid,), file=sys.stderr)
+ print >> sys.stderr, "%r is not enabled or installed." % (uuid,)
sys.exit(1)
# Use a while loop here to remove *all* mentions instances
@@ -170,7 +170,7 @@ def disable_extension(uuid):
extensions.remove(uuid)
settings.set_strv(ENABLED_EXTENSIONS_KEY, extensions)
- print("%r is now disabled." % (uuid,), file=sys.stderr)
+ print >> sys.stderr, "%r is now disabled." % (uuid,)
def reload_extension(uuid):
settings = Gio.Settings(schema='org.gnome.shell')
diff --git a/src/gnome-shell-perf-tool.in b/src/gnome-shell-perf-tool.in
index b2a4521a3..55bfdf39f 100755
--- a/src/gnome-shell-perf-tool.in
+++ b/src/gnome-shell-perf-tool.in
@@ -14,14 +14,15 @@ import subprocess
import sys
import tempfile
import base64
-from configparser import RawConfigParser
+from ConfigParser import RawConfigParser
import hashlib
import hmac
-from http import client
-from urllib import parse
+import httplib
+import urlparse
+import urllib
def show_version(option, opt_str, value, parser):
- print("GNOME Shell Performance Test @VERSION@")
+ print "GNOME Shell Performance Test @VERSION@"
sys.exit()
def wait_for_dbus_name(wait_name):
@@ -40,7 +41,7 @@ def wait_for_dbus_name(wait_name):
None)
def on_timeout():
- print("\nFailed to start %s: timed out" % (wait_name,))
+ print "\nFailed to start %s: timed out" % (wait_name,)
sys.exit(1)
GLib.timeout_add_seconds(7, on_timeout)
@@ -130,15 +131,15 @@ def upload_performance_report(report_text):
base_url = config.get('upload', 'url')
system_name = config.get('upload', 'name')
secret_key = config.get('upload', 'key')
- except Exception as e:
- print("Can't read upload configuration from %s: %s" % (config_file, str(e)))
+ except Exception, e:
+ print "Can't read upload configuration from %s: %s" % (config_file, str(e))
sys.exit(1)
# Determine host, port and upload URL from provided data, we're
# a bit extra-careful about normalization since the URL is part
# of the signature.
- split = parse.urlsplit(base_url)
+ split = urlparse.urlsplit(base_url)
scheme = split[0].lower()
netloc = split[1]
base_path = split[2]
@@ -150,7 +151,7 @@ def upload_performance_report(report_text):
host, port = m.group(1), None
if scheme != "http":
- print("'%s' is not a HTTP URL" % base_url)
+ print "'%s' is not a HTTP URL" % base_url
sys.exit(1)
if port is None:
@@ -165,7 +166,7 @@ def upload_performance_report(report_text):
normalized_base = "%s://%s:%d%s" % (scheme, host, port, base_path)
upload_url = normalized_base + '/system/%s/upload' % system_name
- upload_path = parse.urlsplit(upload_url)[2] # path portion
+ upload_path = urlparse.urlsplit(upload_url)[2] # path portion
# Create signature based on upload URL and the report data
@@ -173,7 +174,7 @@ def upload_performance_report(report_text):
h = hmac.new(secret_key, digestmod=hashlib.sha1)
h.update(signature_data)
h.update(report_text)
- signature = parse.quote(base64.b64encode(h.digest()), "~")
+ signature = urllib.quote(base64.b64encode(h.digest()), "~")
headers = {
'User-Agent': 'gnome-shell-performance-tool/@VERSION@',
@@ -181,15 +182,15 @@ def upload_performance_report(report_text):
'X-Shell-Signature': 'HMAC-SHA1 ' + signature
};
- connection = client.HTTPConnection(host, port)
+ connection = httplib.HTTPConnection(host, port)
connection.request('POST', upload_path, report_text, headers)
response = connection.getresponse()
if response.status == 200:
- print("Performance report upload succeeded")
+ print "Performance report upload succeeded"
else:
- print("Performance report upload failed with status %d" % response.status)
- print(response.read())
+ print "Performance report upload failed with status %d" % response.status
+ print response.read()
def gnome_hwtest_log(*args):
command = ['gnome-hwtest-log', '-t', 'gnome-shell-perf-tool']
@@ -206,7 +207,7 @@ def run_performance_test():
start_perf_helper()
- for i in range(0, iters):
+ for i in xrange(0, iters):
# We create an empty temporary file that the shell will overwrite
# with the contents.
handle, output_file = tempfile.mkstemp(".json", "gnome-shell-perf.")
@@ -305,12 +306,12 @@ def run_performance_test():
gnome_hwtest_log('--finished')
else:
# Write a human readable summary
- print('------------------------------------------------------------')
+ print '------------------------------------------------------------';
for metric in sorted(metric_summaries.keys()):
summary = metric_summaries[metric]
- print("#", summary['description'])
- print(metric, ", ".join((str(x) for x in summary['values'])))
- print('------------------------------------------------------------')
+ print "#", summary['description']
+ print metric, ", ".join((str(x) for x in summary['values']))
+ print '------------------------------------------------------------';
return True
--
2.17.1

182
SPECS/gnome-shell.spec

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
Name: gnome-shell
Version: 3.26.2
Release: 5%{?dist}
Version: 3.28.3
Release: 6%{?dist}
Summary: Window management and application launching for GNOME

Group: User Interface/Desktops
@ -8,23 +8,19 @@ License: GPLv2+ @@ -8,23 +8,19 @@ 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.26/%{name}-%{version}.tar.xz
Source0: http://download.gnome.org/sources/gnome-shell/3.28/%{name}-%{version}.tar.xz
Source1: org.gnome.shell.gschema.override
Source2: https://github.com/sass/sassc/archive/3.4.1.tar.gz
Source3: https://github.com/sass/libsass/archive/3.4.5.tar.gz

# 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

# el7 build fixes
Patch5: 0001-Revert-build-Drop-autotools-support.patch
Patch6: 0002-Revert-build-Remove-included-Makefiles-as-well.patch
Patch7: 0003-build-Remove-check-for-missing-disthook.patch
Patch8: 0004-Revert-build-Use-new-mkenums_simple-function.patch
# Fix the build with Python 2
Patch4: gnome-shell-python3.patch

# GDM/Lock stuff
Patch10: 0001-gdm-honor-timed-login-delay-even-if-animations-disab.patch
Patch11: 0001-gdm-use-password-authentication-if-all-schemes-are-d.patch
Patch12: 0001-screenShield-unblank-when-inserting-smartcard.patch
Patch13: enforce-smartcard-at-unlock.patch
Patch14: disable-unlock-entry-until-question.patch
@ -33,60 +29,59 @@ Patch16: 0001-data-install-process-working.svg-to-filesystem.patch @@ -33,60 +29,59 @@ 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
Patch20: 0001-loginDialog-only-emit-session-activated-on-user-acti.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-magnifier-don-t-spew-to-console-when-focus-moves-aro.patch
Patch33: 0001-extensionSystem-Notify-about-extension-issues-on-upd.patch
Patch34: 0001-panel-add-an-icon-to-the-ActivitiesButton.patch
Patch35: 0001-app-Fall-back-to-window-title-instead-of-WM_CLASS.patch
Patch36: 0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch
Patch37: 0001-global-Allow-overriding-the-override-schema.patch
Patch38: 0001-system-don-t-throw-an-exception-if-power-off-disable.patch
Patch39: 0001-padOsd-Ensure-to-pick-pad-devices-only.patch
Patch39: 0001-appDisplay-Show-full-app-name-on-hover.patch

%define gnome_bluetooth_version 1:3.9.0
%define gobject_introspection_version 1.45.4
%define gjs_version 1.47.0
%define mutter_version 3.25.90
%define gtk3_version 3.15.0
%define eds_version 3.13.90
# Backported from upstream
Patch50: 0001-keyboard-Handle-no-window-case-in-FocusTracker.patch

Patch51: 0001-keyboard-Listen-to-IbusPanelService-focus-in-out-to-.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.51.90
%define gtk3_version 3.15.0
%define json_glib_version 0.13.2
%define mutter_version 3.28.0
%define polkit_version 0.100
%define gsettings_desktop_schemas_version 3.21.3
%define caribou_version 0.4.8
%define libcroco_version 0.6.8
%define telepathy_logger_version 0.2.6
%define ibus_version 1.5.2
%define gnome_bluetooth_version 1:3.9.0
%define gstreamer_version 1.4.5

## Needed when we re-autogen
BuildRequires: autoconf >= 2.53
BuildRequires: automake >= 1.10
BuildRequires: gettext-devel
BuildRequires: meson
BuildRequires: git
BuildRequires: gnome-common >= 2.2.0
BuildRequires: libtool >= 1.4.3
BuildRequires: caribou-devel >= %{caribou_version}
BuildRequires: ibus-devel >= %{ibus_version}
BuildRequires: chrpath
BuildRequires: dbus-glib-devel
BuildRequires: desktop-file-utils
BuildRequires: evolution-data-server-devel >= %{eds_version}
BuildRequires: gcr-devel
BuildRequires: gjs-devel >= %{gjs_version}
BuildRequires: glib2-devel
BuildRequires: glib2-devel >= %{glib2_version}
BuildRequires: gobject-introspection >= %{gobject_introspection_version}
BuildRequires: json-glib-devel >= %{json_glib_version}
BuildRequires: upower-devel
BuildRequires: libgnome-keyring-devel
BuildRequires: libnm-gtk-devel
BuildRequires: mesa-libGL-devel
BuildRequires: NetworkManager-glib-devel
BuildRequires: polkit-devel
BuildRequires: NetworkManager-libnm-devel
BuildRequires: pkgconfig(libsystemd)
BuildRequires: polkit-devel >= %{polkit_version}
BuildRequires: startup-notification-devel
BuildRequires: telepathy-glib-devel
BuildRequires: telepathy-logger-devel >= %{telepathy_logger_version}
# for theme generation
BuildRequires: ruby
# for screencast recorder functionality
BuildRequires: gstreamer1-devel >= %{gstreamer_version}
BuildRequires: gtk3-devel >= %{gtk3_version}
@ -110,34 +105,39 @@ BuildRequires: gnome-bluetooth-libs-devel >= %{gnome_bluetooth_version} @@ -110,34 +105,39 @@ BuildRequires: gnome-bluetooth-libs-devel >= %{gnome_bluetooth_version}
%endif
BuildRequires: control-center
# Bootstrap requirements
BuildRequires: gtk-doc gnome-common
BuildRequires: gtk-doc
%ifnarch s390 s390x
Requires: gnome-bluetooth%{?_isa} >= %{gnome_bluetooth_version}
%endif
Requires: gnome-desktop3%{?_isa} >= %{gnome_desktop_version}
%if 0%{?fedora}
# Disabled on RHEL 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}
# needed as it is now split from Clutter
Requires: json-glib%{?_isa} >= %{json_glib_version}
# For $libdir/mozilla/plugins
Requires: mozilla-filesystem%{?_isa}
Requires: mutter%{?_isa} >= %{mutter_version}
Requires: upower%{?_isa}
Requires: polkit%{?_isa} >= 0.100
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: telepathy-logger%{?_isa} >= %{telepathy_logger_version}
Requires: telepathy-logger%{?_isa}
Requires: telepathy-glib%{?_isa}
Requires: gstreamer1%{?_isa} >= %{gstreamer_version}
# needed for schemas
Requires: at-spi2-atk%{?_isa}
# needed for on-screen keyboard
Requires: caribou%{?_isa} >= %{caribou_version}
Requires: ibus%{?_isa} >= %{ibus_version}
# needed for the user menu
Requires: accountsservice-libs%{?_isa}
Requires: gdm-libs%{?_isa}
@ -154,6 +154,23 @@ Requires: python3%{_isa} @@ -154,6 +154,23 @@ Requires: python3%{_isa}
# needed for clocks/weather integration
Requires: geoclue2-libs%{?_isa}
Requires: libgweather%{?_isa}
# Needed for launching flatpak apps etc
Requires: xdg-desktop-portal-gtk

%if 0%{?rhel}
# In Fedora, fedora-obsolete-packages obsoletes caribou
Obsoletes: caribou < 0.4.21-10
Obsoletes: caribou-antler < 0.4.21-10
Obsoletes: caribou-devel < 0.4.21-10
Obsoletes: caribou-gtk2-module < 0.4.21-10
Obsoletes: caribou-gtk3-module < 0.4.21-10
Obsoletes: python-caribou < 0.4.21-10
Obsoletes: python2-caribou < 0.4.21-10
Obsoletes: python3-caribou < 0.4.21-10

# Removed in RHEL 7.6
Obsoletes: gnome-shell-browser-plugin < 3.28.3-4
%endif

%description
GNOME Shell provides core user interface functions for the GNOME 3 desktop,
@ -162,34 +179,26 @@ advantage of the capabilities of modern graphics hardware and introduces @@ -162,34 +179,26 @@ advantage of the capabilities of modern graphics hardware and introduces
innovative user interface concepts to provide a visually attractive and
easy to use experience.

%package browser-plugin
Summary: Browser plugin to install extensions from extensions.gnome.org
Requires: %{name} = %{version}-%{release}
Requires: mozilla-filesystem%{?_isa}

%description browser-plugin
The "GNOME Shell Integration" plugin provides integration with
Gnome Shell for live extension enabling and disabling. It can
be used only by extensions.gnome.org.

%prep
%setup -q -n libsass-3.4.5 -b3 -T
%setup -q -n sassc-3.4.1 -b2 -T
%autosetup -S git

%build
%if 0%{?rhel}
# Use Python 2
sed -i -e 's/AM_PATH_PYTHON(\[3\])/AM_PATH_PYTHON([2.5])/' configure.ac
autoreconf -fi
%endif

(if ! test -x configure; then NOCONFIGURE=1 ./autogen.sh; fi;
%configure --disable-static --disable-compile-warnings)
make V=1 %{?_smp_mflags}
(cd ../libsass-3.4.5;
export LIBSASS_VERSION=3.4.5
make %{?_smp_mflags})
(cd ../sassc-3.4.1;
%make_build LDFLAGS="$RPM_OPT_FLAGS $PWD/../libsass-3.4.5/lib/libsass.a" \
CFLAGS="$RPM_OPT_FLAGS -I$PWD/../libsass-3.4.5/include" \
CXXFLAGS="$RPM_OPT_FLAGS" \
SASS_LIBSASS_PATH=$PWD/../libsass-3.4.5)
export PATH=$PWD/../sassc-3.4.1/bin:$PATH
%meson -Dbrowser_plugin=false
%meson_build

%install
%make_install

rm -rf %{buildroot}/%{_libdir}/mozilla/plugins/*.la
%meson_install

# Create empty directories where other packages can drop extensions
mkdir -p %{buildroot}%{_datadir}/gnome-shell/extensions
@ -224,9 +233,7 @@ glib-compile-schemas --allow-any-name %{_datadir}/glib-2.0/schemas &> /dev/null @@ -224,9 +233,7 @@ glib-compile-schemas --allow-any-name %{_datadir}/glib-2.0/schemas &> /dev/null
%{_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}/gnome-shell/theme
%{_datadir}/gnome-shell/theme/*.svg
%{_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
@ -250,13 +257,44 @@ glib-compile-schemas --allow-any-name %{_datadir}/glib-2.0/schemas &> /dev/null @@ -250,13 +257,44 @@ glib-compile-schemas --allow-any-name %{_datadir}/glib-2.0/schemas &> /dev/null
%dir %{_datadir}/GConf/gsettings
%{_datadir}/GConf/gsettings/gnome-shell-overrides.convert
%{_mandir}/man1/%{name}.1.gz
# exclude as these should be in a devel package for st etc
%exclude %{_datadir}/gtk-doc

%files browser-plugin
%{_libdir}/mozilla/plugins/*.so

%changelog
* Wed Sep 19 2018 Carlos Garnacho <cgarnach@redhat.com> - 3.28.3-6
- Track IBus focus for X11 OSK
- Resolves: #1625700

* Thu Sep 13 2018 Kalev Lember <klember@redhat.com> - 3.28.3-5
- Require xdg-desktop-portal-gtk
- Related: #1570030

* Mon Sep 10 2018 Kalev Lember <klember@redhat.com> - 3.28.3-4
- Remove gnome-shell-browser-plugin subpackage
- Resolves: #1626104

* Mon Sep 10 2018 Kalev Lember <klember@redhat.com> - 3.28.3-3
- Obsolete caribou
- Resolves: #1625882

* Tue Sep 04 2018 Kalev Lember <klember@redhat.com> - 3.28.3-2
- keyboard: Handle no-window case in FocusTracker
- Resolves: #1612983

* Wed Aug 01 2018 Kalev Lember <klember@redhat.com> - 3.28.3-1
- Update to 3.28.3
- Resolves: #1568624

* Fri Jun 22 2018 Florian Müllner <fmuellner@redhat.com> - 3.28.2-2
- Update rebased downstream patches
Related: #1568624
- Revert port to python3 of some utility tools
Resolves: #1493526
- Add tooltips to app names in overview
Resolves: #1541180

* Tue May 08 2018 Florian Müllner <fmuellner@redhat.com> - 3.28.2-1
- Update to 3.28.2
- Resolves: #1568624

* Wed Feb 14 2018 Ray Strode <rstrode@redhat.com> - 3.26.2-5
- Make session selection bullet isn't shown on wrong item
Resolves: #1527145

Loading…
Cancel
Save