Fix runnables-related hickups (#8058)

Kirill Bulatov created

* never error on absent/empty runnables file
* always activate terminal tab on runnable (re)schedule

Release Notes:

- N/A

Change summary

crates/runnable/src/static_source.rs       | 2 +-
crates/terminal_view/src/terminal_panel.rs | 7 +++++++
2 files changed, 8 insertions(+), 1 deletion(-)

Detailed changes

crates/runnable/src/static_source.rs 🔗

@@ -79,7 +79,7 @@ impl<T: for<'a> Deserialize<'a> + PartialEq + 'static> TrackedFile<T> {
     ) -> Model<Self> {
         cx.new_model(move |cx| {
             cx.spawn(|tracked_file, mut cx| async move {
-                while let Some(new_contents) = tracker.next().await {
+                while let Some(new_contents) = tracker.next().await.filter(|s| !s.is_empty()) {
                     let Some(new_contents) = serde_json_lenient::from_str(&new_contents).log_err()
                     else {
                         continue;

crates/terminal_view/src/terminal_panel.rs 🔗

@@ -542,6 +542,13 @@ impl TerminalPanel {
             terminal_to_replace.set_terminal(new_terminal, cx);
         });
         self.activate_terminal_view(terminal_item_index, cx);
+        let task_workspace = self.workspace.clone();
+        cx.spawn(|_, mut cx| async move {
+            task_workspace
+                .update(&mut cx, |workspace, cx| workspace.focus_panel::<Self>(cx))
+                .ok()
+        })
+        .detach();
         Some(())
     }
 }