aboutsummaryrefslogtreecommitdiff
path: root/src/layout
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-02-23 13:57:56 +0400
committerIvan Molodetskikh <yalterz@gmail.com>2024-02-23 14:01:32 +0400
commit2317021a7c4a7296606533d38f1fdce96826f7dc (patch)
tree10ff4760e21b9379853065f3472ae75d3986f183 /src/layout
parentaf6485cd8c85665b15ef8d2c812da17604ca4e32 (diff)
downloadniri-2317021a7c4a7296606533d38f1fdce96826f7dc.tar.gz
niri-2317021a7c4a7296606533d38f1fdce96826f7dc.tar.bz2
niri-2317021a7c4a7296606533d38f1fdce96826f7dc.zip
Implement explicit unmapped window state tracking
Diffstat (limited to 'src/layout')
-rw-r--r--src/layout/mod.rs40
-rw-r--r--src/layout/workspace.rs20
2 files changed, 28 insertions, 32 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs
index edc0d9de..c7239a2b 100644
--- a/src/layout/mod.rs
+++ b/src/layout/mod.rs
@@ -531,15 +531,10 @@ impl<W: LayoutElement> Layout<W> {
pub fn add_window(
&mut self,
window: W,
- width: Option<Option<ColumnWidth>>,
+ width: Option<ColumnWidth>,
is_full_width: bool,
) -> Option<&Output> {
- let width = match width {
- Some(Some(width)) => Some(width),
- Some(None) => None,
- None => self.options.default_width,
- }
- .unwrap_or_else(|| ColumnWidth::Fixed(window.size().w));
+ let width = width.unwrap_or_else(|| ColumnWidth::Fixed(window.size().w));
match &mut self.monitor_set {
MonitorSet::Normal {
@@ -587,15 +582,10 @@ impl<W: LayoutElement> Layout<W> {
&mut self,
right_of: &W,
window: W,
- width: Option<Option<ColumnWidth>>,
+ width: Option<ColumnWidth>,
is_full_width: bool,
) -> Option<&Output> {
- let width = match width {
- Some(Some(width)) => Some(width),
- Some(None) => None,
- None => self.options.default_width,
- }
- .unwrap_or_else(|| ColumnWidth::Fixed(window.size().w));
+ let width = width.unwrap_or_else(|| ColumnWidth::Fixed(window.size().w));
match &mut self.monitor_set {
MonitorSet::Normal { monitors, .. } => {
@@ -623,15 +613,10 @@ impl<W: LayoutElement> Layout<W> {
&mut self,
output: &Output,
window: W,
- width: Option<Option<ColumnWidth>>,
+ width: Option<ColumnWidth>,
is_full_width: bool,
) {
- let width = match width {
- Some(Some(width)) => Some(width),
- Some(None) => None,
- None => self.options.default_width,
- }
- .unwrap_or_else(|| ColumnWidth::Fixed(window.size().w));
+ let width = width.unwrap_or_else(|| ColumnWidth::Fixed(window.size().w));
let MonitorSet::Normal {
monitors,
@@ -931,6 +916,19 @@ impl<W: LayoutElement> Layout<W> {
Some(&mut monitors[*active_monitor_idx])
}
+ pub fn active_monitor_ref(&self) -> Option<&Monitor<W>> {
+ let MonitorSet::Normal {
+ monitors,
+ active_monitor_idx,
+ ..
+ } = &self.monitor_set
+ else {
+ return None;
+ };
+
+ Some(&monitors[*active_monitor_idx])
+ }
+
pub fn monitor_for_output(&self, output: &Output) -> Option<&Monitor<W>> {
let MonitorSet::Normal { monitors, .. } = &self.monitor_set else {
return None;
diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs
index b9016098..79889ef2 100644
--- a/src/layout/workspace.rs
+++ b/src/layout/workspace.rs
@@ -322,17 +322,19 @@ impl<W: LayoutElement> Workspace<W> {
))
}
- pub fn new_window_size(
+ pub fn resolve_default_width(
&self,
default_width: Option<Option<ColumnWidth>>,
- ) -> Size<i32, Logical> {
- let default_width = match default_width {
+ ) -> Option<ColumnWidth> {
+ match default_width {
Some(Some(width)) => Some(width),
Some(None) => None,
None => self.options.default_width,
- };
+ }
+ }
- let width = if let Some(width) = default_width {
+ pub fn new_window_size(&self, width: Option<ColumnWidth>) -> Size<i32, Logical> {
+ let width = if let Some(width) = width {
let mut width = width.resolve(&self.options, self.working_area.size.w);
if !self.options.border.off {
width -= self.options.border.width as i32 * 2;
@@ -350,11 +352,7 @@ impl<W: LayoutElement> Workspace<W> {
Size::from((width, max(height, 1)))
}
- pub fn configure_new_window(
- &self,
- window: &Window,
- default_width: Option<Option<ColumnWidth>>,
- ) {
+ pub fn configure_new_window(&self, window: &Window, width: Option<ColumnWidth>) {
if let Some(output) = self.output.as_ref() {
set_preferred_scale_transform(window, output);
}
@@ -363,7 +361,7 @@ impl<W: LayoutElement> Workspace<W> {
if state.states.contains(xdg_toplevel::State::Fullscreen) {
state.size = Some(self.view_size);
} else {
- state.size = Some(self.new_window_size(default_width));
+ state.size = Some(self.new_window_size(width));
}
state.bounds = Some(self.toplevel_bounds());