Browse Source

Implement Drop for Console so printing doesn't crash after dropping

pull/10/head
AzureMarker 3 years ago
parent
commit
70ed800481
No known key found for this signature in database
GPG Key ID: 47A133F3BF9D03D3
  1. 25
      ctru-rs/src/console.rs

25
ctru-rs/src/console.rs

@ -13,13 +13,12 @@ impl Console {
/// previously (including other consoles). The new console is automatically selected for /// previously (including other consoles). The new console is automatically selected for
/// printing. /// printing.
pub fn init(screen: Screen) -> Self { pub fn init(screen: Screen) -> Self {
unsafe {
let mut context = Box::new(PrintConsole::default()); let mut context = Box::new(PrintConsole::default());
consoleInit(screen.into(), context.as_mut());
unsafe { consoleInit(screen.into(), context.as_mut()) };
Console { context } Console { context }
} }
}
/// Select this console as the current target for stdout /// Select this console as the current target for stdout
pub fn select(&self) { pub fn select(&self) {
@ -45,6 +44,26 @@ impl Console {
} }
} }
impl Drop for Console {
fn drop(&mut self) {
// Get the current console by replacing it with the default.
let default_console = unsafe { libctru::consoleGetDefault() };
let current_console = unsafe { libctru::consoleSelect(default_console) };
if std::ptr::eq(current_console, &*self.context) {
// Console dropped while selected. We just replaced it with the
// default so make sure it's initialized.
if unsafe { !(*default_console).consoleInitialised } {
unsafe { libctru::consoleInit(Screen::Top.into(), default_console) };
}
} else {
// Console dropped while a different console was selected. Put back
// the console that was selected.
unsafe { libctru::consoleSelect(current_console) };
}
}
}
impl Default for Console { impl Default for Console {
fn default() -> Self { fn default() -> Self {
Console::init(Screen::Top) Console::init(Screen::Top)

Loading…
Cancel
Save