diff --git a/data/theme/gnome-shell.css b/data/theme/gnome-shell.css index c2d1f1886..db671e771 100644 --- a/data/theme/gnome-shell.css +++ b/data/theme/gnome-shell.css @@ -2092,6 +2092,11 @@ StScrollBar StButton#vhandle:active { font-size: 10pt; } +/* Restart message */ +.restart-message { + font-size: 14pt; +} + /* ShellMountOperation Dialogs */ .shell-mount-operation-icon { icon-size: 48px; diff --git a/js/ui/layout.js b/js/ui/layout.js index 789097e1d..fb1b87994 100644 --- a/js/ui/layout.js +++ b/js/ui/layout.js @@ -597,7 +597,9 @@ const LayoutManager = new Lang.Class({ reactive: true }); this.addChrome(this._coverPane); - if (Main.sessionMode.isGreeter) { + if (Meta.is_restart()) { + // On restart, we don't do an animation + } else if (Main.sessionMode.isGreeter) { this.panelBox.translation_y = -this.panelBox.height; } else { this._updateBackgrounds(); @@ -636,7 +638,9 @@ const LayoutManager = new Lang.Class({ }, _startupAnimation: function() { - if (Main.sessionMode.isGreeter) + if (Meta.is_restart()) + this._startupAnimationComplete(); + else if (Main.sessionMode.isGreeter) this._startupAnimationGreeter(); else this._startupAnimationSession(); diff --git a/js/ui/main.js b/js/ui/main.js index 3e5317f22..9f4efa820 100644 --- a/js/ui/main.js +++ b/js/ui/main.js @@ -18,6 +18,7 @@ const ExtensionSystem = imports.ui.extensionSystem; const ExtensionDownloader = imports.ui.extensionDownloader; const Keyboard = imports.ui.keyboard; const MessageTray = imports.ui.messageTray; +const ModalDialog = imports.ui.modalDialog; const OsdWindow = imports.ui.osdWindow; const Overview = imports.ui.overview; const Panel = imports.ui.panel; @@ -167,6 +168,16 @@ function _initializeUI() { overview.toggle(); })); + global.display.connect('show-restart-message', function(display, message) { + showRestartMessage(message); + return true; + }); + + global.display.connect('restart', function() { + global.reexec_self(); + return true; + }); + // Provide the bus object for gnome-session to // initiate logouts. EndSessionDialog.init(); @@ -606,3 +617,28 @@ function queueDeferredWork(workId) { GLib.Source.set_name_by_id(_deferredTimeoutId, '[gnome-shell] _runAllDeferredWork'); } } + +const RestartMessage = new Lang.Class({ + Name: 'RestartMessage', + Extends: ModalDialog.ModalDialog, + + _init : function(message) { + this.parent({ shellReactive: true, + styleClass: 'restart-message', + shouldFadeIn: false, + destroyOnClose: true }); + + let label = new St.Label({ text: message }); + + this.contentLayout.add(label, { x_fill: false, + y_fill: false, + x_align: St.Align.MIDDLE, + y_align: St.Align.MIDDLE }); + this.buttonLayout.hide(); + } +}); + +function showRestartMessage(message) { + let restartMessage = new RestartMessage(message); + restartMessage.open(); +} diff --git a/js/ui/modalDialog.js b/js/ui/modalDialog.js index 5d10613f8..a0369e63d 100644 --- a/js/ui/modalDialog.js +++ b/js/ui/modalDialog.js @@ -43,6 +43,7 @@ const ModalDialog = new Lang.Class({ styleClass: null, keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL, shouldFadeIn: true, + shouldFadeOut: true, destroyOnClose: true }); this.state = State.CLOSED; @@ -50,6 +51,7 @@ const ModalDialog = new Lang.Class({ this._keybindingMode = params.keybindingMode; this._shellReactive = params.shellReactive; this._shouldFadeIn = params.shouldFadeIn; + this._shouldFadeOut = params.shouldFadeOut; this._destroyOnClose = params.destroyOnClose; this._group = new St.Widget({ visible: false, @@ -307,6 +309,15 @@ const ModalDialog = new Lang.Class({ return true; }, + _closeComplete: function() { + this.state = State.CLOSED; + this._group.hide(); + this.emit('closed'); + + if (this._destroyOnClose) + this.destroy(); + }, + close: function(timestamp) { if (this.state == State.CLOSED || this.state == State.CLOSING) return; @@ -315,20 +326,16 @@ const ModalDialog = new Lang.Class({ this.popModal(timestamp); this._savedKeyFocus = null; - Tweener.addTween(this._group, - { opacity: 0, - time: OPEN_AND_CLOSE_TIME, - transition: 'easeOutQuad', - onComplete: Lang.bind(this, - function() { - this.state = State.CLOSED; - this._group.hide(); - this.emit('closed'); - - if (this._destroyOnClose) - this.destroy(); - }) - }); + if (this._shouldFadeOut) + Tweener.addTween(this._group, + { opacity: 0, + time: OPEN_AND_CLOSE_TIME, + transition: 'easeOutQuad', + onComplete: Lang.bind(this, + this._closeComplete) + }) + else + this._closeComplete(); }, // Drop modal status without closing the dialog; this makes the diff --git a/js/ui/runDialog.js b/js/ui/runDialog.js index faf16891d..504e90446 100644 --- a/js/ui/runDialog.js +++ b/js/ui/runDialog.js @@ -50,14 +50,10 @@ const RunDialog = new Lang.Class({ Main.createLookingGlass().open(); }), - 'r': Lang.bind(this, function() { - global.reexec_self(); - }), + 'r': Lang.bind(this, this._restart), // Developer brain backwards compatibility - 'restart': Lang.bind(this, function() { - global.reexec_self(); - }), + 'restart': Lang.bind(this, this._restart), 'debugexit': Lang.bind(this, function() { Meta.quit(Meta.ExitCode.ERROR); @@ -271,6 +267,12 @@ const RunDialog = new Lang.Class({ } }, + _restart: function() { + this._shouldFadeOut = false; + this.close(); + Meta.restart('Restarting...'); + }, + open: function() { this._history.lastItem(); this._errorBox.hide();