2012-05-16 22:26:44 +00:00
|
|
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
|
|
|
2012-11-28 20:14:21 +00:00
|
|
|
const Gio = imports.gi.Gio;
|
|
|
|
const GLib = imports.gi.GLib;
|
2012-05-16 22:26:44 +00:00
|
|
|
const Lang = imports.lang;
|
2012-09-01 12:42:53 +00:00
|
|
|
const Signals = imports.signals;
|
2012-05-16 22:26:44 +00:00
|
|
|
|
2012-05-17 13:50:51 +00:00
|
|
|
const Main = imports.ui.main;
|
2012-05-16 22:26:44 +00:00
|
|
|
const Params = imports.misc.params;
|
|
|
|
|
2012-09-04 01:26:37 +00:00
|
|
|
const DEFAULT_MODE = 'restrictive';
|
2012-05-16 22:26:44 +00:00
|
|
|
|
|
|
|
const _modes = {
|
2012-09-04 01:26:37 +00:00
|
|
|
'restrictive': {
|
2012-09-04 01:23:22 +00:00
|
|
|
hasOverview: false,
|
|
|
|
showCalendarEvents: false,
|
|
|
|
allowSettings: false,
|
|
|
|
allowExtensions: false,
|
|
|
|
hasRunDialog: false,
|
|
|
|
hasWorkspaces: false,
|
|
|
|
hasWindows: false,
|
2012-08-26 14:53:08 +00:00
|
|
|
hasNotifications: false,
|
2012-09-04 01:26:37 +00:00
|
|
|
isLocked: false,
|
2012-09-04 17:28:19 +00:00
|
|
|
isGreeter: false,
|
2012-09-06 11:21:12 +00:00
|
|
|
isPrimary: false,
|
2012-09-04 17:28:19 +00:00
|
|
|
unlockDialog: null,
|
2012-09-04 01:23:22 +00:00
|
|
|
components: [],
|
2012-09-04 01:26:37 +00:00
|
|
|
panel: {
|
|
|
|
left: [],
|
|
|
|
center: [],
|
|
|
|
right: []
|
|
|
|
},
|
2012-09-21 20:19:27 +00:00
|
|
|
panelStyle: null
|
2012-09-04 01:26:37 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
'gdm': {
|
2012-08-26 14:53:08 +00:00
|
|
|
hasNotifications: true,
|
2012-09-04 17:28:19 +00:00
|
|
|
isGreeter: true,
|
2012-09-06 11:21:12 +00:00
|
|
|
isPrimary: true,
|
2012-09-04 17:28:19 +00:00
|
|
|
unlockDialog: imports.gdm.loginDialog.LoginDialog,
|
2012-09-05 10:50:16 +00:00
|
|
|
components: ['polkitAgent'],
|
2012-09-04 01:23:22 +00:00
|
|
|
panel: {
|
2012-10-17 16:33:47 +00:00
|
|
|
left: ['logo'],
|
2012-09-04 01:23:22 +00:00
|
|
|
center: ['dateMenu'],
|
|
|
|
right: ['a11y', 'display', 'keyboard',
|
|
|
|
'volume', 'battery', 'powerMenu']
|
2012-09-21 20:19:27 +00:00
|
|
|
},
|
|
|
|
panelStyle: 'login-screen'
|
2012-09-04 01:23:22 +00:00
|
|
|
},
|
2012-05-16 22:26:44 +00:00
|
|
|
|
2012-09-01 12:42:53 +00:00
|
|
|
'lock-screen': {
|
2012-09-01 21:44:46 +00:00
|
|
|
isLocked: true,
|
2012-09-10 09:34:49 +00:00
|
|
|
isGreeter: undefined,
|
2012-09-04 17:28:19 +00:00
|
|
|
unlockDialog: undefined,
|
2012-09-20 06:53:20 +00:00
|
|
|
components: ['polkitAgent', 'telepathyClient'],
|
2012-09-01 12:42:53 +00:00
|
|
|
panel: {
|
|
|
|
left: ['userMenu'],
|
|
|
|
center: [],
|
|
|
|
right: ['lockScreen']
|
|
|
|
},
|
2012-09-21 20:19:27 +00:00
|
|
|
panelStyle: 'lock-screen'
|
2012-09-01 12:42:53 +00:00
|
|
|
},
|
|
|
|
|
2012-08-26 14:53:08 +00:00
|
|
|
'unlock-dialog': {
|
|
|
|
isLocked: true,
|
|
|
|
unlockDialog: undefined,
|
2012-09-20 06:53:20 +00:00
|
|
|
components: ['polkitAgent', 'telepathyClient'],
|
2012-08-26 14:53:08 +00:00
|
|
|
panel: {
|
|
|
|
left: ['userMenu'],
|
|
|
|
center: [],
|
|
|
|
right: ['a11y', 'keyboard', 'lockScreen']
|
|
|
|
},
|
2012-09-21 20:19:27 +00:00
|
|
|
panelStyle: 'unlock-screen'
|
2012-08-26 14:53:08 +00:00
|
|
|
},
|
|
|
|
|
2012-09-04 01:23:22 +00:00
|
|
|
'initial-setup': {
|
2012-09-06 11:21:12 +00:00
|
|
|
isPrimary: true,
|
2012-09-04 01:23:22 +00:00
|
|
|
components: ['keyring'],
|
|
|
|
panel: {
|
|
|
|
left: [],
|
|
|
|
center: ['dateMenu'],
|
|
|
|
right: ['a11y', 'keyboard', 'volume']
|
|
|
|
}
|
|
|
|
},
|
2012-05-24 03:37:09 +00:00
|
|
|
|
2012-09-04 01:23:22 +00:00
|
|
|
'user': {
|
|
|
|
hasOverview: true,
|
|
|
|
showCalendarEvents: true,
|
|
|
|
allowSettings: true,
|
|
|
|
allowExtensions: true,
|
|
|
|
hasRunDialog: true,
|
|
|
|
hasWorkspaces: true,
|
|
|
|
hasWindows: true,
|
2012-08-26 14:53:08 +00:00
|
|
|
hasNotifications: true,
|
2012-09-04 17:28:19 +00:00
|
|
|
isLocked: false,
|
2012-09-06 11:21:12 +00:00
|
|
|
isPrimary: true,
|
2012-08-26 14:53:08 +00:00
|
|
|
unlockDialog: imports.ui.unlockDialog.UnlockDialog,
|
2012-09-04 01:23:22 +00:00
|
|
|
components: ['networkAgent', 'polkitAgent', 'telepathyClient',
|
|
|
|
'keyring', 'recorder', 'autorunManager', 'automountManager'],
|
|
|
|
panel: {
|
|
|
|
left: ['activities', 'appMenu'],
|
|
|
|
center: ['dateMenu'],
|
|
|
|
right: ['a11y', 'keyboard', 'volume', 'bluetooth',
|
|
|
|
'network', 'battery', 'userMenu']
|
|
|
|
}
|
|
|
|
}
|
2012-05-16 22:26:44 +00:00
|
|
|
};
|
|
|
|
|
2012-11-28 20:14:21 +00:00
|
|
|
function _getModes() {
|
|
|
|
let modes = _modes;
|
|
|
|
let dataDirs = GLib.get_system_data_dirs();
|
|
|
|
for (let i = 0; i < dataDirs.length; i++) {
|
|
|
|
let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'modes']);
|
|
|
|
let dir = Gio.file_new_for_path(path);
|
|
|
|
|
|
|
|
try {
|
|
|
|
dir.query_info('standard:type', Gio.FileQueryInfoFlags.NONE, null);
|
|
|
|
} catch (e) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
_getModesFromDir(dir, modes);
|
|
|
|
}
|
|
|
|
return modes;
|
|
|
|
}
|
|
|
|
|
|
|
|
function _getModesFromDir(dir, modes) {
|
|
|
|
let fileEnum;
|
|
|
|
try {
|
|
|
|
fileEnum = dir.enumerate_children('standard::*',
|
|
|
|
Gio.FileQueryInfoFlags.NONE, null);
|
|
|
|
} catch(e) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
let info;
|
|
|
|
while ((info = fileEnum.next_file(null)) != null) {
|
|
|
|
let name = info.get_name();
|
|
|
|
let suffix = name.indexOf('.json');
|
|
|
|
let modeName = suffix == -1 ? name : name.slice(name, suffix);
|
|
|
|
|
|
|
|
if (modes.hasOwnProperty(modeName))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
let file = dir.get_child(name);
|
|
|
|
let fileContent, success, tag, newMode;
|
|
|
|
try {
|
|
|
|
[success, fileContent, tag] = file.load_contents(null);
|
|
|
|
newMode = JSON.parse(fileContent);
|
|
|
|
} catch(e) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
modes[modeName] = {};
|
|
|
|
let propBlacklist = ['unlockDialog'];
|
|
|
|
for (let prop in modes[DEFAULT_MODE]) {
|
|
|
|
if (newMode[prop] !== undefined &&
|
|
|
|
propBlacklist.indexOf(prop) == -1)
|
|
|
|
modes[modeName][prop]= newMode[prop];
|
|
|
|
}
|
|
|
|
modes[modeName]['isPrimary'] = true;
|
|
|
|
}
|
|
|
|
fileEnum.close(null);
|
|
|
|
}
|
|
|
|
|
2012-05-18 01:52:57 +00:00
|
|
|
function listModes() {
|
2012-11-28 20:14:21 +00:00
|
|
|
let modes = Object.getOwnPropertyNames(_getModes());
|
2012-05-18 01:52:57 +00:00
|
|
|
for (let i = 0; i < modes.length; i++)
|
2012-09-06 11:21:12 +00:00
|
|
|
if (_modes[modes[i]].isPrimary)
|
|
|
|
print(modes[i]);
|
2012-05-18 01:52:57 +00:00
|
|
|
}
|
|
|
|
|
2012-05-16 22:26:44 +00:00
|
|
|
const SessionMode = new Lang.Class({
|
|
|
|
Name: 'SessionMode',
|
|
|
|
|
|
|
|
_init: function() {
|
2012-09-01 12:42:53 +00:00
|
|
|
global.connect('notify::session-mode', Lang.bind(this, this._sync));
|
2012-11-28 20:14:21 +00:00
|
|
|
this._modes = _getModes();
|
|
|
|
let mode = this._modes[global.session_mode].isPrimary ? global.session_mode
|
|
|
|
: 'user';
|
2012-09-06 11:21:12 +00:00
|
|
|
this._modeStack = [mode];
|
2012-09-01 12:42:53 +00:00
|
|
|
this._sync();
|
|
|
|
},
|
|
|
|
|
|
|
|
pushMode: function(mode) {
|
|
|
|
this._modeStack.push(mode);
|
|
|
|
this._sync();
|
|
|
|
},
|
|
|
|
|
|
|
|
popMode: function(mode) {
|
|
|
|
if (this.currentMode != mode || this._modeStack.length === 1)
|
|
|
|
throw new Error("Invalid SessionMode.popMode");
|
|
|
|
this._modeStack.pop();
|
|
|
|
this._sync();
|
|
|
|
},
|
|
|
|
|
2012-08-26 14:53:08 +00:00
|
|
|
switchMode: function(to) {
|
|
|
|
if (this.currentMode == to)
|
|
|
|
return;
|
|
|
|
this._modeStack[this._modeStack.length - 1] = to;
|
|
|
|
this._sync();
|
|
|
|
},
|
|
|
|
|
2012-09-01 12:42:53 +00:00
|
|
|
get currentMode() {
|
|
|
|
return this._modeStack[this._modeStack.length - 1];
|
|
|
|
},
|
2012-05-16 22:26:44 +00:00
|
|
|
|
2012-09-01 12:42:53 +00:00
|
|
|
_sync: function() {
|
2012-11-28 20:14:21 +00:00
|
|
|
let params = this._modes[this.currentMode];
|
|
|
|
params = Params.parse(params, this._modes[DEFAULT_MODE]);
|
2012-05-17 13:50:51 +00:00
|
|
|
|
2012-09-04 17:28:19 +00:00
|
|
|
// A simplified version of Lang.copyProperties, handles
|
|
|
|
// undefined as a special case for "no change / inherit from previous mode"
|
|
|
|
for (let prop in params) {
|
|
|
|
if (params[prop] !== undefined)
|
|
|
|
this[prop] = params[prop];
|
|
|
|
}
|
2012-05-17 13:50:51 +00:00
|
|
|
|
2012-09-01 12:42:53 +00:00
|
|
|
this.emit('updated');
|
2012-09-04 17:28:19 +00:00
|
|
|
}
|
2012-05-16 22:26:44 +00:00
|
|
|
});
|
2012-09-01 12:42:53 +00:00
|
|
|
Signals.addSignalMethods(SessionMode.prototype);
|