gardesk/gardm / 3042f28

Browse files

Respect default_session config in greeter

Authored by mfwolffe <wolffemf@dukes.jmu.edu>
SHA
3042f28fdae4800913bc654d2e2a2e3d0ed6a325
Parents
e3e3eea
Tree
9bb19e6

4 changed files

StatusFile+-
M gardm-greeter/src/main.rs 5 5
M gardm-greeter/src/widgets/session_selector.rs 8 3
M gardm-ipc/src/lib.rs 6 1
M gardmd/src/main.rs 10 5
gardm-greeter/src/main.rsmodified
@@ -130,11 +130,11 @@ async fn main() -> Result<()> {
130130
     tracing::info!("Connected to gardmd");
131131
 
132132
     // Fetch available sessions
133
-    let sessions = match client.request(&Request::ListSessions).await? {
134
-        Response::Sessions { sessions } => sessions,
135
-        _ => Vec::new(),
133
+    let (sessions, default_session) = match client.request(&Request::ListSessions).await? {
134
+        Response::Sessions { sessions, default_session } => (sessions, default_session),
135
+        _ => (Vec::new(), None),
136136
     };
137
-    tracing::debug!(?sessions, "Available sessions");
137
+    tracing::debug!(?sessions, ?default_session, "Available sessions");
138138
 
139139
     // Fetch available users
140140
     let users = match client.request(&Request::ListUsers).await? {
@@ -157,7 +157,7 @@ async fn main() -> Result<()> {
157157
     let selector_width = 200.0;
158158
     let selector_x = center_x - selector_width / 2.0;
159159
     let selector_y = center_y + 180.0; // Below the login form
160
-    let mut session_selector = SessionSelector::new(sessions, selector_x, selector_y, selector_width);
160
+    let mut session_selector = SessionSelector::new(sessions, selector_x, selector_y, selector_width, default_session.as_deref());
161161
 
162162
     // Create power buttons (bottom-right corner of primary monitor)
163163
     let mut power_buttons = PowerButtons::new(
gardm-greeter/src/widgets/session_selector.rsmodified
@@ -25,11 +25,16 @@ pub struct SessionSelector {
2525
 }
2626
 
2727
 impl SessionSelector {
28
-    /// Create a new session selector
29
-    pub fn new(sessions: Vec<SessionInfo>, x: f64, y: f64, width: f64) -> Self {
28
+    /// Create a new session selector with optional default session
29
+    pub fn new(sessions: Vec<SessionInfo>, x: f64, y: f64, width: f64, default_session: Option<&str>) -> Self {
30
+        // Find index of default session, or fall back to 0
31
+        let selected_index = default_session
32
+            .and_then(|default| sessions.iter().position(|s| s.id == default))
33
+            .unwrap_or(0);
34
+
3035
         Self {
3136
             sessions,
32
-            selected_index: 0,
37
+            selected_index,
3338
             expanded: false,
3439
             hovered_index: None,
3540
             x,
gardm-ipc/src/lib.rsmodified
@@ -81,7 +81,12 @@ pub enum Response {
8181
     Error { message: String },
8282
 
8383
     /// List of available sessions
84
-    Sessions { sessions: Vec<SessionInfo> },
84
+    Sessions {
85
+        sessions: Vec<SessionInfo>,
86
+        /// Default session ID from daemon config
87
+        #[serde(default)]
88
+        default_session: Option<String>,
89
+    },
8590
 
8691
     /// List of available users
8792
     Users { users: Vec<UserInfo> },
gardmd/src/main.rsmodified
@@ -166,7 +166,7 @@ async fn run_display_manager(args: Args, config: Config) -> Result<()> {
166166
 
167167
         // Handle greeter authentication
168168
         let session_result = tokio::select! {
169
-            result = handle_greeter_session(&server, &x_display) => result,
169
+            result = handle_greeter_session(&server, &x_display, &config.general.default_session) => result,
170170
             _ = sigterm.recv() => {
171171
                 tracing::info!("Received SIGTERM during greeter");
172172
                 break;
@@ -328,6 +328,7 @@ impl std::fmt::Debug for SessionStartInfo {
328328
 async fn handle_greeter_session(
329329
     server: &ipc::Server,
330330
     _display: &str,
331
+    default_session: &str,
331332
 ) -> Result<Option<SessionStartInfo>> {
332333
     let mut conn = server.accept().await?;
333334
     let mut auth = AuthSession::new();
@@ -338,7 +339,7 @@ async fn handle_greeter_session(
338339
             None => return Ok(None), // Greeter disconnected
339340
         };
340341
 
341
-        let (response, session_info) = handle_greeter_request(request, &mut auth).await;
342
+        let (response, session_info) = handle_greeter_request(request, &mut auth, default_session).await;
342343
 
343344
         tracing::debug!(?response, has_session_info = session_info.is_some(), "Sending response to greeter");
344345
         conn.send(&response).await?;
@@ -359,6 +360,7 @@ async fn handle_greeter_session(
359360
 async fn handle_greeter_request(
360361
     request: Request,
361362
     auth: &mut AuthSession,
363
+    default_session: &str,
362364
 ) -> (Response, Option<SessionStartInfo>) {
363365
     use gardmd::auth::AuthResponse;
364366
 
@@ -447,7 +449,10 @@ async fn handle_greeter_request(
447449
 
448450
         Request::ListSessions => {
449451
             let sessions = gardmd::list_sessions();
450
-            (Response::Sessions { sessions }, None)
452
+            (Response::Sessions {
453
+                sessions,
454
+                default_session: Some(default_session.to_string()),
455
+            }, None)
451456
         }
452457
 
453458
         Request::ListUsers => {
@@ -458,13 +463,13 @@ async fn handle_greeter_request(
458463
 }
459464
 
460465
 /// Handle a test mode client (same as before, for backwards compatibility)
461
-async fn handle_test_client(mut conn: ipc::ClientConnection, _config: Config) {
466
+async fn handle_test_client(mut conn: ipc::ClientConnection, config: Config) {
462467
     let mut auth = AuthSession::new();
463468
 
464469
     loop {
465470
         match conn.recv().await {
466471
             Ok(Some(request)) => {
467
-                let (response, _) = handle_greeter_request(request, &mut auth).await;
472
+                let (response, _) = handle_greeter_request(request, &mut auth, &config.general.default_session).await;
468473
                 if let Err(e) = conn.send(&response).await {
469474
                     tracing::error!("Failed to send response: {}", e);
470475
                     break;