--- src/Widgets/TerminalWidget.vala.orig 2022-10-27 16:47:44 UTC +++ src/Widgets/TerminalWidget.vala @@ -68,13 +68,6 @@ namespace Terminal { } public int default_size; - const string SEND_PROCESS_FINISHED_BASH = "dbus-send --type=method_call " + - "--session --dest=io.elementary.terminal " + - "/io/elementary/terminal " + - "io.elementary.terminal.ProcessFinished " + - "string:$PANTHEON_TERMINAL_ID " + - "string:\"$(fc -nl -1 | cut -c 3-)\" " + - "int32:\$__bp_last_ret_value >/dev/null 2>&1"; /* Following strings are used to build RegEx for matching URIs */ const string USERCHARS = "-[:alnum:]"; @@ -351,15 +344,7 @@ namespace Terminal { shell = Vte.get_user_shell (); envv = { - // Export ID so we can identify the terminal for which the process completion is reported - "PANTHEON_TERMINAL_ID=" + terminal_id, - - // Export callback command a BASH-specific variable, see "man bash" for details - "PROMPT_COMMAND=" + SEND_PROCESS_FINISHED_BASH + Environment.get_variable ("PROMPT_COMMAND"), - - // ZSH callback command will be read from ZSH config file supplied by us, see data/ - - // TODO: support FISH, see https://github.com/fish-shell/fish-shell/issues/1382 + "PANTHEON_TERMINAL_ID=" + terminal_id }; /* We need opening uri to be available asap when constructing window with working directory @@ -436,12 +421,49 @@ namespace Terminal { return this.match_check_event (event, null); } + private string? extract_cwd (string data) { + string[] tokens; + string result = null; + + tokens = data.split (" "); + if (tokens.length > 0) { + result = tokens[(tokens.length - 1)]; + } + return result; + } + public string get_shell_location () { + string[] spawn_env = GLib.Environ.get (); + string[] procstat_cmd = { "/usr/bin/pwdx", "--libxo:T", }; + string standard_output = null; + bool res; + string cwd = null; + int pid = (!) (this.child_pid); + // Update procstat(1) argument + procstat_cmd += pid.to_string (); + try { - return GLib.FileUtils.read_link ("/proc/%d/cwd".printf (pid)); - } catch (GLib.FileError error) { + res = GLib.Process.spawn_sync (null, procstat_cmd, + spawn_env, + GLib.SpawnFlags.STDERR_TO_DEV_NULL, + null, + out standard_output, + null, null); + if (res) { + cwd = extract_cwd (standard_output.strip ()); + if (cwd != null) { + return cwd; + } + else { + return GLib.Environment.get_current_dir (); + } + } + else { + return GLib.Environment.get_current_dir (); + } + } catch (GLib.SpawnError error) { /* Tab name disambiguation may call this before shell location available. */ /* No terminal warning needed */ return "";