-
Notifications
You must be signed in to change notification settings - Fork 18
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implement low hanging apt sleep/homemenu functions and chainloader #161
Changes from all commits
c95cd26
4f3562b
cc2e535
e2364ff
66e5a54
0c55e1e
f780bce
e6dddff
80853b2
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -82,6 +82,48 @@ impl Apt { | |
Ok(()) | ||
} | ||
} | ||
|
||
/// Set if the console is allowed to enter sleep mode. | ||
/// | ||
/// You can check whether the console is allowed to sleep with [Apt::is_sleep_allowed]. | ||
#[doc(alias = "aptSetSleepAllowed")] | ||
pub fn set_sleep_allowed(&mut self, allowed: bool) { | ||
unsafe { | ||
ctru_sys::aptSetSleepAllowed(allowed); | ||
} | ||
} | ||
|
||
/// Check if the console is allowed to enter sleep mode. | ||
/// | ||
/// You can set whether the console is allowed to sleep with [Apt::set_sleep_allowed]. | ||
#[doc(alias = "aptIsSleepAllowed")] | ||
pub fn is_sleep_allowed(&self) -> bool { | ||
unsafe { ctru_sys::aptIsSleepAllowed() } | ||
} | ||
|
||
/// Set if the console is allowed to enter the home menu. | ||
/// | ||
/// You can check whether the console is allowed to enter the home menu with [Apt::is_home_allowed]. | ||
#[doc(alias = "aptSetHomeAllowed")] | ||
pub fn set_home_allowed(&mut self, allowed: bool) { | ||
unsafe { | ||
ctru_sys::aptSetHomeAllowed(allowed); | ||
} | ||
} | ||
|
||
/// Check if the console is allowed to enter the home menu. | ||
/// | ||
/// You can set whether the console is allowed to enter the home menu with [Apt::set_home_allowed]. | ||
#[doc(alias = "aptIsHomeAllowed")] | ||
pub fn is_home_allowed(&self) -> bool { | ||
unsafe { ctru_sys::aptIsHomeAllowed() } | ||
} | ||
|
||
/// Immediately jumps to the home menu. | ||
#[doc(alias = "aptJumpToHomeMenu")] | ||
pub fn jump_to_home_menu(&mut self) { | ||
unsafe { ctru_sys::aptJumpToHomeMenu() } | ||
} | ||
} | ||
|
||
impl Drop for Apt { | ||
|
@@ -90,3 +132,48 @@ impl Drop for Apt { | |
unsafe { ctru_sys::aptExit() }; | ||
} | ||
} | ||
|
||
/// Can launch other applications when the current one exits. | ||
pub struct Chainloader<'a> { | ||
_apt: &'a Apt, | ||
} | ||
|
||
impl<'a> Chainloader<'a> { | ||
/// Gets a handle to the chainloader | ||
pub fn new(apt: &'a Apt) -> Self { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe Tell me what you think. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i tried this, but then using it inside the main There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah I know, that’s exactly what I was thinking would happen. It’s not an issue as long as all of the chainloader code is only accessible from here. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. these are the only chainloader functions, so i think it's fine to have it be this way |
||
Self { _apt: apt } | ||
} | ||
|
||
/// Checks if the chainloader is set | ||
#[doc(alias = "aptIsChainload")] | ||
pub fn is_set(&self) -> bool { | ||
// static funtion not exported | ||
unsafe { (ctru_sys::envGetSystemRunFlags() & ctru_sys::RUNFLAG_APTCHAINLOAD) != 0 } | ||
} | ||
|
||
/// Clears the chainloader state. | ||
#[doc(alias = "aptClearChainloader")] | ||
pub fn clear(&mut self) { | ||
unsafe { ctru_sys::aptClearChainloader() } | ||
} | ||
|
||
/// Configures the chainloader to launch a specific application. | ||
/// | ||
/// See also [`Title`](crate::services::am::Title] | ||
#[doc(alias = "aptSetChainloader")] | ||
pub fn set(&mut self, title: &super::am::Title<'_>) { | ||
unsafe { ctru_sys::aptSetChainloader(title.id(), title.media_type() as u8) } | ||
} | ||
|
||
/// Configures the chainloader to launch the previous application. | ||
#[doc(alias = "aptSetChainloaderToCaller")] | ||
pub fn set_to_caller(&mut self) { | ||
unsafe { ctru_sys::aptSetChainloaderToCaller() } | ||
} | ||
|
||
/// Configures the chainloader to relaunch the current application (i.e. soft-reset) | ||
#[doc(alias = "aptSetChainloaderToSelf")] | ||
pub fn set_to_self(&mut self) { | ||
unsafe { ctru_sys::aptSetChainloaderToSelf() } | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Chainloader
should clear onDrop
, so that leftovers from previous usages won't influence in un-mutable environments.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i did think about this, but then forgot to propose it.
the problem is that the destructor will run when you exit the app, as the chainloader goes out of scope.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah right, didn’t think about it.
Wait, does this mean the setup only works because there is a reference to
Apt
that doesn’t get uninitialised? (The one made in libctru, i mean). If this were to not work without that (because the apt service were to be unused) then we must find a way around this.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
at a first look it definitely looks that way.