Skip to content

Commit

Permalink
dbus: Add monitor labeler
Browse files Browse the repository at this point in the history
For display settings under Wayland.
ref:
linuxmint/cinnamon-control-center@7360582eb853682764eb4
  • Loading branch information
mtwebster authored and clefebvre committed Nov 9, 2023
1 parent 0013157 commit 995e252
Show file tree
Hide file tree
Showing 4 changed files with 134 additions and 1 deletion.
7 changes: 7 additions & 0 deletions data/theme/cinnamon.css
Original file line number Diff line number Diff line change
Expand Up @@ -1059,6 +1059,13 @@ StScrollBar StButton#vhandle:hover {
font-size: 3em;
}

.monitor-label {
border-radius: 0;
color: #000000;
padding: 10px;
text-align: center;
}

/* ===================================================================
* Run dialog
* ===================================================================*/
Expand Down
14 changes: 13 additions & 1 deletion js/ui/cinnamonDBus.js
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ const CinnamonIface =
</method> \
<signal name="MonitorsChanged"/> \
<method name="GetRunState"> \
<arg type="i" direction="out" name="state" /> \
<arg type="i" direction="out" name="state" /> \
</method> \
<method name="RestartCinnamon"> \
<arg type="b" direction="in" name="show_osd" /> \
Expand All @@ -127,6 +127,10 @@ const CinnamonIface =
<signal name="RunStateChanged"/> \
<signal name="XletsLoadedComplete"/> \
<property name="AnimationsEnabled" type="b" access="read" /> \
<method name="ShowMonitorLabels"> \
<arg type="a{sv}" direction="in" name="params"/> \
</method> \
<method name="HideMonitorLabels"/> \
</interface> \
</node>';

Expand Down Expand Up @@ -499,5 +503,13 @@ CinnamonDBus.prototype = {
this._dbusImpl.emit_property_changed('AnimationsEnabled', variant);
},

ShowMonitorLabelsAsync(monitor_info, invocation) {
Main.monitorLabeler.show(monitor_info[0], invocation.get_sender());
},

HideMonitorLabelsAsync(tuple, invocation) {
Main.monitorLabeler.hide(invocation.get_sender());
},

CinnamonVersion: Config.PACKAGE_VERSION
};
4 changes: 4 additions & 0 deletions js/ui/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
* @statusIconDispatcher (StatusIconDispatcher.StatusIconDispatcher): The status icon dispatcher
* @virtualKeyboard (VirtualKeyboard.Keyboard): The keyboard object
* @layoutManager (Layout.LayoutManager): The layout manager.
* @monitorLabeler (MonitorLabeler.MonitorLabeler): Adds labels to each monitor when configuring displays.
* \
* All actors that are part of the Cinnamon UI ar handled by the layout
* manager, which will determine when to show and hide the actors etc.
Expand Down Expand Up @@ -124,6 +125,7 @@ const {installPolyfills} = imports.ui.overrides;
const InputMethod = imports.misc.inputMethod;
const ScreenRecorder = imports.ui.screenRecorder;
const {GesturesManager} = imports.ui.gestures.gesturesManager;
const {MonitorLabeler} = imports.ui.monitorLabeler;

var LAYOUT_TRADITIONAL = "traditional";
var LAYOUT_FLIPPED = "flipped";
Expand Down Expand Up @@ -160,6 +162,7 @@ var xdndHandler = null;
var statusIconDispatcher = null;
var virtualKeyboard = null;
var layoutManager = null;
var monitorLabeler = null;
var themeManager = null;
var keybindingManager = null;
var _errorLogStack = [];
Expand Down Expand Up @@ -391,6 +394,7 @@ function start() {
layoutManager.primaryMonitor.y + layoutManager.primaryMonitor.height/2);

pointerSwitcher = new PointerTracker.PointerSwitcher();
monitorLabeler = new MonitorLabeler();

xdndHandler = new XdndHandler.XdndHandler();
osdWindowManager = new OsdWindow.OsdWindowManager();
Expand Down
110 changes: 110 additions & 0 deletions js/ui/monitorLabeler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
const St = imports.gi.St;
const Main = imports.ui.main;
const Gio = imports.gi.Gio;
const Meta = imports.gi.Meta;

var MonitorLabel = class {
constructor(monitor, connector, info) {
this._monitor = monitor;
this._connector = connector;
this._index = info[0];
this._cloned = info[1];
this._display_name = info[2];
this._color = info[3];

this.actor = new St.BoxLayout({ style_class: "monitor-label",
vertical: true,
important: true });

this.actor.style = `background-color: ${this._color};`;

let label_text;

if (this._cloned) {
let str = _("Mirrored Displays");
label_text = `<b>${str}</b>`;
} else {
label_text = `<b>${this._index} ${this._display_name}</b>\n${this._connector}`
}

this._label = new St.Label();
this._label.clutter_text.set_markup(label_text);
this.actor.add(this._label);

Main.uiGroup.add_child(this.actor);

this.actor.x = monitor.x + 6 * global.ui_scale;
this.actor.y = monitor.y + 6 * global.ui_scale;
}
}

var MonitorLabeler = class {
constructor() {
this._labels = [];
this._tracked_clients = new Map();
this._active = false;
this._monitor_manager = Meta.MonitorManager.get();
Main.layoutManager.connect('monitors-changed', () => this._update_layout());
}

_update_labels() {
if (!this._active) {
return;
}
}

show(dict, sender) {
this.watch_sender(sender);

if (this._labels.length > 0) {
return;
}

for (let connector in dict) {
let index = this._monitor_manager.get_monitor_for_connector(connector);
if (index == -1) {
continue;
}

let layout_monitor = 0;

try {
layout_monitor = Main.layoutManager.monitors[index];
} catch {
continue;
}

let info = dict[connector].deep_unpack();

let label = new MonitorLabel(layout_monitor, connector, info);
this._labels.push(label);
}
}

hide(sender=null) {
const watch_handle = this._tracked_clients.get(sender);
if (watch_handle !== undefined) {
Gio.bus_unwatch_name(watch_handle);
this._tracked_clients.delete(sender)
}

if (this._tracked_clients.size > 0) {
return;
}

for (let label of this._labels) {
label.actor.destroy();
}

this._labels = [];
}

watch_sender(sender) {
if (this._tracked_clients.has(sender)) {
return;
}

let watch_handle = Gio.bus_watch_name(Gio.BusType.SESSION, sender, 0, null, (c, name) => this.hide(name))
this._tracked_clients.set(sender, watch_handle);
}
};

0 comments on commit 995e252

Please sign in to comment.