Improved greetd error handling

This commit is contained in:
Jeremy Soller 2024-02-22 20:51:05 -07:00
parent 99439e4a56
commit 0d7624b76d
4 changed files with 46 additions and 36 deletions

View file

@ -201,7 +201,7 @@ impl GreeterProxy {
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
env_logger::init();
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("warn")).init();
let _conn = ConnectionBuilder::system()?
.name("com.system76.CosmicGreeter")?

View file

@ -289,7 +289,7 @@ async fn request_message(socket: Arc<UnixStream>, request: Request) -> Message {
description,
} => {
//TODO: use error_type?
return Message::Error(description);
return Message::Error(socket, description);
}
Response::Success => match request {
Request::CreateSession { .. } => {
@ -305,8 +305,8 @@ async fn request_message(socket: Arc<UnixStream>, request: Request) -> Message {
return Message::Exit;
}
Request::CancelSession => {
//TODO: restart whole process
return Message::None;
// Reconnect to socket
return Message::Reconnect;
}
},
}
@ -364,8 +364,9 @@ pub enum Message {
Username(Arc<UnixStream>, String),
Auth(Arc<UnixStream>, Option<String>),
Login(Arc<UnixStream>),
Error(Arc<UnixStream>, String),
Reconnect,
Suspend,
Error(String),
Exit,
}
@ -482,8 +483,7 @@ impl cosmic::Application for App {
//TODO: determine default session?
let selected_session = session_names.first().cloned().unwrap_or(String::new());
(
App {
let mut app = App {
core,
flags,
surface_ids: HashMap::new(),
@ -499,20 +499,9 @@ impl cosmic::Application for App {
session_names,
selected_session,
error_opt: None,
},
Command::perform(
async {
message::app(Message::Socket(match env::var_os("GREETD_SOCK") {
Some(socket_path) => match UnixStream::connect(&socket_path).await {
Ok(socket) => SocketState::Open(Arc::new(socket)),
Err(err) => SocketState::Error(Arc::new(err)),
},
None => SocketState::NotSet,
}))
},
|x| x,
),
)
};
let command = app.update(Message::Reconnect);
(app, command)
}
/// Handle application events here.
@ -617,10 +606,7 @@ impl cosmic::Application for App {
match self.flags.user_datas.first().map(|x| x.name.clone()) {
Some(username) => {
let socket = socket.clone();
return Command::perform(
async { message::app(Message::Username(socket, username)) },
|x| x,
);
return self.update(Message::Username(socket, username));
}
None => {}
}
@ -634,10 +620,14 @@ impl cosmic::Application for App {
Message::PowerInfo(power_info_opt) => {
self.power_info_opt = power_info_opt;
}
Message::Prompt(prompt, secret, value) => {
let prompt_was_none = self.prompt_opt.is_none();
self.prompt_opt = Some((prompt, secret, value));
if prompt_was_none {
Message::Prompt(prompt, secret, value_opt) => {
let value_was_some = self
.prompt_opt
.as_ref()
.map_or(false, |(_, _, x)| x.is_some());
let value_is_some = value_opt.is_some();
self.prompt_opt = Some((prompt, secret, value_opt));
if value_is_some && !value_was_some {
if let Some(surface_id) = self.active_surface_id_opt {
if let Some(text_input_id) = self.text_input_ids.get(&surface_id) {
return widget::text_input::focus(text_input_id.clone());
@ -650,6 +640,7 @@ impl cosmic::Application for App {
}
Message::Username(socket, username) => {
self.username_opt = Some(username.clone());
self.prompt_opt = None;
self.surface_images.clear();
return Command::batch([
self.update_user_config(),
@ -657,9 +648,13 @@ impl cosmic::Application for App {
]);
}
Message::Auth(socket, response) => {
self.prompt_opt = None;
self.error_opt = None;
return request_command(socket, Request::PostAuthMessageResponse { response });
}
Message::Login(socket) => {
self.prompt_opt = None;
self.error_opt = None;
match self.flags.sessions.get(&self.selected_session).cloned() {
Some(cmd) => {
return request_command(
@ -673,24 +668,39 @@ impl cosmic::Application for App {
None => todo!("session {:?} not found", self.selected_session),
}
}
Message::Error(socket, error) => {
self.error_opt = Some(error);
return request_command(socket, Request::CancelSession);
}
Message::Reconnect => {
return Command::perform(
async {
message::app(Message::Socket(match env::var_os("GREETD_SOCK") {
Some(socket_path) => match UnixStream::connect(&socket_path).await {
Ok(socket) => SocketState::Open(Arc::new(socket)),
Err(err) => SocketState::Error(Arc::new(err)),
},
None => SocketState::NotSet,
}))
},
|x| x,
);
}
Message::Suspend => {
#[cfg(feature = "logind")]
return Command::perform(
async move {
match crate::logind::suspend().await {
Ok(()) => message::none(),
Ok(()) => (),
Err(err) => {
log::error!("failed to suspend: {:?}", err);
message::app(Message::Error(err.to_string()))
}
}
message::none()
},
|x| x,
);
}
Message::Error(error) => {
self.error_opt = Some(error);
}
Message::Exit => {
let mut commands = Vec::new();
for (_output, surface_id) in self.surface_ids.drain() {

View file

@ -12,7 +12,7 @@ use cosmic::iced_core::widget::{Operation, Tree};
use cosmic::iced_core::{Clipboard, Element, Layout, Length, Rectangle, Shell, Widget};
use cosmic::iced_renderer::core::widget::OperationOutputWrapper;
pub use cosmic::iced_style::container::{Appearance, StyleSheet};
pub use cosmic::iced_style::container::StyleSheet;
pub struct ImageContainer<'a, Message, Renderer>
where

View file

@ -15,7 +15,7 @@ mod networkmanager;
mod upower;
fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::init();
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("warn")).init();
match pwd::Passwd::current_user() {
Some(current_user) => match current_user.name.as_str() {