diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-09-03 12:13:04 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-09-03 13:48:08 +0300 |
| commit | f0157e03e72714264e684295fac226e2046f0b38 (patch) | |
| tree | 7bfd198f59697704c5464c8498d3f8d7ff80131d /src/layout | |
| parent | 4b7c16b04a7c80f5f9b6fcbc4a1d8c9448dffbdb (diff) | |
| download | niri-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.rs | 34 | ||||
| -rw-r--r-- | src/layout/workspace.rs | 25 |
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); |
