From 215bbf68de2dbabee955f5ab721d285a279ef470 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Mar 2026 14:00:57 +0000 Subject: [PATCH 1/2] Fix spurious mouse release event during drag out of OS window Co-authored-by: kovidgoyal <1308621+kovidgoyal@users.noreply.github.com> Agent-Logs-Url: https://github.com/kovidgoyal/kitty/sessions/f4f7b9e7-102b-4af7-aa03-4fb7a85d6ed0 --- docs/changelog.rst | 1 + glfw/window.c | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index f17bb0a5b..52010cbff 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -186,6 +186,7 @@ Detailed list of changes - The :opt:`show_hyperlink_targets` option now allows specifying a keyboard modifier so that target URLs are only shown on hover when the modifier is pressed (:pull:`9741`) +- Fix a spurious mouse button release event being sent when dragging out of an OS window causes focus loss 0.46.2 [2026-03-21] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/glfw/window.c b/glfw/window.c index 652034fbe..2eebfcbbb 100644 --- a/glfw/window.c +++ b/glfw/window.c @@ -63,8 +63,14 @@ void _glfwInputWindowFocus(_GLFWwindow* window, bool focused) for (int button = 0; button <= GLFW_MOUSE_BUTTON_LAST; button++) { - if (window->mouseButtons[button] == GLFW_PRESS) + if (window->mouseButtons[button] == GLFW_PRESS) { + // Skip releasing the left mouse button when a drag is in + // progress from this window to avoid spurious release events. + // The release will be sent after the drag completes. + if (button == GLFW_MOUSE_BUTTON_LEFT && _glfw.drag.window_id == window->id) + continue; _glfwInputMouseClick(window, button, GLFW_RELEASE, 0); + } } } else _glfw.focusedWindowId = window->id; From efe319f755ce9f32acaa9bbe194553a873953483 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Mar 2026 14:16:44 +0000 Subject: [PATCH 2/2] Send synthetic left button release after drag ends to fix stale mouse state Co-authored-by: kovidgoyal <1308621+kovidgoyal@users.noreply.github.com> Agent-Logs-Url: https://github.com/kovidgoyal/kitty/sessions/e3cf07a9-b3c0-4786-b264-a83b85f098ac --- glfw/input.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/glfw/input.c b/glfw/input.c index 9ded16610..7f24f2137 100644 --- a/glfw/input.c +++ b/glfw/input.c @@ -1160,6 +1160,7 @@ GLFWAPI GLFWdragsourcefun glfwSetDragSourceCallback(GLFWwindow* handle, GLFWdrag void _glfwFreeDragSourceData(void) { + GLFWid drag_window_id = _glfw.drag.window_id; _glfwPlatformFreeDragSourceData(); if (_glfw.drag.items) { for (size_t i = 0; i < _glfw.drag.item_count; i++) { @@ -1171,6 +1172,15 @@ _glfwFreeDragSourceData(void) { GLFWid iid = _glfw.drag.instance_id; memset(&_glfw.drag, 0, sizeof(_glfw.drag)); _glfw.drag.instance_id = iid; + // Send a synthetic left button release to the drag source window if the + // button is still marked as pressed. The focus-loss release was suppressed + // while the drag was in progress, and on some platforms (Wayland, Cocoa) + // the OS never sends a natural button release after the drag ends. + if (drag_window_id) { + _GLFWwindow* drag_window = _glfwWindowForId(drag_window_id); + if (drag_window && drag_window->mouseButtons[GLFW_MOUSE_BUTTON_LEFT] == GLFW_PRESS) + _glfwInputMouseClick(drag_window, GLFW_MOUSE_BUTTON_LEFT, GLFW_RELEASE, 0); + } } GLFWAPI int