Skip to content

Commit

Permalink
Add honor-xdg-activation-with-invalid-serial debug flag
Browse files Browse the repository at this point in the history
  • Loading branch information
YaLTeR committed Feb 26, 2025
1 parent 16405b9 commit 693d935
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 1 deletion.
3 changes: 3 additions & 0 deletions niri-config/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2014,6 +2014,8 @@ pub struct DebugConfig {
pub disable_monitor_names: bool,
#[knuffel(child)]
pub strict_new_window_focus_policy: bool,
#[knuffel(child)]
pub honor_xdg_activation_with_invalid_serial: bool,
}

#[derive(knuffel::DecodeScalar, Debug, Clone, Copy, PartialEq, Eq)]
Expand Down Expand Up @@ -4738,6 +4740,7 @@ mod tests {
keep_laptop_panel_on_when_lid_is_closed: false,
disable_monitor_names: false,
strict_new_window_focus_policy: false,
honor_xdg_activation_with_invalid_serial: false,
},
workspaces: [
Workspace {
Expand Down
19 changes: 18 additions & 1 deletion src/handlers/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -709,14 +709,31 @@ impl XdgActivationHandler for State {
}

fn token_created(&mut self, _token: XdgActivationToken, data: XdgActivationTokenData) -> bool {
// Only tokens that were created while the application has keyboard focus are valid.
// Tokens without a serial are urgency-only. This is not specified, but it seems to be the
// common client behavior.
//
// We don't have urgency yet, so just ignore such tokens.
//
// See also: https://gitlab.freedesktop.org/wayland/wayland-protocols/-/issues/150
let Some((serial, seat)) = data.serial else {
return false;
};
let Some(seat) = Seat::<State>::from_resource(&seat) else {
return false;
};

// Widely-used clients such as Discord and Telegram make new tokens (with invalid serials)
// upon clicking on their tray icon or on their notification. This debug flag makes that
// work.
//
// Clicking on a notification sends clients a perfectly valid activation token from the
// notification daemon, but alas they ignore it. Maybe in the future the clients are fixed,
// and we can remove this debug flag.
let config = self.niri.config.borrow();
if config.debug.honor_xdg_activation_with_invalid_serial {
return true;
}

// Check the serial against both a keyboard and a pointer, since layer-shell surfaces
// with no keyboard interactivity won't have any keyboard focus.
let kb_last_enter = seat.get_keyboard().unwrap().last_enter();
Expand Down
20 changes: 20 additions & 0 deletions wiki/Configuration:-Debug-Options.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ debug {
keep-laptop-panel-on-when-lid-is-closed
disable-monitor-names
strict-new-window-focus-policy
honor-xdg-activation-with-invalid-serial
}
binds {
Expand Down Expand Up @@ -238,6 +239,25 @@ debug {
}
```

### `honor-xdg-activation-with-invalid-serial`

<sup>Since: next release</sup>

Widely-used clients such as Discord and Telegram make fresh xdg-activation tokens upon clicking on their tray icon or on their notification.
Most of the time, these fresh tokens will have invalid serials, because the app needs to be focused to get a valid serial, and if the user clicks on a tray icon or a notification, it is usually because the app *isn't* focused, and the user wants to focus it.

By default, niri ignores xdg-activation tokens with invalid serials, to prevent windows from randomly stealing focus.
This debug flag makes niri honor such tokens, making the aforementioned widely-used apps get focus when clicking on their tray icon or notification.

Amusingly, clicking on a notification sends the app a perfectly valid activation token from the notification daemon, but these apps seem to simply ignore it.
Maybe in the future these apps/toolkits (Electron, Qt) are fixed, making this debug flag unnecessary.

```kdl
debug {
honor-xdg-activation-with-invalid-serial
}
```

### Key Bindings

These are not debug options, but rather key bindings.
Expand Down

0 comments on commit 693d935

Please sign in to comment.