Hello community,

here is the log from the commit of package gnome-shell for openSUSE:Factory 
checked in at 2016-09-11 00:52:09
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gnome-shell (Old)
 and      /work/SRC/openSUSE:Factory/.gnome-shell.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "gnome-shell"

Changes:
--------
--- /work/SRC/openSUSE:Factory/gnome-shell/gnome-shell.changes  2016-08-25 
09:51:00.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.gnome-shell.new/gnome-shell.changes     
2016-09-11 00:52:12.000000000 +0200
@@ -22,0 +23,7 @@
+Tue Aug  2 18:42:24 CST 2016 - cxi...@suse.com
+
+- Update gs-fate318433-prevent-same-account-multi-logins.patch:
+  Make cancel button usable after login forbidden (bnc#991051,
+  fate#318433).
+
+-------------------------------------------------------------------
@@ -50,0 +58,27 @@
+Fri May 27 18:44:02 CST 2016 - cxi...@suse.com
+
+- Add gs-fate318433-prevent-same-account-multi-logins.patch:
+  Prevent multiple simultaneous logins (Requires patched
+  accountsservice)(fate#318433).
+
+-------------------------------------------------------------------
+Mon May 23 16:18:24 CST 2016 - cxi...@suse.com
+
+- Update to GNOME 3.20.2 fate#318572
+  + Fix SPEC file issues: remove unused files.
+
+-------------------------------------------------------------------
+Mon May 23 09:08:12 UTC 2016 - ty...@suse.com
+
+- Add gnome-shell-970480-authprompt-wrapping-message.patch:
+  Fix the wrapping error message issue when user password change
+  operation fails in gdm greeter (bnc#970480).
+
+-------------------------------------------------------------------
+Fri May 20 03:41:32 UTC 2016 - ty...@suse.com
+
+- Update gnome-shell-878951-hide-list-with-no-user.patch:
+  Disable the user list if there is only root created (bnc#878951,
+  bnc#980451)
+
+-------------------------------------------------------------------
@@ -71,0 +106,68 @@
+Mon May  9 16:24:51 CST 2016 - cxi...@suse.com
+
+- SLE Classic Fixes (REBASING DONE)
+  + MERGED gnome-shell-sle-multiple-fixes.patch
+  + Enable window-list extension in SLE Classic (fix for previous
+    negligence)
+  + Add support for AppMenu auto-toggling
+  + Simplify patch and SLEClassicExt.js code
+
+-------------------------------------------------------------------
+Wed May  4 17:03:53 CST 2016 - cxi...@suse.com
+
+- Rebase SLE Classic (basic) Fate#318572
+  + DROPPED bnc963119-sle-fix-menu-navigation.patch
+    Keyboard navigation is possible in upstream now, though weird.
+  + RENAMED&UPDATED sle-classic-ext.patch to
+    gs-sle-classic-ext.patch.
+  + UPDATED SLEClassicExt.js.
+
+-------------------------------------------------------------------
+Tue Apr 19 08:46:32 UTC 2016 - idon...@suse.com
+
+- Re-enable theming
+
+-------------------------------------------------------------------
+Mon Apr 18 21:22:45 CST 2016 - cxi...@suse.com
+
+- Reviewing all none-SLE-classic patches
+- Rebase: the following patches are rebased to newer versions
+  + gnome-shell-gdm-login-applet.patch
+  + gnome-shell-domain.patch
+  + gnome-shell-878951-hide-list-with-no-user.patch
+  + gnome-shell-screen-disappear.patch
+  + endSession-dialog-update-time-label-every-sec.patch
+  + gnome-shell-864872-unlock-by-mouse-motion.patch
+  + gnome-shell-lock-bg-on-primary.patch
+- DROPPED: Upstreamed Patches
+  + gnome-shell-use-env-var-for-mode.patch
+  + gnome-shell-defer-loading-userlist.patch
+  + wired-connection-status.patch
+  + gnome-shell-login-focus-lost.patch
+  + gnome-shell-874712-use-upower-directly.patch
+  + vpn-indicator-and-menu-general-fix.patch
+  + gnome-shell-calendar-fix-week-number.patch
+  + gnome-shell-917489-only-set-scaling-factor-if-present.patch
+  + dont-start-searchprovider-at-login.patch
+  + background-image-caching-fix.patch
+  + gnome-shell-933768-fix-leaked-signals-in-login-screen.patch
+  + gnome-shell-875481-banner-message.patch
+- DROPPED: Invalid, no long applicable in newer versions
+  + gnome-shell-right-bg-with-resolution-change.patch
+  + gnome-shell-prompt-twice.patch
+  + gnome-shell-background-image-change.patch
+  + gnome-shell-940159-user-logout-issue.patch
+  + add-some-indicating-text-to-logout-menu.patch
+- DROPPED: low priority and low patch quality
+  + login-prompt-preserve-session-choice.patch
+  + 898359-fix-clutter-modal-dialog-integration-with-screenshield.patch
+  - bnc948802-fix-user-logout-dialog-icon.patch
+
+-------------------------------------------------------------------
+Fri Apr 15 21:01:23 CEST 2016 - h...@suse.com
+
+- Update to GNOME 3.20 - Fate#318572.
+- Temporarily disable all SLE patches. These will be rebased in a
+  later update.
+
+-------------------------------------------------------------------
@@ -109,0 +212,7 @@
+Wed Feb 24 12:38:53 CST 2016 - cxi...@suse.com
+
+- Add bnc963119-sle-fix-menu-navigation.patch:
+  Fix the missing initial keyboard navigation for panel menus like
+  application menu (bnc#963119).
+
+-------------------------------------------------------------------
@@ -153,0 +263,7 @@
+Mon Feb  1 10:33:36 UTC 2016 - cxi...@suse.com
+
+- Update 898359-fix-clutter-modal-dialog-integration-with-screenshield.patch
+  Do not manage the modal dialog positions on login screen to avoid
+  the power dialog from disappearing (bnc#961920).
+
+-------------------------------------------------------------------
@@ -180,0 +297,7 @@
+Thu Nov 26 01:28:03 CET 2015 - h...@suse.com
+
+- Update gnome-shell-lock-bg-on-primary.patch (bsc#939315). This
+  prevents flickering on non-primary monitors when unlocking the
+  screen lock.
+
+-------------------------------------------------------------------
@@ -208,0 +332,6 @@
+Wed Nov 18 03:46:20 UTC 2015 - cxi...@suse.com
+
+- Add bnc948802-fix-user-logout-dialog-icon.patch
+  (bnc#948802) Fix user logout screen icon misalignment.
+
+-------------------------------------------------------------------
@@ -243,0 +373,6 @@
+Fri Oct 30 08:41:52 UTC 2015 - ty...@suse.com
+
+- Add gnome-shell-940159-user-logout-issue.patch
+  Fix user logout causes black screen when switching.(bnc#940159)
+
+-------------------------------------------------------------------
@@ -272,0 +408,7 @@
+Wed Sep  9 08:23:07 UTC 2015 - ty...@suse.com
+
+- Add gnome-shell-875481-banner-message.patch
+  GDM can't use banner message when disable userlist.
+  (bnc#875481 bgo#703972)
+
+-------------------------------------------------------------------
@@ -298,0 +441,16 @@
+Fri Aug 14 11:45:51 UTC 2015 - cxi...@suse.com
+
+- Add 898359-fix-clutter-modal-dialog-integration-with-screenshield.patch
+  (bnc#898359) Two measures are implemented:
+  1. Disable most keys (including lock screen) for
+     "endSessionDialog", e.g.  logout, power off and etc.
+  2. Make sure screenShield covers all Clutter Modal dialog.
+
+-------------------------------------------------------------------
+Thu Jul 30 09:21:40 UTC 2015 - fezh...@suse.com
+
+- Add gnome-shell-933768-fix-leaked-signals-in-login-screen.patch:
+  Fix leaked signals which also causes login screen hangs after 3
+  failed user verifications (bsc#933768, bgo#738256).
+
+-------------------------------------------------------------------
@@ -363,0 +522,7 @@
+Wed Jun 17 10:34:45 UTC 2015 - cxi...@suse.com
+
+- Add background-image-caching-fix.patch:
+  Fix a bug in image caching that results in malfunction in
+  background update (bnc#926800).
+
+-------------------------------------------------------------------
@@ -412,0 +578,8 @@
+Tue Mar 31 12:01:41 UTC 2015 - cxi...@suse.com
+
+- Add dont-start-searchprovider-at-login.patch:
+  + Inhibit autostart for search providers at login to have correct
+    process hierarchy for Nautilus, which is essential for various
+    environment vars and CWD setup (bnc#897153 bgo#708830).
+
+-------------------------------------------------------------------
@@ -453,0 +627,7 @@
+Fri Mar  6 23:04:08 CET 2015 - h...@suse.com
+
+- Add gnome-shell-917489-only-set-scaling-factor-if-present.patch
+  (bsc#917489). This prevents UI elements from being displayed
+  squashed, jumbled or off-screen.
+
+-------------------------------------------------------------------
@@ -509,0 +690,6 @@
+Mon Feb 16 10:18:12 UTC 2015 - fcro...@suse.com
+
+- Add gnome-shell-calendar-fix-week-number.patch : Fix week number
+  computation (bgo#736722 bsc#916534 boo#918046).
++++ 236 more lines (skipped)
++++ between /work/SRC/openSUSE:Factory/gnome-shell/gnome-shell.changes
++++ and /work/SRC/openSUSE:Factory/.gnome-shell.new/gnome-shell.changes

New:
----
  SLE-theme.tar.gz
  SLEClassicExt.js
  endSession-dialog-update-time-label-every-sec.patch
  gnome-shell-864872-unlock-by-mouse-motion.patch
  gnome-shell-878951-hide-list-with-no-user.patch
  gnome-shell-970480-authprompt-wrapping-message.patch
  gnome-shell-domain.patch
  gnome-shell-gdm-login-applet.patch
  gnome-shell-lock-bg-on-primary.patch
  gnome-shell-screen-disappear.patch
  gnome-shell-sle-theme.patch
  gs-fate318433-prevent-same-account-multi-logins.patch
  gs-sle-classic-ext.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gnome-shell.spec ++++++
--- /var/tmp/diff_new_pack.CJRrSp/_old  2016-09-11 00:52:13.000000000 +0200
+++ /var/tmp/diff_new_pack.CJRrSp/_new  2016-09-11 00:52:13.000000000 +0200
@@ -24,12 +24,40 @@
 Group:          System/GUI/GNOME
 Url:            http://live.gnome.org/GnomeShell
 Source:         
http://download.gnome.org/sources/gnome-shell/3.20/%{name}-%{version}.tar.xz
+# SOURCE-FEATURE-SLE SLE-Classic specific core extension file, see bnc#862615
+Source1:        SLEClassicExt.js
+# SOURCE-FEATURE-SLE The SLE theme, with icons/background/gnome-shell.css, 
works with gnome-shell-sle-theme.patch
+Source2:        SLE-theme.tar.gz
 # PATCH-FIX-UPSTREAM gnome-shell-private-connection.patch bnc#751211 
bgo#646187 dims...@opensuse.org -- create private connections if the user is 
not authorized
 Patch1:         gnome-shell-private-connection.patch
 # PATCH-FIX-OPENSUSE gnome-shell-disable-ibus-when-not-installed.patch 
bsc#987360 qz...@suse.com -- disable ibus start when outof Chinese, Japanese, 
Korean area.
 Patch2:         gnome-shell-disable-ibus-when-not-installed.patch
+# PATCH-FEATURE-SLE gnome-shell-gdm-login-applet.patch fate#314545 
dli...@suse.com -- Add an applet on login UI to display suse icon, product 
name, hostname.
+Patch3:         gnome-shell-gdm-login-applet.patch
+# PATCH-FEATURE-SLE gnome-shell-domain.patch fate#307773 dli...@suse.com -- 
Active Directory Integration
+Patch4:         gnome-shell-domain.patch
+# PATCH-FIX-SLE gnome-shell-878951-hide-list-with-no-user.patch bnc#878951 
dli...@suse.com -- hide use list when there is not user
+Patch5:         gnome-shell-878951-hide-list-with-no-user.patch
+# PATCH-FIX-SLE gnome-shell-screen-disappear.patch bnc#870217 dli...@suse.com 
-- screen disapper.
+Patch6:         gnome-shell-screen-disappear.patch
+# PATCH-FIX-SLE endSession-dialog-update-time-label-every-sec.patch bnc#886132 
cxi...@suse.com -- update time label every second in end session dialog
+Patch7:         endSession-dialog-update-time-label-every-sec.patch
+# PATCH-FEATURE-SLE gnome-shell-864872-unlock-by-mouse-motion.patch bnc#864872 
dli...@suse.com -- 10px mouse motion to lift screen shield.
+Patch8:         gnome-shell-864872-unlock-by-mouse-motion.patch
+# PATCH-FIX-SLE gnome-shell-lock-bg-on-primay.patch bnc#894050 dli...@suse.com 
-- display background of lock dialog on the primary screen.
+Patch9:         gnome-shell-lock-bg-on-primary.patch
+# PATCH-FIX-SLE gnome-shell-970480-authprompt-wrapping-message.patch 
bnc#970480 ty...@suse.com -- fix wrapping message issue when password change 
operation fails.
+Patch10:        gnome-shell-970480-authprompt-wrapping-message.patch
+# PATCH-FIX-SLE gs-fate318433-prevent-same-account-multi-logins.patch 
fate#318433 cxi...@suse.com -- prevent multiple simultaneous login.
+Patch11:        gs-fate318433-prevent-same-account-multi-logins.patch
+# PATCH-FEATURE-SLE gnome-shell-sle-theme.patch dli...@suse.com -- Use sle 
theme avatar
+Patch12:        gnome-shell-sle-theme.patch
 # PATCH-FIX-UPSTREAM gnome-shell-fix-missing-return.patch zai...@opensuse.org 
-- Fix a missing return, patch from upstream stable git.
-Patch3:         gnome-shell-fix-missing-return.patch
+Patch13:        gnome-shell-fix-missing-return.patch
+## NOTE: Keep SLE Classic pathes at bottom.
+# PATCH-FEATURE-SLE gs-sle-classic-ext.patch bnc#862615 cxi...@suse.com -- add 
SLE Classic support
+Patch1000:      gs-sle-classic-ext.patch
+
 BuildRequires:  docbook-xsl-stylesheets
 BuildRequires:  gcc-c++
 BuildRequires:  intltool
@@ -147,14 +175,32 @@
 This package adds support for Evolution Calendar, such as appointments
 into GNOME Shell calendar.
 %lang_package
+
 %prep
 %setup -q
 %patch1 -p1
 %patch2 -p1
+%if !0%{?is_opensuse}
 %patch3 -p1
+%patch4 -p1
+%patch5 -p1
+%patch6 -p1
+%patch7 -p1
+%patch8 -p1
+%patch9 -p1
+%patch10 -p1
+%patch11 -p1
+### FIXME: The patch currently don't work. Re-enable when it's fixed
+%if 0
+%patch12 -p1
+%endif
+%endif
+%patch13 -p1
 %if !0%{?is_opensuse}
+%patch1000 -p1
 translation-update-upstream
 %endif
+cp %{S:1} js/ui/
 
 %build
 export BROWSER_PLUGIN_DIR=%{_libdir}/browser-plugins
@@ -171,6 +217,14 @@
 install -d %{buildroot}%{_datadir}/gnome-shell/extensions
 # This is the directory where search providers get installed
 install -d %{buildroot}%{_datadir}/gnome-shell/search-providers
+# Install SLE theme
+# WARNING: some of the followings might NOT be effective at all, as core themes
+# are packed as GResource.
+tar xzvf %{SOURCE2}
+install -d %{buildroot}%{_datadir}/gnome-shell/theme
+cp -r SLE-theme/icons  %{buildroot}%{_datadir}/
+cp SLE-theme/theme/*  %{buildroot}%{_datadir}/gnome-shell/theme
+
 %find_lang %{name} %{?no_lang_C}
 %suse_update_desktop_file org.gnome.Shell
 %suse_update_desktop_file gnome-shell-extension-prefs
@@ -213,6 +267,7 @@
 %{_datadir}/glib-2.0/schemas/org.gnome.shell.gschema.xml
 %{_datadir}/gnome-control-center/keybindings/50-gnome-shell-system.xml
 %{_datadir}/gnome-shell/
+%{_datadir}/icons/*
 %doc %{_mandir}/man?/gnome-shell.*
 
 %files devel

++++++ SLEClassicExt.js ++++++
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
//
//
// Extra features needed by SLE Classic mode. A lot of features here are
// designed as modular functions or classes, so it's cumbersome to fit in a
// patch. However, most functionality requires a patch to the GNOME Shell core
// to work. A design principle is to keep this adapter patch as small and clear 
as possible.
//
// NOTE This file should be packed into GNOME Shell GResource files, with inner
// path "%{_datadir}/gnome-shell/js/ui/" and used by "imports.ui.SLEClassicExt".
//
// [5-5] Major Update: SLE Classic is no longer a full-fledged GNOME session,
// instead it's a runtime modified GNOME Classic.

const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk;
const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
const St = imports.gi.St;
const Atk = imports.gi.Atk;

const BoxPointer = imports.ui.boxpointer;
const GrabHelper = imports.ui.grabHelper;
const Main = imports.ui.main;
const Params = imports.misc.params;
const Separator = imports.ui.separator;
const Slider = imports.ui.slider;
const Tweener = imports.ui.tweener;

const GNOME_CLASSIC_SESSION_NAME = "classic";

// NOTE About `global.session_mode`, which maps
// normal GNOME session -> "user"
// GNOME classic -> "classic" (i.e. the "gnome-" prefix is stripped)
// SLE classic -> "sle-classic" (depreciated)
//
// This var is defined in the C code and some parts of the Shell use it instead
// of `Main.sessionMode.currentMode`, notably `exensionSystem`. An important
// difference is that `global.session_mode` is initialized much earlier than
// `currentMode` and it does NOT reflect in-Session mode change, e.g. the
// lock/unlock screen.

// NOTE a dedicated env var to mark this classic mode a SLE classic, see
// sle-classic.desktop.
var isSLEClassicEnv = ( GLib.getenv('SLE_CLASSIC_MODE') !== null );
// NOTE: A mode can be verified as SLE classic iff it's GNOME Classic and it has
// SLE_CLASSIC_MODE envar set.
function isSLEClassicMode() {
    // NOTE: must check this part so lock screen is not SLE Classic.
    if ( Main.sessionMode.currentMode !== GNOME_CLASSIC_SESSION_NAME )
        return false;

    return isSLEClassicEnv;
}
// NOTE: safe to use BEFORE `sessionMode` has been properly initialized
function isSLEClassicModeGlobal () {
    if ( global.session_mode !== GNOME_CLASSIC_SESSION_NAME )
        return false;

    return isSLEClassicEnv;
}

// NOTE: Originally "sle-classic.json" under "gnome-shell/modes" dir.
//
// TODO: strip down to differences with "classic.json"
var SLE_CLASSIC_JSON = {
    "parentMode": "user",
    "stylesheetName": "gnome-classic.css",
    "enabledExtensions": [
        "apps-m...@gnome-shell-extensions.gcampax.github.com", 
"places-m...@gnome-shell-extensions.gcampax.github.com",
        "alternate-...@gnome-shell-extensions.gcampax.github.com",
        "launch-new-insta...@gnome-shell-extensions.gcampax.github.com",
        "window-l...@gnome-shell-extensions.gcampax.github.com",
        "workspace-indica...@gnome-shell-extensions.gcampax.github.com"
    ],
    "panel": {
        "left": ["activities"],
        "center": [],
        "right": ["a11y", "keyboard", "dateMenu", "aggregateMenu"]
    }
};

// NOTE: used in "sessionMode.js::_loadMode"
//
// If the current mode is SLE Classic, return `SLE_CLASSIC_JSON`. O/w no
// changes.
function convertClassic2SLE(json) {
    // NOTE: `Main.sessionMode` have not initialized.
    if ( ! isSLEClassicModeGlobal() )
        return json;

    return SLE_CLASSIC_JSON;
}

// NOTE: used in `SLEClassicExt.init`
//
// NOTE: it's mandatory to disable app menu in SLE Classic but restore the old
// settings after switching back. A more proper solution would be to introduce a
// dconf overrides key AND change the GSD part to read the overriden value. Too
// much work, keep it a hack for now.
function toggleAppMenu() {
    let xsetting = new Gio.Settings({ schema: 
'org.gnome.settings-daemon.plugins.xsettings' });
    let valueObj = xsetting.get_value('overrides').unpack();

    // NOTE: as dictated by the definitions in gschema, the values for the
    // following flags can NOT be booleans, but instead 0 or 1.

    // NOTE: special handling, as if `Gtk/ShellShowsAppMenu` is NOT set, it's
    // treated as true by XSettings
    const showAppMenuKey = 'Gtk/ShellShowsAppMenu';
    const showAppMenuSLESetKey = 'Gtk/ShellShowsAppMenu/SLESet';
    let showAppMenuP =  valueObj[showAppMenuKey]
        ? valueObj[showAppMenuKey].unpack()
        : 1;
    let showAppMenuSLESet = valueObj[showAppMenuSLESetKey]
        ? valueObj[showAppMenuSLESetKey].unpack()
        : 0;

    // NOTE: In SLE Classic mode, if app menu is set to shown, hide it and set a
    // special flag to mark this change for restoring.
    if (isSLEClassicModeGlobal() && showAppMenuP) {
        showAppMenuP = 0;
        showAppMenuSLESet = 1;
    }

    // NOTE: in none-SLE Classic mode, if app menu is hidden AND `SLESet` flag
    // is set, show the app menu and reset the `SLESet` flag.
    if ( !isSLEClassicModeGlobal() && showAppMenuSLESet) {
        showAppMenuP = 1;
        showAppMenuSLESet = 0;
    }

    valueObj[showAppMenuKey] = GLib.Variant.new('i', showAppMenuP);
    valueObj[showAppMenuSLESetKey] =  GLib.Variant.new('i', showAppMenuSLESet);

    xsetting.set_value('overrides', GLib.Variant.new('a{sv}', valueObj));
}

// NOTE: used in `main.js::start`
function init() {
    toggleAppMenu();
}

var panelPosUpdateId = null;
// layout.js: Replace the origin "box.set_position" call
function setMainPanelPosition (mainPanel, primaryMonitor) {
    if ( isSLEClassicMode() ){
        // FIXME: "mainPanel.height" may be uninitialized at this point: fixed 
to
        // a known value for now.
        let mainPanelHeight = 28;
        // Main Panel at the bottom
        mainPanel.set_position(primaryMonitor.x,
                               primaryMonitor.y + primaryMonitor.height - 
mainPanelHeight);

        // NOTE: needed s.t. lock screen would have top panel
        //
        // TODO use the `updated` signal to change main panel to remove the 
patch?
        if ( !panelPosUpdateId ){
            panelPosUpdateId = Main.sessionMode.connect('updated', function(){
                setMainPanelPosition(Main.layoutManager.panelBox, 
Main.layoutManager.primaryMonitor);
            });
        }
    }
    else {
        mainPanel.set_position(primaryMonitor.x, primaryMonitor.y);
    }
}

// panel.js: Replace the original "Panel._allocate".
//
// The differences are quite subtle but yet pervasive, so despite the
// similarity, there will be two versions of allocation functions.
//
// The main difference is to use the empty(in Classic) _centerBox for window
// list.
//
// NOTE: has to be a *direct* replacement to have proper `this` setup
function _allocate (actor, box, flags) {
    // NOTE: for convenience, the followings are shared. The params of this
    // function is also shared.
    let allocWidth = box.x2 - box.x1;
    let allocHeight = box.y2 - box.y1;
    let [leftMinWidth, leftNaturalWidth] = 
this._leftBox.get_preferred_width(-1);
    let [centerMinWidth, centerNaturalWidth] = 
this._centerBox.get_preferred_width(-1);
    let [rightMinWidth, rightNaturalWidth] = 
this._rightBox.get_preferred_width(-1);

    // bind sub function's `this` to the current `this`, i.e. Main.panel
    let allocateSC = _allocateSC.bind(this);
    // For convenience, defined here to allow access to local vars
    function _allocateSC () {
        let isTextDirRTL = ( this.actor.get_text_direction() === 
Clutter.TextDirection.RTL );
        // A mask to create allocation.
        let maskBox = new Clutter.ActorBox();

        // NOTE: policy here is to satisfy left&right boxes space needs first 
with
        // center box can be shrinked. (This is the opposite of the original
        // allocator, this idea here is to accomodate SLE-Classic window list 
within
        // center box first. )
        let maxSideWidth = Math.floor( (allocWidth - centerMinWidth) / 2 );
        let leftWidth = Math.min(maxSideWidth, leftNaturalWidth);
        let rightWidth = Math.min(maxSideWidth, rightNaturalWidth);
        // NOTE: in the case, flooring for maxSideWidth does happen, the 
following equation yields:
        // : centerWidth = centerMinWidth + 1
        // this avoids the cumbersome floor/ceil in orginal code.
        //
        // `centerWidth` is shrinkable with an lower bound `centerMinWidth` or 
`centerMinWidth + 1`
        let centerWidth = allocWidth - leftWidth - rightWidth;

        // Adjust left/center/right boxes start Y position
        //
        // After moving the panel to the bottom side, the top border will be
        // added instead of the bottom border. However all 3 box of the main
        // panel are absolutely positioned starting from the top edge of the
        // panel originally, this results that the bottom pixel line is not
        // clickable. Add a Y offset to fix it.
        //
        // NOTE: we can set y1 as (MainLayoutManager.primaryMonitor.height -
        // allocHeight), which seems to be easier, however the solution below is
        // more generic and versatile.
        let node = Main.panel.actor.get_theme_node();
        let borderTopWidth = node.get_length("border-top");
        let y_offset = borderTopWidth;

        maskBox.y1 = y_offset;
        // TODO: in previous version of SLE Classic the following is
        // `allocHeight + y_offset`, why?
        maskBox.y2 = allocHeight;

        // Normal order, from left to right
        if ( ! isTextDirRTL ) {
            maskBox.x1 = 0;
            maskBox.x2 = maskBox.x1 + leftWidth;
            this._leftBox.allocate(maskBox, flags);

            maskBox.x1 = maskBox.x2;
            maskBox.x2 = maskBox.x1 + centerWidth;
            this._centerBox.allocate(maskBox, flags);

            maskBox.x1 = maskBox.x2;
            maskBox.x2 = maskBox.x1 + rightWidth;
            this._rightBox.allocate(maskBox, flags);
        }
        // Right to Left: essentially right box left box are swapped
        else {
            maskBox.x2 = allocWidth;
            maskBox.x1 = maskBox.x2 - leftWidth;
            this._leftBox.allocate(maskBox, flags);

            maskBox.x2 = maskBox.x1;
            maskBox.x1 = maskBox.x2 - centerWidth;
            this._centerBox.allocate(maskBox, flags)

            maskBox.x2 = maskBox.x1;
            maskBox.x1 = maskBox.x2 - rightWidth;
            this._rightBox.allocate(maskBox, flags)
        }

    }

    // Real work...
    if (isSLEClassicMode()) {
        // SC: Sle Classic
        allocateSC();
    }
    else {
        this._allocateOrigin(actor, box, flags);
    }

    // TODO: what are these corners for? They are zero on my test machines.
    // Without proper understanding of their purposes, they are the same for
    // both original code and SLE Classic.
    let cornerMinWidth, cornerMinHeight;
    let cornerWidth, cornerHeight;
    let childBox = new Clutter.ActorBox();

    [cornerMinWidth, cornerWidth] = 
this._leftCorner.actor.get_preferred_width(-1);
    [cornerMinHeight, cornerHeight] = 
this._leftCorner.actor.get_preferred_height(-1);
    childBox.x1 = 0;
    childBox.x2 = cornerWidth;
    childBox.y1 = allocHeight;
    childBox.y2 = allocHeight + cornerHeight;
    this._leftCorner.actor.allocate(childBox, flags);

    [cornerMinWidth, cornerWidth] = 
this._rightCorner.actor.get_preferred_width(-1);
    [cornerMinHeight, cornerHeight] = 
this._rightCorner.actor.get_preferred_height(-1);
    childBox.x1 = allocWidth - cornerWidth;
    childBox.x2 = allocWidth;
    childBox.y1 = allocHeight;
    childBox.y2 = allocHeight + cornerHeight;
    this._rightCorner.actor.allocate(childBox, flags);
}
++++++ endSession-dialog-update-time-label-every-sec.patch ++++++
Index: gnome-shell-3.20.1/js/ui/endSessionDialog.js
===================================================================
--- gnome-shell-3.20.1.orig/js/ui/endSessionDialog.js
+++ gnome-shell-3.20.1/js/ui/endSessionDialog.js
@@ -403,8 +403,10 @@ const EndSessionDialog = new Lang.Class(
 
         let description;
         let displayTime = _roundSecondsToInterval(this._totalSecondsToStayOpen,
-                                                  this._secondsLeft,
-                                                  10);
+                                                          this._secondsLeft,
+                                                          // larger than any 
normal value
+                                                          1000000);
+
 
         if (this._user.is_loaded) {
             let realName = this._user.get_real_name();
++++++ gnome-shell-864872-unlock-by-mouse-motion.patch ++++++
Index: gnome-shell-3.20.1/js/ui/screenShield.js
===================================================================
--- gnome-shell-3.20.1.orig/js/ui/screenShield.js
+++ gnome-shell-3.20.1/js/ui/screenShield.js
@@ -418,6 +418,8 @@ const ScreenShield = new Lang.Class({
         this.actor = Main.layoutManager.screenShieldGroup;
 
         this._lockScreenState = MessageTray.State.HIDDEN;
+        this._last_x = -1;
+        this._last_y = -1;
         this._lockScreenGroup = new St.Widget({ x_expand: true,
                                                 y_expand: true,
                                                 reactive: true,
@@ -427,6 +429,8 @@ const ScreenShield = new Lang.Class({
                                               });
         this._lockScreenGroup.connect('key-press-event',
                                       Lang.bind(this, 
this._onLockScreenKeyPress));
+        this._lockScreenGroup.connect('motion-event',
+                                      Lang.bind(this, 
this._onLockScreenMotion));
         this._lockScreenGroup.connect('scroll-event',
                                       Lang.bind(this, 
this._onLockScreenScroll));
         Main.ctrlAltTabManager.addGroup(this._lockScreenGroup, _("Lock"), 
'changes-prevent-symbolic');
@@ -657,6 +661,25 @@ const ScreenShield = new Lang.Class({
         return Clutter.EVENT_STOP;
     },
 
+    _onLockScreenMotion: function(actor, event) {
+        if (this._lockScreenState != MessageTray.State.SHOWN)
+            return false;
+        let [X, Y] = event.get_coords();
+
+        if (this._last_x == -1)
+            this._last_x = X;
+        if (this._last_y == -1)
+            this._last_y = Y;
+
+        let min_distance = 10
+        let distance = Math.max(Math.abs(this._last_x - X),
+                                Math.abs(this._last_y - Y));
+
+        if (distance >= min_distance)
+            this._liftShield(true, 0);
+        return true;
+    },
+
     _onLockScreenScroll: function(actor, event) {
         if (this._lockScreenState != MessageTray.State.SHOWN)
             return Clutter.EVENT_PROPAGATE;
@@ -973,6 +996,8 @@ const ScreenShield = new Lang.Class({
             return;
 
         this._ensureLockScreen();
+        this._last_x = -1;
+        this._last_y = -1;
         this._lockDialogGroup.scale_x = 1;
         this._lockDialogGroup.scale_y = 1;
 
++++++ gnome-shell-878951-hide-list-with-no-user.patch ++++++
diff --git a/js/gdm/loginDialog.js b/js/gdm/loginDialog.js
index 2f70c1f..642f9a2 100644
--- a/js/gdm/loginDialog.js
+++ b/js/gdm/loginDialog.js
@@ -730,6 +730,14 @@ const LoginDialog = new Lang.Class({
     _updateDisableUserList: function() {
         let disableUserList = 
this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY);
 
+        // Disable user list when there are no users.
+        if (( disableUserList == false ) && ( this._userListLoaded == true )) {
+            let items = this._userList._items;
+            if ( Object.keys(items).length === 0 ) {
+                disableUserList = true;
+            }
+        }
+
         if (disableUserList != this._disableUserList) {
             this._disableUserList = disableUserList;
 
@@ -1232,14 +1240,18 @@ const LoginDialog = new Lang.Class({
             this._userList.addUser(users[i]);
         }
 
+        this._updateDisableUserList();
+
         this._userAddedId = this._userManager.connect('user-added',
                                                       Lang.bind(this, 
function(userManager, user) {
                                                           
this._userList.addUser(user);
+                                                          
this._updateDisableUserList();
                                                       }));
 
         this._userRemovedId = this._userManager.connect('user-removed',
                                                         Lang.bind(this, 
function(userManager, user) {
                                                             
this._userList.removeUser(user);
+                                                            
this._updateDisableUserList();
                                                         }));
 
         this._userChangedId = this._userManager.connect('user-changed',
++++++ gnome-shell-970480-authprompt-wrapping-message.patch ++++++
diff --git a/js/gdm/authPrompt.js b/js/gdm/authPrompt.js
index dd13753..4c0b0b7 100644
--- a/js/gdm/authPrompt.js
+++ b/js/gdm/authPrompt.js
@@ -13,6 +13,7 @@ const Params = imports.misc.params;
 const ShellEntry = imports.ui.shellEntry;
 const Tweener = imports.ui.tweener;
 const UserWidget = imports.ui.userWidget;
+const Pango = imports.gi.Pango;
 
 const DEFAULT_BUTTON_WELL_ICON_SIZE = 16;
 const DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1.0;
@@ -113,6 +114,7 @@ const AuthPrompt = new Lang.Class({
         this._message = new St.Label({ opacity: 0,
                                        styleClass: 'login-dialog-message' });
         this._message.clutter_text.line_wrap = true;
+        this._message.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
         this.actor.add(this._message, { x_fill: false, x_align: 
St.Align.START, y_align: St.Align.START });
 
         this._buttonBox = new St.BoxLayout({ style_class: 
'login-dialog-button-box',
++++++ gnome-shell-domain.patch ++++++
Index: gnome-shell-3.20.1/js/gdm/domain.js
===================================================================
--- /dev/null
+++ gnome-shell-3.20.1/js/gdm/domain.js
@@ -0,0 +1,243 @@
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+/*
+ * Copyright 2011 Red Hat, Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+
+const Atk = imports.gi.Atk;
+const Clutter = imports.gi.Clutter;
+const Gdm = imports.gi.Gdm;
+const Gio = imports.gi.Gio;
+const GLib = imports.gi.GLib;
+const Gtk = imports.gi.Gtk;
+const Lang = imports.lang;
+const Mainloop = imports.mainloop;
+const Signals = imports.signals;
+const St = imports.gi.St;
+
+const Main = imports.ui.main;
+const PopupMenu = imports.ui.popupMenu;
+
+const DomainLoadStatus = {
+    INIT : 0,
+    SEPARATOR : 1,
+    OWN_DOMAIN : 2,
+    TRUSTED_DOMAINS : 3,
+    DONE : 4,
+    ERR : 5
+};
+
+const DomainMenuButton = new Lang.Class({
+    Name: 'DomainMenuButton',
+
+    _init: function () {
+        this._separator = null;
+        this.domain_enabled = false;
+        this._domains = new Array();
+        this._load_config();
+    },
+
+
+    _domainsPush: function(domain) {
+        let valid_content = domain.replace(/\s+/g, '');
+
+        if (valid_content.length > 0) {
+            if (this._domains.indexOf(valid_content) == -1)
+                this._domains.push (valid_content);
+        }
+    },
+
+    _generate: function() {
+        let gearIcon = new St.Icon({ icon_name: 'samba-window',
+                                  icon_size: 24
+                                 });
+        this._button = new St.Button({ style_class: 
'login-dialog-session-list-button', //FIXME
+                                       reactive: true,
+                                       track_hover: true,
+                                       can_focus: true,
+                                       accessible_name: _("Choose Domain"),
+                                       accessible_role: Atk.Role.MENU,
+                                       child: gearIcon });
+
+        gearIcon.show();
+        this.actor = new St.Bin({ child: this._button });
+
+        this._menu = new PopupMenu.PopupMenu(this._button, 0, St.Side.TOP);
+        Main.uiGroup.add_actor(this._menu.actor);
+        this._menu.actor.hide();
+
+        this._menu.connect('open-state-changed',
+                           Lang.bind(this, function(menu, isOpen) {
+                                if (isOpen)
+                                    
this._button.add_style_pseudo_class('active');
+                                else
+                                    
this._button.remove_style_pseudo_class('active');
+                           }));
+
+        this._manager = new PopupMenu.PopupMenuManager({ actor: this._button 
});
+        this._manager.addMenu(this._menu);
+
+        this._button.connect('clicked', Lang.bind(this, function() {
+            this._menu.toggle();
+        }));
+
+        this._populate();
+    },
+
+    _load_config: function() {
+        let keyfile = new GLib.KeyFile();
+        let path = "/etc/gdm/custom.conf";
+        let domain_group = "domains";
+
+    //? Why must use 'try'
+        try {
+            keyfile.load_from_file(path, GLib.KeyFileFlags.NONE);
+        } catch(e) {
+        }
+
+        if (!keyfile.has_group(domain_group)) {
+            return;
+    }
+
+        this.domain_enabled = keyfile.get_boolean(domain_group, 'Enable');
+        if (this.domain_enabled) {
+            let content = keyfile.get_string(domain_group, 'Domains');
+        let domains = content.split(';');
+        for (let i = 0; i < domains.length; i++) {
+        this._domainsPush(domains[i]);
+        }
+        this._generate();
+    }
+    },
+
+    _readStdout: function(data) {
+        this._dataStdout.read_line_async(GLib.PRIORITY_DEFAULT, null, 
Lang.bind(this, function(stream, result) {
+            let [line, len] = this._dataStdout.read_line_finish_utf8(result);
+
+            if (line == null) {
+                // end of file
+                this._stdout.close(null);
+        this.loadDomains(data, null);
+                return;
+            }
+
+        data.push(line);
+            this._readStdout(data);
+        }));
+    },
+
+    loadCommand: function(argv) {
+        try {
+            let data = new Array();
+            let [success, pid, stdin, stdout, stderr] = 
GLib.spawn_async_with_pipes(null,
+                    argv,
+                    null,
+                    GLib.SpawnFlags.SEARCH_PATH | 
GLib.SpawnFlags.DO_NOT_REAP_CHILD,
+                    null);
+            this._stdout = new Gio.UnixInputStream({ fd: stdout, close_fd: 
true });
+            GLib.close(stdin);
+            GLib.close(stderr);
+            this._dataStdout = new Gio.DataInputStream({ base_stream: 
this._stdout });
+            this._readStdout(data);
+        } catch (e) {
+            this.loadDomains(null, e);
+    }
+    },
+
+    loadDomains: function(data, err) {
+    /*FIXME: reload every 5 minutes? */
+    /*TODO: load the setting file */
+        switch (this._status) {
+            case DomainLoadStatus.INIT:
+                this._status = DomainLoadStatus.SEPARATOR;
+                this.loadCommand(["wbinfo", "--separator"]);
+                break;
+            case DomainLoadStatus.SEPARATOR:
+                if (data) {
+                    this._separator = data[0];
+                    this._status = DomainLoadStatus.OWN_DOMAIN;
+                    this.loadCommand(["wbinfo", "--own-domain"]);
+                } else {
+                    this._status = DomainLoadStatus.ERR;
+                    this._menu.removeAll();
+                    item = new PopupMenu.PopupMenuItem(_("Cannot receive 
'separator'"));
+                    item.setSensitive(false);
+                    this._menu.addMenuItem(item);
+                }
+                break;
+            case DomainLoadStatus.OWN_DOMAIN:
+                if (data) {
+                    for (let i = 0; i < data.length; i++) {
+                        this._domainsPush(data[i]);
+                    }
+                }
+                this._status = DomainLoadStatus.TRUSTED_DOMAINS;
+                this.loadCommand(["wbinfo", "--trusted-domains"]);
+                break;
+            case DomainLoadStatus.TRUSTED_DOMAINS:
+                if (data) {
+                    for (let i = 0; i < data.length; i++) {
+                        this._domainsPush(data[i]);
+                    }
+                }
+                this._status = DomainLoadStatus.DONE;
+                this._menu.removeAll();
+                for (let i = 0; i < this._domains.length; i++) {
+                    item = new PopupMenu.PopupMenuItem(this._domains[i]);
+                        this._menu.addMenuItem(item);
+                        item.connect('activate', Lang.bind(this, 
function(item) {
+                        //?? Why it does not work
+                        //this.setActiveDomain(this._domains[i]);
+                        this.setActiveDomain(item.label.text);
+                    }));
+                }
+                break;
+    }
+    },
+
+    _populate: function() {
+        //TODO Recent domains?
+        item = new PopupMenu.PopupMenuItem(_("loading the wbinfos..."));
+        item.setSensitive(false);
+        this._menu.addMenuItem(item);
+        this._status = DomainLoadStatus.INIT;
+        this.loadDomains(null, null);
+    },
+
+    setActiveDomain: function(domain) {
+        this._activeDomain = domain;
+        //this.emit('domain-activated', this._activeDomain);
+        this.emit('domain-activated');
+    },
+
+    getActiveDomain: function(domain) {
+        return this._activeDomain;
+    },
+
+    getQuestionMessage: function() {
+        return _("User for ") + this._activeDomain;
+    },
+
+    getHintMessage: function() {
+        return _("Contact dliang to get help");
+    },
+
+    getDomainUser: function(user) {
+        return this._activeDomain + this._separator + user;
+    }
+});
+Signals.addSignalMethods(DomainMenuButton.prototype);
Index: gnome-shell-3.20.1/js/gdm/loginDialog.js
===================================================================
--- gnome-shell-3.20.1.orig/js/gdm/loginDialog.js
+++ gnome-shell-3.20.1/js/gdm/loginDialog.js
@@ -33,6 +33,7 @@ const Signals = imports.signals;
 const St = imports.gi.St;
 
 const AuthPrompt = imports.gdm.authPrompt;
+const Domain = imports.gdm.domain;
 const Batch = imports.gdm.batch;
 const BoxPointer = imports.ui.boxpointer;
 const CtrlAltTab = imports.ui.ctrlAltTab;
@@ -429,6 +430,14 @@ const LoginDialog = new Lang.Class({
         this._authPrompt.hide();
         this.actor.add_child(this._authPrompt.actor);
 
+        this._userLayout = new St.BoxLayout({ vertical: false,
+                        x_expand: true
+                       });
+        this._userSelectionBox.add(this._userLayout,
+                                   { expand: true,
+                                     x_align: St.Align.START,
+                                     x_fill: true });
+
         // translators: this message is shown below the user list on the
         // login screen. It can be activated to reveal an entry for
         // manually entering the username.
@@ -446,10 +455,24 @@ const LoginDialog = new Lang.Class({
 
         this._notListedButton.hide();
 
-        this._userSelectionBox.add(this._notListedButton,
+        this._userLayout.add(this._notListedButton,
+                                   { expand: false});
+
+        // we add domain menu button
+        this._domainMenuButton = new Domain.DomainMenuButton();
+        if (this._domainMenuButton.domain_enabled) {
+            this._domainMenuButton.actor.hide();
+
+            this._domainMenuButton.connect('domain-activated',
+                                  Lang.bind(this, function(list) {
+                        
this._hideUserListAskForDomainUsernameAndBeginVerification();
+                                            }));
+            this._userLayout.add(this._domainMenuButton.actor,
                                    { expand: false,
-                                     x_align: St.Align.START,
+                                     x_align: St.Align.END,
                                      x_fill: true });
+        }
+        // domain end
 
         this._bannerView = new St.ScrollView({ style_class: 
'login-dialog-banner-view',
                                                opacity: 0,
@@ -919,6 +942,37 @@ const LoginDialog = new Lang.Class({
             }));
     },
 
+    _askForDomainUsernameAndBeginVerification: function(domain) {
+        this._authPrompt.setPasswordChar('');
+        
this._authPrompt.setQuestion(this._domainMenuButton.getQuestionMessage());
+
+        //FIXME: I sugguest to add this info for customer to contact their 
account manager
+        this._authPrompt.setMessage(this._domainMenuButton.getHintMessage(), 
GdmUtil.MessageType.HINT);
+
+        let realmManager = new Realmd.Manager();
+        let realmSignalId = realmManager.connect('login-format-changed',
+                                                 Lang.bind(this, 
this._showRealmLoginHint));
+        this._showRealmLoginHint(realmManager.loginFormat);
+
+        let nextSignalId = this._authPrompt.connect('next',
+                                                    Lang.bind(this, function() 
{
+                                                        
this._authPrompt.disconnect(nextSignalId);
+                                                        
this._authPrompt.updateSensitivity(false);
+                                                        let answer = 
this._authPrompt.getAnswer();
+                            let domain_answer = 
this._domainMenuButton.getDomainUser(answer);
+                                                        this._user = 
this._userManager.get_user(domain_answer);
+                                                        
this._authPrompt.clear();
+                                                        
this._authPrompt.startSpinning();
+                                                        
this._authPrompt.begin({ userName: domain_answer});
+                                                        
this._updateCancelButton();
+
+                                                        
realmManager.disconnect(realmSignalId)
+                                                        realmManager.release();
+                                                    }));
+        this._updateCancelButton();
+        this._showPrompt();
+    },
+
     _startSession: function(serviceName) {
         Tweener.addTween(this.actor,
                          { opacity: 0,
@@ -1087,6 +1141,11 @@ const LoginDialog = new Lang.Class({
         this._askForUsernameAndBeginVerification();
     },
 
+    _hideUserListAskForDomainUsernameAndBeginVerification: function() {
+        this._hideUserList();
+        this._askForDomainUsernameAndBeginVerification();
+    },
+
     _hideUserListAndBeginVerification: function() {
         this._hideUserList();
         this._authPrompt.begin();
@@ -1099,6 +1158,9 @@ const LoginDialog = new Lang.Class({
         this._sessionMenuButton.close();
         this._setUserListExpanded(true);
         this._notListedButton.show();
+        if (this._domainMenuButton.domain_enabled)
+            this._domainMenuButton.actor.show();
+        this._userLayout.show();
         this._userList.actor.grab_key_focus();
     },
 
Index: gnome-shell-3.20.1/po/POTFILES.in
===================================================================
--- gnome-shell-3.20.1.orig/po/POTFILES.in
+++ gnome-shell-3.20.1/po/POTFILES.in
@@ -8,6 +8,7 @@ data/org.gnome.shell.gschema.xml.in.in
 data/org.gnome.Shell.PortalHelper.desktop.in
 js/extensionPrefs/main.js
 js/gdm/authPrompt.js
+js/gdm/domain.js
 js/gdm/loginDialog.js
 js/gdm/util.js
 js/misc/util.js
Index: gnome-shell-3.20.1/js/js-resources.gresource.xml
===================================================================
--- gnome-shell-3.20.1.orig/js/js-resources.gresource.xml
+++ gnome-shell-3.20.1/js/js-resources.gresource.xml
@@ -2,6 +2,7 @@
 <gresources>
   <gresource prefix="/org/gnome/shell">
     <file>gdm/authPrompt.js</file>
+    <file>gdm/domain.js</file>
     <file>gdm/batch.js</file>
     <file>gdm/fingerprint.js</file>
     <file>gdm/loginDialog.js</file>
++++++ gnome-shell-gdm-login-applet.patch ++++++
---
 js/ui/aboutMenu.js   |   72 +++++++++++++++++++++++++++++++++++++++++++++++++++
 js/ui/panel.js       |    1 
 js/ui/sessionMode.js |    2 -
 3 files changed, 74 insertions(+), 1 deletion(-)

Index: gnome-shell-3.20.1/js/ui/aboutMenu.js
===================================================================
--- /dev/null
+++ gnome-shell-3.20.1/js/ui/aboutMenu.js
@@ -0,0 +1,106 @@
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+const GLib = imports.gi.GLib;
+const Gio = imports.gi.Gio;
+const Lang = imports.lang;
+const Clutter = imports.gi.Clutter;
+const St = imports.gi.St;
+
+const PanelMenu = imports.ui.panelMenu;
+
+const AboutMenuButton = new Lang.Class({
+    Name: 'AboutMenuButton',
+    Extends: PanelMenu.Button,
+    _init: function() {
+        this._hostname = null;
+        this._updateHostnameId = 0;
+        this._ticket = 1;
+
+        let hbox;
+        let vbox;
+        let menuAlignment = 0.25;
+
+        if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
+            menuAlignment = 1.0 - menuAlignment;
+        this.parent(menuAlignment, 'About Me');
+
+        this.about_hbox = new St.BoxLayout({ style_class: 
'panel-status-menu-box' });
+        this.hostname_label = new St.Label({y_align: 
Clutter.ActorAlign.CENTER});
+        this.about_hbox.add_child(this.hostname_label);
+
+        this.actor.add_child(this.about_hbox);
+        hbox = new St.BoxLayout({ name: 'aboutArea' });
+        this.menu.box.add_child(hbox);
+
+        vbox = new St.BoxLayout({vertical: true});
+        hbox.add(vbox);
+
+        this._os_release = Gio.File.new_for_path('/etc/os-release');
+        let success, contents, tag;
+        try {
+            [success, contents, tag] = this._os_release.load_contents(null);
+        } catch (e) {
+            contents = 'SUSE Linux Enterprise';
+        }
+        let match = new 
RegExp('(.+)PRETTY_NAME=(.+)ID(.+)').exec(contents.toString().replace(/\n/g, ' 
'));
+        let sysinfo_text;
+        if (!match) {
+            sysinfo_text = 'SUSE Linux Enterprise';
+        } else {
+            sysinfo_text = match[2].toString().replace(/"/g, ' ');
+        }
+
+        this._sysinfo = new St.Label({ text: sysinfo_text,
+                                     can_focus: true });
+        vbox.add(this._sysinfo);
+        this.actor.hide();
+
+        this._updateHostnameId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
+                                                  this._ticket,
+                                                  Lang.bind(this, function() {
+                                                      if (this._ticket < 60*60)
+                                                          this._ticket *= 2;
+                                                      this._updateHostnameId = 
0;
+                                                      this._updateHostname();
+                                                      return false;
+                                                  }));
+
+        return;
+    },
+
+    _updateHostname: function(){
+        let command = 'hostname';
+        let hostname_text;
+        try {
+            let [res, stdout, stderr, status] = 
GLib.spawn_command_line_sync(command);
+            hostname_text = String.fromCharCode.apply(null, stdout);
+        } catch (e) {
+            hostname_text = 'localhost';
+        }
+
+        if ((this._hostname == null) || (this._hostname != hostname_text)) {
+            this._ticket = 1;
+            this._hostname = hostname_text;
+            this.hostname_label.set_text(this._hostname);
+            this.actor.show();
+        }
+        this._updateHostnameId = 
GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT,
+                                                  this._ticket,
+                                                  Lang.bind(this, function() {
+                                                      if (this._ticket < 60*60)
+                                                          this._ticket *= 2;
+                                                      this._updateHostnameId = 
0;
+                                                      this._updateHostname();
+                                                      return false;
+                                                  }));
+    },
+
+    _destroy: function() {
+        this._ticket = 1;
+        if (this._updateHostnameId) {
+            GLib.source_remove (this._updateHostnameId);
+            this._updateHostnameId = 0;
+        }
+    },
+
+});
Index: gnome-shell-3.20.1/js/ui/panel.js
===================================================================
--- gnome-shell-3.20.1.orig/js/ui/panel.js
+++ gnome-shell-3.20.1/js/ui/panel.js
@@ -755,6 +755,7 @@ const AggregateMenu = new Lang.Class({
 });
 
 const PANEL_ITEM_IMPLEMENTATIONS = {
+    'aboutMenu': imports.ui.aboutMenu.AboutMenuButton,
     'activities': ActivitiesButton,
     'aggregateMenu': AggregateMenu,
     'appMenu': AppMenuButton,
Index: gnome-shell-3.20.1/js/ui/sessionMode.js
===================================================================
--- gnome-shell-3.20.1.orig/js/ui/sessionMode.js
+++ gnome-shell-3.20.1/js/ui/sessionMode.js
@@ -48,7 +48,7 @@ const _modes = {
         unlockDialog: imports.gdm.loginDialog.LoginDialog,
         components: ['polkitAgent'],
         panel: {
-            left: [],
+            left: ['aboutMenu'],
             center: ['dateMenu'],
             right: ['a11yGreeter', 'keyboard', 'aggregateMenu'],
         },
Index: gnome-shell-3.20.1/js/js-resources.gresource.xml
===================================================================
--- gnome-shell-3.20.1.orig/js/js-resources.gresource.xml
+++ gnome-shell-3.20.1/js/js-resources.gresource.xml
@@ -25,7 +25,7 @@
     <file>misc/params.js</file>
     <file>misc/smartcardManager.js</file>
     <file>misc/util.js</file>
-
+    <file>ui/aboutMenu.js</file>
     <file>perf/core.js</file>
     <file>perf/hwtest.js</file>
 
++++++ gnome-shell-lock-bg-on-primary.patch ++++++
diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js
index 5a48922..ba97fce 100644
--- a/js/ui/screenShield.js
+++ b/js/ui/screenShield.js
@@ -524,9 +524,31 @@ const ScreenShield = new Lang.Class({
                                                 y_expand: true,
                                                 reactive: true,
                                                 pivot_point: new 
Clutter.Point({ x: 0.5, y: 0.5 }),
-                                                name: 'lockDialogGroup' });
+                                                name: 'lockDialogGroupReal' });
 
         this.actor.add_actor(this._lockDialogGroup);
+
+        let primaryBackground = new St.Widget({ x_expand: true,
+                                                y_expand: true,
+                                                reactive: true,
+                                                pivot_point: new 
Clutter.Point({ x: 0.5, y: 0.5 }),
+                                                name: 'lockDialogGroup' });
+        primaryBackground.add_constraint(new Layout.MonitorConstraint({ 
primary: true }));
+        this.actor.insert_child_below(primaryBackground, null);
+
+        for (let i = 0; i < Main.layoutManager.monitors.length; i++) {
+            if (Main.layoutManager.monitors [i].index == 
Main.layoutManager.primaryMonitor.index)
+                continue;
+
+            let group = new St.Widget({ x_expand: true,
+                                        y_expand: true,
+                                        reactive: true,
+                                        pivot_point: new Clutter.Point({ x: 
0.5, y: 0.5 }),
+                                        name: 'lockDialogGroup' });
+            group.add_constraint(new Layout.MonitorConstraint({ index: i }));
+            this.actor.insert_child_below(group, null);
+        }
+
         this.actor.add_actor(this._lockScreenGroup);
 
         this._presence = new GnomeSession.Presence(Lang.bind(this, 
function(proxy, error) {
++++++ gnome-shell-screen-disappear.patch ++++++
Index: gnome-shell-3.20.1/js/gdm/authPrompt.js
===================================================================
--- gnome-shell-3.20.1.orig/js/gdm/authPrompt.js
+++ gnome-shell-3.20.1/js/gdm/authPrompt.js
@@ -456,8 +456,10 @@ const AuthPrompt = new Lang.Class({
         this.setUser(null);
         this.stopSpinning();
 
-        if (oldStatus == AuthPromptStatus.VERIFICATION_FAILED)
+        if (oldStatus == AuthPromptStatus.VERIFICATION_FAILED) {
+            this._userVerifier.cancel();
             this.emit('failed');
+        }
 
         let beginRequestType;
 
++++++ gnome-shell-sle-theme.patch ++++++
diff -Npur gnome-shell-3.10.4/js/ui/aboutMenu.js 
gnome-shell-3.10.4-new/js/ui/aboutMenu.js
--- gnome-shell-3.10.4/js/ui/aboutMenu.js       2014-06-06 05:56:19.040026091 
+0800
+++ gnome-shell-3.10.4-new/js/ui/aboutMenu.js   2014-06-06 05:59:43.328025099 
+0800
@@ -12,6 +12,17 @@ const AboutMenuButton = new Lang.Class({
     Name: 'AboutMenuButton',
     Extends: PanelMenu.Button,
     _init: function() {
+        let command = 'hostname';
+        let hostname_text;
+        try {
+                let [res, stdout, stderr, status] = 
GLib.spawn_command_line_sync(command);
+                hostname_text = String.fromCharCode.apply(null, stdout);
+        } catch (e) {
+                /* Donnot display the useless widget */
+                this.parent(null, 'About Me');
+                return;
+        }
+
         let hbox;
         let vbox;
 
@@ -21,20 +31,6 @@ const AboutMenuButton = new Lang.Class({
         this.parent(menuAlignment, 'About Me');
 
         this.about_hbox = new St.BoxLayout({ style_class: 
'panel-status-menu-box' });
-        this.about_hbox.add_child(new St.Icon({ style_class: 
'system-status-icon',
-                                           icon_name: 'suse',
-                                           icon_size: 24,
-                                           y_align: Clutter.ActorAlign.CENTER
-                                        }));
-
-        let command = 'hostname';
-        let hostname_text;
-        try {
-                let [res, stdout, stderr, status] = 
GLib.spawn_command_line_sync(command);
-                hostname_text = String.fromCharCode.apply(null, stdout);
-        } catch (e) {
-                hostname_text = 'Welcome';
-        }
         this.about_hbox.add_child(new St.Label({ text: hostname_text,
                                            y_align: Clutter.ActorAlign.CENTER
                                         }));
diff -Npur gnome-shell-3.10.4/js/ui/userWidget.js 
gnome-shell-3.10.4-new/js/ui/userWidget.js
--- gnome-shell-3.10.4/js/ui/userWidget.js      2014-02-20 02:19:32.000000000 
+0800
+++ gnome-shell-3.10.4-new/js/ui/userWidget.js  2014-06-06 05:57:33.740025728 
+0800
@@ -50,7 +50,7 @@ const Avatar = new Lang.Class({
             this.actor.style = 'background-image: url("%s");'.format(iconFile);
         } else {
             this.actor.style = null;
-            this.actor.child = new St.Icon({ icon_name: 
'avatar-default-symbolic',
+            this.actor.child = new St.Icon({ icon_name: 'sle-avatar',
                                              icon_size: this._iconSize });
         }
     }
++++++ gs-fate318433-prevent-same-account-multi-logins.patch ++++++
Index: gnome-shell-3.20.3/js/gdm/loginDialog.js
===================================================================
--- gnome-shell-3.20.3.orig/js/gdm/loginDialog.js
+++ gnome-shell-3.20.3/js/gdm/loginDialog.js
@@ -900,6 +900,8 @@ const LoginDialog = new Lang.Class({
                                                           
this._authPrompt.updateSensitivity(false);
                                                           let answer = 
this._authPrompt.getAnswer();
                                                           this._user = 
this._userManager.get_user(answer);
+                                                          
this._userLoginForbidden =
+                                                              
this._user.is_x_logged_in_remotely();
                                                           
this._authPrompt.clear();
                                                           
this._authPrompt.startSpinning();
                                                           
this._authPrompt.begin({ userName: answer });
@@ -963,6 +965,8 @@ const LoginDialog = new Lang.Class({
                                                         let answer = 
this._authPrompt.getAnswer();
                             let domain_answer = 
this._domainMenuButton.getDomainUser(answer);
                                                         this._user = 
this._userManager.get_user(domain_answer);
+                                                        
this._userLoginForbidden =
+                                                            
this._user.is_x_logged_in_remotely();
                                                         
this._authPrompt.clear();
                                                         
this._authPrompt.startSpinning();
                                                         
this._authPrompt.begin({ userName: domain_answer});
@@ -996,6 +1000,28 @@ const LoginDialog = new Lang.Class({
     },
 
     _onSessionOpened: function(client, serviceName) {
+        if ( this._userLoginForbidden ) {
+            this._authPrompt.setMessage(
+                _('Sorry, you have to log out a previous session first. 
Multiple logins are not supported.'),
+                GdmUtil.MessageType.ERROR);
+            // TODO: The following logic relies on the unverified fact that
+            // `AuthPrompt::_onVerificationComplete` seems to always run after
+            // current handler. This might root from the interaction between
+            // greeter and verifier, both are external programs.
+            this._authPrompt.verificationStatus = 
AuthPrompt.AuthPromptStatus.VERIFIED_BUT_FORBIDDEN;
+
+            // NOTE: Failed Attempts as references
+            //
+            // NOTE: reset is too heavy, it skips the error prompt all together
+            // this._authPrompt.reset();
+            //
+            // NOTE: Diconnect at this stage is not working
+            //
+            // 
this._authPrompt._userVerifier.disconnect(this._authPrompt._userVerifierCompleteId);
+
+            return;
+        }
+
         this._authPrompt.finish(Lang.bind(this, function() {
             this._startSession(serviceName);
         }));
@@ -1179,6 +1205,7 @@ const LoginDialog = new Lang.Class({
 
     _onUserListActivated: function(activatedItem) {
         this._user = activatedItem.user;
+        this._userLoginForbidden = this._user.is_x_logged_in_remotely();
 
         this._updateCancelButton();
 
Index: gnome-shell-3.20.3/js/gdm/authPrompt.js
===================================================================
--- gnome-shell-3.20.3.orig/js/gdm/authPrompt.js
+++ gnome-shell-3.20.3/js/gdm/authPrompt.js
@@ -30,7 +30,9 @@ const AuthPromptStatus = {
     NOT_VERIFYING: 0,
     VERIFYING: 1,
     VERIFICATION_FAILED: 2,
-    VERIFICATION_SUCCEEDED: 3
+    VERIFICATION_SUCCEEDED: 3,
+    // NOTE fate#318433 extra state to track multi-login situation
+    VERIFIED_BUT_FORBIDDEN: 4
 };
 
 const BeginRequestType = {
@@ -261,9 +263,14 @@ const AuthPrompt = new Lang.Class({
     },
 
     _onVerificationComplete: function() {
+        // NOTE update the spinning icon
         this.setActorInDefaultButtonWell(null);
+
+        if (this.verificationStatus === 
AuthPromptStatus.VERIFIED_BUT_FORBIDDEN) {
+            return;
+        }
         this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED;
-       this.cancelButton.reactive = false;
+        this.cancelButton.reactive = false;
     },
 
     _onReset: function() {
++++++ gs-sle-classic-ext.patch ++++++
diff --git a/js/js-resources.gresource.xml 
b/sp2-rebasing/gnome-shell-3.20.1/js/js-resources.gresource.xml
index 33feba2..53566a7 100644
--- a/js/js-resources.gresource.xml
+++ b/js/js-resources.gresource.xml
@@ -103,6 +103,7 @@
     <file>ui/workspaceThumbnail.js</file>
     <file>ui/workspacesView.js</file>
     <file>ui/xdndHandler.js</file>
+    <file>ui/SLEClassicExt.js</file>
 
     <file>ui/components/__init__.js</file>
     <file>ui/components/autorunManager.js</file>
diff --git a/js/ui/layout.js b/sp2-rebasing/gnome-shell-3.20.1/js/ui/layout.js
index 7ec6867..9c35714 100644
--- a/js/ui/layout.js
+++ b/js/ui/layout.js
@@ -25,6 +25,8 @@ const BACKGROUND_FADE_ANIMATION_TIME = 1.0;
 const HOT_CORNER_PRESSURE_THRESHOLD = 100; // pixels
 const HOT_CORNER_PRESSURE_TIMEOUT = 1000; // ms
 
+const SLEClassicExt = imports.ui.SLEClassicExt;
+
 function isPopupMetaWindow(actor) {
     switch(actor.meta_window.get_window_type()) {
     case Meta.WindowType.DROPDOWN_MENU:
@@ -457,7 +459,7 @@ const LayoutManager = new Lang.Class({
         this.screenShieldGroup.set_position(0, 0);
         this.screenShieldGroup.set_size(global.screen_width, 
global.screen_height);
 
-        this.panelBox.set_position(this.primaryMonitor.x, 
this.primaryMonitor.y);
+        SLEClassicExt.setMainPanelPosition(this.panelBox, this.primaryMonitor);
         this.panelBox.set_size(this.primaryMonitor.width, -1);
 
         this.keyboardIndex = this.primaryIndex;
diff --git a/js/ui/main.js b/sp2-rebasing/gnome-shell-3.20.1/js/ui/main.js
index ad95ce0..7b20e67 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -44,6 +44,8 @@ const Magnifier = imports.ui.magnifier;
 const XdndHandler = imports.ui.xdndHandler;
 const Util = imports.misc.util;
 
+const SLEClassicExt = imports.ui.SLEClassicExt;
+
 const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard';
 const STICKY_KEYS_ENABLE = 'stickykeys-enable';
 const GNOMESHELL_STARTED_MESSAGE_ID = 'f3ea493c22934e26811cd62abe8e203a';
@@ -127,6 +129,8 @@ function start() {
     shellMountOpDBusService = new 
ShellMountOperation.GnomeShellMountOpHandler();
 
     _sessionUpdated();
+
+    SLEClassicExt.init();
 }
 
 function _initializeUI() {
diff --git a/js/ui/panel.js b/sp2-rebasing/gnome-shell-3.20.1/js/ui/panel.js
index b55e2a9..f30693c 100644
--- a/js/ui/panel.js
+++ b/js/ui/panel.js
@@ -25,6 +25,8 @@ const RemoteMenu = imports.ui.remoteMenu;
 const Main = imports.ui.main;
 const Tweener = imports.ui.tweener;
 
+const SLEClassicExt = imports.ui.SLEClassicExt;
+
 const PANEL_ICON_SIZE = 16;
 const APP_MENU_ICON_MARGIN = 0;
 
@@ -823,7 +825,9 @@ const Panel = new Lang.Class({
         alloc.natural_size = -1;
     },
 
-    _allocate: function(actor, box, flags) {
+    _allocate: SLEClassicExt._allocate,
+
+    _allocateOrigin: function(actor, box, flags) {
         let allocWidth = box.x2 - box.x1;
         let allocHeight = box.y2 - box.y1;
 
diff --git a/js/ui/sessionMode.js 
b/sp2-rebasing/gnome-shell-3.20.1/js/ui/sessionMode.js
index d947d5a..628a2ed 100644
--- a/js/ui/sessionMode.js
+++ b/js/ui/sessionMode.js
@@ -14,6 +14,8 @@ const Config = imports.misc.config;
 
 const DEFAULT_MODE = 'restrictive';
 
+const SLEClassicExt = imports.ui.SLEClassicExt;
+
 const _modes = {
     'restrictive': {
         parentMode: null,
@@ -119,6 +121,7 @@ function _loadMode(file, info) {
     try {
         [success, fileContent, tag] = file.load_contents(null);
         newMode = JSON.parse(fileContent);
+        newMode = SLEClassicExt.convertClassic2SLE(newMode);
     } catch(e) {
         return;
     }

Reply via email to