Avril
e6ccdc0653
|
4 years ago | |
---|---|---|
src | 4 years ago | |
.gitignore | 4 years ago | |
Cargo.toml | 4 years ago | |
README.org | 4 years ago | |
build.rs | 4 years ago |
README.org
GHOST
Rust bindings and Rust APIs for GHOST.
Layout
ABI-compatable types and functions are all prefixed with GHOST_
and are exported in the c
module.
Rust-native API variants are made as well, which have non-prefixed names.
Notes
Eventually we should intend to have most (if not all) C compatable types either reimplemented or aliased to non-prefixed Rust types. At present though this is not the case, and prefixed names that can double as ergonomic Rust types are not aliased to them, so you'll have to use both often. The reimplementation is undergoing, the aliasing not yet.
Leaving out implementing Copy
for most FFI types was a design decision, because I think the ownership model will work well here. (The hack flags-like structures need to implement copy to avoid passing around useless references when assigning them.)
This may be changed in the future, as (virtually) all implement Clone
anyway.
I did this basically just because I want people to think about it when and why they copy something, instead of it being default behaviour. If it proves inconvenient it can be changed.
Implementation
Implemented C compatable ABI
Note: List is in-progress and doesn't show everything. (Also the checkboxes might not be rendered here.)
-
GHOST_Types.h
-
Handles
- GHOST_SystemHandle
- GHOST_TimerTaskHandle
- GHOST_WindowHandle
- GHOST_EventHandle
- GHOST_RectangleHandle
- GHOST_EventConsumerHandle
- GHOST_ContextHandle
- GHOST_XrContextHandle
-
Primitives (ones that begin with
T
I count as `primitive')- GHOST_TInt8
- GHOST_TUns8
- GHOST_Tint16
- GHOST_TUns16
- GHOST_Tint32
- GHOST_TUns32
- GHOST_TInt64
- GHOST_TUns64
- GHOST_TUserDataPtr
- GHOST_TSuccess
- GHOST_TTabletMode
- GHOST_TTabletAPI
- GHOST_TVisibility
- GHOST_TFireTimeConstant
- GHOST_TModifierKeyMask
- GHOST_TWindowState
- GHOST_TWindowOrder
- GHOST_TDrawingContextType
- GHOST_TButtonMask
- GHOST_TEventType
- GHOST_TStandardCursor
- GHOST_TKey
-
Structures
- GHOST_GLSettings
- GHOST_GLFlags
- GHOST_DialogOptions
- GHOST_TabletData
-
Constants
GHOST_TABLET_DATA_NONE
(reimpl. asconst fn GHOST_TabletData::none()
)
-
GHOST_C-api.h
Native Rust API
Rust native APIs are provided for things where the C API bindings are cumbersome or unsafe.
They may or may not share ABI, if they do they will have type aliases to the corresponding GHOST_
identifier, so always use those when ABI compatability is desired.
Currently, most of the intended Rust API and structures do not exist (I haven't really studied the codebase), and C ones that are suitable for this purpose are mostly not aliased yet.
Overview
List and implementation status of features
-
Types
Aliases
- Handle types
Handles
Handles keep the C ABI, but are re-wrtten with traits to be more idiomatic.
The trait GhostHandle
is provided, which should be implemented on a structure that is not intended to be instantiated, but instead used as a `marker' for `Handle<T>'.
These types are ABI equivalent, and are present (with their corresponding GHOST_
alias in handle.rs
)
Since handles are just types pointers, they are only ever used as such and shouldn't exist themselves.
Example
extern "C" {fn some_internal_call(window: GHOST_WindowHandle) -> GHOST_TSuccess;}
fn do_something_to_window(window: &mut Handle<Window>) -> GhostResult<()>
{
some_internal_call(window as GHOST_WindowHandle).into()
}
Error handling
I have provided an idiomatic Rust error handling module, with conversion and interop between the C ABI GHOST_TSuccess
and the Rust error::GhostError
.
There is also the type alias GhostResult
provided.
On nightly
Rust versions, values of type GHOST_TSuccess
can be propagated directly with ?
, but on stable they must be propagated through GhostResult
:
extern "C" {fn returns_tsuccess() -> GHOST_TSuccess;}
fn try_things_internal() -> GhostResult // On nightly, we can propagage `GHOST_TSuccess` directly here, but it's still more desireable for us to have a `Result<T,E>` instead of an integer in Rust, so this is still preferrable.
{
returns_tsuccess()?;
Ok(())
}
fn caller()
{
match try_things_internal() {
Ok(_) => println!("Yay!"),
Err(_) => panic!("Fug"),
}
}
Keeping such a style is usually preferred, anyhow.
See error.rs for more details.
Documentation
Run cargo test; cargo doc
and then navigate to the exported HTML in ./target/doc/ghost/index.html
.
If you're building on stable, the documentation code samples will fail to compile. This is fine, the documentation pages will still be built all the same.