screencast: Emit MonitorsChanged

This commit is contained in:
Ivan Molodetskikh
2024-01-23 12:02:52 +04:00
parent 05f2a3709b
commit ab9706cb30
3 changed files with 51 additions and 8 deletions
+10 -6
View File
@@ -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(
+3 -2
View File
@@ -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 {
+38
View File
@@ -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 {