From b91185d2ae4601b122f6b28ab2bb83a851fbf465 Mon Sep 17 00:00:00 2001 From: guibuilder_pel7x64builder0 Date: Mon, 26 Nov 2018 11:32:45 +0100 Subject: [PATCH] gnome-shell package update Signed-off-by: guibuilder_pel7x64builder0 --- ...pDisplay-Show-full-app-name-on-hover.patch | 111 +++++ ...ll-process-working.svg-to-filesystem.patch | 120 ++++- ...ns-Add-a-SESSION_MODE-extension-type.patch | 107 ++++- SOURCES/0001-gdm-add-AuthList-control.patch | 57 ++- ...Allow-overriding-the-override-schema.patch | 421 +++++++++++++++++- ...andle-no-window-case-in-FocusTracker.patch | 55 +++ ...to-IbusPanelService-focus-in-out-to-.patch | 67 +++ ...oginDialog-make-info-messages-themed.patch | 63 +-- ...-add-an-icon-to-the-ActivitiesButton.patch | 160 +++++-- ...eld-unblank-when-inserting-smartcard.patch | 12 +- ...DBus-method-to-load-a-single-extensi.patch | 4 +- ...ow-an-exception-if-power-off-disable.patch | 22 +- ...-back-workspaces-submenu-for-static-.patch | 16 +- ...upport-for-GDM-s-ChoiceList-PAM-exte.patch | 97 ++-- .../allow-timed-login-with-no-user-list.patch | 139 +++--- .../disable-unlock-entry-until-question.patch | 87 ++-- SOURCES/enforce-smartcard-at-unlock.patch | 30 +- SOURCES/gnome-shell-python3.patch | 265 +++++++++++ SPECS/gnome-shell.spec | 182 +++++--- 19 files changed, 1586 insertions(+), 429 deletions(-) create mode 100644 SOURCES/0001-appDisplay-Show-full-app-name-on-hover.patch create mode 100644 SOURCES/0001-keyboard-Handle-no-window-case-in-FocusTracker.patch create mode 100644 SOURCES/0001-keyboard-Listen-to-IbusPanelService-focus-in-out-to-.patch create mode 100644 SOURCES/gnome-shell-python3.patch diff --git a/SOURCES/0001-appDisplay-Show-full-app-name-on-hover.patch b/SOURCES/0001-appDisplay-Show-full-app-name-on-hover.patch new file mode 100644 index 0000000..c8c9493 --- /dev/null +++ b/SOURCES/0001-appDisplay-Show-full-app-name-on-hover.patch @@ -0,0 +1,111 @@ +From 2b643e95ed25fff907d46591dd7acd8ae86cf5e4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Thu, 21 Jun 2018 18:03:31 +0200 +Subject: [PATCH] appDisplay: Show full app name on hover + +--- + data/theme/gnome-shell-sass/_common.scss | 8 ++++ + js/ui/appDisplay.js | 48 ++++++++++++++++++++++++ + 2 files changed, 56 insertions(+) + +diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss +index 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 + diff --git a/SOURCES/0001-data-install-process-working.svg-to-filesystem.patch b/SOURCES/0001-data-install-process-working.svg-to-filesystem.patch index d679b3a..8d5f874 100644 --- a/SOURCES/0001-data-install-process-working.svg-to-filesystem.patch +++ b/SOURCES/0001-data-install-process-working.svg-to-filesystem.patch @@ -1,4 +1,4 @@ -From fa1ec00431d9c0b1592e1b7c56784ef8d8c26a98 Mon Sep 17 00:00:00 2001 +From 77663ec7d0391254ff6e5afb73257d075fcb109e Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 8 Jun 2017 12:04:31 -0400 Subject: [PATCH] data: install process-working.svg to filesystem @@ -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 diff --git a/SOURCES/0001-extensions-Add-a-SESSION_MODE-extension-type.patch b/SOURCES/0001-extensions-Add-a-SESSION_MODE-extension-type.patch index 2aeccd0..433f7aa 100644 --- a/SOURCES/0001-extensions-Add-a-SESSION_MODE-extension-type.patch +++ b/SOURCES/0001-extensions-Add-a-SESSION_MODE-extension-type.patch @@ -1,4 +1,4 @@ -From 446b7a65536ea60b75f1ec705cd8fa287fda968e Mon Sep 17 00:00:00 2001 +From 7002431540fb01c8ce6bd8781e35ba1072741d94 Mon Sep 17 00:00:00 2001 From: Rui Matos Date: Fri, 8 Nov 2013 13:58:09 +0100 Subject: [PATCH] extensions: Add a SESSION_MODE extension type @@ -11,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 }; // 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 diff --git a/SOURCES/0001-gdm-add-AuthList-control.patch b/SOURCES/0001-gdm-add-AuthList-control.patch index 44e3586..a997bec 100644 --- a/SOURCES/0001-gdm-add-AuthList-control.patch +++ b/SOURCES/0001-gdm-add-AuthList-control.patch @@ -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 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, 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 +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 + 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 +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 + 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 + + 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 + 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 + adjustment.set_value(value); + }, + -+ getItem: function(key) { ++ getItem(key) { + let item = this._items[key]; + + if (!item) @@ -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 + 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 + 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 +}); +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 gdm/batch.js gdm/fingerprint.js -- -2.14.2 +2.17.1 diff --git a/SOURCES/0001-global-Allow-overriding-the-override-schema.patch b/SOURCES/0001-global-Allow-overriding-the-override-schema.patch index 0889d0e..3701383 100644 --- a/SOURCES/0001-global-Allow-overriding-the-override-schema.patch +++ b/SOURCES/0001-global-Allow-overriding-the-override-schema.patch @@ -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?= -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 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 + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + #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 #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 { 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 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 + #endif + + #if defined __OpenBSD__ || defined __FreeBSD__ + #include + #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 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 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 "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 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 diff --git a/SOURCES/0001-keyboard-Handle-no-window-case-in-FocusTracker.patch b/SOURCES/0001-keyboard-Handle-no-window-case-in-FocusTracker.patch new file mode 100644 index 0000000..32833d2 --- /dev/null +++ b/SOURCES/0001-keyboard-Handle-no-window-case-in-FocusTracker.patch @@ -0,0 +1,55 @@ +From 6a796675bd7815087881b799ff5fc79e9ce2b0bf Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +Date: Mon, 16 Jul 2018 23:36:38 +0000 +Subject: [PATCH] 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 + diff --git a/SOURCES/0001-keyboard-Listen-to-IbusPanelService-focus-in-out-to-.patch b/SOURCES/0001-keyboard-Listen-to-IbusPanelService-focus-in-out-to-.patch new file mode 100644 index 0000000..7b52b2e --- /dev/null +++ b/SOURCES/0001-keyboard-Listen-to-IbusPanelService-focus-in-out-to-.patch @@ -0,0 +1,67 @@ +From 04a4a100e34e3ce8c34212ebb79e77b92ef8238d Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +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 + diff --git a/SOURCES/0001-loginDialog-make-info-messages-themed.patch b/SOURCES/0001-loginDialog-make-info-messages-themed.patch index 4f5dd71..2b39a2a 100644 --- a/SOURCES/0001-loginDialog-make-info-messages-themed.patch +++ b/SOURCES/0001-loginDialog-make-info-messages-themed.patch @@ -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 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 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 diff --git a/SOURCES/0001-panel-add-an-icon-to-the-ActivitiesButton.patch b/SOURCES/0001-panel-add-an-icon-to-the-ActivitiesButton.patch index 07929ab..b5bbdb8 100644 --- a/SOURCES/0001-panel-add-an-icon-to-the-ActivitiesButton.patch +++ b/SOURCES/0001-panel-add-an-icon-to-the-ActivitiesButton.patch @@ -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 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 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 diff --git a/SOURCES/0001-screenShield-unblank-when-inserting-smartcard.patch b/SOURCES/0001-screenShield-unblank-when-inserting-smartcard.patch index 4e78dcb..cbe3819 100644 --- a/SOURCES/0001-screenShield-unblank-when-inserting-smartcard.patch +++ b/SOURCES/0001-screenShield-unblank-when-inserting-smartcard.patch @@ -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 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. 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 diff --git a/SOURCES/0001-shellDBus-Add-a-DBus-method-to-load-a-single-extensi.patch b/SOURCES/0001-shellDBus-Add-a-DBus-method-to-load-a-single-extensi.patch index 5e3f861..ba1ef79 100644 --- a/SOURCES/0001-shellDBus-Add-a-DBus-method-to-load-a-single-extensi.patch +++ b/SOURCES/0001-shellDBus-Add-a-DBus-method-to-load-a-single-extensi.patch @@ -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 + ShellVersion: Config.PACKAGE_VERSION, - _extensionStateChanged: function(_, newState) { + _extensionStateChanged(_, newState) { -- 2.14.2 diff --git a/SOURCES/0001-system-don-t-throw-an-exception-if-power-off-disable.patch b/SOURCES/0001-system-don-t-throw-an-exception-if-power-off-disable.patch index 0c6d5fe..8b4ced5 100644 --- a/SOURCES/0001-system-don-t-throw-an-exception-if-power-off-disable.patch +++ b/SOURCES/0001-system-don-t-throw-an-exception-if-power-off-disable.patch @@ -1,6 +1,6 @@ -From 3ff1be9fe127a51092b1f5b97d65af7fff75041d Mon Sep 17 00:00:00 2001 -From: 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?= +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 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 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 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 diff --git a/SOURCES/0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch b/SOURCES/0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch index f5ff41f..395c2a0 100644 --- a/SOURCES/0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch +++ b/SOURCES/0001-windowMenu-Bring-back-workspaces-submenu-for-static-.patch @@ -1,4 +1,4 @@ -From 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?= Date: Tue, 14 Mar 2017 17:04:36 +0100 Subject: [PATCH] windowMenu: Bring back workspaces submenu for static @@ -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 + 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 } -- -2.14.2 +2.17.1 diff --git a/SOURCES/0002-gdmUtil-enable-support-for-GDM-s-ChoiceList-PAM-exte.patch b/SOURCES/0002-gdmUtil-enable-support-for-GDM-s-ChoiceList-PAM-exte.patch index 1c1bbd7..2e8eb33 100644 --- a/SOURCES/0002-gdmUtil-enable-support-for-GDM-s-ChoiceList-PAM-exte.patch +++ b/SOURCES/0002-gdmUtil-enable-support-for-GDM-s-ChoiceList-PAM-exte.patch @@ -1,19 +1,18 @@ -From 1383483a7c9707c2528c5a47fd71217cf253c6ff Mon Sep 17 00:00:00 2001 +From e5214fb2992c1ef5d8bde63295d9f54dbb3daa24 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Mon, 17 Jul 2017 16:48:03 -0400 -Subject: [PATCH 2/2] gdmUtil: enable support for GDM's ChoiceList PAM - extension +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 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 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 + 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 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 + }); + }, + -+ 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 + 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 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 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 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 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 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 + } + + 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 diff --git a/SOURCES/allow-timed-login-with-no-user-list.patch b/SOURCES/allow-timed-login-with-no-user-list.patch index 279a55b..8cdeb14 100644 --- a/SOURCES/allow-timed-login-with-no-user-list.patch +++ b/SOURCES/allow-timed-login-with-no-user-list.patch @@ -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 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 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 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 + 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 } }, -@@ -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 if (userName) this._startTimedLogin(userName, this._timedLoginDelay); -- -2.14.2 +2.17.1 diff --git a/SOURCES/disable-unlock-entry-until-question.patch b/SOURCES/disable-unlock-entry-until-question.patch index 50ffcc2..da16a72 100644 --- a/SOURCES/disable-unlock-entry-until-question.patch +++ b/SOURCES/disable-unlock-entry-until-question.patch @@ -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 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. 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 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 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 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 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 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 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 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 + 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 + 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 diff --git a/SOURCES/enforce-smartcard-at-unlock.patch b/SOURCES/enforce-smartcard-at-unlock.patch index 07782e2..6206154 100644 --- a/SOURCES/enforce-smartcard-at-unlock.patch +++ b/SOURCES/enforce-smartcard-at-unlock.patch @@ -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 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. 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 }); -- -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 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. 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 + 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 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 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. 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 } }, -- -2.14.2 +1.8.3.1 diff --git a/SOURCES/gnome-shell-python3.patch b/SOURCES/gnome-shell-python3.patch new file mode 100644 index 0000000..8211466 --- /dev/null +++ b/SOURCES/gnome-shell-python3.patch @@ -0,0 +1,265 @@ +From 5e252bd9d9c64cae3ef153338dfdd7638c4cd9e5 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Florian=20M=C3=BCllner?= +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 + diff --git a/SPECS/gnome-shell.spec b/SPECS/gnome-shell.spec index 8b04859..e9c1898 100644 --- a/SPECS/gnome-shell.spec +++ b/SPECS/gnome-shell.spec @@ -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+ 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 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} %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} # 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 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 %{_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 %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 - 3.28.3-6 +- Track IBus focus for X11 OSK +- Resolves: #1625700 + +* Thu Sep 13 2018 Kalev Lember - 3.28.3-5 +- Require xdg-desktop-portal-gtk +- Related: #1570030 + +* Mon Sep 10 2018 Kalev Lember - 3.28.3-4 +- Remove gnome-shell-browser-plugin subpackage +- Resolves: #1626104 + +* Mon Sep 10 2018 Kalev Lember - 3.28.3-3 +- Obsolete caribou +- Resolves: #1625882 + +* Tue Sep 04 2018 Kalev Lember - 3.28.3-2 +- keyboard: Handle no-window case in FocusTracker +- Resolves: #1612983 + +* Wed Aug 01 2018 Kalev Lember - 3.28.3-1 +- Update to 3.28.3 +- Resolves: #1568624 + +* Fri Jun 22 2018 Florian Müllner - 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 - 3.28.2-1 +- Update to 3.28.2 +- Resolves: #1568624 + * Wed Feb 14 2018 Ray Strode - 3.26.2-5 - Make session selection bullet isn't shown on wrong item Resolves: #1527145