rust rewrite finished maybe?
This commit is contained in:
208
src/main.rs
208
src/main.rs
@@ -1,3 +1,209 @@
|
||||
use gdk;
|
||||
use gtk;
|
||||
use gtk::prelude::*;
|
||||
use libhandy;
|
||||
use lightdm;
|
||||
use lightdm::{GreeterExt, SessionExt, UserExt, UserListExt};
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
if gtk::init().is_err() {
|
||||
println!("failed to init GTK");
|
||||
return;
|
||||
}
|
||||
libhandy::Keypad::new(true, true);
|
||||
let builder = gtk::Builder::new_from_string(include_str!("../interface.ui"));
|
||||
let handler = Rc::new(RefCell::new(Handler::new()));
|
||||
{
|
||||
let mut handler_borrowed = handler.borrow_mut();
|
||||
handler_borrowed.get_objects(&builder);
|
||||
handler_borrowed.set_username();
|
||||
handler_borrowed.setup_greeter(handler.clone());
|
||||
handler_borrowed.setup_de_select(handler.clone());
|
||||
}
|
||||
let handler_builder_clone = handler.clone();
|
||||
builder.connect_signals(move |_, name| {
|
||||
let h_login_cb_clone = handler_builder_clone.clone();
|
||||
let h_backspace_clone = handler_builder_clone.clone();
|
||||
let h_de_popover_clone = handler_builder_clone.clone();
|
||||
match name {
|
||||
"on_destry" => Box::new(|_| {
|
||||
gtk::main_quit();
|
||||
None
|
||||
}),
|
||||
"login_cb" => Box::new(move |_| {
|
||||
let handler = h_login_cb_clone.borrow();
|
||||
let pin_entry = handler.pin_entry.as_ref().expect("no pin_entry");
|
||||
handler
|
||||
.greeter
|
||||
.as_ref()
|
||||
.expect("no greeter")
|
||||
.respond(&pin_entry.get_text())
|
||||
.ok();
|
||||
pin_entry.set_text("");
|
||||
None
|
||||
}),
|
||||
"backspace" => Box::new(move |_| {
|
||||
let handler = h_backspace_clone.borrow();
|
||||
let pin_entry = handler.pin_entry.as_ref().expect("no pin_entry");
|
||||
let length = pin_entry.get_length();
|
||||
if length <= 0 {
|
||||
return None;
|
||||
}
|
||||
pin_entry.delete_text(length - 1, Some(1));
|
||||
None
|
||||
}),
|
||||
"de_popover" => Box::new(move |_| {
|
||||
h_de_popover_clone
|
||||
.borrow()
|
||||
.de_select
|
||||
.as_ref()
|
||||
.expect("popover not found")
|
||||
.popup();
|
||||
None
|
||||
}),
|
||||
_ => panic!("unknown signal"),
|
||||
}
|
||||
});
|
||||
let window: gtk::Window = builder
|
||||
.get_object("greeter_window")
|
||||
.expect("window not found");
|
||||
{
|
||||
let display = gdk::Display::get_default().expect("cant get display");
|
||||
let monitor = display.get_monitor(0).expect("cant get monitor");
|
||||
let screen_size = monitor.get_geometry();
|
||||
window.set_size_request(screen_size.width, screen_size.height);
|
||||
let container: gtk::Box = builder.get_object("container").expect("cant get container");
|
||||
container.set_size_request(
|
||||
(screen_size.width as f32 * 0.8) as i32,
|
||||
(screen_size.height as f32 * 0.8) as i32,
|
||||
);
|
||||
let style = gtk::CssProvider::new();
|
||||
style
|
||||
.load_from_data(include_bytes!("../style.css"))
|
||||
.expect("failed to load style");
|
||||
gtk::StyleContext::add_provider_for_screen(
|
||||
&gdk::Screen::get_default().expect("cant get screen"),
|
||||
&style,
|
||||
gtk::STYLE_PROVIDER_PRIORITY_APPLICATION,
|
||||
);
|
||||
}
|
||||
window.show();
|
||||
gtk::main();
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
struct Handler {
|
||||
user: Option<String>,
|
||||
session: Option<String>,
|
||||
greeter: Option<lightdm::Greeter>,
|
||||
pin_entry: Option<gtk::EntryBuffer>,
|
||||
pmpt_label: Option<gtk::Label>,
|
||||
msg_label: Option<gtk::Label>,
|
||||
de_select: Option<gtk::Popover>,
|
||||
}
|
||||
|
||||
impl Handler {
|
||||
fn new() -> Self {
|
||||
Default::default()
|
||||
}
|
||||
fn get_objects(&mut self, builder: >k::Builder) {
|
||||
self.pin_entry = builder.get_object("entry_buffer");
|
||||
self.pmpt_label = builder.get_object("prompt_label");
|
||||
self.msg_label = builder.get_object("message_label");
|
||||
self.de_select = builder.get_object("de_select");
|
||||
}
|
||||
|
||||
fn set_username(&mut self) {
|
||||
if let Some(user_list) = lightdm::UserList::get_instance() {
|
||||
if let Some(name) = user_list.get_users().first().unwrap().get_name() {
|
||||
let name_str = Box::<str>::from(name);
|
||||
self.user = Some(String::from(name_str));
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
fn setup_greeter(&mut self, handler: Rc<RefCell<Self>>) {
|
||||
let greeter = lightdm::Greeter::new();
|
||||
let handler_auth_clone = handler.clone();
|
||||
greeter.connect_authentication_complete(move |greeter| {
|
||||
let handler_borrowed = handler_auth_clone.borrow();
|
||||
if greeter.get_is_authenticated() {
|
||||
greeter
|
||||
.start_session_sync(Some(&handler_borrowed.session.clone().unwrap()))
|
||||
.ok();
|
||||
} else {
|
||||
greeter
|
||||
.authenticate(Some(&handler_borrowed.user.clone().unwrap()))
|
||||
.ok();
|
||||
}
|
||||
});
|
||||
let handler_msg_clone = handler.clone();
|
||||
greeter.connect_show_message(move |_, msg, _| {
|
||||
handler_msg_clone
|
||||
.borrow_mut()
|
||||
.msg_label
|
||||
.as_ref()
|
||||
.expect("no msg label")
|
||||
.set_text(msg);
|
||||
});
|
||||
let handler_prmpt_clone = handler.clone();
|
||||
greeter.connect_show_prompt(move |_, msg, _| {
|
||||
handler_prmpt_clone
|
||||
.borrow_mut()
|
||||
.pmpt_label
|
||||
.as_ref()
|
||||
.expect("no msg label")
|
||||
.set_text(msg);
|
||||
});
|
||||
greeter.connect_to_daemon_sync().ok();
|
||||
greeter.authenticate(Some(&self.user.clone().unwrap())).ok();
|
||||
self.greeter = Some(greeter);
|
||||
}
|
||||
|
||||
fn setup_de_select(&self, handler: Rc<RefCell<Self>>) {
|
||||
{
|
||||
let mut handler_borrowed = handler.borrow_mut();
|
||||
let session = handler_borrowed
|
||||
.greeter
|
||||
.as_ref()
|
||||
.expect("wheres the greeter at")
|
||||
.get_default_session_hint()
|
||||
.expect("no default session");
|
||||
handler_borrowed.session = Some(String::from(session));
|
||||
}
|
||||
let first_handler = handler.clone();
|
||||
let vbox = gtk::BoxBuilder::new()
|
||||
.orientation(gtk::Orientation::Vertical)
|
||||
.visible(true)
|
||||
.build();
|
||||
let sessions_raw = lightdm::functions::get_sessions();
|
||||
let mut sessions = sessions_raw.iter().map(|s| {
|
||||
(
|
||||
String::from(s.get_name().expect("no name")),
|
||||
String::from(s.get_key().expect("no key")),
|
||||
)
|
||||
});
|
||||
let (name, key) = sessions.next().expect("no session");
|
||||
let first = gtk::RadioButtonBuilder::new().label(&name).build();
|
||||
first.connect_toggled(move |_| {
|
||||
first_handler.borrow_mut().session = Some(key.clone());
|
||||
});
|
||||
vbox.add(&first);
|
||||
for (name, key) in sessions {
|
||||
let handler_clone = handler.clone();
|
||||
let key_clone = key.clone();
|
||||
let rb = gtk::RadioButton::new_with_label_from_widget(&first, &name);
|
||||
rb.connect_toggled(move |_| {
|
||||
handler_clone.borrow_mut().session = Some(key.clone());
|
||||
});
|
||||
vbox.add(&rb);
|
||||
if self.session.clone().expect("session not found") == key_clone {
|
||||
rb.set_active(true);
|
||||
}
|
||||
}
|
||||
self.de_select.as_ref().expect("no de select").add(&vbox);
|
||||
vbox.show_all()
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user