Show the panel above the screenshield when locked

Track locked status and use it to provide a reduced version of
the panel in the locked screen. Accessibility, input sources and
volume menus are preserved, without the link to the control center.
Network, battery and user menu are reduced to pure indicators,
with no menu.
This is similar to the design but not exactly, because designers
in IRC said that network needs more analysis before exposing, and
because the design didn't account for a11y and IM (so the one menu
metaphor is not really appropriate).

https://bugzilla.gnome.org/show_bug.cgi?id=619955
This commit is contained in:
Giovanni Campagna 2012-05-23 00:27:06 +02:00
parent 904ceba6b2
commit c3afe1a83a
11 changed files with 87 additions and 9 deletions

View File

@ -33,6 +33,12 @@ const LayoutManager = new Lang.Class({
this._chrome = new Chrome(this); this._chrome = new Chrome(this);
this.screenShieldGroup = new St.Widget({ name: 'screenShieldGroup',
visible: false,
clip_to_allocation: true,
});
this.addChrome(this.screenShieldGroup);
this.panelBox = new St.BoxLayout({ name: 'panelBox', this.panelBox = new St.BoxLayout({ name: 'panelBox',
vertical: true }); vertical: true });
this.addChrome(this.panelBox, { affectsStruts: true, this.addChrome(this.panelBox, { affectsStruts: true,
@ -40,12 +46,6 @@ const LayoutManager = new Lang.Class({
this.panelBox.connect('allocation-changed', this.panelBox.connect('allocation-changed',
Lang.bind(this, this._updatePanelBarriers)); Lang.bind(this, this._updatePanelBarriers));
this.screenShieldGroup = new St.Widget({ name: 'screenShieldGroup',
visible: false,
clip_to_allocation: true,
});
this.addChrome(this.screenShieldGroup);
this.trayBox = new St.BoxLayout({ name: 'trayBox' }); this.trayBox = new St.BoxLayout({ name: 'trayBox' });
this.addChrome(this.trayBox); this.addChrome(this.trayBox);
this.trayBox.connect('allocation-changed', this.trayBox.connect('allocation-changed',

View File

@ -467,6 +467,13 @@ const AppMenuButton = new Lang.Class({
this._sync(); this._sync();
}, },
setLockedState: function(locked) {
if (locked)
this.hide();
else
this._sync();
},
_sync: function() { _sync: function() {
let tracker = Shell.WindowTracker.get_default(); let tracker = Shell.WindowTracker.get_default();
let focusedApp = tracker.focus_app; let focusedApp = tracker.focus_app;
@ -910,6 +917,8 @@ const Panel = new Lang.Class({
this.actor.remove_style_class_name('in-overview'); this.actor.remove_style_class_name('in-overview');
})); }));
Main.screenShield.connect('lock-status-changed', Lang.bind(this, this._onLockStateChanged));
this._menus = new PopupMenu.PopupMenuManager(this); this._menus = new PopupMenu.PopupMenuManager(this);
this._leftBox = new St.BoxLayout({ name: 'panelLeft' }); this._leftBox = new St.BoxLayout({ name: 'panelLeft' });
@ -1135,7 +1144,7 @@ const Panel = new Lang.Class({
this._statusArea[role] = indicator; this._statusArea[role] = indicator;
let destroyId = indicator.connect('destroy', Lang.bind(this, function(emitter) { let destroyId = indicator.connect('destroy', Lang.bind(this, function(emitter) {
this._statusArea[role] = null; delete this._statusArea[role];
emitter.disconnect(destroyId); emitter.disconnect(destroyId);
})); }));
@ -1165,4 +1174,16 @@ const Panel = new Lang.Class({
if (box && box._delegate instanceof PanelMenu.ButtonBox) if (box && box._delegate instanceof PanelMenu.ButtonBox)
box.destroy(); box.destroy();
}, },
_onLockStateChanged: function(shield, locked) {
if (this._activitiesButton)
this._activitiesButton.setLockedState(locked);
if (this._appMenu)
this._appMenu.setLockedState(locked);
if (this._dateMenu)
this._dateMenu.setLockedState(locked);
for (let id in this._statusArea)
this._statusArea[id].setLockedState(locked);
},
}); });

View File

@ -145,6 +145,13 @@ const Button = new Lang.Class({
} }
}, },
setLockedState: function(locked) {
// default behaviour is to hide completely
if (locked)
this.menu.close();
this.actor.visible = !locked;
},
_onButtonPress: function(actor, event) { _onButtonPress: function(actor, event) {
if (!this.menu) if (!this.menu)
return; return;

View File

@ -872,6 +872,7 @@ const PopupMenuBase = new Lang.Class({
this._activeMenuItem = null; this._activeMenuItem = null;
this._childMenus = []; this._childMenus = [];
this._settingsActions = { };
}, },
addAction: function(title, callback) { addAction: function(title, callback) {
@ -899,9 +900,19 @@ const PopupMenuBase = new Lang.Class({
Main.overview.hide(); Main.overview.hide();
app.activate(); app.activate();
}); });
this._settingsActions[desktopFile] = menuItem;
return menuItem; return menuItem;
}, },
setSettingsVisibility: function(visible) {
for (let id in this._settingsActions) {
let item = this._settingsActions[id];
item.actor.visible = visible;
}
},
isEmpty: function() { isEmpty: function() {
return this.box.get_n_children() == 0; return this.box.get_n_children() == 0;
}, },

View File

@ -83,6 +83,10 @@ const ATIndicator = new Lang.Class({
this.menu.addSettingsAction(_("Universal Access Settings"), 'gnome-universal-access-panel.desktop'); this.menu.addSettingsAction(_("Universal Access Settings"), 'gnome-universal-access-panel.desktop');
}, },
setLockedState: function(locked) {
this.menu.setSettingsVisibility(!locked);
},
_buildItemExtended: function(string, initial_value, writable, on_set) { _buildItemExtended: function(string, initial_value, writable, on_set) {
let widget = new PopupMenu.PopupSwitchMenuItem(string, initial_value); let widget = new PopupMenu.PopupSwitchMenuItem(string, initial_value);
if (!writable) if (!writable)

View File

@ -92,6 +92,11 @@ const Indicator = new Lang.Class({
this._applet.connect('cancel-request', Lang.bind(this, this._cancelRequest)); this._applet.connect('cancel-request', Lang.bind(this, this._cancelRequest));
}, },
setLockedState: function(locked) {
this._isLocked = locked;
this._updateKillswitch();
},
_updateKillswitch: function() { _updateKillswitch: function() {
let current_state = this._applet.killswitch_state; let current_state = this._applet.killswitch_state;
let on = current_state == GnomeBluetoothApplet.KillswitchState.UNBLOCKED; let on = current_state == GnomeBluetoothApplet.KillswitchState.UNBLOCKED;
@ -106,7 +111,7 @@ const Indicator = new Lang.Class({
/* TRANSLATORS: this means that bluetooth was disabled by hardware rfkill */ /* TRANSLATORS: this means that bluetooth was disabled by hardware rfkill */
this._killswitch.setStatus(_("hardware disabled")); this._killswitch.setStatus(_("hardware disabled"));
this.actor.visible = has_adapter; this.actor.visible = !this._isLocked && has_adapter;
if (on) { if (on) {
this._discoverable.actor.show(); this._discoverable.actor.show();

View File

@ -175,11 +175,16 @@ const InputSourceIndicator = new Lang.Class({
// option if need arises. // option if need arises.
if (Main.sessionMode.allowSettings) { if (Main.sessionMode.allowSettings) {
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, this._showLayout)); this._showLayoutItem = this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, this._showLayout));
} }
this.menu.addSettingsAction(_("Region and Language Settings"), 'gnome-region-panel.desktop'); this.menu.addSettingsAction(_("Region and Language Settings"), 'gnome-region-panel.desktop');
}, },
setLockedState: function(locked) {
this._showLayoutItem.actor.visible = !locked;
this.menu.setSettingsVisibility(!locked);
},
_currentInputSourceChanged: function() { _currentInputSourceChanged: function() {
let nVisibleSources = Object.keys(this._layoutItems).length; let nVisibleSources = Object.keys(this._layoutItems).length;
if (nVisibleSources < 2) if (nVisibleSources < 2)

View File

@ -1698,6 +1698,15 @@ const NMApplet = new Lang.Class({
this._primaryIcon.icon_name = iconName; this._primaryIcon.icon_name = iconName;
}, },
setLockedState: function(locked) {
// FIXME: more design discussion is needed before we can
// expose part of this menu
if (locked)
this.menu.close();
this.actor.reactive = !locked;
},
_ensureSource: function() { _ensureSource: function() {
if (!this._source) { if (!this._source) {
this._source = new MessageTray.Source(_("Network Manager"), this._source = new MessageTray.Source(_("Network Manager"),

View File

@ -80,6 +80,12 @@ const Indicator = new Lang.Class({
this._devicesChanged(); this._devicesChanged();
}, },
setLockedState: function(locked) {
if (locked)
this.menu.close();
this.actor.reactive = !locked;
},
_readPrimaryDevice: function() { _readPrimaryDevice: function() {
this._proxy.GetPrimaryDeviceRemote(Lang.bind(this, function(result, error) { this._proxy.GetPrimaryDeviceRemote(Lang.bind(this, function(result, error) {
if (error) { if (error) {

View File

@ -62,6 +62,10 @@ const Indicator = new Lang.Class({
this._control.open(); this._control.open();
}, },
setLockedState: function(locked) {
this.menu.setSettingsVisibility(!locked);
},
_onScrollEvent: function(actor, event) { _onScrollEvent: function(actor, event) {
let direction = event.get_scroll_direction(); let direction = event.get_scroll_direction();
let currentVolume = this._output.volume; let currentVolume = this._output.volume;

View File

@ -538,6 +538,12 @@ const UserMenuButton = new Lang.Class({
this._upClient.connect('notify::can-suspend', Lang.bind(this, this._updateSuspendOrPowerOff)); this._upClient.connect('notify::can-suspend', Lang.bind(this, this._updateSuspendOrPowerOff));
}, },
setLockedState: function(locked) {
if (locked)
this.menu.close();
this.actor.reactive = !locked;
},
_onDestroy: function() { _onDestroy: function() {
this._user.disconnect(this._userLoadedId); this._user.disconnect(this._userLoadedId);
this._user.disconnect(this._userChangedId); this._user.disconnect(this._userChangedId);