Don't track the status of the screensaver on DBus

We are the screensaver now, and internal objects can track the
locking status better themselves. And to do so, add two signals
to ScreenShield.

https://bugzilla.gnome.org/show_bug.cgi?id=619955
This commit is contained in:
Giovanni Campagna 2012-05-22 23:24:32 +02:00
parent 22eea750f3
commit 34cb92ff4c
5 changed files with 22 additions and 92 deletions

View File

@ -32,7 +32,6 @@ nobase_dist_js_DATA = \
misc/jsParse.js \ misc/jsParse.js \
misc/modemManager.js \ misc/modemManager.js \
misc/params.js \ misc/params.js \
misc/screenSaver.js \
misc/util.js \ misc/util.js \
perf/core.js \ perf/core.js \
ui/altTab.js \ ui/altTab.js \

View File

@ -1,48 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio;
const Lang = imports.lang;
const ScreenSaverIface = <interface name="org.gnome.ScreenSaver">
<method name="GetActive">
<arg type="b" direction="out" />
</method>
<method name="Lock" />
<method name="SetActive">
<arg type="b" direction="in" />
</method>
<signal name="ActiveChanged">
<arg type="b" direction="out" />
</signal>
</interface>;
const ScreenSaverInfo = Gio.DBusInterfaceInfo.new_for_xml(ScreenSaverIface);
function ScreenSaverProxy() {
var self = new Gio.DBusProxy({ g_connection: Gio.DBus.session,
g_interface_name: ScreenSaverInfo.name,
g_interface_info: ScreenSaverInfo,
g_name: 'org.gnome.ScreenSaver',
g_object_path: '/org/gnome/ScreenSaver',
g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START |
Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
self.init(null);
self.screenSaverActive = false;
self.connectSignal('ActiveChanged', function(proxy, senderName, [isActive]) {
self.screenSaverActive = isActive;
});
self.connect('notify::g-name-owner', function() {
if (self.g_name_owner) {
self.GetActiveRemote(function(result, excp) {
if (result) {
let [isActive] = result;
self.screenSaverActive = isActive;
}
});
} else
self.screenSaverActive = false;
});
return self;
}

View File

@ -9,7 +9,6 @@ const Params = imports.misc.params;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Main = imports.ui.main; const Main = imports.ui.main;
const ShellMountOperation = imports.ui.shellMountOperation; const ShellMountOperation = imports.ui.shellMountOperation;
const ScreenSaver = imports.misc.screenSaver;
const GnomeSession = imports.misc.gnomeSession; const GnomeSession = imports.misc.gnomeSession;
const GNOME_SESSION_AUTOMOUNT_INHIBIT = 16; const GNOME_SESSION_AUTOMOUNT_INHIBIT = 16;
@ -92,9 +91,7 @@ const AutomountManager = new Lang.Class({
if (!haveSystemd()) if (!haveSystemd())
this.ckListener = new ConsoleKitManager(); this.ckListener = new ConsoleKitManager();
this._ssProxy = new ScreenSaver.ScreenSaverProxy(); Main.screenShield.connect('lock-status-changed', Lang.bind(this, this._lockStatusChanged));
this._ssProxy.connectSignal('ActiveChanged',
Lang.bind(this, this._screenSaverActiveChanged));
this._volumeMonitor = Gio.VolumeMonitor.get(); this._volumeMonitor = Gio.VolumeMonitor.get();
@ -127,8 +124,8 @@ const AutomountManager = new Lang.Class({
})); }));
}, },
_screenSaverActiveChanged: function(object, senderName, [isActive]) { _lockStatusChanged: function(shield, locked) {
if (!isActive) { if (!locked) {
this._volumeQueue.forEach(Lang.bind(this, function(volume) { this._volumeQueue.forEach(Lang.bind(this, function(volume) {
this._checkAndMountVolume(volume); this._checkAndMountVolume(volume);
})); }));
@ -166,7 +163,7 @@ const AutomountManager = new Lang.Class({
if (!this.isSessionActive()) if (!this.isSessionActive())
return; return;
if (this._ssProxy.screenSaverActive) if (Main.screenShield.locked)
return; return;
global.play_theme_sound(0, 'device-added-media'); global.play_theme_sound(0, 'device-added-media');
@ -178,7 +175,7 @@ const AutomountManager = new Lang.Class({
if (!this.isSessionActive()) if (!this.isSessionActive())
return; return;
if (this._ssProxy.screenSaverActive) if (Main.screenShield.locked)
return; return;
global.play_theme_sound(0, 'device-removed-media'); global.play_theme_sound(0, 'device-removed-media');
@ -230,7 +227,7 @@ const AutomountManager = new Lang.Class({
if (!this.isSessionActive()) if (!this.isSessionActive())
return; return;
if (this._ssProxy.screenSaverActive) { if (Main.screenShield.locked) {
if (this._volumeQueue.indexOf(volume) == -1) if (this._volumeQueue.indexOf(volume) == -1)
this._volumeQueue.push(volume); this._volumeQueue.push(volume);

View File

@ -11,7 +11,6 @@ const St = imports.gi.St;
const DND = imports.ui.dnd; const DND = imports.ui.dnd;
const Main = imports.ui.main; const Main = imports.ui.main;
const Params = imports.misc.params; const Params = imports.misc.params;
const ScreenSaver = imports.misc.screenSaver;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const HOT_CORNER_ACTIVATION_TIMEOUT = 0.5; const HOT_CORNER_ACTIVATION_TIMEOUT = 0.5;
@ -565,6 +564,7 @@ const Chrome = new Lang.Class({
this._monitors = []; this._monitors = [];
this._inOverview = false; this._inOverview = false;
this._isLocked = false;
this._updateRegionIdle = 0; this._updateRegionIdle = 0;
this._freezeUpdateCount = 0; this._freezeUpdateCount = 0;
@ -579,16 +579,6 @@ const Chrome = new Lang.Class({
global.screen.connect('notify::n-workspaces', global.screen.connect('notify::n-workspaces',
Lang.bind(this, this._queueUpdateRegions)); Lang.bind(this, this._queueUpdateRegions));
this._screenSaverActive = false;
this._screenSaverProxy = new ScreenSaver.ScreenSaverProxy();
this._screenSaverProxy.connectSignal('ActiveChanged', Lang.bind(this, function(proxy, senderName, [isActive]) {
this._onScreenSaverActiveChanged(isActive);
}));
this._screenSaverProxy.GetActiveRemote(Lang.bind(this, function(result, err) {
if (!err)
this._onScreenSaverActiveChanged(result[0]);
}));
this._relayout(); this._relayout();
}, },
@ -597,6 +587,8 @@ const Chrome = new Lang.Class({
Lang.bind(this, this._overviewShowing)); Lang.bind(this, this._overviewShowing));
Main.overview.connect('hidden', Main.overview.connect('hidden',
Lang.bind(this, this._overviewHidden)); Lang.bind(this, this._overviewHidden));
Main.screenShield.connect('lock-status-changed',
Lang.bind(this, this._lockStatusChanged));
}, },
addActor: function(actor, params) { addActor: function(actor, params) {
@ -690,16 +682,13 @@ const Chrome = new Lang.Class({
_updateVisibility: function() { _updateVisibility: function() {
for (let i = 0; i < this._trackedActors.length; i++) { for (let i = 0; i < this._trackedActors.length; i++) {
let actorData = this._trackedActors[i], visible;
if (!actorData.trackFullscreen) if (!actorData.trackFullscreen)
continue; continue;
let actorData = this._trackedActors[i], visible;
if (!actorData.isToplevel) if (!actorData.isToplevel)
continue; continue;
if (this._screenSaverActive) if (this._inOverview || this._isLocked)
visible = false;
else if (this._inOverview)
visible = true; visible = true;
else if (this.findMonitorForActor(actorData.actor).inFullscreen) else if (this.findMonitorForActor(actorData.actor).inFullscreen)
visible = false; visible = false;
@ -721,6 +710,12 @@ const Chrome = new Lang.Class({
this._queueUpdateRegions(); this._queueUpdateRegions();
}, },
_lockStatusChanged: function(shield, locked) {
this._isLocked = locked;
this._updateVisibility();
this._queueUpdateRegions();
},
_relayout: function() { _relayout: function() {
this._monitors = this._layoutManager.monitors; this._monitors = this._layoutManager.monitors;
this._primaryMonitor = this._layoutManager.primaryMonitor; this._primaryMonitor = this._layoutManager.primaryMonitor;
@ -730,12 +725,6 @@ const Chrome = new Lang.Class({
this._queueUpdateRegions(); this._queueUpdateRegions();
}, },
_onScreenSaverActiveChanged: function(screenSaverActive) {
this._screenSaverActive = screenSaverActive;
this._updateVisibility();
this._queueUpdateRegions();
},
_findMonitorForRect: function(x, y, w, h) { _findMonitorForRect: function(x, y, w, h) {
// First look at what monitor the center of the rectangle is at // First look at what monitor the center of the rectangle is at
let cx = x + w/2; let cx = x + w/2;

View File

@ -16,7 +16,6 @@ const GnomeSession = imports.misc.gnomeSession;
const Main = imports.ui.main; const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const ScreenSaver = imports.misc.screenSaver;
const Util = imports.misc.util; const Util = imports.misc.util;
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown'; const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
@ -451,7 +450,6 @@ const UserMenuButton = new Lang.Class({
this._accountMgr = Tp.AccountManager.dup(); this._accountMgr = Tp.AccountManager.dup();
this._upClient = new UPowerGlib.Client(); this._upClient = new UPowerGlib.Client();
this._screenSaverProxy = new ScreenSaver.ScreenSaverProxy();
this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._iconBox = new St.Bin(); this._iconBox = new St.Bin();
@ -769,16 +767,13 @@ const UserMenuButton = new Lang.Class({
_onLockScreenActivate: function() { _onLockScreenActivate: function() {
Main.overview.hide(); Main.overview.hide();
this._screenSaverProxy.LockRemote(); Main.screenShield.lock();
}, },
_onLoginScreenActivate: function() { _onLoginScreenActivate: function() {
Main.overview.hide(); Main.overview.hide();
// Ensure we only move to GDM after the screensaver has activated; in some Main.screenShield.lock();
// OS configurations, the X server may block event processing on VT switch this._userManager.goto_login_session();
this._screenSaverProxy.SetActiveRemote(true, Lang.bind(this, function() {
this._userManager.goto_login_session();
}));
}, },
_onQuitSessionActivate: function() { _onQuitSessionActivate: function() {
@ -800,10 +795,8 @@ const UserMenuButton = new Lang.Class({
this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) { this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) {
this._session.ShutdownRemote(); this._session.ShutdownRemote();
} else { } else {
// Ensure we only suspend after locking the screen Main.screenShield.lock();
this._screenSaverProxy.LockRemote(Lang.bind(this, function() { this._upClient.suspend_sync(null);
this._upClient.suspend_sync(null);
}));
} }
} }
}); });