initial commit

master
Avril 4 years ago
commit 1f30071f6e
Signed by: flanchan
GPG Key ID: 284488987C31F630

3
.gitignore vendored

@ -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…
Cancel
Save