aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/handlers/compositor.rs42
-rw-r--r--src/window/mod.rs8
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);
}