From 3a1a7ca5f75e6b57717f748757a534a7d75301e2 Mon Sep 17 00:00:00 2001 From: Debarshi Ray Date: Jun 19 2019 13:16:06 +0000 Subject: Support tracking the active container inside the terminal https://gitlab.freedesktop.org/terminal-wg/specifications/issues/17 --- diff --git a/vte291-cntnr-precmd-preexec-scroll.patch b/vte291-cntnr-precmd-preexec-scroll.patch new file mode 100644 index 0000000..d2ab9f5 --- /dev/null +++ b/vte291-cntnr-precmd-preexec-scroll.patch @@ -0,0 +1,1291 @@ +From b499620a43f69fe899210a9cba509a6b3999c4a4 Mon Sep 17 00:00:00 2001 +From: Debarshi Ray +Date: Wed, 7 Jan 2015 16:01:00 +0100 +Subject: [PATCH 01/10] Add sequences and signals for desktop notification + +Add sequences + OSC 777 ; notify ; SUMMARY ; BODY BEL + OSC 777 ; notify ; SUMMARY BEL + OSC 777 ; notify ; SUMMARY ; BODY ST + OSC 777 ; notify ; SUMMARY ST + +that let terminal applications send a notification to the desktop +environment. + +Based on Enlightenment's Terminology: +https://phab.enlightenment.org/T1765 + +https://bugzilla.gnome.org/show_bug.cgi?id=711059 +--- + src/marshal.list | 1 + + src/vte.cc | 9 +++++++++ + src/vte/vteterminal.h | 4 +++- + src/vtegtk.cc | 21 +++++++++++++++++++++ + src/vtegtk.hh | 1 + + src/vteinternal.hh | 8 ++++++++ + src/vteseq.cc | 32 +++++++++++++++++++++++++++++++- + 7 files changed, 74 insertions(+), 2 deletions(-) + +diff --git a/src/marshal.list b/src/marshal.list +index 1e4d0c1b6476..3385b4759713 100644 +--- a/src/marshal.list ++++ b/src/marshal.list +@@ -1,5 +1,6 @@ + VOID:INT,INT + VOID:OBJECT,OBJECT + VOID:STRING,BOXED ++VOID:STRING,STRING + VOID:STRING,UINT + VOID:UINT,UINT +diff --git a/src/vte.cc b/src/vte.cc +index 0aa9a3fc6b42..cef9a05be18a 100644 +--- a/src/vte.cc ++++ b/src/vte.cc +@@ -10205,6 +10205,15 @@ Terminal::emit_pending_signals() + + emit_adjustment_changed(); + ++ if (m_notification_received) { ++ _vte_debug_print (VTE_DEBUG_SIGNALS, ++ "Emitting `notification-received'.\n"); ++ g_signal_emit(object, signals[SIGNAL_NOTIFICATION_RECEIVED], 0, ++ m_notification_summary.c_str(), ++ m_notification_body.c_str()); ++ m_notification_received = false; ++ } ++ + if (m_window_title_changed) { + if (m_window_title != m_window_title_pending) { + m_window_title.swap(m_window_title_pending); +diff --git a/src/vte/vteterminal.h b/src/vte/vteterminal.h +index 26ac236ef4ea..abf1a38cb20d 100644 +--- a/src/vte/vteterminal.h ++++ b/src/vte/vteterminal.h +@@ -104,8 +104,10 @@ struct _VteTerminalClass { + + void (*bell)(VteTerminal* terminal); + ++ void (*notification_received)(VteTerminal* terminal, const gchar *summary, const gchar *body); ++ + /* Padding for future expansion. */ +- gpointer padding[16]; ++ gpointer padding[15]; + + VteTerminalClassPrivate *priv; + }; +diff --git a/src/vtegtk.cc b/src/vtegtk.cc +index c47a5c4a9d2b..03570d4c5554 100644 +--- a/src/vtegtk.cc ++++ b/src/vtegtk.cc +@@ -727,6 +727,7 @@ vte_terminal_class_init(VteTerminalClass *klass) + klass->child_exited = NULL; + klass->encoding_changed = NULL; + klass->char_size_changed = NULL; ++ klass->notification_received = NULL; + klass->window_title_changed = NULL; + klass->icon_title_changed = NULL; + klass->selection_changed = NULL; +@@ -802,6 +803,26 @@ vte_terminal_class_init(VteTerminalClass *klass) + G_TYPE_NONE, + 1, G_TYPE_INT); + ++ /** ++ * VteTerminal::notification-received: ++ * @vteterminal: the object which received the signal ++ * @summary: The summary ++ * @body: (allow-none): Extra optional text ++ * ++ * Emitted when a process running in the terminal wants to ++ * send a notification to the desktop environment. ++ */ ++ signals[SIGNAL_NOTIFICATION_RECEIVED] = ++ g_signal_new(I_("notification-received"), ++ G_OBJECT_CLASS_TYPE(klass), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET(VteTerminalClass, notification_received), ++ NULL, ++ NULL, ++ _vte_marshal_VOID__STRING_STRING, ++ G_TYPE_NONE, ++ 2, G_TYPE_STRING, G_TYPE_STRING); ++ + /** + * VteTerminal::window-title-changed: + * @vteterminal: the object which received the signal +diff --git a/src/vtegtk.hh b/src/vtegtk.hh +index c49754ef38ee..126d29326f11 100644 +--- a/src/vtegtk.hh ++++ b/src/vtegtk.hh +@@ -56,6 +56,7 @@ enum { + SIGNAL_TEXT_INSERTED, + SIGNAL_TEXT_MODIFIED, + SIGNAL_TEXT_SCROLLED, ++ SIGNAL_NOTIFICATION_RECEIVED, + SIGNAL_WINDOW_TITLE_CHANGED, + LAST_SIGNAL + }; +diff --git a/src/vteinternal.hh b/src/vteinternal.hh +index 58cb0479c5c4..dd4bd37c38e1 100644 +--- a/src/vteinternal.hh ++++ b/src/vteinternal.hh +@@ -539,6 +539,11 @@ public: + gboolean m_cursor_moved_pending; + gboolean m_contents_changed_pending; + ++ /* desktop notification */ ++ bool m_notification_received{false}; ++ std::string m_notification_summary; ++ std::string m_notification_body; ++ + std::string m_window_title{}; + std::string m_current_directory_uri{}; + std::string m_current_file_uri{}; +@@ -1269,6 +1274,9 @@ public: + int osc) noexcept; + + /* OSC handlers */ ++ void handle_urxvt_extension(vte::parser::Sequence const& seq, ++ vte::parser::StringTokeniser::const_iterator& token, ++ vte::parser::StringTokeniser::const_iterator const& endtoken) noexcept; + void set_color(vte::parser::Sequence const& seq, + vte::parser::StringTokeniser::const_iterator& token, + vte::parser::StringTokeniser::const_iterator const& endtoken, +diff --git a/src/vteseq.cc b/src/vteseq.cc +index d596d8b9f56f..fcc2cc872f4c 100644 +--- a/src/vteseq.cc ++++ b/src/vteseq.cc +@@ -1334,6 +1334,33 @@ Terminal::delete_lines(vte::grid::row_t param) + m_text_deleted_flag = TRUE; + } + ++void ++Terminal::handle_urxvt_extension(vte::parser::Sequence const& seq, ++ vte::parser::StringTokeniser::const_iterator& token, ++ vte::parser::StringTokeniser::const_iterator const& endtoken) noexcept ++{ ++ if (token == endtoken) ++ return; ++ ++ if (*token == "notify") { ++ ++token; ++ ++ if (token == endtoken) ++ return; ++ ++ m_notification_summary = *token; ++ m_notification_body.clear(); ++ m_notification_received = true; ++ ++token; ++ ++ if (token == endtoken) ++ return; ++ ++ m_notification_body = *token; ++ return; ++ } ++} ++ + bool + Terminal::get_osc_color_index(int osc, + int value, +@@ -6411,6 +6438,10 @@ Terminal::OSC(vte::parser::Sequence const& seq) + reset_color(VTE_HIGHLIGHT_FG, VTE_COLOR_SOURCE_ESCAPE); + break; + ++ case VTE_OSC_URXVT_EXTENSION: ++ handle_urxvt_extension(seq, it, cend); ++ break; ++ + case VTE_OSC_XTERM_SET_ICON_TITLE: + case VTE_OSC_XTERM_SET_XPROPERTY: + case VTE_OSC_XTERM_SET_COLOR_MOUSE_CURSOR_FG: +@@ -6451,7 +6482,6 @@ Terminal::OSC(vte::parser::Sequence const& seq) + case VTE_OSC_URXVT_SET_FONT_BOLD_ITALIC: + case VTE_OSC_URXVT_VIEW_UP: + case VTE_OSC_URXVT_VIEW_DOWN: +- case VTE_OSC_URXVT_EXTENSION: + case VTE_OSC_YF_RQGWR: + default: + break; +-- +2.20.1 + + +From 4ad3660c4d2ec7752d665f6b12a46498a3b595d1 Mon Sep 17 00:00:00 2001 +From: Debarshi Ray +Date: Thu, 29 Jan 2015 13:09:17 +0100 +Subject: [PATCH 02/10] vte.sh: Emit OSC 777 from PROMPT_COMMAND + +For some reason, the three consecutive backslashes break the parsing. +As Christian Persch suggested, replacing the double quotes with +singles fixes it. + +https://bugzilla.gnome.org/show_bug.cgi?id=711059 +--- + src/vte.sh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/vte.sh b/src/vte.sh +index 6d1a8734c479..b75c6dac6f6e 100644 +--- a/src/vte.sh ++++ b/src/vte.sh +@@ -50,9 +50,11 @@ __vte_osc7 () { + } + + __vte_prompt_command() { ++ local command=$(HISTTIMEFORMAT= history 1 | sed 's/^ *[0-9]\+ *//') ++ command="${command//;/ }" + local pwd='~' + [ "$PWD" != "$HOME" ] && pwd=${PWD/#$HOME\//\~\/} +- printf "\033]0;%s@%s:%s\033\\%s" "${USER}" "${HOSTNAME%%.*}" "${pwd}" "$(__vte_osc7)" ++ printf '\033]777;notify;Command completed;%s\033\\\033]0;%s@%s:%s\033\\%s' "${command}" "${USER}" "${HOSTNAME%%.*}" "${pwd}" "$(__vte_osc7)" + } + + case "$TERM" in +-- +2.20.1 + + +From 2c3e7136a7ead33a49c8190ceb3c7dcc22dc9f2d Mon Sep 17 00:00:00 2001 +From: Debarshi Ray +Date: Thu, 22 Jan 2015 16:37:10 +0100 +Subject: [PATCH 03/10] Test the notification-received signal + +--- + bindings/vala/app.vala | 7 +++++++ + src/app/app.cc | 10 ++++++++++ + 2 files changed, 17 insertions(+) + +diff --git a/bindings/vala/app.vala b/bindings/vala/app.vala +index fc26c2b0dfc3..634b8ddeeb91 100644 +--- a/bindings/vala/app.vala ++++ b/bindings/vala/app.vala +@@ -309,6 +309,8 @@ class Window : Gtk.ApplicationWindow + if (Options.object_notifications) + terminal.notify.connect(notify_cb); + ++ terminal.notification_received.connect(notification_received_cb); ++ + /* Settings */ + if (Options.no_double_buffer) + terminal.set_double_buffered(false); +@@ -780,6 +782,11 @@ class Window : Gtk.ApplicationWindow + set_title(terminal.get_window_title()); + } + ++ private void notification_received_cb(Vte.Terminal terminal, string summary, string? body) ++ { ++ print ("[%s]: %s\n", summary, body); ++ } ++ + } /* class Window */ + + class App : Gtk.Application +diff --git a/src/app/app.cc b/src/app/app.cc +index 495bdcfa3768..8ae589ad2449 100644 +--- a/src/app/app.cc ++++ b/src/app/app.cc +@@ -1671,6 +1671,14 @@ window_window_title_changed_cb(VteTerminal* terminal, + vte_terminal_get_window_title(window->terminal)); + } + ++static void ++notification_received_cb(VteTerminal *terminal, ++ const gchar *summary, ++ const gchar *body) ++{ ++ g_print("[%s]: %s\n", summary, body); ++} ++ + static void + window_lower_window_cb(VteTerminal* terminal, + VteappWindow* window) +@@ -1899,6 +1907,8 @@ vteapp_window_constructed(GObject *object) + if (options.object_notifications) + g_signal_connect(window->terminal, "notify", G_CALLBACK(window_notify_cb), window); + ++ g_signal_connect(window->terminal, "notification-received", G_CALLBACK(notification_received_cb), NULL); ++ + /* Settings */ + if (options.no_double_buffer) + gtk_widget_set_double_buffered(GTK_WIDGET(window->terminal), false); +-- +2.20.1 + + +From 0cb697eee07433766360a7e85b6f0d2f520a75bf Mon Sep 17 00:00:00 2001 +From: Debarshi Ray +Date: Fri, 13 May 2016 17:53:54 +0200 +Subject: [PATCH 04/10] Add a property to configure the scroll speed + +By default, it is set to zero which gives the current behaviour of +moving the buffer by a function of the number of visible rows. + +https://bugzilla.redhat.com/show_bug.cgi?id=1103380 +--- + doc/reference/vte-sections.txt | 1 + + src/vte.cc | 19 +++++++++++++- + src/vte/vteterminal.h | 4 +++ + src/vtegtk.cc | 45 ++++++++++++++++++++++++++++++++++ + src/vtegtk.hh | 1 + + src/vteinternal.hh | 2 ++ + 6 files changed, 71 insertions(+), 1 deletion(-) + +diff --git a/doc/reference/vte-sections.txt b/doc/reference/vte-sections.txt +index 9ab873c17bfc..7b94f4df9a30 100644 +--- a/doc/reference/vte-sections.txt ++++ b/doc/reference/vte-sections.txt +@@ -55,6 +55,7 @@ vte_terminal_get_cursor_blink_mode + vte_terminal_set_cursor_blink_mode + vte_terminal_get_text_blink_mode + vte_terminal_set_text_blink_mode ++vte_terminal_set_scroll_speed + vte_terminal_set_scrollback_lines + vte_terminal_get_scrollback_lines + vte_terminal_set_font +diff --git a/src/vte.cc b/src/vte.cc +index cef9a05be18a..3ae3c8b33c00 100644 +--- a/src/vte.cc ++++ b/src/vte.cc +@@ -9452,6 +9452,7 @@ void + Terminal::widget_scroll(GdkEventScroll *event) + { + gdouble delta_x, delta_y; ++ gdouble scroll_speed; + gdouble v; + gint cnt, i; + int button; +@@ -9505,7 +9506,13 @@ Terminal::widget_scroll(GdkEventScroll *event) + return; + } + +- v = MAX (1., ceil (gtk_adjustment_get_page_increment (m_vadjustment) / 10.)); ++ if (m_scroll_speed == 0) { ++ scroll_speed = ceil (gtk_adjustment_get_page_increment (m_vadjustment) / 10.); ++ } else { ++ scroll_speed = m_scroll_speed; ++ } ++ ++ v = MAX (1., scroll_speed); + _vte_debug_print(VTE_DEBUG_EVENTS, + "Scroll speed is %d lines per non-smooth scroll unit\n", + (int) v); +@@ -9766,6 +9773,16 @@ Terminal::decscusr_cursor_shape() + } + } + ++bool ++Terminal::set_scroll_speed(unsigned int scroll_speed) ++{ ++ if (scroll_speed == m_scroll_speed) ++ return false; ++ ++ m_scroll_speed = scroll_speed; ++ return true; ++} ++ + bool + Terminal::set_scrollback_lines(long lines) + { +diff --git a/src/vte/vteterminal.h b/src/vte/vteterminal.h +index abf1a38cb20d..c8ba72023370 100644 +--- a/src/vte/vteterminal.h ++++ b/src/vte/vteterminal.h +@@ -296,6 +296,10 @@ void vte_terminal_set_cursor_shape(VteTerminal *terminal, + _VTE_PUBLIC + VteCursorShape vte_terminal_get_cursor_shape(VteTerminal *terminal) _VTE_GNUC_NONNULL(1); + ++_VTE_PUBLIC ++void vte_terminal_set_scroll_speed(VteTerminal *terminal, ++ guint scroll_speed) _VTE_GNUC_NONNULL(1); ++ + /* Set the number of scrollback lines, above or at an internal minimum. */ + _VTE_PUBLIC + void vte_terminal_set_scrollback_lines(VteTerminal *terminal, +diff --git a/src/vtegtk.cc b/src/vtegtk.cc +index 03570d4c5554..b905b82b2514 100644 +--- a/src/vtegtk.cc ++++ b/src/vtegtk.cc +@@ -517,6 +517,9 @@ vte_terminal_get_property (GObject *object, + case PROP_REWRAP_ON_RESIZE: + g_value_set_boolean (value, vte_terminal_get_rewrap_on_resize (terminal)); + break; ++ case PROP_SCROLL_SPEED: ++ g_value_set_uint (value, impl->m_scroll_speed); ++ break; + case PROP_SCROLLBACK_LINES: + g_value_set_uint (value, vte_terminal_get_scrollback_lines(terminal)); + break; +@@ -618,6 +621,9 @@ vte_terminal_set_property (GObject *object, + case PROP_REWRAP_ON_RESIZE: + vte_terminal_set_rewrap_on_resize (terminal, g_value_get_boolean (value)); + break; ++ case PROP_SCROLL_SPEED: ++ vte_terminal_set_scroll_speed (terminal, g_value_get_uint (value)); ++ break; + case PROP_SCROLLBACK_LINES: + vte_terminal_set_scrollback_lines (terminal, g_value_get_uint (value)); + break; +@@ -1562,6 +1568,21 @@ vte_terminal_class_init(VteTerminalClass *klass) + TRUE, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY)); + ++ /** ++ * VteTerminal:scroll-speed: ++ * ++ * The number of lines by which the buffer is moved when ++ * scrolling with a mouse wheel on top of the terminal ++ * Setting it to zero will cause the buffer to be moved by an ++ * amount depending on the number of visible rows the widget ++ * can display. ++ */ ++ pspecs[PROP_SCROLL_SPEED] = ++ g_param_spec_uint ("scroll-speed", NULL, NULL, ++ 0, G_MAXUINT, ++ 0, ++ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY)); ++ + /** + * VteTerminal:scrollback-lines: + * +@@ -4111,6 +4132,30 @@ vte_terminal_get_row_count(VteTerminal *terminal) + return IMPL(terminal)->m_row_count; + } + ++/** ++ * vte_terminal_set_scroll_speed: ++ * @terminal: a #VteTerminal ++ * @scroll_speed: move the buffer by this number of lines while scrolling ++ * ++ * Sets the number of lines by which the buffer is moved when ++ * scrolling with a mouse wheel. Setting it to zero will cause the ++ * buffer to be moved by an amount depending on the number of visible ++ * rows the widget can display. ++ */ ++void ++vte_terminal_set_scroll_speed(VteTerminal *terminal, guint scroll_speed) ++{ ++ g_return_if_fail(VTE_IS_TERMINAL(terminal)); ++ ++ GObject *object = G_OBJECT(terminal); ++ g_object_freeze_notify(object); ++ ++ if (IMPL(terminal)->set_scroll_speed(scroll_speed)) ++ g_object_notify_by_pspec(object, pspecs[PROP_SCROLL_SPEED]); ++ ++ g_object_thaw_notify(object); ++} ++ + /** + * vte_terminal_set_scrollback_lines: + * @terminal: a #VteTerminal +diff --git a/src/vtegtk.hh b/src/vtegtk.hh +index 126d29326f11..b2c9edfa8246 100644 +--- a/src/vtegtk.hh ++++ b/src/vtegtk.hh +@@ -86,6 +86,7 @@ enum { + PROP_MOUSE_POINTER_AUTOHIDE, + PROP_PTY, + PROP_REWRAP_ON_RESIZE, ++ PROP_SCROLL_SPEED, + PROP_SCROLLBACK_LINES, + PROP_SCROLL_ON_KEYSTROKE, + PROP_SCROLL_ON_OUTPUT, +diff --git a/src/vteinternal.hh b/src/vteinternal.hh +index dd4bd37c38e1..9cc246338151 100644 +--- a/src/vteinternal.hh ++++ b/src/vteinternal.hh +@@ -418,6 +418,7 @@ public: + /* Scrolling options. */ + gboolean m_scroll_on_output; + gboolean m_scroll_on_keystroke; ++ guint m_scroll_speed; + vte::grid::row_t m_scrollback_lines; + + /* Restricted scrolling */ +@@ -1147,6 +1148,7 @@ public: + bool set_mouse_autohide(bool autohide); + bool set_pty(VtePty *pty); + bool set_rewrap_on_resize(bool rewrap); ++ bool set_scroll_speed(unsigned int scroll_speed); + bool set_scrollback_lines(long lines); + bool set_scroll_on_keystroke(bool scroll); + bool set_scroll_on_output(bool scroll); +-- +2.20.1 + + +From a97c47e18b9e244200e41203f6db439aa1b93b3a Mon Sep 17 00:00:00 2001 +From: Debarshi Ray +Date: Fri, 13 May 2016 17:54:57 +0200 +Subject: [PATCH 05/10] Test the scroll-speed property + +https://bugzilla.redhat.com/show_bug.cgi?id=1103380 +--- + bindings/vala/app.vala | 4 ++++ + src/app/app.cc | 4 ++++ + 2 files changed, 8 insertions(+) + +diff --git a/bindings/vala/app.vala b/bindings/vala/app.vala +index 634b8ddeeb91..c984b868246d 100644 +--- a/bindings/vala/app.vala ++++ b/bindings/vala/app.vala +@@ -335,6 +335,7 @@ class Window : Gtk.ApplicationWindow + terminal.set_rewrap_on_resize(!Options.no_rewrap); + terminal.set_scroll_on_output(false); + terminal.set_scroll_on_keystroke(true); ++ terminal.set_scroll_speed(Options.scroll_speed); + terminal.set_scrollback_lines(Options.scrollback_lines); + + /* Style */ +@@ -857,6 +858,7 @@ class App : Gtk.Application + public static bool object_notifications = false; + public static string? output_filename = null; + public static bool reverse = false; ++ public static uint scroll_speed = 0; + public static int scrollback_lines = 512; + public static int transparency_percent = 0; + public static bool version = false; +@@ -1050,6 +1052,8 @@ class App : Gtk.Application + "Save terminal contents to file at exit", null }, + { "reverse", 0, 0, OptionArg.NONE, ref reverse, + "Reverse foreground/background colors", null }, ++ { "scroll-speed", 0, 0, OptionArg.INT, ref scroll_speed, ++ "Specify the scroll speed", null }, + { "scrollback-lines", 'n', 0, OptionArg.INT, ref scrollback_lines, + "Specify the number of scrollback-lines", null }, + { "transparent", 'T', 0, OptionArg.INT, ref transparency_percent, +diff --git a/src/app/app.cc b/src/app/app.cc +index 8ae589ad2449..589bd5679acd 100644 +--- a/src/app/app.cc ++++ b/src/app/app.cc +@@ -93,6 +93,7 @@ public: + int verbosity{0}; + double cell_height_scale{1.0}; + double cell_width_scale{1.0}; ++ unsigned int scroll_speed{0}; + VteCursorBlinkMode cursor_blink_mode{VTE_CURSOR_BLINK_SYSTEM}; + VteCursorShape cursor_shape{VTE_CURSOR_SHAPE_BLOCK}; + VteTextBlinkMode text_blink_mode{VTE_TEXT_BLINK_ALWAYS}; +@@ -405,6 +406,8 @@ public: + "Save terminal contents to file at exit", nullptr }, + { "reverse", 0, 0, G_OPTION_ARG_NONE, &reverse, + "Reverse foreground/background colors", nullptr }, ++ { "scroll-speed", 0, 0, G_OPTION_ARG_INT, &scroll_speed, ++ "Specify the scroll speed", nullptr }, + { "scrollback-lines", 'n', 0, G_OPTION_ARG_INT, &scrollback_lines, + "Specify the number of scrollback-lines (-1 for infinite)", nullptr }, + { "transparent", 'T', 0, G_OPTION_ARG_INT, &transparency_percent, +@@ -1937,6 +1940,7 @@ vteapp_window_constructed(GObject *object) + vte_terminal_set_rewrap_on_resize(window->terminal, !options.no_rewrap); + vte_terminal_set_scroll_on_output(window->terminal, false); + vte_terminal_set_scroll_on_keystroke(window->terminal, true); ++ vte_terminal_set_scroll_speed(window->terminal, options.scroll_speed); + vte_terminal_set_scrollback_lines(window->terminal, options.scrollback_lines); + vte_terminal_set_text_blink_mode(window->terminal, options.text_blink_mode); + +-- +2.20.1 + + +From 11361619738505e4870a1de73611a33ffe4892fb Mon Sep 17 00:00:00 2001 +From: Debarshi Ray +Date: Wed, 7 Jan 2015 16:01:00 +0100 +Subject: [PATCH 06/10] Support preexec notifications from an interactive shell + +Add sequences + OSC 777 ; preexec BEL + OSC 777 ; preexec ST + +that can be used from an interactive shell's preexec hook to notify +the terminal emulator that a new command is about to be executed. +Examples of such hooks are Bash's PS0 and Zsh's preexec. + +The OSC 777 escape sequence is taken from Enlightenment's Terminology: +https://phab.enlightenment.org/T1765 + +Currently, using C0 controls to emit OSC 777 from PS0 (ie., +PS0=$(printf "\u009D777;preexec\u009C")) causes spurious characters to +show up. C1 controls don't seem to suffer from this problem. + +https://bugzilla.gnome.org/show_bug.cgi?id=711059 +https://bugzilla.gnome.org/show_bug.cgi?id=711060 +--- + src/vte.cc | 7 +++++++ + src/vte.sh | 2 +- + src/vte/vteterminal.h | 3 ++- + src/vtegtk.cc | 18 ++++++++++++++++++ + src/vtegtk.hh | 1 + + src/vteinternal.hh | 2 ++ + src/vteseq.cc | 4 ++++ + 7 files changed, 35 insertions(+), 2 deletions(-) + +diff --git a/src/vte.cc b/src/vte.cc +index 3ae3c8b33c00..1d5fe099530c 100644 +--- a/src/vte.cc ++++ b/src/vte.cc +@@ -10231,6 +10231,13 @@ Terminal::emit_pending_signals() + m_notification_received = false; + } + ++ if (m_shell_preexec) { ++ _vte_debug_print (VTE_DEBUG_SIGNALS, ++ "Emitting `shell-preexec'.\n"); ++ g_signal_emit(object, signals[SIGNAL_SHELL_PREEXEC], 0); ++ m_shell_preexec = FALSE; ++ } ++ + if (m_window_title_changed) { + if (m_window_title != m_window_title_pending) { + m_window_title.swap(m_window_title_pending); +diff --git a/src/vte.sh b/src/vte.sh +index b75c6dac6f6e..dc4a127c9902 100644 +--- a/src/vte.sh ++++ b/src/vte.sh +@@ -59,7 +59,7 @@ __vte_prompt_command() { + + case "$TERM" in + xterm*|vte*) +- [ -n "$BASH_VERSION" ] && PROMPT_COMMAND="__vte_prompt_command" ++ [ -n "$BASH_VERSION" ] && PROMPT_COMMAND="__vte_prompt_command" && PS0=$(printf "\u009D777;preexec\u009C") + [ -n "$ZSH_VERSION" ] && precmd_functions+=(__vte_osc7) + ;; + esac +diff --git a/src/vte/vteterminal.h b/src/vte/vteterminal.h +index c8ba72023370..585b3f112bda 100644 +--- a/src/vte/vteterminal.h ++++ b/src/vte/vteterminal.h +@@ -105,9 +105,10 @@ struct _VteTerminalClass { + void (*bell)(VteTerminal* terminal); + + void (*notification_received)(VteTerminal* terminal, const gchar *summary, const gchar *body); ++ void (*shell_preexec)(VteTerminal* terminal); + + /* Padding for future expansion. */ +- gpointer padding[15]; ++ gpointer padding[14]; + + VteTerminalClassPrivate *priv; + }; +diff --git a/src/vtegtk.cc b/src/vtegtk.cc +index b905b82b2514..bed69be640f9 100644 +--- a/src/vtegtk.cc ++++ b/src/vtegtk.cc +@@ -734,6 +734,7 @@ vte_terminal_class_init(VteTerminalClass *klass) + klass->encoding_changed = NULL; + klass->char_size_changed = NULL; + klass->notification_received = NULL; ++ klass->shell_preexec = NULL; + klass->window_title_changed = NULL; + klass->icon_title_changed = NULL; + klass->selection_changed = NULL; +@@ -829,6 +830,23 @@ vte_terminal_class_init(VteTerminalClass *klass) + G_TYPE_NONE, + 2, G_TYPE_STRING, G_TYPE_STRING); + ++ /** ++ * VteTerminal::shell-preexec: ++ * @vteterminal: the object which received the signal ++ * ++ * Emitted when the interactive shell has read in a complete ++ * command and is about to execute it. ++ */ ++ signals[SIGNAL_SHELL_PREEXEC] = ++ g_signal_new(I_("shell-preexec"), ++ G_OBJECT_CLASS_TYPE(klass), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET(VteTerminalClass, shell_preexec), ++ NULL, ++ NULL, ++ g_cclosure_marshal_VOID__VOID, ++ G_TYPE_NONE, 0); ++ + /** + * VteTerminal::window-title-changed: + * @vteterminal: the object which received the signal +diff --git a/src/vtegtk.hh b/src/vtegtk.hh +index b2c9edfa8246..136ffa3b534d 100644 +--- a/src/vtegtk.hh ++++ b/src/vtegtk.hh +@@ -52,6 +52,7 @@ enum { + SIGNAL_RESIZE_WINDOW, + SIGNAL_RESTORE_WINDOW, + SIGNAL_SELECTION_CHANGED, ++ SIGNAL_SHELL_PREEXEC, + SIGNAL_TEXT_DELETED, + SIGNAL_TEXT_INSERTED, + SIGNAL_TEXT_MODIFIED, +diff --git a/src/vteinternal.hh b/src/vteinternal.hh +index 9cc246338151..db8afddb04b0 100644 +--- a/src/vteinternal.hh ++++ b/src/vteinternal.hh +@@ -545,6 +545,8 @@ public: + std::string m_notification_summary; + std::string m_notification_body; + ++ gboolean m_shell_preexec; ++ + std::string m_window_title{}; + std::string m_current_directory_uri{}; + std::string m_current_file_uri{}; +diff --git a/src/vteseq.cc b/src/vteseq.cc +index fcc2cc872f4c..7ce20e7d91bc 100644 +--- a/src/vteseq.cc ++++ b/src/vteseq.cc +@@ -1359,6 +1359,10 @@ Terminal::handle_urxvt_extension(vte::parser::Sequence const& seq, + m_notification_body = *token; + return; + } ++ ++ if (*token == "preexec") { ++ m_shell_preexec = TRUE; ++ } + } + + bool +-- +2.20.1 + + +From 0483ee805109e64912de062ffdd08d658016d372 Mon Sep 17 00:00:00 2001 +From: Debarshi Ray +Date: Fri, 20 Apr 2018 18:21:53 +0200 +Subject: [PATCH 07/10] Test the shell-preexec signal + +https://bugzilla.gnome.org/show_bug.cgi?id=711059 +https://bugzilla.gnome.org/show_bug.cgi?id=711060 +--- + bindings/vala/app.vala | 6 ++++++ + src/app/app.cc | 7 +++++++ + 2 files changed, 13 insertions(+) + +diff --git a/bindings/vala/app.vala b/bindings/vala/app.vala +index c984b868246d..83af686be106 100644 +--- a/bindings/vala/app.vala ++++ b/bindings/vala/app.vala +@@ -310,6 +310,7 @@ class Window : Gtk.ApplicationWindow + terminal.notify.connect(notify_cb); + + terminal.notification_received.connect(notification_received_cb); ++ terminal.shell_preexec.connect(shell_preexec_cb); + + /* Settings */ + if (Options.no_double_buffer) +@@ -788,6 +789,11 @@ class Window : Gtk.ApplicationWindow + print ("[%s]: %s\n", summary, body); + } + ++ private void shell_preexec_cb(Vte.Terminal terminal) ++ { ++ print("[shell] executing command\n"); ++ } ++ + } /* class Window */ + + class App : Gtk.Application +diff --git a/src/app/app.cc b/src/app/app.cc +index 589bd5679acd..df0856497f73 100644 +--- a/src/app/app.cc ++++ b/src/app/app.cc +@@ -1682,6 +1682,12 @@ notification_received_cb(VteTerminal *terminal, + g_print("[%s]: %s\n", summary, body); + } + ++static void ++shell_preexec_cb(VteTerminal *terminal) ++{ ++ g_print("[shell] executing command\n"); ++} ++ + static void + window_lower_window_cb(VteTerminal* terminal, + VteappWindow* window) +@@ -1911,6 +1917,7 @@ vteapp_window_constructed(GObject *object) + g_signal_connect(window->terminal, "notify", G_CALLBACK(window_notify_cb), window); + + g_signal_connect(window->terminal, "notification-received", G_CALLBACK(notification_received_cb), NULL); ++ g_signal_connect(window->terminal, "shell-preexec", G_CALLBACK(shell_preexec_cb), NULL); + + /* Settings */ + if (options.no_double_buffer) +-- +2.20.1 + + +From 1f8b311035b6b0d2f194917db7c84c18a893052e Mon Sep 17 00:00:00 2001 +From: Debarshi Ray +Date: Wed, 2 May 2018 17:20:30 +0200 +Subject: [PATCH 08/10] Support precmd notifications from an interactive shell + +Add sequences + OSC 777 ; precmd BEL + OSC 777 ; precmd ST + +that can be used from an interactive shell's precmd hook to notify the +terminal emulator that a first level prompt is about to be shown. +Examples of such hooks are Bash's PROMPT_COMMAND and Zsh's precmd. + +The OSC 777 escape sequence is taken from Enlightenment's Terminology: +https://phab.enlightenment.org/T1765 + +https://bugzilla.gnome.org/show_bug.cgi?id=711059 +https://bugzilla.gnome.org/show_bug.cgi?id=711060 +--- + src/vte.cc | 7 +++++++ + src/vte.sh | 2 +- + src/vte/vteterminal.h | 3 ++- + src/vtegtk.cc | 18 ++++++++++++++++++ + src/vtegtk.hh | 1 + + src/vteinternal.hh | 1 + + src/vteseq.cc | 4 +++- + 7 files changed, 33 insertions(+), 3 deletions(-) + +diff --git a/src/vte.cc b/src/vte.cc +index 1d5fe099530c..459f675fd55c 100644 +--- a/src/vte.cc ++++ b/src/vte.cc +@@ -10238,6 +10238,13 @@ Terminal::emit_pending_signals() + m_shell_preexec = FALSE; + } + ++ if (m_shell_precmd) { ++ _vte_debug_print (VTE_DEBUG_SIGNALS, ++ "Emitting `shell-precmd'.\n"); ++ g_signal_emit(object, signals[SIGNAL_SHELL_PRECMD], 0); ++ m_shell_precmd = FALSE; ++ } ++ + if (m_window_title_changed) { + if (m_window_title != m_window_title_pending) { + m_window_title.swap(m_window_title_pending); +diff --git a/src/vte.sh b/src/vte.sh +index dc4a127c9902..c1d6ee2c6f1d 100644 +--- a/src/vte.sh ++++ b/src/vte.sh +@@ -54,7 +54,7 @@ __vte_prompt_command() { + command="${command//;/ }" + local pwd='~' + [ "$PWD" != "$HOME" ] && pwd=${PWD/#$HOME\//\~\/} +- printf '\033]777;notify;Command completed;%s\033\\\033]0;%s@%s:%s\033\\%s' "${command}" "${USER}" "${HOSTNAME%%.*}" "${pwd}" "$(__vte_osc7)" ++ printf '\033]777;notify;Command completed;%s\033\\\033]777;precmd\033\\\033]0;%s@%s:%s\033\\%s' "${command}" "${USER}" "${HOSTNAME%%.*}" "${pwd}" "$(__vte_osc7)" + } + + case "$TERM" in +diff --git a/src/vte/vteterminal.h b/src/vte/vteterminal.h +index 585b3f112bda..cb265294c96f 100644 +--- a/src/vte/vteterminal.h ++++ b/src/vte/vteterminal.h +@@ -105,10 +105,11 @@ struct _VteTerminalClass { + void (*bell)(VteTerminal* terminal); + + void (*notification_received)(VteTerminal* terminal, const gchar *summary, const gchar *body); ++ void (*shell_precmd)(VteTerminal* terminal); + void (*shell_preexec)(VteTerminal* terminal); + + /* Padding for future expansion. */ +- gpointer padding[14]; ++ gpointer padding[13]; + + VteTerminalClassPrivate *priv; + }; +diff --git a/src/vtegtk.cc b/src/vtegtk.cc +index bed69be640f9..d94e47e379f8 100644 +--- a/src/vtegtk.cc ++++ b/src/vtegtk.cc +@@ -734,6 +734,7 @@ vte_terminal_class_init(VteTerminalClass *klass) + klass->encoding_changed = NULL; + klass->char_size_changed = NULL; + klass->notification_received = NULL; ++ klass->shell_precmd = NULL; + klass->shell_preexec = NULL; + klass->window_title_changed = NULL; + klass->icon_title_changed = NULL; +@@ -830,6 +831,23 @@ vte_terminal_class_init(VteTerminalClass *klass) + G_TYPE_NONE, + 2, G_TYPE_STRING, G_TYPE_STRING); + ++ /** ++ * VteTerminal::shell-precmd: ++ * @vteterminal: the object which received the signal ++ * ++ * Emitted right before an interactive shell shows a ++ * first-level prompt. ++ */ ++ signals[SIGNAL_SHELL_PRECMD] = ++ g_signal_new(I_("shell-precmd"), ++ G_OBJECT_CLASS_TYPE(klass), ++ G_SIGNAL_RUN_LAST, ++ G_STRUCT_OFFSET(VteTerminalClass, shell_precmd), ++ NULL, ++ NULL, ++ g_cclosure_marshal_VOID__VOID, ++ G_TYPE_NONE, 0); ++ + /** + * VteTerminal::shell-preexec: + * @vteterminal: the object which received the signal +diff --git a/src/vtegtk.hh b/src/vtegtk.hh +index 136ffa3b534d..bae75f4b1f6a 100644 +--- a/src/vtegtk.hh ++++ b/src/vtegtk.hh +@@ -52,6 +52,7 @@ enum { + SIGNAL_RESIZE_WINDOW, + SIGNAL_RESTORE_WINDOW, + SIGNAL_SELECTION_CHANGED, ++ SIGNAL_SHELL_PRECMD, + SIGNAL_SHELL_PREEXEC, + SIGNAL_TEXT_DELETED, + SIGNAL_TEXT_INSERTED, +diff --git a/src/vteinternal.hh b/src/vteinternal.hh +index db8afddb04b0..d81ac011dba5 100644 +--- a/src/vteinternal.hh ++++ b/src/vteinternal.hh +@@ -545,6 +545,7 @@ public: + std::string m_notification_summary; + std::string m_notification_body; + ++ gboolean m_shell_precmd; + gboolean m_shell_preexec; + + std::string m_window_title{}; +diff --git a/src/vteseq.cc b/src/vteseq.cc +index 7ce20e7d91bc..8893ba53698a 100644 +--- a/src/vteseq.cc ++++ b/src/vteseq.cc +@@ -1360,7 +1360,9 @@ Terminal::handle_urxvt_extension(vte::parser::Sequence const& seq, + return; + } + +- if (*token == "preexec") { ++ if (*token == "precmd") { ++ m_shell_precmd = TRUE; ++ } else if (*token == "preexec") { + m_shell_preexec = TRUE; + } + } +-- +2.20.1 + + +From 66b6900d5e188611263595db8d5cee61cccec258 Mon Sep 17 00:00:00 2001 +From: Debarshi Ray +Date: Wed, 2 May 2018 17:30:48 +0200 +Subject: [PATCH 09/10] Test the shell-precmd signal + +https://bugzilla.gnome.org/show_bug.cgi?id=711059 +https://bugzilla.gnome.org/show_bug.cgi?id=711060 +--- + bindings/vala/app.vala | 6 ++++++ + src/app/app.cc | 7 +++++++ + 2 files changed, 13 insertions(+) + +diff --git a/bindings/vala/app.vala b/bindings/vala/app.vala +index 83af686be106..300384f5c74b 100644 +--- a/bindings/vala/app.vala ++++ b/bindings/vala/app.vala +@@ -310,6 +310,7 @@ class Window : Gtk.ApplicationWindow + terminal.notify.connect(notify_cb); + + terminal.notification_received.connect(notification_received_cb); ++ terminal.shell_precmd.connect(shell_precmd_cb); + terminal.shell_preexec.connect(shell_preexec_cb); + + /* Settings */ +@@ -789,6 +790,11 @@ class Window : Gtk.ApplicationWindow + print ("[%s]: %s\n", summary, body); + } + ++ private void shell_precmd_cb(Vte.Terminal terminal) ++ { ++ print("[shell] showing command prompt\n"); ++ } ++ + private void shell_preexec_cb(Vte.Terminal terminal) + { + print("[shell] executing command\n"); +diff --git a/src/app/app.cc b/src/app/app.cc +index df0856497f73..37e06daf742f 100644 +--- a/src/app/app.cc ++++ b/src/app/app.cc +@@ -1682,6 +1682,12 @@ notification_received_cb(VteTerminal *terminal, + g_print("[%s]: %s\n", summary, body); + } + ++static void ++shell_precmd_cb(VteTerminal *terminal) ++{ ++ g_print("[shell] showing command prompt\n"); ++} ++ + static void + shell_preexec_cb(VteTerminal *terminal) + { +@@ -1917,6 +1923,7 @@ vteapp_window_constructed(GObject *object) + g_signal_connect(window->terminal, "notify", G_CALLBACK(window_notify_cb), window); + + g_signal_connect(window->terminal, "notification-received", G_CALLBACK(notification_received_cb), NULL); ++ g_signal_connect(window->terminal, "shell-precmd", G_CALLBACK(shell_precmd_cb), NULL); + g_signal_connect(window->terminal, "shell-preexec", G_CALLBACK(shell_preexec_cb), NULL); + + /* Settings */ +-- +2.20.1 + + +From c28e1af61756ce2c4cffed0eec11e08928d75d92 Mon Sep 17 00:00:00 2001 +From: Debarshi Ray +Date: Mon, 10 Jun 2019 20:30:18 +0200 +Subject: [PATCH 10/10] Support tracking the active container inside the + terminal + +Add sequences + OSC 777 ; container ; push ; NAME ; RUNTIME BEL + OSC 777 ; container ; push ; NAME ; RUNTIME ST + OSC 777 ; container ; pop ; NAME ; RUNTIME BEL + OSC 777 ; container ; pop ; NAME ; RUNTIME ST + +that let container tools notify the terminal emulator when entering and +leaving a container environment. The RUNTIME argument namespaces the +NAME and identifies the container tooling being used. eg., docker, +flatpak, podman, toolbox, etc.. + +The OSC 777 escape sequence is taken from Enlightenment's Terminology: +https://phab.enlightenment.org/T1765 + +It's a VTE-specific extension until a standard escape sequence is +agreed upon across multiple different terminal emulators [1]. + +[1] https://gitlab.freedesktop.org/terminal-wg/specifications/issues/17 +--- + src/vte.cc | 9 ++++++ + src/vte/vteterminal.h | 4 +++ + src/vtegtk.cc | 65 +++++++++++++++++++++++++++++++++++++++++++ + src/vtegtk.hh | 2 ++ + src/vteinternal.hh | 16 +++++++++++ + src/vteseq.cc | 31 +++++++++++++++++++++ + 6 files changed, 127 insertions(+) + +diff --git a/src/vte.cc b/src/vte.cc +index 459f675fd55c..65278d45f9bf 100644 +--- a/src/vte.cc ++++ b/src/vte.cc +@@ -10259,6 +10259,15 @@ Terminal::emit_pending_signals() + m_window_title_changed = false; + } + ++ if (m_containers_changed) { ++ _vte_debug_print(VTE_DEBUG_SIGNALS, ++ "Notifying `current-container-name' and `current-container-runtime'.\n"); ++ ++ g_object_notify_by_pspec(object, pspecs[PROP_CURRENT_CONTAINER_NAME]); ++ g_object_notify_by_pspec(object, pspecs[PROP_CURRENT_CONTAINER_RUNTIME]); ++ m_containers_changed = false; ++ } ++ + if (m_current_directory_uri_changed) { + if (m_current_directory_uri != m_current_directory_uri_pending) { + m_current_directory_uri.swap(m_current_directory_uri_pending); +diff --git a/src/vte/vteterminal.h b/src/vte/vteterminal.h +index cb265294c96f..32c0538f37dd 100644 +--- a/src/vte/vteterminal.h ++++ b/src/vte/vteterminal.h +@@ -459,6 +459,10 @@ glong vte_terminal_get_column_count(VteTerminal *terminal) _VTE_GNUC_NONNULL(1); + _VTE_PUBLIC + const char *vte_terminal_get_window_title(VteTerminal *terminal) _VTE_GNUC_NONNULL(1); + _VTE_PUBLIC ++const char *vte_terminal_get_current_container_name(VteTerminal *terminal) _VTE_GNUC_NONNULL(1); ++_VTE_PUBLIC ++const char *vte_terminal_get_current_container_runtime(VteTerminal *terminal) _VTE_GNUC_NONNULL(1); ++_VTE_PUBLIC + const char *vte_terminal_get_current_directory_uri(VteTerminal *terminal) _VTE_GNUC_NONNULL(1); + _VTE_PUBLIC + const char *vte_terminal_get_current_file_uri(VteTerminal *terminal) _VTE_GNUC_NONNULL(1); +diff --git a/src/vtegtk.cc b/src/vtegtk.cc +index d94e47e379f8..342ccfc98a9e 100644 +--- a/src/vtegtk.cc ++++ b/src/vtegtk.cc +@@ -478,6 +478,12 @@ vte_terminal_get_property (GObject *object, + case PROP_CURSOR_BLINK_MODE: + g_value_set_enum (value, vte_terminal_get_cursor_blink_mode (terminal)); + break; ++ case PROP_CURRENT_CONTAINER_NAME: ++ g_value_set_string (value, vte_terminal_get_current_container_name (terminal)); ++ break; ++ case PROP_CURRENT_CONTAINER_RUNTIME: ++ g_value_set_string (value, vte_terminal_get_current_container_runtime (terminal)); ++ break; + case PROP_CURRENT_DIRECTORY_URI: + g_value_set_string (value, vte_terminal_get_current_directory_uri (terminal)); + break; +@@ -1681,6 +1687,27 @@ vte_terminal_class_init(VteTerminalClass *klass) + NULL, + (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY)); + ++ /** ++ * VteTerminal:current-container-name: ++ * ++ * The name of the current container, or %NULL if unset. ++ */ ++ pspecs[PROP_CURRENT_CONTAINER_NAME] = ++ g_param_spec_string ("current-container-name", NULL, NULL, ++ NULL, ++ (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY)); ++ ++ /** ++ * VteTerminal:current-container-runtime: ++ * ++ * The name of the runtime toolset used to set up the current ++ * container, or %NULL if unset. ++ */ ++ pspecs[PROP_CURRENT_CONTAINER_RUNTIME] = ++ g_param_spec_string ("current-container-runtime", NULL, NULL, ++ NULL, ++ (GParamFlags) (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY)); ++ + /** + * VteTerminal:current-directory-uri: + * +@@ -3556,6 +3583,44 @@ vte_terminal_get_column_count(VteTerminal *terminal) + return IMPL(terminal)->m_column_count; + } + ++/** ++ * vte_terminal_get_current_container_name: ++ * @terminal: a #VteTerminal ++ * ++ * Returns: (nullable) (transfer none): the name of the current ++ * container, or %NULL ++ */ ++const char * ++vte_terminal_get_current_container_name(VteTerminal *terminal) ++{ ++ g_return_val_if_fail(VTE_IS_TERMINAL(terminal), NULL); ++ auto impl = IMPL(terminal); ++ if (impl->m_containers.empty()) ++ return NULL; ++ ++ const VteContainer &container = impl->m_containers.top(); ++ return container.m_name.c_str(); ++} ++ ++/** ++ * vte_terminal_get_current_container_runtime: ++ * @terminal: a #VteTerminal ++ * ++ * Returns: (nullable) (transfer none): the name of the runtime ++ * toolset used to set up the current container, or %NULL ++ */ ++const char * ++vte_terminal_get_current_container_runtime(VteTerminal *terminal) ++{ ++ g_return_val_if_fail(VTE_IS_TERMINAL(terminal), NULL); ++ auto impl = IMPL(terminal); ++ if (impl->m_containers.empty()) ++ return NULL; ++ ++ const VteContainer &container = impl->m_containers.top(); ++ return container.m_runtime.c_str(); ++} ++ + /** + * vte_terminal_get_current_directory_uri: + * @terminal: a #VteTerminal +diff --git a/src/vtegtk.hh b/src/vtegtk.hh +index bae75f4b1f6a..d6565a9d1d16 100644 +--- a/src/vtegtk.hh ++++ b/src/vtegtk.hh +@@ -76,6 +76,8 @@ enum { + PROP_CJK_AMBIGUOUS_WIDTH, + PROP_CURSOR_BLINK_MODE, + PROP_CURSOR_SHAPE, ++ PROP_CURRENT_CONTAINER_NAME, ++ PROP_CURRENT_CONTAINER_RUNTIME, + PROP_CURRENT_DIRECTORY_URI, + PROP_CURRENT_FILE_URI, + PROP_DELETE_BINDING, +diff --git a/src/vteinternal.hh b/src/vteinternal.hh +index d81ac011dba5..f0c4a455cea3 100644 +--- a/src/vteinternal.hh ++++ b/src/vteinternal.hh +@@ -40,6 +40,7 @@ + + #include + #include ++#include + #include + #include + +@@ -109,6 +110,18 @@ typedef enum _VteCharacterReplacement { + VTE_CHARACTER_REPLACEMENT_BRITISH + } VteCharacterReplacement; + ++struct VteContainer { ++public: ++ VteContainer(const std::string &name, const std::string &runtime) : ++ m_name{name}, ++ m_runtime{runtime} ++ { ++ } ++ ++ std::string m_name; ++ std::string m_runtime; ++}; ++ + typedef struct _VtePaletteColor { + struct { + vte::color::rgb color; +@@ -540,6 +553,9 @@ public: + gboolean m_cursor_moved_pending; + gboolean m_contents_changed_pending; + ++ bool m_containers_changed{false}; ++ std::stack m_containers; ++ + /* desktop notification */ + bool m_notification_received{false}; + std::string m_notification_summary; +diff --git a/src/vteseq.cc b/src/vteseq.cc +index 8893ba53698a..dcee8767b63f 100644 +--- a/src/vteseq.cc ++++ b/src/vteseq.cc +@@ -1342,6 +1342,37 @@ Terminal::handle_urxvt_extension(vte::parser::Sequence const& seq, + if (token == endtoken) + return; + ++ if (*token == "container") { ++ ++token; ++ ++ if (token == endtoken) ++ return; ++ ++ const std::string sub_command = *token; ++ ++token; ++ ++ if (sub_command == "pop") { ++ if (!m_containers.empty()) { ++ m_containers.pop(); ++ m_containers_changed = true; ++ } ++ } else if (sub_command == "push") { ++ if (token == endtoken) ++ return; ++ ++ const std::string name = *token; ++ ++token; ++ ++ if (token == endtoken) ++ return; ++ ++ const std::string runtime = *token; ++ ++ m_containers.emplace(name, runtime); ++ m_containers_changed = true; ++ } ++ } ++ + if (*token == "notify") { + ++token; + +-- +2.20.1 + diff --git a/vte291-command-notify-scroll-speed.patch b/vte291-command-notify-scroll-speed.patch deleted file mode 100644 index 1351cee..0000000 --- a/vte291-command-notify-scroll-speed.patch +++ /dev/null @@ -1,1034 +0,0 @@ -From e4f4b9498dda3fa850bc9d40d8e0537b533c502e Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Wed, 7 Jan 2015 16:01:00 +0100 -Subject: [PATCH 1/9] Add sequences and signals for desktop notification - -Add sequences - OSC 777 ; notify ; SUMMARY ; BODY BEL - OSC 777 ; notify ; SUMMARY BEL - OSC 777 ; notify ; SUMMARY ; BODY ST - OSC 777 ; notify ; SUMMARY ST - -that let terminal applications send a notification to the desktop -environment. - -Based on Enlightenment's Terminology: -https://phab.enlightenment.org/T1765 - -https://bugzilla.gnome.org/show_bug.cgi?id=711059 ---- - src/marshal.list | 1 + - src/vte.cc | 9 +++++++++ - src/vte/vteterminal.h | 4 +++- - src/vtegtk.cc | 21 +++++++++++++++++++++ - src/vtegtk.hh | 1 + - src/vteinternal.hh | 8 ++++++++ - src/vteseq.cc | 33 ++++++++++++++++++++++++++++++++- - 7 files changed, 75 insertions(+), 2 deletions(-) - -diff --git a/src/marshal.list b/src/marshal.list -index 1e4d0c1b6476..3385b4759713 100644 ---- a/src/marshal.list -+++ b/src/marshal.list -@@ -1,5 +1,6 @@ - VOID:INT,INT - VOID:OBJECT,OBJECT - VOID:STRING,BOXED -+VOID:STRING,STRING - VOID:STRING,UINT - VOID:UINT,UINT -diff --git a/src/vte.cc b/src/vte.cc -index 0aa9a3fc6b42..cef9a05be18a 100644 ---- a/src/vte.cc -+++ b/src/vte.cc -@@ -10205,6 +10205,15 @@ Terminal::emit_pending_signals() - - emit_adjustment_changed(); - -+ if (m_notification_received) { -+ _vte_debug_print (VTE_DEBUG_SIGNALS, -+ "Emitting `notification-received'.\n"); -+ g_signal_emit(object, signals[SIGNAL_NOTIFICATION_RECEIVED], 0, -+ m_notification_summary.c_str(), -+ m_notification_body.c_str()); -+ m_notification_received = false; -+ } -+ - if (m_window_title_changed) { - if (m_window_title != m_window_title_pending) { - m_window_title.swap(m_window_title_pending); -diff --git a/src/vte/vteterminal.h b/src/vte/vteterminal.h -index 26ac236ef4ea..abf1a38cb20d 100644 ---- a/src/vte/vteterminal.h -+++ b/src/vte/vteterminal.h -@@ -104,8 +104,10 @@ struct _VteTerminalClass { - - void (*bell)(VteTerminal* terminal); - -+ void (*notification_received)(VteTerminal* terminal, const gchar *summary, const gchar *body); -+ - /* Padding for future expansion. */ -- gpointer padding[16]; -+ gpointer padding[15]; - - VteTerminalClassPrivate *priv; - }; -diff --git a/src/vtegtk.cc b/src/vtegtk.cc -index c47a5c4a9d2b..03570d4c5554 100644 ---- a/src/vtegtk.cc -+++ b/src/vtegtk.cc -@@ -727,6 +727,7 @@ vte_terminal_class_init(VteTerminalClass *klass) - klass->child_exited = NULL; - klass->encoding_changed = NULL; - klass->char_size_changed = NULL; -+ klass->notification_received = NULL; - klass->window_title_changed = NULL; - klass->icon_title_changed = NULL; - klass->selection_changed = NULL; -@@ -802,6 +803,26 @@ vte_terminal_class_init(VteTerminalClass *klass) - G_TYPE_NONE, - 1, G_TYPE_INT); - -+ /** -+ * VteTerminal::notification-received: -+ * @vteterminal: the object which received the signal -+ * @summary: The summary -+ * @body: (allow-none): Extra optional text -+ * -+ * Emitted when a process running in the terminal wants to -+ * send a notification to the desktop environment. -+ */ -+ signals[SIGNAL_NOTIFICATION_RECEIVED] = -+ g_signal_new(I_("notification-received"), -+ G_OBJECT_CLASS_TYPE(klass), -+ G_SIGNAL_RUN_LAST, -+ G_STRUCT_OFFSET(VteTerminalClass, notification_received), -+ NULL, -+ NULL, -+ _vte_marshal_VOID__STRING_STRING, -+ G_TYPE_NONE, -+ 2, G_TYPE_STRING, G_TYPE_STRING); -+ - /** - * VteTerminal::window-title-changed: - * @vteterminal: the object which received the signal -diff --git a/src/vtegtk.hh b/src/vtegtk.hh -index c49754ef38ee..126d29326f11 100644 ---- a/src/vtegtk.hh -+++ b/src/vtegtk.hh -@@ -56,6 +56,7 @@ enum { - SIGNAL_TEXT_INSERTED, - SIGNAL_TEXT_MODIFIED, - SIGNAL_TEXT_SCROLLED, -+ SIGNAL_NOTIFICATION_RECEIVED, - SIGNAL_WINDOW_TITLE_CHANGED, - LAST_SIGNAL - }; -diff --git a/src/vteinternal.hh b/src/vteinternal.hh -index 58cb0479c5c4..dd4bd37c38e1 100644 ---- a/src/vteinternal.hh -+++ b/src/vteinternal.hh -@@ -539,6 +539,11 @@ public: - gboolean m_cursor_moved_pending; - gboolean m_contents_changed_pending; - -+ /* desktop notification */ -+ bool m_notification_received{false}; -+ std::string m_notification_summary; -+ std::string m_notification_body; -+ - std::string m_window_title{}; - std::string m_current_directory_uri{}; - std::string m_current_file_uri{}; -@@ -1269,6 +1274,9 @@ public: - int osc) noexcept; - - /* OSC handlers */ -+ void handle_urxvt_extension(vte::parser::Sequence const& seq, -+ vte::parser::StringTokeniser::const_iterator& token, -+ vte::parser::StringTokeniser::const_iterator const& endtoken) noexcept; - void set_color(vte::parser::Sequence const& seq, - vte::parser::StringTokeniser::const_iterator& token, - vte::parser::StringTokeniser::const_iterator const& endtoken, -diff --git a/src/vteseq.cc b/src/vteseq.cc -index d596d8b9f56f..942ae5126a3e 100644 ---- a/src/vteseq.cc -+++ b/src/vteseq.cc -@@ -1334,6 +1334,34 @@ Terminal::delete_lines(vte::grid::row_t param) - m_text_deleted_flag = TRUE; - } - -+void -+Terminal::handle_urxvt_extension(vte::parser::Sequence const& seq, -+ vte::parser::StringTokeniser::const_iterator& token, -+ vte::parser::StringTokeniser::const_iterator const& endtoken) noexcept -+{ -+ if (token == endtoken) { -+ return; -+ } -+ -+ if (*token == "notify") { -+ ++token; -+ -+ if (token == endtoken) -+ return; -+ -+ m_notification_summary = *token; -+ m_notification_body.clear(); -+ m_notification_received = true; -+ ++token; -+ -+ if (token == endtoken) -+ return; -+ -+ m_notification_body = *token; -+ return; -+ } -+} -+ - bool - Terminal::get_osc_color_index(int osc, - int value, -@@ -6411,6 +6439,10 @@ Terminal::OSC(vte::parser::Sequence const& seq) - reset_color(VTE_HIGHLIGHT_FG, VTE_COLOR_SOURCE_ESCAPE); - break; - -+ case VTE_OSC_URXVT_EXTENSION: -+ handle_urxvt_extension(seq, it, cend); -+ break; -+ - case VTE_OSC_XTERM_SET_ICON_TITLE: - case VTE_OSC_XTERM_SET_XPROPERTY: - case VTE_OSC_XTERM_SET_COLOR_MOUSE_CURSOR_FG: -@@ -6451,7 +6483,6 @@ Terminal::OSC(vte::parser::Sequence const& seq) - case VTE_OSC_URXVT_SET_FONT_BOLD_ITALIC: - case VTE_OSC_URXVT_VIEW_UP: - case VTE_OSC_URXVT_VIEW_DOWN: -- case VTE_OSC_URXVT_EXTENSION: - case VTE_OSC_YF_RQGWR: - default: - break; --- -2.20.1 - - -From 64d5096aeb6bb49581f9cc54851afa3d54506289 Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Thu, 29 Jan 2015 13:09:17 +0100 -Subject: [PATCH 2/9] vte.sh: Emit OSC 777 from PROMPT_COMMAND - -For some reason, the three consecutive backslashes break the parsing. -As Christian Persch suggested, replacing the double quotes with -singles fixes it. - -https://bugzilla.gnome.org/show_bug.cgi?id=711059 ---- - src/vte.sh | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/vte.sh b/src/vte.sh -index 6d1a8734c479..b75c6dac6f6e 100644 ---- a/src/vte.sh -+++ b/src/vte.sh -@@ -50,9 +50,11 @@ __vte_osc7 () { - } - - __vte_prompt_command() { -+ local command=$(HISTTIMEFORMAT= history 1 | sed 's/^ *[0-9]\+ *//') -+ command="${command//;/ }" - local pwd='~' - [ "$PWD" != "$HOME" ] && pwd=${PWD/#$HOME\//\~\/} -- printf "\033]0;%s@%s:%s\033\\%s" "${USER}" "${HOSTNAME%%.*}" "${pwd}" "$(__vte_osc7)" -+ printf '\033]777;notify;Command completed;%s\033\\\033]0;%s@%s:%s\033\\%s' "${command}" "${USER}" "${HOSTNAME%%.*}" "${pwd}" "$(__vte_osc7)" - } - - case "$TERM" in --- -2.20.1 - - -From 64f46c2a7a5d51cefdffb928855a0d86d5204480 Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Thu, 22 Jan 2015 16:37:10 +0100 -Subject: [PATCH 3/9] Test the notification-received signal - ---- - bindings/vala/app.vala | 7 +++++++ - src/app/app.cc | 10 ++++++++++ - 2 files changed, 17 insertions(+) - -diff --git a/bindings/vala/app.vala b/bindings/vala/app.vala -index fc26c2b0dfc3..634b8ddeeb91 100644 ---- a/bindings/vala/app.vala -+++ b/bindings/vala/app.vala -@@ -309,6 +309,8 @@ class Window : Gtk.ApplicationWindow - if (Options.object_notifications) - terminal.notify.connect(notify_cb); - -+ terminal.notification_received.connect(notification_received_cb); -+ - /* Settings */ - if (Options.no_double_buffer) - terminal.set_double_buffered(false); -@@ -780,6 +782,11 @@ class Window : Gtk.ApplicationWindow - set_title(terminal.get_window_title()); - } - -+ private void notification_received_cb(Vte.Terminal terminal, string summary, string? body) -+ { -+ print ("[%s]: %s\n", summary, body); -+ } -+ - } /* class Window */ - - class App : Gtk.Application -diff --git a/src/app/app.cc b/src/app/app.cc -index 495bdcfa3768..8ae589ad2449 100644 ---- a/src/app/app.cc -+++ b/src/app/app.cc -@@ -1671,6 +1671,14 @@ window_window_title_changed_cb(VteTerminal* terminal, - vte_terminal_get_window_title(window->terminal)); - } - -+static void -+notification_received_cb(VteTerminal *terminal, -+ const gchar *summary, -+ const gchar *body) -+{ -+ g_print("[%s]: %s\n", summary, body); -+} -+ - static void - window_lower_window_cb(VteTerminal* terminal, - VteappWindow* window) -@@ -1899,6 +1907,8 @@ vteapp_window_constructed(GObject *object) - if (options.object_notifications) - g_signal_connect(window->terminal, "notify", G_CALLBACK(window_notify_cb), window); - -+ g_signal_connect(window->terminal, "notification-received", G_CALLBACK(notification_received_cb), NULL); -+ - /* Settings */ - if (options.no_double_buffer) - gtk_widget_set_double_buffered(GTK_WIDGET(window->terminal), false); --- -2.20.1 - - -From 2cf8143eed208ff852371eb8b8505a79a58af1a3 Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Fri, 13 May 2016 17:53:54 +0200 -Subject: [PATCH 4/9] Add a property to configure the scroll speed - -By default, it is set to zero which gives the current behaviour of -moving the buffer by a function of the number of visible rows. - -https://bugzilla.redhat.com/show_bug.cgi?id=1103380 ---- - doc/reference/vte-sections.txt | 1 + - src/vte.cc | 19 +++++++++++++- - src/vte/vteterminal.h | 4 +++ - src/vtegtk.cc | 45 ++++++++++++++++++++++++++++++++++ - src/vtegtk.hh | 1 + - src/vteinternal.hh | 2 ++ - 6 files changed, 71 insertions(+), 1 deletion(-) - -diff --git a/doc/reference/vte-sections.txt b/doc/reference/vte-sections.txt -index 9ab873c17bfc..7b94f4df9a30 100644 ---- a/doc/reference/vte-sections.txt -+++ b/doc/reference/vte-sections.txt -@@ -55,6 +55,7 @@ vte_terminal_get_cursor_blink_mode - vte_terminal_set_cursor_blink_mode - vte_terminal_get_text_blink_mode - vte_terminal_set_text_blink_mode -+vte_terminal_set_scroll_speed - vte_terminal_set_scrollback_lines - vte_terminal_get_scrollback_lines - vte_terminal_set_font -diff --git a/src/vte.cc b/src/vte.cc -index cef9a05be18a..3ae3c8b33c00 100644 ---- a/src/vte.cc -+++ b/src/vte.cc -@@ -9452,6 +9452,7 @@ void - Terminal::widget_scroll(GdkEventScroll *event) - { - gdouble delta_x, delta_y; -+ gdouble scroll_speed; - gdouble v; - gint cnt, i; - int button; -@@ -9505,7 +9506,13 @@ Terminal::widget_scroll(GdkEventScroll *event) - return; - } - -- v = MAX (1., ceil (gtk_adjustment_get_page_increment (m_vadjustment) / 10.)); -+ if (m_scroll_speed == 0) { -+ scroll_speed = ceil (gtk_adjustment_get_page_increment (m_vadjustment) / 10.); -+ } else { -+ scroll_speed = m_scroll_speed; -+ } -+ -+ v = MAX (1., scroll_speed); - _vte_debug_print(VTE_DEBUG_EVENTS, - "Scroll speed is %d lines per non-smooth scroll unit\n", - (int) v); -@@ -9766,6 +9773,16 @@ Terminal::decscusr_cursor_shape() - } - } - -+bool -+Terminal::set_scroll_speed(unsigned int scroll_speed) -+{ -+ if (scroll_speed == m_scroll_speed) -+ return false; -+ -+ m_scroll_speed = scroll_speed; -+ return true; -+} -+ - bool - Terminal::set_scrollback_lines(long lines) - { -diff --git a/src/vte/vteterminal.h b/src/vte/vteterminal.h -index abf1a38cb20d..c8ba72023370 100644 ---- a/src/vte/vteterminal.h -+++ b/src/vte/vteterminal.h -@@ -296,6 +296,10 @@ void vte_terminal_set_cursor_shape(VteTerminal *terminal, - _VTE_PUBLIC - VteCursorShape vte_terminal_get_cursor_shape(VteTerminal *terminal) _VTE_GNUC_NONNULL(1); - -+_VTE_PUBLIC -+void vte_terminal_set_scroll_speed(VteTerminal *terminal, -+ guint scroll_speed) _VTE_GNUC_NONNULL(1); -+ - /* Set the number of scrollback lines, above or at an internal minimum. */ - _VTE_PUBLIC - void vte_terminal_set_scrollback_lines(VteTerminal *terminal, -diff --git a/src/vtegtk.cc b/src/vtegtk.cc -index 03570d4c5554..b905b82b2514 100644 ---- a/src/vtegtk.cc -+++ b/src/vtegtk.cc -@@ -517,6 +517,9 @@ vte_terminal_get_property (GObject *object, - case PROP_REWRAP_ON_RESIZE: - g_value_set_boolean (value, vte_terminal_get_rewrap_on_resize (terminal)); - break; -+ case PROP_SCROLL_SPEED: -+ g_value_set_uint (value, impl->m_scroll_speed); -+ break; - case PROP_SCROLLBACK_LINES: - g_value_set_uint (value, vte_terminal_get_scrollback_lines(terminal)); - break; -@@ -618,6 +621,9 @@ vte_terminal_set_property (GObject *object, - case PROP_REWRAP_ON_RESIZE: - vte_terminal_set_rewrap_on_resize (terminal, g_value_get_boolean (value)); - break; -+ case PROP_SCROLL_SPEED: -+ vte_terminal_set_scroll_speed (terminal, g_value_get_uint (value)); -+ break; - case PROP_SCROLLBACK_LINES: - vte_terminal_set_scrollback_lines (terminal, g_value_get_uint (value)); - break; -@@ -1562,6 +1568,21 @@ vte_terminal_class_init(VteTerminalClass *klass) - TRUE, - (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY)); - -+ /** -+ * VteTerminal:scroll-speed: -+ * -+ * The number of lines by which the buffer is moved when -+ * scrolling with a mouse wheel on top of the terminal -+ * Setting it to zero will cause the buffer to be moved by an -+ * amount depending on the number of visible rows the widget -+ * can display. -+ */ -+ pspecs[PROP_SCROLL_SPEED] = -+ g_param_spec_uint ("scroll-speed", NULL, NULL, -+ 0, G_MAXUINT, -+ 0, -+ (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY)); -+ - /** - * VteTerminal:scrollback-lines: - * -@@ -4111,6 +4132,30 @@ vte_terminal_get_row_count(VteTerminal *terminal) - return IMPL(terminal)->m_row_count; - } - -+/** -+ * vte_terminal_set_scroll_speed: -+ * @terminal: a #VteTerminal -+ * @scroll_speed: move the buffer by this number of lines while scrolling -+ * -+ * Sets the number of lines by which the buffer is moved when -+ * scrolling with a mouse wheel. Setting it to zero will cause the -+ * buffer to be moved by an amount depending on the number of visible -+ * rows the widget can display. -+ */ -+void -+vte_terminal_set_scroll_speed(VteTerminal *terminal, guint scroll_speed) -+{ -+ g_return_if_fail(VTE_IS_TERMINAL(terminal)); -+ -+ GObject *object = G_OBJECT(terminal); -+ g_object_freeze_notify(object); -+ -+ if (IMPL(terminal)->set_scroll_speed(scroll_speed)) -+ g_object_notify_by_pspec(object, pspecs[PROP_SCROLL_SPEED]); -+ -+ g_object_thaw_notify(object); -+} -+ - /** - * vte_terminal_set_scrollback_lines: - * @terminal: a #VteTerminal -diff --git a/src/vtegtk.hh b/src/vtegtk.hh -index 126d29326f11..b2c9edfa8246 100644 ---- a/src/vtegtk.hh -+++ b/src/vtegtk.hh -@@ -86,6 +86,7 @@ enum { - PROP_MOUSE_POINTER_AUTOHIDE, - PROP_PTY, - PROP_REWRAP_ON_RESIZE, -+ PROP_SCROLL_SPEED, - PROP_SCROLLBACK_LINES, - PROP_SCROLL_ON_KEYSTROKE, - PROP_SCROLL_ON_OUTPUT, -diff --git a/src/vteinternal.hh b/src/vteinternal.hh -index dd4bd37c38e1..9cc246338151 100644 ---- a/src/vteinternal.hh -+++ b/src/vteinternal.hh -@@ -418,6 +418,7 @@ public: - /* Scrolling options. */ - gboolean m_scroll_on_output; - gboolean m_scroll_on_keystroke; -+ guint m_scroll_speed; - vte::grid::row_t m_scrollback_lines; - - /* Restricted scrolling */ -@@ -1147,6 +1148,7 @@ public: - bool set_mouse_autohide(bool autohide); - bool set_pty(VtePty *pty); - bool set_rewrap_on_resize(bool rewrap); -+ bool set_scroll_speed(unsigned int scroll_speed); - bool set_scrollback_lines(long lines); - bool set_scroll_on_keystroke(bool scroll); - bool set_scroll_on_output(bool scroll); --- -2.20.1 - - -From 97a9a62f6b99292c1246f8df4ba32bb44728928a Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Fri, 13 May 2016 17:54:57 +0200 -Subject: [PATCH 5/9] Test the scroll-speed property - -https://bugzilla.redhat.com/show_bug.cgi?id=1103380 ---- - bindings/vala/app.vala | 4 ++++ - src/app/app.cc | 4 ++++ - 2 files changed, 8 insertions(+) - -diff --git a/bindings/vala/app.vala b/bindings/vala/app.vala -index 634b8ddeeb91..c984b868246d 100644 ---- a/bindings/vala/app.vala -+++ b/bindings/vala/app.vala -@@ -335,6 +335,7 @@ class Window : Gtk.ApplicationWindow - terminal.set_rewrap_on_resize(!Options.no_rewrap); - terminal.set_scroll_on_output(false); - terminal.set_scroll_on_keystroke(true); -+ terminal.set_scroll_speed(Options.scroll_speed); - terminal.set_scrollback_lines(Options.scrollback_lines); - - /* Style */ -@@ -857,6 +858,7 @@ class App : Gtk.Application - public static bool object_notifications = false; - public static string? output_filename = null; - public static bool reverse = false; -+ public static uint scroll_speed = 0; - public static int scrollback_lines = 512; - public static int transparency_percent = 0; - public static bool version = false; -@@ -1050,6 +1052,8 @@ class App : Gtk.Application - "Save terminal contents to file at exit", null }, - { "reverse", 0, 0, OptionArg.NONE, ref reverse, - "Reverse foreground/background colors", null }, -+ { "scroll-speed", 0, 0, OptionArg.INT, ref scroll_speed, -+ "Specify the scroll speed", null }, - { "scrollback-lines", 'n', 0, OptionArg.INT, ref scrollback_lines, - "Specify the number of scrollback-lines", null }, - { "transparent", 'T', 0, OptionArg.INT, ref transparency_percent, -diff --git a/src/app/app.cc b/src/app/app.cc -index 8ae589ad2449..589bd5679acd 100644 ---- a/src/app/app.cc -+++ b/src/app/app.cc -@@ -93,6 +93,7 @@ public: - int verbosity{0}; - double cell_height_scale{1.0}; - double cell_width_scale{1.0}; -+ unsigned int scroll_speed{0}; - VteCursorBlinkMode cursor_blink_mode{VTE_CURSOR_BLINK_SYSTEM}; - VteCursorShape cursor_shape{VTE_CURSOR_SHAPE_BLOCK}; - VteTextBlinkMode text_blink_mode{VTE_TEXT_BLINK_ALWAYS}; -@@ -405,6 +406,8 @@ public: - "Save terminal contents to file at exit", nullptr }, - { "reverse", 0, 0, G_OPTION_ARG_NONE, &reverse, - "Reverse foreground/background colors", nullptr }, -+ { "scroll-speed", 0, 0, G_OPTION_ARG_INT, &scroll_speed, -+ "Specify the scroll speed", nullptr }, - { "scrollback-lines", 'n', 0, G_OPTION_ARG_INT, &scrollback_lines, - "Specify the number of scrollback-lines (-1 for infinite)", nullptr }, - { "transparent", 'T', 0, G_OPTION_ARG_INT, &transparency_percent, -@@ -1937,6 +1940,7 @@ vteapp_window_constructed(GObject *object) - vte_terminal_set_rewrap_on_resize(window->terminal, !options.no_rewrap); - vte_terminal_set_scroll_on_output(window->terminal, false); - vte_terminal_set_scroll_on_keystroke(window->terminal, true); -+ vte_terminal_set_scroll_speed(window->terminal, options.scroll_speed); - vte_terminal_set_scrollback_lines(window->terminal, options.scrollback_lines); - vte_terminal_set_text_blink_mode(window->terminal, options.text_blink_mode); - --- -2.20.1 - - -From e63c5ce0cb27e98c81047bfe6bc18baf96173511 Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Wed, 7 Jan 2015 16:01:00 +0100 -Subject: [PATCH 6/9] Support preexec notifications from an interactive shell - -Add sequences - OSC 777 ; preexec BEL - OSC 777 ; preexec ST - -that can be used from an interactive shell's preexec hook to notify -the terminal emulator that a new command is about to be executed. -Examples of such hooks are Bash's PS0 and Zsh's preexec. - -The OSC 777 escape sequence is taken from Enlightenment's Terminology: -https://phab.enlightenment.org/T1765 - -Currently, using C0 controls to emit OSC 777 from PS0 (ie., -PS0=$(printf "\u009D777;preexec\u009C")) causes spurious characters to -show up. C1 controls don't seem to suffer from this problem. - -https://bugzilla.gnome.org/show_bug.cgi?id=711059 -https://bugzilla.gnome.org/show_bug.cgi?id=711060 ---- - src/vte.cc | 7 +++++++ - src/vte.sh | 2 +- - src/vte/vteterminal.h | 3 ++- - src/vtegtk.cc | 18 ++++++++++++++++++ - src/vtegtk.hh | 1 + - src/vteinternal.hh | 2 ++ - src/vteseq.cc | 4 ++++ - 7 files changed, 35 insertions(+), 2 deletions(-) - -diff --git a/src/vte.cc b/src/vte.cc -index 3ae3c8b33c00..1d5fe099530c 100644 ---- a/src/vte.cc -+++ b/src/vte.cc -@@ -10231,6 +10231,13 @@ Terminal::emit_pending_signals() - m_notification_received = false; - } - -+ if (m_shell_preexec) { -+ _vte_debug_print (VTE_DEBUG_SIGNALS, -+ "Emitting `shell-preexec'.\n"); -+ g_signal_emit(object, signals[SIGNAL_SHELL_PREEXEC], 0); -+ m_shell_preexec = FALSE; -+ } -+ - if (m_window_title_changed) { - if (m_window_title != m_window_title_pending) { - m_window_title.swap(m_window_title_pending); -diff --git a/src/vte.sh b/src/vte.sh -index b75c6dac6f6e..dc4a127c9902 100644 ---- a/src/vte.sh -+++ b/src/vte.sh -@@ -59,7 +59,7 @@ __vte_prompt_command() { - - case "$TERM" in - xterm*|vte*) -- [ -n "$BASH_VERSION" ] && PROMPT_COMMAND="__vte_prompt_command" -+ [ -n "$BASH_VERSION" ] && PROMPT_COMMAND="__vte_prompt_command" && PS0=$(printf "\u009D777;preexec\u009C") - [ -n "$ZSH_VERSION" ] && precmd_functions+=(__vte_osc7) - ;; - esac -diff --git a/src/vte/vteterminal.h b/src/vte/vteterminal.h -index c8ba72023370..585b3f112bda 100644 ---- a/src/vte/vteterminal.h -+++ b/src/vte/vteterminal.h -@@ -105,9 +105,10 @@ struct _VteTerminalClass { - void (*bell)(VteTerminal* terminal); - - void (*notification_received)(VteTerminal* terminal, const gchar *summary, const gchar *body); -+ void (*shell_preexec)(VteTerminal* terminal); - - /* Padding for future expansion. */ -- gpointer padding[15]; -+ gpointer padding[14]; - - VteTerminalClassPrivate *priv; - }; -diff --git a/src/vtegtk.cc b/src/vtegtk.cc -index b905b82b2514..bed69be640f9 100644 ---- a/src/vtegtk.cc -+++ b/src/vtegtk.cc -@@ -734,6 +734,7 @@ vte_terminal_class_init(VteTerminalClass *klass) - klass->encoding_changed = NULL; - klass->char_size_changed = NULL; - klass->notification_received = NULL; -+ klass->shell_preexec = NULL; - klass->window_title_changed = NULL; - klass->icon_title_changed = NULL; - klass->selection_changed = NULL; -@@ -829,6 +830,23 @@ vte_terminal_class_init(VteTerminalClass *klass) - G_TYPE_NONE, - 2, G_TYPE_STRING, G_TYPE_STRING); - -+ /** -+ * VteTerminal::shell-preexec: -+ * @vteterminal: the object which received the signal -+ * -+ * Emitted when the interactive shell has read in a complete -+ * command and is about to execute it. -+ */ -+ signals[SIGNAL_SHELL_PREEXEC] = -+ g_signal_new(I_("shell-preexec"), -+ G_OBJECT_CLASS_TYPE(klass), -+ G_SIGNAL_RUN_LAST, -+ G_STRUCT_OFFSET(VteTerminalClass, shell_preexec), -+ NULL, -+ NULL, -+ g_cclosure_marshal_VOID__VOID, -+ G_TYPE_NONE, 0); -+ - /** - * VteTerminal::window-title-changed: - * @vteterminal: the object which received the signal -diff --git a/src/vtegtk.hh b/src/vtegtk.hh -index b2c9edfa8246..136ffa3b534d 100644 ---- a/src/vtegtk.hh -+++ b/src/vtegtk.hh -@@ -52,6 +52,7 @@ enum { - SIGNAL_RESIZE_WINDOW, - SIGNAL_RESTORE_WINDOW, - SIGNAL_SELECTION_CHANGED, -+ SIGNAL_SHELL_PREEXEC, - SIGNAL_TEXT_DELETED, - SIGNAL_TEXT_INSERTED, - SIGNAL_TEXT_MODIFIED, -diff --git a/src/vteinternal.hh b/src/vteinternal.hh -index 9cc246338151..db8afddb04b0 100644 ---- a/src/vteinternal.hh -+++ b/src/vteinternal.hh -@@ -545,6 +545,8 @@ public: - std::string m_notification_summary; - std::string m_notification_body; - -+ gboolean m_shell_preexec; -+ - std::string m_window_title{}; - std::string m_current_directory_uri{}; - std::string m_current_file_uri{}; -diff --git a/src/vteseq.cc b/src/vteseq.cc -index 942ae5126a3e..d129ad783799 100644 ---- a/src/vteseq.cc -+++ b/src/vteseq.cc -@@ -1360,6 +1360,10 @@ Terminal::handle_urxvt_extension(vte::parser::Sequence const& seq, - m_notification_body = *token; - return; - } -+ -+ if (*token == "preexec") { -+ m_shell_preexec = TRUE; -+ } - } - - bool --- -2.20.1 - - -From 26f91a29caa140eea0bb72a7d775875181e94965 Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Fri, 20 Apr 2018 18:21:53 +0200 -Subject: [PATCH 7/9] Test the shell-preexec signal - -https://bugzilla.gnome.org/show_bug.cgi?id=711059 -https://bugzilla.gnome.org/show_bug.cgi?id=711060 ---- - bindings/vala/app.vala | 6 ++++++ - src/app/app.cc | 7 +++++++ - 2 files changed, 13 insertions(+) - -diff --git a/bindings/vala/app.vala b/bindings/vala/app.vala -index c984b868246d..83af686be106 100644 ---- a/bindings/vala/app.vala -+++ b/bindings/vala/app.vala -@@ -310,6 +310,7 @@ class Window : Gtk.ApplicationWindow - terminal.notify.connect(notify_cb); - - terminal.notification_received.connect(notification_received_cb); -+ terminal.shell_preexec.connect(shell_preexec_cb); - - /* Settings */ - if (Options.no_double_buffer) -@@ -788,6 +789,11 @@ class Window : Gtk.ApplicationWindow - print ("[%s]: %s\n", summary, body); - } - -+ private void shell_preexec_cb(Vte.Terminal terminal) -+ { -+ print("[shell] executing command\n"); -+ } -+ - } /* class Window */ - - class App : Gtk.Application -diff --git a/src/app/app.cc b/src/app/app.cc -index 589bd5679acd..df0856497f73 100644 ---- a/src/app/app.cc -+++ b/src/app/app.cc -@@ -1682,6 +1682,12 @@ notification_received_cb(VteTerminal *terminal, - g_print("[%s]: %s\n", summary, body); - } - -+static void -+shell_preexec_cb(VteTerminal *terminal) -+{ -+ g_print("[shell] executing command\n"); -+} -+ - static void - window_lower_window_cb(VteTerminal* terminal, - VteappWindow* window) -@@ -1911,6 +1917,7 @@ vteapp_window_constructed(GObject *object) - g_signal_connect(window->terminal, "notify", G_CALLBACK(window_notify_cb), window); - - g_signal_connect(window->terminal, "notification-received", G_CALLBACK(notification_received_cb), NULL); -+ g_signal_connect(window->terminal, "shell-preexec", G_CALLBACK(shell_preexec_cb), NULL); - - /* Settings */ - if (options.no_double_buffer) --- -2.20.1 - - -From fb89254b387f811a6fd1eda3b7b2449417daf54e Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Wed, 2 May 2018 17:20:30 +0200 -Subject: [PATCH 8/9] Support precmd notifications from an interactive shell - -Add sequences - OSC 777 ; precmd BEL - OSC 777 ; precmd ST - -that can be used from an interactive shell's precmd hook to notify the -terminal emulator that a first level prompt is about to be shown. -Examples of such hooks are Bash's PROMPT_COMMAND and Zsh's precmd. - -The OSC 777 escape sequence is taken from Enlightenment's Terminology: -https://phab.enlightenment.org/T1765 - -https://bugzilla.gnome.org/show_bug.cgi?id=711059 -https://bugzilla.gnome.org/show_bug.cgi?id=711060 ---- - src/vte.cc | 7 +++++++ - src/vte.sh | 2 +- - src/vte/vteterminal.h | 3 ++- - src/vtegtk.cc | 18 ++++++++++++++++++ - src/vtegtk.hh | 1 + - src/vteinternal.hh | 1 + - src/vteseq.cc | 4 +++- - 7 files changed, 33 insertions(+), 3 deletions(-) - -diff --git a/src/vte.cc b/src/vte.cc -index 1d5fe099530c..459f675fd55c 100644 ---- a/src/vte.cc -+++ b/src/vte.cc -@@ -10238,6 +10238,13 @@ Terminal::emit_pending_signals() - m_shell_preexec = FALSE; - } - -+ if (m_shell_precmd) { -+ _vte_debug_print (VTE_DEBUG_SIGNALS, -+ "Emitting `shell-precmd'.\n"); -+ g_signal_emit(object, signals[SIGNAL_SHELL_PRECMD], 0); -+ m_shell_precmd = FALSE; -+ } -+ - if (m_window_title_changed) { - if (m_window_title != m_window_title_pending) { - m_window_title.swap(m_window_title_pending); -diff --git a/src/vte.sh b/src/vte.sh -index dc4a127c9902..c1d6ee2c6f1d 100644 ---- a/src/vte.sh -+++ b/src/vte.sh -@@ -54,7 +54,7 @@ __vte_prompt_command() { - command="${command//;/ }" - local pwd='~' - [ "$PWD" != "$HOME" ] && pwd=${PWD/#$HOME\//\~\/} -- printf '\033]777;notify;Command completed;%s\033\\\033]0;%s@%s:%s\033\\%s' "${command}" "${USER}" "${HOSTNAME%%.*}" "${pwd}" "$(__vte_osc7)" -+ printf '\033]777;notify;Command completed;%s\033\\\033]777;precmd\033\\\033]0;%s@%s:%s\033\\%s' "${command}" "${USER}" "${HOSTNAME%%.*}" "${pwd}" "$(__vte_osc7)" - } - - case "$TERM" in -diff --git a/src/vte/vteterminal.h b/src/vte/vteterminal.h -index 585b3f112bda..cb265294c96f 100644 ---- a/src/vte/vteterminal.h -+++ b/src/vte/vteterminal.h -@@ -105,10 +105,11 @@ struct _VteTerminalClass { - void (*bell)(VteTerminal* terminal); - - void (*notification_received)(VteTerminal* terminal, const gchar *summary, const gchar *body); -+ void (*shell_precmd)(VteTerminal* terminal); - void (*shell_preexec)(VteTerminal* terminal); - - /* Padding for future expansion. */ -- gpointer padding[14]; -+ gpointer padding[13]; - - VteTerminalClassPrivate *priv; - }; -diff --git a/src/vtegtk.cc b/src/vtegtk.cc -index bed69be640f9..d94e47e379f8 100644 ---- a/src/vtegtk.cc -+++ b/src/vtegtk.cc -@@ -734,6 +734,7 @@ vte_terminal_class_init(VteTerminalClass *klass) - klass->encoding_changed = NULL; - klass->char_size_changed = NULL; - klass->notification_received = NULL; -+ klass->shell_precmd = NULL; - klass->shell_preexec = NULL; - klass->window_title_changed = NULL; - klass->icon_title_changed = NULL; -@@ -830,6 +831,23 @@ vte_terminal_class_init(VteTerminalClass *klass) - G_TYPE_NONE, - 2, G_TYPE_STRING, G_TYPE_STRING); - -+ /** -+ * VteTerminal::shell-precmd: -+ * @vteterminal: the object which received the signal -+ * -+ * Emitted right before an interactive shell shows a -+ * first-level prompt. -+ */ -+ signals[SIGNAL_SHELL_PRECMD] = -+ g_signal_new(I_("shell-precmd"), -+ G_OBJECT_CLASS_TYPE(klass), -+ G_SIGNAL_RUN_LAST, -+ G_STRUCT_OFFSET(VteTerminalClass, shell_precmd), -+ NULL, -+ NULL, -+ g_cclosure_marshal_VOID__VOID, -+ G_TYPE_NONE, 0); -+ - /** - * VteTerminal::shell-preexec: - * @vteterminal: the object which received the signal -diff --git a/src/vtegtk.hh b/src/vtegtk.hh -index 136ffa3b534d..bae75f4b1f6a 100644 ---- a/src/vtegtk.hh -+++ b/src/vtegtk.hh -@@ -52,6 +52,7 @@ enum { - SIGNAL_RESIZE_WINDOW, - SIGNAL_RESTORE_WINDOW, - SIGNAL_SELECTION_CHANGED, -+ SIGNAL_SHELL_PRECMD, - SIGNAL_SHELL_PREEXEC, - SIGNAL_TEXT_DELETED, - SIGNAL_TEXT_INSERTED, -diff --git a/src/vteinternal.hh b/src/vteinternal.hh -index db8afddb04b0..d81ac011dba5 100644 ---- a/src/vteinternal.hh -+++ b/src/vteinternal.hh -@@ -545,6 +545,7 @@ public: - std::string m_notification_summary; - std::string m_notification_body; - -+ gboolean m_shell_precmd; - gboolean m_shell_preexec; - - std::string m_window_title{}; -diff --git a/src/vteseq.cc b/src/vteseq.cc -index d129ad783799..d50439dbf0c7 100644 ---- a/src/vteseq.cc -+++ b/src/vteseq.cc -@@ -1361,7 +1361,9 @@ Terminal::handle_urxvt_extension(vte::parser::Sequence const& seq, - return; - } - -- if (*token == "preexec") { -+ if (*token == "precmd") { -+ m_shell_precmd = TRUE; -+ } else if (*token == "preexec") { - m_shell_preexec = TRUE; - } - } --- -2.20.1 - - -From 19dec41cd5d5c42778a807cf43f52476ede2ab0f Mon Sep 17 00:00:00 2001 -From: Debarshi Ray -Date: Wed, 2 May 2018 17:30:48 +0200 -Subject: [PATCH 9/9] Test the shell-precmd signal - -https://bugzilla.gnome.org/show_bug.cgi?id=711059 -https://bugzilla.gnome.org/show_bug.cgi?id=711060 ---- - bindings/vala/app.vala | 6 ++++++ - src/app/app.cc | 7 +++++++ - 2 files changed, 13 insertions(+) - -diff --git a/bindings/vala/app.vala b/bindings/vala/app.vala -index 83af686be106..300384f5c74b 100644 ---- a/bindings/vala/app.vala -+++ b/bindings/vala/app.vala -@@ -310,6 +310,7 @@ class Window : Gtk.ApplicationWindow - terminal.notify.connect(notify_cb); - - terminal.notification_received.connect(notification_received_cb); -+ terminal.shell_precmd.connect(shell_precmd_cb); - terminal.shell_preexec.connect(shell_preexec_cb); - - /* Settings */ -@@ -789,6 +790,11 @@ class Window : Gtk.ApplicationWindow - print ("[%s]: %s\n", summary, body); - } - -+ private void shell_precmd_cb(Vte.Terminal terminal) -+ { -+ print("[shell] showing command prompt\n"); -+ } -+ - private void shell_preexec_cb(Vte.Terminal terminal) - { - print("[shell] executing command\n"); -diff --git a/src/app/app.cc b/src/app/app.cc -index df0856497f73..37e06daf742f 100644 ---- a/src/app/app.cc -+++ b/src/app/app.cc -@@ -1682,6 +1682,12 @@ notification_received_cb(VteTerminal *terminal, - g_print("[%s]: %s\n", summary, body); - } - -+static void -+shell_precmd_cb(VteTerminal *terminal) -+{ -+ g_print("[shell] showing command prompt\n"); -+} -+ - static void - shell_preexec_cb(VteTerminal *terminal) - { -@@ -1917,6 +1923,7 @@ vteapp_window_constructed(GObject *object) - g_signal_connect(window->terminal, "notify", G_CALLBACK(window_notify_cb), window); - - g_signal_connect(window->terminal, "notification-received", G_CALLBACK(notification_received_cb), NULL); -+ g_signal_connect(window->terminal, "shell-precmd", G_CALLBACK(shell_precmd_cb), NULL); - g_signal_connect(window->terminal, "shell-preexec", G_CALLBACK(shell_preexec_cb), NULL); - - /* Settings */ --- -2.20.1 - diff --git a/vte291.spec b/vte291.spec index 1e6b479..8e609fb 100644 --- a/vte291.spec +++ b/vte291.spec @@ -7,7 +7,7 @@ Name: vte291 Version: 0.57.0 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Terminal emulator library License: LGPLv2+ @@ -16,7 +16,7 @@ Source0: http://download.gnome.org/sources/vte/0.57/vte-%{version}.tar.xz # https://bugzilla.gnome.org/show_bug.cgi?id=711059 # https://bugzilla.redhat.com/show_bug.cgi?id=1103380 -Patch100: vte291-command-notify-scroll-speed.patch +Patch100: vte291-cntnr-precmd-preexec-scroll.patch BuildRequires: gcc-c++ BuildRequires: gettext @@ -67,7 +67,7 @@ emulator library. %prep %setup -q -n vte-%{version} -%patch100 -p1 -b .command-notify-scroll-speed +%patch100 -p1 -b .cntnr-precmd-preexec-scroll %build %meson --buildtype=plain -Ddocs=true @@ -97,6 +97,9 @@ emulator library. %{_sysconfdir}/profile.d/vte.sh %changelog +* Wed Jun 19 2019 Debarshi Ray - 0.57.0-2 +- Support tracking the active container inside the terminal + * Tue Jun 18 2019 Debarshi Ray - 0.57.0-1 - Update to 0.57.0 - Switch to the Meson build system