Fixed terminal title showing program, WIP showing exe arguments

Mikayla Maki created

Change summary

crates/terminal/src/terminal.rs   | 57 +++++++++++++++++++-------------
crates/workspace/src/workspace.rs |  5 +-
2 files changed, 36 insertions(+), 26 deletions(-)

Detailed changes

crates/terminal/src/terminal.rs 🔗

@@ -537,16 +537,42 @@ impl Terminal {
             }
             AlacTermEvent::Wakeup => {
                 cx.emit(Event::Wakeup);
-                cx.notify();
+
+                if self.update_process_info() {
+                    cx.emit(Event::TitleChanged)
+                }
             }
             AlacTermEvent::ColorRequest(idx, fun_ptr) => {
                 self.events
                     .push_back(InternalEvent::ColorRequest(*idx, fun_ptr.clone()));
-                cx.notify(); //Immediately schedule a render to respond to the color request
             }
         }
     }
 
+    /// Update the cached process info, returns whether the Zed-relevant info has changed
+    fn update_process_info(&mut self) -> bool {
+        let mut pid = unsafe { libc::tcgetpgrp(self.shell_fd as i32) };
+        if pid < 0 {
+            pid = self.shell_pid as i32;
+        }
+
+        if let Some(process_info) = LocalProcessInfo::with_root_pid(pid as u32) {
+            let res = self
+                .foreground_process_info
+                .as_ref()
+                .map(|old_info| {
+                    process_info.cwd != old_info.cwd || process_info.name != old_info.name
+                })
+                .unwrap_or(true);
+
+            self.foreground_process_info = Some(process_info.clone());
+
+            res
+        } else {
+            false
+        }
+    }
+
     ///Takes events from Alacritty and translates them to behavior on this view
     fn process_terminal_event(
         &mut self,
@@ -680,7 +706,7 @@ impl Terminal {
         let mut terminal = if let Some(term) = term.try_lock_unfair() {
             term
         } else if self.last_synced.elapsed().as_secs_f32() > 0.25 {
-            term.lock_unfair()
+            term.lock_unfair() //It's been too long, force block
         } else if let None = self.sync_task {
             //Skip this frame
             let delay = cx.background().timer(Duration::from_millis(16));
@@ -701,24 +727,15 @@ impl Terminal {
             return;
         };
 
+        if self.update_process_info() {
+            cx.emit(Event::TitleChanged);
+        }
+
         //Note that the ordering of events matters for event processing
         while let Some(e) = self.events.pop_front() {
             self.process_terminal_event(&e, &mut terminal, cx)
         }
 
-        if let Some(process_info) = self.compute_process_info() {
-            let should_emit_title_changed = self
-                .foreground_process_info
-                .as_ref()
-                .map(|old_info| {
-                    process_info.cwd != old_info.cwd || process_info.name != old_info.name
-                })
-                .unwrap_or(true);
-            if should_emit_title_changed {
-                cx.emit(Event::TitleChanged)
-            }
-            self.foreground_process_info = Some(process_info.clone());
-        }
         self.last_content = Self::make_content(&terminal);
         self.last_synced = Instant::now();
     }
@@ -984,14 +1001,6 @@ impl Terminal {
             make_search_matches(&term, &searcher).collect()
         })
     }
-
-    fn compute_process_info(&self) -> Option<LocalProcessInfo> {
-        let mut pid = unsafe { libc::tcgetpgrp(self.shell_fd as i32) };
-        if pid < 0 {
-            pid = self.shell_pid as i32;
-        }
-        LocalProcessInfo::with_root_pid(pid as u32)
-    }
 }
 
 impl Drop for Terminal {

crates/workspace/src/workspace.rs 🔗

@@ -146,10 +146,11 @@ impl_internal_actions!(
 impl_actions!(workspace, [ToggleProjectOnline, ActivatePane]);
 
 pub fn init(app_state: Arc<AppState>, cx: &mut MutableAppContext) {
-    pane::init(cx);
-
+    // Initialize the program manager immediately
     cx.set_global(ProgramManager::new());
 
+    pane::init(cx);
+
     cx.add_global_action(open);
     cx.add_global_action({
         let app_state = Arc::downgrade(&app_state);