|
Packit |
d345d1 |
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
const GLib = imports.gi.GLib;
|
|
Packit |
d345d1 |
const Mainloop = imports.mainloop;
|
|
Packit |
d345d1 |
const Signals = imports.signals;
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
const FileUtils = imports.misc.fileUtils;
|
|
Packit |
d345d1 |
const Params = imports.misc.params;
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
const Config = imports.misc.config;
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
const DEFAULT_MODE = 'restrictive';
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
const _modes = {
|
|
Packit |
d345d1 |
'restrictive': {
|
|
Packit |
d345d1 |
parentMode: null,
|
|
Packit |
d345d1 |
stylesheetName: 'gnome-shell.css',
|
|
Packit |
d345d1 |
hasOverview: false,
|
|
Packit |
d345d1 |
showCalendarEvents: false,
|
|
Packit |
d345d1 |
allowSettings: false,
|
|
Packit |
d345d1 |
allowExtensions: false,
|
|
Packit |
d345d1 |
allowScreencast: false,
|
|
Packit |
d345d1 |
enabledExtensions: [],
|
|
Packit |
d345d1 |
hasRunDialog: false,
|
|
Packit |
d345d1 |
hasWorkspaces: false,
|
|
Packit |
d345d1 |
hasWindows: false,
|
|
Packit |
d345d1 |
hasNotifications: false,
|
|
Packit |
d345d1 |
isLocked: false,
|
|
Packit |
d345d1 |
isGreeter: false,
|
|
Packit |
d345d1 |
isPrimary: false,
|
|
Packit |
d345d1 |
unlockDialog: null,
|
|
Packit |
d345d1 |
components: [],
|
|
Packit |
d345d1 |
panel: {
|
|
Packit |
d345d1 |
left: [],
|
|
Packit |
d345d1 |
center: [],
|
|
Packit |
d345d1 |
right: []
|
|
Packit |
d345d1 |
},
|
|
Packit |
d345d1 |
panelStyle: null
|
|
Packit |
d345d1 |
},
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
'gdm': {
|
|
Packit |
d345d1 |
hasNotifications: true,
|
|
Packit |
d345d1 |
isGreeter: true,
|
|
Packit |
d345d1 |
isPrimary: true,
|
|
Packit |
d345d1 |
unlockDialog: imports.gdm.loginDialog.LoginDialog,
|
|
Packit |
d345d1 |
components: ['polkitAgent'],
|
|
Packit |
d345d1 |
panel: {
|
|
Packit |
d345d1 |
left: [],
|
|
Packit |
d345d1 |
center: ['dateMenu'],
|
|
Packit |
d345d1 |
right: ['a11y', 'keyboard', 'aggregateMenu']
|
|
Packit |
d345d1 |
},
|
|
Packit |
d345d1 |
panelStyle: 'login-screen'
|
|
Packit |
d345d1 |
},
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
'lock-screen': {
|
|
Packit |
d345d1 |
isLocked: true,
|
|
Packit |
d345d1 |
isGreeter: undefined,
|
|
Packit |
d345d1 |
unlockDialog: undefined,
|
|
Packit |
d345d1 |
components: ['polkitAgent', 'telepathyClient'],
|
|
Packit |
d345d1 |
panel: {
|
|
Packit |
d345d1 |
left: [],
|
|
Packit |
d345d1 |
center: [],
|
|
Packit |
d345d1 |
right: ['aggregateMenu']
|
|
Packit |
d345d1 |
},
|
|
Packit |
d345d1 |
panelStyle: 'lock-screen'
|
|
Packit |
d345d1 |
},
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
'unlock-dialog': {
|
|
Packit |
d345d1 |
isLocked: true,
|
|
Packit |
d345d1 |
unlockDialog: undefined,
|
|
Packit |
d345d1 |
components: ['polkitAgent', 'telepathyClient'],
|
|
Packit |
d345d1 |
panel: {
|
|
Packit |
d345d1 |
left: [],
|
|
Packit |
d345d1 |
center: [],
|
|
Packit |
d345d1 |
right: ['a11y', 'keyboard', 'aggregateMenu']
|
|
Packit |
d345d1 |
},
|
|
Packit |
d345d1 |
panelStyle: 'unlock-screen'
|
|
Packit |
d345d1 |
},
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
'user': {
|
|
Packit |
d345d1 |
hasOverview: true,
|
|
Packit |
d345d1 |
showCalendarEvents: true,
|
|
Packit |
d345d1 |
allowSettings: true,
|
|
Packit |
d345d1 |
allowExtensions: true,
|
|
Packit |
d345d1 |
allowScreencast: true,
|
|
Packit |
d345d1 |
hasRunDialog: true,
|
|
Packit |
d345d1 |
hasWorkspaces: true,
|
|
Packit |
d345d1 |
hasWindows: true,
|
|
Packit |
d345d1 |
hasNotifications: true,
|
|
Packit |
d345d1 |
isLocked: false,
|
|
Packit |
d345d1 |
isPrimary: true,
|
|
Packit |
d345d1 |
unlockDialog: imports.ui.unlockDialog.UnlockDialog,
|
|
Packit |
d345d1 |
components: Config.HAVE_NETWORKMANAGER ?
|
|
Packit |
d345d1 |
['networkAgent', 'polkitAgent', 'telepathyClient',
|
|
Packit |
d345d1 |
'keyring', 'autorunManager', 'automountManager'] :
|
|
Packit |
d345d1 |
['polkitAgent', 'telepathyClient',
|
|
Packit |
d345d1 |
'keyring', 'autorunManager', 'automountManager'],
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
panel: {
|
|
Packit |
d345d1 |
left: ['activities', 'appMenu'],
|
|
Packit |
d345d1 |
center: ['dateMenu'],
|
|
Packit |
d345d1 |
right: ['a11y', 'keyboard', 'aggregateMenu']
|
|
Packit |
d345d1 |
}
|
|
Packit |
d345d1 |
}
|
|
Packit |
d345d1 |
};
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
function _loadMode(file, info) {
|
|
Packit |
d345d1 |
let name = info.get_name();
|
|
Packit |
d345d1 |
let suffix = name.indexOf('.json');
|
|
Packit |
d345d1 |
let modeName = suffix == -1 ? name : name.slice(name, suffix);
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
if (_modes.hasOwnProperty(modeName))
|
|
Packit |
d345d1 |
return;
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
let fileContent, success, tag, newMode;
|
|
Packit |
d345d1 |
try {
|
|
Packit |
d345d1 |
[success, fileContent, tag] = file.load_contents(null);
|
|
Packit |
d345d1 |
if (fileContent instanceof Uint8Array)
|
|
Packit |
d345d1 |
fileContent = imports.byteArray.toString(fileContent);
|
|
Packit |
d345d1 |
newMode = JSON.parse(fileContent);
|
|
Packit |
d345d1 |
} catch(e) {
|
|
Packit |
d345d1 |
return;
|
|
Packit |
d345d1 |
}
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
_modes[modeName] = {};
|
|
Packit |
d345d1 |
let propBlacklist = ['unlockDialog'];
|
|
Packit |
d345d1 |
for (let prop in _modes[DEFAULT_MODE]) {
|
|
Packit |
d345d1 |
if (newMode[prop] !== undefined &&
|
|
Packit |
d345d1 |
propBlacklist.indexOf(prop) == -1)
|
|
Packit |
d345d1 |
_modes[modeName][prop] = newMode[prop];
|
|
Packit |
d345d1 |
}
|
|
Packit |
d345d1 |
_modes[modeName]['isPrimary'] = true;
|
|
Packit |
d345d1 |
}
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
function _loadModes() {
|
|
Packit |
d345d1 |
FileUtils.collectFromDatadirs('modes', false, _loadMode);
|
|
Packit |
d345d1 |
}
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
function listModes() {
|
|
Packit |
d345d1 |
_loadModes();
|
|
Packit |
d345d1 |
let id = Mainloop.idle_add(() => {
|
|
Packit |
d345d1 |
let names = Object.getOwnPropertyNames(_modes);
|
|
Packit |
d345d1 |
for (let i = 0; i < names.length; i++)
|
|
Packit |
d345d1 |
if (_modes[names[i]].isPrimary)
|
|
Packit |
d345d1 |
print(names[i]);
|
|
Packit |
d345d1 |
Mainloop.quit('listModes');
|
|
Packit |
d345d1 |
});
|
|
Packit |
d345d1 |
GLib.Source.set_name_by_id(id, '[gnome-shell] listModes');
|
|
Packit |
d345d1 |
Mainloop.run('listModes');
|
|
Packit |
d345d1 |
}
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
var SessionMode = class {
|
|
Packit |
d345d1 |
constructor() {
|
|
Packit |
d345d1 |
_loadModes();
|
|
Packit |
d345d1 |
let isPrimary = (_modes[global.session_mode] &&
|
|
Packit |
d345d1 |
_modes[global.session_mode].isPrimary);
|
|
Packit |
d345d1 |
let mode = isPrimary ? global.session_mode : 'user';
|
|
Packit |
d345d1 |
this._modeStack = [mode];
|
|
Packit |
d345d1 |
this._sync();
|
|
Packit |
d345d1 |
}
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
pushMode(mode) {
|
|
Packit |
d345d1 |
this._modeStack.push(mode);
|
|
Packit |
d345d1 |
this._sync();
|
|
Packit |
d345d1 |
}
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
popMode(mode) {
|
|
Packit |
d345d1 |
if (this.currentMode != mode || this._modeStack.length === 1)
|
|
Packit |
d345d1 |
throw new Error("Invalid SessionMode.popMode");
|
|
Packit |
d345d1 |
this._modeStack.pop();
|
|
Packit |
d345d1 |
this._sync();
|
|
Packit |
d345d1 |
}
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
switchMode(to) {
|
|
Packit |
d345d1 |
if (this.currentMode == to)
|
|
Packit |
d345d1 |
return;
|
|
Packit |
d345d1 |
this._modeStack[this._modeStack.length - 1] = to;
|
|
Packit |
d345d1 |
this._sync();
|
|
Packit |
d345d1 |
}
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
get currentMode() {
|
|
Packit |
d345d1 |
return this._modeStack[this._modeStack.length - 1];
|
|
Packit |
d345d1 |
}
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
_sync() {
|
|
Packit |
d345d1 |
let params = _modes[this.currentMode];
|
|
Packit |
d345d1 |
let defaults;
|
|
Packit |
d345d1 |
if (params.parentMode)
|
|
Packit |
d345d1 |
defaults = Params.parse(_modes[params.parentMode],
|
|
Packit |
d345d1 |
_modes[DEFAULT_MODE]);
|
|
Packit |
d345d1 |
else
|
|
Packit |
d345d1 |
defaults = _modes[DEFAULT_MODE];
|
|
Packit |
d345d1 |
params = Params.parse(params, defaults);
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
// A simplified version of Lang.copyProperties, handles
|
|
Packit |
d345d1 |
// undefined as a special case for "no change / inherit from previous mode"
|
|
Packit |
d345d1 |
for (let prop in params) {
|
|
Packit |
d345d1 |
if (params[prop] !== undefined)
|
|
Packit |
d345d1 |
this[prop] = params[prop];
|
|
Packit |
d345d1 |
}
|
|
Packit |
d345d1 |
|
|
Packit |
d345d1 |
this.emit('updated');
|
|
Packit |
d345d1 |
}
|
|
Packit |
d345d1 |
};
|
|
Packit |
d345d1 |
Signals.addSignalMethods(SessionMode.prototype);
|