diff --git a/.clang-format b/.clang-format index 16796b68..aeb5bb20 100644 --- a/.clang-format +++ b/.clang-format @@ -3,7 +3,6 @@ Language: Cpp # BasedOnStyle: Google AccessModifierOffset: -1 AlignAfterOpenBracket: Align -AlignArrayOfStructures: None AlignConsecutiveMacros: None AlignConsecutiveAssignments: None AlignConsecutiveBitFields: None @@ -12,6 +11,7 @@ AlignEscapedNewlines: Left AlignOperands: Align AlignTrailingComments: true AllowAllArgumentsOnNextLine: true +AllowAllConstructorInitializersOnNextLine: true AllowAllParametersOfDeclarationOnNextLine: true AllowShortEnumsOnASingleLine: true AllowShortBlocksOnASingleLine: Never @@ -59,28 +59,23 @@ BreakAfterJavaFieldAnnotations: false BreakStringLiterals: true ColumnLimit: 80 CommentPragmas: '^ IWYU pragma:' -QualifierAlignment: Leave CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: true ConstructorInitializerIndentWidth: 4 ContinuationIndentWidth: 4 Cpp11BracedListStyle: true DeriveLineEnding: true DerivePointerAlignment: true DisableFormat: false -EmptyLineAfterAccessModifier: Never EmptyLineBeforeAccessModifier: LogicalBlock ExperimentalAutoDetectBinPacking: false -PackConstructorInitializers: NextLine -BasedOnStyle: '' -ConstructorInitializerAllOnOneLineOrOnePerLine: false -AllowAllConstructorInitializersOnNextLine: true FixNamespaceComments: true ForEachMacros: - foreach - Q_FOREACH - BOOST_FOREACH -IfMacros: - - KJ_IF_MAYBE +StatementAttributeLikeMacros: + - Q_EMIT IncludeBlocks: Regroup IncludeCategories: - Regex: '^' @@ -101,7 +96,6 @@ IncludeCategories: CaseSensitive: false IncludeIsMainRegex: '([-_](test|unittest))?$' IncludeIsMainSourceRegex: '' -IndentAccessModifiers: false IndentCaseLabels: true IndentCaseBlocks: false IndentGotoLabels: true @@ -114,7 +108,6 @@ InsertTrailingCommas: None JavaScriptQuotes: Leave JavaScriptWrapImports: true KeepEmptyLinesAtTheStartOfBlocks: false -LambdaBodyIndentation: Signature MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 1 @@ -128,14 +121,12 @@ PenaltyBreakAssignment: 2 PenaltyBreakBeforeFirstCallParameter: 1 PenaltyBreakComment: 300 PenaltyBreakFirstLessLess: 120 -PenaltyBreakOpenParenthesis: 0 PenaltyBreakString: 1000 PenaltyBreakTemplateDeclaration: 10 PenaltyExcessCharacter: 1000000 PenaltyReturnTypeOnItsOwnLine: 200 PenaltyIndentedWhitespace: 0 PointerAlignment: Left -PPIndentWidth: -1 RawStringFormats: - Language: Cpp Delimiters: @@ -164,14 +155,10 @@ RawStringFormats: - ParseTextProtoOrDie - ParseTestProto - ParsePartialTestProto - CanonicalDelimiter: pb + CanonicalDelimiter: '' BasedOnStyle: google -ReferenceAlignment: Pointer ReflowComments: true -RemoveBracesLLVM: false -SeparateDefinitionBlocks: Leave -ShortNamespaceLines: 1 -SortIncludes: CaseSensitive +SortIncludes: true SortJavaStaticImport: Before SortUsingDeclarations: true SpaceAfterCStyleCast: false @@ -183,33 +170,20 @@ SpaceBeforeCpp11BracedList: false SpaceBeforeCtorInitializerColon: true SpaceBeforeInheritanceColon: true SpaceBeforeParens: ControlStatements -SpaceBeforeParensOptions: - AfterControlStatements: true - AfterForeachMacros: true - AfterFunctionDefinitionName: false - AfterFunctionDeclarationName: false - AfterIfMacros: true - AfterOverloadedOperator: false - BeforeNonEmptyParentheses: false SpaceAroundPointerQualifiers: Default SpaceBeforeRangeBasedForLoopColon: true SpaceInEmptyBlock: false SpaceInEmptyParentheses: false SpacesBeforeTrailingComments: 2 -SpacesInAngles: Never +SpacesInAngles: false SpacesInConditionalStatement: false SpacesInContainerLiterals: true SpacesInCStyleCastParentheses: false -SpacesInLineCommentPrefix: - Minimum: 1 - Maximum: -1 SpacesInParentheses: false SpacesInSquareBrackets: false SpaceBeforeSquareBrackets: false BitFieldColonSpacing: Both Standard: Auto -StatementAttributeLikeMacros: - - Q_EMIT StatementMacros: - Q_UNUSED - QT_REQUIRE_VERSION @@ -223,3 +197,4 @@ WhitespaceSensitiveMacros: - NS_SWIFT_NAME - CF_SWIFT_NAME ... + diff --git a/.github/workflows/bindings.yml b/.github/workflows/bindings.yml index 8773f0c4..008ce788 100644 --- a/.github/workflows/bindings.yml +++ b/.github/workflows/bindings.yml @@ -12,53 +12,44 @@ jobs: include: - os: macOS-latest target: aarch64-apple-darwin + cmake-options: -DCMAKE_OSX_ARCHITECTURES=arm64 path: macos/arm64 - shared-ext: dylib - static-ext: a - os: macOS-latest target: x86_64-apple-darwin path: macos/x86_64 - shared-ext: dylib - static-ext: a - os: windows-2019 target: aarch64-pc-windows-msvc + setup-step: 'cmd.exe /k "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsamd64_x86.bat" `& powershell' + cmake-options: -A ARM64 path: windows/arm64/msvc - shared-ext: dll - static-ext: lib - os: windows-2019 target: i686-pc-windows-msvc + setup-step: 'cmd.exe /k "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars32.bat" `& powershell' + cmake-options: -A Win32 path: windows/x86/msvc - shared-ext: dll - static-ext: lib - os: windows-2019 target: x86_64-pc-windows-msvc + setup-step: 'cmd.exe /k "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat" `& powershell' path: windows/x86_64/msvc - shared-ext: dll - static-ext: lib - os: ubuntu-latest target: i686-pc-windows-gnu - use-cross: true + setup-step: sudo apt update && sudo apt install -y mingw-w64 + cmake-options: -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_PROCESSOR=x86 -DCMAKE_C_COMPILER=i686-w64-mingw32-gcc -DCMAKE_CXX_COMPILER=i686-w64-mingw32-g++ path: windows/x86/mingw - shared-ext: dll - static-ext: a - os: ubuntu-latest target: x86_64-pc-windows-gnu - use-cross: true + setup-step: sudo apt update && sudo apt install -y mingw-w64 + cmake-options: -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SYSTEM_PROCESSOR=x86_64 -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ path: windows/x86_64/mingw - shared-ext: dll - static-ext: a - os: ubuntu-latest target: i686-unknown-linux-gnu - use-cross: true + setup-step: sudo apt update && sudo apt install -y gcc-multilib g++-multilib + cmake-options: -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=x86 path: linux/x86 - shared-ext: so - static-ext: a - os: ubuntu-latest target: x86_64-unknown-linux-gnu path: linux/x86_64 - shared-ext: so - static-ext: a - name: cargo build + name: Build steps: - uses: actions/checkout@v3 @@ -70,34 +61,18 @@ jobs: profile: minimal override: true - - name: cargo build - uses: actions-rs/cargo@v1 - with: - command: build - use-cross: ${{ matrix.use-cross || false }} - args: --package accesskit_c --release --target ${{ matrix.target }} - - - shell: bash - run: | - mkdir -p artifacts/${{ matrix.path }}/shared - mkdir -p artifacts/${{ matrix.path }}/static - - - if: startsWith(matrix.os, 'windows') + - name: build libraries run: | - mv target/${{ matrix.target }}/release/accesskit.dll.lib artifacts/${{ matrix.path }}/shared/accesskit.lib - mv target/${{ matrix.target }}/release/*.pdb artifacts/${{ matrix.path }}/shared - - if: contains(matrix.path, 'mingw') - run: mv target/${{ matrix.target }}/release/libaccesskit.dll.a artifacts/${{ matrix.path }}/shared/libaccesskit.a - - - run: | - mv target/${{ matrix.target }}/release/*.${{ matrix.shared-ext }} artifacts/${{ matrix.path }}/shared - mv target/${{ matrix.target }}/release/*.${{ matrix.static-ext }} artifacts/${{ matrix.path }}/static + ${{ matrix.setup-step || '' }} + cmake -S bindings/c -B build -DACCESSKIT_BUILD_HEADERS=OFF -DRust_CARGO_TARGET=${{ matrix.target }} ${{ matrix.cmake-options || '' }} ${{ !contains(matrix.target, 'msvc') && '-DCMAKE_BUILD_TYPE=Release' || '' }} + cmake --build build ${{ contains(matrix.target, 'msvc') && '--config Release' || '' }} + cmake --install build ${{ contains(matrix.target, 'msvc') && '--config Release' || '' }} - name: Upload binaries uses: actions/upload-artifact@v3 with: name: ${{ matrix.target }} - path: artifacts + path: bindings/c/lib generate-headers: if: startsWith(github.ref_name, 'accesskit_c-v') @@ -119,6 +94,7 @@ jobs: mv artifacts/headers accesskit_c/include cp -r artifacts/*/* accesskit_c/lib cp -r bindings/c/examples accesskit_c/ + cp bindings/c/accesskit*.cmake accesskit_c/ cp bindings/c/*.md accesskit_c/ cp LICENSE* accesskit_c/ mv accesskit_c ${{ github.ref_name }} diff --git a/.github/workflows/generate-headers.yml b/.github/workflows/generate-headers.yml index 63c3ba69..c8fdd793 100644 --- a/.github/workflows/generate-headers.yml +++ b/.github/workflows/generate-headers.yml @@ -18,7 +18,9 @@ jobs: - uses: dtolnay/install@master with: crate: cbindgen - - run: make -C bindings/c include/accesskit.h + - run: cmake -S bindings/c -B build -DACCESSKIT_BUILD_LIBRARIES=OFF + - run: cmake --build build + - run: cmake --install build - name: Upload header file uses: actions/upload-artifact@v3 diff --git a/Cargo.toml b/Cargo.toml index 968452fb..f69f7bb3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ default-members = [ "common", "consumer", "platforms/winit", + "bindings/c", ] [profile.release] diff --git a/bindings/c/.cargo/config.toml b/bindings/c/.cargo/config.toml new file mode 100644 index 00000000..1323c941 --- /dev/null +++ b/bindings/c/.cargo/config.toml @@ -0,0 +1,9 @@ +[target.aarch64-apple-darwin] +rustflags = [ + "-C", "link-arg=-Wl,-install_name,@rpath/libaccesskit.dylib", +] + +[target.x86_64-apple-darwin] +rustflags = [ + "-C", "link-arg=-Wl,-install_name,@rpath/libaccesskit.dylib", +] diff --git a/bindings/c/.gitignore b/bindings/c/.gitignore index d4a94ec6..f5565603 100644 --- a/bindings/c/.gitignore +++ b/bindings/c/.gitignore @@ -1,2 +1,3 @@ - -include \ No newline at end of file +build +include +lib diff --git a/bindings/c/CMakeLists.txt b/bindings/c/CMakeLists.txt new file mode 100644 index 00000000..787b0fef --- /dev/null +++ b/bindings/c/CMakeLists.txt @@ -0,0 +1,66 @@ +cmake_minimum_required(VERSION 3.20) + +project(accesskit_c) + +option(ACCESSKIT_BUILD_HEADERS "Whether to build header files" ON) +option(ACCESSKIT_BUILD_LIBRARIES "Whether to build libraries" ON) + +if (ACCESSKIT_BUILD_LIBRARIES) + include(FetchContent) + + FetchContent_Declare( + Corrosion + GIT_REPOSITORY https://github.com/corrosion-rs/corrosion.git + GIT_TAG v0.3.5 + ) + FetchContent_MakeAvailable(Corrosion) + + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + set(CMAKE_PDB_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + corrosion_import_crate(MANIFEST_PATH Cargo.toml) +endif() + +if (ACCESSKIT_BUILD_HEADERS) + find_program(RUSTUP rustup) + find_program(CBINDGEN cbindgen) + find_program(CLANG_FORMAT clang-format) + + add_custom_target(headers ALL + COMMAND ${RUSTUP} run nightly ${CBINDGEN} --crate accesskit_c --output accesskit.hpp "${CMAKE_SOURCE_DIR}" + COMMAND ${CLANG_FORMAT} -i accesskit.hpp + COMMAND ${CMAKE_COMMAND} -E rename accesskit.hpp accesskit.h + BYPRODUCTS accesskit.h + ) + + if (ACCESSKIT_BUILD_LIBRARIES) + add_dependencies(cargo-prebuild_accesskit headers) + endif() +endif() + +include("accesskit.cmake") + +if (ACCESSKIT_BUILD_HEADERS) + install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/accesskit.h" + DESTINATION "${ACCESSKIT_INCLUDE_DIR}" + ) +endif() + +if (ACCESSKIT_BUILD_LIBRARIES) + install(FILES + "$" + DESTINATION "${ACCESSKIT_LIBRARIES_DIR}/static" + ) + + install(FILES + "$" + "$<$:${CMAKE_CURRENT_BINARY_DIR}/accesskit.pdb>" + DESTINATION "${ACCESSKIT_LIBRARIES_DIR}/shared" + ) + install(FILES + "$<$,>>:$>" + RENAME "libaccesskit.a" + DESTINATION "${ACCESSKIT_LIBRARIES_DIR}/shared" + ) +endif() diff --git a/bindings/c/Makefile b/bindings/c/Makefile deleted file mode 100644 index d7d60147..00000000 --- a/bindings/c/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -SHELL = /usr/bin/env bash -.SHELLFLAGS = -o pipefail -c - -CFLAGS := -Werror -Wall -Wextra -Wpedantic -g -I src/ - -PROFILE := release -DESTDIR=/usr/local - -ifeq ($(CC), clang) - CFLAGS += -fsanitize=address -fsanitize=undefined - LDFLAGS += -fsanitize=address -endif - -ifeq ($(PROFILE), release) - CFLAGS += -O3 - CARGOFLAGS += --release -endif - -include: - mkdir -p $@ - -include/accesskit.h: src/*.rs cbindgen.toml include - rustup run nightly cbindgen | clang-format '--assume-filename=*.c' > $@ - -../../target/$(PROFILE)/libaccesskit.a: src/*.rs Cargo.toml - cargo build $(CARGOFLAGS) - -install: ../../target/$(PROFILE)/libaccesskit.a - mkdir -p $(DESTDIR)/lib - install target/$(PROFILE)/libaccesskit.a $(DESTDIR)/lib/libaccesskit.a - mkdir -p $(DESTDIR)/include - install include/accesskit.h $(DESTDIR)/include/ - -clean: - rm -rf include - rm -rf ../../target diff --git a/bindings/c/README.md b/bindings/c/README.md index 3f5a9658..89d04440 100644 --- a/bindings/c/README.md +++ b/bindings/c/README.md @@ -2,17 +2,62 @@ These are the bindings to use AccessKit from other languages through FFI such as in C. -## Prerequisites +## How to use in a CMake project + +Decompress an accesskit_c release and place the resulting folder somewhere either: + +- already known by CMake, +- listed in your `CMAKE_PREFIX_PATH`, +- indicated by the `ACCESSKIT_DIR` option. + +You can then require AccessKit as a dependency by adding this to your `CMakeLists.txt`: + +```cmake +find_package(ACCESSKIT REQUIRED) +``` + +The headers can be added like so: + +```cmake +include_directories(YourProject ${ACCESSKIT_INCLUDE_DIR}) +``` + +Finally, link the library to your executable: + +```cmake +target_link_libraries(hello_world PUBLIC accesskit) +``` + +See [the `examples` directory](https://github.com/AccessKit/accesskit/tree/main/bindings/c/examples) for project integration examples. + +## Building from source + +Prerequisites: - [Rust](https://rustup.rs/) +- [CMake](https://cmake.org/), version 3.20 or higher - A nightly Rust toolchain: `rustup install nightly` - [cbindgen](https://github.com/eqrion/cbindgen): `cargo install cbindgen` - [clang-format](https://releases.llvm.org/14.0.0/tools/clang/docs/ClangFormat.html), version 14 or higher -## Building +Once inside the `bindings/c` directory, CMake can be used like this to build the project: + +```bash +cmake -S . -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build +cmake --install build +``` + +### Notes on cross-compiling + +On Windows, you will need to pass the `-A` flag when configuring the project. For instance, to target ARM64: + +```bash +cmake -S . -B build -A ARM64 +``` -Inside the `bindings/c` directory, some of the available make recipes include: +On other platforms you will have to specify which Rust target to use, as well as tell CMake for which architecture to compile. Here is how you would cross-compile for Linux X86 from Linux AMD64: -- `make include/accesskit.h`: generate the header files -- `make ../../target/release/libaccesskit.a`: build static and dynamic libraries on Linux -- `make clean`: remove generated artifacts +```bash +cmake -S . -B build -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=x86 -DRust_CARGO_TARGET=i686-unknown-linux-gnu +``` diff --git a/bindings/c/accesskit-config.cmake b/bindings/c/accesskit-config.cmake new file mode 100644 index 00000000..173a61d6 --- /dev/null +++ b/bindings/c/accesskit-config.cmake @@ -0,0 +1,43 @@ +include("${CMAKE_CURRENT_LIST_DIR}/accesskit.cmake") + +add_library(accesskit INTERFACE) + +add_library(accesskit-static STATIC IMPORTED GLOBAL) +find_library(_accesskit_static_lib accesskit "${ACCESSKIT_LIBRARIES_DIR}/static") +set_property( + TARGET accesskit-static + PROPERTY IMPORTED_LOCATION "${_accesskit_static_lib}" +) +if (_accesskit_os STREQUAL "macos") + target_link_libraries(accesskit-static INTERFACE "-framework AppKit" "-framework Foundation" "-framework CoreFoundation" objc c++) +elseif (_accesskit_os STREQUAL "linux") + target_link_libraries(accesskit-static INTERFACE -static-libgcc m) +elseif (_accesskit_os STREQUAL "windows") + target_link_libraries(accesskit-static INTERFACE bcrypt ntdll uiautomationcore userenv ws2_32) +endif() + +add_library(accesskit-shared SHARED IMPORTED GLOBAL) +if (_accesskit_os STREQUAL "windows") + find_library(_accesskit_implib accesskit "${ACCESSKIT_LIBRARIES_DIR}/shared") + set_property( + TARGET accesskit-shared + PROPERTY IMPORTED_IMPLIB "${_accesskit_implib}" + ) +endif() +if (_accesskit_os STREQUAL "macos") + set(_accesskit_shared_lib "libaccesskit.dylib") +elseif (_accesskit_os STREQUAL "linux") + set(_accesskit_shared_lib "libaccesskit.so") +elseif (_accesskit_os STREQUAL "windows") + set(_accesskit_shared_lib "accesskit.dll") +endif() +set_property( + TARGET accesskit-shared + PROPERTY IMPORTED_LOCATION "${ACCESSKIT_LIBRARIES_DIR}/shared/${_accesskit_shared_lib}" +) + +if (BUILD_SHARED_LIBS) + target_link_libraries(accesskit INTERFACE accesskit-shared) +else() + target_link_libraries(accesskit INTERFACE accesskit-static) +endif() diff --git a/bindings/c/accesskit.cmake b/bindings/c/accesskit.cmake new file mode 100644 index 00000000..5965f837 --- /dev/null +++ b/bindings/c/accesskit.cmake @@ -0,0 +1,44 @@ +set(ACCESSKIT_INCLUDE_DIR "${CMAKE_CURRENT_LIST_DIR}/include") +set(_accesskit_toolchain "") + +if (APPLE) + set(_accesskit_os "macos") + if (CMAKE_OSX_ARCHITECTURES MATCHES "(ARM64|arm64|aarch64)") + set(_accesskit_arch "arm64") + endif() +elseif (UNIX) + set(_accesskit_os "linux") +elseif (WIN32) + set(_accesskit_os "windows") + if (MINGW) + set(_accesskit_toolchain "mingw") + else() + set(_accesskit_toolchain "msvc") + endif() + + if (CMAKE_VS_PLATFORM_NAME) + string(TOLOWER "${CMAKE_VS_PLATFORM_NAME}" LOWER_VS_PLATFORM_NAME) + if ("${LOWER_VS_PLATFORM_NAME}" STREQUAL "win32") + set(_accesskit_arch x86) + elseif("${LOWER_VS_PLATFORM_NAME}" STREQUAL "x64") + set(_accesskit_arch x86_64) + elseif ("${LOWER_VS_PLATFORM_NAME}" STREQUAL "arm64") + set(_accesskit_arch "arm64") + endif() + endif() +endif() + +if (NOT _accesskit_arch) + if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(AMD64|amd64|x86_64)$") + set(_accesskit_arch x86_64) + elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^(ARM64|arm64|aarch64)$") + set(_accesskit_arch arm64) + elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^(X86|x86|i686)$") + set(_accesskit_arch x86) + endif() +endif() + +set(ACCESSKIT_LIBRARIES_DIR "${CMAKE_CURRENT_LIST_DIR}/lib/${_accesskit_os}/${_accesskit_arch}") +if (_accesskit_toolchain) + string(APPEND ACCESSKIT_LIBRARIES_DIR "/${_accesskit_toolchain}") +endif() diff --git a/bindings/c/examples/windows/.gitignore b/bindings/c/examples/windows/.gitignore index 9c570db2..378eac25 100644 --- a/bindings/c/examples/windows/.gitignore +++ b/bindings/c/examples/windows/.gitignore @@ -1,2 +1 @@ -*.exe -*.obj \ No newline at end of file +build diff --git a/bindings/c/examples/windows/CMakeLists.txt b/bindings/c/examples/windows/CMakeLists.txt new file mode 100644 index 00000000..51ed62d3 --- /dev/null +++ b/bindings/c/examples/windows/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.20) + +project(windows_example) + +find_package(ACCESSKIT REQUIRED) +include_directories(windows_example ${ACCESSKIT_INCLUDE_DIR}) + +add_executable(hello_world hello_world.c) +target_link_libraries(hello_world PUBLIC accesskit) +target_compile_definitions(hello_world PRIVATE -DUNICODE -D_UNICODE) diff --git a/bindings/c/examples/windows/README.md b/bindings/c/examples/windows/README.md new file mode 100644 index 00000000..8e5b343e --- /dev/null +++ b/bindings/c/examples/windows/README.md @@ -0,0 +1,10 @@ +# AccessKit Windows example + +This example demonstrates how to integrate AccessKit into a C/C++ project using CMake. + +## Building + +```bash +cmake -S . -B build -DACCESSKIT_DIR="../.." +cmake --build build --config Release +``` diff --git a/bindings/c/examples/windows/build.bat b/bindings/c/examples/windows/build.bat deleted file mode 100644 index 9dbd4a2b..00000000 --- a/bindings/c/examples/windows/build.bat +++ /dev/null @@ -1,4 +0,0 @@ -@echo off -cl /nologo /W3 /DUNICODE /D_UNICODE /I..\..\include /c hello_world.c -Rem This script assumes you are building this example from the downloaded package on a 64bit machine. -link /NOLOGO /SUBSYSTEM:CONSOLE hello_world.obj ..\..\lib\windows\x86_64\msvc\static\accesskit.lib advapi32.lib bcrypt.lib kernel32.lib ole32.lib oleaut32.lib shell32.lib uiautomationcore.lib user32.lib userenv.lib winspool.lib ws2_32.lib diff --git a/bindings/c/src/macos.rs b/bindings/c/src/macos.rs index 7d6fa6e8..d9bfd4ae 100644 --- a/bindings/c/src/macos.rs +++ b/bindings/c/src/macos.rs @@ -7,7 +7,7 @@ use crate::{ action_handler, box_from_ptr, ref_from_ptr, tree_update, tree_update_factory, BoxCastPtr, CastPtr, }; -use accesskit_macos::{Adapter, NSObject, NSPoint, QueuedEvents, SubclassingAdapter}; +use accesskit_macos::{Adapter, NSPoint, QueuedEvents, SubclassingAdapter}; use std::{os::raw::c_void, ptr}; pub struct macos_queued_events { @@ -41,6 +41,10 @@ impl BoxCastPtr for macos_adapter {} impl macos_adapter { /// This function takes ownership of `initial_state` and `handler`. + /// + /// # Safety + /// + /// `view` must be a valid, unreleased pointer to an `NSView`. #[no_mangle] pub unsafe extern "C" fn accesskit_macos_adapter_new( view: *mut c_void, @@ -111,6 +115,10 @@ impl BoxCastPtr for macos_subclassing_adapter {} impl macos_subclassing_adapter { /// This function takes ownership of `handler`. + /// + /// # Safety + /// + /// `view` must be a valid, unreleased pointer to an `NSView`. #[no_mangle] pub unsafe extern "C" fn accesskit_macos_subclassing_adapter_new( view: *mut c_void, @@ -129,6 +137,15 @@ impl macos_subclassing_adapter { } /// This function takes ownership of `handler`. + /// + /// # 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. #[no_mangle] pub unsafe extern "C" fn accesskit_macos_subclassing_adapter_for_window( window: *mut c_void,