From 2e6b2e79cb24b3aebb8c549fb910a840ec941d8e Mon Sep 17 00:00:00 2001 From: Andelf Date: Sun, 13 Apr 2014 11:20:45 +0800 Subject: [PATCH] add SDL_version APIs --- src/sdl2/lib.rs | 1 + src/sdl2/version.rs | 64 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/sdl2/version.rs diff --git a/src/sdl2/lib.rs b/src/sdl2/lib.rs index 96084215..bef5871d 100644 --- a/src/sdl2/lib.rs +++ b/src/sdl2/lib.rs @@ -31,3 +31,4 @@ pub mod render; pub mod rwops; pub mod sdl; pub mod audio; +pub mod version; diff --git a/src/sdl2/version.rs b/src/sdl2/version.rs new file mode 100644 index 00000000..511804b6 --- /dev/null +++ b/src/sdl2/version.rs @@ -0,0 +1,64 @@ +use std::fmt; +use std::mem; +use std::c_str::CString; + + +#[allow(non_camel_case_types)] +pub mod ll { + use libc::{uint8_t, c_char, c_int}; + pub struct SDL_version { + pub major: uint8_t, + pub minor: uint8_t, + pub patch: uint8_t, + } + extern "C" { + pub fn SDL_GetVersion(ver: *mut SDL_version); + pub fn SDL_GetRevision() -> *c_char; + pub fn SDL_GetRevisionNumber() -> c_int; + } +} + + +#[deriving(Eq, Clone)] +pub struct Version { + pub major: int, + pub minor: int, + pub patch: int, +} + +impl Version { + pub fn from_ll(sv: *ll::SDL_version) -> Version { + //! Converts a raw *SDL_version to Version + unsafe { + let v = *sv; + Version{ major: v.major as int, minor: v.minor as int, patch: v.patch as int } + } + } +} + +impl fmt::Show for Version { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f.buf, "{}.{}.{}", self.major, self.minor, self.patch) + } +} + +pub fn get_version() -> Version { + unsafe { + let mut cver = mem::init::(); + ll::SDL_GetVersion(&mut cver); + Version::from_ll(&cver) + } +} + +pub fn get_revision() -> ~str { + unsafe { + let ret = ll::SDL_GetRevision(); + CString::new(ret, false).as_str().unwrap().into_owned() + } +} + +pub fn get_revision_number() -> int { + unsafe { + ll::SDL_GetRevisionNumber() as int + } +}