Blame js/ui/sessionMode.js

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);