From 73cb06afcf83c8009089ca43b6d23549549b14df Mon Sep 17 00:00:00 2001 From: Sergey Zhumatiy Date: Fri, 19 Jun 2026 11:16:07 -0700 Subject: [PATCH 1/2] Add tab activity highlighting with grace periods Highlight the title of a background tab (bold + orange) when its terminal produces output, clearing once the tab is selected. Gated behind a new "display-tab-activity" setting, off by default. To avoid lighting up every tab on session restore, activity is ignored for adjustable grace periods: a new-tab grace (default 3s) starting at tab creation, and a shorter focus-loss grace (default 1s) when a tab loses focus. The focus-loss grace never shortens an existing longer grace, so the rapid switch-page cascade during restore can't clobber the creation grace. Both periods are configurable in Preferences > General. Co-Authored-By: Claude Opus 4.8 --- guake/boxes.py | 38 ++++++++++- guake/data/org.guake.gschema.xml | 15 +++++ guake/data/prefs.glade | 110 +++++++++++++++++++++++++++++++ guake/gsettings.py | 9 +++ guake/notebook.py | 54 +++++++++++++++ guake/prefs.py | 22 +++++++ 6 files changed, 246 insertions(+), 2 deletions(-) diff --git a/guake/boxes.py b/guake/boxes.py index 665ded971..a5365c237 100644 --- a/guake/boxes.py +++ b/guake/boxes.py @@ -5,6 +5,7 @@ gi.require_version("Vte", "2.91") # vte-0.42 gi.require_version("Gtk", "3.0") +from gi.repository import GLib from gi.repository import GObject from gi.repository import Gdk from gi.repository import Gio @@ -636,10 +637,17 @@ def remove_dead_child(self, child): print("I have never seen this widget!") +# Foreground color applied to a background tab's title when it has unseen +# activity. Chosen to stay readable on both light and dark tab bars. +TAB_ACTIVITY_COLOR = "#E8A33D" + + class TabLabelEventBox(Gtk.EventBox): def __init__(self, notebook, text, settings): super().__init__() self.notebook = notebook + self._text = text + self._activity = False self.box = Gtk.Box(homogeneous=Gtk.Orientation.HORIZONTAL, spacing=0, visible=True) self.label = Gtk.Label(label=text, visible=True) self.close_button = Gtk.Button( @@ -656,10 +664,36 @@ def __init__(self, notebook, text, settings): self.connect("button-press-event", self.on_button_press, self.label) def set_text(self, text): - self.label.set_text(text) + self._text = text + self._render() def get_text(self): - return self.label.get_text() + return self._text + + def set_activity(self, active): + """Highlight (or clear) this tab's title to signal unseen output. + + Returns True if the activity state actually changed, so callers can + avoid redundant re-rendering on the frequent contents-changed signal. + """ + active = bool(active) + if active == self._activity: + return False + self._activity = active + self._render() + return True + + def get_activity(self): + return self._activity + + def _render(self): + if self._activity: + self.label.set_markup( + f'' + f"{GLib.markup_escape_text(self._text)}" + ) + else: + self.label.set_text(self._text) def grab_focus_on_last_focused_terminal(self): server_time = get_server_time(self.notebook.guake.window) diff --git a/guake/data/org.guake.gschema.xml b/guake/data/org.guake.gschema.xml index d8846e77b..cad5252fa 100644 --- a/guake/data/org.guake.gschema.xml +++ b/guake/data/org.guake.gschema.xml @@ -171,6 +171,21 @@ Audible bell If true, the system alert sound will be played on a bell character. + + false + Highlight tabs with activity + If true, the title of a background tab is highlighted when its terminal produces output, until the tab is selected. + + + 3.0 + Activity grace period for new tabs + Number of seconds during which activity is ignored on a newly created tab, to avoid highlighting it because of its initial shell prompt. + + + 1.0 + Activity grace period after losing focus + Number of seconds during which activity is ignored on a tab right after it loses focus. + 100 Window width. diff --git a/guake/data/prefs.glade b/guake/data/prefs.glade index f1b2c2db2..6e58140d5 100644 --- a/guake/data/prefs.glade +++ b/guake/data/prefs.glade @@ -52,6 +52,16 @@ 1 10 + + 60 + 0.5 + 5 + + + 60 + 0.5 + 5 + 10000000 5000 @@ -397,6 +407,106 @@ 3 + + + Highlight tabs with activity + True + True + False + start + True + True + + + + 0 + 5 + + + + + True + False + 6 + + + True + False + center + Ignore activity on new tabs for (seconds): + + + False + False + 0 + + + + + True + True + 3.0 + tab_activity_new_tab_grace_adj + 1 + 1 + True + + + + False + True + 1 + + + + + 0 + 6 + 2 + + + + + True + False + 6 + + + True + False + center + Ignore activity after losing focus for (seconds): + + + False + False + 0 + + + + + True + True + 1.0 + tab_activity_focus_loss_grace_adj + 1 + 1 + True + + + + False + True + 1 + + + + + 0 + 7 + 2 + + True diff --git a/guake/gsettings.py b/guake/gsettings.py index ea5d91b32..a53084bf1 100644 --- a/guake/gsettings.py +++ b/guake/gsettings.py @@ -89,6 +89,7 @@ def __init__(self, guake_inst): settings.general.onChangedValue("max-tab-name-length", self.max_tab_name_length_changed) settings.general.onChangedValue("display-tab-names", self.display_tab_names_changed) settings.general.onChangedValue("hide-tabs-if-one-tab", self.hide_tabs_if_one_tab_changed) + settings.general.onChangedValue("display-tab-activity", self.display_tab_activity_changed) def custom_command_file_changed(self, settings, key, user_data): self.guake.load_custom_commands() @@ -475,3 +476,11 @@ def hide_tabs_if_one_tab_changed(self, settings, key, user_data): be called and will show/hide the tab bar if necessary """ self.guake.get_notebook().hide_tabbar_if_one_tab() + + def display_tab_activity_changed(self, settings, key, user_data): + """If the gconf var display-tab-activity was disabled, clear any + activity highlights that are currently shown on tabs. + """ + if not settings.get_boolean(key): + for notebook in self.guake.notebook_manager.iter_notebooks(): + notebook.clear_all_tab_activity() diff --git a/guake/notebook.py b/guake/notebook.py index 90cb58bf7..e7606586a 100644 --- a/guake/notebook.py +++ b/guake/notebook.py @@ -36,6 +36,7 @@ import gi import os +import time gi.require_version("Gtk", "3.0") gi.require_version("Wnck", "3.0") @@ -90,6 +91,9 @@ def __init__(self, *args, **kwargs): self.notebook_on_button_press_id = self.connect( "button-press-event", self.on_button_press, None ) + # Clear the activity highlight from a tab once it becomes the current one. + self._activity_last_page = None + self.connect("switch-page", self.on_switch_page) # Action box self.pin_button = Gtk.ToggleButton( @@ -371,6 +375,12 @@ def new_page(self, directory=None, position=None, empty=False, open_tab_cwd=Fals terminal_box.set_terminal(terminal) root_terminal_box = RootTerminalBox(self.guake, self) root_terminal_box.set_child(terminal_box) + # Ignore activity on a freshly created tab for a grace period, so the + # initial shell prompt (especially on session restore) does not light up + # every background tab at once. + if self.guake: + grace = self.guake.settings.general.get_double("tab-activity-new-tab-grace") + root_terminal_box.activity_ignore_until = time.monotonic() + grace page_num = self.insert_page( root_terminal_box, None, position if position is not None else -1 ) @@ -408,6 +418,7 @@ def terminal_spawn(self, directory=None, open_tab_cwd=False): "key-press-event", lambda x, y: self.guake.accel_group.activate(x, y) if self.guake.accel_group else False, ) + terminal.connect("contents-changed", self.on_terminal_activity) if not isinstance(directory, str): directory = os.environ["HOME"] try: @@ -427,6 +438,49 @@ def terminal_spawn(self, directory=None, open_tab_cwd=False): terminal.spawn_sync_pid(directory) return terminal + def on_terminal_activity(self, terminal): + """Highlight a background tab's title when its terminal produces output.""" + if not getattr(self, "guake", None): + return + if not self.guake.settings.general.get_boolean("display-tab-activity"): + return + page_index = self.find_page_index_by_terminal(terminal) + if page_index < 0 or page_index == self.get_current_page(): + return + page = self.get_nth_page(page_index) + if time.monotonic() < getattr(page, "activity_ignore_until", 0): + return + label = self.get_tab_label(page) + if hasattr(label, "set_activity"): + label.set_activity(True) + + def on_switch_page(self, notebook, page, page_num): + """Clear the highlight from the tab being switched to, and start a short + grace period on the tab that just lost focus.""" + previous_page = self._activity_last_page + self._activity_last_page = page + if previous_page is not None and previous_page is not page and getattr( + self, "guake", None + ): + grace = self.guake.settings.general.get_double("tab-activity-focus-loss-grace") + # Never shorten an existing (e.g. longer new-tab) grace: on session + # restore every tab briefly becomes current, and clobbering the + # creation grace with this one would let the startup burst through. + previous_page.activity_ignore_until = max( + getattr(previous_page, "activity_ignore_until", 0), + time.monotonic() + grace, + ) + label = self.get_tab_label(page) + if hasattr(label, "set_activity"): + label.set_activity(False) + + def clear_all_tab_activity(self): + """Remove activity highlights from every tab (e.g. when the feature is + disabled).""" + for label in self.iter_tabs(): + if hasattr(label, "set_activity"): + label.set_activity(False) + def terminal_attached(self, terminal): terminal.emit("focus", Gtk.DirectionType.TAB_FORWARD) self.emit("terminal-spawned", terminal, terminal.pid) diff --git a/guake/prefs.py b/guake/prefs.py index d69237510..5c3097a37 100644 --- a/guake/prefs.py +++ b/guake/prefs.py @@ -480,6 +480,18 @@ def on_use_audible_bell_toggled(self, chk): """Changes the value of use_audible_bell in dconf""" self.settings.general.set_boolean("use-audible-bell", chk.get_active()) + def on_display_tab_activity_toggled(self, chk): + """Changes the value of display_tab_activity in dconf""" + self.settings.general.set_boolean("display-tab-activity", chk.get_active()) + + def on_tab_activity_new_tab_grace_changed(self, spin): + """Changes the value of tab_activity_new_tab_grace in dconf""" + self.settings.general.set_double("tab-activity-new-tab-grace", spin.get_value()) + + def on_tab_activity_focus_loss_grace_changed(self, spin): + """Changes the value of tab_activity_focus_loss_grace in dconf""" + self.settings.general.set_double("tab-activity-focus-loss-grace", spin.get_value()) + # scrolling tab def on_use_scrollbar_toggled(self, chk): @@ -1195,6 +1207,16 @@ def load_configs(self): value = self.settings.general.get_boolean("use-audible-bell") self.get_widget("use_audible_bell").set_active(value) + # highlight tabs with activity + value = self.settings.general.get_boolean("display-tab-activity") + self.get_widget("display_tab_activity").set_active(value) + + # tab activity grace periods + value = self.settings.general.get_double("tab-activity-new-tab-grace") + self.get_widget("tab_activity_new_tab_grace").set_value(value) + value = self.settings.general.get_double("tab-activity-focus-loss-grace") + self.get_widget("tab_activity_focus_loss_grace").set_value(value) + self._load_screen_settings() value = self.settings.general.get_boolean("quick-open-enable") From 1a01bf7660c35862b11233951e029ab802bba596 Mon Sep 17 00:00:00 2001 From: Sergey Zhumatiy Date: Wed, 24 Jun 2026 22:26:07 -0700 Subject: [PATCH 2/2] add release note --- Pipfile | 95 +++++- Pipfile.lock | 289 ++++++++++++++---- guake/notebook.py | 4 +- .../notes/bugfix-503a9fee8f80e714.yaml | 1 - ..._activity_indication-be54b262d370a96b.yaml | 23 ++ scripts/bootstrap-dev-debian.sh | 2 +- scripts/bootstrap-dev-pip.sh | 2 +- 7 files changed, 348 insertions(+), 68 deletions(-) create mode 100644 releasenotes/notes/tab_activity_indication-be54b262d370a96b.yaml diff --git a/Pipfile b/Pipfile index 1dc1bf4a6..24ea64af1 100644 --- a/Pipfile +++ b/Pipfile @@ -35,8 +35,95 @@ tomli = "*" pre-commit = "==2.17.0" [packages] -pbr = "*" wheel = "*" -typing = {markers = "python_version < '3.5'"} -cython = "*" -pyyaml = "*" +alabaster = "==1.0.0" +astroid = "==3.3.8" +autopep8 = "==2.3.1" +babel = "==2.16.0" +black = "==24.10.0" +certifi = "==2024.12.14" +cffi = "==1.17.1" +cfgv = "==3.4.0" +charset-normalizer = "==3.4.1" +click = "==8.1.8" +colorlog = "==6.9.0" +coverage = {extras = ["toml"], version = "==7.6.10"} +cryptography = "==44.0.0" +dill = "==0.3.9" +distlib = "==0.3.9" +docutils = "==0.21.2" +dulwich = "==0.22.7" +filelock = "==3.16.1" +fiximports = "==0.1.18" +flake8 = "==7.1.1" +identify = "==2.6.4" +idna = "==3.10" +imagesize = "==1.4.1" +iniconfig = "==2.0.0" +isort = "==5.13.2" +"jaraco.classes" = "==3.4.0" +"jaraco.context" = "==6.0.1" +"jaraco.functools" = "==4.1.0" +jeepney = "==0.8.0" +jinja2 = "==3.1.5" +keyring = "==25.6.0" +markdown-it-py = "==3.0.0" +markupsafe = "==3.0.2" +mccabe = "==0.7.0" +mdurl = "==0.1.2" +mock = "==5.1.0" +more-itertools = "==10.5.0" +mypy-extensions = "==1.0.0" +nh3 = "==0.2.20" +nodeenv = "==1.9.1" +packaging = "==24.2" +pathlib2 = "==2.3.7.post1" +pathspec = "==0.12.1" +pbr = "==6.1.0" +pep8 = "==1.7.1" +pew = "==1.2.0" +pkginfo = "==1.12.0" +platformdirs = "==4.3.6" +pluggy = "==1.5.0" +pre-commit = "==2.17.0" +pycodestyle = "==2.12.1" +pycparser = "==2.22" +pyfakefs = "==5.7.3" +pyflakes = "==3.2.0" +pygments = "==2.18.0" +pylint = "==3.3.2" +pytest = "==8.3.4" +pytest-cov = "==6.0.0" +pytest-mock = "==3.14.0" +pyyaml = "==6.0.2" +readme-renderer = "==44.0" +reno = {extras = ["sphinx"], version = "==4.1.0"} +requests = "==2.32.3" +requests-toolbelt = "==1.0.0" +rfc3986 = "==2.0.0" +rich = "==13.9.4" +scandir = "==1.10.0" +secretstorage = "==3.3.3" +six = "==1.17.0" +snowballstemmer = "==2.2.0" +sphinx = "==8.1.3" +sphinx-rtd-theme = "==3.0.2" +sphinxcontrib-applehelp = "==2.0.0" +sphinxcontrib-devhelp = "==2.0.0" +sphinxcontrib-htmlhelp = "==2.1.0" +sphinxcontrib-jquery = "==4.1" +sphinxcontrib-jsmath = "==1.0.1" +sphinxcontrib-programoutput = "==0.18" +sphinxcontrib-qthelp = "==2.0.0" +sphinxcontrib-serializinghtml = "==2.0.0" +toml = "==0.10.2" +tomli = "==2.2.1" +tomlkit = "==0.13.2" +twine = "==6.0.1" +typing-extensions = "==4.12.2" +urllib3 = "==2.3.0" +virtualenv = "==20.28.0" +virtualenv-clone = "==0.5.7" +yapf = "==0.43.0" +cython = "==3.0.11" +typing = "==3.7.4.3" diff --git a/Pipfile.lock b/Pipfile.lock index 96c5f6624..6feff6f44 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "662e1fde9539df5911a5bd1489565617814cbd843dbe57d9bf0efe5a5d24b3ec" + "sha256": "1e9f36a4f544e92a3ad868b7e14649d333257f6463fd754827d7cb756cad44e6" }, "pipfile-spec": 6, "requires": { @@ -16,6 +16,14 @@ ] }, "default": { + "cfgv": { + "hashes": [ + "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", + "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132" + ], + "markers": "python_version >= '3.10'", + "version": "==3.5.0" + }, "cython": { "hashes": [ "sha256:0b1d1f6f94cc5d42a4591f6d60d616786b9cd15576b112bc92a23131fcf38020", @@ -89,74 +97,223 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==3.0.11" }, + "distlib": { + "hashes": [ + "sha256:4b0ce306c966eb73bc3a7b6abad017c556dadd92c44701562cd528ac7fde4d5b", + "sha256:f152097224a0ae24be5a0f6bae1b9359af82133bce63f98a95f86cae1aede9ed" + ], + "version": "==0.4.3" + }, + "dulwich": { + "hashes": [ + "sha256:04252b107a1600325f5f0301dde8b5b62f5bb51a0467e360070baddbb4edcea7", + "sha256:116ac7decb923a473540bf813c1ceb061bef07209fad5fb002d867f1907f9393", + "sha256:11b1f5a6a6075ab4f906dfb755c1d805c8c898ba4f4816b0fdb6123e113030ac", + "sha256:1c35c294acfc5a0a88d01d5db1abeba550bf6274bcc3fddbf8b365e9eea280da", + "sha256:204d14692fb1dd850ab773690f7530f4065f405e9e7dd3f85bdf92e9330ffa2d", + "sha256:21e2e9b81ab04ad83f2d4101ac515ef56ee08d06fd853c1a7ac255f20bb49963", + "sha256:27db364f2f3cf5b0dddd44d6c2ae9a20f6021e2bae8b1268fa689076f0192244", + "sha256:371394e2c6f3f9789cdc0abb965dae9bc62e79984b84f35339e9d466598c9fb0", + "sha256:405cfd53a99374ff03aacdd7a86d6a07615feca072ed69721f49ae2ebaa3eab4", + "sha256:493e2ea0f23a8e9aae8e3000a366d1fbf0ed2c13eaf8f41863f050c6392ef138", + "sha256:4940fbf7cb37870686c63dfc7682e1afdab0e55b663bb614572909b68e775d31", + "sha256:4cf80217e73a039614dde5ab2c74917833632912b788074bc7158058aafbf3e5", + "sha256:5ff9f36c95deaf7eb5d6ccde4c68adbcb932a87e03c1b479a8d94d779e7cc5d2", + "sha256:6993ad48f92dc38a43e3c1bf25efb03a62fc2cf4db86a2e904b6c7176dafc3d5", + "sha256:6d9720d591052730775dcbf450f0cd5b35162f4eeb4754337a5d763326481b2f", + "sha256:6fcbb3dec5733898be2114476ff5abaa1dbb8a6d28ffbe492b3225a5a556197e", + "sha256:6fd9911fb57ee2d6eefaf895df65e1139fbc911fa560e959b38feabe5f15003f", + "sha256:72512e2a22df6fb65ba7b66f5037046019a12343f6e9e54f42bcc4a68ab3d628", + "sha256:72ac4f3fc92d54115ba2d812263117d9577b17f4c62ae8f170c177515f62e9d3", + "sha256:794a85b8b9d4ad57d02c8cb455735419ac50c0f2e3d26d83873e34abee58cb1b", + "sha256:79728d98e0ec184856d71fd0d55abbf5ac7345b5baea9f2d1533a4de9064e13d", + "sha256:7b4a2f497718bfe1a3b21f933ee27c111b9cea560c0b2d8a6d939e1b5f297f79", + "sha256:7c187efaebb72146245ebcb872b89fdc99314fa37442119c5a5feb18af3f4b8a", + "sha256:824b7f5b22b128c1e1ad7c655e9790e2d75c7ab1ba1e40a708024193f1dc47a3", + "sha256:82e8810e57f9651a624116e3fede33276f89406cb910f517b944105e284e6755", + "sha256:8d8175dbe4feaf62bcafc8708448bfe223b4dfc71609be25c0cf2b0962abc36c", + "sha256:9139d0110580a3038048286e761e9be166ec40a2eb19218b41b75541c5d87a86", + "sha256:9e357d825b82e7fec2b83cd8e50f3c099c14c1070e1df961bfefb83943dc1582", + "sha256:ad4b6114440f9cf72315b173532ee3284f27a288b8a24bc27e45b2e54593720d", + "sha256:c60ddc8206e04e8e08208eac80130004eff0d587c82d398beeca7330cade061f", + "sha256:c639a8c9fb7e745749f2dcbd5b63a82df2fc99cfe62e2c3654ec025a42d2e51f", + "sha256:cb1f8d658f36b2ac3982715dc3e49f0d741a3e5a8c40136bebb6d8493968aa12", + "sha256:cdd15b8442b527575d733d90cfd6d3c4cbaebf989e2298b0cb57a7916c66254f", + "sha256:dd2783352917b7cb3ab12b7c3f7757210d93af6df0bd2d876a8e5b53b2feb3eb", + "sha256:dd2b66c915f1b22ca6533b48e8ee435800b25f74f419c40e1a92271666d8b297", + "sha256:e103584421b7205f022bd413a324ff26905ffa84fcc1536f5787bf554d5d390b", + "sha256:e995ad77b0685747bdb51f7a5cd7e6cb8efe73e29517b0f2c95fc2e6d10d5a90", + "sha256:eb27a9ebe9029c872abadf4f9dcb18c9f6a4b7a4afe137f79a61df1ae59dc6bf", + "sha256:f682671a2e19b7b4caa572ff3073557de049a153946305e051a4f50bb0e5e1bd", + "sha256:f887643cf1c7a04e898547bd9f0acf6654d772ebd153012433ef950315dcf776", + "sha256:fa7a089298fcbdaed493dd25c2f13574ccfc708f89a7aae8e3c25fd8393f5c81", + "sha256:fae59c5e345f5ca234c85d157f1c7d5e0086126b45b5f7cfa66ffe41d049fdd6" + ], + "markers": "python_version >= '3.10'", + "version": "==1.2.6" + }, + "filelock": { + "hashes": [ + "sha256:10cdb3656fc44541cdf30652a93fb10ec6b05325620eb316bd26893e4201538a", + "sha256:dac1648087d5115554850d113e7dd8c83ab2d38e3435dde2d4f163847e57b767" + ], + "markers": "python_version >= '3.10'", + "version": "==3.29.4" + }, + "identify": { + "hashes": [ + "sha256:20e6a87f786f768c092a721ad107fc9df0eb89347be9396cadf3f4abbd1fb78a", + "sha256:6be5020c38fcb07da56c53733538a3081ea5aa70d36a156f83044bfbf9173842" + ], + "markers": "python_version >= '3.10'", + "version": "==2.6.19" + }, + "nodeenv": { + "hashes": [ + "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", + "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", + "version": "==1.10.0" + }, + "packaging": { + "hashes": [ + "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", + "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661" + ], + "markers": "python_version >= '3.8'", + "version": "==26.2" + }, "pbr": { "hashes": [ - "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24", - "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a" + "sha256:b46004ec30a5324672683ec848aed9e8fc500b0d261d40a3229c2d2bbfcedc29", + "sha256:ff223894eb1cd271a98076b13d3badff3bb36c424074d26334cd25aebeecea6b" ], "index": "pypi", "markers": "python_version >= '2.6'", - "version": "==6.1.0" + "version": "==7.0.3" + }, + "platformdirs": { + "hashes": [ + "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", + "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a" + ], + "markers": "python_version >= '3.10'", + "version": "==4.10.0" + }, + "pre-commit": { + "hashes": [ + "sha256:718d2208cef53fdc38206e40524a6d4d9576d103eb16f0fec11c875e7716e9d9", + "sha256:e2cf246f7299edcabcf15f9b0571fdce06058527f0a06535068a86d38089f29b" + ], + "index": "pypi", + "markers": "python_version >= '3.10'", + "version": "==4.6.0" + }, + "python-discovery": { + "hashes": [ + "sha256:475803f53b7b2ed6e490e27373f9d8340f7d2eebf9acdaf645d7d714c97bb500", + "sha256:8f3746c4b4968d22afbb97d36e1a0e5b66e6c0f297290f2e95f05b9b8bf18690" + ], + "markers": "python_version >= '3.8'", + "version": "==1.4.2" }, "pyyaml": { "hashes": [ - "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", - "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", - "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", - "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", - "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", - "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", - "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", - "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", - "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", - "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", - "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", - "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", - "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", - "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", - "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", - "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", - "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", - "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", - "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", - "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", - "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", - "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", - "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", - "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", - "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", - "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", - "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", - "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", - "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", - "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", - "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", - "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", - "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", - "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", - "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", - "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", - "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", - "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", - "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", - "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", - "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", - "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", - "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", - "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", - "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", - "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", - "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", - "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", - "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", - "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", - "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", - "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", - "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" + "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", + "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a", + "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", + "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", + "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", + "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", + "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", + "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", + "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0", + "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", + "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", + "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6", + "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7", + "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", + "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007", + "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", + "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", + "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9", + "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295", + "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", + "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", + "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", + "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", + "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", + "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", + "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", + "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", + "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b", + "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", + "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5", + "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", + "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", + "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369", + "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", + "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", + "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", + "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", + "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", + "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", + "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", + "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", + "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", + "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", + "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", + "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", + "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", + "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", + "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", + "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", + "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4", + "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", + "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", + "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", + "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", + "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", + "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", + "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da", + "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", + "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", + "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", + "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", + "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f", + "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917", + "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", + "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", + "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", + "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", + "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", + "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", + "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3", + "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", + "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926", + "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==6.0.2" + "version": "==6.0.3" + }, + "reno": { + "hashes": [ + "sha256:9b6a2cb768ffb7f7c74bbd76822acff70840a1219f45bcec5080dbc108df4f96", + "sha256:f992f1fdbd16215ec9de47af08131d53a2830c9e78439eb563ce8d6a7f625370" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==4.1.0" + }, + "setuptools": { + "hashes": [ + "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", + "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb" + ], + "markers": "python_version >= '3.9'", + "version": "==82.0.1" }, "typing": { "hashes": [ @@ -166,6 +323,22 @@ "markers": "python_version < '3.5'", "version": "==3.7.4.3" }, + "urllib3": { + "hashes": [ + "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", + "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897" + ], + "markers": "python_version >= '3.10'", + "version": "==2.7.0" + }, + "virtualenv": { + "hashes": [ + "sha256:55aa670b67bbfb991b03fda39bd3276d92c419d702376e98c5df1c9989a26783", + "sha256:dca3bf98275a59c652b69d68e73433e597d977c2da9198882479d1a7188009c8" + ], + "markers": "python_version >= '3.9'", + "version": "==21.5.1" + }, "wheel": { "hashes": [ "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", diff --git a/guake/notebook.py b/guake/notebook.py index e7606586a..96e199b65 100644 --- a/guake/notebook.py +++ b/guake/notebook.py @@ -459,9 +459,7 @@ def on_switch_page(self, notebook, page, page_num): grace period on the tab that just lost focus.""" previous_page = self._activity_last_page self._activity_last_page = page - if previous_page is not None and previous_page is not page and getattr( - self, "guake", None - ): + if previous_page is not None and previous_page is not page and getattr(self, "guake", None): grace = self.guake.settings.general.get_double("tab-activity-focus-loss-grace") # Never shorten an existing (e.g. longer new-tab) grace: on session # restore every tab briefly becomes current, and clobbering the diff --git a/releasenotes/notes/bugfix-503a9fee8f80e714.yaml b/releasenotes/notes/bugfix-503a9fee8f80e714.yaml index af50e8be7..81d55d2bc 100644 --- a/releasenotes/notes/bugfix-503a9fee8f80e714.yaml +++ b/releasenotes/notes/bugfix-503a9fee8f80e714.yaml @@ -3,4 +3,3 @@ release_summary: > fixes: - Save Content works for newer versions of Vte, fixes #1958 - diff --git a/releasenotes/notes/tab_activity_indication-be54b262d370a96b.yaml b/releasenotes/notes/tab_activity_indication-be54b262d370a96b.yaml new file mode 100644 index 000000000..c12dcc9fe --- /dev/null +++ b/releasenotes/notes/tab_activity_indication-be54b262d370a96b.yaml @@ -0,0 +1,23 @@ +release_summary: > + Added indication of activity in non-focused tabs. Added settings for enabling/disabling + tab activity indication, and "grace" time intervals for new tab and unfocused tab. + +features: + - | + - add tabs activity indication + +known_issues: + +upgrade: + +deprecations: + +security: + +fixes: + +translations: + +notes_for_package_maintainers: + +other: diff --git a/scripts/bootstrap-dev-debian.sh b/scripts/bootstrap-dev-debian.sh index dcb1cd8d0..b6fa40048 100755 --- a/scripts/bootstrap-dev-debian.sh +++ b/scripts/bootstrap-dev-debian.sh @@ -53,7 +53,7 @@ if [[ $RUN == "1" ]]; then libcairo2-dev \ pkg-config fi - + if [[ $MAKE == "1" ]]; then echo "Install packages needed for making guake" sudo apt-get install --no-install-recommends -y \ diff --git a/scripts/bootstrap-dev-pip.sh b/scripts/bootstrap-dev-pip.sh index e6bf2c2c5..d4c2da5db 100755 --- a/scripts/bootstrap-dev-pip.sh +++ b/scripts/bootstrap-dev-pip.sh @@ -8,7 +8,7 @@ else op="--user " fi -python3 -m pip install $op --upgrade \ +python3 -m pip install $op --upgrade --break-system-packages \ 'pip==24.3.1' \ 'pipenv==2024.4.0' \ || echo "you may need to sudo me !"