Blame js/ui/shellDBus.js

Packit Service ed5168
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
Packit Service ed5168
Packit Service ed5168
const { Gio, GLib, Meta, Shell } = imports.gi;
Packit Service ed5168
const Lang = imports.lang;
Packit Service ed5168
Packit Service ed5168
const Config = imports.misc.config;
Packit Service ed5168
const ExtensionSystem = imports.ui.extensionSystem;
Packit Service ed5168
const ExtensionDownloader = imports.ui.extensionDownloader;
Packit Service ed5168
const ExtensionUtils = imports.misc.extensionUtils;
Packit Service ed5168
const Main = imports.ui.main;
Packit Service ed5168
const Screenshot = imports.ui.screenshot;
Packit Service ed5168
Packit Service ed5168
const { loadInterfaceXML } = imports.misc.fileUtils;
Packit Service ed5168
Packit Service ed5168
const GnomeShellIface = loadInterfaceXML('org.gnome.Shell');
Packit Service ed5168
const ScreenSaverIface = loadInterfaceXML('org.gnome.ScreenSaver');
Packit Service ed5168
Packit Service ed5168
var GnomeShell = class {
Packit Service ed5168
    constructor() {
Packit Service ed5168
        this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellIface, this);
Packit Service ed5168
        this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
Packit Service ed5168
Packit Service ed5168
        this._extensionsService = new GnomeShellExtensions();
Packit Service ed5168
        this._screenshotService = new Screenshot.ScreenshotService();
Packit Service ed5168
Packit Service ed5168
        this._grabbedAccelerators = new Map();
Packit Service ed5168
        this._grabbers = new Map();
Packit Service ed5168
Packit Service ed5168
        global.display.connect('accelerator-activated',
Packit Service ed5168
            (display, action, deviceid, timestamp) => {
Packit Service ed5168
                this._emitAcceleratorActivated(action, deviceid, timestamp);
Packit Service ed5168
            });
Packit Service ed5168
Packit Service ed5168
        this._cachedOverviewVisible = false;
Packit Service ed5168
        Main.overview.connect('showing',
Packit Service ed5168
                              this._checkOverviewVisibleChanged.bind(this));
Packit Service ed5168
        Main.overview.connect('hidden',
Packit Service ed5168
                              this._checkOverviewVisibleChanged.bind(this));
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    /**
Packit Service ed5168
     * Eval:
Packit Service ed5168
     * @code: A string containing JavaScript code
Packit Service ed5168
     *
Packit Service ed5168
     * This function executes arbitrary code in the main
Packit Service ed5168
     * loop, and returns a boolean success and
Packit Service ed5168
     * JSON representation of the object as a string.
Packit Service ed5168
     *
Packit Service ed5168
     * If evaluation completes without throwing an exception,
Packit Service ed5168
     * then the return value will be [true, JSON.stringify(result)].
Packit Service ed5168
     * If evaluation fails, then the return value will be
Packit Service ed5168
     * [false, JSON.stringify(exception)];
Packit Service ed5168
     *
Packit Service ed5168
     */
Packit Service ed5168
    Eval(code) {
Packit Service ed5168
        if (!global.settings.get_boolean('development-tools'))
Packit Service ed5168
            return [false, ''];
Packit Service ed5168
Packit Service ed5168
        let returnValue;
Packit Service ed5168
        let success;
Packit Service ed5168
        try {
Packit Service ed5168
            returnValue = JSON.stringify(eval(code));
Packit Service ed5168
            // A hack; DBus doesn't have null/undefined
Packit Service ed5168
            if (returnValue == undefined)
Packit Service ed5168
                returnValue = '';
Packit Service ed5168
            success = true;
Packit Service ed5168
        } catch (e) {
Packit Service ed5168
            returnValue = '' + e;
Packit Service ed5168
            success = false;
Packit Service ed5168
        }
Packit Service ed5168
        return [success, returnValue];
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    FocusSearch() {
Packit Service ed5168
        Main.overview.focusSearch();
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    ShowOSD(params) {
Packit Service ed5168
        for (let param in params)
Packit Service ed5168
            params[param] = params[param].deep_unpack();
Packit Service ed5168
Packit Service ed5168
        let { connector,
Packit Service ed5168
              label,
Packit Service ed5168
              level,
Packit Service ed5168
              max_level: maxLevel,
Packit Service ed5168
              icon: serializedIcon } = params;
Packit Service ed5168
Packit Service ed5168
        let monitorIndex = -1;
Packit Service ed5168
        if (connector) {
Packit Service ed5168
            let monitorManager = Meta.MonitorManager.get();
Packit Service ed5168
            monitorIndex = monitorManager.get_monitor_for_connector(connector);
Packit Service ed5168
        }
Packit Service ed5168
Packit Service ed5168
        let icon = null;
Packit Service ed5168
        if (serializedIcon)
Packit Service ed5168
            icon = Gio.Icon.new_for_string(serializedIcon);
Packit Service ed5168
Packit Service ed5168
        Main.osdWindowManager.show(monitorIndex, icon, label, level, maxLevel);
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    FocusApp(id) {
Packit Service ed5168
        this.ShowApplications();
Packit Service ed5168
        Main.overview.viewSelector.appDisplay.selectApp(id);
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    ShowApplications() {
Packit Service ed5168
        Main.overview.viewSelector.showApps();
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    GrabAcceleratorAsync(params, invocation) {
Packit Service ed5168
        let [accel, modeFlags, grabFlags] = params;
Packit Service ed5168
        let sender = invocation.get_sender();
Packit Service ed5168
        let bindingAction = this._grabAcceleratorForSender(accel, modeFlags, grabFlags, sender);
Packit Service ed5168
        return invocation.return_value(GLib.Variant.new('(u)', [bindingAction]));
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    GrabAcceleratorsAsync(params, invocation) {
Packit Service ed5168
        let [accels] = params;
Packit Service ed5168
        let sender = invocation.get_sender();
Packit Service ed5168
        let bindingActions = [];
Packit Service ed5168
        for (let i = 0; i < accels.length; i++) {
Packit Service ed5168
            let [accel, modeFlags, grabFlags] = accels[i];
Packit Service ed5168
            bindingActions.push(this._grabAcceleratorForSender(accel, modeFlags, grabFlags, sender));
Packit Service ed5168
        }
Packit Service ed5168
        return invocation.return_value(GLib.Variant.new('(au)', [bindingActions]));
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    UngrabAcceleratorAsync(params, invocation) {
Packit Service ed5168
        let [action] = params;
Packit Service ed5168
        let sender = invocation.get_sender();
Packit Service ed5168
        let ungrabSucceeded = this._ungrabAcceleratorForSender(action, sender);
Packit Service ed5168
Packit Service ed5168
        return invocation.return_value(GLib.Variant.new('(b)', [ungrabSucceeded]));
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    UngrabAcceleratorsAsync(params, invocation) {
Packit Service ed5168
        let [actions] = params;
Packit Service ed5168
        let sender = invocation.get_sender();
Packit Service ed5168
        let ungrabSucceeded = true;
Packit Service ed5168
Packit Service ed5168
        for (let i = 0; i < actions.length; i++)
Packit Service ed5168
            ungrabSucceeded &= this._ungrabAcceleratorForSender(actions[i], sender);
Packit Service ed5168
Packit Service ed5168
        return invocation.return_value(GLib.Variant.new('(b)', [ungrabSucceeded]));
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    _emitAcceleratorActivated(action, deviceid, timestamp) {
Packit Service ed5168
        let destination = this._grabbedAccelerators.get(action);
Packit Service ed5168
        if (!destination)
Packit Service ed5168
            return;
Packit Service ed5168
Packit Service ed5168
        let connection = this._dbusImpl.get_connection();
Packit Service ed5168
        let info = this._dbusImpl.get_info();
Packit Service ed5168
        let params = { 'device-id': GLib.Variant.new('u', deviceid),
Packit Service ed5168
                       'timestamp': GLib.Variant.new('u', timestamp),
Packit Service ed5168
                       'action-mode': GLib.Variant.new('u', Main.actionMode) };
Packit Service ed5168
        connection.emit_signal(destination,
Packit Service ed5168
                               this._dbusImpl.get_object_path(),
Packit Service ed5168
                               info ? info.name : null,
Packit Service ed5168
                               'AcceleratorActivated',
Packit Service ed5168
                               GLib.Variant.new('(ua{sv})', [action, params]));
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    _grabAcceleratorForSender(accelerator, modeFlags, grabFlags, sender) {
Packit Service ed5168
        let bindingAction = global.display.grab_accelerator(accelerator, grabFlags);
Packit Service ed5168
        if (bindingAction == Meta.KeyBindingAction.NONE)
Packit Service ed5168
            return Meta.KeyBindingAction.NONE;
Packit Service ed5168
Packit Service ed5168
        let bindingName = Meta.external_binding_name_for_action(bindingAction);
Packit Service ed5168
        Main.wm.allowKeybinding(bindingName, modeFlags);
Packit Service ed5168
Packit Service ed5168
        this._grabbedAccelerators.set(bindingAction, sender);
Packit Service ed5168
Packit Service ed5168
        if (!this._grabbers.has(sender)) {
Packit Service ed5168
            let id = Gio.bus_watch_name(Gio.BusType.SESSION, sender, 0, null,
Packit Service ed5168
                                        this._onGrabberBusNameVanished.bind(this));
Packit Service ed5168
            this._grabbers.set(sender, id);
Packit Service ed5168
        }
Packit Service ed5168
Packit Service ed5168
        return bindingAction;
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    _ungrabAccelerator(action) {
Packit Service ed5168
        let ungrabSucceeded = global.display.ungrab_accelerator(action);
Packit Service ed5168
        if (ungrabSucceeded)
Packit Service ed5168
            this._grabbedAccelerators.delete(action);
Packit Service ed5168
Packit Service ed5168
        return ungrabSucceeded;
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    _ungrabAcceleratorForSender(action, sender) {
Packit Service ed5168
        let grabbedBy = this._grabbedAccelerators.get(action);
Packit Service ed5168
        if (sender != grabbedBy)
Packit Service ed5168
            return false;
Packit Service ed5168
Packit Service ed5168
        return this._ungrabAccelerator(action);
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    _onGrabberBusNameVanished(connection, name) {
Packit Service ed5168
        let grabs = this._grabbedAccelerators.entries();
Packit Service ed5168
        for (let [action, sender] of grabs) {
Packit Service ed5168
            if (sender == name)
Packit Service ed5168
                this._ungrabAccelerator(action);
Packit Service ed5168
        }
Packit Service ed5168
        Gio.bus_unwatch_name(this._grabbers.get(name));
Packit Service ed5168
        this._grabbers.delete(name);
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    ShowMonitorLabels2Async(params, invocation) {
Packit Service ed5168
        let sender = invocation.get_sender();
Packit Service ed5168
        let [dict] = params;
Packit Service ed5168
        Main.osdMonitorLabeler.show(sender, dict);
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    HideMonitorLabelsAsync(params, invocation) {
Packit Service ed5168
        let sender = invocation.get_sender();
Packit Service ed5168
        Main.osdMonitorLabeler.hide(sender);
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    _checkOverviewVisibleChanged() {
Packit Service ed5168
        if (Main.overview.visible !== this._cachedOverviewVisible) {
Packit Service ed5168
            this._cachedOverviewVisible = Main.overview.visible;
Packit Service ed5168
            this._dbusImpl.emit_property_changed('OverviewActive', new GLib.Variant('b', this._cachedOverviewVisible));
Packit Service ed5168
        }
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    get Mode() {
Packit Service ed5168
        return global.session_mode;
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    get OverviewActive() {
Packit Service ed5168
        return this._cachedOverviewVisible;
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    set OverviewActive(visible) {
Packit Service ed5168
        if (visible)
Packit Service ed5168
            Main.overview.show();
Packit Service ed5168
        else
Packit Service ed5168
            Main.overview.hide();
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    get ShellVersion() {
Packit Service ed5168
        return Config.PACKAGE_VERSION;
Packit Service ed5168
    }
Packit Service ed5168
};
Packit Service ed5168
Packit Service ed5168
const GnomeShellExtensionsIface = loadInterfaceXML('org.gnome.Shell.Extensions');
Packit Service ed5168
Packit Service ed5168
var GnomeShellExtensions = class {
Packit Service ed5168
    constructor() {
Packit Service ed5168
        this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellExtensionsIface, this);
Packit Service ed5168
        this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
Packit Service ed5168
        ExtensionSystem.connect('extension-state-changed',
Packit Service ed5168
                                this._extensionStateChanged.bind(this));
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    ListExtensions() {
Packit Service ed5168
        let out = {};
Packit Service ed5168
        for (let uuid in ExtensionUtils.extensions) {
Packit Service ed5168
            let dbusObj = this.GetExtensionInfo(uuid);
Packit Service ed5168
            out[uuid] = dbusObj;
Packit Service ed5168
        }
Packit Service ed5168
        return out;
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    GetExtensionInfo(uuid) {
Packit Service ed5168
        let extension = ExtensionUtils.extensions[uuid];
Packit Service ed5168
        if (!extension)
Packit Service ed5168
            return {};
Packit Service ed5168
Packit Service ed5168
        let obj = {};
Packit Service ed5168
        Lang.copyProperties(extension.metadata, obj);
Packit Service ed5168
Packit Service ed5168
        // Only serialize the properties that we actually need.
Packit Service ed5168
        const serializedProperties = ["type", "state", "path", "error", "hasPrefs"];
Packit Service ed5168
Packit Service ed5168
        serializedProperties.forEach(prop => {
Packit Service ed5168
            obj[prop] = extension[prop];
Packit Service ed5168
        });
Packit Service ed5168
Packit Service ed5168
        let out = {};
Packit Service ed5168
        for (let key in obj) {
Packit Service ed5168
            let val = obj[key];
Packit Service ed5168
            let type;
Packit Service ed5168
            switch (typeof val) {
Packit Service ed5168
            case 'string':
Packit Service ed5168
                type = 's';
Packit Service ed5168
                break;
Packit Service ed5168
            case 'number':
Packit Service ed5168
                type = 'd';
Packit Service ed5168
                break;
Packit Service ed5168
            case 'boolean':
Packit Service ed5168
                type = 'b';
Packit Service ed5168
                break;
Packit Service ed5168
            default:
Packit Service ed5168
                continue;
Packit Service ed5168
            }
Packit Service ed5168
            out[key] = GLib.Variant.new(type, val);
Packit Service ed5168
        }
Packit Service ed5168
Packit Service ed5168
        return out;
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    GetExtensionErrors(uuid) {
Packit Service ed5168
        let extension = ExtensionUtils.extensions[uuid];
Packit Service ed5168
        if (!extension)
Packit Service ed5168
            return [];
Packit Service ed5168
Packit Service ed5168
        if (!extension.errors)
Packit Service ed5168
            return [];
Packit Service ed5168
Packit Service ed5168
        return extension.errors;
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    InstallRemoteExtensionAsync([uuid], invocation) {
Packit Service ed5168
        return ExtensionDownloader.installExtension(uuid, invocation);
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    UninstallExtension(uuid) {
Packit Service ed5168
        return ExtensionDownloader.uninstallExtension(uuid);
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    LaunchExtensionPrefs(uuid) {
Packit Service ed5168
        let appSys = Shell.AppSystem.get_default();
Packit Service ed5168
        let app = appSys.lookup_app('gnome-shell-extension-prefs.desktop');
Packit Service ed5168
        let info = app.get_app_info();
Packit Service ed5168
        let timestamp = global.display.get_current_time_roundtrip();
Packit Service ed5168
        info.launch_uris(['extension:///' + uuid],
Packit Service ed5168
                         global.create_app_launch_context(timestamp, -1));
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    ReloadExtension(uuid) {
Packit Service ed5168
        let extension = ExtensionUtils.extensions[uuid];
Packit Service ed5168
        if (!extension)
Packit Service ed5168
            return;
Packit Service ed5168
Packit Service ed5168
        ExtensionSystem.reloadExtension(extension);
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    CheckForUpdates() {
Packit Service ed5168
        ExtensionDownloader.checkForUpdates();
Packit Service ed5168
    }
Packit Service ed5168
rpm-build 3af889
    LoadUserExtension(uuid) {
rpm-build 3af889
        let extension = ExtensionUtils.extensions[uuid];
rpm-build 3af889
        if (extension)
rpm-build 3af889
            return true;
rpm-build 3af889
rpm-build 3af889
        let dir = Gio.File.new_for_path(GLib.build_filenamev([global.userdatadir, 'extensions', uuid]));
rpm-build 3af889
        try {
rpm-build 3af889
            extension = ExtensionUtils.createExtensionObject(uuid, dir, ExtensionUtils.ExtensionType.PER_USER);
rpm-build 3af889
            ExtensionSystem.loadExtension(extension);
rpm-build 3af889
        } catch (e) {
rpm-build 3af889
            log('Could not load user extension from %s'.format(dir.get_path()));
rpm-build 3af889
            return false;
rpm-build 3af889
        }
rpm-build 3af889
        return true;
rpm-build 3af889
    }
rpm-build 3af889
Packit Service ed5168
    get ShellVersion() {
Packit Service ed5168
        return Config.PACKAGE_VERSION;
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    _extensionStateChanged(_, newState) {
Packit Service ed5168
        this._dbusImpl.emit_signal('ExtensionStatusChanged',
Packit Service ed5168
                                   GLib.Variant.new('(sis)', [newState.uuid, newState.state, newState.error]));
Packit Service ed5168
    }
Packit Service ed5168
};
Packit Service ed5168
Packit Service ed5168
var ScreenSaverDBus = class {
Packit Service ed5168
    constructor(screenShield) {
Packit Service ed5168
        this._screenShield = screenShield;
Packit Service ed5168
        screenShield.connect('active-changed', shield => {
Packit Service ed5168
            this._dbusImpl.emit_signal('ActiveChanged', GLib.Variant.new('(b)', [shield.active]));
Packit Service ed5168
        });
Packit Service ed5168
        screenShield.connect('wake-up-screen', shield => {
Packit Service ed5168
            this._dbusImpl.emit_signal('WakeUpScreen', null);
Packit Service ed5168
        });
Packit Service ed5168
Packit Service ed5168
        this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenSaverIface, this);
Packit Service ed5168
        this._dbusImpl.export(Gio.DBus.session, '/org/gnome/ScreenSaver');
Packit Service ed5168
Packit Service ed5168
        Gio.DBus.session.own_name('org.gnome.ScreenSaver', Gio.BusNameOwnerFlags.REPLACE, null, null);
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    LockAsync(parameters, invocation) {
Packit Service ed5168
        let tmpId = this._screenShield.connect('lock-screen-shown', () => {
Packit Service ed5168
            this._screenShield.disconnect(tmpId);
Packit Service ed5168
Packit Service ed5168
            invocation.return_value(null);
Packit Service ed5168
        });
Packit Service ed5168
Packit Service ed5168
        this._screenShield.lock(true);
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    SetActive(active) {
Packit Service ed5168
        if (active)
Packit Service ed5168
            this._screenShield.activate(true);
Packit Service ed5168
        else
Packit Service ed5168
            this._screenShield.deactivate(false);
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    GetActive() {
Packit Service ed5168
        return this._screenShield.active;
Packit Service ed5168
    }
Packit Service ed5168
Packit Service ed5168
    GetActiveTime() {
Packit Service ed5168
        let started = this._screenShield.activationTime;
Packit Service ed5168
        if (started > 0)
Packit Service ed5168
            return Math.floor((GLib.get_monotonic_time() - started) / 1000000);
Packit Service ed5168
        else
Packit Service ed5168
            return 0;
Packit Service ed5168
    }
Packit Service ed5168
};