aboutsummaryrefslogtreecommitdiff
path: root/src/dbus
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-03-27 14:54:24 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-03-27 14:54:24 +0400
commitcf87a185a90aeacf7c15d27ddba23bc493d9c2dd (patch)
treee8625c61105821b8d552db86f70839b1282151b4 /src/dbus
parente276c906bf4bea27dc8173815ff373d04c20caaf (diff)
downloadniri-cf87a185a90aeacf7c15d27ddba23bc493d9c2dd.tar.gz
niri-cf87a185a90aeacf7c15d27ddba23bc493d9c2dd.tar.bz2
niri-cf87a185a90aeacf7c15d27ddba23bc493d9c2dd.zip
Add logical output info and preferred modes to IPC
Diffstat (limited to 'src/dbus')
-rw-r--r--src/dbus/mutter_display_config.rs46
-rw-r--r--src/dbus/mutter_screen_cast.rs28
2 files changed, 41 insertions, 33 deletions
diff --git a/src/dbus/mutter_display_config.rs b/src/dbus/mutter_display_config.rs
index 2e29b923..783c2499 100644
--- a/src/dbus/mutter_display_config.rs
+++ b/src/dbus/mutter_display_config.rs
@@ -2,7 +2,6 @@ use std::collections::HashMap;
use std::sync::{Arc, Mutex};
use serde::Serialize;
-use smithay::utils::Transform;
use zbus::fdo::RequestNameFlags;
use zbus::zvariant::{self, OwnedValue, Type};
use zbus::{dbus_interface, fdo, SignalContext};
@@ -60,11 +59,8 @@ impl DisplayConfig {
.unwrap()
.iter()
// Take only enabled outputs.
- .filter_map(|(c, (ipc, output))| {
- ipc.current_mode?;
- output.as_ref().map(move |output| (c, (ipc, output)))
- })
- .map(|(c, (ipc, output))| {
+ .filter(|(_, output)| output.current_mode.is_some() && output.logical.is_some())
+ .map(|(c, output)| {
// Loosely matches the check in Mutter.
let is_laptop_panel = matches!(c.get(..4), Some("eDP-" | "LVDS" | "DSI-"));
@@ -84,7 +80,7 @@ impl DisplayConfig {
OwnedValue::from(is_laptop_panel),
);
- let mut modes: Vec<Mode> = ipc
+ let mut modes: Vec<Mode> = output
.modes
.iter()
.map(|m| {
@@ -92,6 +88,7 @@ impl DisplayConfig {
width,
height,
refresh_rate,
+ is_preferred,
} = *m;
let refresh = refresh_rate as f64 / 1000.;
@@ -102,11 +99,14 @@ impl DisplayConfig {
refresh_rate: refresh,
preferred_scale: 1.,
supported_scales: vec![1., 2., 3.],
- properties: HashMap::new(),
+ properties: HashMap::from([(
+ String::from("is-preferred"),
+ OwnedValue::from(is_preferred),
+ )]),
}
})
.collect();
- modes[ipc.current_mode.unwrap()]
+ modes[output.current_mode.unwrap()]
.properties
.insert(String::from("is-current"), OwnedValue::from(true));
@@ -116,23 +116,23 @@ impl DisplayConfig {
properties,
};
- let loc = output.current_location();
-
- let transform = match output.current_transform() {
- Transform::Normal => 0,
- Transform::_90 => 1,
- Transform::_180 => 2,
- Transform::_270 => 3,
- Transform::Flipped => 4,
- Transform::Flipped90 => 5,
- Transform::Flipped180 => 6,
- Transform::Flipped270 => 7,
+ let logical = output.logical.as_ref().unwrap();
+
+ let transform = match logical.transform {
+ niri_ipc::Transform::Normal => 0,
+ niri_ipc::Transform::_90 => 1,
+ niri_ipc::Transform::_180 => 2,
+ niri_ipc::Transform::_270 => 3,
+ niri_ipc::Transform::Flipped => 4,
+ niri_ipc::Transform::Flipped90 => 5,
+ niri_ipc::Transform::Flipped180 => 6,
+ niri_ipc::Transform::Flipped270 => 7,
};
let logical_monitor = LogicalMonitor {
- x: loc.x,
- y: loc.y,
- scale: output.current_scale().fractional_scale(),
+ x: logical.x,
+ y: logical.y,
+ scale: logical.scale,
transform,
is_primary: false,
monitors: vec![monitor.names.clone()],
diff --git a/src/dbus/mutter_screen_cast.rs b/src/dbus/mutter_screen_cast.rs
index d9c6c28e..853fe4ae 100644
--- a/src/dbus/mutter_screen_cast.rs
+++ b/src/dbus/mutter_screen_cast.rs
@@ -11,7 +11,6 @@ use zbus::{dbus_interface, fdo, InterfaceRef, ObjectServer, SignalContext};
use super::Start;
use crate::backend::IpcOutputMap;
-use crate::utils::output_size;
#[derive(Clone)]
pub struct ScreenCast {
@@ -49,7 +48,8 @@ struct RecordMonitorProperties {
#[derive(Clone)]
pub struct Stream {
- output: Output,
+ // FIXME: update on scale changes and whatnot.
+ output: niri_ipc::Output,
cursor_mode: CursorMode,
was_started: Arc<AtomicBool>,
to_niri: calloop::channel::Sender<ScreenCastToNiri>,
@@ -58,6 +58,8 @@ pub struct Stream {
#[derive(Debug, SerializeDict, Type, Value)]
#[zvariant(signature = "dict")]
struct StreamParameters {
+ /// Position of the stream in logical coordinates.
+ position: (i32, i32),
/// Size of the stream in logical coordinates.
size: (i32, i32),
}
@@ -65,7 +67,7 @@ struct StreamParameters {
pub enum ScreenCastToNiri {
StartCast {
session_id: usize,
- output: Output,
+ output: String,
cursor_mode: CursorMode,
signal_ctx: SignalContext<'static>,
},
@@ -160,11 +162,14 @@ impl Session {
) -> fdo::Result<OwnedObjectPath> {
debug!(connector, ?properties, "record_monitor");
- let Some((_, Some(output))) = self.ipc_outputs.lock().unwrap().get(connector).cloned()
- else {
+ let Some(output) = self.ipc_outputs.lock().unwrap().get(connector).cloned() else {
return Err(fdo::Error::Failed("no such monitor".to_owned()));
};
+ if output.logical.is_none() {
+ return Err(fdo::Error::Failed("monitor is disabled".to_owned()));
+ }
+
static NUMBER: AtomicUsize = AtomicUsize::new(0);
let path = format!(
"/org/gnome/Mutter/ScreenCast/Stream/u{}",
@@ -174,7 +179,7 @@ impl Session {
let cursor_mode = properties.cursor_mode.unwrap_or_default();
- let stream = Stream::new(output, cursor_mode, self.to_niri.clone());
+ let stream = Stream::new(output.clone(), cursor_mode, self.to_niri.clone());
match server.at(&path, stream.clone()).await {
Ok(true) => {
let iface = server.interface(&path).await.unwrap();
@@ -203,8 +208,11 @@ impl Stream {
#[dbus_interface(property)]
async fn parameters(&self) -> StreamParameters {
- let size = output_size(&self.output).into();
- StreamParameters { size }
+ let logical = self.output.logical.as_ref().unwrap();
+ StreamParameters {
+ position: (logical.x, logical.y),
+ size: (logical.width as i32, logical.height as i32),
+ }
}
}
@@ -261,7 +269,7 @@ impl Drop for Session {
impl Stream {
pub fn new(
- output: Output,
+ output: niri_ipc::Output,
cursor_mode: CursorMode,
to_niri: calloop::channel::Sender<ScreenCastToNiri>,
) -> Self {
@@ -280,7 +288,7 @@ impl Stream {
let msg = ScreenCastToNiri::StartCast {
session_id,
- output: self.output.clone(),
+ output: self.output.name.clone(),
cursor_mode: self.cursor_mode,
signal_ctx: ctxt,
};