Add draggable window title bars

Implements drag-to-reorder for window title bars, following up on the
merged window title bar feature (#9450) and the design discussion in #9619.

- Drag a title bar and drop on another title bar to swap positions
- Drop on a window body quadrant (left/right/top/bottom) to insert as
  a directional split; Splits layout uses insert_window_next_to(), other
  layouts fall back to move_window_to_group()
- Drop on a tab bar tab to move the window into that tab
- Drop on another OS window to move into its active tab
- Drop outside kitty to detach into a new OS window
- Tab bar highlights the hovered tab during a window drag, mirroring
  how the destination window title bar is highlighted
- toggle_window_title_bars action temporarily force-shows title bars
  for drag-to-reorder when they are normally hidden, auto-hiding after
  the drag completes
- window_title_bar_drag_threshold option (default 5px) controls how far
  the mouse must move before a drag is initiated; 0 disables dragging

MIME type follows the same convention as tab dragging:
application/net.kovidgoyal.kitty-window-{PID}

Ref: #9619
This commit is contained in:
mcrmck
2026-03-08 20:56:38 -04:00
parent db5453c291
commit 59c963c481
15 changed files with 391 additions and 29 deletions

View File

@@ -660,6 +660,7 @@ class Window:
created_in_session_name: str = ''
serialized_id: int = 0
show_title_bar: bool = False # must be set before calling set_geometry
is_drag_target: bool = False # highlight this window's title bar as a drop target
@classmethod
@contextmanager
@@ -1069,7 +1070,7 @@ class Window:
data = WindowTitleData(
title=self.title or '',
is_active=is_active,
is_active=is_active or self.is_drag_target,
window_id=self.id,
tab_id=self.tab_id,
needs_attention=self.needs_attention,