diff --git a/docs/changelog.rst b/docs/changelog.rst index a4bc91410..a4b6678fd 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -91,6 +91,8 @@ To update |kitty|, :doc:`follow the instructions `. - Graphics protocol: Fix suppression of responses not working for chunked transmission (:iss:`3375`) +- Fix inactive tab closing causing active tab to change (:iss:`3398`) + 0.19.3 [2020-12-19] ------------------- diff --git a/kitty/tabs.py b/kitty/tabs.py index 546630d46..37e3548c3 100644 --- a/kitty/tabs.py +++ b/kitty/tabs.py @@ -745,29 +745,31 @@ class TabManager: # {{{ def remove(self, tab: Tab) -> None: self._remove_tab(tab) - next_active_tab = -1 + active_tab_needs_to_change = self.active_tab is None or self.active_tab is tab while True: try: self.active_tab_history.remove(tab.id) except ValueError: break - if self.opts.tab_switch_strategy == 'previous': - while self.active_tab_history and next_active_tab < 0: - tab_id = self.active_tab_history.pop() - for idx, qtab in enumerate(self.tabs): - if qtab.id == tab_id: - next_active_tab = idx - break - elif self.opts.tab_switch_strategy == 'left': - next_active_tab = max(0, self.active_tab_idx - 1) - elif self.opts.tab_switch_strategy == 'right': - next_active_tab = min(self.active_tab_idx, len(self.tabs) - 1) + if active_tab_needs_to_change: + next_active_tab = -1 + if self.opts.tab_switch_strategy == 'previous': + while self.active_tab_history and next_active_tab < 0: + tab_id = self.active_tab_history.pop() + for idx, qtab in enumerate(self.tabs): + if qtab.id == tab_id: + next_active_tab = idx + break + elif self.opts.tab_switch_strategy == 'left': + next_active_tab = max(0, self.active_tab_idx - 1) + elif self.opts.tab_switch_strategy == 'right': + next_active_tab = min(self.active_tab_idx, len(self.tabs) - 1) - if next_active_tab < 0: - next_active_tab = max(0, min(self.active_tab_idx, len(self.tabs) - 1)) + if next_active_tab < 0: + next_active_tab = max(0, min(self.active_tab_idx, len(self.tabs) - 1)) - self._set_active_tab(next_active_tab) + self._set_active_tab(next_active_tab) self.mark_tab_bar_dirty() tab.destroy()