mirror of
https://github.com/edu4rdshl/gnome-shell.git
synced 2026-07-18 07:34:54 +00:00
These have been long deprecated over in clutter, and (via several vtables) simply forward the call to the equivalent ClutterActor methods Save ourselves the hassle and just use ClutterActor methods directly Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3010>
122 lines
3.3 KiB
JavaScript
122 lines
3.3 KiB
JavaScript
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
|
|
import Clutter from 'gi://Clutter';
|
|
import Gio from 'gi://Gio';
|
|
import GObject from 'gi://GObject';
|
|
import Meta from 'gi://Meta';
|
|
import St from 'gi://St';
|
|
|
|
|
|
import * as Main from './main.js';
|
|
|
|
const OsdMonitorLabel = GObject.registerClass(
|
|
class OsdMonitorLabel extends St.Widget {
|
|
_init(monitor, label) {
|
|
super._init({x_expand: true, y_expand: true});
|
|
|
|
this._monitor = monitor;
|
|
|
|
this._box = new St.BoxLayout({
|
|
vertical: true,
|
|
});
|
|
this.add_child(this._box);
|
|
|
|
this._label = new St.Label({
|
|
style_class: 'osd-monitor-label',
|
|
text: label,
|
|
});
|
|
this._box.add_child(this._label);
|
|
|
|
Main.uiGroup.add_child(this);
|
|
Main.uiGroup.set_child_above_sibling(this, null);
|
|
this._position();
|
|
|
|
Meta.disable_unredirect_for_display(global.display);
|
|
this.connect('destroy', () => {
|
|
Meta.enable_unredirect_for_display(global.display);
|
|
});
|
|
}
|
|
|
|
_position() {
|
|
let workArea = Main.layoutManager.getWorkAreaForMonitor(this._monitor);
|
|
|
|
if (Clutter.get_default_text_direction() === Clutter.TextDirection.RTL)
|
|
this._box.x = workArea.x + (workArea.width - this._box.width);
|
|
else
|
|
this._box.x = workArea.x;
|
|
|
|
this._box.y = workArea.y;
|
|
}
|
|
});
|
|
|
|
export class OsdMonitorLabeler {
|
|
constructor() {
|
|
this._monitorManager = global.backend.get_monitor_manager();
|
|
this._client = null;
|
|
this._clientWatchId = 0;
|
|
this._osdLabels = [];
|
|
this._monitorLabels = null;
|
|
Main.layoutManager.connect('monitors-changed',
|
|
this._reset.bind(this));
|
|
this._reset();
|
|
}
|
|
|
|
_reset() {
|
|
for (let i in this._osdLabels)
|
|
this._osdLabels[i].destroy();
|
|
this._osdLabels = [];
|
|
this._monitorLabels = new Map();
|
|
let monitors = Main.layoutManager.monitors;
|
|
for (let i in monitors)
|
|
this._monitorLabels.set(monitors[i].index, []);
|
|
}
|
|
|
|
_trackClient(client) {
|
|
if (this._client)
|
|
return this._client === client;
|
|
|
|
this._client = client;
|
|
this._clientWatchId = Gio.bus_watch_name(Gio.BusType.SESSION,
|
|
client, 0, null,
|
|
(c, name) => {
|
|
this.hide(name);
|
|
});
|
|
return true;
|
|
}
|
|
|
|
_untrackClient(client) {
|
|
if (!this._client || this._client !== client)
|
|
return false;
|
|
|
|
Gio.bus_unwatch_name(this._clientWatchId);
|
|
this._clientWatchId = 0;
|
|
this._client = null;
|
|
return true;
|
|
}
|
|
|
|
show(client, params) {
|
|
if (!this._trackClient(client))
|
|
return;
|
|
|
|
this._reset();
|
|
|
|
for (let connector in params) {
|
|
let monitor = this._monitorManager.get_monitor_for_connector(connector);
|
|
if (monitor === -1)
|
|
continue;
|
|
this._monitorLabels.get(monitor).push(params[connector].deepUnpack());
|
|
}
|
|
|
|
for (let [monitor, labels] of this._monitorLabels.entries()) {
|
|
labels.sort();
|
|
this._osdLabels.push(new OsdMonitorLabel(monitor, labels.join(' ')));
|
|
}
|
|
}
|
|
|
|
hide(client) {
|
|
if (!this._untrackClient(client))
|
|
return;
|
|
|
|
this._reset();
|
|
}
|
|
}
|