summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Edson2022-08-09 07:20:35 -0700
committerJason Edson2022-08-09 07:28:35 -0700
commit429f681217b743459e198bafc6800e181ffe0ffe (patch)
tree1d5c1602b67d5bcac5f802f0c48425dce8942590
parent46c90a7fa04400ebb3efdb301d8c09d41c6fc374 (diff)
downloadaur-429f681217b743459e198bafc6800e181ffe0ffe.tar.gz
Update to 0.69.92 with fixed patch
Added a fixed Fedora patch to use until rawhide gets updated to latest version.
-rw-r--r--.SRCINFO12
-rw-r--r--.gitignore1
-rw-r--r--PKGBUILD9
-rw-r--r--vte3-notification_0.69.92.patch1324
4 files changed, 1338 insertions, 8 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 233642a0c27f..cea0cddc2124 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,7 +1,7 @@
pkgbase = vte3-notification
pkgdesc = Virtual Terminal Emulator widget for use with GTK3 with Fedora patches
- pkgver = 0.68.0
- pkgrel = 2
+ pkgver = 0.69.92
+ pkgrel = 1
url = https://wiki.gnome.org/Apps/Terminal/VTE
arch = i686
arch = x86_64
@@ -19,10 +19,12 @@ pkgbase = vte3-notification
depends = fribidi
depends = systemd-libs
options = !emptydirs
- source = git+https://gitlab.gnome.org/GNOME/vte#tag=0.68.0
+ source = git+https://gitlab.gnome.org/GNOME/vte#tag=0.69.92
source = vte291-cntnr-precmd-preexec-scroll.patch-80f531b220afc73b1d36ff10546993d50c22895b::https://src.fedoraproject.org/rpms/vte291/raw/80f531b220afc73b1d36ff10546993d50c22895b/f/vte291-cntnr-precmd-preexec-scroll.patch
+ source = vte3-notification_0.69.92.patch
sha256sums = SKIP
sha256sums = 52ac9f2e6116d40701d89d342336d6533cec78a512835a8c72d947b4db1c60f3
+ sha256sums = 19aff914480085f6fd7402d425b6c71917d05b552960855ac130d93895924b85
pkgname = vte3-notification
depends = gtk3
@@ -31,7 +33,7 @@ pkgname = vte3-notification
depends = fribidi
depends = systemd-libs
depends = vte-notification-common
- provides = vte3=0.68.0
+ provides = vte3=0.69.92
provides = libvte-2.91.so
conflicts = vte3
@@ -39,5 +41,5 @@ pkgname = vte-notification-common
pkgdesc = Common files used by vte and vte3
arch = any
depends = sh
- provides = vte-common=0.68.0
+ provides = vte-common=0.69.92
conflicts = vte-common
diff --git a/.gitignore b/.gitignore
index ed6fb45a5386..0276d3fff67b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@
!PKGBUILD
!.SRCINFO
!.gitignore
+!vte3-notification_0.69.92.patch
diff --git a/PKGBUILD b/PKGBUILD
index e2028aecaf78..056a605dd24a 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -9,8 +9,8 @@ pkgname=(
${pkgbase}
vte-notification-common
)
-pkgver=0.68.0
-pkgrel=2
+pkgver=0.69.92
+pkgrel=1
pkgdesc='Virtual Terminal Emulator widget for use with GTK3 with Fedora patches'
url='https://wiki.gnome.org/Apps/Terminal/VTE'
license=(LGPL)
@@ -45,17 +45,20 @@ _fcommit='80f531b220afc73b1d36ff10546993d50c22895b'
source=(
"git+https://gitlab.gnome.org/GNOME/vte#tag=${pkgver}"
"${_fpatchfile100}-${_fcommit}::${_frepourl}/raw/${_fcommit}/f/${_fpatchfile100}"
+ 'vte3-notification_0.69.92.patch'
)
sha256sums=(
'SKIP'
'52ac9f2e6116d40701d89d342336d6533cec78a512835a8c72d947b4db1c60f3'
+ '19aff914480085f6fd7402d425b6c71917d05b552960855ac130d93895924b85'
)
prepare () {
cd vte
# Apply patches
- patch -p1 -i "${srcdir}/${_fpatchfile100}-${_fcommit}"
+ #patch -p1 -i "${srcdir}/${_fpatchfile100}-${_fcommit}"
+ patch -p1 -i "${srcdir}/vte3-notification_0.69.92.patch" # Fixed patch
}
build() {
diff --git a/vte3-notification_0.69.92.patch b/vte3-notification_0.69.92.patch
new file mode 100644
index 000000000000..749080d0bbbe
--- /dev/null
+++ b/vte3-notification_0.69.92.patch
@@ -0,0 +1,1324 @@
+From c809170f42582f3f02fbcc10e5157ebae9efd0ce Mon Sep 17 00:00:00 2001
+From: Debarshi Ray <debarshir@gnome.org>
+Date: Wed, 7 Jan 2015 16:01:00 +0100
+Subject: [PATCH 01/11] 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 | 8 ++++++++
+ src/vte/vteterminal.h | 4 +++-
+ src/vtegtk.cc | 21 +++++++++++++++++++++
+ src/vtegtk.hh | 1 +
+ src/vteinternal.hh | 8 ++++++++
+ src/vteseq.cc | 32 +++++++++++++++++++++++++++++++-
+ 7 files changed, 73 insertions(+), 2 deletions(-)
+
+diff --git a/src/marshal.list b/src/marshal.list
+index 241128c3..4412cf3d 100644
+--- a/src/marshal.list
++++ b/src/marshal.list
+@@ -1,3 +1,4 @@
+ VOID:STRING,BOXED
++VOID:STRING,STRING
+ VOID:STRING,UINT
+ VOID:UINT,UINT
+diff --git a/src/vte.cc b/src/vte.cc
+index 8b75883f..05cc5589 100644
+--- a/src/vte.cc
++++ b/src/vte.cc
+@@ -10032,6 +10032,14 @@ Terminal::emit_pending_signals()
+
+ emit_adjustment_changed();
+
++ if (m_pending_changes & vte::to_integral(PendingChanges::NOTIFICATION)) {
++ _vte_debug_print (VTE_DEBUG_SIGNALS,
++ "Emitting `notification-received'.\n");
++ g_signal_emit(freezer.get(), signals[SIGNAL_NOTIFICATION_RECEIVED], 0,
++ m_notification_summary.c_str(),
++ m_notification_body.c_str());
++ }
++
+ if (m_pending_changes & vte::to_integral(PendingChanges::TITLE)) {
+ 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 41f153d0..1e9a737a 100644
+--- a/src/vte/vteterminal.h
++++ b/src/vte/vteterminal.h
+@@ -108,10 +108,12 @@ struct _VteTerminalClass {
+
+ void (*bell)(VteTerminal* terminal);
+
++ void (*notification_received)(VteTerminal* terminal, const gchar *summary, const gchar *body);
++
+ #if _VTE_GTK == 3
+ /* Compatibility padding due to fedora patches intruding on our ABI */
+ /*< private >*/
+- gpointer _extra_padding[3];
++ gpointer _extra_padding[2];
+ #endif /* _VTE_GTK == 3 */
+
+ /* Add new vfuncs here, and subtract from the padding below. */
+diff --git a/src/vtegtk.cc b/src/vtegtk.cc
+index 05b82294..a09a2f75 100644
+--- a/src/vtegtk.cc
++++ b/src/vtegtk.cc
+@@ -1242,6 +1242,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;
+@@ -1325,6 +1326,26 @@ vte_terminal_class_init(VteTerminalClass *klass)
+ G_OBJECT_CLASS_TYPE(klass),
+ g_cclosure_marshal_VOID__INTv);
+
++ /**
++ * 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 6b7a1ea2..8ba10395 100644
+--- a/src/vtegtk.hh
++++ b/src/vtegtk.hh
+@@ -52,6 +52,7 @@ enum {
+ SIGNAL_RESIZE_WINDOW,
+ SIGNAL_RESTORE_WINDOW,
+ SIGNAL_SELECTION_CHANGED,
++ SIGNAL_NOTIFICATION_RECEIVED,
+ SIGNAL_WINDOW_TITLE_CHANGED,
+ LAST_SIGNAL
+ };
+diff --git a/src/vteinternal.hh b/src/vteinternal.hh
+index eb95ad68..69a32276 100644
+--- a/src/vteinternal.hh
++++ b/src/vteinternal.hh
+@@ -660,6 +660,10 @@ public:
+ gboolean m_cursor_moved_pending;
+ gboolean m_contents_changed_pending;
+
++ /* desktop notification */
++ 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{};
+@@ -673,6 +677,7 @@ public:
+ TITLE = 1u << 0,
+ CWD = 1u << 1,
+ CWF = 1u << 2,
++ NOTIFICATION = 1u << 3,
+ };
+ unsigned m_pending_changes{0};
+
+@@ -1488,6 +1493,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 874d2405..537e8e13 100644
+--- a/src/vteseq.cc
++++ b/src/vteseq.cc
+@@ -1376,6 +1376,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_pending_changes |= vte::to_integral(PendingChanges::NOTIFICATION);
++ ++token;
++
++ if (token == endtoken)
++ return;
++
++ m_notification_body = *token;
++ return;
++ }
++}
++
+ bool
+ Terminal::get_osc_color_index(int osc,
+ int value,
+@@ -6541,6 +6568,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:
+@@ -6582,7 +6613,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.35.1
+
+
+From 05a642746f1c3985ea204571e0179a1147dda1a9 Mon Sep 17 00:00:00 2001
+From: Debarshi Ray <debarshir@gnome.org>
+Date: Thu, 29 Jan 2015 13:09:17 +0100
+Subject: [PATCH 02/11] 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.in | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/src/vte.sh.in b/src/vte.sh.in
+index 242d6c42..50242223 100644
+--- a/src/vte.sh.in
++++ b/src/vte.sh.in
+@@ -33,10 +33,12 @@ __vte_osc7 () {
+ }
+
+ __vte_prompt_command() {
++ local command=$(HISTTIMEFORMAT= history 1 | sed 's/^ *[0-9]\+ *//')
++ command="${command//;/ }"
+ local pwd='~'
+ [ "$PWD" != "$HOME" ] && pwd=${PWD/#$HOME\//\~\/}
+ pwd="${pwd//[[:cntrl:]]}"
+- printf "\033]0;%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${pwd}"
++ printf '\033]777;notify;Command completed;%s\033\\\033]0;%s@%s:%s\033\\' "${command}" "${USER}" "${HOSTNAME%%.*}" "${pwd}"
+ __vte_osc7
+ }
+
+--
+2.35.1
+
+
+From d0cca4421d0108b0f9e23ea03ea5e99f745646a6 Mon Sep 17 00:00:00 2001
+From: Debarshi Ray <debarshir@gnome.org>
+Date: Thu, 22 Jan 2015 16:37:10 +0100
+Subject: [PATCH 03/11] Test the notification-received signal
+
+---
+ src/app/app.cc | 10 ++++++++++
+ 1 files changed, 10 insertions(+)
+
+diff --git a/src/app/app.cc b/src/app/app.cc
+index 3b7835aa..fc8220a5 100644
+--- a/src/app/app.cc
++++ b/src/app/app.cc
+@@ -2209,6 +2209,14 @@ window_window_title_changed_cb(VteTerminal* terminal,
+ gtk_window_set_title(GTK_WINDOW(window), title && title[0] ? title : "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)
+@@ -2505,6 +2513,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 VTE_GTK == 3
+ if (options.no_double_buffer) {
+--
+2.35.1
+
+
+From e87bc628fdecf7480c12b861ba3fb98b03abe4d9 Mon Sep 17 00:00:00 2001
+From: Debarshi Ray <debarshir@gnome.org>
+Date: Fri, 13 May 2016 17:53:54 +0200
+Subject: [PATCH 04/11] 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
+---
+ src/vte.cc | 19 +++++++++++-
+ src/vte/vteterminal.h | 4 +++
+ src/vtegtk.cc | 51 +++++++++++++++++++++++++++++++
+ src/vtegtk.hh | 1 +
+ src/vteinternal.hh | 2 ++
+ 5 files changed, 76 insertions(+), 1 deletion(-)
+
+diff --git a/src/vte.cc b/src/vte.cc
+index 05cc5589..a4e6069d 100644
+--- a/src/vte.cc
++++ b/src/vte.cc
+@@ -9239,6 +9239,7 @@ vte_cairo_get_clip_region(cairo_t *cr)
+ bool
+ Terminal::widget_mouse_scroll(vte::platform::ScrollEvent const& event)
+ {
++ gdouble scroll_speed;
+ gdouble v;
+ gint cnt, i;
+ int button;
+@@ -9273,7 +9274,13 @@ Terminal::widget_mouse_scroll(vte::platform::ScrollEvent const& event)
+ return true;
+ }
+
+- v = MAX (1., ceil (m_row_count /* page increment */ / 10.));
++ if (m_scroll_speed == 0) {
++ scroll_speed = ceil (m_row_count /* page increment */ / 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);
+@@ -9583,6 +9590,16 @@ Terminal::decscusr_cursor_shape() const noexcept
+ }
+ }
+
++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 1e9a737a..b63967a3 100644
+--- a/src/vte/vteterminal.h
++++ b/src/vte/vteterminal.h
+@@ -330,6 +330,10 @@ void vte_terminal_set_cursor_shape(VteTerminal *terminal,
+ _VTE_PUBLIC
+ VteCursorShape vte_terminal_get_cursor_shape(VteTerminal *terminal) _VTE_CXX_NOEXCEPT _VTE_GNUC_NONNULL(1);
+
++_VTE_PUBLIC
++void vte_terminal_set_scroll_speed(VteTerminal *terminal,
++ guint scroll_speed) _VTE_CXX_NOEXCEPT _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 a09a2f75..ab1de923 100644
+--- a/src/vtegtk.cc
++++ b/src/vtegtk.cc
+@@ -993,6 +993,9 @@ try
+ 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;
+@@ -1114,6 +1117,9 @@ try
+ 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;
+@@ -2210,6 +2216,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:
+ *
+@@ -5726,6 +5747,36 @@ catch (...)
+ return -1;
+ }
+
++/**
++ * 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) noexcept
++try
++{
++ 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);
++}
++catch (...)
++{
++ vte::log_exception();
++}
++
+ /**
+ * vte_terminal_set_scrollback_lines:
+ * @terminal: a #VteTerminal
+diff --git a/src/vtegtk.hh b/src/vtegtk.hh
+index 8ba10395..f6cd891b 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 69a32276..d3e25179 100644
+--- a/src/vteinternal.hh
++++ b/src/vteinternal.hh
+@@ -426,6 +426,7 @@ public:
+ bool m_fallback_scrolling{true};
+ bool m_scroll_on_output{false};
+ bool m_scroll_on_keystroke{true};
++ guint m_scroll_speed;
+ vte::grid::row_t m_scrollback_lines{0};
+
+ inline auto scroll_limit_lower() const noexcept
+@@ -1363,6 +1364,7 @@ public:
+ bool set_input_enabled(bool enabled);
+ bool set_mouse_autohide(bool autohide);
+ bool set_rewrap_on_resize(bool rewrap);
++ bool set_scroll_speed(unsigned int scroll_speed);
+ bool set_scrollback_lines(long lines);
+ bool set_fallback_scrolling(bool set);
+ auto fallback_scrolling() const noexcept { return m_fallback_scrolling; }
+--
+2.35.1
+
+
+From f8a8d2adf1000720f269adb80473e8971bc51135 Mon Sep 17 00:00:00 2001
+From: Debarshi Ray <debarshir@gnome.org>
+Date: Fri, 13 May 2016 17:54:57 +0200
+Subject: [PATCH 05/11] Test the scroll-speed property
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1103380
+---
+ src/app/app.cc | 4 ++++
+ 1 files changed, 4 insertions(+)
+
+diff --git a/src/app/app.cc b/src/app/app.cc
+index fc8220a5..c6f5cc0b 100644
+--- a/src/app/app.cc
++++ b/src/app/app.cc
+@@ -118,6 +118,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};
+@@ -620,6 +621,8 @@ public:
+ "Reverse foreground/background colors", nullptr },
+ { "require-systemd-scope", 0, 0, G_OPTION_ARG_NONE, &require_systemd_scope,
+ "Require use of a systemd user scope", nullptr },
++ { "scroll-speed", 0, 0, G_OPTION_ARG_INT, &scroll_speed,
++ "Specify the scroll speed", nullptr },
+ { "scroll-unit-is-pixels", 0, 0, G_OPTION_ARG_NONE, &scroll_unit_is_pixels,
+ "Use pixels as scroll unit", nullptr },
+ { "scrollback-lines", 'n', 0, G_OPTION_ARG_INT, &scrollback_lines,
+@@ -2549,6 +2552,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_scroll_unit_is_pixels(window->terminal, options.scroll_unit_is_pixels);
+ vte_terminal_set_scrollback_lines(window->terminal, options.scrollback_lines);
+ vte_terminal_set_text_blink_mode(window->terminal, options.text_blink_mode);
+--
+2.35.1
+
+
+From 60d5670e793d2aa2ccda489e4e468bbc9c120908 Mon Sep 17 00:00:00 2001
+From: Debarshi Ray <debarshir@gnome.org>
+Date: Wed, 7 Jan 2015 16:01:00 +0100
+Subject: [PATCH 06/11] 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
+
+https://bugzilla.gnome.org/show_bug.cgi?id=711059
+https://bugzilla.gnome.org/show_bug.cgi?id=711060
+---
+ src/vte.cc | 6 ++++++
+ src/vte.sh.in | 4 ++--
+ src/vte/vteterminal.h | 3 ++-
+ src/vtegtk.cc | 18 ++++++++++++++++++
+ src/vtegtk.hh | 1 +
+ src/vteinternal.hh | 1 +
+ src/vteseq.cc | 4 ++++
+ 7 files changed, 34 insertions(+), 3 deletions(-)
+
+diff --git a/src/vte.cc b/src/vte.cc
+index a4e6069d..6d8ab2bb 100644
+--- a/src/vte.cc
++++ b/src/vte.cc
+@@ -10057,6 +10057,12 @@ Terminal::emit_pending_signals()
+ m_notification_body.c_str());
+ }
+
++ if (m_pending_changes & vte::to_integral(PendingChanges::SHELL_PREEXEC)) {
++ _vte_debug_print (VTE_DEBUG_SIGNALS,
++ "Emitting `shell-preexec'.\n");
++ g_signal_emit(freezer.get(), signals[SIGNAL_SHELL_PREEXEC], 0);
++ }
++
+ if (m_pending_changes & vte::to_integral(PendingChanges::TITLE)) {
+ if (m_window_title != m_window_title_pending) {
+ m_window_title.swap(m_window_title_pending);
+diff --git a/src/vte.sh.in b/src/vte.sh.in
+index 50242223..01b44e23 100644
+--- a/src/vte.sh.in
++++ b/src/vte.sh.in
+@@ -51,9 +51,9 @@ if [[ -n "${BASH_VERSION:-}" ]]; then
+ # use the __vte_prompt_command function which also sets the title.
+
+ if [[ "$(declare -p PROMPT_COMMAND 2>&1)" =~ "declare -a" ]]; then
+- PROMPT_COMMAND+=(__vte_osc7)
++ PROMPT_COMMAND+=(__vte_osc7) && PS0=$(printf "\033]777;preexec\033\\")
+ else
+- PROMPT_COMMAND="__vte_prompt_command"
++ PROMPT_COMMAND="__vte_prompt_command" && PS0=$(printf "\033]777;preexec\033\\")
+ fi
+
+ elif [[ -n "${ZSH_VERSION:-}" ]]; then
+diff --git a/src/vte/vteterminal.h b/src/vte/vteterminal.h
+index b63967a3..062b6694 100644
+--- a/src/vte/vteterminal.h
++++ b/src/vte/vteterminal.h
+@@ -109,11 +109,12 @@ struct _VteTerminalClass {
+ void (*bell)(VteTerminal* terminal);
+
+ void (*notification_received)(VteTerminal* terminal, const gchar *summary, const gchar *body);
++ void (*shell_preexec)(VteTerminal* terminal);
+
+ #if _VTE_GTK == 3
+ /* Compatibility padding due to fedora patches intruding on our ABI */
+ /*< private >*/
+- gpointer _extra_padding[2];
++ gpointer _extra_padding[1];
+ #endif /* _VTE_GTK == 3 */
+
+ /* Add new vfuncs here, and subtract from the padding below. */
+diff --git a/src/vtegtk.cc b/src/vtegtk.cc
+index ab1de923..a4d51bfb 100644
+--- a/src/vtegtk.cc
++++ b/src/vtegtk.cc
+@@ -1249,6 +1249,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;
+@@ -1352,6 +1353,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 f6cd891b..bf85bdf4 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_NOTIFICATION_RECEIVED,
+ SIGNAL_WINDOW_TITLE_CHANGED,
+ LAST_SIGNAL
+diff --git a/src/vteinternal.hh b/src/vteinternal.hh
+index d3e25179..b4f1b4c9 100644
+--- a/src/vteinternal.hh
++++ b/src/vteinternal.hh
+@@ -679,6 +679,7 @@ public:
+ CWD = 1u << 1,
+ CWF = 1u << 2,
+ NOTIFICATION = 1u << 3,
++ SHELL_PREEXEC = 1u << 4,
+ };
+ unsigned m_pending_changes{0};
+
+diff --git a/src/vteseq.cc b/src/vteseq.cc
+index 537e8e13..dbc6276f 100644
+--- a/src/vteseq.cc
++++ b/src/vteseq.cc
+@@ -1401,6 +1401,10 @@ Terminal::handle_urxvt_extension(vte::parser::Sequence const& seq,
+ m_notification_body = *token;
+ return;
+ }
++
++ if (*token == "preexec") {
++ m_pending_changes |= vte::to_integral(PendingChanges::SHELL_PREEXEC);
++ }
+ }
+
+ bool
+--
+2.35.1
+
+
+From 9fe74c4f17f1fb708a90f22a64fd2b5f4aa794a9 Mon Sep 17 00:00:00 2001
+From: Debarshi Ray <debarshir@gnome.org>
+Date: Fri, 20 Apr 2018 18:21:53 +0200
+Subject: [PATCH 07/11] Test the shell-preexec signal
+
+https://bugzilla.gnome.org/show_bug.cgi?id=711059
+https://bugzilla.gnome.org/show_bug.cgi?id=711060
+---
+ src/app/app.cc | 7 +++++++
+ 1 files changed, 7 insertions(+)
+
+diff --git a/src/app/app.cc b/src/app/app.cc
+index c6f5cc0b..33a9481e 100644
+--- a/src/app/app.cc
++++ b/src/app/app.cc
+@@ -2220,6 +2220,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)
+@@ -2517,6 +2523,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 VTE_GTK == 3
+--
+2.35.1
+
+
+From ed2a83fbf034f79f7c08e8d5e4eeaaea2599e484 Mon Sep 17 00:00:00 2001
+From: Debarshi Ray <debarshir@gnome.org>
+Date: Wed, 2 May 2018 17:20:30 +0200
+Subject: [PATCH 08/11] 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 | 6 ++++++
+ src/vte.sh.in | 2 +-
+ src/vte/vteterminal.h | 7 +------
+ src/vtegtk.cc | 18 ++++++++++++++++++
+ src/vtegtk.hh | 1 +
+ src/vteinternal.hh | 1 +
+ src/vteseq.cc | 4 +++-
+ 7 files changed, 31 insertions(+), 8 deletions(-)
+
+diff --git a/src/vte.cc b/src/vte.cc
+index 6d8ab2bb..e8a344ee 100644
+--- a/src/vte.cc
++++ b/src/vte.cc
+@@ -10063,6 +10063,12 @@ Terminal::emit_pending_signals()
+ g_signal_emit(freezer.get(), signals[SIGNAL_SHELL_PREEXEC], 0);
+ }
+
++ if (m_pending_changes & vte::to_integral(PendingChanges::SHELL_PRECMD)) {
++ _vte_debug_print (VTE_DEBUG_SIGNALS,
++ "Emitting `shell-precmd'.\n");
++ g_signal_emit(freezer.get(), signals[SIGNAL_SHELL_PRECMD], 0);
++ }
++
+ if (m_pending_changes & vte::to_integral(PendingChanges::TITLE)) {
+ if (m_window_title != m_window_title_pending) {
+ m_window_title.swap(m_window_title_pending);
+diff --git a/src/vte.sh.in b/src/vte.sh.in
+index 01b44e23..877fe93d 100644
+--- a/src/vte.sh.in
++++ b/src/vte.sh.in
+@@ -38,7 +38,7 @@ __vte_prompt_command() {
+ local pwd='~'
+ [ "$PWD" != "$HOME" ] && pwd=${PWD/#$HOME\//\~\/}
+ pwd="${pwd//[[:cntrl:]]}"
+- printf '\033]777;notify;Command completed;%s\033\\\033]0;%s@%s:%s\033\\' "${command}" "${USER}" "${HOSTNAME%%.*}" "${pwd}"
++ printf '\033]777;notify;Command completed;%s\033\\\033]777;precmd\033\\\033]0;%s@%s:%s\033\\' "${command}" "${USER}" "${HOSTNAME%%.*}" "${pwd}"
+ __vte_osc7
+ }
+
+diff --git a/src/vte/vteterminal.h b/src/vte/vteterminal.h
+index 062b6694..ed08880d 100644
+--- a/src/vte/vteterminal.h
++++ b/src/vte/vteterminal.h
+@@ -109,14 +109,9 @@ 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);
+
+-#if _VTE_GTK == 3
+- /* Compatibility padding due to fedora patches intruding on our ABI */
+- /*< private >*/
+- gpointer _extra_padding[1];
+-#endif /* _VTE_GTK == 3 */
+-
+ /* Add new vfuncs here, and subtract from the padding below. */
+
+ /* Padding for future expansion. */
+diff --git a/src/vtegtk.cc b/src/vtegtk.cc
+index a4d51bfb..7020c2af 100644
+--- a/src/vtegtk.cc
++++ b/src/vtegtk.cc
+@@ -1249,6 +1249,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;
+@@ -1353,6 +1354,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 bf85bdf4..cee56b65 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_NOTIFICATION_RECEIVED,
+ SIGNAL_WINDOW_TITLE_CHANGED,
+diff --git a/src/vteinternal.hh b/src/vteinternal.hh
+index b4f1b4c9..eabc0062 100644
+--- a/src/vteinternal.hh
++++ b/src/vteinternal.hh
+@@ -680,6 +680,7 @@ public:
+ CWF = 1u << 2,
+ NOTIFICATION = 1u << 3,
+ SHELL_PREEXEC = 1u << 4,
++ SHELL_PRECMD = 1u << 5,
+ };
+ unsigned m_pending_changes{0};
+
+diff --git a/src/vteseq.cc b/src/vteseq.cc
+index dbc6276f..4de2a6f1 100644
+--- a/src/vteseq.cc
++++ b/src/vteseq.cc
+@@ -1402,7 +1402,9 @@ Terminal::handle_urxvt_extension(vte::parser::Sequence const& seq,
+ return;
+ }
+
+- if (*token == "preexec") {
++ if (*token == "precmd") {
++ m_pending_changes |= vte::to_integral(PendingChanges::SHELL_PRECMD);
++ } else if (*token == "preexec") {
+ m_pending_changes |= vte::to_integral(PendingChanges::SHELL_PREEXEC);
+ }
+ }
+--
+2.35.1
+
+
+From 2f3ea5834f7ae8c946724c3aef05964383088ec0 Mon Sep 17 00:00:00 2001
+From: Debarshi Ray <debarshir@gnome.org>
+Date: Wed, 2 May 2018 17:30:48 +0200
+Subject: [PATCH 09/11] Test the shell-precmd signal
+
+https://bugzilla.gnome.org/show_bug.cgi?id=711059
+https://bugzilla.gnome.org/show_bug.cgi?id=711060
+---
+ src/app/app.cc | 7 +++++++
+ 1 files changed, 7 insertions(+)
+
+diff --git a/src/app/app.cc b/src/app/app.cc
+index 33a9481e..d30f8bd7 100644
+--- a/src/app/app.cc
++++ b/src/app/app.cc
+@@ -2220,6 +2220,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)
+ {
+@@ -2523,6 +2529,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.35.1
+
+
+From 08d50a8599dad3ac60f54cb0aeeadb3ca26c214d Mon Sep 17 00:00:00 2001
+From: Debarshi Ray <debarshir@gnome.org>
+Date: Mon, 10 Jun 2019 20:30:18 +0200
+Subject: [PATCH 10/11] Support tracking the active container inside the
+ terminal
+
+Add sequences
+
+ OSC 777 ; container ; push ; NAME ; RUNTIME ; UID BEL
+ OSC 777 ; container ; push ; NAME ; RUNTIME ; UID ST
+ OSC 777 ; container ; pop ; NAME ; RUNTIME ; UID BEL
+ OSC 777 ; container ; pop ; NAME ; RUNTIME ; UID ST
+
+ 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 UID argument is the real UID of the
+container tools. Only those containers that are used with the same real
+UID as the VTE process are tracked.
+
+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 | 8 ++++
+ src/vte/vteterminal.h | 4 ++
+ src/vtegtk.cc | 77 ++++++++++++++++++++++++++++++++++++++
+ src/vtegtk.hh | 2 +
+ src/vteinternal.hh | 16 ++++++++
+ src/vteseq.cc | 86 +++++++++++++++++++++++++++++++++++++++++++
+ 6 files changed, 193 insertions(+)
+
+diff --git a/src/vte.cc b/src/vte.cc
+index e8a344ee..a3ca5108 100644
+--- a/src/vte.cc
++++ b/src/vte.cc
+@@ -10082,6 +10082,14 @@ Terminal::emit_pending_signals()
+ m_window_title_pending.clear();
+ }
+
++ if (m_pending_changes & vte::to_integral(PendingChanges::CONTAINERS)) {
++ _vte_debug_print(VTE_DEBUG_SIGNALS,
++ "Notifying `current-container-name' and `current-container-runtime'.\n");
++
++ g_object_notify_by_pspec(freezer.get(), pspecs[PROP_CURRENT_CONTAINER_NAME]);
++ g_object_notify_by_pspec(freezer.get(), pspecs[PROP_CURRENT_CONTAINER_RUNTIME]);
++ }
++
+ if (m_pending_changes & vte::to_integral(PendingChanges::CWD)) {
+ 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 ed08880d..d25eb93a 100644
+--- a/src/vte/vteterminal.h
++++ b/src/vte/vteterminal.h
+@@ -511,6 +511,10 @@ glong vte_terminal_get_column_count(VteTerminal *terminal) _VTE_CXX_NOEXCEPT _VT
+ _VTE_PUBLIC
+ const char *vte_terminal_get_window_title(VteTerminal *terminal) _VTE_CXX_NOEXCEPT _VTE_GNUC_NONNULL(1);
+ _VTE_PUBLIC
++const char *vte_terminal_get_current_container_name(VteTerminal *terminal) _VTE_CXX_NOEXCEPT _VTE_GNUC_NONNULL(1);
++_VTE_PUBLIC
++const char *vte_terminal_get_current_container_runtime(VteTerminal *terminal) _VTE_CXX_NOEXCEPT _VTE_GNUC_NONNULL(1);
++_VTE_PUBLIC
+ const char *vte_terminal_get_current_directory_uri(VteTerminal *terminal) _VTE_CXX_NOEXCEPT _VTE_GNUC_NONNULL(1);
+ _VTE_PUBLIC
+ const char *vte_terminal_get_current_file_uri(VteTerminal *terminal) _VTE_CXX_NOEXCEPT _VTE_GNUC_NONNULL(1);
+diff --git a/src/vtegtk.cc b/src/vtegtk.cc
+index 7020c2af..2ee5b029 100644
+--- a/src/vtegtk.cc
++++ b/src/vtegtk.cc
+@@ -942,6 +942,12 @@ try
+ 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;
+@@ -2357,6 +2363,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:
+ *
+@@ -4929,6 +4956,56 @@ catch (...)
+ return -1;
+ }
+
++/**
++ * 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) noexcept
++try
++{
++ 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();
++}
++catch (...)
++{
++ vte::log_exception();
++ return NULL;
++}
++
++/**
++ * 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) noexcept
++try
++{
++ 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();
++}
++catch (...)
++{
++ vte::log_exception();
++ return NULL;
++}
++
+ /**
+ * vte_terminal_get_current_directory_uri:
+ * @terminal: a #VteTerminal
+diff --git a/src/vtegtk.hh b/src/vtegtk.hh
+index cee56b65..e41f2f3a 100644
+--- a/src/vtegtk.hh
++++ b/src/vtegtk.hh
+@@ -72,6 +72,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 eabc0062..dcb6a6fc 100644
+--- a/src/vteinternal.hh
++++ b/src/vteinternal.hh
+@@ -59,6 +59,7 @@
+ #include <list>
+ #include <queue>
+ #include <optional>
++#include <stack>
+ #include <string>
+ #include <variant>
+ #include <vector>
+@@ -110,6 +111,18 @@ typedef enum _VteCharacterReplacement {
+ VTE_CHARACTER_REPLACEMENT_LINE_DRAWING
+ } 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;
+@@ -661,6 +674,8 @@ public:
+ gboolean m_cursor_moved_pending;
+ gboolean m_contents_changed_pending;
+
++ std::stack<VteContainer> m_containers;
++
+ /* desktop notification */
+ std::string m_notification_summary;
+ std::string m_notification_body;
+@@ -681,6 +696,7 @@ public:
+ NOTIFICATION = 1u << 3,
+ SHELL_PREEXEC = 1u << 4,
+ SHELL_PRECMD = 1u << 5,
++ CONTAINERS = 1u << 6,
+ };
+ unsigned m_pending_changes{0};
+
+diff --git a/src/vteseq.cc b/src/vteseq.cc
+index 4de2a6f1..18c0d89c 100644
+--- a/src/vteseq.cc
++++ b/src/vteseq.cc
+@@ -19,10 +19,14 @@
+
+ #include "config.h"
+
++#include <string>
++
+ #include <search.h>
+ #include <stdlib.h>
+ #include <string.h>
+ #include <limits.h>
++#include <unistd.h>
++#include <sys/types.h>
+ #ifdef HAVE_SYS_SYSLIMITS_H
+ #include <sys/syslimits.h>
+ #endif
+@@ -1384,6 +1388,88 @@ 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 (token == endtoken)
++ return;
++
++ ++token;
++
++ if (token == endtoken)
++ return;
++
++ ++token;
++
++ if (token == endtoken) {
++ if (!m_containers.empty()) {
++ m_containers.pop();
++ m_pending_changes |= vte::to_integral(PendingChanges::CONTAINERS);
++ }
++
++ return;
++ }
++
++ const std::string uid_token = *token;
++ ++token;
++
++ const uid_t uid = getuid();
++ const std::string uid_str = std::to_string(uid);
++
++ if (uid_token == uid_str) {
++ if (!m_containers.empty()) {
++ m_containers.pop();
++ m_pending_changes |= vte::to_integral(PendingChanges::CONTAINERS);
++ }
++
++ return;
++ }
++
++ return;
++ } else if (sub_command == "push") {
++ if (token == endtoken)
++ return;
++
++ const std::string name = *token;
++ ++token;
++
++ if (token == endtoken)
++ return;
++
++ const std::string runtime = *token;
++ ++token;
++
++ if (token == endtoken) {
++ m_containers.emplace(name, runtime);
++ m_pending_changes |= vte::to_integral(PendingChanges::CONTAINERS);
++ return;
++ }
++
++ const std::string uid_token = *token;
++ ++token;
++
++ const uid_t uid = getuid();
++ const std::string uid_str = std::to_string(uid);
++
++ if (uid_token == uid_str) {
++ m_containers.emplace(name, runtime);
++ m_pending_changes |= vte::to_integral(PendingChanges::CONTAINERS);
++ return;
++ }
++
++ return;
++ }
++
++ return;
++ }
++
+ if (*token == "notify") {
+ ++token;
+
+--
+2.35.1
+
+
+From 62df90e5147c8be4e12bcf5ce99679c1fb2390d0 Mon Sep 17 00:00:00 2001
+From: Kalev Lember <klember@redhat.com>
+Date: Tue, 16 Feb 2021 16:30:44 +0100
+Subject: [PATCH 11/11] Revert "widget: Limit select-all to the writable region
+ not including the scrollback"
+
+... as decided by Fedora Workstation WG.
+
+https://pagure.io/fedora-workstation/issue/216
+
+This reverts commit 73713ec0644e232fb740170e399282be778d97f9.
+---
+ src/vte.cc | 9 +++------
+ 1 file changed, 3 insertions(+), 6 deletions(-)
+
+diff --git a/src/vte.cc b/src/vte.cc
+index a3ca5108..1834b090 100644
+--- a/src/vte.cc
++++ b/src/vte.cc
+@@ -6497,10 +6497,7 @@ Terminal::maybe_end_selection()
+ /*
+ * Terminal::select_all:
+ *
+- * Selects all text within the terminal. Note that we only select the writable
+- * region, *not* the scrollback buffer, due to this potentially selecting so
+- * much data that putting it on the clipboard either hangs the process for a long
+- * time or even crash it directly. (FIXME!)
++ * Selects all text within the terminal (including the scrollback buffer).
+ */
+ void
+ Terminal::select_all()
+@@ -6509,8 +6506,8 @@ Terminal::select_all()
+
+ m_selecting_had_delta = TRUE;
+
+- m_selection_resolved.set({m_screen->insert_delta, 0},
+- {_vte_ring_next(m_screen->row_data), 0});
++ m_selection_resolved.set ({ _vte_ring_delta (m_screen->row_data), 0 },
++ { _vte_ring_next (m_screen->row_data), 0 });
+
+ _vte_debug_print(VTE_DEBUG_SELECTION, "Selecting *all* text.\n");
+
+--
+2.35.1
+