Vendor dependencies for 0.3.0 release

This commit is contained in:
2025-09-27 10:29:08 -05:00
parent 0c8d39d483
commit 82ab7f317b
26803 changed files with 16134934 additions and 0 deletions

View File

@@ -0,0 +1 @@
{"files":{"CHANGELOG.md":"9cdb91dc9517c9cfc4a61a8e95857f5b13f5604e6ad1f59d3e21e0a578333d46","Cargo.lock":"497e60103053946c4a7558f55c1dd904d1cceb94782271c82b754ec797c7c7fe","Cargo.toml":"98a79e9b88dd3c86bcfc80b930e95b1b40f3eedd05287273f94693af2fa3ceb1","README.md":"ac9a875391361e0cc0a0cae754cf5cc451d24f1c7f7b70c8f16c7601ec53bfd4","src/adapter.rs":"93556c38fe26af394d67edeb2788c9a31c995d3a8836579ac8c15248da0df41b","src/context.rs":"683964180cc0d009206bf9a2fd9a44d2f4b050f95079d6fb67f4b8fe08b87e44","src/event.rs":"0dca09cbdeaa4b3f86d5fbc6e7c079d9679228bde919ac33432c8eb40a8ee9a7","src/filters.rs":"cfe74d16da43ccfda209f11107faf78442c6830fa126cf2d48ffdcdf14c65288","src/lib.rs":"b1df68dc7181efe2f833df5367493a3d2cc06dc2993202f612c4bf18285f7972","src/node.rs":"a9baf1e5fc90a81249d00f604d565c20110e88e35492a48cd4857776e34e2b4d","src/patch.rs":"d523ebaa0105ddb2adf342838b3128263480747e1b6d55f4d62a65b4db173990","src/subclass.rs":"967a9e8aecf0045572d92c90c7ac293dfc351af49bc79fe56d6d2546ed799a21","src/util.rs":"19a695214d29f873d3dc06ed9a4e3b972531aa7d659d18fd405d3e2526f9fef3"},"package":"09e230718177753b4e4ad9e1d9f6cfc2f4921212d4c1c480b253f526babb258d"}

541
vendor/accesskit_macos/CHANGELOG.md vendored Normal file
View File

