Skip to main content

LinuxProvider

Struct LinuxProvider 

Source
pub struct LinuxProvider { /* private fields */ }
Expand description

Linux accessibility provider using AT-SPI2 over D-Bus.

Implementations§

Source§

impl LinuxProvider

Source

pub fn new() -> Result<Self>

Create a new Linux accessibility provider.

Connects to the AT-SPI2 bus. Falls back to the session bus if the dedicated AT-SPI bus is unavailable.

Trait Implementations§

Source§

impl Provider for LinuxProvider

Source§

fn list_shell_surfaces(&self) -> Result<Vec<(ShellSurfaceKind, ElementData)>>

Enumerate desktop panels and docks.

A Linux shell surface is a top-level AT-SPI frame whose attribute set carries window-type:dock — how panels self-identify, from xfce4-panel’s panel and dock rows to GNOME’s and KDE’s shells. One surface per such frame, so a panel process that owns two rows yields two ShellSurfaceKind::Panel entries, each with the panel process’s pid. Panels are commonly unnamed; the frame’s name is then None and the core falls back to the kind.

Panel is the only kind Linux vends: the desktop has no menu bar, taskbar, or dock object of its own, and StatusNotifierItem menus live on com.canonical.dbusmenu, a different subsystem from AT-SPI. Their absence from the listing is honest scope, not failure.

The scan runs over list_apps rather than its own registry walk, so it inherits that enumeration’s empty-name filter: a panel that registers on the bus without a name is invisible here for the same reason it is invisible to App::list.

§Errors

A top-level that was just enumerated but will not answer GetRole or GetAttributes fails the listing (tenet 1). Those two calls are how a frame is classified, and Panel is the only kind Linux vends — so treating a D-Bus failure as “not a panel” turns one broken process into an empty listing that reads exactly like a desktop with no panels. The error names the app and object path that would not answer.

An object that answers GetAttributes with UnknownMethod is the one exception, and it is absence rather than failure — see the call site.

Enumerating one app’s top-levels is the one step that still skips: get_atspi_children failing is how a process that has left the bus presents, and focused_app already treats it that way.

Source§

fn splits_app_across_entries(&self) -> bool

A single process can register several AT-SPI Application entries (per-process instance plus per-event-loop pieces), so App::windows must merge their window children by pid. The same-pid merge and the stable identities it deduplicates by live in xa11y-core.

Source§

fn list_apps(&self) -> Result<Vec<ElementData>>

Enumerate top-level applications by listing direct children of the AT-SPI registry root — every running accessibility-enabled app registers a child accessible there. Apps with empty names are filtered out (toolkits sometimes register transient/system accessibles before the real app appears). PID resolution uses the AT-SPI Application interface, falling back to the D-Bus owner.

Source§

fn app_by_pid(&self, pid: u32) -> Result<ElementData>

Find an application by pid directly against the AT-SPI registry.

Differs from filtering list_apps() in two ways that matter for a freshly launched process:

  • No empty-name filter — toolkits can register on the bus before the app name is set, and a pid match is precise enough on its own.
  • The not-matched error reports how many registry entries were examined and how many had no resolvable pid (the misreported-pid bridge quirk get_app_pid documents), so a timeout on CI says why the app was invisible instead of just “not found”.
Source§

fn focused_app(&self) -> Result<ElementData>

Identify the foreground application via the active top-level window.

AT-SPI has no registry-level “focused application” call, and the Application accessibles themselves don’t carry an active/focused state across toolkits. The portable signal is the ACTIVE state (AtspiStateType::ACTIVE) set on the foreground window (frame): we enumerate each registered application’s top-level children and return the first application that owns a window reporting ACTIVE.

Returns Error::SelectorNotMatched when no window is active (no app has the foreground — e.g. focus is on the shell or a non-AT-SPI surface). The core reads that as “nothing focused”, not a failure.

Source§

fn get_children( &self, element: Option<&ElementData>, ) -> Result<Vec<ElementData>>

Get direct children of an element. Read more
Source§

fn find_elements_group( &self, root: &ElementData, group: &SelectorGroup, limit: Option<usize>, max_depth: Option<u32>, ) -> Result<Vec<ElementData>>

Search for elements matching any clause of a comma-separated selector group, scoped to root’s subtree. Read more
Source§

