[gnome-shell] Add support for meta_restart() and MetaDisplay::restart



commit b6f3e15037c9ab96cadabddbae10609b2749e3e2
Author: Owen W. Taylor <otaylor fishsoup net>
Date:   Thu May 8 18:56:23 2014 -0400

    Add support for meta_restart() and MetaDisplay::restart
    
    Support was added to Mutter to allow it to trigger a restart
    to allow for restarts when switching in or out of stereo mode.
    
    Hook up to the new signals on MetaDisplay to show the restart
    message and reexec. Meta.is_restart() is used to suppress
    the startup animation.
    
    This also allows us to do 'Alt-F2 r' restarts more cleanly
    without a visual flash and animation.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=733026

 data/theme/gnome-shell.css |    5 +++++
 js/ui/layout.js            |    8 ++++++--
 js/ui/main.js              |   36 ++++++++++++++++++++++++++++++++++++
 js/ui/modalDialog.js       |   35 +++++++++++++++++++++--------------
 js/ui/runDialog.js         |   14 ++++++++------
 5 files changed, 76 insertions(+), 22 deletions(-)
---
diff --git a/data/theme/gnome-shell.css b/data/theme/gnome-shell.css
index c2d1f18..db671e7 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 789097e..fb1b879 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 3e5317f..9f4efa8 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 5d10613..a0369e6 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 faf1689..504e904 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();


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]