UserMenu: show "Install Updates & Restart" when appropriate

When PackageKit signals that it prepared an update, offer an option
to reboot and apply it, using a helper that will setup the next
reboot and then calling to gnome-session.

https://bugzilla.gnome.org/show_bug.cgi?id=677394
This commit is contained in:
Giovanni Campagna 2012-06-03 17:35:37 +02:00
parent 8754b2767c
commit 34831796f6
2 changed files with 23 additions and 0 deletions

View File

@ -50,6 +50,7 @@ const SessionManagerIface = <interface name="org.gnome.SessionManager">
<arg type="u" direction="in" /> <arg type="u" direction="in" />
</method> </method>
<method name="Shutdown" /> <method name="Shutdown" />
<method name="Reboot" />
<method name="CanShutdown"> <method name="CanShutdown">
<arg type="b" direction="out" /> <arg type="b" direction="out" />
</method> </method>

View File

@ -523,6 +523,10 @@ const UserMenuButton = new Lang.Class({
this._updateLogout(); this._updateLogout();
this._updateLockScreen(); this._updateLockScreen();
this._updatesFile = Gio.File.new_for_path('/var/lib/PackageKit/prepared-update');
this._updatesMonitor = this._updatesFile.monitor(Gio.FileMonitorFlags.NONE, null);
this._updatesMonitor.connect('changed', Lang.bind(this, this._updateInstallUpdates));
// Whether shutdown is available or not depends on both lockdown // Whether shutdown is available or not depends on both lockdown
// settings (disable-log-out) and Polkit policy - the latter doesn't // settings (disable-log-out) and Polkit policy - the latter doesn't
// notify, so we update the menu item each time the menu opens or // notify, so we update the menu item each time the menu opens or
@ -578,11 +582,17 @@ const UserMenuButton = new Lang.Class({
this._lockScreenItem.actor.visible = allowLockScreen; this._lockScreenItem.actor.visible = allowLockScreen;
}, },
_updateInstallUpdates: function() {
let haveUpdates = this._updatesFile.query_exists(null);
this._installUpdatesItem.actor.visible = haveUpdates && this._haveShutdown;
},
_updateHaveShutdown: function() { _updateHaveShutdown: function() {
this._session.CanShutdownRemote(Lang.bind(this, this._session.CanShutdownRemote(Lang.bind(this,
function(result, error) { function(result, error) {
if (!error) { if (!error) {
this._haveShutdown = result[0]; this._haveShutdown = result[0];
this._updateInstallUpdates();
this._updateSuspendOrPowerOff(); this._updateSuspendOrPowerOff();
} }
})); }));
@ -711,6 +721,11 @@ const UserMenuButton = new Lang.Class({
item = new PopupMenu.PopupSeparatorMenuItem(); item = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(item); this.menu.addMenuItem(item);
item = new PopupMenu.PopupMenuItem(_("Install Updates & Restart"));
item.connect('activate', Lang.bind(this, this._onInstallUpdatesActivate));
this.menu.addMenuItem(item);
this._installUpdatesItem = item;
item = new PopupMenu.PopupAlternatingMenuItem(_("Power Off"), item = new PopupMenu.PopupAlternatingMenuItem(_("Power Off"),
_("Suspend")); _("Suspend"));
this.menu.addMenuItem(item); this.menu.addMenuItem(item);
@ -769,6 +784,13 @@ const UserMenuButton = new Lang.Class({
this._session.LogoutRemote(0); this._session.LogoutRemote(0);
}, },
_onInstallUpdatesActivate: function() {
Main.overview.hide();
Util.spawn(['pkexec', '/usr/libexec/pk-trigger-offline-update']);
this._session.RebootRemote();
},
_onSuspendOrPowerOffActivate: function() { _onSuspendOrPowerOffActivate: function() {
Main.overview.hide(); Main.overview.hide();