Implement suspend with logind

This commit is contained in:
Jeremy Soller 2023-11-29 08:02:14 -07:00
parent 5d0999df83
commit 13e3dcd911
No known key found for this signature in database
GPG key ID: DCFCA852D3906975
5 changed files with 58 additions and 1 deletions

View file

@ -198,6 +198,7 @@ pub enum Message {
BackgroundState(cosmic_bg_config::state::State),
Prompt(String, bool, Option<String>),
Submit,
Suspend,
Error(String),
Exit,
}
@ -422,6 +423,21 @@ impl cosmic::Application for App {
},
None => log::warn!("tried to submit without prompt"),
},
Message::Suspend => {
#[cfg(feature = "logind")]
return Command::perform(
async move {
match crate::logind::suspend().await {
Ok(()) => message::none(),
Err(err) => {
log::error!("failed to suspend: {:?}", err);
message::app(Message::Error(err.to_string()))
}
}
},
|x| x,
);
}
Message::Error(error) => {
self.error_opt = Some(error);
}
@ -499,7 +515,7 @@ impl cosmic::Application for App {
.on_press(Message::None),
widget::button(widget::icon::from_name("system-suspend-symbolic"))
.padding(12.0)
.on_press(Message::None),
.on_press(Message::Suspend),
]
.padding([16.0, 0.0, 0.0, 0.0])
.spacing(8.0);

20
src/logind.rs Normal file
View file

@ -0,0 +1,20 @@
use logind_zbus::manager::ManagerProxy;
use zbus::{Connection, Result};
pub async fn power_off() -> Result<()> {
let connection = Connection::system().await?;
let manager = ManagerProxy::new(&connection).await?;
manager.reboot(false).await
}
pub async fn reboot() -> Result<()> {
let connection = Connection::system().await?;
let manager = ManagerProxy::new(&connection).await?;
manager.reboot(false).await
}
pub async fn suspend() -> Result<()> {
let connection = Connection::system().await?;
let manager = ManagerProxy::new(&connection).await?;
manager.suspend(false).await
}

View file

@ -5,6 +5,9 @@ mod greeter;
mod image_container;
mod locker;
#[cfg(feature = "logind")]
mod logind;
fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::init();