diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/handlers/compositor.rs | 42 | ||||
| -rw-r--r-- | src/window/mod.rs | 8 |
2 files changed, 34 insertions, 16 deletions
diff --git a/src/handlers/compositor.rs b/src/handlers/compositor.rs index 3856849f..c0dc9428 100644 --- a/src/handlers/compositor.rs +++ b/src/handlers/compositor.rs @@ -126,6 +126,32 @@ impl CompositorHandler for State { // moment, that is here. let is_floating = rules.compute_open_floating(toplevel); + // Figure out if we should activate the window. + let activate = rules.open_focused.map(|focus| { + if focus { + ActivateWindow::Yes + } else { + ActivateWindow::No + } + }); + let activate = activate.unwrap_or_else(|| { + // Check the token timestamp again in case the window took a while between + // requesting activation and mapping. + let token = activation_token_data.filter(|token| { + token.timestamp.elapsed() < XDG_ACTIVATION_TOKEN_TIMEOUT + }); + if token.is_some() { + ActivateWindow::Yes + } else { + let config = self.niri.config.borrow(); + if config.debug.strict_new_window_focus_policy { + ActivateWindow::No + } else { + ActivateWindow::Smart + } + } + }); + let parent = toplevel .parent() .and_then(|parent| self.niri.layout.find_window_and_output(&parent)) @@ -146,22 +172,6 @@ impl CompositorHandler for State { let mapped = Mapped::new(window, rules, hook); let window = mapped.window.clone(); - // Check the token timestamp again in case the window took a while between - // requesting activation and mapping. - let activate = match activation_token_data - .filter(|token| token.timestamp.elapsed() < XDG_ACTIVATION_TOKEN_TIMEOUT) - { - Some(_) => ActivateWindow::Yes, - None => { - let config = self.niri.config.borrow(); - if config.debug.strict_new_window_focus_policy { - ActivateWindow::No - } else { - ActivateWindow::Smart - } - } - }; - let target = if let Some(p) = &parent { // Open dialogs next to their parent window. AddWindowTarget::NextTo(p) diff --git a/src/window/mod.rs b/src/window/mod.rs index 9a44319a..0b0b5f1e 100644 --- a/src/window/mod.rs +++ b/src/window/mod.rs @@ -49,6 +49,9 @@ pub struct ResolvedWindowRules { /// Whether the window should open floating. pub open_floating: Option<bool>, + /// Whether the window should open focused. + pub open_focused: Option<bool>, + /// Extra bound on the minimum window width. pub min_width: Option<u16>, /// Extra bound on the minimum window height. @@ -116,6 +119,7 @@ impl ResolvedWindowRules { open_maximized: None, open_fullscreen: None, open_floating: None, + open_focused: None, min_width: None, min_height: None, max_width: None, @@ -208,6 +212,10 @@ impl ResolvedWindowRules { resolved.open_floating = Some(x); } + if let Some(x) = rule.open_focused { + resolved.open_focused = Some(x); + } + if let Some(x) = rule.min_width { resolved.min_width = Some(x); } |
