diff --git a/Cargo.toml b/Cargo.toml index 54b043e..0aa1ecf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ description = "A safe wrapper around smealum's ctrulib." license = "https://en.wikipedia.org/wiki/Zlib_License" links = "ctru" name = "ctru-rs" -version = "0.3.0" +version = "0.4.0" [dependencies.ctru-sys] path = "ctru-sys" diff --git a/src/console.rs b/src/console.rs index 0d0535a..123c067 100644 --- a/src/console.rs +++ b/src/console.rs @@ -1,17 +1,26 @@ -use libctru::console::{consoleInit, consoleClear}; -use libctru::gfx; +use libctru::console::*; use libctru::libc; +use gfx::Screen; + use core::fmt::{self, Write}; use core::default::Default; -use core::marker::PhantomData; use core::ptr; pub struct Console { - pd: PhantomData<()>, + context: PrintConsole, } impl Console { + pub fn init(screen: Screen) -> Self { + let ret = unsafe { *(consoleInit(screen.into(), ptr::null_mut())) }; + Console { context: ret } + } + + pub fn set_window(&mut self, x: i32, y: i32, width: i32, height: i32) { + unsafe { consoleSetWindow(&mut self.context, x, y, width, height) } + } + pub fn clear(&mut self) { unsafe { consoleClear() } } @@ -19,15 +28,14 @@ impl Console { impl Default for Console { fn default() -> Self { - unsafe { - consoleInit(gfx::gfxScreen_t::GFX_TOP, ptr::null_mut()); - } - Console { pd: PhantomData } + let ret = unsafe { *(consoleInit(Screen::Top.into(), ptr::null_mut())) }; + Console { context: ret } } } impl Write for Console { fn write_str(&mut self, s: &str) -> fmt::Result { + unsafe { consoleSelect(&mut self.context); } let ret = unsafe { libc::write(libc::STDOUT_FILENO, s.as_ptr() as *const _, s.len()) }; if ret == s.len() as isize { Ok(()) diff --git a/src/lib.rs b/src/lib.rs index 2bec58d..43d72a7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,12 +1,8 @@ -#![feature(lang_items, alloc, collections, macro_reexport, allow_internal_unstable)] +#![feature(lang_items)] #![no_std] #![crate_type = "rlib"] #![crate_name = "ctru"] -extern crate alloc; -#[macro_reexport(format, vec)] -extern crate collections; - extern crate ctru_sys as libctru; pub mod console; diff --git a/src/sdmc.rs b/src/sdmc.rs index 23a70ea..5e98552 100644 --- a/src/sdmc.rs +++ b/src/sdmc.rs @@ -7,7 +7,7 @@ pub struct Sdmc { } impl Sdmc { - pub fn new() -> Result { + pub fn new() -> Result { unsafe { let r = sdmcInit(); if r < 0 { diff --git a/src/services/apt.rs b/src/services/apt.rs index 8c891a6..612fdf7 100644 --- a/src/services/apt.rs +++ b/src/services/apt.rs @@ -51,14 +51,22 @@ impl From for AppStatus { } pub struct Apt { - pd: PhantomData<()>, + pd: PhantomData } impl Apt { - pub fn new() -> Apt { - Apt { pd: PhantomData } + pub fn new() -> Result { + unsafe { + let r = apt::aptInit(); + if r < 0 { + Err(r) + } else { + Ok(Apt { pd: PhantomData }) + } + } } + pub fn get_status(&self) -> AppStatus { unsafe { apt::aptGetStatus().into() } } @@ -88,3 +96,9 @@ impl Apt { } } } + +impl Drop for Apt { + fn drop(&mut self) { + unsafe { apt::aptExit() }; + } +} diff --git a/src/services/hid.rs b/src/services/hid.rs index 14dda12..a9e7954 100644 --- a/src/services/hid.rs +++ b/src/services/hid.rs @@ -74,12 +74,19 @@ impl From for u32 { } pub struct Hid { - pd: PhantomData<()>, + pd: PhantomData } impl Hid { - pub fn new() -> Hid { - Hid { pd: PhantomData } + pub fn new() -> Result { + unsafe { + let r = hid::hidInit(); + if r < 0 { + Err(r) + } else { + Ok(Hid { pd: PhantomData }) + } + } } pub fn scan_input(&mut self) { @@ -119,3 +126,9 @@ impl Hid { } } } + +impl Drop for Hid { + fn drop(&mut self) { + unsafe { hid::hidExit() }; + } +}