commit
1f30071f6e
@ -0,0 +1,3 @@
|
||||
target/
|
||||
Cargo.lock
|
||||
*~
|
@ -0,0 +1,13 @@
|
||||
[package]
|
||||
name = "ghost"
|
||||
version = "0.1.0"
|
||||
authors = ["Avril <flanchan@cumallover.me>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
libc = "0.2.76"
|
||||
|
||||
[build-dependencies]
|
||||
rustc_version = "0.2"
|
@ -0,0 +1,81 @@
|
||||
* 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`
|
||||
- [X] /Handles/
|
||||
- [X] GHOST_SystemHandle
|
||||
- [X] GHOST_TimerTaskHandle
|
||||
- [X] GHOST_WindowHandle
|
||||
- [X] GHOST_EventHandle
|
||||
- [X] GHOST_RectangleHandle
|
||||
- [X] GHOST_EventConsumerHandle
|
||||
- [X] GHOST_ContextHandle
|
||||
- [X] GHOST_XrContextHandle
|
||||
- [-] /Primitives/ (ones that begin with =T= I count as `primitive')
|
||||
- [X] GHOST_TInt8
|
||||
- [X] GHOST_TUns8
|
||||
- [X] GHOST_Tint16
|
||||
- [X] GHOST_TUns16
|
||||
- [X] GHOST_Tint32
|
||||
- [X] GHOST_TUns32
|
||||
- [X] GHOST_TInt64
|
||||
- [X] GHOST_TUns64
|
||||
- [X] GHOST_TUserDataPtr
|
||||
- [X] GHOST_TSuccess
|
||||
- [X] GHOST_TTabletMode
|
||||
- [X] GHOST_TTabletAPI
|
||||
- [X] GHOST_TVisibility
|
||||
- [X] GHOST_TFireTimeConstant
|
||||
- [X] GHOST_TModifierKeyMask
|
||||
- [X] GHOST_TWindowState
|
||||
- [X] GHOST_TWindowOrder
|
||||
- [X] GHOST_TDrawingContextType
|
||||
- [X] GHOST_TButtonMask
|
||||
- [X] GHOST_TEventType
|
||||
- [ ] GHOST_TStandardCursor
|
||||
- [ ] GHOST_TKey
|
||||
- [X] /Structures/
|
||||
- [X] GHOST_GLSettings
|
||||
- [X] GHOST_GLFlags
|
||||
- [X] GHOST_DialogOptions
|
||||
- [X] GHOST_TabletData
|
||||
- [X] /Constants/
|
||||
- [X] =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
|
||||
|
||||
- [-] Types
|
||||
- [X] [[Handles]]: ~handle.rs~
|
||||
- [ ] Events: ~event.rs~
|
||||
|
||||
**** 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
|
||||
#+BEGIN_SRC rust
|
||||
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()
|
||||
}
|
||||
}
|
||||
#+END_SRC
|
@ -0,0 +1,24 @@
|
||||
|
||||
extern crate rustc_version;
|
||||
use rustc_version::{version, version_meta, Channel};
|
||||
|
||||
fn main() {
|
||||
// Assert we haven't travelled back in time
|
||||
assert!(version().unwrap().major >= 1);
|
||||
|
||||
// Set cfg flags depending on release channel
|
||||
match version_meta().unwrap().channel {
|
||||
Channel::Stable => {
|
||||
println!("cargo:rustc-cfg=stable");
|
||||
}
|
||||
Channel::Beta => {
|
||||
println!("cargo:rustc-cfg=beta");
|
||||
}
|
||||
Channel::Nightly => {
|
||||
println!("cargo:rustc-cfg=nightly");
|
||||
}
|
||||
Channel::Dev => {
|
||||
println!("cargo:rustc-cfg=dev");
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
//! Re-exports of all ABI-compatable types and functions
|
||||
|
||||
pub use super::{
|
||||
types::{
|
||||
GHOST_TInt8,
|
||||
GHOST_TUns8,
|
||||
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_GLSettings,
|
||||
GHOST_GLFlags,
|
||||
GHOST_DialogOptions,
|
||||
GHOST_TabletData,
|
||||
},
|
||||
handle::{
|
||||
GHOST_SystemHandle,
|
||||
GHOST_TimerTaskHandle,
|
||||
GHOST_WindowHandle,
|
||||
GHOST_EventHandle,
|
||||
GHOST_RectangleHandle,
|
||||
GHOST_EventConsumerHandle,
|
||||
GHOST_ContextHandle,
|
||||
GHOST_XrContextHandle,
|
||||
},
|
||||
};
|
@ -0,0 +1,62 @@
|
||||
//! Rust interface for Event handlers (`GHOST_TEventType` et. al)
|
||||
use super::*;
|
||||
|
||||
pub enum CursorEventType
|
||||
{
|
||||
Move,
|
||||
ButtonDown,
|
||||
ButtonUp,
|
||||
Wheel,
|
||||
Trackpad,
|
||||
}
|
||||
|
||||
pub enum KeyboardEventType
|
||||
{
|
||||
KeyUp,
|
||||
KeyDown,
|
||||
// Auto,
|
||||
}
|
||||
|
||||
pub enum WindowEventType
|
||||
{
|
||||
Close,
|
||||
Activate,
|
||||
Deactivate,
|
||||
Update,
|
||||
Size,
|
||||
Move,
|
||||
DPIHintChanged,
|
||||
}
|
||||
|
||||
pub enum DragEventType
|
||||
{
|
||||
Entered,
|
||||
Updated,
|
||||
Exited,
|
||||
DropDone,
|
||||
}
|
||||
|
||||
pub enum ImeCompositionEventType
|
||||
{
|
||||
Composition,
|
||||
Start,
|
||||
End,
|
||||
}
|
||||
|
||||
pub enum EventType
|
||||
{
|
||||
Cursor(CursorEventType),
|
||||
Keyboard(KeyboardEventType),
|
||||
|
||||
QuitRequest,
|
||||
Window(WindowEventType),
|
||||
|
||||
Drag(DragEventType),
|
||||
|
||||
OpenMainFile,
|
||||
NativeResolutionChange,
|
||||
|
||||
Timer,
|
||||
|
||||
ImeComposition(ImeCompositionEventType),
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
//! GHOST_Types.h
|
||||
use super::*;
|
||||
|
||||
use types::{Handle,GhostHandle};
|
||||
|
||||
macro_rules! handle {
|
||||
($name:ident, $inner_name:ident) => {
|
||||
#[cfg(nightly)] pub struct $inner_name(!);
|
||||
#[cfg(not(nightly))] pub struct $inner_name(());
|
||||
impl GhostHandle for $inner_name{}
|
||||
pub type $name = *mut Handle<$inner_name>;
|
||||
};
|
||||
}
|
||||
|
||||
handle!(GHOST_SystemHandle, System);
|
||||
handle!(GHOST_TimerTaskHandle, TimerTask);
|
||||
handle!(GHOST_WindowHandle, Window);
|
||||
handle!(GHOST_EventHandle, Event);
|
||||
handle!(GHOST_RectangleHandle, Rectangle);
|
||||
handle!(GHOST_EventConsumerHandle, EventConsumer);
|
||||
handle!(GHOST_ContextHandle, Context);
|
||||
handle!(GHOST_XrContextHandle, XrContextHandle);
|
@ -0,0 +1,30 @@
|
||||
//! 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.
|
||||
|
||||
#![cfg_attr(nightly, feature(never_type))]
|
||||
|
||||
#![allow(dead_code)]
|
||||
#![allow(non_camel_case_types)]
|
||||
|
||||
#[cfg(nightly)] pub type PVoid = *const !;
|
||||
#[cfg(not(nightly))] pub type PVoid = *const libc::c_void;
|
||||
#[cfg(nightly)] pub type PVoidMut = *mut !;
|
||||
#[cfg(not(nightly))] pub type PVoidMut = *mut libc::c_void;
|
||||
|
||||
pub mod handle;
|
||||
pub mod event;
|
||||
pub mod types;
|
||||
|
||||
pub mod c;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
#[test]
|
||||
fn it_works() {
|
||||
// nothing yet.
|
||||
}
|
||||
}
|
@ -0,0 +1,239 @@
|
||||
//! GHOST_Types.h
|
||||
use super::*;
|
||||
use libc::{
|
||||
c_int,
|
||||
};
|
||||
use std::{
|
||||
marker::{
|
||||
PhantomData,
|
||||
},
|
||||
};
|
||||
|
||||
/// Trait for opaque types that represent GHOST handles
|
||||
/// API maps vaguely to `GHOST_DECLARE_HANDLE`.
|
||||
pub trait GhostHandle{}
|
||||
|
||||
/// Opaque handle type for GHOST C++ object.
|
||||
#[repr(C)]
|
||||
pub struct Handle<T>(c_int, PhantomData<T>)
|
||||
where T: GhostHandle;
|
||||
|
||||
pub type GHOST_TInt8 = libc::c_char;
|
||||
pub type GHOST_TUns8 = libc::c_uchar;
|
||||
pub type GHOST_TUns16 = libc::c_ushort;
|
||||
pub type GHOST_TInt32 = libc::c_int;
|
||||
pub type GHOST_TUns32 = libc::c_uint;
|
||||
// -- skip MSVC specific shit. I'm not testing on that
|
||||
pub type GHOST_TInt64 = libc::c_longlong;
|
||||
pub type GHOST_TUns64 = libc::c_ulonglong;
|
||||
pub type GHOST_TUserDataPtr = PVoidMut;
|
||||
|
||||
#[repr(C)]
|
||||
pub struct GHOST_GLSettings
|
||||
{
|
||||
pub flags: c_int,
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub enum GHOST_GLFlags
|
||||
{
|
||||
StereoVisual = 1<<0,
|
||||
DebugContext = 1<<1,
|
||||
AlphaBackground = 1<<2,
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub enum GHOST_DialogOptions
|
||||
{
|
||||
DialogWarning = 1<<0,
|
||||
DialogError = 1<<1,
|
||||
}
|
||||
|
||||
pub type DialogOptions = GHOST_DialogOptions;
|
||||
|
||||
#[repr(C)]
|
||||
pub enum GHOST_TSuccess
|
||||
{
|
||||
Failure = 0,
|
||||
Success,
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub enum GHOST_TTabletMode
|
||||
{
|
||||
None = 0,
|
||||
Stylus,
|
||||
Eraser,
|
||||
}
|
||||
|
||||
impl Default for GHOST_TTabletMode
|
||||
{
|
||||
#[inline]
|
||||
fn default() -> Self
|
||||
{
|
||||
Self::None
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#[repr(C)]
|
||||
pub enum GHOST_TTabletAPI
|
||||
{
|
||||
None = 0,
|
||||
Native,
|
||||
Wintab,
|
||||
}
|
||||
|
||||
impl Default for GHOST_TTabletAPI
|
||||
{
|
||||
#[inline]
|
||||
fn default() -> Self
|
||||
{
|
||||
Self::None
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#[repr(C)]
|
||||
pub struct GHOST_TabletData
|
||||
{
|
||||
pub active: GHOST_TTabletMode,
|
||||
pub pressure: f32,
|
||||
pub xtilt: f32,
|
||||
pub ytilt: f32,
|
||||
}
|
||||
|
||||
impl GHOST_TabletData
|
||||
{
|
||||
pub const fn none() -> Self{
|
||||
Self{active: GHOST_TTabletMode::None, pressure: 1.0, xtilt: 0.0, ytilt: 0.0}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for GHOST_TabletData
|
||||
{
|
||||
#[inline] fn default() -> Self
|
||||
{
|
||||
Self::none()
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub enum GHOST_TVisibility
|
||||
{
|
||||
Not =0,
|
||||
Partially,
|
||||
Fully,
|
||||
}
|
||||
|
||||
impl Default for GHOST_TVisibility
|
||||
{
|
||||
#[inline]
|
||||
fn default() -> Self
|
||||
{
|
||||
Self::Not
|
||||
}
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub enum GHOST_TFireTimeConstant
|
||||
{
|
||||
Never = 0xFFFFFFFF,
|
||||
}
|
||||
|
||||
|
||||
#[repr(C)]
|
||||
pub enum GHOST_TModifierKeyMask {
|
||||
LeftShift = 0,
|
||||
RightShift,
|
||||
LeftAlt,
|
||||
RightAlt,
|
||||
LeftControl,
|
||||
RightControl,
|
||||
OS,
|
||||
NumMasks
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub enum GHOST_TWindowState {
|
||||
Normal = 0,
|
||||
Maximized,
|
||||
Minimized,
|
||||
FullScreen,
|
||||
Embedded,
|
||||
// Modified,
|
||||
// UnModified,
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub enum GHOST_TWindowOrder
|
||||
{
|
||||
Top =0,
|
||||
Bottom,
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub enum GHOST_TDrawingContextType {
|
||||
None = 0,
|
||||
OpenGL,
|
||||
//D3D, //lol nope
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub enum GHOST_TButtonMask{
|
||||
Left = 0,
|
||||
Middle,
|
||||
Right,
|
||||
Button4,
|
||||
Button5,
|
||||
/* Trackballs and programmable buttons */
|
||||
Button6,
|
||||
Button7,
|
||||
NumMasks // Should we even keep this? I guess yeah for ABI compatability
|
||||
}
|
||||
|
||||
#[repr(C)]
|
||||
pub enum GHOST_TEventType {
|
||||
Unknown = 0,
|
||||
|
||||
CursorMove,
|
||||
ButtonDown,
|
||||
ButtonUp,
|
||||
Wheel,
|
||||
Trackpad,
|
||||
|
||||
//#ifdef WITH_INPUT_NDOF
|
||||
// NDOFMotion, /// N degree of freedom device motion event
|
||||
// NDOFButton, /// N degree of freedom device button event
|
||||
//#endif
|
||||
|
||||
KeyDown,
|
||||
KeyUp,
|
||||
// KeyAuto,
|
||||
|
||||
QuitRequest,
|
||||
|
||||
WindowClose,
|
||||
WindowActivate,
|
||||
WindowDeactivate,
|
||||
WindowUpdate,
|
||||
WindowSize,
|
||||
WindowMove,
|
||||
WindowDPIHintChanged,
|
||||
|
||||
DraggingEntered,
|
||||
DraggingUpdated,
|
||||
DraggingExited,
|
||||
DraggingDropDone,
|
||||
|
||||
OpenMainFile, // Needed for Cocoa to open double-clicked .blend file at startup
|
||||
NativeResolutionChange, // Needed for Cocoa when window moves to other display
|
||||
|
||||
Timer,
|
||||
|
||||
ImeCompositionStart,
|
||||
ImeComposition,
|
||||
ImeCompositionEnd,
|
||||
|
||||
NumEventTypes
|
||||
}
|
Loading…
Reference in new issue