Remote control: When matching windows allow using negative id numbers to match recently created windows

Fixes #5753
This commit is contained in:
Kovid Goyal 2022-12-10 11:17:55 +05:30
parent 66e7919171
commit f03a665e09
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 24 additions and 2 deletions

View File

@ -67,6 +67,8 @@ Detailed list of changes
- Wayland: Fix signal handling not working with some GPU drivers (:iss:`4636`)
- Remote control: When matching windows allow using negative id numbers to match recently created windows (:iss:`5753`)
0.26.5 [2022-11-07]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -379,8 +379,16 @@ class Boss:
tm = self.os_window_map.get(last_focused_os_window_id())
if tm is not None:
tab = tm.active_tab
window_id_limit = max(self.window_id_map, default=-1) + 1
def get_matches(location: str, query: str, candidates: Set[int]) -> Set[int]:
if location == 'id' and query.startswith('-'):
try:
q = int(query)
except Exception:
return set()
if q < 0:
query = str(window_id_limit + q)
return {wid for wid in candidates if self.window_id_map[wid].matches_query(location, query, tab)}
for wid in search(match, (
@ -403,8 +411,18 @@ class Boss:
if current_focused_os_window_id() <= 0:
tm = self.os_window_map.get(last_focused_os_window_id()) or tm
tim = {t.id: t for t in self.all_tabs}
tab_id_limit = max(tim, default=-1) + 1
window_id_limit = max(self.window_id_map, default=-1) + 1
def get_matches(location: str, query: str, candidates: Set[int]) -> Set[int]:
if location in ('id', 'window_id') and query.startswith('-'):
try:
q = int(query)
except Exception:
return set()
if q < 0:
limit = tab_id_limit if location == 'id' else window_id_limit
query = str(limit + q)
return {wid for wid in candidates if tim[wid].matches_query(location, query, tm)}
found = False

View File

@ -103,7 +103,8 @@ Where :italic:`field` can be one of: :code:`id`, :code:`title`, :code:`pid`, :co
The special value :code:`all` matches all windows.
For numeric fields: :code:`id`, :code:`pid`, :code:`num` and :code:`recent`, the expression is interpreted as
a number, not a regular expression.
a number, not a regular expression. Negative values for :code:`id` match from the highest id number down, in particular,
-1 is the most recently created window.
The field :code:`num` refers to the window position in the current tab, starting from zero and counting clockwise (this
is the same as the order in which the windows are reported by the :ref:`kitty @ ls <at-ls>` command).
@ -134,7 +135,8 @@ Where :italic:`field` can be one of: :code:`id`, :code:`index`, :code:`title`, :
The special value :code:`all` matches all tabs.
For numeric fields: :code:`id`, :code:`index`, :code:`window_id`, :code:`pid` and :code:`recent`, the
expression is interpreted as a number, not a regular expression.
expression is interpreted as a number, not a regular expression. Negative values for :code:`id`/:code:`window_id` match
from the highest id number down, in particular, -1 is the most recently created tab/window.
When using :code:`title` or :code:`id`, first a matching tab is looked for, and if not found a matching window is looked
for, and the tab for that window is used.