@@ -0,0 +1,541 @@
# Changelog
* The following workspace dependencies were updated
* dependencies
* accesskit_consumer bumped from 0.11.0 to 0.12.0
* The following workspace dependencies were updated
* dependencies
* accesskit_consumer bumped from 0.12.0 to 0.12.1
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.10.0 to 0.10.1
* accesskit_consumer bumped from 0.14.0 to 0.14.1
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.12.0 to 0.12.1
* accesskit_consumer bumped from 0.16.0 to 0.16.1
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.12.2 to 0.12.3
* accesskit_consumer bumped from 0.17.0 to 0.17.1
* The following workspace dependencies were updated
* dependencies
* accesskit_consumer bumped from 0.19.0 to 0.19.1
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.16.0 to 0.16.1
* accesskit_consumer bumped from 0.24.0 to 0.24.1
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.16.2 to 0.16.3
* accesskit_consumer bumped from 0.24.2 to 0.24.3
## [0.19.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.18.1...accesskit_macos-v0.19.0) (2025-03-06)
### ⚠ BREAKING CHANGES
* Optimize simple string getters ([#493](https://github.com/AccessKit/accesskit/issues/493))
* Drop `Tree::app_name` ([#492](https://github.com/AccessKit/accesskit/issues/492))
### Features
* Expose the `is_required` property ([#497](https://github.com/AccessKit/accesskit/issues/497)) ([46ed99b](https://github.com/AccessKit/accesskit/commit/46ed99bb958ddb32cbf1bee2fcfb7b328bcbe0ab))
### Bug Fixes
* Add list box support to the platform adapters ([6c622cf](https://github.com/AccessKit/accesskit/commit/6c622cff4c0c989d9a5f16b775adff9cdacf534c))
* Derive `Debug` for adapters ([#513](https://github.com/AccessKit/accesskit/issues/513)) ([753d904](https://github.com/AccessKit/accesskit/commit/753d90473cf57682568c7a17c82474c8e5d00b25))
* Remove unnecessary explicit lifetimes ([#488](https://github.com/AccessKit/accesskit/issues/488)) ([d2bcd6d](https://github.com/AccessKit/accesskit/commit/d2bcd6d3048d23df4e132bee6171eb247b2dc2c8))
### Code Refactoring
* Drop `Tree::app_name` ([#492](https://github.com/AccessKit/accesskit/issues/492)) ([089794c](https://github.com/AccessKit/accesskit/commit/089794c8f74957e91a19ae3df508e2a892f39ebc))
* Optimize simple string getters ([#493](https://github.com/AccessKit/accesskit/issues/493)) ([484fd7c](https://github.com/AccessKit/accesskit/commit/484fd7cbfb778222369d3f57d31dd998f6fa80d8))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.17.1 to 0.18.0
* accesskit_consumer bumped from 0.26.0 to 0.27.0
## [0.18.1](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.18.0...accesskit_macos-v0.18.1) (2024-11-23)
### Bug Fixes
* Add sub roles to MacOS adapter ([#480](https://github.com/AccessKit/accesskit/issues/480)) ([40ad828](https://github.com/AccessKit/accesskit/commit/40ad828a8f95c94f3079310d95c94ab7b16e0887))
* Optimize use of hash tables in platform adapters ([#485](https://github.com/AccessKit/accesskit/issues/485)) ([f4f0bfb](https://github.com/AccessKit/accesskit/commit/f4f0bfbf21b8e22e80ab07deb432f9e7e16469ab))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.17.0 to 0.17.1
* accesskit_consumer bumped from 0.25.0 to 0.26.0
## [0.18.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.17.4...accesskit_macos-v0.18.0) (2024-10-31)
### ⚠ BREAKING CHANGES
* Rename `name` to `label` and use `value` for label content ([#475](https://github.com/AccessKit/accesskit/issues/475))
* Rename `NodeBuilder` to `Node` and the old `Node` to `FrozenNode` ([#476](https://github.com/AccessKit/accesskit/issues/476))
* Rename `Role::InlineTextBox` to `TextRun` ([#473](https://github.com/AccessKit/accesskit/issues/473))
* Drop `DefaultActionVerb` ([#472](https://github.com/AccessKit/accesskit/issues/472))
* Make the core crate no-std ([#468](https://github.com/AccessKit/accesskit/issues/468))
### Features
* Make the core crate no-std ([#468](https://github.com/AccessKit/accesskit/issues/468)) ([2fa0d3f](https://github.com/AccessKit/accesskit/commit/2fa0d3f5b2b7ac11ef1751c133706f29e548bd6d))
### Bug Fixes
* Implement the `isAccessibilityEnabled` property on MacOS ([#474](https://github.com/AccessKit/accesskit/issues/474)) ([61e4817](https://github.com/AccessKit/accesskit/commit/61e48174ed1dd57b7dd919ecaef908f157357ec0))
### Code Refactoring
* Drop `DefaultActionVerb` ([#472](https://github.com/AccessKit/accesskit/issues/472)) ([ef3b003](https://github.com/AccessKit/accesskit/commit/ef3b0038224459094f650368412650bc3b69526b))
* Rename `name` to `label` and use `value` for label content ([#475](https://github.com/AccessKit/accesskit/issues/475)) ([e0053a5](https://github.com/AccessKit/accesskit/commit/e0053a5399929e8e0d4f07aa18de604ed8766ace))
* Rename `NodeBuilder` to `Node` and the old `Node` to `FrozenNode` ([#476](https://github.com/AccessKit/accesskit/issues/476)) ([7d8910e](https://github.com/AccessKit/accesskit/commit/7d8910e35f7bc0543724cc124941a3bd0304bcc0))
* Rename `Role::InlineTextBox` to `TextRun` ([#473](https://github.com/AccessKit/accesskit/issues/473)) ([29fa341](https://github.com/AccessKit/accesskit/commit/29fa34125a811bd3a0f9da579a9f35c9da90bf29))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.16.3 to 0.17.0
* accesskit_consumer bumped from 0.24.3 to 0.25.0
## [0.17.4](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.17.3...accesskit_macos-v0.17.4) (2024-10-21)
### Bug Fixes
* Add properties needed by the Xcode Accessibility Inspector ([#466](https://github.com/AccessKit/accesskit/issues/466)) ([295b188](https://github.com/AccessKit/accesskit/commit/295b1881936dd097d82a10317ff14d1369f7e4bd))
## [0.17.2](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.17.1...accesskit_macos-v0.17.2) (2024-10-07)
### Bug Fixes
* Update minimum supported Rust version to 1.75 ([#457](https://github.com/AccessKit/accesskit/issues/457)) ([fc622fe](https://github.com/AccessKit/accesskit/commit/fc622fe7657c80a4eedad6f6cded11d2538b54d5))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.16.1 to 0.16.2
* accesskit_consumer bumped from 0.24.1 to 0.24.2
## [0.17.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.16.0...accesskit_macos-v0.17.0) (2024-06-29)
### ⚠ BREAKING CHANGES
* Rename the `StaticText` role to `Label` ([#434](https://github.com/AccessKit/accesskit/issues/434))
### Code Refactoring
* Rename the `StaticText` role to `Label` ([#434](https://github.com/AccessKit/accesskit/issues/434)) ([7086bc0](https://github.com/AccessKit/accesskit/commit/7086bc0fad446d3ed4a0fd5eff641a1e75f6c599))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.15.0 to 0.16.0
* accesskit_consumer bumped from 0.23.0 to 0.24.0
## [0.16.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.15.0...accesskit_macos-v0.16.0) (2024-06-09)
### Features
* Add `author_id` property ([#424](https://github.com/AccessKit/accesskit/issues/424)) ([0d1c56f](https://github.com/AccessKit/accesskit/commit/0d1c56f0bdde58715e1c69f6015df600cb7cb8c1))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.14.0 to 0.15.0
* accesskit_consumer bumped from 0.22.0 to 0.23.0
## [0.15.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.14.0...accesskit_macos-v0.15.0) (2024-05-27)
### Features
* Expose the `orientation` property ([#421](https://github.com/AccessKit/accesskit/issues/421)) ([590aada](https://github.com/AccessKit/accesskit/commit/590aada070dc812f9b8f171fb9e43ac984fad2a1))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit_consumer bumped from 0.21.0 to 0.22.0
## [0.14.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.13.2...accesskit_macos-v0.14.0) (2024-05-26)
### Features
* Expose the `placeholder` property ([#417](https://github.com/AccessKit/accesskit/issues/417)) ([8f4a0a1](https://github.com/AccessKit/accesskit/commit/8f4a0a1c10f83fcc8580a37d8013fec2d110865b))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit_consumer bumped from 0.20.0 to 0.21.0
## [0.13.2](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.13.1...accesskit_macos-v0.13.2) (2024-05-13)
### Bug Fixes
* Fix platform adapters to support copy-on-write tree snapshots again ([#411](https://github.com/AccessKit/accesskit/issues/411)) ([d3a130a](https://github.com/AccessKit/accesskit/commit/d3a130a5ec8ae1d9edf0bf85a44f35f0e365242c))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit_consumer bumped from 0.19.1 to 0.20.0
## [0.13.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.12.0...accesskit_macos-v0.13.0) (2024-04-30)
### ⚠ BREAKING CHANGES
* Clean up table roles and properties ([#393](https://github.com/AccessKit/accesskit/issues/393))
* Drop `NodeClassSet` ([#389](https://github.com/AccessKit/accesskit/issues/389))
* Rename `Checked` to `Toggled`; drop `ToggleButton` role ([#388](https://github.com/AccessKit/accesskit/issues/388))
### Features
* Implement the `description` property ([#382](https://github.com/AccessKit/accesskit/issues/382)) ([d49f406](https://github.com/AccessKit/accesskit/commit/d49f40660b5dc23ed074cd72a91e511b130756ae))
### Bug Fixes
* Increase minimum supported Rust version to `1.70` ([#396](https://github.com/AccessKit/accesskit/issues/396)) ([a8398b8](https://github.com/AccessKit/accesskit/commit/a8398b847aa003de91042ac45e33126fc2cae053))
* Use new objc2 crates ([#384](https://github.com/AccessKit/accesskit/issues/384)) ([b3484c0](https://github.com/AccessKit/accesskit/commit/b3484c0fb1fef3ecd41ff9592978336c20b8b4f8))
### Code Refactoring
* Clean up table roles and properties ([#393](https://github.com/AccessKit/accesskit/issues/393)) ([e34dad9](https://github.com/AccessKit/accesskit/commit/e34dad94448a5321ece9def3f2e054aa5f62dd79))
* Drop `NodeClassSet` ([#389](https://github.com/AccessKit/accesskit/issues/389)) ([1b153ed](https://github.com/AccessKit/accesskit/commit/1b153ed51f8421cdba2dc98beca2e8f5f8c781bc))
* Rename `Checked` to `Toggled`; drop `ToggleButton` role ([#388](https://github.com/AccessKit/accesskit/issues/388)) ([6bc040b](https://github.com/AccessKit/accesskit/commit/6bc040b7cf75cdbd6a019cc380d8dbce804b3c81))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.13.0 to 0.14.0
* accesskit_consumer bumped from 0.18.0 to 0.19.0
## [0.12.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.11.1...accesskit_macos-v0.12.0) (2024-04-14)
### ⚠ BREAKING CHANGES
* New approach to lazy initialization ([#375](https://github.com/AccessKit/accesskit/issues/375))
### Bug Fixes
* Fix new compiler warning in Rust 1.77 ([#376](https://github.com/AccessKit/accesskit/issues/376)) ([1de7c63](https://github.com/AccessKit/accesskit/commit/1de7c63e7db12bc7eda57a191e913fef0e572f43))
### Code Refactoring
* New approach to lazy initialization ([#375](https://github.com/AccessKit/accesskit/issues/375)) ([9baebdc](https://github.com/AccessKit/accesskit/commit/9baebdceed7300389b6768815d7ae48f1ce401e4))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.12.3 to 0.13.0
* accesskit_consumer bumped from 0.17.1 to 0.18.0
## [0.11.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.10.1...accesskit_macos-v0.11.0) (2024-01-03)
### Features
* Support custom role descriptions ([#316](https://github.com/AccessKit/accesskit/issues/316)) ([c8d1a56](https://github.com/AccessKit/accesskit/commit/c8d1a5638fa6c33adfa059815c04f7e043c56026))
### Bug Fixes
* Bump objc2 to 0.5.0; bring icrate 0.1.0 ([#323](https://github.com/AccessKit/accesskit/issues/323)) ([23b3f2f](https://github.com/AccessKit/accesskit/commit/23b3f2f93b9452c80374d1da3e9abeaec60ba9bf))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.12.1 to 0.12.2
* accesskit_consumer bumped from 0.16.1 to 0.17.0
## [0.10.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.9.0...accesskit_macos-v0.10.0) (2023-09-27)
### ⚠ BREAKING CHANGES
* Make `ActionHandler::do_action` take `&mut self` ([#296](https://github.com/AccessKit/accesskit/issues/296))
* Clean up roles and properties ([#289](https://github.com/AccessKit/accesskit/issues/289))
* Decouple in-tree focus from host window/view focus ([#278](https://github.com/AccessKit/accesskit/issues/278))
* Switch to simple unsigned 64-bit integer for node IDs ([#276](https://github.com/AccessKit/accesskit/issues/276))
### Features
* Add role for terminals ([#282](https://github.com/AccessKit/accesskit/issues/282)) ([ddbef37](https://github.com/AccessKit/accesskit/commit/ddbef37158b57f56217317b480e40d58f83a9c24))
### Bug Fixes
* Support text fields without a value property ([#274](https://github.com/AccessKit/accesskit/issues/274)) ([5ae557b](https://github.com/AccessKit/accesskit/commit/5ae557b40d395b4a9966a90a2d80e7d97ad50bf9))
* Use common filters across platform adapters ([#287](https://github.com/AccessKit/accesskit/issues/287)) ([09c1204](https://github.com/AccessKit/accesskit/commit/09c12045ff4ccdb22f0cf643077a27465013572d))
### Code Refactoring
* Clean up roles and properties ([#289](https://github.com/AccessKit/accesskit/issues/289)) ([4fc9c55](https://github.com/AccessKit/accesskit/commit/4fc9c55c91812472593923d93ff89d75ff305ee4))
* Decouple in-tree focus from host window/view focus ([#278](https://github.com/AccessKit/accesskit/issues/278)) ([d360d20](https://github.com/AccessKit/accesskit/commit/d360d20cf951e7643b81a5303006c9f7daa5bd56))
* Make `ActionHandler::do_action` take `&mut self` ([#296](https://github.com/AccessKit/accesskit/issues/296)) ([4fc7846](https://github.com/AccessKit/accesskit/commit/4fc7846d732d61fb45c023060ebab96801a0053e))
* Switch to simple unsigned 64-bit integer for node IDs ([#276](https://github.com/AccessKit/accesskit/issues/276)) ([3eadd48](https://github.com/AccessKit/accesskit/commit/3eadd48ec47854faa94a94ebf910ec08f514642f))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.11.2 to 0.12.0
* accesskit_consumer bumped from 0.15.2 to 0.16.0
## [0.9.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.8.0...accesskit_macos-v0.9.0) (2023-08-08)
### Features
* Workaround for libraries that put the macOS keyboard focus on the window rather than the content view ([#266](https://github.com/AccessKit/accesskit/issues/266)) ([c2db1b0](https://github.com/AccessKit/accesskit/commit/c2db1b0424e905d87691f8148f28b77405f29926))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.11.1 to 0.11.2
* accesskit_consumer bumped from 0.15.1 to 0.15.2
## [0.8.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.7.1...accesskit_macos-v0.8.0) (2023-07-30)
### Features
* Add window-based constructor to macOS subclassing adapter ([#253](https://github.com/AccessKit/accesskit/issues/253)) ([022ef04](https://github.com/AccessKit/accesskit/commit/022ef045b9f28262b738ee1ca29a4c7303061fb3))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.11.0 to 0.11.1
* accesskit_consumer bumped from 0.15.0 to 0.15.1
## [0.7.1](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.7.0...accesskit_macos-v0.7.1) (2023-06-20)
### Bug Fixes
* Set proper target to build accesskit_macos documentation ([#226](https://github.com/AccessKit/accesskit/issues/226)) ([9cd6bb1](https://github.com/AccessKit/accesskit/commit/9cd6bb14d60bf85027b330a51afe912c37723902))
## [0.7.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.6.3...accesskit_macos-v0.7.0) (2023-03-30)
### ⚠ BREAKING CHANGES
* Force a semver-breaking version bump in downstream crates ([#234](https://github.com/AccessKit/accesskit/issues/234))
### Bug Fixes
* Force a semver-breaking version bump in downstream crates ([#234](https://github.com/AccessKit/accesskit/issues/234)) ([773389b](https://github.com/AccessKit/accesskit/commit/773389bff857fa18edf15de426e029251fc34591))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit_consumer bumped from 0.14.2 to 0.15.0
## [0.6.3](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.6.2...accesskit_macos-v0.6.3) (2023-03-29)
### Bug Fixes
* Fix problems related to the root node ([#231](https://github.com/AccessKit/accesskit/issues/231)) ([7228494](https://github.com/AccessKit/accesskit/commit/7228494361c4f131af6a7fc2af8a98406cd9a63e))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.10.1 to 0.11.0
* accesskit_consumer bumped from 0.14.1 to 0.14.2
## [0.6.2](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.6.1...accesskit_macos-v0.6.2) (2023-03-14)
### Bug Fixes
* Fix macOS leaks ([e8537fc](https://github.com/AccessKit/accesskit/commit/e8537fcbdf4a68f39c9bc51cf9fe6960903e26f2))
## [0.6.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.5.0...accesskit_macos-v0.6.0) (2023-02-12)
### ⚠ BREAKING CHANGES
* Move thread synchronization into platform adapters; drop parking_lot ([#212](https://github.com/AccessKit/accesskit/issues/212))
### Code Refactoring
* Move thread synchronization into platform adapters; drop parking_lot ([#212](https://github.com/AccessKit/accesskit/issues/212)) ([5df52e5](https://github.com/AccessKit/accesskit/commit/5df52e5545faddf6a51905409013c2f5be23981e))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.9.0 to 0.10.0
* accesskit_consumer bumped from 0.13.0 to 0.14.0
## [0.5.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.4.2...accesskit_macos-v0.5.0) (2023-02-05)
### ⚠ BREAKING CHANGES
* Make `Node` opaque and optimize it for size ([#205](https://github.com/AccessKit/accesskit/issues/205))
### Code Refactoring
* Make `Node` opaque and optimize it for size ([#205](https://github.com/AccessKit/accesskit/issues/205)) ([4811152](https://github.com/AccessKit/accesskit/commit/48111521439b76c1a8687418a4b20f9b705eac6d))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit bumped from 0.8.1 to 0.9.0
* accesskit_consumer bumped from 0.12.1 to 0.13.0
## [0.4.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.3.0...accesskit_macos-v0.4.0) (2022-12-27)
### Features
* Live regions on macOS ([#196](https://github.com/AccessKit/accesskit/issues/196)) ([47d8d9f](https://github.com/AccessKit/accesskit/commit/47d8d9f6a567dfe909aa4065886cace07084efb7))
### Bug Fixes
* Pin objc2 dependency to 0.3.0-beta.3 ([#201](https://github.com/AccessKit/accesskit/issues/201)) ([0adfed1](https://github.com/AccessKit/accesskit/commit/0adfed1192ee255fba34ad82e8483ab9296ac2df))
## [0.3.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.2.1...accesskit_macos-v0.3.0) (2022-12-17)
### Features
* Text support on macOS ([#191](https://github.com/AccessKit/accesskit/issues/191)) ([3a35dbe](https://github.com/AccessKit/accesskit/commit/3a35dbe02122c789fe682995c5b7e022aef5cc36))
### Bug Fixes
* Don't expose the window title in our root element on macOS ([#187](https://github.com/AccessKit/accesskit/issues/187)) ([9739b74](https://github.com/AccessKit/accesskit/commit/9739b7424328da45c1c43b6db49af142a8789aa5))
* Expose which accessibility selectors are actually allowed for a particular node ([#181](https://github.com/AccessKit/accesskit/issues/181)) ([c4cbb23](https://github.com/AccessKit/accesskit/commit/c4cbb23156749d513df4e520dcb9be0a74c697d3))
* More reliable handling of the edge case for wrapped lines ([#192](https://github.com/AccessKit/accesskit/issues/192)) ([c626d2c](https://github.com/AccessKit/accesskit/commit/c626d2c3028085b076ada7dd31242cf3ca3c0f08))
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit_consumer bumped from 0.10.0 to 0.11.0
## [0.2.1](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.2.0...accesskit_macos-v0.2.1) (2022-12-04)
### Bug Fixes
* Correctly apply the DPI scale factor to coordinates ([#185](https://github.com/AccessKit/accesskit/issues/185)) ([d263938](https://github.com/AccessKit/accesskit/commit/d263938d68bb63567853a340d3466ff27e076d87))
* Expose static text as the value rather than the title on macOS ([#186](https://github.com/AccessKit/accesskit/issues/186)) ([e3720c8](https://github.com/AccessKit/accesskit/commit/e3720c8e2d7c5e8c8601c52ad620dcfcacebc570))
### 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
## [0.2.0](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.1.5...accesskit_macos-v0.2.0) (2022-11-29)
### ⚠ BREAKING CHANGES
* Move lazy initialization from the core platform adapter to the caller ([#179](https://github.com/AccessKit/accesskit/issues/179))
### Code Refactoring
* Move lazy initialization from the core platform adapter to the caller ([#179](https://github.com/AccessKit/accesskit/issues/179)) ([f35c941](https://github.com/AccessKit/accesskit/commit/f35c941f395f3162db376a69cfaaaf770d376267))
## [0.1.5](https://github.com/AccessKit/accesskit/compare/accesskit_macos-v0.1.4...accesskit_macos-v0.1.5) (2022-11-27)
### Bug Fixes
* Handle views with flipped coordinates ([#174](https://github.com/AccessKit/accesskit/issues/174)) ([d14484c](https://github.com/AccessKit/accesskit/commit/d14484cdcfdd99a497354aa3e012a0e130cc3d64))
* Make VoiceOver move through nodes in logical order ([#176](https://github.com/AccessKit/accesskit/issues/176)) ([f060be4](https://github.com/AccessKit/accesskit/commit/f060be409945296ed100cd63ecb3d2bb6bbad89e))
### [0.1.4](https://www.github.com/AccessKit/accesskit/compare/accesskit_macos-v0.1.3...accesskit_macos-v0.1.4) (2022-11-25)
### Bug Fixes
* Re-export types from objc2 ([#172](https://www.github.com/AccessKit/accesskit/issues/172)) ([1ac67ad](https://www.github.com/AccessKit/accesskit/commit/1ac67ad17587d79b5338cb71e2bc07612fc10c44))
### [0.1.3](https://www.github.com/AccessKit/accesskit/compare/accesskit_macos-v0.1.2...accesskit_macos-v0.1.3) (2022-11-25)
### Dependencies
* The following workspace dependencies were updated
* dependencies
* accesskit_consumer bumped from 0.9.0 to 0.9.1
### [0.1.2](https://www.github.com/AccessKit/accesskit/compare/accesskit_macos-v0.1.1...accesskit_macos-v0.1.2) (2022-11-24)
### Bug Fixes
* **platforms/macos:** Add the macOS crate to the release-please configuration ([#164](https://www.github.com/AccessKit/accesskit/issues/164)) ([da83f63](https://www.github.com/AccessKit/accesskit/commit/da83f63d279a10c5a7199a9145ca9eb9e27d7b56))

182
vendor/accesskit_macos/Cargo.lock generated vendored Normal file
View File

@@ -0,0 +1,182 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "accesskit"
version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "becf0eb5215b6ecb0a739c31c21bd83c4f326524c9b46b7e882d77559b60a529"
[[package]]
name = "accesskit_consumer"
version = "0.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0bf66a7bf0b7ea4fd7742d50b64782a88f99217cf246b3f93b4162528dde520"
dependencies = [
"accesskit",
"hashbrown",
"immutable-chunkmap",
]
[[package]]
name = "accesskit_macos"
version = "0.19.0"
dependencies = [
"accesskit",
"accesskit_consumer",
"hashbrown",
"objc2",
"objc2-app-kit",
"objc2-foundation",
]
[[package]]
name = "arrayvec"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
[[package]]
name = "bitflags"
version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36"
[[package]]
name = "block2"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f"
dependencies = [
"objc2",
]
[[package]]
name = "foldhash"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2"
[[package]]
name = "hashbrown"
version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
dependencies = [
"foldhash",
]
[[package]]
name = "immutable-chunkmap"
version = "2.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12f97096f508d54f8f8ab8957862eee2ccd628847b6217af1a335e1c44dee578"
dependencies = [
"arrayvec",
]
[[package]]
name = "libc"
version = "0.2.169"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
[[package]]
name = "objc-sys"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310"
[[package]]
name = "objc2"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804"
dependencies = [
"objc-sys",
"objc2-encode",
]
[[package]]
name = "objc2-app-kit"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff"
dependencies = [
"bitflags",
"block2",
"libc",
"objc2",
"objc2-core-data",
"objc2-core-image",
"objc2-foundation",
"objc2-quartz-core",
]
[[package]]
name = "objc2-core-data"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef"
dependencies = [
"bitflags",
"block2",
"objc2",
"objc2-foundation",
]
[[package]]
name = "objc2-core-image"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80"
dependencies = [
"block2",
"objc2",
"objc2-foundation",
"objc2-metal",
]
[[package]]
name = "objc2-encode"
version = "4.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
[[package]]
name = "objc2-foundation"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8"
dependencies = [
"bitflags",
"block2",
"libc",
"objc2",
]
[[package]]
name = "objc2-metal"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6"
dependencies = [
"bitflags",
"block2",
"objc2",
"objc2-foundation",
]
[[package]]
name = "objc2-quartz-core"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a"
dependencies = [
"bitflags",
"block2",
"objc2",
"objc2-foundation",
"objc2-metal",
]

75
vendor/accesskit_macos/Cargo.toml vendored Normal file
View File

@@ -0,0 +1,75 @@
# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
#
# When uploading crates to the registry Cargo will automatically
# "normalize" Cargo.toml files for maximal compatibility
# with all versions of Cargo and also rewrite `path` dependencies
# to registry (e.g., crates.io) dependencies.
#
# If you are reading this file be aware that the original Cargo.toml
# will likely look very different (and much more reasonable).
# See Cargo.toml.orig for the original contents.
[package]
edition = "2021"
rust-version = "1.77.2"
name = "accesskit_macos"
version = "0.19.0"
authors = ["The AccessKit contributors"]
build = false
autolib = false
autobins = false
autoexamples = false
autotests = false
autobenches = false
description = "AccessKit UI accessibility infrastructure: macOS adapter"
readme = "README.md"
keywords = [
"gui",
"ui",
"accessibility",
]
categories = ["gui"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/AccessKit/accesskit"
[package.metadata.docs.rs]
default-target = "x86_64-apple-darwin"
[lib]
name = "accesskit_macos"
path = "src/lib.rs"
[dependencies.accesskit]
version = "0.18.0"
[dependencies.accesskit_consumer]
version = "0.27.0"
[dependencies.hashbrown]
version = "0.15"
features = ["default-hasher"]
default-features = false
[dependencies.objc2]
version = "0.5.1"
[dependencies.objc2-app-kit]
version = "0.2.0"
features = [
"NSAccessibility",
"NSAccessibilityConstants",
"NSAccessibilityElement",
"NSAccessibilityProtocols",
"NSResponder",
"NSView",
"NSWindow",
]
[dependencies.objc2-foundation]
version = "0.2.0"
features = [
"NSArray",
"NSDictionary",
"NSValue",
"NSThread",
]

7
vendor/accesskit_macos/README.md vendored Normal file
View File

@@ -0,0 +1,7 @@
# AccessKit macOS adapter
This is the macOS adapter for [AccessKit](https://accesskit.dev/). It exposes an AccessKit accessibility tree through the Cocoa `NSAccessibility` protocol.
## Known issues
- The selected state of ListBox items is not reported ([#520](https://github.com/AccessKit/accesskit/issues/520))

297
vendor/accesskit_macos/src/adapter.rs vendored Normal file
View File

@@ -0,0 +1,297 @@
// Copyright 2022 The AccessKit Authors. All rights reserved.
// Licensed under the Apache License, Version 2.0 (found in
// the LICENSE-APACHE file) or the MIT license (found in
// the LICENSE-MIT file), at your option.
use crate::{
context::{ActionHandlerNoMut, ActionHandlerWrapper, Context},
event::{focus_event, EventGenerator, QueuedEvents},
filters::filter,
node::can_be_focused,
util::*,
};
use accesskit::{
ActionHandler, ActionRequest, ActivationHandler, Node as NodeProvider, NodeId, Role,
Tree as TreeData, TreeUpdate,
};
use accesskit_consumer::{FilterResult, Tree};
use objc2::rc::{Id, WeakId};
use objc2_app_kit::NSView;
use objc2_foundation::{MainThreadMarker, NSArray, NSObject, NSPoint};
use std::fmt::{Debug, Formatter};
use std::{ffi::c_void, ptr::null_mut, rc::Rc};
const PLACEHOLDER_ROOT_ID: NodeId = NodeId(0);
enum State {
Inactive {
view: WeakId<NSView>,
is_view_focused: bool,
action_handler: Rc<dyn ActionHandlerNoMut>,
mtm: MainThreadMarker,
},
Placeholder {
placeholder_context: Rc<Context>,
is_view_focused: bool,
action_handler: Rc<dyn ActionHandlerNoMut>,
},
Active(Rc<Context>),
}
impl Debug for State {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
State::Inactive {
view,
is_view_focused,
action_handler: _,
mtm,
} => f
.debug_struct("Inactive")
.field("view", view)
.field("is_view_focused", is_view_focused)
.field("mtm", mtm)
.finish(),
State::Placeholder {
placeholder_context,
is_view_focused,
action_handler: _,
} => f
.debug_struct("Placeholder")
.field("placeholder_context", placeholder_context)
.field("is_view_focused", is_view_focused)
.finish(),
State::Active(context) => f.debug_struct("Active").field("context", context).finish(),
}
}
}
struct PlaceholderActionHandler;
impl ActionHandler for PlaceholderActionHandler {
fn do_action(&mut self, _request: ActionRequest) {}
}
#[derive(Debug)]
pub struct Adapter {
state: State,
}
impl Adapter {
/// Create a new macOS adapter. This function must be called on
/// the main thread.
///
/// The action handler will always be called on the main thread.
///
/// # Safety
///
/// `view` must be a valid, unreleased pointer to an `NSView`.
pub unsafe fn new(
view: *mut c_void,
is_view_focused: bool,
action_handler: impl 'static + ActionHandler,
) -> Self {
let view = unsafe { Id::retain(view as *mut NSView) }.unwrap();
let view = WeakId::from_id(&view);
let mtm = MainThreadMarker::new().unwrap();
let state = State::Inactive {
view,
is_view_focused,
action_handler: Rc::new(ActionHandlerWrapper::new(action_handler)),
mtm,
};
Self { state }
}
/// If and only if the tree has been initialized, call the provided function
/// and apply the resulting update. Note: If the caller's implementation of
/// [`ActivationHandler::request_initial_tree`] initially returned `None`,
/// the [`TreeUpdate`] returned by the provided function must contain
/// a full tree.
///
/// If a [`QueuedEvents`] instance is returned, the caller must call
/// [`QueuedEvents::raise`] on it.
pub fn update_if_active(
&mut self,
update_factory: impl FnOnce() -> TreeUpdate,
) -> Option<QueuedEvents> {
match &self.state {
State::Inactive { .. } => None,
State::Placeholder {
placeholder_context,
is_view_focused,
action_handler,
} => {
let tree = Tree::new(update_factory(), *is_view_focused);
let context = Context::new(
placeholder_context.view.clone(),
tree,
Rc::clone(action_handler),
placeholder_context.mtm,
);
let result = context
.tree
.borrow()
.state()
.focus_id()
.map(|id| QueuedEvents::new(Rc::clone(&context), vec![focus_event(id)]));
self.state = State::Active(context);
result
}
State::Active(context) => {
let mut event_generator = EventGenerator::new(context.clone());
let mut tree = context.tree.borrow_mut();
tree.update_and_process_changes(update_factory(), &mut event_generator);
Some(event_generator.into_result())
}
}
}
/// Update the tree state based on whether the window is focused.
///
/// If a [`QueuedEvents`] instance is returned, the caller must call
/// [`QueuedEvents::raise`] on it.
pub fn update_view_focus_state(&mut self, is_focused: bool) -> Option<QueuedEvents> {
match &mut self.state {
State::Inactive {
is_view_focused, ..
} => {
*is_view_focused = is_focused;
None
}
State::Placeholder {
is_view_focused, ..
} => {
*is_view_focused = is_focused;
None
}
State::Active(context) => {
let mut event_generator = EventGenerator::new(context.clone());
let mut tree = context.tree.borrow_mut();
tree.update_host_focus_state_and_process_changes(is_focused, &mut event_generator);
Some(event_generator.into_result())
}
}
}
fn get_or_init_context<H: ActivationHandler + ?Sized>(
&mut self,
activation_handler: &mut H,
) -> Rc<Context> {
match &self.state {
State::Inactive {
view,
is_view_focused,
action_handler,
mtm,
} => match activation_handler.request_initial_tree() {
Some(initial_state) => {
let tree = Tree::new(initial_state, *is_view_focused);
let context = Context::new(view.clone(), tree, Rc::clone(action_handler), *mtm);
let result = Rc::clone(&context);
self.state = State::Active(context);
result
}
None => {
let placeholder_update = TreeUpdate {
nodes: vec![(PLACEHOLDER_ROOT_ID, NodeProvider::new(Role::Window))],
tree: Some(TreeData::new(PLACEHOLDER_ROOT_ID)),
focus: PLACEHOLDER_ROOT_ID,
};
let placeholder_tree = Tree::new(placeholder_update, false);
let placeholder_context = Context::new(
view.clone(),
placeholder_tree,
Rc::new(ActionHandlerWrapper::new(PlaceholderActionHandler {})),
*mtm,
);
let result = Rc::clone(&placeholder_context);
self.state = State::Placeholder {
placeholder_context,
is_view_focused: *is_view_focused,
action_handler: Rc::clone(action_handler),
};
result
}
},
State::Placeholder {
placeholder_context,
..
} => Rc::clone(placeholder_context),
State::Active(context) => Rc::clone(context),
}
}
pub fn view_children<H: ActivationHandler + ?Sized>(
&mut self,
activation_handler: &mut H,
) -> *mut NSArray<NSObject> {
let context = self.get_or_init_context(activation_handler);
let tree = context.tree.borrow();
let state = tree.state();
let node = state.root();
let platform_nodes = if filter(&node) == FilterResult::Include {
vec![Id::into_super(Id::into_super(
context.get_or_create_platform_node(node.id()),
))]
} else {
node.filtered_children(filter)
.map(|node| {
Id::into_super(Id::into_super(
context.get_or_create_platform_node(node.id()),
))
})
.collect::<Vec<Id<NSObject>>>()
};
let array = NSArray::from_vec(platform_nodes);
Id::autorelease_return(array)
}
pub fn focus<H: ActivationHandler + ?Sized>(
&mut self,
activation_handler: &mut H,
) -> *mut NSObject {
let context = self.get_or_init_context(activation_handler);
let tree = context.tree.borrow();
let state = tree.state();
if let Some(node) = state.focus() {
if can_be_focused(&node) {
return Id::autorelease_return(context.get_or_create_platform_node(node.id()))
as *mut _;
}
}
null_mut()
}
fn weak_view(&self) -> &WeakId<NSView> {
match &self.state {
State::Inactive { view, .. } => view,
State::Placeholder {
placeholder_context,
..
} => &placeholder_context.view,
State::Active(context) => &context.view,
}
}
pub fn hit_test<H: ActivationHandler + ?Sized>(
&mut self,
point: NSPoint,
activation_handler: &mut H,
) -> *mut NSObject {
let view = match self.weak_view().load() {
Some(view) => view,
None => {
return null_mut();
}
};
let context = self.get_or_init_context(activation_handler);
let tree = context.tree.borrow();
let state = tree.state();
let root = state.root();
let point = from_ns_point(&view, &root, point);
let node = root.node_at_point(point, &filter).unwrap_or(root);
Id::autorelease_return(context.get_or_create_platform_node(node.id())) as *mut _
}
}

103
vendor/accesskit_macos/src/context.rs vendored Normal file
View File

@@ -0,0 +1,103 @@
// Copyright 2022 The AccessKit Authors. All rights reserved.
// Licensed under the Apache License, Version 2.0 (found in
// the LICENSE-APACHE file) or the MIT license (found in
// the LICENSE-MIT file), at your option.
use crate::node::PlatformNode;
use accesskit::{ActionHandler, ActionRequest, NodeId};
use accesskit_consumer::Tree;
use hashbrown::HashMap;
use objc2::rc::{Id, WeakId};
use objc2_app_kit::*;
use objc2_foundation::MainThreadMarker;
use std::fmt::Debug;
use std::{cell::RefCell, rc::Rc};
pub(crate) trait ActionHandlerNoMut {
fn do_action(&self, request: ActionRequest);
}
pub(crate) struct ActionHandlerWrapper<H: ActionHandler>(RefCell<H>);
impl<H: 'static + ActionHandler> ActionHandlerWrapper<H> {
pub(crate) fn new(inner: H) -> Self {
Self(RefCell::new(inner))
}
}
impl<H: ActionHandler> ActionHandlerNoMut for ActionHandlerWrapper<H> {
fn do_action(&self, request: ActionRequest) {
self.0.borrow_mut().do_action(request)
}
}
pub(crate) struct Context {
pub(crate) view: WeakId<NSView>,
pub(crate) tree: RefCell<Tree>,
pub(crate) action_handler: Rc<dyn ActionHandlerNoMut>,
platform_nodes: RefCell<HashMap<NodeId, Id<PlatformNode>>>,
pub(crate) mtm: MainThreadMarker,
}
impl Debug for Context {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Context")
.field("view", &self.view)
.field("tree", &self.tree)
.field("action_handler", &"ActionHandler")
.field("platform_nodes", &self.platform_nodes)
.field("mtm", &self.mtm)
.finish()
}
}
impl Context {
pub(crate) fn new(
view: WeakId<NSView>,
tree: Tree,
action_handler: Rc<dyn ActionHandlerNoMut>,
mtm: MainThreadMarker,
) -> Rc<Self> {
Rc::new(Self {
view,
tree: RefCell::new(tree),
action_handler,
platform_nodes: RefCell::new(HashMap::new()),
mtm,
})
}
pub(crate) fn get_or_create_platform_node(self: &Rc<Self>, id: NodeId) -> Id<PlatformNode> {
let mut platform_nodes = self.platform_nodes.borrow_mut();
if let Some(result) = platform_nodes.get(&id) {
return result.clone();
}
let result = PlatformNode::new(Rc::downgrade(self), id);
platform_nodes.insert(id, result.clone());
result
}
pub(crate) fn remove_platform_node(&self, id: NodeId) -> Option<Id<PlatformNode>> {
let mut platform_nodes = self.platform_nodes.borrow_mut();
platform_nodes.remove(&id)
}
pub(crate) fn do_action(&self, request: ActionRequest) {
self.action_handler.do_action(request);
}
}
impl Drop for Context {
fn drop(&mut self) {
let platform_nodes = self.platform_nodes.borrow();
for platform_node in platform_nodes.values() {
unsafe {
NSAccessibilityPostNotification(
platform_node,
NSAccessibilityUIElementDestroyedNotification,
)
};
}
}
}

298
vendor/accesskit_macos/src/event.rs vendored Normal file
View File

@@ -0,0 +1,298 @@
// Copyright 2022 The AccessKit Authors. All rights reserved.
// Licensed under the Apache License, Version 2.0 (found in
// the LICENSE-APACHE file) or the MIT license (found in
// the LICENSE-MIT file), at your option.
use accesskit::{Live, NodeId, Role};
use accesskit_consumer::{FilterResult, Node, TreeChangeHandler};
use hashbrown::HashSet;
use objc2::runtime::{AnyObject, ProtocolObject};
use objc2_app_kit::*;
use objc2_foundation::{NSMutableDictionary, NSNumber, NSString};
use std::rc::Rc;
use crate::{context::Context, filters::filter, node::NodeWrapper};
// This type is designed to be safe to create on a non-main thread
// and send to the main thread. This ability isn't yet used though.
pub(crate) enum QueuedEvent {
Generic {
node_id: NodeId,
notification: &'static NSAccessibilityNotificationName,
},
NodeDestroyed(NodeId),
Announcement {
text: String,
priority: NSAccessibilityPriorityLevel,
},
}
impl QueuedEvent {
fn live_region_announcement(node: &Node) -> Self {
Self::Announcement {
text: node.value().unwrap(),
priority: if node.live() == Live::Assertive {
NSAccessibilityPriorityLevel::NSAccessibilityPriorityHigh
} else {
NSAccessibilityPriorityLevel::NSAccessibilityPriorityMedium
},
}
}
fn raise(self, context: &Rc<Context>) {
match self {
Self::Generic {
node_id,
notification,
} => {
let platform_node = context.get_or_create_platform_node(node_id);
unsafe { NSAccessibilityPostNotification(&platform_node, notification) };
}
Self::NodeDestroyed(node_id) => {
if let Some(platform_node) = context.remove_platform_node(node_id) {
unsafe {
NSAccessibilityPostNotification(
&platform_node,
NSAccessibilityUIElementDestroyedNotification,
)
};
}
}
Self::Announcement { text, priority } => {
let view = match context.view.load() {
Some(view) => view,
None => {
return;
}
};
let window = match view.window() {
Some(window) => window,
None => {
return;
}
};
let mut user_info = NSMutableDictionary::<_, AnyObject>::new();
let text = NSString::from_str(&text);
unsafe {
user_info.setObject_forKey(
&*text,
ProtocolObject::from_ref(NSAccessibilityAnnouncementKey),
)
};
let priority = NSNumber::new_isize(priority.0);
unsafe {
user_info.setObject_forKey(
&*priority,
ProtocolObject::from_ref(NSAccessibilityPriorityKey),
)
};
unsafe {
NSAccessibilityPostNotificationWithUserInfo(
&window,
NSAccessibilityAnnouncementRequestedNotification,
Some(&**user_info),
)
};
}
}
}
}
/// Events generated by a tree update.
#[must_use = "events must be explicitly raised"]
pub struct QueuedEvents {
context: Rc<Context>,
events: Vec<QueuedEvent>,
}
impl QueuedEvents {
pub(crate) fn new(context: Rc<Context>, events: Vec<QueuedEvent>) -> Self {
Self { context, events }
}
/// Raise all queued events synchronously.
///
/// It is unknown whether accessibility methods on the view may be
/// called while events are being raised. This means that any locks
/// or runtime borrows required to access the adapter must not
/// be held while this method is called.
pub fn raise(self) {
for event in self.events {
event.raise(&self.context);
}
}
}
pub(crate) fn focus_event(node_id: NodeId) -> QueuedEvent {
QueuedEvent::Generic {
node_id,
notification: unsafe { NSAccessibilityFocusedUIElementChangedNotification },
}
}
pub(crate) struct EventGenerator {
context: Rc<Context>,
events: Vec<QueuedEvent>,
text_changed: HashSet<NodeId>,
selected_rows_changed: HashSet<NodeId>,
}
impl EventGenerator {
pub(crate) fn new(context: Rc<Context>) -> Self {
Self {
context,
events: Vec::new(),
text_changed: HashSet::new(),
selected_rows_changed: HashSet::new(),
}
}
pub(crate) fn into_result(self) -> QueuedEvents {
QueuedEvents::new(self.context, self.events)
}
fn insert_text_change_if_needed_parent(&mut self, node: Node) {
if !node.supports_text_ranges() {
return;
}
let id = node.id();
if self.text_changed.contains(&id) {
return;
}
// Text change events must come before selection change
// events. It doesn't matter if text change events come
// before other events.
self.events.insert(
0,
QueuedEvent::Generic {
node_id: id,
notification: unsafe { NSAccessibilityValueChangedNotification },
},
);
self.text_changed.insert(id);
}
fn insert_text_change_if_needed(&mut self, node: &Node) {
if node.role() != Role::TextRun {
return;
}
if let Some(node) = node.filtered_parent(&filter) {
self.insert_text_change_if_needed_parent(node);
}
}
fn enqueue_selected_rows_change_if_needed_parent(&mut self, node: Node) {
if !node.is_container_with_selectable_children() {
return;
}
let id = node.id();
if self.selected_rows_changed.contains(&id) {
return;
}
self.events.push(QueuedEvent::Generic {
node_id: id,
notification: unsafe { NSAccessibilitySelectedRowsChangedNotification },
});
self.selected_rows_changed.insert(id);
}
fn enqueue_selected_rows_change_if_needed(&mut self, node: &Node) {
if !node.is_item_like() {
return;
}
if let Some(node) = node.selection_container(&filter) {
self.enqueue_selected_rows_change_if_needed_parent(node);
}
}
}
impl TreeChangeHandler for EventGenerator {
fn node_added(&mut self, node: &Node) {
self.insert_text_change_if_needed(node);
if filter(node) != FilterResult::Include {
return;
}
if let Some(true) = node.is_selected() {
self.enqueue_selected_rows_change_if_needed(node);
}
if node.value().is_some() && node.live() != Live::Off {
self.events
.push(QueuedEvent::live_region_announcement(node));
}
}
fn node_updated(&mut self, old_node: &Node, new_node: &Node) {
if old_node.raw_value() != new_node.raw_value() {
self.insert_text_change_if_needed(new_node);
}
let old_node_was_filtered_out = filter(old_node) != FilterResult::Include;
if filter(new_node) != FilterResult::Include {
if !old_node_was_filtered_out
&& old_node.is_item_like()
&& old_node.is_selected() == Some(true)
{
self.enqueue_selected_rows_change_if_needed(old_node);
}
return;
}
let node_id = new_node.id();
let old_wrapper = NodeWrapper(old_node);
let new_wrapper = NodeWrapper(new_node);
if old_wrapper.title() != new_wrapper.title() {
self.events.push(QueuedEvent::Generic {
node_id,
notification: unsafe { NSAccessibilityTitleChangedNotification },
});
}
if old_wrapper.value() != new_wrapper.value() {
self.events.push(QueuedEvent::Generic {
node_id,
notification: unsafe { NSAccessibilityValueChangedNotification },
});
}
if old_wrapper.supports_text_ranges()
&& new_wrapper.supports_text_ranges()
&& old_wrapper.raw_text_selection() != new_wrapper.raw_text_selection()
{
self.events.push(QueuedEvent::Generic {
node_id,
notification: unsafe { NSAccessibilitySelectedTextChangedNotification },
});
}
if new_node.value().is_some()
&& new_node.live() != Live::Off
&& (new_node.value() != old_node.value()
|| new_node.live() != old_node.live()
|| old_node_was_filtered_out)
{
self.events
.push(QueuedEvent::live_region_announcement(new_node));
}
if new_node.is_item_like()
&& (new_node.is_selected() != old_node.is_selected()
|| (old_node_was_filtered_out && new_node.is_selected() == Some(true)))
{
self.enqueue_selected_rows_change_if_needed(new_node);
}
}
fn focus_moved(&mut self, _old_node: Option<&Node>, new_node: Option<&Node>) {
if let Some(new_node) = new_node {
if filter(new_node) != FilterResult::Include {
return;
}
self.events.push(focus_event(new_node.id()));
}
}
fn node_removed(&mut self, node: &Node) {
self.insert_text_change_if_needed(node);
if let Some(true) = node.is_selected() {
self.enqueue_selected_rows_change_if_needed(node);
}
self.events.push(QueuedEvent::NodeDestroyed(node.id()));
}
}

6
vendor/accesskit_macos/src/filters.rs vendored Normal file
View File

@@ -0,0 +1,6 @@
// Copyright 2023 The AccessKit Authors. All rights reserved.
// Licensed under the Apache License, Version 2.0 (found in
// the LICENSE-APACHE file) or the MIT license (found in
// the LICENSE-MIT file), at your option.
pub(crate) use accesskit_consumer::common_filter as filter;

25
vendor/accesskit_macos/src/lib.rs vendored Normal file
View File

@@ -0,0 +1,25 @@
// Copyright 2022 The AccessKit Authors. All rights reserved.
// Licensed under the Apache License, Version 2.0 (found in
// the LICENSE-APACHE file) or the MIT license (found in
// the LICENSE-MIT file), at your option.
#![deny(unsafe_op_in_unsafe_fn)]
mod context;
mod filters;
mod node;
mod util;
mod adapter;
pub use adapter::Adapter;
mod event;
pub use event::QueuedEvents;
mod patch;
pub use patch::add_focus_forwarder_to_window_class;
mod subclass;
pub use subclass::SubclassingAdapter;
pub use objc2_foundation::{NSArray, NSObject, NSPoint};

1015
vendor/accesskit_macos/src/node.rs vendored Normal file

File diff suppressed because it is too large Load Diff

92
vendor/accesskit_macos/src/patch.rs vendored Normal file
View File

@@ -0,0 +1,92 @@
// Copyright 2023 The AccessKit Authors. All rights reserved.
// Licensed under the Apache License, Version 2.0 (found in
// the LICENSE-APACHE file) or the MIT license (found in
// the LICENSE-MIT file), at your option.
use objc2::{
encode::{Encode, EncodeArguments, EncodeReturn, Encoding},
ffi::class_addMethod,
msg_send,
runtime::{AnyClass, AnyObject, Bool, MethodImplementation, Sel},
sel, Message,
};
use objc2_app_kit::NSWindow;
use std::{ffi::CString, ptr::null_mut};
extern "C" fn focus_forwarder(this: &NSWindow, _cmd: Sel) -> *mut AnyObject {
unsafe {
this.contentView().map_or_else(null_mut, |view| {
msg_send![&*view, accessibilityFocusedUIElement]
})
}
}
/// Modifies the specified class, which must be a subclass of `NSWindow`,
/// to include an `accessibilityFocusedUIElement` method that calls
/// the corresponding method on the window's content view. This is needed
/// for windowing libraries such as SDL that place the keyboard focus
/// directly on the window rather than the content view.
///
/// # Safety
///
/// This function is declared unsafe because the caller must ensure that the
/// code for this crate is never unloaded from the application process,
/// since it's not possible to reverse this operation. It's safest
/// if this crate is statically linked into the application's main executable.
/// Also, this function assumes that the specified class is a subclass
/// of `NSWindow`.
pub unsafe fn add_focus_forwarder_to_window_class(class_name: &str) {
let class = AnyClass::get(class_name).unwrap();
unsafe {
add_method(
class as *const AnyClass as *mut AnyClass,
sel!(accessibilityFocusedUIElement),
focus_forwarder as unsafe extern "C" fn(_, _) -> _,
)
};
}
// The rest of this file is copied from objc2 with only minor adaptations,
// to allow a method to be added to an existing class.
unsafe fn add_method<T, F>(class: *mut AnyClass, sel: Sel, func: F)
where
T: Message + ?Sized,
F: MethodImplementation<Callee = T>,
{
let encs = F::Arguments::ENCODINGS;
let sel_args = count_args(sel);
assert_eq!(
sel_args,
encs.len(),
"Selector {:?} accepts {} arguments, but function accepts {}",
sel,
sel_args,
encs.len(),
);
let types = method_type_encoding(&F::Return::ENCODING_RETURN, encs);
let success = Bool::from_raw(unsafe {
class_addMethod(
class as *mut _,
sel.as_ptr(),
Some(func.__imp()),
types.as_ptr(),
)
});
assert!(success.as_bool(), "Failed to add method {:?}", sel);
}
fn count_args(sel: Sel) -> usize {
sel.name().chars().filter(|&c| c == ':').count()
}
fn method_type_encoding(ret: &Encoding, args: &[Encoding]) -> CString {
// First two arguments are always self and the selector
let mut types = format!("{}{}{}", ret, <*mut AnyObject>::ENCODING, Sel::ENCODING);
for enc in args {
use core::fmt::Write;
write!(&mut types, "{}", enc).unwrap();
}
CString::new(types).unwrap()
}

265
vendor/accesskit_macos/src/subclass.rs vendored Normal file
View File

@@ -0,0 +1,265 @@
// Copyright 2022 The AccessKit Authors. All rights reserved.
// Licensed under the Apache License, Version 2.0 (found in
// the LICENSE-APACHE file) or the MIT license (found in
// the LICENSE-MIT file), at your option.
use accesskit::{ActionHandler, ActivationHandler, TreeUpdate};
use objc2::{
declare::ClassBuilder,
declare_class,
ffi::{
objc_getAssociatedObject, objc_setAssociatedObject, object_setClass,
OBJC_ASSOCIATION_RETAIN_NONATOMIC,
},
msg_send_id,
mutability::InteriorMutable,
rc::Id,
runtime::{AnyClass, Sel},
sel, ClassType, DeclaredClass,
};
use objc2_app_kit::{NSView, NSWindow};
use objc2_foundation::{NSArray, NSObject, NSPoint};
use std::{cell::RefCell, ffi::c_void, sync::Mutex};
use crate::{event::QueuedEvents, Adapter};
static SUBCLASSES: Mutex<Vec<(&'static AnyClass, &'static AnyClass)>> = Mutex::new(Vec::new());
static ASSOCIATED_OBJECT_KEY: u8 = 0;
fn associated_object_key() -> *const c_void {
(&ASSOCIATED_OBJECT_KEY as *const u8).cast()
}
struct AssociatedObjectState {
adapter: Adapter,
activation_handler: Box<dyn ActivationHandler>,
}
struct AssociatedObjectIvars {
state: RefCell<AssociatedObjectState>,
prev_class: &'static AnyClass,
}
declare_class!(
struct AssociatedObject;
unsafe impl ClassType for AssociatedObject {
type Super = NSObject;
type Mutability = InteriorMutable;
const NAME: &'static str = "AccessKitSubclassAssociatedObject";
}
impl DeclaredClass for AssociatedObject {
type Ivars = AssociatedObjectIvars;
}
);
impl AssociatedObject {
fn new(
adapter: Adapter,
activation_handler: impl 'static + ActivationHandler,
prev_class: &'static AnyClass,
) -> Id<Self> {
let state = RefCell::new(AssociatedObjectState {
adapter,
activation_handler: Box::new(activation_handler),
});
let this = Self::alloc().set_ivars(AssociatedObjectIvars { state, prev_class });
unsafe { msg_send_id![super(this), init] }
}
}
fn associated_object(view: &NSView) -> &AssociatedObject {
unsafe {
(objc_getAssociatedObject(view as *const NSView as *const _, associated_object_key())
as *const AssociatedObject)
.as_ref()
}
.unwrap()
}
// Some view classes, like the one in winit 0.27, assume that they are the
// lowest subclass, and call [self superclass] to get their superclass.
// Give them the answer they need.
unsafe extern "C" fn superclass(this: &NSView, _cmd: Sel) -> Option<&AnyClass> {
let associated = associated_object(this);
associated.ivars().prev_class.superclass()
}
unsafe extern "C" fn children(this: &NSView, _cmd: Sel) -> *mut NSArray<NSObject> {
let associated = associated_object(this);
let mut state = associated.ivars().state.borrow_mut();
let state_mut = &mut *state;
state_mut
.adapter
.view_children(&mut *state_mut.activation_handler)
}
unsafe extern "C" fn focus(this: &NSView, _cmd: Sel) -> *mut NSObject {
let associated = associated_object(this);
let mut state = associated.ivars().state.borrow_mut();
let state_mut = &mut *state;
state_mut.adapter.focus(&mut *state_mut.activation_handler)
}
unsafe extern "C" fn hit_test(this: &NSView, _cmd: Sel, point: NSPoint) -> *mut NSObject {
let associated = associated_object(this);
let mut state = associated.ivars().state.borrow_mut();
let state_mut = &mut *state;
state_mut
.adapter
.hit_test(point, &mut *state_mut.activation_handler)
}
/// Uses dynamic Objective-C subclassing to implement the `NSView`
/// accessibility methods when normal subclassing isn't an option.
pub struct SubclassingAdapter {
view: Id<NSView>,
associated: Id<AssociatedObject>,
}
impl SubclassingAdapter {
/// Create an adapter that dynamically subclasses the specified view.
/// This must be done before the view is shown or focused for
/// the first time.
///
/// The action handler will always be called on the main thread.
///
/// # Safety
///
/// `view` must be a valid, unreleased pointer to an `NSView`.
pub unsafe fn new(
view: *mut c_void,
activation_handler: impl 'static + ActivationHandler,
action_handler: impl 'static + ActionHandler,
) -> Self {
let view = view as *mut NSView;
let retained_view = unsafe { Id::retain(view) }.unwrap();
Self::new_internal(retained_view, activation_handler, action_handler)
}
fn new_internal(
retained_view: Id<NSView>,
activation_handler: impl 'static + ActivationHandler,
action_handler: impl 'static + ActionHandler,
) -> Self {
let view = Id::as_ptr(&retained_view) as *mut NSView;
let adapter = unsafe { Adapter::new(view as *mut c_void, false, action_handler) };
// Cast to a pointer and back to force the lifetime to 'static
// SAFETY: We know the class will live as long as the instance,
// and we only use this reference while the instance is alive.
let prev_class = unsafe { &*((*view).class() as *const AnyClass) };
let associated = AssociatedObject::new(adapter, activation_handler, prev_class);
unsafe {
objc_setAssociatedObject(
view as *mut _,
associated_object_key(),
Id::as_ptr(&associated) as *mut _,
OBJC_ASSOCIATION_RETAIN_NONATOMIC,
)
};
let mut subclasses = SUBCLASSES.lock().unwrap();
let subclass = match subclasses.iter().find(|entry| entry.0 == prev_class) {
Some(entry) => entry.1,
None => {
let name = format!("AccessKitSubclassOf{}", prev_class.name());
let mut builder = ClassBuilder::new(&name, prev_class).unwrap();
unsafe {
builder.add_method(
sel!(superclass),
superclass as unsafe extern "C" fn(_, _) -> _,
);
builder.add_method(
sel!(accessibilityChildren),
children as unsafe extern "C" fn(_, _) -> _,
);
builder.add_method(
sel!(accessibilityFocusedUIElement),
focus as unsafe extern "C" fn(_, _) -> _,
);
builder.add_method(
sel!(accessibilityHitTest:),
hit_test as unsafe extern "C" fn(_, _, _) -> _,
);
}
let class = builder.register();
subclasses.push((prev_class, class));
class
}
};
// SAFETY: Changing the view's class is only safe because
// the subclass doesn't add any instance variables;
// it uses an associated object instead.
unsafe { object_setClass(view as *mut _, (subclass as *const AnyClass).cast()) };
Self {
view: retained_view,
associated,
}
}
/// Create an adapter that dynamically subclasses the content view
/// of the specified window.
///
/// The action handler will always be called on the main thread.
///
/// # Safety
///
/// `window` must be a valid, unreleased pointer to an `NSWindow`.
///
/// # Panics
///
/// This function panics if the specified window doesn't currently have
/// a content view.
pub unsafe fn for_window(
window: *mut c_void,
activation_handler: impl 'static + ActivationHandler,
action_handler: impl 'static + ActionHandler,
) -> Self {
let window = unsafe { &*(window as *const NSWindow) };
let retained_view = window.contentView().unwrap();
Self::new_internal(retained_view, activation_handler, action_handler)
}
/// If and only if the tree has been initialized, call the provided function
/// and apply the resulting update. Note: If the caller's implementation of
/// [`ActivationHandler::request_initial_tree`] initially returned `None`,
/// the [`TreeUpdate`] returned by the provided function must contain
/// a full tree.
///
/// If a [`QueuedEvents`] instance is returned, the caller must call
/// [`QueuedEvents::raise`] on it.
pub fn update_if_active(
&mut self,
update_factory: impl FnOnce() -> TreeUpdate,
) -> Option<QueuedEvents> {
let mut state = self.associated.ivars().state.borrow_mut();
state.adapter.update_if_active(update_factory)
}
/// Update the tree state based on whether the window is focused.
///
/// If a [`QueuedEvents`] instance is returned, the caller must call
/// [`QueuedEvents::raise`] on it.
pub fn update_view_focus_state(&mut self, is_focused: bool) -> Option<QueuedEvents> {
let mut state = self.associated.ivars().state.borrow_mut();
state.adapter.update_view_focus_state(is_focused)
}
}
impl Drop for SubclassingAdapter {
fn drop(&mut self) {
let prev_class = self.associated.ivars().prev_class;
let view = Id::as_ptr(&self.view) as *mut NSView;
unsafe { object_setClass(view as *mut _, (prev_class as *const AnyClass).cast()) };
unsafe {
objc_setAssociatedObject(
view as *mut _,
associated_object_key(),
std::ptr::null_mut(),
OBJC_ASSOCIATION_RETAIN_NONATOMIC,
)
};
}
}

79
vendor/accesskit_macos/src/util.rs vendored Normal file
View File

@@ -0,0 +1,79 @@
// Copyright 2022 The AccessKit Authors. All rights reserved.
// Licensed under the Apache License, Version 2.0 (found in
// the LICENSE-APACHE file) or the MIT license (found in
// the LICENSE-MIT file), at your option.
use accesskit::{Point, Rect};
use accesskit_consumer::{Node, TextPosition, TextRange};
use objc2_app_kit::*;
use objc2_foundation::{NSPoint, NSRange, NSRect, NSSize};
pub(crate) fn from_ns_range<'a>(node: &'a Node<'a>, ns_range: NSRange) -> Option<TextRange<'a>> {
let pos = node.text_position_from_global_utf16_index(ns_range.location)?;
let mut range = pos.to_degenerate_range();
if ns_range.length > 0 {
let end =
node.text_position_from_global_utf16_index(ns_range.location + ns_range.length)?;
range.set_end(end);
}
Some(range)
}
pub(crate) fn to_ns_range(range: &TextRange) -> NSRange {
let start = range.start().to_global_utf16_index();
let end = range.end().to_global_utf16_index();
NSRange::from(start..end)
}
pub(crate) fn to_ns_range_for_character(pos: &TextPosition) -> NSRange {
let mut range = pos.to_degenerate_range();
if !pos.is_document_end() {
range.set_end(pos.forward_to_character_end());
}
to_ns_range(&range)
}
pub(crate) fn from_ns_point(view: &NSView, node: &Node, point: NSPoint) -> Point {
let window = view.window().unwrap();
let point = window.convertPointFromScreen(point);
let point = view.convertPoint_fromView(point, None);
// AccessKit coordinates are in physical (DPI-dependent) pixels, but
// macOS provides logical (DPI-independent) coordinates here.
let factor = window.backingScaleFactor();
let point = Point::new(
point.x * factor,
if view.isFlipped() {
point.y * factor
} else {
let view_bounds = view.bounds();
(view_bounds.size.height - point.y) * factor
},
);
node.transform().inverse() * point
}
pub(crate) fn to_ns_rect(view: &NSView, rect: Rect) -> NSRect {
let window = view.window().unwrap();
// AccessKit coordinates are in physical (DPI-dependent)
// pixels, but macOS expects logical (DPI-independent)
// coordinates here.
let factor = window.backingScaleFactor();
let rect = NSRect {
origin: NSPoint {
x: rect.x0 / factor,
y: if view.isFlipped() {
rect.y0 / factor
} else {
let view_bounds = view.bounds();
view_bounds.size.height - rect.y1 / factor
},
},
size: NSSize {
width: rect.width() / factor,
height: rect.height() / factor,
},
};
let rect = view.convertRect_toView(rect, None);
let window = view.window().unwrap();
window.convertRectToScreen(rect)
}