From 4b90953226c0980fd7b2fb233c51b5582ad583e6 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Mon, 18 Nov 2013 13:48:19 +0100 Subject: [PATCH] osdWindow: add setMonitor() to allow changing the monitor This is also exposed in the ShowOSD DBus method, the "monitor" parameter may contain an integer to indicate the monitor number. If the value is not provided or <0 is used, the monitor is shown on the primary monitor as usually. This way, the OSD can be used to notify upon events that solely apply to one monitor, like tablet mapping as discussed in https://bugzilla.gnome.org/show_bug.cgi?id=710373. https://bugzilla.gnome.org/show_bug.cgi?id=712664 --- js/ui/osdWindow.js | 29 +++++++++++++++++++++++++++-- js/ui/shellDBus.js | 5 +++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/js/ui/osdWindow.js b/js/ui/osdWindow.js index bb7d88894..24f78b45d 100644 --- a/js/ui/osdWindow.js +++ b/js/ui/osdWindow.js @@ -77,7 +77,8 @@ const OsdWindow = new Lang.Class({ y_expand: true, x_align: Clutter.ActorAlign.CENTER, y_align: Clutter.ActorAlign.CENTER }); - this.actor.add_constraint(new Layout.MonitorConstraint({ primary: true })); + this._currentMonitor = undefined; + this.setMonitor (-1); this._box = new St.BoxLayout({ style_class: 'osd-window', vertical: true }); this.actor.add_actor(this._box); @@ -182,7 +183,13 @@ const OsdWindow = new Lang.Class({ _monitorsChanged: function() { /* assume 110x110 on a 640x480 display and scale from there */ - let monitor = Main.layoutManager.primaryMonitor; + let monitor; + + if (this._currentMonitor >= 0) + monitor = Main.layoutManager.monitors[this._currentMonitor]; + else + monitor = Main.layoutManager.primaryMonitor; + let scalew = monitor.width / 640.0; let scaleh = monitor.height / 480.0; let scale = Math.min(scalew, scaleh); @@ -206,5 +213,23 @@ const OsdWindow = new Lang.Class({ let minHeight = this._popupSize - horizontalPadding - topBorder - bottomBorder; this._box.style = 'min-height: %dpx;'.format(Math.max(minWidth, minHeight)); + }, + + setMonitor: function(index) { + let constraint; + + if (index < 0) + index = -1; + if (this._currentMonitor == index) + return; + + if (index < 0) + constraint = new Layout.MonitorConstraint({ primary: true }); + else + constraint = new Layout.MonitorConstraint({ index: index }); + + this.actor.clear_constraints(); + this.actor.add_constraint(constraint); + this._currentMonitor = index; } }); diff --git a/js/ui/shellDBus.js b/js/ui/shellDBus.js index 79ff46cba..4049095a9 100644 --- a/js/ui/shellDBus.js +++ b/js/ui/shellDBus.js @@ -133,11 +133,16 @@ const GnomeShell = new Lang.Class({ for (let param in params) params[param] = params[param].deep_unpack(); + let monitorIndex = -1; + if (params['monitor']) + monitorIndex = params['monitor']; + let icon = null; if (params['icon']) icon = Gio.Icon.new_for_string(params['icon']); Main.osdWindow.setIcon(icon); + Main.osdWindow.setMonitor (monitorIndex); Main.osdWindow.setLabel(params['label']); Main.osdWindow.setLevel(params['level']);