When using --keep-focus ensure active history list is not affected

Fixes #4987
This commit is contained in:
Kovid Goyal 2022-04-18 20:23:15 +05:30
parent b569c01b49
commit c4c62c1505
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
4 changed files with 16 additions and 8 deletions

View File

@ -380,14 +380,14 @@ class Boss:
if q: if q:
yield q yield q
def set_active_window(self, window: Window, switch_os_window_if_needed: bool = False) -> Optional[int]: def set_active_window(self, window: Window, switch_os_window_if_needed: bool = False, for_keep_focus: bool = False) -> Optional[int]:
for os_window_id, tm in self.os_window_map.items(): for os_window_id, tm in self.os_window_map.items():
for tab in tm: for tab in tm:
for w in tab: for w in tab:
if w.id == window.id: if w.id == window.id:
if tab is not self.active_tab: if tab is not self.active_tab:
tm.set_active_tab(tab) tm.set_active_tab(tab, for_keep_focus=window.tabref() if for_keep_focus else None)
tab.set_active_window(w) tab.set_active_window(w, for_keep_focus=window if for_keep_focus else None)
if switch_os_window_if_needed and current_os_window() != os_window_id: if switch_os_window_if_needed and current_os_window() != os_window_id:
focus_os_window(os_window_id, True) focus_os_window(os_window_id, True)
return os_window_id return os_window_id

View File

@ -476,7 +476,7 @@ def launch(
if opts.color: if opts.color:
apply_colors(new_window, opts.color) apply_colors(new_window, opts.color)
if opts.keep_focus and active: if opts.keep_focus and active:
boss.set_active_window(active, switch_os_window_if_needed=True) boss.set_active_window(active, switch_os_window_if_needed=True, for_keep_focus=True)
if opts.logo: if opts.logo:
new_window.set_logo(opts.logo, opts.logo_position or '', opts.logo_alpha) new_window.set_logo(opts.logo, opts.logo_position or '', opts.logo_alpha)
return new_window return new_window

View File

@ -504,8 +504,8 @@ class Tab: # {{{
attach_window(self.os_window_id, self.id, window.id) attach_window(self.os_window_id, self.id, window.id)
self._add_window(window) self._add_window(window)
def set_active_window(self, x: Union[Window, int]) -> None: def set_active_window(self, x: Union[Window, int], for_keep_focus: Optional[Window] = None) -> None:
self.windows.set_active_window_group_for(x) self.windows.set_active_window_group_for(x, for_keep_focus=for_keep_focus)
def get_nth_window(self, n: int) -> Optional[Window]: def get_nth_window(self, n: int) -> Optional[Window]:
if self.windows: if self.windows:
@ -865,12 +865,16 @@ class TabManager: # {{{
tab.relayout_borders() tab.relayout_borders()
self.mark_tab_bar_dirty() self.mark_tab_bar_dirty()
def set_active_tab(self, tab: Tab) -> bool: def set_active_tab(self, tab: Tab, for_keep_focus: Optional[Tab] = None) -> bool:
try: try:
idx = self.tabs.index(tab) idx = self.tabs.index(tab)
except Exception: except Exception:
return False return False
self.set_active_tab_idx(idx) self.set_active_tab_idx(idx)
h = self.active_tab_history
if for_keep_focus and len(h) > 2 and h[-2] == for_keep_focus.id and h[-1] != for_keep_focus.id:
h.pop()
h.pop()
return True return True
def next_tab(self, delta: int = 1) -> None: def next_tab(self, delta: int = 1) -> None:

View File

@ -303,7 +303,7 @@ class WindowList:
return self.id_map[self.groups[self.active_group_idx].base_window_id] return self.id_map[self.groups[self.active_group_idx].base_window_id]
return None return None
def set_active_window_group_for(self, x: WindowOrId) -> None: def set_active_window_group_for(self, x: WindowOrId, for_keep_focus: Optional[WindowType] = None) -> None:
try: try:
q = self.id_map[x] if isinstance(x, int) else x q = self.id_map[x] if isinstance(x, int) else x
except KeyError: except KeyError:
@ -311,6 +311,10 @@ class WindowList:
for i, group in enumerate(self.groups): for i, group in enumerate(self.groups):
if q in group: if q in group:
self.set_active_group_idx(i) self.set_active_group_idx(i)
h = self.active_group_history
if for_keep_focus and len(h) > 2 and h[-2] == for_keep_focus.id and h[-1] != for_keep_focus.id:
h.pop()
h.pop()
break break
def add_window( def add_window(