Skip to content

Commit 45832ce

Browse files
committed
add option not to move cursor
1 parent f01c840 commit 45832ce

File tree

5 files changed

+82
-27
lines changed

5 files changed

+82
-27
lines changed

niri-config/src/lib.rs

+32-12
Original file line numberDiff line numberDiff line change
@@ -1434,7 +1434,10 @@ pub enum Action {
14341434
#[knuffel(skip)]
14351435
FullscreenWindowById(u64),
14361436
#[knuffel(skip)]
1437-
FocusWindow(u64),
1437+
FocusWindow {
1438+
id: u64,
1439+
no_mouse_warp: bool,
1440+
},
14381441
FocusWindowInColumn(#[knuffel(argument)] u8),
14391442
FocusWindowPrevious,
14401443
FocusColumnLeft,
@@ -1485,9 +1488,19 @@ pub enum Action {
14851488
CenterWindow,
14861489
#[knuffel(skip)]
14871490
CenterWindowById(u64),
1488-
FocusWorkspaceDown,
1489-
FocusWorkspaceUp,
1490-
FocusWorkspace(#[knuffel(argument)] WorkspaceReference),
1491+
#[knuffel(skip)]
1492+
FocusWorkspaceDown {
1493+
no_mouse_warp: bool,
1494+
},
1495+
#[knuffel(skip)]
1496+
FocusWorkspaceUp {
1497+
no_mouse_warp: bool,
1498+
},
1499+
FocusWorkspace(
1500+
//fix this
1501+
#[knuffel(argument)] WorkspaceReference,
1502+
bool,
1503+
),
14911504
FocusWorkspacePrevious,
14921505
MoveWindowToWorkspaceDown,
14931506
MoveWindowToWorkspaceUp,
@@ -1620,7 +1633,9 @@ impl From<niri_ipc::Action> for Action {
16201633
niri_ipc::Action::CloseWindow { id: Some(id) } => Self::CloseWindowById(id),
16211634
niri_ipc::Action::FullscreenWindow { id: None } => Self::FullscreenWindow,
16221635
niri_ipc::Action::FullscreenWindow { id: Some(id) } => Self::FullscreenWindowById(id),
1623-
niri_ipc::Action::FocusWindow { id } => Self::FocusWindow(id),
1636+
niri_ipc::Action::FocusWindow { id, no_mouse_warp } => {
1637+
Self::FocusWindow { id, no_mouse_warp }
1638+
}
16241639
niri_ipc::Action::FocusWindowInColumn { index } => Self::FocusWindowInColumn(index),
16251640
niri_ipc::Action::FocusWindowPrevious {} => Self::FocusWindowPrevious,
16261641
niri_ipc::Action::FocusColumnLeft {} => Self::FocusColumnLeft,
@@ -1682,11 +1697,16 @@ impl From<niri_ipc::Action> for Action {
16821697
niri_ipc::Action::CenterColumn {} => Self::CenterColumn,
16831698
niri_ipc::Action::CenterWindow { id: None } => Self::CenterWindow,
16841699
niri_ipc::Action::CenterWindow { id: Some(id) } => Self::CenterWindowById(id),
1685-
niri_ipc::Action::FocusWorkspaceDown {} => Self::FocusWorkspaceDown,
1686-
niri_ipc::Action::FocusWorkspaceUp {} => Self::FocusWorkspaceUp,
1687-
niri_ipc::Action::FocusWorkspace { reference } => {
1688-
Self::FocusWorkspace(WorkspaceReference::from(reference))
1700+
niri_ipc::Action::FocusWorkspaceDown { no_mouse_warp } => {
1701+
Self::FocusWorkspaceDown { no_mouse_warp }
16891702
}
1703+
niri_ipc::Action::FocusWorkspaceUp { no_mouse_warp } => {
1704+
Self::FocusWorkspaceUp { no_mouse_warp }
1705+
}
1706+
niri_ipc::Action::FocusWorkspace {
1707+
reference,
1708+
no_mouse_warp,
1709+
} => Self::FocusWorkspace(WorkspaceReference::from(reference), no_mouse_warp),
16901710
niri_ipc::Action::FocusWorkspacePrevious {} => Self::FocusWorkspacePrevious,
16911711
niri_ipc::Action::MoveWindowToWorkspaceDown {} => Self::MoveWindowToWorkspaceDown,
16921712
niri_ipc::Action::MoveWindowToWorkspaceUp {} => Self::MoveWindowToWorkspaceUp,
@@ -4149,7 +4169,7 @@ mod tests {
41494169
trigger: Trigger::Keysym(Keysym::_1),
41504170
modifiers: Modifiers::COMPOSITOR,
41514171
},
4152-
action: Action::FocusWorkspace(WorkspaceReference::Index(1)),
4172+
action: Action::FocusWorkspace( WorkspaceReference::Index(1), false),
41534173
repeat: true,
41544174
cooldown: None,
41554175
allow_when_locked: false,
@@ -4163,7 +4183,7 @@ mod tests {
41634183
},
41644184
action: Action::FocusWorkspace(WorkspaceReference::Name(
41654185
"workspace-1".to_string(),
4166-
)),
4186+
), false),
41674187
repeat: true,
41684188
cooldown: None,
41694189
allow_when_locked: false,
@@ -4187,7 +4207,7 @@ mod tests {
41874207
trigger: Trigger::WheelScrollDown,
41884208
modifiers: Modifiers::COMPOSITOR,
41894209
},
4190-
action: Action::FocusWorkspaceDown,
4210+
action: Action::FocusWorkspaceDown{no_mouse_warp: false},
41914211
repeat: true,
41924212
cooldown: Some(Duration::from_millis(150)),
41934213
allow_when_locked: false,

niri-ipc/src/lib.rs

+16-2
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,9 @@ pub enum Action {
214214
/// Id of the window to focus.
215215
#[cfg_attr(feature = "clap", arg(long))]
216216
id: u64,
217+
/// Dont move the cursor when focussing the window.
218+
#[cfg_attr(feature = "clap", arg(long = "no_mouse_warp", action = clap::ArgAction::SetTrue))]
219+
no_mouse_warp: bool,
217220
},
218221
/// Focus a window in the focused column by index.
219222
FocusWindowInColumn {
@@ -344,14 +347,25 @@ pub enum Action {
344347
id: Option<u64>,
345348
},
346349
/// Focus the workspace below.
347-
FocusWorkspaceDown {},
350+
FocusWorkspaceDown {
351+
/// Dont move the cursor when focussing the window.
352+
#[cfg_attr(feature = "clap", arg(long = "no_mouse_warp", action = clap::ArgAction::SetTrue))]
353+
no_mouse_warp: bool,
354+
},
348355
/// Focus the workspace above.
349-
FocusWorkspaceUp {},
356+
FocusWorkspaceUp {
357+
/// Dont move the cursor when focussing the window.
358+
#[cfg_attr(feature = "clap", arg(long = "no_mouse_warp", action = clap::ArgAction::SetTrue))]
359+
no_mouse_warp: bool,
360+
},
350361
/// Focus a workspace by reference (index or name).
351362
FocusWorkspace {
352363
/// Reference (index or name) of the workspace to focus.
353364
#[cfg_attr(feature = "clap", arg())]
354365
reference: WorkspaceReferenceArg,
366+
/// Dont move the cursor when focussing the window.
367+
#[cfg_attr(feature = "clap", arg(long = "no_mouse_warp", action = clap::ArgAction::SetTrue))]
368+
no_mouse_warp: bool,
355369
},
356370
/// Focus the previous workspace.
357371
FocusWorkspacePrevious {},

src/input/mod.rs

+19-9
Original file line numberDiff line numberDiff line change
@@ -679,11 +679,15 @@ impl State {
679679
self.niri.queue_redraw_all();
680680
}
681681
}
682-
Action::FocusWindow(id) => {
682+
Action::FocusWindow { id, no_mouse_warp } => {
683683
let window = self.niri.layout.windows().find(|(_, m)| m.id().get() == id);
684684
let window = window.map(|(_, m)| m.window.clone());
685685
if let Some(window) = window {
686-
self.focus_window(&window);
686+
if !no_mouse_warp {
687+
self.focus_window(&window);
688+
return;
689+
}
690+
self.focus_window_without_moving_cursor(&window);
687691
}
688692
}
689693
Action::FocusWindowInColumn(index) => {
@@ -1149,21 +1153,25 @@ impl State {
11491153
self.niri.queue_redraw_all();
11501154
}
11511155
}
1152-
Action::FocusWorkspaceDown => {
1156+
Action::FocusWorkspaceDown { no_mouse_warp } => {
11531157
self.niri.layout.switch_workspace_down();
1154-
self.maybe_warp_cursor_to_focus();
1158+
if !no_mouse_warp {
1159+
self.maybe_warp_cursor_to_focus();
1160+
}
11551161
self.niri.layer_shell_on_demand_focus = None;
11561162
// FIXME: granular
11571163
self.niri.queue_redraw_all();
11581164
}
1159-
Action::FocusWorkspaceUp => {
1165+
Action::FocusWorkspaceUp { no_mouse_warp } => {
11601166
self.niri.layout.switch_workspace_up();
1161-
self.maybe_warp_cursor_to_focus();
1167+
if !no_mouse_warp {
1168+
self.maybe_warp_cursor_to_focus();
1169+
}
11621170
self.niri.layer_shell_on_demand_focus = None;
11631171
// FIXME: granular
11641172
self.niri.queue_redraw_all();
11651173
}
1166-
Action::FocusWorkspace(reference) => {
1174+
Action::FocusWorkspace(reference, no_mouse_warp) => {
11671175
if let Some((mut output, index)) =
11681176
self.niri.find_output_and_workspace_index(reference)
11691177
{
@@ -1176,7 +1184,7 @@ impl State {
11761184
if let Some(output) = output {
11771185
self.niri.layout.focus_output(&output);
11781186
self.niri.layout.switch_workspace(index);
1179-
if !self.maybe_warp_cursor_to_focus_centered() {
1187+
if !no_mouse_warp && !self.maybe_warp_cursor_to_focus_centered() {
11801188
self.move_cursor_to_output(&output);
11811189
}
11821190
} else {
@@ -1186,7 +1194,9 @@ impl State {
11861194
} else {
11871195
self.niri.layout.switch_workspace(index);
11881196
}
1189-
self.maybe_warp_cursor_to_focus();
1197+
if !no_mouse_warp {
1198+
self.maybe_warp_cursor_to_focus();
1199+
}
11901200
}
11911201
self.niri.layer_shell_on_demand_focus = None;
11921202

src/niri.rs

+7
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,13 @@ impl State {
775775
self.niri.queue_redraw_all();
776776
}
777777

778+
/// Focus a specific window without moving the cursor.
779+
pub fn focus_window_without_moving_cursor(&mut self, window: &Window) {
780+
self.niri.layout.activate_window(window);
781+
// FIXME: granular
782+
self.niri.queue_redraw_all();
783+
}
784+
778785
pub fn maybe_warp_cursor_to_focus(&mut self) -> bool {
779786
if !self.niri.config.borrow().input.warp_mouse_to_focus {
780787
return false;

src/ui/hotkey_overlay.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,12 @@ fn render(
210210
&Action::FocusColumnRight,
211211
&Action::MoveColumnLeft,
212212
&Action::MoveColumnRight,
213-
&Action::FocusWorkspaceDown,
214-
&Action::FocusWorkspaceUp,
213+
&Action::FocusWorkspaceDown {
214+
no_mouse_warp: false,
215+
},
216+
&Action::FocusWorkspaceUp {
217+
no_mouse_warp: false,
218+
},
215219
]);
216220

217221
// Prefer move-column-to-workspace-down, but fall back to move-window-to-workspace-down.
@@ -422,8 +426,8 @@ fn action_name(action: &Action) -> String {
422426
Action::FocusColumnRight => String::from("Focus Column to the Right"),
423427
Action::MoveColumnLeft => String::from("Move Column Left"),
424428
Action::MoveColumnRight => String::from("Move Column Right"),
425-
Action::FocusWorkspaceDown => String::from("Switch Workspace Down"),
426-
Action::FocusWorkspaceUp => String::from("Switch Workspace Up"),
429+
Action::FocusWorkspaceDown { no_mouse_warp: _ } => String::from("Switch Workspace Down"),
430+
Action::FocusWorkspaceUp { no_mouse_warp: _ } => String::from("Switch Workspace Up"),
427431
Action::MoveColumnToWorkspaceDown => String::from("Move Column to Workspace Down"),
428432
Action::MoveColumnToWorkspaceUp => String::from("Move Column to Workspace Up"),
429433
Action::MoveWindowToWorkspaceDown => String::from("Move Window to Workspace Down"),

0 commit comments

Comments
 (0)