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