aboutsummaryrefslogtreecommitdiff
path: root/src/layout
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-09-03 12:13:04 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2024-09-03 13:48:08 +0300
commitf0157e03e72714264e684295fac226e2046f0b38 (patch)
tree7bfd198f59697704c5464c8498d3f8d7ff80131d /src/layout
parent4b7c16b04a7c80f5f9b6fcbc4a1d8c9448dffbdb (diff)
downloadniri-f0157e03e72714264e684295fac226e2046f0b38.tar.gz
niri-f0157e03e72714264e684295fac226e2046f0b38.tar.bz2
niri-f0157e03e72714264e684295fac226e2046f0b38.zip
Use libdisplay-info for make/model/serial parsing, implement throughout
Diffstat (limited to 'src/layout')
-rw-r--r--src/layout/mod.rs34
-rw-r--r--src/layout/workspace.rs25
2 files changed, 41 insertions, 18 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs
index 9a9e084d..734512dd 100644
--- a/src/layout/mod.rs
+++ b/src/layout/mod.rs
@@ -54,7 +54,7 @@ use crate::render_helpers::solid_color::{SolidColorBuffer, SolidColorRenderEleme
use crate::render_helpers::texture::TextureBuffer;
use crate::render_helpers::{BakedBuffer, RenderTarget, SplitElements};
use crate::utils::transaction::{Transaction, TransactionBlocker};
-use crate::utils::{output_size, round_logical_in_physical_max1, ResizeEdge};
+use crate::utils::{output_matches_name, output_size, round_logical_in_physical_max1, ResizeEdge};
use crate::window::ResolvedWindowRules;
pub mod closing_window;
@@ -344,8 +344,6 @@ impl<W: LayoutElement> Layout<W> {
}
pub fn add_output(&mut self, output: Output) {
- let id = OutputId::new(&output);
-
self.monitor_set = match mem::take(&mut self.monitor_set) {
MonitorSet::Normal {
mut monitors,
@@ -358,7 +356,7 @@ impl<W: LayoutElement> Layout<W> {
let mut workspaces = vec![];
for i in (0..primary.workspaces.len()).rev() {
- if primary.workspaces[i].original_output == id {
+ if primary.workspaces[i].original_output.matches(&output) {
let ws = primary.workspaces.remove(i);
// FIXME: this can be coded in a way that the workspace switch won't be
@@ -1722,18 +1720,16 @@ impl<W: LayoutElement> Layout<W> {
assert!(after_idx < monitor.workspaces.len());
}
- let monitor_id = OutputId::new(&monitor.output);
-
if idx == primary_idx {
for ws in &monitor.workspaces {
- if ws.original_output == monitor_id {
+ if ws.original_output.matches(&monitor.output) {
// This is the primary monitor's own workspace.
continue;
}
let own_monitor_exists = monitors
.iter()
- .any(|m| OutputId::new(&m.output) == ws.original_output);
+ .any(|m| ws.original_output.matches(&m.output));
assert!(
!own_monitor_exists,
"primary monitor cannot have workspaces for which their own monitor exists"
@@ -1744,7 +1740,7 @@ impl<W: LayoutElement> Layout<W> {
monitor
.workspaces
.iter()
- .any(|workspace| workspace.original_output == monitor_id),
+ .any(|workspace| workspace.original_output.matches(&monitor.output)),
"secondary monitor must not have any non-own workspaces"
);
}
@@ -1881,7 +1877,7 @@ impl<W: LayoutElement> Layout<W> {
.map(|name| {
monitors
.iter_mut()
- .position(|monitor| monitor.output_name().eq_ignore_ascii_case(name))
+ .position(|monitor| output_matches_name(&monitor.output, name))
.unwrap_or(*primary_idx)
})
.unwrap_or(*active_monitor_idx);
@@ -2556,7 +2552,7 @@ impl<W: LayoutElement> Default for MonitorSet<W> {
mod tests {
use std::cell::Cell;
- use niri_config::{FloatOrInt, WorkspaceName};
+ use niri_config::{FloatOrInt, OutputName, WorkspaceName};
use proptest::prelude::*;
use proptest_derive::Arbitrary;
use smithay::output::{Mode, PhysicalProperties, Subpixel};
@@ -2967,7 +2963,7 @@ mod tests {
}
let output = Output::new(
- name,
+ name.clone(),
PhysicalProperties {
size: Size::from((1280, 720)),
subpixel: Subpixel::Unknown,
@@ -2984,6 +2980,12 @@ mod tests {
None,
None,
);
+ output.user_data().insert_if_missing(|| OutputName {
+ connector: name,
+ make: None,
+ model: None,
+ serial: None,
+ });
layout.add_output(output.clone());
}
Op::AddScaledOutput { id, scale } => {
@@ -2993,7 +2995,7 @@ mod tests {
}
let output = Output::new(
- name,
+ name.clone(),
PhysicalProperties {
size: Size::from((1280, 720)),
subpixel: Subpixel::Unknown,
@@ -3010,6 +3012,12 @@ mod tests {
Some(smithay::output::Scale::Fractional(scale)),
None,
);
+ output.user_data().insert_if_missing(|| OutputName {
+ connector: name,
+ make: None,
+ model: None,
+ serial: None,
+ });
layout.add_output(output.clone());
}
Op::RemoveOutput(id) => {
diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs
index f85ec622..a2dcf460 100644
--- a/src/layout/workspace.rs
+++ b/src/layout/workspace.rs
@@ -3,7 +3,9 @@ use std::iter::{self, zip};
use std::rc::Rc;
use std::time::Duration;
-use niri_config::{CenterFocusedColumn, PresetWidth, Struts, Workspace as WorkspaceConfig};
+use niri_config::{
+ CenterFocusedColumn, OutputName, PresetWidth, Struts, Workspace as WorkspaceConfig,
+};
use niri_ipc::SizeChange;
use ordered_float::NotNan;
use smithay::backend::renderer::gles::GlesRenderer;
@@ -117,9 +119,16 @@ pub struct Workspace<W: LayoutElement> {
id: WorkspaceId,
}
-#[derive(Debug, Clone, PartialEq, Eq)]
+#[derive(Debug, Clone)]
pub struct OutputId(String);
+impl OutputId {
+ pub fn matches(&self, output: &Output) -> bool {
+ let output_name = output.user_data().get::<OutputName>().unwrap();
+ output_name.matches(&self.0)
+ }
+}
+
static WORKSPACE_ID_COUNTER: IdCounter = IdCounter::new();
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
@@ -274,7 +283,8 @@ struct TileData {
impl OutputId {
pub fn new(output: &Output) -> Self {
- Self(output.name())
+ let output_name = output.user_data().get::<OutputName>().unwrap();
+ Self(output_name.format_make_model_serial_or_connector())
}
}
@@ -401,8 +411,8 @@ impl<W: LayoutElement> Workspace<W> {
) -> Self {
let original_output = OutputId(
config
- .clone()
- .and_then(|c| c.open_on_output)
+ .as_ref()
+ .and_then(|c| c.open_on_output.clone())
.unwrap_or_default(),
);
@@ -559,6 +569,11 @@ impl<W: LayoutElement> Workspace<W> {
self.output = output;
if let Some(output) = &self.output {
+ // Normalize original output: possibly replace connector with make/model/serial.
+ if self.original_output.matches(output) {
+ self.original_output = OutputId::new(output);
+ }
+
let scale = output.current_scale();
let transform = output.current_transform();
let working_area = compute_working_area(output, self.options.struts);