layout: Deduplicate move_workspace_to_output()

This commit is contained in:
Ivan Molodetskikh
2025-09-26 12:04:22 +03:00
parent ea3bbea6bd
commit 36dc5c6e8e
4 changed files with 10 additions and 32 deletions

View File

@@ -583,7 +583,7 @@ impl ExtWorkspaceHandler for State {
if let Some((old_output, old_idx)) = self.niri.find_output_and_workspace_index(reference) { if let Some((old_output, old_idx)) = self.niri.find_output_and_workspace_index(reference) {
self.niri self.niri
.layout .layout
.move_workspace_to_output_by_id(old_idx, old_output, output); .move_workspace_to_output_by_id(old_idx, old_output, &output);
} }
} }
} }

View File

@@ -1950,7 +1950,7 @@ impl State {
if self.niri.layout.move_workspace_to_output_by_id( if self.niri.layout.move_workspace_to_output_by_id(
old_idx, old_idx,
output, output,
new_output.clone(), &new_output,
) { ) {
// Cursor warp already calls `queue_redraw_all` // Cursor warp already calls `queue_redraw_all`
if !self.maybe_warp_cursor_to_focus_centered() { if !self.maybe_warp_cursor_to_focus_centered() {

View File

@@ -3387,43 +3387,21 @@ impl<W: LayoutElement> Layout<W> {
monitors, monitors,
active_monitor_idx, active_monitor_idx,
.. ..
} = &mut self.monitor_set } = &self.monitor_set
else { else {
return false; return false;
}; };
let current = &mut monitors[*active_monitor_idx]; let idx = monitors[*active_monitor_idx].active_workspace_idx;
self.move_workspace_to_output_by_id(idx, None, output)
// Do not do anything if the output is already correct
if &current.output == output {
// Just update the original output since this is an explicit movement action.
current.active_workspace().original_output = OutputId::new(output);
return false;
}
let mut ws = current.remove_workspace_by_idx(current.active_workspace_idx);
ws.original_output = OutputId::new(output);
let target_idx = monitors
.iter()
.position(|mon| &mon.output == output)
.unwrap();
let target = &mut monitors[target_idx];
target.insert_workspace(ws, target.active_workspace_idx + 1, true);
*active_monitor_idx = target_idx;
true
} }
// FIXME: accept workspace by id and deduplicate logic with move_workspace_to_output() // FIXME: accept workspace by id
pub fn move_workspace_to_output_by_id( pub fn move_workspace_to_output_by_id(
&mut self, &mut self,
old_idx: usize, old_idx: usize,
old_output: Option<Output>, old_output: Option<Output>,
new_output: Output, new_output: &Output,
) -> bool { ) -> bool {
let MonitorSet::Normal { let MonitorSet::Normal {
monitors, monitors,
@@ -3444,7 +3422,7 @@ impl<W: LayoutElement> Layout<W> {
}; };
let target_idx = monitors let target_idx = monitors
.iter() .iter()
.position(|mon| mon.output == new_output) .position(|mon| mon.output == *new_output)
.unwrap(); .unwrap();
let current = &mut monitors[current_idx]; let current = &mut monitors[current_idx];
@@ -3467,7 +3445,7 @@ impl<W: LayoutElement> Layout<W> {
current_idx == *active_monitor_idx && old_idx == current.active_workspace_idx; current_idx == *active_monitor_idx && old_idx == current.active_workspace_idx;
let mut ws = current.remove_workspace_by_idx(old_idx); let mut ws = current.remove_workspace_by_idx(old_idx);
ws.original_output = OutputId::new(&new_output); ws.original_output = OutputId::new(new_output);
let target = &mut monitors[target_idx]; let target = &mut monitors[target_idx];
target.insert_workspace(ws, target.active_workspace_idx + 1, activate); target.insert_workspace(ws, target.active_workspace_idx + 1, activate);

View File

@@ -1245,7 +1245,7 @@ impl Op {
return; return;
}; };
layout.move_workspace_to_output_by_id(old_idx, Some(old_output), output); layout.move_workspace_to_output_by_id(old_idx, Some(old_output), &output);
} }
Op::SwitchPresetColumnWidth => layout.toggle_width(true), Op::SwitchPresetColumnWidth => layout.toggle_width(true),
Op::SwitchPresetColumnWidthBack => layout.toggle_width(false), Op::SwitchPresetColumnWidthBack => layout.toggle_width(false),