public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/blackbox-terminal] f43: Update to version 0.15.2
@ 2026-07-01 19:18 Carl George
  0 siblings, 0 replies; only message in thread
From: Carl George @ 2026-07-01 19:18 UTC (permalink / raw)
  To: git-commits

            A new commit has been pushed.

            Repo   : rpms/blackbox-terminal
            Branch : f43
            Commit : 1453c486f974eeb655556559f63b8a8e01b7bbe3
            Author : Carl George <carlwgeorge@gmail.com>
            Date   : 2026-07-01T12:25:24-05:00
            Stats  : +2078/-2 in 3 file(s)
            URL    : https://src.fedoraproject.org/rpms/blackbox-terminal/c/1453c486f974eeb655556559f63b8a8e01b7bbe3?branch=f43

            Log:
            Update to version 0.15.2

... rhbz#2487427
- Add nautilus extension subpackage
- Fix bug with new tabs losing working directory

---
diff --git a/0001-Implement-last-known-cwd.patch b/0001-Implement-last-known-cwd.patch
new file mode 100644
index 0000000..9e25b55
--- /dev/null
+++ b/0001-Implement-last-known-cwd.patch
@@ -0,0 +1,2057 @@
+From 0db67cdce075a4d47ee5602c1755abd5856fce72 Mon Sep 17 00:00:00 2001
+From: Paulo Queiroz <14739-raggesilver@users.noreply.gitlab.gnome.org>
+Date: Thu, 11 Jun 2026 18:33:13 -0300
+Subject: [PATCH] Implement last known cwd
+
+(cherry picked from commit 7182d6da8ddbd925db001b30ed6b3b00927dd7f5)
+---
+ src/widgets/Terminal.vala | 381 ++++++++++---------
+ src/widgets/Window.vala   | 747 +++++++++++++++++++-------------------
+ 2 files changed, 569 insertions(+), 559 deletions(-)
+
+diff --git a/src/widgets/Terminal.vala b/src/widgets/Terminal.vala
+index 9f5d8dd..6402cc5 100644
+--- a/src/widgets/Terminal.vala
++++ b/src/widgets/Terminal.vala
+@@ -19,7 +19,6 @@
+  */
+ 
+ public class Terminal.Terminal : Vte.Terminal {
+-
+   /**
+    * List of available drop targets for Terminal
+    */
+@@ -32,9 +31,9 @@ public class Terminal.Terminal : Vte.Terminal {
+   static string[] blackbox_envv = {
+     "TERM=xterm-256color",
+     "COLORTERM=truecolor",
+-    "TERM_PROGRAM=%s".printf (APP_NAME),
+-    "BLACKBOX_THEMES_DIR=%s".printf (Constants.get_user_schemes_dir ()),
+-    "VTE_VERSION=%u".printf (
++    "TERM_PROGRAM=%s".printf(APP_NAME),
++    "BLACKBOX_THEMES_DIR=%s".printf(Constants.get_user_schemes_dir()),
++    "VTE_VERSION=%u".printf(
+       Vte.MAJOR_VERSION * 10000 + Vte.MINOR_VERSION * 100 + Vte.MICRO_VERSION
+     )
+   };
+@@ -45,18 +44,18 @@ public class Terminal.Terminal : Vte.Terminal {
+    * This signal is emitted when the terminal process exits. Something should
+    * listen for this signal and close the tab that contains this terminal.
+    */
+-  public signal void exit ();
++  public signal void exit();
+ 
+-  public signal void spawn_failed (string? error_message);
++  public signal void spawn_failed(string? error_message);
+ 
+-  public signal void context_changed (ProcessContext context);
++  public signal void context_changed(ProcessContext context);
+ 
+   // Properties
+ 
+-  public Scheme           scheme  { get; set; }
+-  public Pid              pid     { get; protected set; default = -1; }
+-  public Process?         process { get; protected set; default = null; }
+-  public uint             id      { get; private set; }
++  public Scheme   scheme  { get; set; }
++  public Pid      pid     { get; protected set; default = -1; }
++  public Process? process { get; protected set; default = null; }
++  public uint     id      { get; private set; }
+ 
+   public bool needs_attention {
+     get;
+@@ -66,31 +65,31 @@ public class Terminal.Terminal : Vte.Terminal {
+ 
+   public uint user_scrollback_lines {
+     get {
+-      var settings = Settings.get_default ();
++      var settings = Settings.get_default();
+ 
+       switch (settings.scrollback_mode) {
+         case ScrollbackMode.FIXED:     return settings.scrollback_lines;
+         case ScrollbackMode.UNLIMITED: return -1;
+         case ScrollbackMode.DISABLED:  return 0;
+         default:
+-          error ("Invalid scrollback-mode %u", settings.scrollback_mode);
++          error("Invalid scrollback-mode %u", settings.scrollback_mode);
+       }
+     }
+   }
+ 
+   // Fields
+ 
+-  public  Window            window;
+-  private uint              original_scrollback_lines;
+-private static uint       next_id = 0;
+-  private uint              attention_timer = 0;
++  public Window window;
++  private uint  original_scrollback_lines;
++  private static uint next_id = 0;
++  private uint attention_timer = 0;
+ 
+   // FIXME: either get rid of this field, or stop creating a local copy of
+   // settings every time we need to use it
+   private Settings settings;
+ 
+   public Terminal (Window window, string? command = null, string? cwd = null) {
+-    Object (
++    Object(
+       allow_hyperlink: true,
+       receives_default: true,
+       scroll_unit_is_pixels: true
+@@ -107,119 +106,117 @@ private static uint       next_id = 0;
+     this.halign = Gtk.Align.FILL;
+     this.valign = Gtk.Align.FILL;
+ 
+-    this.child_exited.connect (this.on_child_exited);
++    this.child_exited.connect(this.on_child_exited);
+ 
+-    this.settings = Settings.get_default ();
+-    ThemeProvider.get_default ().notify ["current-theme"].connect (this.on_theme_changed);
+-    this.settings.notify["font"].connect (this.on_font_changed);
+-    this.settings.notify["terminal-padding"].connect (this.on_padding_changed);
+-    this.settings.notify["opacity"].connect (this.on_theme_changed);
++    this.settings = Settings.get_default();
++    ThemeProvider.get_default().notify["current-theme"].connect(
++      this.on_theme_changed);
++    this.settings.notify["font"].connect(this.on_font_changed);
++    this.settings.notify["terminal-padding"].connect(this.on_padding_changed);
++    this.settings.notify["opacity"].connect(this.on_theme_changed);
+ 
+-    this.setup_drag_drop ();
+-    this.setup_regexes ();
+-    this.connect_signals ();
+-    this.bind_data ();
+-    this.on_theme_changed ();
+-    this.on_font_changed ();
+-    this.on_padding_changed ();
++    this.setup_drag_drop();
++    this.setup_regexes();
++    this.connect_signals();
++    this.bind_data();
++    this.on_theme_changed();
++    this.on_font_changed();
++    this.on_padding_changed();
+ 
+     try {
+-      this.spawn (command, cwd);
+-    }
+-    catch (Error e) {
+-      warning ("%s", e.message);
++      this.spawn(command, cwd);
++    } catch (Error e) {
++      warning("%s", e.message);
+     }
+   }
+ 
+ #if BLACKBOX_DEBUG_MEMORY
+   ~Terminal () {
+-    message ("Terminal destroyed");
++    message("Terminal destroyed");
+   }
++
+ #endif
+ 
+   public override void dispose() {
+ #if BLACKBOX_DEBUG_MEMORY
+-    message ("Terminal dispose");
++    message("Terminal dispose");
+ #endif
+-    base.dispose ();
++    base.dispose();
+   }
+ 
+   // Methods ===================================================================
+ 
+-  private void setup_drag_drop () {
+-    var target = new Gtk.DropTarget (Type.INVALID, Gdk.DragAction.COPY);
++  private void setup_drag_drop() {
++    var target = new Gtk.DropTarget(Type.INVALID, Gdk.DragAction.COPY);
+ 
+-    target.set_gtypes ({
++    target.set_gtypes({
+       typeof (Gdk.FileList),
+       typeof (GLib.File),
+       typeof (string),
+     });
+ 
+-    target.drop.connect (this.on_drag_data_received);
++    target.drop.connect(this.on_drag_data_received);
+ 
+-    this.add_controller (target);
++    this.add_controller(target);
+   }
+ 
+-  private bool on_drag_data_received (
++  private bool on_drag_data_received(
+     Gtk.DropTarget target,
+     Value value,
+     double x,
+     double y
+   ) {
+-    var vtype = value.type ();
++    var vtype = value.type();
+ 
+     if (vtype == typeof (Gdk.FileList)) {
+-      var list = (Gdk.FileList) value.get_boxed ();
++      var list = (Gdk.FileList) value.get_boxed();
+ 
+-      foreach (unowned GLib.File file in list.get_files ()) {
+-        this.feed_child (Shell.quote (file.get_path ()).data);
+-        this.feed_child (" ".data);
++      foreach (unowned GLib.File file in list.get_files()) {
++        this.feed_child(Shell.quote(file.get_path()).data);
++        this.feed_child(" ".data);
+       }
+ 
+       return true;
+-    }
+-    else if (vtype == typeof (GLib.File)) {
+-      var file = (GLib.File) value.get_object ();
+-      var path = file?.get_path ();
++    } else if (vtype == typeof (GLib.File)) {
++      var file = (GLib.File) value.get_object();
++      var path = file?.get_path();
+ 
+       if (path != null) {
+-        this.feed_child (Shell.quote (path).data);
+-        this.feed_child (" ".data);
++        this.feed_child(Shell.quote(path).data);
++        this.feed_child(" ".data);
+       }
+ 
+       return true;
+-    }
+-    else if (vtype == typeof (string)) {
+-      var text = value.get_string ();
++    } else if (vtype == typeof (string)) {
++      var text = value.get_string();
+ 
+       if (text != null) {
+-        this.feed_child (text.data);
++        this.feed_child(text.data);
+       }
+ 
+       return true;
+     }
+ 
+-    warning ("You dropped something Terminal can't handle yet :(");
++    warning("You dropped something Terminal can't handle yet :(");
+     return false;
+   }
+ 
+-  private void setup_regexes () {
++  private void setup_regexes() {
+     foreach (unowned string str in Constants.URL_REGEX_STRINGS) {
+       try {
+-        var reg = new Vte.Regex.for_match (
++        var reg = new Vte.Regex.for_match(
+           str, -1, PCRE2.Flags.MULTILINE
+         );
+-        int id = this.match_add_regex (reg, 0);
+-        this.match_set_cursor_name (id, "pointer");
+-      }
+-      catch (Error e) {
+-        warning (e.message);
++        int id = this.match_add_regex(reg, 0);
++        this.match_set_cursor_name(id, "pointer");
++      } catch (Error e) {
++        warning(e.message);
+       }
+     }
+   }
+ 
+-  private void on_font_changed () {
+-    this.font_desc = Pango.FontDescription.from_string (
++  private void on_font_changed() {
++    this.font_desc = Pango.FontDescription.from_string(
+       this.settings.font
+     );
+   }
+@@ -230,18 +227,18 @@ private static uint       next_id = 0;
+     return bg_transparent;
+   }
+ 
+-  private void on_theme_changed () {
+-    var theme_provider = ThemeProvider.get_default ();
++  private void on_theme_changed() {
++    var theme_provider = ThemeProvider.get_default();
+     var theme_name = theme_provider.current_theme;
+-    var theme = theme_provider.themes.get (theme_name);
++    var theme = theme_provider.themes.get(theme_name);
+ 
+     if (theme == null) {
+-      warning ("INVALID THEME '%s'", theme_name);
++      warning("INVALID THEME '%s'", theme_name);
+       return;
+     }
+ 
+-    var bg = this.get_background_color (theme);
+-    this.set_colors (
++    var bg = this.get_background_color(theme);
++    this.set_colors(
+       theme.foreground_color,
+       bg,
+       theme.palette.data
+@@ -249,11 +246,11 @@ private static uint       next_id = 0;
+   }
+ 
+   private Gtk.CssProvider? padding_provider = null;
+-  private void on_padding_changed () {
+-    var pad = this.settings.get_padding ();
++  private void on_padding_changed() {
++    var pad = this.settings.get_padding();
+ 
+     if (this.padding_provider != null) {
+-      this.get_style_context ().remove_provider (this.padding_provider);
++      this.get_style_context().remove_provider(this.padding_provider);
+       this.padding_provider = null;
+     }
+ 
+@@ -266,14 +263,14 @@ private static uint       next_id = 0;
+       )
+     );
+ 
+-    this.get_style_context ().add_provider (
++    this.get_style_context().add_provider(
+       this.padding_provider,
+       Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
+     );
+   }
+ 
+-  private void bind_data () {
+-    this.settings.schema.bind (
++  private void bind_data() {
++    this.settings.schema.bind(
+       "theme-bold-is-bright",
+       this,
+       "bold-is-bright",
+@@ -287,28 +284,28 @@ private static uint       next_id = 0;
+       SettingsBindFlags.DEFAULT
+     );
+ 
+-    this.settings.schema.bind (
++    this.settings.schema.bind(
+       "terminal-bell",
+       this,
+       "audible-bell",
+       SettingsBindFlags.DEFAULT
+     );
+ 
+-    this.settings.schema.bind (
++    this.settings.schema.bind(
+       "terminal-cell-width",
+       this,
+       "cell-width-scale",
+       SettingsBindFlags.DEFAULT
+     );
+ 
+-    this.settings.schema.bind (
++    this.settings.schema.bind(
+       "terminal-cell-height",
+       this,
+       "cell-height-scale",
+       SettingsBindFlags.DEFAULT
+     );
+ 
+-    this.settings.bind_property (
++    this.settings.bind_property(
+       "cursor-shape",
+       this,
+       "cursor-shape",
+@@ -317,7 +314,7 @@ private static uint       next_id = 0;
+       null
+     );
+ 
+-    this.settings.bind_property (
++    this.settings.bind_property(
+       "cursor-blink-mode",
+       this,
+       "cursor-blink-mode",
+@@ -326,7 +323,7 @@ private static uint       next_id = 0;
+       null
+     );
+ 
+-    this.bind_property (
++    this.bind_property(
+       "user-scrollback-lines",
+       this,
+       "scrollback-lines",
+@@ -343,7 +340,7 @@ private static uint       next_id = 0;
+     // See:
+     // - https://gitlab.gnome.org/raggesilver/blackbox/-/issues/179
+     // - https://gitlab.gnome.org/GNOME/vte/-/issues/336
+-    this.settings.bind_property (
++    this.settings.bind_property(
+       "show-scrollbars",
+       this,
+       "enable-fallback-scrolling",
+@@ -353,73 +350,72 @@ private static uint       next_id = 0;
+     );
+   }
+ 
+-  private string process_completed_notification_id () {
+-    return "process-completed-%u-%u".printf (window.id, this.id);
++  private string process_completed_notification_id() {
++    return "process-completed-%u-%u".printf(window.id, this.id);
+   }
+ 
+-  private void on_attention_received () {
+-     this.needs_attention = false;
+-     this.withdraw_command_completed_notification ();
++  private void on_attention_received() {
++    this.needs_attention = false;
++    this.withdraw_command_completed_notification();
+   }
+ 
+-  private void connect_signals () {
+-    var kpcontroller = new Gtk.EventControllerKey ();
+-    kpcontroller.key_pressed.connect (this.on_key_pressed);
+-    this.add_controller (kpcontroller);
++  private void connect_signals() {
++    var kpcontroller = new Gtk.EventControllerKey();
++    kpcontroller.key_pressed.connect(this.on_key_pressed);
++    this.add_controller(kpcontroller);
+ 
+-    var left_click_controller = new Gtk.GestureClick () {
++    var left_click_controller = new Gtk.GestureClick() {
+       button = Gdk.BUTTON_PRIMARY,
+     };
+-    left_click_controller.pressed.connect ((gesture, n_clicked, x, y) => {
+-      var event = gesture.get_current_event ();
+-      var pattern = this.check_match_at (x, y, null) ?? this.hyperlink_hover_uri;
++    left_click_controller.pressed.connect((gesture, n_clicked, x, y) => {
++      var event = gesture.get_current_event();
++      var pattern = this.check_match_at(x, y, null) ?? this.hyperlink_hover_uri;
+ 
+       if (
+-        (event.get_modifier_state () & Gdk.ModifierType.CONTROL_MASK) == 0 ||
++        (event.get_modifier_state() & Gdk.ModifierType.CONTROL_MASK) == 0 ||
+         pattern == null
+       ) {
+         return;
+       }
+ 
+       try {
+-        GLib.AppInfo.launch_default_for_uri (pattern, null);
+-      }
+-      catch (Error e) {
+-        warning ("Failed to open link %s", e.message);
++        GLib.AppInfo.launch_default_for_uri(pattern, null);
++      } catch (Error e) {
++        warning("Failed to open link %s", e.message);
+       }
+     });
+-    this.add_controller (left_click_controller);
++    this.add_controller(left_click_controller);
+ 
+-    this.settings.notify ["scrollback-lines"]
+-      .connect (() => {
+-        this.notify_property ("user-scrollback-lines");
+-      });
++    this.settings.notify["scrollback-lines"]
++    .connect(() => {
++      this.notify_property("user-scrollback-lines");
++    });
+ 
+-    this.settings.notify ["scrollback-mode"]
+-      .connect (() => {
+-        this.notify_property ("user-scrollback-lines");
+-      });
++    this.settings.notify["scrollback-mode"]
++    .connect(() => {
++      this.notify_property("user-scrollback-lines");
++    });
+ 
+-    this.notify ["has-focus"].connect (() => {
++    this.notify["has-focus"].connect(() => {
+       if (this.attention_timer > 0) {
+-        GLib.Source.remove (this.attention_timer);
++        GLib.Source.remove(this.attention_timer);
+         this.attention_timer = 0;
+       }
+       if (this.has_focus) {
+-        this.attention_timer = GLib.Timeout.add_once (2 * 1000, () => {
+-          this.on_attention_received ();
++        this.attention_timer = GLib.Timeout.add_once(2 * 1000, () => {
++          this.on_attention_received();
+           this.attention_timer = 0;
+         });
+       }
+     });
+   }
+ 
+-  private void spawn (string? command, string? cwd) throws Error {
++  private void spawn(string? command, string? cwd) throws Error {
+     Array<string> argv = new Array<string> ();
+     Array<string> envv = new Array<string> ();
+     Vte.PtyFlags flags = Vte.PtyFlags.DEFAULT;
+ 
+-    var settings = Settings.get_default ();
++    var settings = Settings.get_default();
+     string[]? custom_shell_commandv = null;
+ 
+     string shell;
+@@ -428,38 +424,38 @@ private static uint       next_id = 0;
+       settings.use_custom_command &&
+       settings.custom_shell_command != ""
+     ) {
+-      Shell.parse_argv (settings.custom_shell_command, out custom_shell_commandv);
++      Shell.parse_argv(settings.custom_shell_command,
++                       out custom_shell_commandv);
+     }
+ 
+-    var tmp_envv = Environ.get ();
++    var tmp_envv = Environ.get();
+ 
+     foreach (string env in tmp_envv) {
+-      envv.append_val (env);
++      envv.append_val(env);
+     }
+ 
+     foreach (unowned string env in Terminal.blackbox_envv) {
+-      envv.append_val (env);
++      envv.append_val(env);
+     }
+ 
+-    shell = Environ.get_variable (envv.data, "SHELL");
++    shell = Environ.get_variable(envv.data, "SHELL");
+ 
+     if (custom_shell_commandv != null) {
+       foreach (unowned string s in custom_shell_commandv) {
+-        argv.append_val (s);
++        argv.append_val(s);
+       }
+-    }
+-    else {
+-      argv.append_val (shell);
++    } else {
++      argv.append_val(shell);
+       if (settings.command_as_login_shell && command == null) {
+-        argv.append_val ("--login");
++        argv.append_val("--login");
+       }
+     }
+     if (command != null) {
+-      argv.append_val ("-c");
+-      argv.append_val (command);
++      argv.append_val("-c");
++      argv.append_val(command);
+     }
+ 
+-    this.spawn_async (
++    this.spawn_async(
+       flags,
+       cwd,
+       argv.data,
+@@ -472,38 +468,37 @@ private static uint       next_id = 0;
+     );
+   }
+ 
+-  private void _on_spawn_finished (Vte.Terminal t, Pid pid, GLib.Error? error) {
++  private void _on_spawn_finished(Vte.Terminal t, Pid pid, GLib.Error? error) {
+     if (error == null) {
+       this.pid = pid;
+-      this.on_spawn_finished ();
+-    }
+-    else {
+-      this.spawn_failed (error.message);
++      this.on_spawn_finished();
++    } else {
++      this.spawn_failed(error.message);
+     }
+   }
+ 
+-  private void on_spawn_finished () {
++  private void on_spawn_finished() {
+     if (_pid < 0) {
+       return;
+     }
+ 
+-    this.process = new Process () {
+-      terminal_fd = this.pty.get_fd (),
++    this.process = new Process() {
++      terminal_fd = this.pty.get_fd(),
+       pid = this.pid,
+       foreground_pid = -1,
+     };
+ 
+-    this.process.foreground_task_finished.connect ((_process) => {
++    this.process.foreground_task_finished.connect((_process) => {
+       if (!this.has_focus && _process.last_foreground_task_command != null) {
+         this.needs_attention = true;
+-        this.send_command_completed_notification ();
++        this.send_command_completed_notification();
+       }
+     });
+ 
+-    this.process.notify ["context"].connect ((__process, spec) => {
++    this.process.notify["context"].connect((__process, spec) => {
+       var context = (_process as Process)?.context ?? ProcessContext.DEFAULT;
+ 
+-      this.context_changed.emit (context);
++      this.context_changed.emit(context);
+       //  string context_str =
+       //    context == ProcessContext.SSH
+       //      ? "ssh"
+@@ -513,9 +508,9 @@ private static uint       next_id = 0;
+       //  message ("New context for process: %s", context_str);
+     });
+ 
+-    ProcessWatcher.get_instance ().watch (this.process);
++    ProcessWatcher.get_instance().watch(this.process);
+ 
+-    this.context_changed.emit (this.process.context);
++    this.context_changed.emit(this.process.context);
+   }
+ 
+   private void send_command_completed_notification() {
+@@ -535,25 +530,25 @@ private static uint       next_id = 0;
+     );
+   }
+ 
+-  private void withdraw_command_completed_notification () {
+-    this.window.application.withdraw_notification (
+-      process_completed_notification_id ()
++  private void withdraw_command_completed_notification() {
++    this.window.application.withdraw_notification(
++      process_completed_notification_id()
+     );
+   }
+ 
+   // Signal callbacks ==========================================================
+ 
+-  private void on_child_exited (int status) {
+-    debug ("Child exited with code %d", status);
++  private void on_child_exited(int status) {
++    debug("Child exited with code %d", status);
+     this.pid = -1;
+     //  This is not a good idea. Another thread might be modifying this field
+     //  as well.
+     //  this.process.ended = true;
+     this.process = null;
+-    this.exit ();
++    this.exit();
+   }
+ 
+-  private bool on_key_pressed (
++  private bool on_key_pressed(
+     uint keyval,
+     uint keycode,
+     Gdk.ModifierType state
+@@ -562,20 +557,20 @@ private static uint       next_id = 0;
+       return false;
+     }
+ 
+-    switch (Gdk.keyval_name (keyval)) {
++    switch (Gdk.keyval_name(keyval)) {
+       case "c":
+         if (
+-          this.get_has_selection () &&
+-          Settings.get_default ().easy_copy_paste
++          this.get_has_selection() &&
++          Settings.get_default().easy_copy_paste
+         ) {
+-          this.do_copy_clipboard ();
+-          this.unselect_all ();
++          this.do_copy_clipboard();
++          this.unselect_all();
+           return true;
+         }
+         return false;
+       case "v":
+-        if (Settings.get_default ().easy_copy_paste) {
+-          this.do_paste_clipboard ();
++        if (Settings.get_default().easy_copy_paste) {
++          this.do_paste_clipboard();
+           return true;
+         }
+         return false;
+@@ -584,7 +579,7 @@ private static uint       next_id = 0;
+     return false;
+   }
+ 
+-  public async bool get_can_close (out string command = null) {
++  public async bool get_can_close(out string command = null) {
+     command = null;
+ 
+     if (this.pid < 0 || this.pty == null) {
+@@ -597,7 +592,7 @@ private static uint       next_id = 0;
+     }
+ 
+     // Get terminal's foreground process
+-    var fgpid = yield get_foreground_process (fd);
++    var fgpid = yield get_foreground_process(fd);
+     if (fgpid == -1) {
+       return false;
+     }
+@@ -606,55 +601,53 @@ private static uint       next_id = 0;
+       return true;
+     }
+ 
+-    command = get_process_cmdline (fgpid);
++    command = get_process_cmdline(fgpid);
+ 
+     return command == null;
+   }
+ 
+-  public void zoom_in () {
+-    this.font_scale = double.min (10, this.font_scale + 0.1);
++  public void zoom_in() {
++    this.font_scale = double.min(10, this.font_scale + 0.1);
+   }
+ 
+-  public void zoom_out () {
+-    this.font_scale = double.max (0.1, this.font_scale - 0.1);
++  public void zoom_out() {
++    this.font_scale = double.max(0.1, this.font_scale - 0.1);
+   }
+ 
+-  public void zoom_default () {
++  public void zoom_default() {
+     this.font_scale = 1.0;
+   }
+ 
+-  public void do_paste_clipboard () {
+-    this.paste_clipboard ();
++  public void do_paste_clipboard() {
++    this.paste_clipboard();
+   }
+ 
+-  public void do_copy_clipboard () {
+-    this.copy_clipboard ();
++  public void do_copy_clipboard() {
++    this.copy_clipboard();
+   }
+ 
+-  public async void do_paste_from_selection_clipboard () {
++  public async void do_paste_from_selection_clipboard() {
+     //  This function does not seem to be working in GTK 4 yet.
+     //  this.paste_primary ();
+ 
+-    var clipboard = Gdk.Display.get_default ().get_primary_clipboard ();
++    var clipboard = Gdk.Display.get_default().get_primary_clipboard();
+     try {
+-      var text = yield clipboard.read_text_async (null);
+-      this.paste_text (text);
+-    }
+-    catch (Error e) {
+-      warning ("%s", e.message);
++      var text = yield clipboard.read_text_async(null);
++      this.paste_text(text);
++    } catch (Error e) {
++      warning("%s", e.message);
+     }
+   }
+ 
+-  public string? get_current_working_directory () {
+-    string? cwd = this.get_current_directory_uri ();
++  public string? get_current_working_directory() {
++    string? cwd = this.get_current_directory_uri();
+ 
+     if (cwd != null) {
+       try {
+-        string path = GLib.Filename.from_uri (cwd, null);
++        string path = GLib.Filename.from_uri(cwd, null);
+         cwd = path;
+-      }
+-      catch (GLib.ConvertError e) {
+-        warning ("%s", e.message);
++      } catch (GLib.ConvertError e) {
++        warning("%s", e.message);
+         cwd = null;
+       }
+     }
+@@ -662,10 +655,10 @@ private static uint       next_id = 0;
+     return cwd;
+   }
+ 
+-  public static string? get_current_working_directory_for_new_session (
++  public static string? get_current_working_directory_for_new_session(
+     Terminal? previous_terminal = null
+   ) {
+-    var settings = Settings.get_default ();
++    var settings = Settings.get_default();
+     var mode = settings.working_directory_mode;
+     var custom_working_directory = settings.custom_working_directory;
+ 
+@@ -673,10 +666,11 @@ private static uint       next_id = 0;
+       case WorkingDirectoryMode.CUSTOM:
+         return custom_working_directory;
+       case WorkingDirectoryMode.HOME_DIRECTORY:
+-        return GLib.Environment.get_home_dir ();
++        return GLib.Environment.get_home_dir();
+       case WorkingDirectoryMode.PREVIOUS_SESSION:
+         if (previous_terminal != null) {
+-          return previous_terminal.get_current_working_directory ();
++          return previous_terminal.get_current_working_directory()
++                 ?? previous_terminal.window.last_known_cwd;
+         }
+         break;
+     }
+@@ -684,8 +678,7 @@ private static uint       next_id = 0;
+     return null;
+   }
+ 
+-  public void on_before_close () {
+-    this.withdraw_command_completed_notification ();
++  public void on_before_close() {
++    this.withdraw_command_completed_notification();
+   }
+ }
+-
+diff --git a/src/widgets/Window.vala b/src/widgets/Window.vala
+index 81f8f79..036a4a5 100644
+--- a/src/widgets/Window.vala
++++ b/src/widgets/Window.vala
+@@ -23,8 +23,8 @@ public struct Terminal.Padding {
+   uint bottom;
+   uint left;
+ 
+-  public Variant to_variant () {
+-    return new Variant (
++  public Variant to_variant() {
++    return new Variant(
+       "(uuuu)",
+       this.top,
+       this.right,
+@@ -33,31 +33,31 @@ public struct Terminal.Padding {
+     );
+   }
+ 
+-  public static Padding zero () {
++  public static Padding zero() {
+     return { 0 };
+   }
+ 
+-  public static Padding from_variant (Variant vari) {
+-    if (!vari.check_format_string ("(uuuu)", false)) return Padding.zero ();
++  public static Padding from_variant(Variant vari) {
++    if (!vari.check_format_string("(uuuu)", false)) { return Padding.zero(); }
+ 
+-    var iter = vari.iterator ();
++    var  iter = vari.iterator();
+     uint top = 0, right = 0, bottom = 0, left = 0;
+ 
+-    iter.next ("u", &top);
+-    iter.next ("u", &right);
+-    iter.next ("u", &bottom);
+-    iter.next ("u", &left);
++    iter.next("u", &top);
++    iter.next("u", &right);
++    iter.next("u", &bottom);
++    iter.next("u", &left);
+ 
+-    return Padding () {
+-      top = top,
+-      right = right,
+-      bottom = bottom,
+-      left = left,
++    return Padding() {
++             top = top,
++             right = right,
++             bottom = bottom,
++             left = left,
+     };
+   }
+ 
+-  public string to_string () {
+-    return "Padding { %u, %u, %u, %u }".printf (
++  public string to_string() {
++    return "Padding { %u, %u, %u, %u }".printf(
+       this.top,
+       this.right,
+       this.bottom,
+@@ -68,7 +68,7 @@ public struct Terminal.Padding {
+   /**
+    * Whether padding on all sides is the same.
+    */
+-  public bool is_equilateral () {
++  public bool is_equilateral() {
+     return (
+       this.top == this.right &&
+       this.right == this.bottom &&
+@@ -78,38 +78,41 @@ public struct Terminal.Padding {
+ }
+ 
+ public class Terminal.Window : Adw.ApplicationWindow {
+-
+   // Signals
+ 
+-  private signal void header_bar_animation_finished ();
++  private signal void header_bar_animation_finished();
+ 
+   // Properties
+ 
+-  public ThemeProvider  theme_provider        { get; private set; }
+-  public Adw.TabView    tab_view              { get; private set; }
+-  public Adw.TabBar     tab_bar               { get; private set; }
+-  public Terminal?      active_terminal       { get; private set; }
+-  public TerminalTab?   active_terminal_tab   { get; private set; default = null; }
+-  public string         active_terminal_title { get; private set; default = ""; }
+-  public uint           id                    { get; private set; }
++  public ThemeProvider theme_provider        { get; private set; }
++  public Adw.TabView   tab_view              { get; private set; }
++  public Adw.TabBar    tab_bar               { get; private set; }
++  public Terminal?     active_terminal       { get; private set; }
++  public TerminalTab?  active_terminal_tab   { get; private set; default = null;
++  }
++  public string active_terminal_title { get; private set; default = ""; }
++  public uint   id                    { get; private set; }
+ 
+   // Terminal tabs set this to any link clicked by the user. The value is then
+   // consumed by the open-link and copy-link actions.
+-  public string? link  { get; set; default = null; }
++  public string? link { get; set; default = null; }
++  // This keeps track of the last known cwd for any terminal on this Window.
++  // Useful when opening a new tab from one where the cwd cannot be determined.
++  public string? last_known_cwd { get; private set; default = null; }
+ 
+   // Fields
+ 
+-  Array<ulong>  active_terminal_signal_handlers = new Array<ulong> ();
+-  Array<ulong>  active_terminal_tab_signal_handlers = new Array<ulong> ();
+-  bool          force_close = false;
+-  const uint    header_bar_revealer_duration_ms = 250;
+-  Gtk.Revealer  header_bar_revealer;
+-  HeaderBar     header_bar;
+-  Settings      settings = Settings.get_default ();
+-  uint          header_bar_waiting_floating_animation = 0;
+-  uint          header_bar_waiting_floating_delay = 0;
+-  Gtk.Box       layout_box;
+-  Gtk.Overlay   overlay;
++  Array<ulong> active_terminal_signal_handlers = new Array<ulong> ();
++  Array<ulong> active_terminal_tab_signal_handlers = new Array<ulong> ();
++  bool force_close = false;
++  const uint   header_bar_revealer_duration_ms = 250;
++  Gtk.Revealer header_bar_revealer;
++  HeaderBar    header_bar;
++  Settings     settings = Settings.get_default();
++  uint        header_bar_waiting_floating_animation = 0;
++  uint        header_bar_waiting_floating_delay = 0;
++  Gtk.Box     layout_box;
++  Gtk.Overlay overlay;
+   private static uint next_id = 0;
+ 
+   weak Adw.TabPage? tab_menu_target = null;
+@@ -136,41 +139,43 @@ public class Terminal.Window : Adw.ApplicationWindow {
+     this.id = next_id;
+     next_id++;
+     if (DEVEL) {
+-      this.add_css_class ("devel");
++      this.add_css_class("devel");
+     }
+ 
+     // FIXME: move this over to an ui file
+ 
+-    this.layout_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);
++    this.layout_box = new Gtk.Box(Gtk.Orientation.VERTICAL, 0);
+ 
+-    this.tab_view = new Adw.TabView () {
++    this.tab_view = new Adw.TabView() {
+       // Disable Adw.TabView shortcuts
+       shortcuts = Adw.TabViewShortcuts.NONE,
+     };
+ 
+-    this.header_bar = new HeaderBar (this);
++    this.header_bar = new HeaderBar(this);
+ 
+     this.tab_bar = this.header_bar.tab_bar;
+     this.tab_bar.view = this.tab_view;
+ 
+-    this.header_bar_revealer = new Gtk.Revealer () {
++    this.header_bar_revealer = new Gtk.Revealer() {
+       transition_duration = Window.header_bar_revealer_duration_ms,
+       child = this.header_bar,
+       valign = Gtk.Align.START,
+     };
+ 
+-    var builder = new Gtk.Builder.from_resource ("/com/raggesilver/BlackBox/gtk/tab-menu.ui");
+-    this.tab_view.menu_model = builder.get_object ("tab-menu") as GLib.Menu;
++    var builder =
++      new Gtk.Builder.from_resource(
++        "/com/raggesilver/BlackBox/gtk/tab-menu.ui");
++    this.tab_view.menu_model = builder.get_object("tab-menu") as GLib.Menu;
+ 
+-    this.layout_box.append (this.header_bar_revealer);
+-    this.layout_box.append (this.tab_view);
++    this.layout_box.append(this.header_bar_revealer);
++    this.layout_box.append(this.tab_view);
+ 
+-    this.overlay = new Gtk.Overlay ();
++    this.overlay = new Gtk.Overlay();
+     this.overlay.child = this.layout_box;
+ 
+     this.content = this.overlay;
+ 
+-    this.set_name ("blackbox-main-window");
++    this.set_name("blackbox-main-window");
+   }
+ 
+   public Window (
+@@ -179,11 +184,11 @@ public class Terminal.Window : Adw.ApplicationWindow {
+     string? cwd = null,
+     bool skip_initial_tab = false
+   ) {
+-    var sett = Settings.get_default ();
++    var sett = Settings.get_default();
+     var wwidth = (int) (sett.remember_window_size ? sett.window_width : 700);
+     var wheight = (int) (sett.remember_window_size ? sett.window_height : 450);
+ 
+-    Object (
++    Object(
+       application: app,
+       default_width: wwidth,
+       default_height: wheight,
+@@ -191,18 +196,18 @@ public class Terminal.Window : Adw.ApplicationWindow {
+       maximized: sett.remember_window_size && sett.was_maximized
+     );
+ 
+-    this.theme_provider = ThemeProvider.get_default ();
++    this.theme_provider = ThemeProvider.get_default();
+ 
+-    this.add_actions ();
+-    this.connect_signals ();
++    this.add_actions();
++    this.connect_signals();
+ 
+     if (!skip_initial_tab) {
+-      this.new_tab (command, cwd);
++      this.new_tab(command, cwd);
+     }
+   }
+ 
+-  private void connect_signals () {
+-    this.bind_property (
++  private void connect_signals() {
++    this.bind_property(
+       "active-terminal-title",
+       this,
+       "title",
+@@ -211,95 +216,95 @@ public class Terminal.Window : Adw.ApplicationWindow {
+       null
+     );
+ 
+-    this.settings.schema.bind (
++    this.settings.schema.bind(
+       "fill-tabs",
+       this.tab_bar,
+       "expand-tabs",
+       SettingsBindFlags.GET
+     );
+ 
+-    this.settings.schema.bind (
++    this.settings.schema.bind(
+       "show-headerbar",
+       this.header_bar_revealer,
+       "reveal-child",
+       SettingsBindFlags.GET
+     );
+ 
+-    this.settings.notify ["context-aware-header-bar"].connect (() => {
+-      this.on_active_terminal_context_changed ();
++    this.settings.notify["context-aware-header-bar"].connect(() => {
++      this.on_active_terminal_context_changed();
+     });
+ 
+-    this.header_bar_revealer.notify ["reveal-child"]
+-      .connect (this.on_reveal_header_bar_changed);
++    this.header_bar_revealer.notify["reveal-child"]
++    .connect(this.on_reveal_header_bar_changed);
+ 
+-    settings.notify ["show-headerbar"].connect (() => {
+-      if (Settings.get_default ().show_headerbar) {
+-        this.on_show_header_bar_changed ();
++    settings.notify["show-headerbar"].connect(() => {
++      if (Settings.get_default().show_headerbar) {
++        this.on_show_header_bar_changed();
+       }
+     });
+ 
+-    settings.notify ["show-headerbar"].connect_after (() => {
+-      if (!Settings.get_default ().show_headerbar) {
+-        this.on_show_header_bar_changed ();
++    settings.notify["show-headerbar"].connect_after(() => {
++      if (!Settings.get_default().show_headerbar) {
++        this.on_show_header_bar_changed();
+       }
+     });
+ 
+-    this.on_show_header_bar_changed ();
++    this.on_show_header_bar_changed();
+ 
+-    settings.notify ["floating-controls"]
+-      .connect (this.on_floating_controls_changed);
++    settings.notify["floating-controls"]
++    .connect(this.on_floating_controls_changed);
+ 
+-    this.tab_view.create_window.connect (() => {
+-      var w = this.new_window (null, true);
++    this.tab_view.create_window.connect(() => {
++      var w = this.new_window(null, true);
+       return w.tab_view;
+     });
+ 
+-    this.tab_view.close_page.connect ((page) => {
+-      this.try_closing_tab.begin (page);
++    this.tab_view.close_page.connect((page) => {
++      this.try_closing_tab.begin(page);
+       return true;
+     });
+ 
+     // Close the window if all tabs were closed
+-    this.tab_view.notify["n-pages"].connect (() => {
++    this.tab_view.notify["n-pages"].connect(() => {
+       if (this.tab_view.n_pages < 1) {
+-        this.close ();
++        this.close();
+       }
+     });
+ 
+-    this.tab_view.notify["selected-page"].connect (() => {
+-      this.on_tab_selected ();
++    this.tab_view.notify["selected-page"].connect(() => {
++      this.on_tab_selected();
+     });
+ 
+-    this.tab_view.setup_menu.connect (this.on_setup_menu);
++    this.tab_view.setup_menu.connect(this.on_setup_menu);
+ 
+-    this.notify["default-width"].connect (() => {
++    this.notify["default-width"].connect(() => {
+       this.settings.window_width = this.default_width;
+     });
+ 
+-    this.notify["default-height"].connect (() => {
++    this.notify["default-height"].connect(() => {
+       this.settings.window_height = this.default_height;
+     });
+ 
+-    this.notify ["active-terminal"]
+-      .connect (this.on_active_terminal_tab_changed);
++    this.notify["active-terminal"]
++    .connect(this.on_active_terminal_tab_changed);
+ 
+-    var motion_controller = new Gtk.EventControllerMotion ();
+-    motion_controller.motion.connect (this.on_mouse_motion);
++    var motion_controller = new Gtk.EventControllerMotion();
++    motion_controller.motion.connect(this.on_mouse_motion);
+ 
+-    (this as Gtk.Widget)?.add_controller (motion_controller);
++    (this as Gtk.Widget)?.add_controller(motion_controller);
+ 
+-    this.close_request.connect (this.on_close_request);
++    this.close_request.connect(this.on_close_request);
+ 
+-    this.notify ["link"].connect (() => {
++    this.notify["link"].connect(() => {
+       var enabled = this.link != null;
+ 
+-      message ("Setting link actions to %s", enabled.to_string ());
+-      this.copy_link_action.set_enabled (this.link != null);
+-      this.open_link_action.set_enabled (this.link != null);
++      message("Setting link actions to %s", enabled.to_string());
++      this.copy_link_action.set_enabled(this.link != null);
++      this.open_link_action.set_enabled(this.link != null);
+     });
+   }
+ 
+-  private void on_mouse_motion (
++  private void on_mouse_motion(
+     Gtk.EventControllerMotion _,
+     double _mouseX,
+     double mouseY
+@@ -310,7 +315,7 @@ public class Terminal.Window : Adw.ApplicationWindow {
+       return;
+     }
+ 
+-    var hb_height = this.header_bar.get_height ();
++    var hb_height = this.header_bar.get_height();
+     var is_shown = this.header_bar_revealer.reveal_child;
+ 
+     var trigger_area = settings.floating_controls_hover_area;
+@@ -322,61 +327,65 @@ public class Terminal.Window : Adw.ApplicationWindow {
+       // Only schedule animation if there aren't any scheduled
+       if (this.header_bar_waiting_floating_delay == 0) {
+         // Wait for delay to show floating controls
+-        this.header_bar_waiting_floating_delay = Timeout.add (
++        this.header_bar_waiting_floating_delay = Timeout.add(
+           settings.delay_before_showing_floating_controls,
+           () => {
+-            this.header_bar_waiting_floating_delay = 0;
++          this.header_bar_waiting_floating_delay = 0;
+ 
+-            this.header_bar_revealer.reveal_child = true;
++          this.header_bar_revealer.reveal_child = true;
+ 
+-            return false;
+-          }
++          return false;
++        }
+         );
+       }
+-    }
+-    else if (
++    } else if (
+       !is_hovering_trigger_area &&
+       (is_shown || this.header_bar_waiting_floating_delay != 0)
+     ) {
+       if (this.header_bar_waiting_floating_delay != 0) {
+-        Source.remove (this.header_bar_waiting_floating_delay);
++        Source.remove(this.header_bar_waiting_floating_delay);
+         this.header_bar_waiting_floating_delay = 0;
+       }
+       this.header_bar_revealer.reveal_child = false;
+     }
+   }
+ 
+-  private void on_setup_menu (Adw.TabPage? page) {
++  private void on_setup_menu(Adw.TabPage? page) {
+     this.tab_menu_target = page;
+ 
+-    this.move_tab_left_action.set_enabled (page != null && this.tab_view.get_page_position (page) > 0);
+-    this.move_tab_right_action.set_enabled (page != null && this.tab_view.get_page_position (page) < this.tab_view.n_pages - 1);
+-    this.close_specific_tab_action.set_enabled (page != null);
+-    this.detatch_tab_action.set_enabled (page != null && this.tab_view.n_pages > 1);
++    this.move_tab_left_action.set_enabled(page != null &&
++                                          this.tab_view.get_page_position(
++                                            page) > 0);
++    this.move_tab_right_action.set_enabled(page != null &&
++                                           this.tab_view.get_page_position(
++                                             page) < this.tab_view.n_pages - 1);
++    this.close_specific_tab_action.set_enabled(page != null);
++    this.detatch_tab_action.set_enabled(page != null &&
++                                        this.tab_view.n_pages > 1);
+   }
+ 
+-  private void on_reveal_header_bar_changed () {
++  private void on_reveal_header_bar_changed() {
+     this.header_bar_waiting_floating_animation = Timeout
+-      .add (header_bar_revealer_duration_ms, () => {
+-        this.header_bar_waiting_floating_animation = 0;
+-        this.header_bar_animation_finished ();
+-        return false;
+-      });
++      .add(header_bar_revealer_duration_ms, () => {
++      this.header_bar_waiting_floating_animation = 0;
++      this.header_bar_animation_finished();
++      return false;
++    });
+   }
+ 
+-  private void on_floating_controls_changed () {
+-    this.set_header_bar_to_floating.begin (
++  private void on_floating_controls_changed() {
++    this.set_header_bar_to_floating.begin(
+       !this.settings.show_headerbar && this.settings.floating_controls
+     );
+   }
+ 
+-  private void on_show_header_bar_changed () {
+-    this.set_header_bar_to_floating.begin (
++  private void on_show_header_bar_changed() {
++    this.set_header_bar_to_floating.begin(
+       !this.settings.show_headerbar && this.settings.floating_controls
+     );
+   }
+ 
+-  private async void wait_for_header_bar_animation () {
++  private async void wait_for_header_bar_animation() {
+     if (this.header_bar_waiting_floating_animation == 0) {
+       return;
+     }
+@@ -385,16 +394,16 @@ public class Terminal.Window : Adw.ApplicationWindow {
+ 
+     ulong hid = 0;
+ 
+-    hid = this.header_bar_animation_finished.connect_after (() => {
+-      callback ();
+-      this.disconnect (hid);
++    hid = this.header_bar_animation_finished.connect_after(() => {
++      callback();
++      this.disconnect(hid);
+     });
+ 
+     yield;
+   }
+ 
+   private bool setting_header_bar_to_floating = false;
+-  private async void set_header_bar_to_floating (bool should_float) {
++  private async void set_header_bar_to_floating(bool should_float) {
+     if (this.setting_header_bar_to_floating) {
+       return;
+     }
+@@ -403,14 +412,14 @@ public class Terminal.Window : Adw.ApplicationWindow {
+ 
+     if (should_float && this.header_bar_revealer.parent != this.overlay) {
+       // ...
+-      yield this.wait_for_header_bar_animation ();
+-      this.layout_box.remove (this.header_bar_revealer);
+-      this.overlay.add_overlay (this.header_bar_revealer);
+-    }
+-    else if (!should_float && this.header_bar_revealer.parent != this.layout_box) {
++      yield this.wait_for_header_bar_animation();
++      this.layout_box.remove(this.header_bar_revealer);
++      this.overlay.add_overlay(this.header_bar_revealer);
++    } else if (!should_float &&
++               this.header_bar_revealer.parent != this.layout_box) {
+       // ...
+-      this.overlay.remove_overlay (this.header_bar_revealer);
+-      this.layout_box.prepend (this.header_bar_revealer);
++      this.overlay.remove_overlay(this.header_bar_revealer);
++      this.layout_box.prepend(this.header_bar_revealer);
+     }
+ 
+     this.setting_header_bar_to_floating = false;
+@@ -418,15 +427,15 @@ public class Terminal.Window : Adw.ApplicationWindow {
+ 
+   // This method is called right before the window is closed. Use it to store
+   // window-related state such as position and size.
+-  private void on_before_close () {
+-    var settings = Settings.get_default ();
++  private void on_before_close() {
++    var settings = Settings.get_default();
+ 
+     settings.was_fullscreened = this.fullscreened;
+     settings.was_maximized = this.maximized;
+ 
+     for (int i = 0; i < this.tab_view.n_pages; i++) {
+-      var page = this.tab_view.get_nth_page (i);
+-      (page.get_child () as TerminalTab)?.on_before_close ();
++      var page = this.tab_view.get_nth_page(i);
++      (page.get_child() as TerminalTab)?.on_before_close();
+     }
+   }
+ 
+@@ -437,66 +446,69 @@ public class Terminal.Window : Adw.ApplicationWindow {
+   // to close the window. If the user confirms closing the window, or if there
+   // are no running processes, the dispatched function will fire a new
+   // close_request event and this function will finally close the window.
+-  private bool on_close_request () {
++  private bool on_close_request() {
+     if (this.force_close) {
+-      this.on_before_close ();
++      this.on_before_close();
+       return false; // Allow closing
+     }
+ 
+-    this.try_closing_window.begin (on_close_request_resolver);
++    this.try_closing_window.begin(on_close_request_resolver);
+ 
+     return true; // Block closing for now
+   }
+ 
+-  private static void on_close_request_resolver (GLib.Object? _window, GLib.AsyncResult obj) {
++  private static void on_close_request_resolver(
++    GLib.Object? _window,
++    GLib.AsyncResult obj
++  ) {
+     if (_window != null && _window is Window) {
+       var window = _window as Window;
+-      window.try_closing_window.end (obj);
++      window.try_closing_window.end(obj);
+       if (window.force_close) {
+-        window.close ();
++        window.close();
+       }
+     }
+   }
+ 
+-  private async void try_closing_tab (Adw.TabPage page) {
+-    var tab = page.child as TerminalTab;
+-    var terminal = tab?.terminal;
+-    bool can_close = true;
++  private async void try_closing_tab(Adw.TabPage page) {
++    var     tab = page.child as TerminalTab;
++    var     terminal = tab?.terminal;
++    bool    can_close = true;
+     string? command = null;
+ 
+     if (terminal != null) {
+-      if (!(yield terminal.get_can_close (out command))) {
+-        can_close = yield confirm_closing ({ command });
++      if (!(yield terminal.get_can_close(out command))) {
++        can_close = yield confirm_closing({ command });
+       }
+     }
+ 
+     if (can_close) {
+-      tab?.on_before_close ();
++      tab?.on_before_close();
+     }
+ 
+-    this.tab_view.close_page_finish (page, can_close);
++    this.tab_view.close_page_finish(page, can_close);
+     if (can_close && terminal == this.active_terminal) {
+       this.active_terminal = null;
+     }
+   }
+ 
+-  private async void try_closing_window () {
++  private async void try_closing_window() {
+     uint n_pages = this.tab_view.n_pages;
+     string?[] commands = {};
+     bool can_close = true;
+ 
+     for (uint i = 0; i < n_pages; i++) {
+       string? command = null;
+-      var page = this.tab_view.get_nth_page ((int) i);
+-      var terminal = (page.get_child () as TerminalTab)?.terminal;
++      var     page = this.tab_view.get_nth_page((int) i);
++      var     terminal = (page.get_child() as TerminalTab)?.terminal;
+ 
+-      if (terminal != null && !(yield terminal.get_can_close (out command))) {
++      if (terminal != null && !(yield terminal.get_can_close(out command))) {
+         commands += command;
+       }
+     }
+ 
+     if (commands.length > 0) {
+-      can_close = yield confirm_closing (
++      can_close = yield confirm_closing(
+         commands,
+         ConfirmClosingContext.WINDOW
+       );
+@@ -507,426 +519,431 @@ public class Terminal.Window : Adw.ApplicationWindow {
+     }
+   }
+ 
+-  private void add_actions () {
+-    this.add_action_entries (ACTION_ENTRIES, this);
++  private void add_actions() {
++    this.add_action_entries(ACTION_ENTRIES, this);
+ 
+-    var sa = new SimpleAction ("edit_preferences", null);
+-    sa.activate.connect (() => {
++    var sa = new SimpleAction("edit_preferences", null);
++    sa.activate.connect(() => {
+       if (preferences_window == null) {
+-        preferences_window = new PreferencesWindow (this, this.application);
++        preferences_window = new PreferencesWindow(this, this.application);
+       }
+ 
+-      preferences_window.present (this);
++      preferences_window.present(this);
+     });
+-    this.add_action (sa);
++    this.add_action(sa);
+ 
+-    sa = new SimpleAction ("paste", null);
+-    sa.activate.connect (() => {
+-      this.on_paste_activated ();
++    sa = new SimpleAction("paste", null);
++    sa.activate.connect(() => {
++      this.on_paste_activated();
+     });
+-    this.add_action (sa);
++    this.add_action(sa);
+ 
+-    this.copy_action = new SimpleAction ("copy", null);
+-    copy_action.activate.connect (() => {
+-      this.on_copy_activated ();
++    this.copy_action = new SimpleAction("copy", null);
++    copy_action.activate.connect(() => {
++      this.on_copy_activated();
+     });
+-    this.copy_action.set_enabled (false);
+-    this.add_action (this.copy_action);
++    this.copy_action.set_enabled(false);
++    this.add_action(this.copy_action);
+ 
+-    sa = new SimpleAction ("switch-headerbar-mode", null);
+-    sa.activate.connect (() => {
++    sa = new SimpleAction("switch-headerbar-mode", null);
++    sa.activate.connect(() => {
+       this.settings.show_headerbar = !this.settings.show_headerbar;
+     });
+-    this.add_action (sa);
++    this.add_action(sa);
+ 
+-    sa = new SimpleAction ("fullscreen", null);
+-    sa.activate.connect (this.toggle_fullscreen);
+-    this.add_action (sa);
++    sa = new SimpleAction("fullscreen", null);
++    sa.activate.connect(this.toggle_fullscreen);
++    this.add_action(sa);
+ 
+-    sa = new SimpleAction ("search", null);
+-    sa.activate.connect (this.search);
+-    this.add_action (sa);
++    sa = new SimpleAction("search", null);
++    sa.activate.connect(this.search);
++    this.add_action(sa);
+ 
+-    sa = new SimpleAction ("zoom-in", null);
+-    sa.activate.connect (this.zoom_in);
+-    this.add_action (sa);
++    sa = new SimpleAction("zoom-in", null);
++    sa.activate.connect(this.zoom_in);
++    this.add_action(sa);
+ 
+-    sa = new SimpleAction ("zoom-out", null);
+-    sa.activate.connect (this.zoom_out);
+-    this.add_action (sa);
++    sa = new SimpleAction("zoom-out", null);
++    sa.activate.connect(this.zoom_out);
++    this.add_action(sa);
+ 
+-    sa = new SimpleAction ("zoom-default", null);
+-    sa.activate.connect (this.zoom_default);
+-    this.add_action (sa);
++    sa = new SimpleAction("zoom-default", null);
++    sa.activate.connect(this.zoom_default);
++    this.add_action(sa);
+ 
+-    sa = new SimpleAction ("close-tab", null);
+-    sa.activate.connect (this.close_active_tab);
+-    this.add_action (sa);
++    sa = new SimpleAction("close-tab", null);
++    sa.activate.connect(this.close_active_tab);
++    this.add_action(sa);
+ 
+     for (int i = 1; i < 10; i++) {
+       var tab = i;
+-      sa = new SimpleAction ("switch-tab-%d".printf (tab), null);
+-      sa.activate.connect (() => {
+-        this.focus_nth_tab (tab);
++      sa = new SimpleAction("switch-tab-%d".printf(tab), null);
++      sa.activate.connect(() => {
++        this.focus_nth_tab(tab);
+       });
+-      this.add_action (sa);
++      this.add_action(sa);
+     }
+ 
+-    sa = new SimpleAction ("switch-tab-last", null);
+-    sa.activate.connect (() => {
+-      this.focus_nth_tab (-1);
++    sa = new SimpleAction("switch-tab-last", null);
++    sa.activate.connect(() => {
++      this.focus_nth_tab(-1);
+     });
+-    this.add_action (sa);
++    this.add_action(sa);
+ 
+-    this.copy_link_action = new SimpleAction ("copy-link", null);
+-    this.copy_link_action.activate.connect (this.on_copy_link);
+-    this.copy_link_action.set_enabled (false);
++    this.copy_link_action = new SimpleAction("copy-link", null);
++    this.copy_link_action.activate.connect(this.on_copy_link);
++    this.copy_link_action.set_enabled(false);
+ 
+-    this.open_link_action = new SimpleAction ("open-link", null);
+-    this.open_link_action.activate.connect (this.on_open_link);
+-    this.open_link_action.set_enabled (false);
++    this.open_link_action = new SimpleAction("open-link", null);
++    this.open_link_action.activate.connect(this.on_open_link);
++    this.open_link_action.set_enabled(false);
+ 
+-    this.add_action (this.copy_link_action);
+-    this.add_action (this.open_link_action);
++    this.add_action(this.copy_link_action);
++    this.add_action(this.open_link_action);
+ 
+-    this.move_tab_left_action = new SimpleAction ("move-tab-left", null);
+-    this.move_tab_left_action.activate.connect (this.move_tab_left);
+-    this.add_action (this.move_tab_left_action);
++    this.move_tab_left_action = new SimpleAction("move-tab-left", null);
++    this.move_tab_left_action.activate.connect(this.move_tab_left);
++    this.add_action(this.move_tab_left_action);
+ 
+-    this.move_tab_right_action = new SimpleAction ("move-tab-right", null);
+-    this.move_tab_right_action.activate.connect (this.move_tab_right);
+-    this.add_action (this.move_tab_right_action);
++    this.move_tab_right_action = new SimpleAction("move-tab-right", null);
++    this.move_tab_right_action.activate.connect(this.move_tab_right);
++    this.add_action(this.move_tab_right_action);
+ 
+-    this.close_specific_tab_action = new SimpleAction ("close-specific-tab", null);
+-    this.close_specific_tab_action.activate.connect (this.close_specific_tab);
+-    this.add_action (this.close_specific_tab_action);
++    this.close_specific_tab_action = new SimpleAction("close-specific-tab",
++                                                      null);
++    this.close_specific_tab_action.activate.connect(this.close_specific_tab);
++    this.add_action(this.close_specific_tab_action);
+ 
+-    this.detatch_tab_action = new SimpleAction ("detatch-tab", null);
+-    this.detatch_tab_action.activate.connect (this.detatch_tab);
+-    this.add_action (this.detatch_tab_action);
++    this.detatch_tab_action = new SimpleAction("detatch-tab", null);
++    this.detatch_tab_action.activate.connect(this.detatch_tab);
++    this.add_action(this.detatch_tab_action);
+ 
+-    this.rename_tab_action = new SimpleAction ("rename-tab", null);
+-    this.rename_tab_action.activate.connect (this.rename_tab);
+-    this.add_action (this.rename_tab_action);
++    this.rename_tab_action = new SimpleAction("rename-tab", null);
++    this.rename_tab_action.activate.connect(this.rename_tab);
++    this.add_action(this.rename_tab_action);
+   }
+ 
+-  private void rename_tab () {
++  private void rename_tab() {
+     // If this was a strong ref, the dialog would keep the terminal alive after
+     // it exited until the user fired a response. We don't want that. Instead,
+     // we just need to check when we get the response if the page still exists.
+     weak Adw.TabPage? target =
+       this.tab_menu_target ?? this.tab_view.selected_page;
+ 
+-    if (target == null) return;
++    if (target == null) { return; }
+ 
+-    var d = new Adw.AlertDialog (_("Rename Tab"),
+-                                 _("Set a custom title for this tab"));
++    var d = new Adw.AlertDialog(_("Rename Tab"),
++                                _("Set a custom title for this tab"));
+ 
+-    var entry = new Gtk.Entry () {
++    var entry = new Gtk.Entry() {
+       placeholder_text = _("Enter a custom tab title"),
+       text = (target.child as TerminalTab)?.title_override ?? ""
+     };
+ 
+     d.extra_child = entry;
+ 
+-    d.add_response ("cancel", _("Cancel"));
+-    d.add_response ("reset", _("Reset Title"));
+-    d.add_response ("override", _("Set Title"));
++    d.add_response("cancel", _("Cancel"));
++    d.add_response("reset", _("Reset Title"));
++    d.add_response("override", _("Set Title"));
+ 
+-    d.set_response_appearance ("cancel", Adw.ResponseAppearance.DEFAULT);
+-    d.set_response_appearance ("reset", Adw.ResponseAppearance.DESTRUCTIVE);
+-    d.set_response_appearance ("override", Adw.ResponseAppearance.SUGGESTED);
++    d.set_response_appearance("cancel", Adw.ResponseAppearance.DEFAULT);
++    d.set_response_appearance("reset", Adw.ResponseAppearance.DESTRUCTIVE);
++    d.set_response_appearance("override", Adw.ResponseAppearance.SUGGESTED);
+ 
+-    d.set_response_enabled ("override", entry.text.strip () != "");
+-    d.set_default_response ("override");
+-    d.set_close_response ("cancel");
++    d.set_response_enabled("override", entry.text.strip() != "");
++    d.set_default_response("override");
++    d.set_close_response("cancel");
+ 
+-    entry.changed.connect ((_entry) => {
+-      d.set_response_enabled ("override", _entry.text.strip () != "");
++    entry.changed.connect((_entry) => {
++      d.set_response_enabled("override", _entry.text.strip() != "");
+     });
+ 
+-    entry.activate.connect (() => {
+-      if (d.get_response_enabled ("override")) {
+-        d.response.emit ("override");
+-        d.close ();
++    entry.activate.connect(() => {
++      if (d.get_response_enabled("override")) {
++        d.response.emit("override");
++        d.close();
+       }
+     });
+ 
+-    d.response.connect ((response) => {
++    d.response.connect((response) => {
+       if (target is Adw.TabPage) {
+         if (response == "reset") {
+-          (target.child as TerminalTab)?.override_title (null);
+-        }
+-        else if (response == "override" && entry.text != "") {
+-          (target.child as TerminalTab)?.override_title (entry.text);
++          (target.child as TerminalTab)?.override_title(null);
++        } else if (response == "override" && entry.text != "") {
++          (target.child as TerminalTab)?.override_title(entry.text);
+         }
+       }
+ 
+-      d.destroy ();
++      d.destroy();
+       entry = null;
+       target = null;
+       d = null;
+     });
+ 
+-    d.present (this);
++    d.present(this);
+   }
+ 
+-  private void move_tab_left () {
++  private void move_tab_left() {
+     var target = this.tab_menu_target ?? this.tab_view.selected_page;
+-    if (target == null) return;
++    if (target == null) { return; }
+ 
+-    var pos = this.tab_view.get_page_position (target);
+-    if (pos == 0) return;
+-    this.tab_view.reorder_page (target, pos - 1);
++    var pos = this.tab_view.get_page_position(target);
++    if (pos == 0) { return; }
++    this.tab_view.reorder_page(target, pos - 1);
+   }
+ 
+-  private void move_tab_right () {
++  private void move_tab_right() {
+     var target = this.tab_menu_target ?? this.tab_view.selected_page;
+-    if (target == null) return;
++    if (target == null) { return; }
+ 
+-    var pos = this.tab_view.get_page_position (target);
+-    if (pos >= this.tab_view.n_pages - 1) return;
+-    this.tab_view.reorder_page (target, pos + 1);
++    var pos = this.tab_view.get_page_position(target);
++    if (pos >= this.tab_view.n_pages - 1) { return; }
++    this.tab_view.reorder_page(target, pos + 1);
+   }
+ 
+-  private void close_specific_tab () {
++  private void close_specific_tab() {
+     var target = this.tab_menu_target ?? this.tab_view.selected_page;
+-    if (target == null) return;
++    if (target == null) { return; }
+ 
+-    this.tab_view.close_page (target);
++    this.tab_view.close_page(target);
+   }
+ 
+-  private void detatch_tab () {
++  private void detatch_tab() {
+     var target = this.tab_menu_target ?? this.tab_view.selected_page;
+-    if (target == null) return;
++    if (target == null) { return; }
+ 
+-    var w = new Window (this.application, null, null, true);
+-    this.tab_view.transfer_page (target, w.tab_view, 0);
+-    w.present ();
++    var w = new Window(this.application, null, null, true);
++    this.tab_view.transfer_page(target, w.tab_view, 0);
++    w.present();
+   }
+ 
+-  public void search () {
+-    (this.tab_view.selected_page?.child as TerminalTab)?.search ();
++  public void search() {
++    (this.tab_view.selected_page?.child as TerminalTab)?.search();
+   }
+ 
+-  public void zoom_in () {
+-    this.active_terminal?.zoom_in ();
++  public void zoom_in() {
++    this.active_terminal?.zoom_in();
+   }
+ 
+-  public void zoom_out () {
+-    this.active_terminal?.zoom_out ();
++  public void zoom_out() {
++    this.active_terminal?.zoom_out();
+   }
+ 
+-  public void zoom_default () {
+-    this.active_terminal?.zoom_default ();
++  public void zoom_default() {
++    this.active_terminal?.zoom_default();
+   }
+ 
+-  public void close_active_tab () {
+-    this.tab_view.close_page (this.tab_view.selected_page);
++  public void close_active_tab() {
++    this.tab_view.close_page(this.tab_view.selected_page);
+   }
+ 
+-  private void on_open_link () {
+-    if (this.link == null) return;
++  private void on_open_link() {
++    if (this.link == null) { return; }
+ 
+     try {
+-      GLib.AppInfo.launch_default_for_uri (this.link, null);
+-    }
+-    catch (Error e) {
+-      warning ("Failed to open link %s", e.message);
++      GLib.AppInfo.launch_default_for_uri(this.link, null);
++    } catch (Error e) {
++      warning("Failed to open link %s", e.message);
+     }
+   }
+ 
+-  private void on_copy_link () {
+-    if (this.link == null) return;
++  private void on_copy_link() {
++    if (this.link == null) { return; }
+ 
+-    Gdk.Display.get_default ().get_clipboard ().set_text (this.link);
++    Gdk.Display.get_default().get_clipboard().set_text(this.link);
+   }
+ 
+-  public void on_new_tab () {
++  public void on_new_tab() {
+     string? cwd = Terminal
+-      .get_current_working_directory_for_new_session (this.active_terminal);
++      .get_current_working_directory_for_new_session(this.active_terminal);
+ 
+-    this.new_tab (null, cwd);
++    this.new_tab(null, cwd);
+   }
+ 
+-  public void new_tab (string? command, string? cwd) {
+-    var tab = new TerminalTab (this, this.tab_view.n_pages + 1, command, cwd);
+-    var page = this.tab_view.add_page (tab, null);
++  public void new_tab(string? command, string? cwd) {
++    var tab = new TerminalTab(this, this.tab_view.n_pages + 1, command, cwd);
++    var page = this.tab_view.add_page(tab, null);
+ 
+-    tab.terminal.bind_property ("needs-attention",
+-                                page,
+-                                "needs-attention",
+-                                GLib.BindingFlags.SYNC_CREATE,
+-                                null,
+-                                null);
++    tab.terminal.bind_property("needs-attention",
++                               page,
++                               "needs-attention",
++                               GLib.BindingFlags.SYNC_CREATE,
++                               null,
++                               null);
+ 
+-    tab.bind_property ("title",
+-                       page,
+-                       "title",
+-                       GLib.BindingFlags.SYNC_CREATE,
+-                       null,
+-                       null);
++    tab.bind_property("title",
++                      page,
++                      "title",
++                      GLib.BindingFlags.SYNC_CREATE,
++                      null,
++                      null);
+ 
+-    tab.close_request.connect ((_tab) => {
+-      var _page = this.tab_view.get_page (_tab);
++    tab.close_request.connect((_tab) => {
++      var _page = this.tab_view.get_page(_tab);
+       if (_page != null) {
+-        this.tab_view.close_page (_page);
++        this.tab_view.close_page(_page);
+       }
+     });
+ 
+-    this.tab_view.set_selected_page (page);
++    this.tab_view.set_selected_page(page);
+   }
+ 
+-  private void on_paste_activated () {
++  private void on_paste_activated() {
+     (this.tab_view.selected_page?.child as TerminalTab)?.terminal
+-      .do_paste_clipboard ();
++    .do_paste_clipboard();
+   }
+ 
+-  private void on_copy_activated () {
++  private void on_copy_activated() {
+     (this.tab_view.selected_page?.child as TerminalTab)?.terminal
+-      .do_copy_clipboard ();
++    .do_copy_clipboard();
+   }
+ 
+-  private void on_tab_selected () {
++  private void on_tab_selected() {
+     if (this.active_terminal_tab != null) {
+       foreach (unowned ulong id in this.active_terminal_tab_signal_handlers) {
+-        this.active_terminal_tab.disconnect (id);
++        this.active_terminal_tab.disconnect(id);
+       }
+-      this.active_terminal_tab_signal_handlers.remove_range (
++      this.active_terminal_tab_signal_handlers.remove_range(
+         0,
+         this.active_terminal_tab_signal_handlers.length
+       );
+     }
+     if (this.active_terminal != null) {
+       foreach (unowned ulong id in this.active_terminal_signal_handlers) {
+-        this.active_terminal.disconnect (id);
++        this.active_terminal.disconnect(id);
+       }
+-      this.active_terminal_signal_handlers.remove_range (
++      this.active_terminal_signal_handlers.remove_range(
+         0,
+         this.active_terminal_signal_handlers.length
+       );
+     }
+-    this.freeze_notify ();
+-    this.active_terminal_tab = this.tab_view.selected_page?.child as TerminalTab;
++    var outgoing_cwd = this.active_terminal?.get_current_working_directory();
++    if (outgoing_cwd != null) {
++      this.last_known_cwd = outgoing_cwd;
++    }
++
++    this.freeze_notify();
++    this.active_terminal_tab =
++      this.tab_view.selected_page?.child as TerminalTab;
+     this.active_terminal = this.active_terminal_tab?.terminal;
+-    this.active_terminal?.grab_focus ();
+-    this.thaw_notify ();
++    this.active_terminal?.grab_focus();
++    this.thaw_notify();
+   }
+ 
+-  private void on_active_terminal_tab_changed () {
++  private void on_active_terminal_tab_changed() {
+     if (this.active_terminal_tab == null) {
+       return;
+     }
+ 
+     ulong handler;
+ 
+-    this.on_active_terminal_selection_changed ();
++    this.on_active_terminal_selection_changed();
+     handler = this.active_terminal
+       .selection_changed
+-      .connect (this.on_active_terminal_selection_changed);
++      .connect(this.on_active_terminal_selection_changed);
+ 
+-    this.active_terminal_signal_handlers.append_val (handler);
++    this.active_terminal_signal_handlers.append_val(handler);
+ 
+     // FIXME: this should be watching the TerminalTab's `title`
+-    this.on_active_terminal_title_changed ();
++    this.on_active_terminal_title_changed();
+     handler = this.active_terminal_tab
+-      .notify ["title"]
+-      .connect (this.on_active_terminal_title_changed);
++      .notify["title"]
++      .connect(this.on_active_terminal_title_changed);
+ 
+-    this.active_terminal_tab_signal_handlers.append_val (handler);
++    this.active_terminal_tab_signal_handlers.append_val(handler);
+ 
+-    this.on_active_terminal_context_changed ();
++    this.on_active_terminal_context_changed();
+     handler = this.active_terminal
+       .context_changed
+-      .connect (this.on_active_terminal_tab_changed);
++      .connect(this.on_active_terminal_tab_changed);
+   }
+ 
+-  private void on_active_terminal_context_changed () {
++  private void on_active_terminal_context_changed() {
+     var context = this.active_terminal?.process?.context;
+     var is_context_aware_enabled =
+-      Settings.get_default ().context_aware_header_bar;
++      Settings.get_default().context_aware_header_bar;
+ 
+-    widget_set_css_class (
++    widget_set_css_class(
+       this,
+       "context-root",
+       context == ProcessContext.ROOT && is_context_aware_enabled
+     );
+ 
+-    widget_set_css_class (
++    widget_set_css_class(
+       this,
+       "context-ssh",
+       context == ProcessContext.SSH && is_context_aware_enabled
+     );
+   }
+ 
+-  private void on_active_terminal_title_changed () {
+-    this.active_terminal_title = this.tab_view.get_selected_page ().title;
++  private void on_active_terminal_title_changed() {
++    this.active_terminal_title = this.tab_view.get_selected_page().title;
+   }
+ 
+-  private void on_active_terminal_selection_changed () {
++  private void on_active_terminal_selection_changed() {
+     bool enabled = false;
+-    if (this.active_terminal?.get_has_selection ()) {
++    if (this.active_terminal?.get_has_selection()) {
+       enabled = true;
+     }
+-    this.copy_action.set_enabled (enabled);
++    this.copy_action.set_enabled(enabled);
+   }
+ 
+-  private void toggle_fullscreen () {
++  private void toggle_fullscreen() {
+     if (this.fullscreened) {
+-      this.unfullscreen ();
++      this.unfullscreen();
+     } else {
+-      this.fullscreen ();
++      this.fullscreen();
+     }
+   }
+ 
+-  public Window new_window (
++  public Window new_window(
+     string? cwd = null,
+     bool skip_initial_tab = false
+   ) {
+-    var w = new Window (this.application, null, cwd, skip_initial_tab);
+-    w.show ();
++    var w = new Window(this.application, null, cwd, skip_initial_tab);
++    w.show();
+     return w;
+   }
+ 
+-  public void focus_next_tab () {
+-    if (!this.tab_view.select_next_page ()) {
+-      this.tab_view.set_selected_page (this.tab_view.get_nth_page (0));
++  public void focus_next_tab() {
++    if (!this.tab_view.select_next_page()) {
++      this.tab_view.set_selected_page(this.tab_view.get_nth_page(0));
+     }
+   }
+ 
+-  public void focus_previous_tab () {
+-    if (!this.tab_view.select_previous_page ()) {
+-      this.tab_view.set_selected_page (this.tab_view.get_nth_page (this.tab_view.n_pages - 1));
++  public void focus_previous_tab() {
++    if (!this.tab_view.select_previous_page()) {
++      this.tab_view.set_selected_page(this.tab_view.get_nth_page(
++                                        this.tab_view.n_pages - 1));
+     }
+   }
+ 
+-  public void focus_nth_tab (int index) {
++  public void focus_nth_tab(int index) {
+     if (this.tab_view.n_pages <= 1) {
+       return;
+     }
+     if (index < 0) {
+       // Go to last tab
+-      this.tab_view.set_selected_page (
+-        this.tab_view.get_nth_page (this.tab_view.n_pages - 1)
++      this.tab_view.set_selected_page(
++        this.tab_view.get_nth_page(this.tab_view.n_pages - 1)
+       );
+       return;
+     }
+     if (index > this.tab_view.n_pages) {
+       return;
+-    }
+-    else {
+-      this.tab_view.set_selected_page (this.tab_view.get_nth_page (index - 1));
++    } else {
++      this.tab_view.set_selected_page(this.tab_view.get_nth_page(index - 1));
+       return;
+     }
+   }
+ 
+-  public void focus_tab_with_id (uint tab_id) {
+-    for (int i = 0; i != this.tab_view.get_n_pages (); i++) {
+-      var page = this.tab_view.get_nth_page (i);
+-      var tab = page.get_child () as TerminalTab;
+-      if (tab != null && tab.get_id () == tab_id) {
+-        this.tab_view.set_selected_page (page);
+-        this.present ();
++  public void focus_tab_with_id(uint tab_id) {
++    for (int i = 0; i != this.tab_view.get_n_pages(); i++) {
++      var page = this.tab_view.get_nth_page(i);
++      var tab = page.get_child() as TerminalTab;
++      if (tab != null && tab.get_id() == tab_id) {
++        this.tab_view.set_selected_page(page);
++        this.present();
+         return;
+       }
+     }

diff --git a/blackbox-terminal.spec b/blackbox-terminal.spec
index 062c922..d4688c2 100644
--- a/blackbox-terminal.spec
+++ b/blackbox-terminal.spec
@@ -1,13 +1,17 @@
 %global rdnn    com.raggesilver.BlackBox
 
 Name:           blackbox-terminal
-Version:        0.15.1
+Version:        0.15.2
 Release:        %autorelease
 Summary:        Elegant and customizable terminal for GNOME
 License:        GPL-3.0-or-later
 URL:            https://gitlab.gnome.org/raggesilver/blackbox
 Source:         %{url}/-/archive/v%{version}/blackbox-v%{version}.tar.gz
 
+# https://gitlab.gnome.org/raggesilver/blackbox/-/work_items/424
+# https://gitlab.gnome.org/raggesilver/blackbox/-/commit/7182d6da8ddbd925db001b30ed6b3b00927dd7f5
+Patch:          0001-Implement-last-known-cwd.patch
+
 # https://fedoraproject.org/wiki/Changes/EncourageI686LeafRemoval
 ExcludeArch:    %{ix86}
 
@@ -37,6 +41,17 @@ Requires:       hicolor-icon-theme
 Black Box is an elegant and customizable terminal for GNOME.
 
 
+%package nautilus
+Summary:        Black Box extension for Nautilus
+Requires:       %{name}%{?_isa} = %{version}-%{release}
+Requires:       nautilus-python%{?_isa}
+
+
+%description nautilus
+This package provides a Nautilus extension that adds the 'Open in Black Box'
+option to the right-click context menu in Nautilus.
+
+
 %prep
 %autosetup -p 1 -n blackbox-v%{version}
 
@@ -71,5 +86,9 @@ appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/%{rdnn}.metain
 %{_metainfodir}/%{rdnn}.metainfo.xml
 
 
+%files nautilus
+%{_datadir}/nautilus-python/extensions/open-blackbox.py
+
+
 %changelog
 %autochangelog

diff --git a/sources b/sources
index a272ba4..9c36640 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-SHA512 (blackbox-v0.15.1.tar.gz) = a0525f21a910d03b3ad57dc1b3ec970c583261c261bcc17436c01ee29a7cd162052427d7c2be3c4a0e7247adb2b580753253c13e4fc933723ff93a2607aca4ce
+SHA512 (blackbox-v0.15.2.tar.gz) = 8ed4a0972268e86a5cfa7b87d489545b734e99a2d512d757188c5a9ee28ef8b7c63b28ab82dfe7bce5ea64d2f27c81ab8305de06bf14c9cdea2fec5e29864312

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2026-07-01 19:18 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-07-01 19:18 [rpms/blackbox-terminal] f43: Update to version 0.15.2 Carl George

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox