public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/blackbox-terminal] f44: Update to version 0.15.2
@ 2026-07-01 19:17 Carl George
0 siblings, 0 replies; only message in thread
From: Carl George @ 2026-07-01 19:17 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/blackbox-terminal
Branch : f44
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=f44
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:17 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:17 [rpms/blackbox-terminal] f44: 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