diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-01-23 12:02:52 +0400 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-01-23 12:02:52 +0400 |
| commit | ab9706cb30c26dafe46c807f0cf073e594c84ef0 (patch) | |
| tree | d31171e10e37ae4b75e8a32a2e9b91bf8f3fbbd7 | |
| parent | 05f2a3709b3447ac4d362980b166c3351a7129b2 (diff) | |
| download | niri-ab9706cb30c26dafe46c807f0cf073e594c84ef0.tar.gz niri-ab9706cb30c26dafe46c807f0cf073e594c84ef0.tar.bz2 niri-ab9706cb30c26dafe46c807f0cf073e594c84ef0.zip | |
screencast: Emit MonitorsChanged
| -rw-r--r-- | src/backend/tty.rs | 16 | ||||
| -rw-r--r-- | src/dbus/mutter_display_config.rs | 5 | ||||
| -rw-r--r-- | src/niri.rs | 38 |
3 files changed, 51 insertions, 8 deletions
diff --git a/src/backend/tty.rs b/src/backend/tty.rs index ee689ef0..f85b8d7b 100644 --- a/src/backend/tty.rs +++ b/src/backend/tty.rs @@ -710,13 +710,8 @@ impl Tty { let sequence_delta_plot_name = tracy_client::PlotName::new_leak(format!("{output_name} sequence delta")); - self.enabled_outputs - .lock() - .unwrap() - .insert(output_name.clone(), output.clone()); - let surface = Surface { - name: output_name, + name: output_name.clone(), compositor, dmabuf_feedback, vblank_frame: None, @@ -730,6 +725,13 @@ impl Tty { niri.add_output(output.clone(), Some(refresh_interval(mode))); + self.enabled_outputs + .lock() + .unwrap() + .insert(output_name, output.clone()); + #[cfg(feature = "dbus")] + niri.on_enabled_outputs_changed(); + // Power on all monitors if necessary and queue a redraw on the new one. niri.event_loop.insert_idle(move |state| { state.niri.activate_monitors(&state.backend); @@ -769,6 +771,8 @@ impl Tty { }; self.enabled_outputs.lock().unwrap().remove(&surface.name); + #[cfg(feature = "dbus")] + niri.on_enabled_outputs_changed(); } fn on_vblank( diff --git a/src/dbus/mutter_display_config.rs b/src/dbus/mutter_display_config.rs index e22736a2..ea945653 100644 --- a/src/dbus/mutter_display_config.rs +++ b/src/dbus/mutter_display_config.rs @@ -5,7 +5,7 @@ use serde::Serialize; use smithay::output::Output; use zbus::fdo::RequestNameFlags; use zbus::zvariant::{self, OwnedValue, Type}; -use zbus::{dbus_interface, fdo}; +use zbus::{dbus_interface, fdo, SignalContext}; use super::Start; @@ -112,7 +112,8 @@ impl DisplayConfig { Ok((0, monitors, logical_monitors, HashMap::new())) } - // FIXME: monitors-changed signal. + #[dbus_interface(signal)] + pub async fn monitors_changed(ctxt: &SignalContext<'_>) -> zbus::Result<()>; } impl DisplayConfig { diff --git a/src/niri.rs b/src/niri.rs index 3e22a7ab..e275c1ae 100644 --- a/src/niri.rs +++ b/src/niri.rs @@ -2759,6 +2759,44 @@ impl Niri { constraint.activate(); }); } + + #[cfg(feature = "dbus")] + pub fn on_enabled_outputs_changed(&self) { + let _span = tracy_client::span!("Niri::on_enabled_outputs_changed"); + + let Some(dbus) = &self.dbus else { return }; + let Some(conn_display_config) = dbus.conn_display_config.clone() else { + return; + }; + + let res = thread::Builder::new() + .name("DisplayConfig MonitorsChanged Emitter".to_owned()) + .spawn(move || { + use crate::dbus::mutter_display_config::DisplayConfig; + let _span = tracy_client::span!("MonitorsChanged"); + let iface = match conn_display_config + .object_server() + .interface::<_, DisplayConfig>("/org/gnome/Mutter/DisplayConfig") + { + Ok(iface) => iface, + Err(err) => { + warn!("error getting DisplayConfig interface: {err:?}"); + return; + } + }; + + async_io::block_on(async move { + if let Err(err) = DisplayConfig::monitors_changed(iface.signal_context()).await + { + warn!("error emitting MonitorsChanged: {err:?}"); + } + }); + }); + + if let Err(err) = res { + warn!("error spawning a thread to send MonitorsChanged: {err:?}"); + } + } } pub struct ClientState { |
