AccessKit: UI accessibility infrastructure across platforms and programming languages

Related tags

GUI accesskit
Overview

AccessKit: UI accessibility infrastructure across platforms and programming languages

Motivation

There are numerous UI toolkits, and new ones continue to proliferate. So far, only the largest UI toolkit projects, with corporate backing, implement accessibility for users who require assistive technologies, such as blind people using screen readers. If the long tail of UI toolkits are ever going to be made fully accessible, then we must pool as much of the required effort as possible across these toolkits. Many of these toolkits are cross-platform, but each platform has its own accessibility API. These toolkits are also written in many different programming languages, so the shared infrastructure must be usable across languages.

Project plan

AccessKit is currently in the design phase. The plan is to break the project down into the following components:

Data schema

It has often been said that data structures are more important than code. This is certainly the case with AccessKit. The heart of AccessKit is a schema that defines all of the data required to make a UI accessible to screen readers and other assistive technologies. This schema represents a tree structure, in which each node is either a UI element such as a button or text box, or a grouping of elements such as a document, pane, or window. Each node has an integer ID, a role (e.g. button or window), and a variety of optional attributes. The schema also defines actions that can be requested by assistive technologies, such as moving the keyboard focus, invoking a button, or selecting text. The schema is based largely on Chromium's cross-platform accessibility abstraction.

The canonical definition of the schema is in the Rust programming language. Rust was chosen for its combination of efficiency and an expressive type system. Representations of the schema in other programming languages and schema definition languages (such as JSON Schema or Protocol Buffers) can be generated from the Rust code.

When both the toolkit and the platform adapter (see below) are written in Rust or another language that can efficiently access Rust data structures (such as C++), the data defined in the schema can be passed back and forth with no serialization overhead. In other cases, serialization will be required to minimize the overhead of language interoperability. The plan is to use JSON serialization for now, and possibly add other serialization options later, for better performance or to please toolkit developers who would rather not use JSON.

A draft of the schema is defined in the schema directory.

Platform adapters

These are the libraries that implement platform accessibility APIs. The following platform adapters are planned:

  • Windows (UI Automation API), written in Rust
  • macOS, written in Rust
  • iOS/tvOS, written in Rust
  • Unix desktop environments (e.g. GNOME) based on AT-SPI, written in Rust
  • Android, written in Java or Kotlin
  • Web (creating a hidden HTML DOM), written in TypeScript, likely using a virtual DOM library such as Preact

The interaction between the toolkit and the platform adapter is also inspired by Chromium. Because Chromium has a multi-process architecture and does not allow synchronous IPC from the browser process to the sandboxed renderer processes, the browser process cannot pull accessibility information from the renderer on demand. Instead, the renderer process pushes data to the browser process. The renderer process initially pushes a complete accessibility tree, then it pushes incremental updates. The browser process only needs to send a request to the renderer process when an assistive technology requests one of the actions mentioned above. In AccessKit, the platform adapter will be like the Chromium browser process, and the UI toolkit will be like the Chromium renderer process, except that both components will run in the same process and will communicate through normal function calls rather than IPC.

One notable consequence of this design is that only the platform adapter needs to retain a complete accessibility tree in memory. That means that this design is suitable for immediate-mode GUI toolkits, as long as they can provide a stable ID for each UI element.

As mentioned above, many of the platform adapters will be written in Rust. We've chosen Rust for its combination of reliability and efficiency, including safe concurrency, which is especially important in modern software. However, this doesn't mean that UI toolkit developers who merely want to use AccessKit will need to work directly with Rust. In addition to a direct Rust API, the Rust-based platform adapters will also provide a C API, which can be used from a variety of languages. The AccessKit project will provide pre-built binaries, including both dynamic and static libraries, for these platform adapters using the C API, so toolkit developers won't need to deal with Rust at all.

Language support libraries

While many languages can use a C API, we also plan to provide libraries that make it easier to use AccessKit from languages other than Rust and C. In particular, we're planning to provide such a library for Java and other JVM-based languages.

Documentation

We realize that most developers who might use AccessKit are not experts in accessibility. So this project will need to include comprehensive documentation, including a conceptual overview for developers that are learning about accessibility for the first time.

