Improved greetd error handling
This commit is contained in:
parent
99439e4a56
commit
0d7624b76d
4 changed files with 46 additions and 36 deletions
|
|
@ -201,7 +201,7 @@ impl GreeterProxy {
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<(), Box<dyn Error>> {
|
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()?
|
let _conn = ConnectionBuilder::system()?
|
||||||
.name("com.system76.CosmicGreeter")?
|
.name("com.system76.CosmicGreeter")?
|
||||||
|
|
|
||||||
|
|
@ -289,7 +289,7 @@ async fn request_message(socket: Arc<UnixStream>, request: Request) -> Message {
|
||||||
description,
|
description,
|
||||||
} => {
|
} => {
|
||||||
//TODO: use error_type?
|
//TODO: use error_type?
|
||||||
return Message::Error(description);
|
return Message::Error(socket, description);
|
||||||
}
|
}
|
||||||
Response::Success => match request {
|
Response::Success => match request {
|
||||||
Request::CreateSession { .. } => {
|
Request::CreateSession { .. } => {
|
||||||
|
|
@ -305,8 +305,8 @@ async fn request_message(socket: Arc<UnixStream>, request: Request) -> Message {
|
||||||
return Message::Exit;
|
return Message::Exit;
|
||||||
}
|
}
|
||||||
Request::CancelSession => {
|
Request::CancelSession => {
|
||||||
//TODO: restart whole process
|
// Reconnect to socket
|
||||||
return Message::None;
|
return Message::Reconnect;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
@ -364,8 +364,9 @@ pub enum Message {
|
||||||
Username(Arc<UnixStream>, String),
|
Username(Arc<UnixStream>, String),
|
||||||
Auth(Arc<UnixStream>, Option<String>),
|
Auth(Arc<UnixStream>, Option<String>),
|
||||||
Login(Arc<UnixStream>),
|
Login(Arc<UnixStream>),
|
||||||
|
Error(Arc<UnixStream>, String),
|
||||||
|
Reconnect,
|
||||||
Suspend,
|
Suspend,
|
||||||
Error(String),
|
|
||||||
Exit,
|
Exit,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -482,8 +483,7 @@ impl cosmic::Application for App {
|
||||||
//TODO: determine default session?
|
//TODO: determine default session?
|
||||||
let selected_session = session_names.first().cloned().unwrap_or(String::new());
|
let selected_session = session_names.first().cloned().unwrap_or(String::new());
|
||||||
|
|
||||||
(
|
let mut app = App {
|
||||||
App {
|
|
||||||
core,
|
core,
|
||||||
flags,
|
flags,
|
||||||
surface_ids: HashMap::new(),
|
surface_ids: HashMap::new(),
|
||||||
|
|
@ -499,20 +499,9 @@ impl cosmic::Application for App {
|
||||||
session_names,
|
session_names,
|
||||||
selected_session,
|
selected_session,
|
||||||
error_opt: None,
|
error_opt: None,
|
||||||
},
|
};
|
||||||
Command::perform(
|
let command = app.update(Message::Reconnect);
|
||||||
async {
|
(app, command)
|
||||||
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,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Handle application events here.
|
/// Handle application events here.
|
||||||
|
|
@ -617,10 +606,7 @@ impl cosmic::Application for App {
|
||||||
match self.flags.user_datas.first().map(|x| x.name.clone()) {
|
match self.flags.user_datas.first().map(|x| x.name.clone()) {
|
||||||
Some(username) => {
|
Some(username) => {
|
||||||
let socket = socket.clone();
|
let socket = socket.clone();
|
||||||
return Command::perform(
|
return self.update(Message::Username(socket, username));
|
||||||
async { message::app(Message::Username(socket, username)) },
|
|
||||||
|x| x,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
None => {}
|
None => {}
|
||||||
}
|
}
|
||||||
|
|
@ -634,10 +620,14 @@ impl cosmic::Application for App {
|
||||||
Message::PowerInfo(power_info_opt) => {
|
Message::PowerInfo(power_info_opt) => {
|
||||||
self.power_info_opt = power_info_opt;
|
self.power_info_opt = power_info_opt;
|
||||||
}
|
}
|
||||||
Message::Prompt(prompt, secret, value) => {
|
Message::Prompt(prompt, secret, value_opt) => {
|
||||||
let prompt_was_none = self.prompt_opt.is_none();
|
let value_was_some = self
|
||||||
self.prompt_opt = Some((prompt, secret, value));
|
.prompt_opt
|
||||||
if prompt_was_none {
|
.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(surface_id) = self.active_surface_id_opt {
|
||||||
if let Some(text_input_id) = self.text_input_ids.get(&surface_id) {
|
if let Some(text_input_id) = self.text_input_ids.get(&surface_id) {
|
||||||
return widget::text_input::focus(text_input_id.clone());
|
return widget::text_input::focus(text_input_id.clone());
|
||||||
|
|
@ -650,6 +640,7 @@ impl cosmic::Application for App {
|
||||||
}
|
}
|
||||||
Message::Username(socket, username) => {
|
Message::Username(socket, username) => {
|
||||||
self.username_opt = Some(username.clone());
|
self.username_opt = Some(username.clone());
|
||||||
|
self.prompt_opt = None;
|
||||||
self.surface_images.clear();
|
self.surface_images.clear();
|
||||||
return Command::batch([
|
return Command::batch([
|
||||||
self.update_user_config(),
|
self.update_user_config(),
|
||||||
|
|
@ -657,9 +648,13 @@ impl cosmic::Application for App {
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
Message::Auth(socket, response) => {
|
Message::Auth(socket, response) => {
|
||||||
|
self.prompt_opt = None;
|
||||||
|
self.error_opt = None;
|
||||||
return request_command(socket, Request::PostAuthMessageResponse { response });
|
return request_command(socket, Request::PostAuthMessageResponse { response });
|
||||||
}
|
}
|
||||||
Message::Login(socket) => {
|
Message::Login(socket) => {
|
||||||
|
self.prompt_opt = None;
|
||||||
|
self.error_opt = None;
|
||||||
match self.flags.sessions.get(&self.selected_session).cloned() {
|
match self.flags.sessions.get(&self.selected_session).cloned() {
|
||||||
Some(cmd) => {
|
Some(cmd) => {
|
||||||
return request_command(
|
return request_command(
|
||||||
|
|
@ -673,24 +668,39 @@ impl cosmic::Application for App {
|
||||||
None => todo!("session {:?} not found", self.selected_session),
|
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 => {
|
Message::Suspend => {
|
||||||
#[cfg(feature = "logind")]
|
#[cfg(feature = "logind")]
|
||||||
return Command::perform(
|
return Command::perform(
|
||||||
async move {
|
async move {
|
||||||
match crate::logind::suspend().await {
|
match crate::logind::suspend().await {
|
||||||
Ok(()) => message::none(),
|
Ok(()) => (),
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
log::error!("failed to suspend: {:?}", err);
|
log::error!("failed to suspend: {:?}", err);
|
||||||
message::app(Message::Error(err.to_string()))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
message::none()
|
||||||
},
|
},
|
||||||
|x| x,
|
|x| x,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Message::Error(error) => {
|
|
||||||
self.error_opt = Some(error);
|
|
||||||
}
|
|
||||||
Message::Exit => {
|
Message::Exit => {
|
||||||
let mut commands = Vec::new();
|
let mut commands = Vec::new();
|
||||||
for (_output, surface_id) in self.surface_ids.drain() {
|
for (_output, surface_id) in self.surface_ids.drain() {
|
||||||
|
|
|
||||||
|
|
@ -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_core::{Clipboard, Element, Layout, Length, Rectangle, Shell, Widget};
|
||||||
use cosmic::iced_renderer::core::widget::OperationOutputWrapper;
|
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>
|
pub struct ImageContainer<'a, Message, Renderer>
|
||||||
where
|
where
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ mod networkmanager;
|
||||||
mod upower;
|
mod upower;
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
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() {
|
match pwd::Passwd::current_user() {
|
||||||
Some(current_user) => match current_user.name.as_str() {
|
Some(current_user) => match current_user.name.as_str() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue