Commit Graph

18107 Commits

Author SHA1 Message Date
Kovid Goyal
b4d57525ea Only base64 encode payload when needed 2026-03-21 08:41:47 +05:30
Kovid Goyal
17e941a180 Implement finishing of drops 2026-03-21 08:41:47 +05:30
Kovid Goyal
5ad55ec936 Implement drop data transmission 2026-03-21 08:41:47 +05:30
Kovid Goyal
4f404f8c85 Send dropped message 2026-03-21 08:41:47 +05:30
Kovid Goyal
3a30c47942 Get drop status updates working 2026-03-21 08:41:47 +05:30
Kovid Goyal
111b35b6a7 Implement drop leaving window 2026-03-21 08:41:47 +05:30
Kovid Goyal
fba67322d6 Some docs 2026-03-21 08:41:47 +05:30
Kovid Goyal
b0e57b4dce Send drop move events to child 2026-03-21 08:41:46 +05:30
Kovid Goyal
8d069d3bcd More dnd protocol docs 2026-03-21 08:41:46 +05:30
Kovid Goyal
5a8132d241 Start and stop accepting drops 2026-03-21 08:41:46 +05:30
Kovid Goyal
2898324047 Start work on DnD protocol 2026-03-21 08:41:46 +05:30
Kovid Goyal
4483a6c110 version 0.46.2 v0.46.2 2026-03-21 06:36:04 +05:30
mcrmck
b8da1d285f Add '+' tab indicator when dragging a window over empty tab bar space
Appends a synthetic TabBarData(tab_id=-1, title='+') to tab_bar_data
while a window drag is active. The existing tab highlight machinery
(_set_drag_target_tab / mark_tab_bar_dirty) handles hover highlighting
with no extra state. Dropping on it falls through the existing new-tab
branch in on_window_drop (tab_for_id(-1) returns None). Mark tab bar
dirty at drag start so the indicator appears immediately, and again
after set_window_being_dragged() on drop so it clears right away.
2026-03-20 20:48:10 -04:00
mcrmck
8dd4aaf111 Remove debug logging; clean up on_window_drop clear ordering 2026-03-20 01:37:19 -04:00
mcrmck
5c0a4accb3 Fix two bugs: splits layout corruption and overlay stuck on early drop exit
splits.py: insert_window_next_to called split_and_add on self.pairs_root
instead of on the pair found by pair_for_window. split_and_add only handles
direct children, so nested dest windows fell to 'else: self.two = pair',
silently replacing an entire subtree. Lost windows were re-added by
do_layout, producing phantom panes.

tabs.py: on_window_drop returned early (window not found) before calling
_clear_force_show_title_bars, leaving the drag overlay stuck on screen.
2026-03-20 01:34:01 -04:00
mcrmck
940b8bf1d3 Fix drag overlay: separate title bar highlight from body hover overlay
quadrant=5: title bar hover — full window overlay + title bar highlight
quadrant=6: body hover (non-Splits) — full window overlay only
quadrant=1-4: Splits body hover — directional half-window overlay

Previously quadrant=5 was used for all full-window cases, causing
is_drag_target=True to fire on body hover which incorrectly lit up
the title bar highlight whenever hovering any window body.
2026-03-20 01:23:23 -04:00
mcrmck
2bf4da9724 Fix: full-window overlay for title bar hover in Splits layout 2026-03-20 01:16:59 -04:00
Kovid Goyal
c57305addc Ignore dependency CVEs against unreleased versions of deps 2026-03-20 10:45:08 +05:30
Kovid Goyal
81c3fa71a0 Update changelog 2026-03-20 08:32:26 +05:30
copilot-swe-agent[bot]
7c79e2fc9e Fix text selection via click-and-drag in unfocused splits
The regression was introduced by commit b277a016b which added an early
`return` in handle_button_event that prevented kitty's internal text
selection from starting on focus-transfer clicks to unfocused splits.

Changes:
- In handle_button_event: replace the early return with a local
  suppress_child_forwarding flag that prevents PRESS from being forwarded
  to child processes in mouse-tracking mode, while still allowing
  dispatch_mouse_event to run (which starts text selection)
- In mouse_event's active_drag_in_window release path: clear
  suppress_left_mouse_release to prevent stale flags after drags

Fixes #9713
Fixes #9715
2026-03-20 08:30:53 +05:30
copilot-swe-agent[bot]
ef7b456ce7 Fix scroll valuator reset when mouse leaves window without focus change
Fixes #9716
2026-03-20 08:13:45 +05:30
Kovid Goyal
98bf76ab52 Merge branch 'master' of https://github.com/kdnk/kitty 2026-03-19 19:59:54 +05:30
Kodai Nakamura
7e62808fb7 fix: Use strict modifier check for Ctrl+H IME unmarking
Refine the check to mods == GLFW_MOD_CONTROL to ensure that
combinations like Ctrl+Shift+H do not trigger unmarkText, following
code review feedback.
2026-03-19 23:21:34 +09:00
Kodai Nakamura
2c4b6d6d8e cocoa: Unmark IME pre-edit text on Ctrl+H
This ensures that Ctrl+H behaves like Backspace and correctly clears
the pre-edit state, preventing uncommitted characters from remaining
on the screen when using IMEs like the Japanese one on macOS.
2026-03-19 23:06:09 +09:00
Kovid Goyal
4eaf380c30 Update changelog 2026-03-19 15:36:02 +05:30
copilot-swe-agent[bot]
d37a9fd48a Fix marker highlighting for CJK/wide chars not at position 0
Fixes #9705
Fixes #9706
2026-03-19 15:35:14 +05:30
Kovid Goyal
0051b7b046 Update changelog 2026-03-19 15:33:03 +05:30
copilot-swe-agent[bot]
36be8be951 Fix massive scroll on focus return by resetting X11 scroll valuators on focus loss
When kitty loses focus and the user scrolls in another
application, X11 XI scroll valuators accumulate position values. When the
user returns to kitty and scrolls, delta (value - v->value) uses the stale
pre-focus-loss value, causing a massive unexpected scroll jump.

Fix: reset scroll valuators (mark them uninitialized) on FocusOut so the
first scroll event after focus is regained sets the baseline without firing
a scroll event.

Fixes #9703
Fixes #9707
2026-03-19 15:31:22 +05:30
Kovid Goyal
7c8e797985 Merge branch 'numtabs-i586-pr' of https://github.com/Blarse/kitty 2026-03-19 14:35:57 +05:30
Egor Ignatov
35acfb79c5 Fix signed/unsigned comparison error on i586 in pyreorder_tabs
On 32-bit platforms Py_ssize_t is int (signed 32-bit), while
os_window->num_tabs is unsigned int. Direct comparison triggers
-Werror=sign-compare. Cast the unsigned side to Py_ssize_t to
silence the warning. The value can never overflow Py_ssize_t
since num_tabs is bounded by the number of open tabs.
2026-03-19 09:20:40 +03:00
mcrmck
2c81a69aad Add drag-and-drop quadrant preview overlay
During a window title-bar drag, render a semi-transparent tint over
the destination window to preview the drop outcome:

- Full-window tint (quadrant=5) when hovering any window in swap-based
  layouts (Tall, Stack, Fat, etc.) or over a title bar — swap is the
  result so the whole window is highlighted.
- Half-window directional tint (quadrant 1-4) when hovering in the
  Splits layout — a real directional insert happens so only the target
  half is highlighted.
- 150ms fade-in; clears immediately on drop or drag exit.

Implementation follows the visual_bell TINT_PROGRAM infrastructure:
two new Screen fields (start_drag_overlay_at, drag_overlay_quadrant),
draw_drag_preview_overlay() in shaders.c called from draw_cells() after
both render paths, set_window_drag_overlay() C→Python bridge in state.c,
and the same child-monitor.c needs_render + set_maximum_wait hooks that
visual_bell uses to keep frames firing during animation.

Layout detection uses hasattr(layout, 'insert_window_next_to') — the
same guard _insert_window_in_direction uses internally — so the overlay
always matches the actual drop behavior.
2026-03-18 00:30:37 -04:00
mcrmck
39820e79ff Fix mypy error: remove invalid 'none' check on window_title_bar option 2026-03-17 23:36:03 -04:00
mcrmck
49f6c926e0 Fix window drag-drop: force-show title bars and add new-tab drop target
- start_window_drag now force-shows title bars on all tabs during a drag
  so the user can actually drop onto them to trigger a swap. The cleanup
  code to clear force_show_title_bars already existed but the corresponding
  set was never written.

- on_window_drop_move now only highlights a destination window's title bar
  when the cursor is actually within the title bar row, so the visual
  feedback accurately reflects what will happen on drop (swap vs split).

- Dropping a window onto the empty space in the tab bar (past the last tab)
  now creates a new tab and moves the window into it.
2026-03-17 23:26:55 -04:00
mcrmck
462f7025fb Merge upstream/master into feat-draggable-window-title-bars
Resolves conflict in kitty/tabs.py by keeping both force_show_title_bars
and renaming_in_window fields.
2026-03-17 22:40:28 -04:00
Kovid Goyal
ecf497b5ab Merge branch 'ls-title-overridden' of https://github.com/dannydulai/kitty 2026-03-17 22:11:42 +05:30
Danny Dulai
226195d18c Add title_overridden field to kitty @ ls output 2026-03-17 12:25:44 -04:00
Kovid Goyal
61421c9763 ... 2026-03-17 21:27:20 +05:30
Kovid Goyal
6360525a2a Fix shadow being drawn over notch area child window 2026-03-17 21:07:32 +05:30
Kovid Goyal
0321ca04f0 Cleanup previous PR
Fix leak of sub view and ensure child window has correct color space
2026-03-17 20:14:02 +05:30
Kovid Goyal
42305c3464 Merge branch 'safe-area-insets' of https://github.com/dannydulai/kitty 2026-03-17 19:55:19 +05:30
Danny Dulai
489473a8cf Add macOS notch avoidance for traditional fullscreen
Position the window below the notch by reducing the frame height by
safeAreaInsets.top. Create a fullscreen child window behind it with a
colored subview covering just the notch strip, matching the terminal
background color and opacity.

Also fix background_opacity not triggering a chrome update on config
reload.
2026-03-17 10:06:57 -04:00
Kovid Goyal
0479962dd7 Update changelog 2026-03-17 14:29:56 +05:30
copilot-swe-agent[bot]
3862ae26cc Fix fuzzy match highlighting in choose_files kitten
Fixes #9693
2026-03-17 14:28:56 +05:30
Kovid Goyal
f2734fcfbd Cleanup copilot code 2026-03-17 13:39:07 +05:30
copilot-swe-agent[bot]
e98f80d836 Prevent multiple stacking Rename tab overlay windows
Fixes #9691
Fixes #9692
2026-03-17 13:37:08 +05:30
Kovid Goyal
f57eb74dbe Update changelog 2026-03-17 09:31:51 +05:30
Kovid Goyal
8457258f26 ... 2026-03-17 09:30:23 +05:30
Kovid Goyal
6704f359a9 Update changelog 2026-03-17 08:57:30 +05:30
copilot-swe-agent[bot]
877be65447 Fix crashes when moving tab between OS windows (issue #9677)
Wayland (glfw/wl_window.c):
- Fix out-of-bounds access in send_drag_data: look up item by MIME type
  instead of using the data-request index i to index _glfw.drag.items[].
  The compositor calls drag_source_send once per target window entered,
  so _glfw.wl.drag.count grows independently of item_count, causing
  _glfw.drag.items[i] to be out-of-bounds on the second drag, yielding a
  garbage optional_data pointer that made write() fail with EFAULT.
- Fix protocol error "Drag has not ended": change on_fail and the
  GLFW_DRAG_DATA_REQUEST error path to call finish_drag_write(i)+return
  instead of cancel_drag(), which was calling wl_data_source_destroy()
  before the compositor ended the drag, violating the Wayland protocol.
- Fix double-free of dr.pending_data: null the pointer after free and
  add cleanup to finish_drag_write().
- Fix missing finish_drag_write() after a full write in data-request
  mode, which left the pipe open causing the target to wait for EOF.

X11 (glfw/x11_window.c):
- Wrap XSendEvent() calls in send_xdnd_enter/position/leave/drop with
  _glfwGrabErrorHandlerX11()/_glfwReleaseErrorHandlerX11(). A target
  window destroyed between discovery and message delivery produced a
  BadWindow error that hit the default X11 abort handler. Now handled
  gracefully by clearing current_target or cancelling the drag."

Fixes #9677
Fixes #9683
2026-03-17 08:53:17 +05:30
Kovid Goyal
ad53a5bdff Cleanup previous PR 2026-03-17 08:40:56 +05:30