git.lucas.co / cce-display-manager
login greeter
git clone https://git.lucas.co/cce-display-manager.git

commit87b6dca7a7782f59b025dd6cc01ddd39b6470561
parent4ee7a87547
authorLucas Galante <[email protected]>
date2026-05-28 23:47
Implement remembering last login username and auto-focusing password box if username is prepopulated

 src/main.rs | 31 +++++++++++++++++++++++++++++--
 1 file changed, 29 insertions(+), 2 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index 14d90b1..d7c3ac4 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -513,8 +513,20 @@ impl State {
 
         let info_buffer = make_text_buffer(&mut font_system, "Press Tab to switch fields • Session selector: Click current session label", 11.0);
 
-        // Prepopulate username if environment has USER
-        let current_user = std::env::var("USER").unwrap_or_else(|_| "clear".to_string());
+        // Prepopulate username from last_user file if it exists
+        let last_user_path = "/var/lib/clear-display-manager/last_user";
+        let current_user = if std::path::Path::new(last_user_path).exists() {
+            std::fs::read_to_string(last_user_path)
+                .map(|s| s.trim().to_string())
+                .unwrap_or_else(|_| String::new())
+        } else {
+            let env_user = std::env::var("USER").unwrap_or_else(|_| String::new());
+            if env_user == "root" || env_user == "clear-display-manager" {
+                String::new()
+            } else {
+                env_user
+            }
+        };
 
         let bg = ContentBg::new();
         let card = LoginCard::new();
@@ -565,6 +577,11 @@ impl State {
         };
 
         state.apply_layout();
+        if state.username_box.text.is_empty() {
+            state.username_box.focus();
+        } else {
+            state.password_box.focus();
+        }
         state.upload_vertices();
         state
     }
@@ -1621,6 +1638,8 @@ fn run_daemon() {
             .arg("--greeter")
             .env("XDG_RUNTIME_DIR", runtime_dir)
             .env("LIBSEAT_BACKEND", "seatd")
+            .env("WLR_DRM_NO_MODIFIERS", "1")
+            .env("WLR_DRM_DEVICES", "/dev/dri/card1:/dev/dri/card0")
             .stdout(std::process::Stdio::piped())
             .spawn()
             .expect("failed to spawn cage compositor wrapper. Is cage installed?");
@@ -1662,6 +1681,14 @@ fn run_daemon() {
         }
 
         if let Some((username, exec, is_wayland, password)) = auth_success {
+            // Write last logged-in user to persistent file
+            let var_lib = "/var/lib/clear-display-manager";
+            if let Err(e) = std::fs::create_dir_all(var_lib) {
+                eprintln!("[clear-display-manager] Failed to create var lib dir: {:?}", e);
+            } else if let Err(e) = std::fs::write(format!("{}/last_user", var_lib), &username) {
+                eprintln!("[clear-display-manager] Failed to write last_user file: {:?}", e);
+            }
+
             println!("[clear-display-manager] Launching user session Exec: '{}' (Wayland: {}) for user: '{}'", exec, is_wayland, username);
             
             let service = "clear-display-manager";