From e95060b8bfb1a5a953dc1c35f7b761df0f5c93f3 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 4 Dec 2025 14:26:39 +0530 Subject: [PATCH] DRYer --- kitty/boss.py | 5 +---- kitty/tabs.py | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/kitty/boss.py b/kitty/boss.py index 698bcd95f..fb7a794b1 100644 --- a/kitty/boss.py +++ b/kitty/boss.py @@ -3079,10 +3079,7 @@ def _move_window_to( else: return - overlay_for = 0 - for detached_window in src_tab.detach_window(window): - target_tab.attach_window(detached_window, overlay_for=overlay_for) - overlay_for = detached_window.id + target_tab.attach_windows(src_tab.detach_window(window)) self._cleanup_tab_after_window_removal(src_tab) target_tab.make_active() diff --git a/kitty/tabs.py b/kitty/tabs.py index 693d89ead..4122e7695 100644 --- a/kitty/tabs.py +++ b/kitty/tabs.py @@ -10,7 +10,6 @@ from collections.abc import Callable, Generator, Iterable, Iterator, Sequence from contextlib import suppress from gettext import gettext as _ -from operator import attrgetter from typing import ( Any, Deque, @@ -733,12 +732,16 @@ def overlay_parent(self, window: Window) -> Window | None: prev = x return prev - def remove_window(self, window: Window, destroy: bool = True) -> None: + def remove_window(self, window: Window, destroy: bool = True, do_post_removal_update: bool = True) -> None: self.windows.remove_window(window) if destroy: remove_window(self.os_window_id, self.id, window.id) else: detach_window(self.os_window_id, self.id, window.id) + if do_post_removal_update: + self.post_window_removal_update() + + def post_window_removal_update(self) -> None: self.mark_tab_bar_dirty() self.relayout() active_window = self.active_window @@ -747,16 +750,22 @@ def remove_window(self, window: Window, destroy: bool = True) -> None: def detach_window(self, window: Window) -> tuple[Window, ...]: windows = list(self.windows.windows_in_group_of(window)) - windows.sort(key=attrgetter('id')) # since ids increase in order of creation for w in reversed(windows): - self.remove_window(w, destroy=False) + self.remove_window(w, destroy=False, do_post_removal_update=False) + self.post_window_removal_update() return tuple(windows) - def attach_window(self, window: Window, overlay_for: int = 0) -> None: + def attach_window(self, window: Window, overlay_for: int | None = None) -> None: window.change_tab(self) attach_window(self.os_window_id, self.id, window.id) self._add_window(window, overlay_for=overlay_for) + def attach_windows(self, windows: Iterable[Window]) -> None: + overlay_for: int | None = None + for window in windows: + self.attach_window(window, overlay_for) + overlay_for = window.id + def set_active_window(self, x: Window | int, for_keep_focus: Window | None = None) -> None: self.windows.set_active_window_group_for(x, for_keep_focus=for_keep_focus)