fn get_parent(&self, element: &ElementData) -> Result<Option<ElementData>>

Get the parent of an element. Read more
Source§

fn app_roots(&self, app: &ElementData) -> Result<Vec<ElementData>>

Return every native application root that belongs to the same process as app. Read more
Source§

fn press(&self, element: &ElementData) -> Result<()>

Click / tap / invoke the element.
Source§

fn focus(&self, element: &ElementData) -> Result<()>

Set keyboard focus to the element.
Source§

fn blur(&self, element: &ElementData) -> Result<()>

Remove keyboard focus from the element.
Source§

fn toggle(&self, element: &ElementData) -> Result<()>

Toggle a checkbox or switch.
Source§

fn select(&self, element: &ElementData) -> Result<()>

Select an item in a list, tab group, or menu.
Source§

fn expand(&self, element: &ElementData) -> Result<()>

Expand a collapsible element (combo box, tree item, disclosure).
Source§

fn collapse(&self, element: &ElementData) -> Result<()>

Collapse an expanded element.
Source§

fn show_menu(&self, element: &ElementData) -> Result<()>

Show the element’s context menu or dropdown.
Source§

fn increment(&self, element: &ElementData) -> Result<()>

Increment a slider or spinner by one step.
Source§

fn decrement(&self, element: &ElementData) -> Result<()>

Decrement a slider or spinner by one step.
Source§

fn scroll_into_view(&self, element: &ElementData) -> Result<()>

Scroll the element into the visible area.
Source§

fn activate(&self, element: &ElementData) -> Result<()>

App::windows filters app_windows to Role::Window | Role::Dialog. By default app_windows returns the Application node’s children. Windows overrides it because native dialogs can be UIA descendants of another window; listing them does not make them separate roots for an app-wide tree walk. Read more
Source§

fn minimize(&self, element: &ElementData) -> Result<()>

Minimize the window.
Source§

fn maximize(&self, element: &ElementData) -> Result<()>

Maximize the window. Read more
Source§

fn enter_fullscreen(&self, element: &ElementData) -> Result<()>

Put the window in native fullscreen. Read more
Source§

fn restore(&self, element: &ElementData) -> Result<()>

Restore the window to its normal state (from minimized/maximized/fullscreen).
Source§

fn close(&self, element: &ElementData) -> Result<()>

Close the window.
Source§

fn move_to(&self, element: &ElementData, x: i32, y: i32) -> Result<()>

Move the window in the coordinates of ElementData::bounds (physical pixels on Windows, logical points elsewhere).
Source§

fn resize_to(&self, element: &ElementData, w: u32, h: u32) -> Result<()>

Resize the window in the units of ElementData::bounds.
Source§

fn set_value(&self, element: &ElementData, value: &str) -> Result<()>

Set the text value of the element.
Source§

fn set_numeric_value(&self, element: &ElementData, value: f64) -> Result<()>

Set the numeric value of the element (slider, spinner).
Source§

fn type_text(&self, element: &ElementData, text: &str) -> Result<()>

Insert text at the current cursor position.
Source§

fn set_text_selection( &self, element: &ElementData, start: u32, end: u32, ) -> Result<()>

Select a text range (0-based character offsets).
Source§

fn perform_action(&self, element: &ElementData, action: &str) -> Result<()>

Perform an action by snake_case name. Read more
Source§

fn subscribe(&self, element: &ElementData) -> Result<Subscription>

Subscribe to all accessibility events for an application. Read more
Source§

fn app_windows(&self, app: &ElementData) -> Result<Vec<ElementData>, Error>

List an application’s windows. Backends whose native window list is wider than their accessibility tree roots can override this.
Source§

fn find_elements( &self, root: &ElementData, selector: &Selector, limit: Option<usize>, max_depth: Option<u32>, ) -> Result<Vec<ElementData>, Error>

Search for elements matching a selector. Read more
Source§

fn narrow_multi_segment( &self, candidates: Vec<ElementData>, segments: &[SelectorSegment], max_depth: u32, limit: Option<usize>, ) -> Result<Vec<ElementData>, Error>

Narrow candidates through remaining selector segments (Child/Descendant combinators), deduplicate, apply final :nth and limit.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync> ⓘ

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more