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<()> {
130
     tracing::info!("Connected to gardmd");
130
     tracing::info!("Connected to gardmd");
131
 
131
 
132
     // Fetch available sessions
132
     // Fetch available sessions
133
-    let sessions = match client.request(&Request::ListSessions).await? {
133
+    let (sessions, default_session) = match client.request(&Request::ListSessions).await? {
134
-        Response::Sessions { sessions } => sessions,
134
+        Response::Sessions { sessions, default_session } => (sessions, default_session),
135
-        _ => Vec::new(),
135
+        _ => (Vec::new(), None),
136
     };
136
     };
137
-    tracing::debug!(?sessions, "Available sessions");
137
+    tracing::debug!(?sessions, ?default_session, "Available sessions");
138
 
138
 
139
     // Fetch available users
139
     // Fetch available users
140
     let users = match client.request(&Request::ListUsers).await? {
140
     let users = match client.request(&Request::ListUsers).await? {
@@ -157,7 +157,7 @@ async fn main() -> Result<()> {
157
     let selector_width = 200.0;
157
     let selector_width = 200.0;
158
     let selector_x = center_x - selector_width / 2.0;
158
     let selector_x = center_x - selector_width / 2.0;
159
     let selector_y = center_y + 180.0; // Below the login form
159
     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());
161
 
161
 
162
     // Create power buttons (bottom-right corner of primary monitor)
162
     // Create power buttons (bottom-right corner of primary monitor)
163
     let mut power_buttons = PowerButtons::new(
163
     let mut power_buttons = PowerButtons::new(
gardm-greeter/src/widgets/session_selector.rsmodified
@@ -25,11 +25,16 @@ pub struct SessionSelector {
25
 }
25
 }
26
 
26
 
27
 impl SessionSelector {
27
 impl SessionSelector {
28
-    /// Create a new session selector
28
+    /// Create a new session selector with optional default session
29
-    pub fn new(sessions: Vec<SessionInfo>, x: f64, y: f64, width: f64) -> Self {
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
+
30
         Self {
35
         Self {
31
             sessions,
36
             sessions,
32
-            selected_index: 0,
37
+            selected_index,
33
             expanded: false,
38
             expanded: false,
34
             hovered_index: None,
39
             hovered_index: None,
35
             x,
40
             x,
gardm-ipc/src/lib.rsmodified
@@ -81,7 +81,12 @@ pub enum Response {
81
     Error { message: String },
81
     Error { message: String },
82
 
82
 
83
     /// List of available sessions
83
     /// 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
+    },
85
 
90
 
86
     /// List of available users
91
     /// List of available users
87
     Users { users: Vec<UserInfo> },
92
     Users { users: Vec<UserInfo> },
gardmd/src/main.rsmodified
@@ -166,7 +166,7 @@ async fn run_display_manager(args: Args, config: Config) -> Result<()> {
166
 
166
 
167
         // Handle greeter authentication
167
         // Handle greeter authentication
168
         let session_result = tokio::select! {
168
         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,
170
             _ = sigterm.recv() => {
170
             _ = sigterm.recv() => {
171
                 tracing::info!("Received SIGTERM during greeter");
171
                 tracing::info!("Received SIGTERM during greeter");
172
                 break;
172
                 break;
@@ -328,6 +328,7 @@ impl std::fmt::Debug for SessionStartInfo {
328
 async fn handle_greeter_session(
328
 async fn handle_greeter_session(
329
     server: &ipc::Server,
329
     server: &ipc::Server,
330
     _display: &str,
330
     _display: &str,
331
+    default_session: &str,
331
 ) -> Result<Option<SessionStartInfo>> {
332
 ) -> Result<Option<SessionStartInfo>> {
332
     let mut conn = server.accept().await?;
333
     let mut conn = server.accept().await?;
333
     let mut auth = AuthSession::new();
334
     let mut auth = AuthSession::new();
@@ -338,7 +339,7 @@ async fn handle_greeter_session(
338
             None => return Ok(None), // Greeter disconnected
339
             None => return Ok(None), // Greeter disconnected
339
         };
340
         };
340
 
341
 
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;
342
 
343
 
343
         tracing::debug!(?response, has_session_info = session_info.is_some(), "Sending response to greeter");
344
         tracing::debug!(?response, has_session_info = session_info.is_some(), "Sending response to greeter");
344
         conn.send(&response).await?;
345
         conn.send(&response).await?;
@@ -359,6 +360,7 @@ async fn handle_greeter_session(
359
 async fn handle_greeter_request(
360
 async fn handle_greeter_request(
360
     request: Request,
361
     request: Request,
361
     auth: &mut AuthSession,
362
     auth: &mut AuthSession,
363
+    default_session: &str,
362
 ) -> (Response, Option<SessionStartInfo>) {
364
 ) -> (Response, Option<SessionStartInfo>) {
363
     use gardmd::auth::AuthResponse;
365
     use gardmd::auth::AuthResponse;
364
 
366
 
@@ -447,7 +449,10 @@ async fn handle_greeter_request(
447
 
449
 
448
         Request::ListSessions => {
450
         Request::ListSessions => {
449
             let sessions = gardmd::list_sessions();
451
             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)
451
         }
456
         }
452
 
457
 
453
         Request::ListUsers => {
458
         Request::ListUsers => {
@@ -458,13 +463,13 @@ async fn handle_greeter_request(
458
 }
463
 }
459
 
464
 
460
 /// Handle a test mode client (same as before, for backwards compatibility)
465
 /// 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) {
462
     let mut auth = AuthSession::new();
467
     let mut auth = AuthSession::new();
463
 
468
 
464
     loop {
469
     loop {
465
         match conn.recv().await {
470
         match conn.recv().await {
466
             Ok(Some(request)) => {
471
             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;
468
                 if let Err(e) = conn.send(&response).await {
473
                 if let Err(e) = conn.send(&response).await {
469
                     tracing::error!("Failed to send response: {}", e);
474
                     tracing::error!("Failed to send response: {}", e);
470
                     break;
475
                     break;