app: client-side xdg-activation token requests
Some checks failed
CI / build + test (push) Has been cancelled
CI / cargo audit (push) Has been cancelled

Adds an outbound path so an app can obtain an `xdg-activation-v1` token from the compositor and hand it to a child it is about to launch (the `$XDG_ACTIVATION_TOKEN` convention). Until now ltk only honoured inbound activation (self-activating the main surface from an inherited token); requesting a token for another app was out of scope.
Two new `App` trait methods, both defaulting to no-op: `take_activation_requests` returns the tags the app wants tokens for this iteration, and `on_activation_token` delivers the issued token paired with its tag. The run loop drains the requests right after `poll_external` and calls `ActivationState::request_token`, carrying the tag in `RequestData::app_id`; `ActivationHandler::new_token` reads the tag back out and routes the token to the app through `on_activation_token`. When the compositor never advertised the activation global, each request is answered immediately with an empty token so the caller still proceeds and can fall back to its own matching instead of stalling.
This commit is contained in:
2026-06-09 23:53:31 +02:00
parent cfa0faff26
commit df8fcbf757
3 changed files with 55 additions and 6 deletions

View File

@@ -369,6 +369,18 @@ pub trait App: 'static
/// Return any pending messages from external sources (timers, async, etc.).
fn poll_external( &mut self ) -> Vec<Self::Message> { vec![] }
/// Tags for which the app wants a fresh `xdg-activation-v1` token this
/// iteration. Drained once per loop; each tag is echoed back verbatim
/// through [`App::on_activation_token`] once the compositor issues the
/// token, so the app can hand it to a child it is about to spawn via the
/// `$XDG_ACTIVATION_TOKEN` launch convention. Default none.
fn take_activation_requests( &mut self ) -> Vec<String> { Vec::new() }
/// Deliver a token issued for an earlier [`App::take_activation_requests`]
/// tag. `tag` is the string the app handed out; `token` is the opaque
/// activation token to place in the launched child's environment.
fn on_activation_token( &mut self, _tag: String, _token: String ) -> Option<Self::Message> { None }
/// Called once, immediately after the first buffer for the main surface
/// has been rendered and committed to the compositor. Note: this is the
/// client-side commit, not the compositor's present — under VT switching