Compare commits
11 Commits
2999921e29
...
master
Author | SHA1 | Date | |
---|---|---|---|
8c8d6dfce6 | |||
e3872c0a69 | |||
3f3bb56290 | |||
34df640d5d | |||
e0beba1b89 | |||
e29ec82802 | |||
4c7a51cacc | |||
914e62493a | |||
c566c508ae | |||
b0db4805a8 | |||
e49db66883 |
4
Cargo.lock
generated
4
Cargo.lock
generated
@@ -362,7 +362,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "light-dm-sys"
|
name = "light-dm-sys"
|
||||||
version = "0.0.1"
|
version = "0.0.1"
|
||||||
source = "git+https://raatty.club:3000/raatty/lightdm-rs.git#a3c669583bb932e2b25372048b1e9dbda1f10e11"
|
source = "git+https://git.raatty.club/raatty/lightdm-rs.git#a3c669583bb932e2b25372048b1e9dbda1f10e11"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"gio-sys",
|
"gio-sys",
|
||||||
"glib-sys",
|
"glib-sys",
|
||||||
@@ -374,7 +374,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "lightdm"
|
name = "lightdm"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://raatty.club:3000/raatty/lightdm-rs.git#a3c669583bb932e2b25372048b1e9dbda1f10e11"
|
source = "git+https://git.raatty.club/raatty/lightdm-rs.git#a3c669583bb932e2b25372048b1e9dbda1f10e11"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"gio",
|
"gio",
|
||||||
"gio-sys",
|
"gio-sys",
|
||||||
|
@@ -9,9 +9,7 @@ edition = "2018"
|
|||||||
libhandy = "0.5.0"
|
libhandy = "0.5.0"
|
||||||
gdk = "0.12.1"
|
gdk = "0.12.1"
|
||||||
gtk = "0.8.1"
|
gtk = "0.8.1"
|
||||||
lightdm = { git = "https://raatty.club:3000/raatty/lightdm-rs.git"}
|
lightdm = { git = "https://git.raatty.club/raatty/lightdm-rs.git"}
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
codegen-units = 1
|
|
||||||
panic = "abort"
|
panic = "abort"
|
||||||
opt-level = "z"
|
|
8
Makefile
8
Makefile
@@ -3,7 +3,9 @@ BINDIR ?= $(PREFIX)/bin
|
|||||||
DATADIR ?= $(PREFIX)/share
|
DATADIR ?= $(PREFIX)/share
|
||||||
CONFDIR = /etc
|
CONFDIR = /etc
|
||||||
|
|
||||||
install:
|
target/release/lightdm-mobile-greeter: src/main.rs
|
||||||
RUSTFLAGS="-C link-arg=-s" cargo build --release
|
cargo build --release
|
||||||
|
build: target/release/lightdm-mobile-greeter
|
||||||
|
install: build
|
||||||
install -Dm755 target/release/lightdm-mobile-greeter -t $(DESTDIR)$(BINDIR)
|
install -Dm755 target/release/lightdm-mobile-greeter -t $(DESTDIR)$(BINDIR)
|
||||||
install -Dm644 lightdm-mobile-greeter.desktop -t $(DESTDIR)$(DATADIR)/xgreeters
|
install -Dm644 lightdm-mobile-greeter.desktop -t $(DESTDIR)$(DATADIR)/xgreeters
|
||||||
|
@@ -14,3 +14,6 @@ lightdm.conf
|
|||||||
greeter-session=lightdm-mobile-greeter
|
greeter-session=lightdm-mobile-greeter
|
||||||
user-session=<THE CHOSEN DE TO LAUNCH AFTER SUCCESSFUL LOGIN>
|
user-session=<THE CHOSEN DE TO LAUNCH AFTER SUCCESSFUL LOGIN>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Theming
|
||||||
|
If you have a file at `/etc/lightdm/lightdm_mobile_greeter.css` styling will be read from it falling back to the backed in styling, checkout style.css to get ideas on what to change
|
@@ -77,7 +77,10 @@
|
|||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="message_label">
|
<object class="GtkLabel" id="message_label">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="label"></property>
|
<property name="label"></property>
|
||||||
|
<style>
|
||||||
|
<class name="msg"/>
|
||||||
|
</style>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
85
src/main.rs
85
src/main.rs
@@ -5,7 +5,10 @@ use libhandy;
|
|||||||
use lightdm;
|
use lightdm;
|
||||||
use lightdm::{GreeterExt, SessionExt, UserExt, UserListExt};
|
use lightdm::{GreeterExt, SessionExt, UserExt, UserListExt};
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
|
use std::io::prelude::*;
|
||||||
|
use std::path::*;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
use std::{fs, io};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
if gtk::init().is_err() {
|
if gtk::init().is_err() {
|
||||||
@@ -22,6 +25,22 @@ fn main() {
|
|||||||
handler_borrowed.setup_greeter(handler.clone());
|
handler_borrowed.setup_greeter(handler.clone());
|
||||||
handler_borrowed.setup_de_select(handler.clone());
|
handler_borrowed.setup_de_select(handler.clone());
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
let handler_borrowed = handler.borrow();
|
||||||
|
if let Ok(os_str) = pretty_name() {
|
||||||
|
handler_borrowed
|
||||||
|
.msg_label
|
||||||
|
.as_ref()
|
||||||
|
.expect("no msg label")
|
||||||
|
.set_text(&os_str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
let handler_borrowed = handler.borrow();
|
||||||
|
let greeter = handler_borrowed.greeter.as_ref().expect("no greeter");
|
||||||
|
let user = handler_borrowed.user.as_ref().expect("no user");
|
||||||
|
greeter.authenticate(Some(&user)).ok();
|
||||||
|
}
|
||||||
let handler_builder_clone = handler.clone();
|
let handler_builder_clone = handler.clone();
|
||||||
builder.connect_signals(move |_, name| {
|
builder.connect_signals(move |_, name| {
|
||||||
let h_login_cb_clone = handler_builder_clone.clone();
|
let h_login_cb_clone = handler_builder_clone.clone();
|
||||||
@@ -80,14 +99,27 @@ fn main() {
|
|||||||
(screen_size.height as f32 * 0.8) as i32,
|
(screen_size.height as f32 * 0.8) as i32,
|
||||||
);
|
);
|
||||||
let style = gtk::CssProvider::new();
|
let style = gtk::CssProvider::new();
|
||||||
|
let screen = gdk::Screen::get_default().expect("cant get screen");
|
||||||
style
|
style
|
||||||
.load_from_data(include_bytes!("../style.css"))
|
.load_from_data(include_bytes!("../style.css"))
|
||||||
.expect("failed to load style");
|
.expect("failed to load style");
|
||||||
gtk::StyleContext::add_provider_for_screen(
|
gtk::StyleContext::add_provider_for_screen(
|
||||||
&gdk::Screen::get_default().expect("cant get screen"),
|
&screen,
|
||||||
&style,
|
&style,
|
||||||
gtk::STYLE_PROVIDER_PRIORITY_APPLICATION,
|
gtk::STYLE_PROVIDER_PRIORITY_APPLICATION,
|
||||||
);
|
);
|
||||||
|
let custom_conf = Path::new("/etc/lightdm/lightdm_mobile_greeter.css");
|
||||||
|
if custom_conf.exists() {
|
||||||
|
let style2 = gtk::CssProvider::new();
|
||||||
|
if let Some(path) = custom_conf.to_str() {
|
||||||
|
style2.load_from_path(path).expect("failed to load style2");
|
||||||
|
}
|
||||||
|
gtk::StyleContext::add_provider_for_screen(
|
||||||
|
&screen,
|
||||||
|
&style2,
|
||||||
|
gtk::STYLE_PROVIDER_PRIORITY_USER,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
window.show();
|
window.show();
|
||||||
gtk::main();
|
gtk::main();
|
||||||
@@ -142,7 +174,7 @@ impl Handler {
|
|||||||
let handler_msg_clone = handler.clone();
|
let handler_msg_clone = handler.clone();
|
||||||
greeter.connect_show_message(move |_, msg, _| {
|
greeter.connect_show_message(move |_, msg, _| {
|
||||||
handler_msg_clone
|
handler_msg_clone
|
||||||
.borrow_mut()
|
.borrow()
|
||||||
.msg_label
|
.msg_label
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.expect("no msg label")
|
.expect("no msg label")
|
||||||
@@ -151,29 +183,26 @@ impl Handler {
|
|||||||
let handler_prmpt_clone = handler.clone();
|
let handler_prmpt_clone = handler.clone();
|
||||||
greeter.connect_show_prompt(move |_, msg, _| {
|
greeter.connect_show_prompt(move |_, msg, _| {
|
||||||
handler_prmpt_clone
|
handler_prmpt_clone
|
||||||
.borrow_mut()
|
.borrow()
|
||||||
.pmpt_label
|
.pmpt_label
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.expect("no msg label")
|
.expect("no msg label")
|
||||||
.set_text(msg);
|
.set_text(msg);
|
||||||
});
|
});
|
||||||
greeter.connect_to_daemon_sync().ok();
|
greeter.connect_to_daemon_sync().ok();
|
||||||
greeter.authenticate(Some(&self.user.clone().unwrap())).ok();
|
|
||||||
self.greeter = Some(greeter);
|
self.greeter = Some(greeter);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup_de_select(&self, handler: Rc<RefCell<Self>>) {
|
fn setup_de_select(&mut self, handler: Rc<RefCell<Self>>) {
|
||||||
{
|
{
|
||||||
let mut handler_borrowed = handler.borrow_mut();
|
let session = self
|
||||||
let session = handler_borrowed
|
|
||||||
.greeter
|
.greeter
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.expect("wheres the greeter at")
|
.expect("wheres the greeter at")
|
||||||
.get_default_session_hint()
|
.get_default_session_hint()
|
||||||
.expect("no default session");
|
.expect("no default session");
|
||||||
handler_borrowed.session = Some(String::from(session));
|
self.session = Some(String::from(session));
|
||||||
}
|
}
|
||||||
let first_handler = handler.clone();
|
|
||||||
let vbox = gtk::BoxBuilder::new()
|
let vbox = gtk::BoxBuilder::new()
|
||||||
.orientation(gtk::Orientation::Vertical)
|
.orientation(gtk::Orientation::Vertical)
|
||||||
.visible(true)
|
.visible(true)
|
||||||
@@ -187,23 +216,47 @@ impl Handler {
|
|||||||
});
|
});
|
||||||
let (name, key) = sessions.next().expect("no session");
|
let (name, key) = sessions.next().expect("no session");
|
||||||
let first = gtk::RadioButtonBuilder::new().label(&name).build();
|
let first = gtk::RadioButtonBuilder::new().label(&name).build();
|
||||||
first.connect_toggled(move |_| {
|
let mut keys = Vec::new();
|
||||||
first_handler.borrow_mut().session = Some(key.clone());
|
let mut rbs = Vec::new();
|
||||||
});
|
keys.push(key);
|
||||||
|
rbs.push(first.clone());
|
||||||
vbox.add(&first);
|
vbox.add(&first);
|
||||||
for (name, key) in sessions {
|
for (name, key) in sessions {
|
||||||
let handler_clone = handler.clone();
|
|
||||||
let key_clone = key.clone();
|
let key_clone = key.clone();
|
||||||
let rb = gtk::RadioButton::new_with_label_from_widget(&first, &name);
|
let rb = gtk::RadioButton::new_with_label_from_widget(&first, &name);
|
||||||
rb.connect_toggled(move |_| {
|
keys.push(key);
|
||||||
handler_clone.borrow_mut().session = Some(key.clone());
|
rbs.push(rb.clone());
|
||||||
});
|
|
||||||
vbox.add(&rb);
|
vbox.add(&rb);
|
||||||
if self.session.clone().expect("session not found") == key_clone {
|
if self.session.clone().expect("session not found") == key_clone {
|
||||||
rb.set_active(true);
|
rb.set_active(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
let keys_iter = keys.iter();
|
||||||
|
for (rb, key) in rbs.iter().zip(keys_iter) {
|
||||||
|
let handler_clone = handler.clone();
|
||||||
|
let key_clone = key.clone();
|
||||||
|
rb.connect_toggled(move |_| {
|
||||||
|
handler_clone.borrow_mut().session = Some(key_clone.clone());
|
||||||
|
});
|
||||||
|
}
|
||||||
self.de_select.as_ref().expect("no de select").add(&vbox);
|
self.de_select.as_ref().expect("no de select").add(&vbox);
|
||||||
vbox.show_all()
|
vbox.show_all()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn pretty_name() -> Result<String, io::Error> {
|
||||||
|
let file = fs::File::open("/etc/os-release")?;
|
||||||
|
let contents = io::BufReader::new(file);
|
||||||
|
for line_opt in contents.lines() {
|
||||||
|
let line = line_opt?;
|
||||||
|
if line.starts_with("PRETTY_NAME=") {
|
||||||
|
if let Some(name) = line.split("=").skip(1).next() {
|
||||||
|
return Ok(name.trim_matches('"').to_string());
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(io::Error::new(
|
||||||
|
io::ErrorKind::NotFound,
|
||||||
|
"I tried my best :)",
|
||||||
|
))
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user