You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.6 KiB

GHOST Rust bindings

Rust bindings and interop for GHOST.

Layout

ABI-compatable types and functions are all prefixed with `GHOST_` and are exported in the `c` module (TODO). I've attempted to provide more Rust-idiomatic API variants as well, which have non-prefixed names.

Implementation log

Implemented C compatable ABI

Note: List is in-progress and doesn't show everything

  • `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 as const fn (GHOST_TabletData::none())

Native Rust API

I provide more Rust idiomatic API for some things. 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.

Overview

List and implementation status of features

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" unsafe fn internal_call(window: GHOST_WindowHandle) -> GHOST_TSuccess;

fn do_something_to_window(window: &mut Handle<Window>) -> Result<()>
{
unsafe {
internal_call(window as GHOST_WindowHandle).into()
}
}