Blame js/ui/status/remoteAccess.js

Packit d345d1
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
Packit d345d1
Packit d345d1
const Meta = imports.gi.Meta;
Packit d345d1
Packit d345d1
const PanelMenu = imports.ui.panelMenu;
Packit d345d1
const PopupMenu = imports.ui.popupMenu;
Packit d345d1
Packit d345d1
var RemoteAccessApplet = class extends PanelMenu.SystemIndicator {
Packit d345d1
    constructor() {
Packit d345d1
        super();
Packit d345d1
Packit d345d1
        let backend = Meta.get_backend();
Packit d345d1
        let controller = backend.get_remote_access_controller();
Packit d345d1
Packit d345d1
        if (!controller)
Packit d345d1
            return;
Packit d345d1
Packit d345d1
        // We can't possibly know about all types of screen sharing on X11, so
Packit d345d1
        // showing these controls on X11 might give a false sense of security.
Packit d345d1
        // Thus, only enable these controls when using Wayland, where we are
Packit d345d1
        // in control of sharing.
Packit d345d1
        if (!Meta.is_wayland_compositor())
Packit d345d1
            return;
Packit d345d1
Packit d345d1
        this._handles = new Set();
Packit d345d1
        this._indicator = null;
Packit d345d1
        this._menuSection = null;
Packit d345d1
Packit d345d1
        controller.connect('new-handle', (controller, handle) => {
Packit d345d1
            this._onNewHandle(handle);
Packit d345d1
        });
Packit d345d1
    }
Packit d345d1
Packit d345d1
    _ensureControls() {
Packit d345d1
        if (this._indicator)
Packit d345d1
            return;
Packit d345d1
Packit d345d1
        this._indicator = this._addIndicator();
Packit d345d1
        this._indicator.icon_name = 'screen-shared-symbolic';
Packit d345d1
        this._indicator.add_style_class_name('remote-access-indicator');
Packit d345d1
        this._item =
Packit d345d1
            new PopupMenu.PopupSubMenuMenuItem(_("Screen is Being Shared"),
Packit d345d1
                                               true);
Packit d345d1
        this._item.menu.addAction(_("Turn off"),
Packit d345d1
                                  () => {
Packit d345d1
                                      for (let handle of this._handles)
Packit d345d1
                                            handle.stop();
Packit d345d1
                                  });
Packit d345d1
        this._item.icon.icon_name = 'screen-shared-symbolic';
Packit d345d1
        this.menu.addMenuItem(this._item);
Packit d345d1
    }
Packit d345d1
Packit d345d1
    _sync() {
Packit d345d1
        if (this._handles.size == 0) {
Packit d345d1
            this._indicator.visible = false;
Packit d345d1
            this._item.actor.visible = false;
Packit d345d1
        } else {
Packit d345d1
            this._indicator.visible = true;
Packit d345d1
            this._item.actor.visible = true;
Packit d345d1
        }
Packit d345d1
    }
Packit d345d1
Packit d345d1
    _onStopped(handle) {
Packit d345d1
        this._handles.delete(handle);
Packit d345d1
        this._sync();
Packit d345d1
    }
Packit d345d1
Packit d345d1
    _onNewHandle(handle) {
Packit d345d1
        this._handles.add(handle);
Packit d345d1
        handle.connect('stopped', this._onStopped.bind(this));
Packit d345d1
Packit d345d1
        if (this._handles.size == 1) {
Packit d345d1
            this._ensureControls();
Packit d345d1
            this._sync();
Packit d345d1
        }
Packit d345d1
    }
Packit d345d1
};