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; }