aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-01-23 12:02:52 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-01-23 12:02:52 +0400
commitab9706cb30c26dafe46c807f0cf073e594c84ef0 (patch)
treed31171e10e37ae4b75e8a32a2e9b91bf8f3fbbd7 /src
parent05f2a3709b3447ac4d362980b166c3351a7129b2 (diff)
downloadniri-ab9706cb30c26dafe46c807f0cf073e594c84ef0.tar.gz
niri-ab9706cb30c26dafe46c807f0cf073e594c84ef0.tar.bz2
niri-ab9706cb30c26dafe46c807f0cf073e594c84ef0.zip
screencast: Emit MonitorsChanged
Diffstat (limited to 'src')
-rw-r--r--src/backend/tty.rs16
-rw-r--r--src/dbus/mutter_display_config.rs5
-rw-r--r--src/niri.rs38
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 {