Comments
  • feat: Basic Unix platform adapter

    feat: Basic Unix platform adapter

    Closes #56

    Remaining work:

    • Raise more events (children changed, bounds changed...),
    • Get rid of the strum crate and push more event related types to the atspi crate,
    • Implement keyboard event handling.
    opened by DataTriny 43
  • Node methods to retrieve siblings and unignored children

    Node methods to retrieve siblings and unignored children

    This took me longer than expected.

    I am not really proud of the UnignoredChildren iterator implementation, I don't find it elegant but I can't think of another way to do it right now.

    Questions

    • Should we implement UnignoredChildren::len()? I can't find a good value to return for UnignoredChildren::size_hint because you'll have to iterate to the end to get the correct size, so maybe the default is fine.
    • I'm not sure about the unignored_children_reverse test first assertion. The root node clearly has more unignored children, but given that one descendant got an unignored parent, it's a stopping condition. I couldn't find such test case inside Chromium's codebase.
    opened by DataTriny 23
  • chore: release main

    chore: release main

    :robot: I have created a release *beep* *boop*

    accesskit_macos: 0.1.2

    Bug Fixes

    • platforms/macos: Add the macOS crate to the release-please configuration (#164) (da83f63)
    accesskit_winit: 0.6.2
    cargo workspace: lockfile maintenance

    This PR was generated with Release Please. See documentation.

    autorelease: tagged 
    opened by github-actions[bot] 10
  • chore: release main

    chore: release main

    :robot: I have created a release *beep* *boop*

    accesskit_consumer: 0.9.1

    Bug Fixes

    • consumer: Allow editable spin buttons (#167) (65a7aa0)
    • Gracefully handle nodes that only support text ranges some of the time (#169) (1f50df6)
    accesskit_windows: 0.9.3

    Bug Fixes

    • Gracefully handle nodes that only support text ranges some of the time (#169) (1f50df6)
    • platforms/windows: Change default minimum and maximum for range value pattern (#166) (176ec58)

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit_consumer bumped from 0.9.0 to 0.9.1
    accesskit_macos: 0.1.3

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit_consumer bumped from 0.9.0 to 0.9.1
    accesskit_winit: 0.6.3
    cargo workspace: lockfile maintenance

    This PR was generated with Release Please. See documentation.

    autorelease: tagged 
    opened by github-actions[bot] 8
  • feat(platforms/macos): Basic macOS platform adapter

    feat(platforms/macos): Basic macOS platform adapter

    The really ugly part of this is the dynamic subclassing (in platforms/macos/src/subclass.rs). But since winit doesn't currently provide a direct way to use a subclass of WinitView, and I have to implement some accessibility methods on the view (starting with accessibilityChildren, but there will be others), I have to do this. And I've got other projects in the works that will require this hack, retrofitting accessibility onto Unity and a GLFW-based GUI. I'm already doing something similar on Windows, though Win32 subclassing is better documented and (I think) more widely used. I'm open to a cleaner solution in winit, but in order to show results immediately, I'm going with this hack for now.

    opened by mwcampbell 8
  • feat!: Text range support

    feat!: Text range support

    This allows screen readers and other ATs to provide the expected feedback when editing text on Windows.

    The easiest way to try it out with a working application is to try one of the examples in the corresponding egui branch.

    The primary missing feature is support for rich text, including text formatting information.

    This ought to have tests, but I figured I'd get the implementation into code review.

    opened by mwcampbell 8
  • UIA provider isn't reliably detected on startup of example program

    UIA provider isn't reliably detected on startup of example program

    Steps to reproduce:

    1. Check out and build this commit of AccessKit.
    2. On x64 Windows 10 build 19043.1237 (21H1), run NVDA 2021.2.
    3. Run the hello_world example program under platforms/windows/examples.

    Expected result: NVDA should say "Hello world window". This indicates that the UIA provider is properly exposed and NVDA is recognizing the window as a UIA window.

    Observed: NVDA says "Hello world". This is what it says for a window for which it can't detect a UIA provider. However, if you reverse the order of the steps (start the program and then start NVDA), it says "Hello world window", indicating that it detected the UIA provider.

    My analysis: I know that NVDA is behaving as it is because when it calls UiaHasServerSideProvider on the newly created window, that function is returning false. But I don't know why UiaHasServerSideProvider is returning false for that window. The window procedure handles WM_GETOBJECT by creating the UIA provider and passing that along with the WPARAM and LPARAM to UiaReturnRawElementProvider. It doesn't do anything else with the WPARAM and LPARAM, since I want to let UIA Core handle both UIA and MSAA requests. So I guess there's some kind of race condition where, immediately after the window is created, UIA Core running in NVDA can't connect to UIA Core running in the example program. FWIW, NVDA is 32-bit x86 while the example program is x64.

    I have a workaround. If I call CoInitializeEx with COINIT_MULTITHREADED at the start of the program, then this unexpected behavior doesn't happen. But if I either omit a call to CoInitializeEx or call it with COINIT_APARTMENTTHREADED, then I get this problem. So for now, I can just use COINIT_MULTITHREADED, but since AccessKit is a library aiming for wide adoption, I want it to work in any of these cases if possible. Also, it doesn't seem to matter whether I use ProviderOptions_UseComThreading or not, though I'd prefer not to.

    I've reported this to one of my former colleagues at Microsoft and his manager, since this looks like it might be a bug in UIA Core.

    opened by mwcampbell 8
  • fix: Provide fallback property implementations for the window root

    fix: Provide fallback property implementations for the window root

    UIA itself normally does this automatically. But for an AT that uses the UIA Remote Operations API introduced in Windows 11, such as the Windows 11 version of Narrator, this fallback isn't available for providers that don't use COM threading, such as ours. As a result, Windows 11 Narrator was unable to find the window context for the current focus if something other than the window is immediately focused. We don't want to switch to COM threading, since the ability to run UIA methods independently of the UI thread is a key benefit of the AccessKit architecture. We also don't want to require integrators to provide the window title as the name of the root node if we can avoid it. So, this PR implements our own fallback. It also modifies the Windows example and test code to clarify that the window title doesn't need to be explicitly provided in the AccessKit tree.

    opened by mwcampbell 7
  • chore: release main

    chore: release main

    :robot: I have created a release *beep* *boop*

    accesskit_macos: 0.1.4

    Bug Fixes

    accesskit_winit: 0.6.5
    cargo workspace: lockfile maintenance

    This PR was generated with Release Please. See documentation.

    autorelease: tagged 
    opened by github-actions[bot] 6
  • chore: release main

    chore: release main

    :robot: I have created a release *beep* *boop*

    accesskit_consumer: 0.9.0

    Features

    • platforms/macos: Basic macOS platform adapter (#158) (a06725e)
    accesskit_windows: 0.9.1

    Bug Fixes

    • platforms/windows: Re-export the windows-rs HWND type (#159) (389187a)

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit_consumer bumped from 0.8.0 to 0.9.0
    accesskit_winit: 0.6.0

    Features

    • platforms/macos: Basic macOS platform adapter (#158) (a06725e)

    Bug Fixes

    • platforms/macos: Fix macOS crate version number (#161) (e0a6a40)
    • platforms/windows: Re-export the windows-rs HWND type (#159) (389187a)
    accesskit_macos: 0.1.1

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit_consumer bumped from 0.8.0 to 0.9.0
    cargo workspace: lockfile maintenance

    This PR was generated with Release Please. See documentation.

    autorelease: tagged 
    opened by github-actions[bot] 6
  • chore: release main

    chore: release main

    :robot: I have created a release beep boop

    accesskit_consumer: 0.12.1

    0.12.1 (2023-01-06)

    Bug Fixes

    • Make Node::filtered_parent recursive as it was meant to be (#203) (d2faef5)
    accesskit_macos: 0.4.2

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit_consumer bumped from 0.12.0 to 0.12.1
    accesskit_unix: 0.1.1

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit_consumer bumped from 0.12.0 to 0.12.1
    accesskit_windows: 0.10.4

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit_consumer bumped from 0.12.0 to 0.12.1
    accesskit_winit: 0.8.1

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit_windows bumped from 0.10.3 to 0.10.4
        • accesskit_macos bumped from 0.4.1 to 0.4.2
        • accesskit_unix bumped from 0.1.0 to 0.1.1

    This PR was generated with Release Please. See documentation.

    autorelease: tagged 
    opened by github-actions[bot] 5
  • refactor!: Make `Node` opaque and optimize it for size

    refactor!: Make `Node` opaque and optimize it for size

    This is a massive breaking change for all users. But I'm afraid it's unavoidable.

    This is still a work in progress. The technique is proven to work, but I still need to do the following:

    • Use macros to eliminate as much getter/setter boilerplate as possible
    • Get serialization, deserialization, and JSON schema support working again
    • Use packed bit flags instead of individual bool fields
    opened by mwcampbell 0
  • fix: Update to objc2 0.3.0-beta.4; use new icrate bindings

    fix: Update to objc2 0.3.0-beta.4; use new icrate bindings

    fixes #199

    Switching from our own AppKit bindings to the new ones in icrate isn't strictly necessary to fix the bug, but I figured it was a good idea anyway.

    @madsmtm Please review.

    opened by mwcampbell 0
  • How can at-spi2-core notify accesskit about XML changes?

    How can at-spi2-core notify accesskit about XML changes?

    I'm in the process of doing several things more or less at the same time:

    The result is that the dbus XML files in at-spi2-core are changing to reflect what the C code actually does. Bindings that use the XML as a basis will of course want to be notified of this.

    So, this issue is me asking you for how to best communicate this.

    I can file a bug report here every time I make a change, but this doesn't help other projects (e.g. GTK4, WebKit) that also use DBus directly instead of atk.

    (Concretely, my latest fix is in this commit - not merged yet, hopefully in a merge request soon.)

    opened by federicomenaquintero 4
  • Rework the `patterns!` macro to re-de-duplicate logic

    Rework the `patterns!` macro to re-de-duplicate logic

    The patterns! macro previously both generated the ResolvedPlatformNode::pattern_provider and ResolvedPlatformNode::enqueue_pattern_property_changes methods, and also generated some of the boilerplate methods for the #[implement(_)] derivations from the windows crate.

    In windows 0.32 the implement macro was reworked to use traits (https://github.com/microsoft/windows-rs/pull/1450). As a result, we can't just derive the methods for all patterns in the existing patterms! macro invocation, because:

    • The per-trait methods need to go into separate impl IFooBarProvider_Impl for FooBarProvider trait impls.
    • The patterns are a subset of the trait methods that need to be implemented.

    In #102 I took the simple approach of duplication: we now manually implement the boilerplate methods in addition to specifying their details inside the patterns! macro. It would be nice to figure out how to rework the patterns! macro to re-introduce the previous de-duplication.

    opened by str4d 1
  • Support custom localized control types in UIA

    Support custom localized control types in UIA

    UIA doesn't have direct control type equivalents for all AccessKit roles. For that matter, AccessKit doesn't have roles for all control types I've seen, e.g. in the Druid widget gallery. But UIA does have a LocalizedControlType property that we can use to provide custom control types as strings. One question is whether AccessKit should provide its own localized control types, or delegate that to the application. Different applications and higher-level frameworks will have their own approaches to localization, and that might not be something that we want to take on ourselves.

    opened by mwcampbell 0
  • Allow value to be taken from labels

    Allow value to be taken from labels

    For some control types, such as a slider, it can be useful to compute the node's value field from one or more labels, as we can already do with name. ARIA doesn't seem to have a property that we can emulate here, like with labelled_by, but I think we should still have this.

    opened by mwcampbell 0
Releases(accesskit_winit-v0.8.1)
  • accesskit_winit-v0.8.1(Jan 6, 2023)

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit_windows bumped from 0.10.3 to 0.10.4
        • accesskit_macos bumped from 0.4.1 to 0.4.2
        • accesskit_unix bumped from 0.1.0 to 0.1.1
    Source code(tar.gz)
    Source code(zip)
  • accesskit_windows-v0.10.4(Jan 6, 2023)

  • accesskit_unix-v0.1.1(Jan 6, 2023)

  • accesskit_macos-v0.4.2(Jan 6, 2023)

  • accesskit_consumer-v0.12.1(Jan 6, 2023)

  • accesskit_winit-v0.8.0(Jan 5, 2023)

    0.8.0 (2023-01-05)

    Features

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit_windows bumped from 0.10.2 to 0.10.3
        • accesskit_macos bumped from 0.4.0 to 0.4.1
    Source code(tar.gz)
    Source code(zip)
  • accesskit_windows-v0.10.3(Jan 5, 2023)

  • accesskit_unix-v0.1.0(Jan 5, 2023)

    0.1.0 (2023-01-05)

    Features

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit_consumer bumped from 0.11.0 to 0.12.0
    Source code(tar.gz)
    Source code(zip)
  • accesskit_macos-v0.4.1(Jan 5, 2023)

  • accesskit_consumer-v0.12.0(Jan 5, 2023)

  • accesskit_winit-v0.7.3(Dec 27, 2022)

  • accesskit_macos-v0.4.0(Dec 27, 2022)

  • accesskit_winit-v0.7.2(Dec 17, 2022)

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit_windows bumped from 0.10.1 to 0.10.2
        • accesskit_macos bumped from 0.2.1 to 0.3.0
    Source code(tar.gz)
    Source code(zip)
  • accesskit_windows-v0.10.2(Dec 17, 2022)

    0.10.2 (2022-12-17)

    Bug Fixes

    • Correct broken UIA method implementation that was incompatible with Windows 11 ATs (#193) (3c527c7)
    • More reliable handling of the edge case for wrapped lines (#192) (c626d2c)
    • Provide fallback property implementations for the window root (#194) (f3d30b9)

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit_consumer bumped from 0.10.0 to 0.11.0
    Source code(tar.gz)
    Source code(zip)
  • accesskit_macos-v0.3.0(Dec 17, 2022)

    0.3.0 (2022-12-17)

    Features

    Bug Fixes

    • Don't expose the window title in our root element on macOS (#187) (9739b74)
    • Expose which accessibility selectors are actually allowed for a particular node (#181) (c4cbb23)
    • More reliable handling of the edge case for wrapped lines (#192) (c626d2c)

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit_consumer bumped from 0.10.0 to 0.11.0
    Source code(tar.gz)
    Source code(zip)
  • accesskit_consumer-v0.11.0(Dec 17, 2022)

  • accesskit_winit-v0.7.1(Dec 4, 2022)

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit bumped from 0.8.0 to 0.8.1
        • accesskit_windows bumped from 0.10.0 to 0.10.1
        • accesskit_macos bumped from 0.2.0 to 0.2.1
    Source code(tar.gz)
    Source code(zip)
  • accesskit_windows-v0.10.1(Dec 4, 2022)

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit bumped from 0.8.0 to 0.8.1
        • accesskit_consumer bumped from 0.9.1 to 0.10.0
    Source code(tar.gz)
    Source code(zip)
  • accesskit_macos-v0.2.1(Dec 4, 2022)

    0.2.1 (2022-12-04)

    Bug Fixes

    • Correctly apply the DPI scale factor to coordinates (#185) (d263938)
    • Expose static text as the value rather than the title on macOS (#186) (e3720c8)

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit bumped from 0.8.0 to 0.8.1
        • accesskit_consumer bumped from 0.9.1 to 0.10.0
    Source code(tar.gz)
    Source code(zip)
  • accesskit_consumer-v0.10.0(Dec 4, 2022)

  • accesskit-v0.8.1(Dec 4, 2022)

  • accesskit_winit-v0.7.0(Nov 29, 2022)

    0.7.0 (2022-11-29)

    ⚠ BREAKING CHANGES

    • Move lazy initialization from the core platform adapter to the caller (#179)

    Code Refactoring

    • Move lazy initialization from the core platform adapter to the caller (#179) (f35c941)

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit_windows bumped from 0.9.3 to 0.10.0
        • accesskit_macos bumped from 0.1.5 to 0.2.0
    Source code(tar.gz)
    Source code(zip)
  • accesskit_windows-v0.10.0(Nov 29, 2022)

  • accesskit_macos-v0.2.0(Nov 29, 2022)

  • accesskit_winit-v0.6.6(Nov 27, 2022)

  • accesskit_macos-v0.1.5(Nov 27, 2022)

  • accesskit_winit-v0.6.5(Nov 25, 2022)

  • accesskit_winit-v0.6.4(Nov 25, 2022)

  • accesskit_winit-v0.6.3(Nov 25, 2022)

  • accesskit_windows-v0.9.3(Nov 25, 2022)

    Bug Fixes

    • Gracefully handle nodes that only support text ranges some of the time (#169) (1f50df6)
    • platforms/windows: Change default minimum and maximum for range value pattern (#166) (176ec58)

    Dependencies

    • The following workspace dependencies were updated
      • dependencies
        • accesskit_consumer bumped from 0.9.0 to 0.9.1
    Source code(tar.gz)
    Source code(zip)
Owner
null
SixtyFPS is a toolkit to efficiently develop fluid graphical user interfaces for any display: embedded devices and desktop applications. We support multiple programming languages, such as Rust, C++ or JavaScript.

SixtyFPS is a toolkit to efficiently develop fluid graphical user interfaces for any display: embedded devices and desktop applications. We support multiple programming languages, such as Rust, C++ or JavaScript.

SixtyFPS 5.5k Jan 1, 2023
An easy to use command line project manager for projects using the ReCT programming language

☢️ A powerful project manager for the ReCT programming language! ☢️ ReCTx makes your projects easier to manage by allowing you to configure everything

Remy 1 Nov 28, 2022
Deno is a simple, modern and secure runtime for JavaScript and TypeScript that uses V8 and is built in Rust.

Deno Deno is a simple, modern and secure runtime for JavaScript and TypeScript that uses V8 and is built in Rust. Features Secure by default. No file,

Derek Jones 2 Aug 13, 2022
Rust bindings to Core Foundation and other low level libraries on Mac OS X and iOS

core-foundation-rs Compatibility Targets macOS 10.7 by default. To enable features added in macOS 10.8, set Cargo feature mac_os_10_8_features. To hav

Servo 685 Jan 2, 2023
Rust bindings and wrappers for GLib, GDK 3, GTK+ 3 and Cairo.

THIS REPOSITORY IS DEPRECATED SEE: https://github.com/rust-gnome rgtk Rust bindings and wrappers for GLib, GDK 3, GTK+ 3 and Cairo. Building rgtk expe

Jeremy Letang 124 Jul 10, 2022
A simple, clean, and beautiful WYSIWYG Markdown editor and content-management system

ScribeDown Current version: v0.0.1 Feature level: See the roadmap Beautiful, Clean, Writer-Oriented The goal of ScribeDown is to make Markdown the bes

Alex Dumas 4 Dec 20, 2022
A collection of components and widgets that are built for bevy_ui and the ECS pattern

Widgets for Bevy UI A collection of components and widgets that are built for bevy_ui and the ECS pattern. Current State This was started recently and

Gabriel Bourgeois 3 Sep 2, 2022
Unofficial Linux QQ client, based on GTK4 and libadwaita, developed with Rust and Relm4.

GTK QQ (WIP) Unofficial Linux QQ client, based on GTK4 and libadwaita, developed with Rust and Relm4. Screenshots Light Dark Note The two screenshots

Lomírus 198 Dec 24, 2022
A powerful color picker and formatter, built with GTK and Rust

Eyedropper A powerful color picker and formatter. More screenshots Features Pick a Color Enter a color in Hex-Format Parse RGBA/ARGB Hex-Colors View c

Jonathan 108 Dec 24, 2022
Build beautiful desktop apps with flutter and rust. 🌠 (wip)

flutter-rs Build flutter desktop app in dart & rust. Get Started Install requirements Rust flutter sdk Develop install the cargo flutter command cargo

null 2k Dec 26, 2022
Simple and portable (but not inflexible) GUI library in C that uses the native GUI technologies of each platform it supports.

libui: a portable GUI library for C This README is being written. Status It has come to my attention that I have not been particularly clear about how

Pietro Gagliardi 10.4k Dec 31, 2022
Integrate Qml and Rust by building the QMetaObject at compile time.

QMetaObject crate for Rust The qmetaobject crate is a crate which is used to expose rust object to Qt and QML. Objectives Rust procedural macro (custo

Woboq GmbH 495 Jan 3, 2023
OS-native file dialogs on Linux, OS X and Windows

nfd-rs nfd-rs is a Rust binding to the library nativefiledialog, that provides a convenient cross-platform interface to opening file dialogs on Linux,

Saurav Sachidanand 152 Nov 9, 2022
Build smaller, faster, and more secure desktop applications with a web frontend.

TAURI Tauri Apps footprint: minuscule performance: ludicrous flexibility: gymnastic security: hardened Current Releases Component Descrip

Tauri 56.3k Jan 3, 2023
File system enumerator and monitor for Android.

File system enumerator and file monitor for Android. Built to be compatible with other command line utilties! This tool was created to somewhat automa

Kyle Benac 15 Aug 23, 2022
A tiny, neat C library that portably invokes native file open and save dialogs.

Native File Dialog A tiny, neat C library that portably invokes native file open, folder select and save dialogs. Write dialog code once and have it p

Michael Labbe 1.5k Dec 28, 2022
Real-time UI for bots, microservices, and IoT

Real-time UI for bots, microservices, and IoT

RillRate 399 Jan 7, 2023
A cross-platform GUI library for Rust focused on simplicity and type-safety

A cross-platform GUI library for Rust, inspired by Elm

Héctor Ramón 17.5k Jan 8, 2023
ZeroTier Desktop Tray Application and UI

ZeroTier Desktop Tray Application and User Interface This is (as of ZeroTier 1.8) the system tray application and user interface for controlling a loc

ZeroTier, Inc. 102 Dec 20, 2022