From 1aaae286a8a540b8ee3f58491f96cedff8b04fc5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 19 May 2026 02:00:12 +0000 Subject: [PATCH 1/2] glfw/input.c: remove duplicate mimetypes in _glfwInputDropEvent using verstable Agent-Logs-Url: https://github.com/kovidgoyal/kitty/sessions/2d7a111f-7d98-4cb0-b085-823736cbf5db Co-authored-by: kovidgoyal <1308621+kovidgoyal@users.noreply.github.com> --- glfw/input.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/glfw/input.c b/glfw/input.c index 8419ea44b..92d575502 100644 --- a/glfw/input.c +++ b/glfw/input.c @@ -37,6 +37,10 @@ #include #include +#define NAME mime_dedup_set +#define KEY_TY const char * +#include "../3rdparty/verstable.h" + // Internal key state used for sticky keys #define _GLFW_STICK 3 @@ -411,6 +415,25 @@ void _glfwInputCursorEnter(_GLFWwindow* window, bool entered) // mimes[0]. size_t _glfwInputDropEvent(_GLFWwindow *window, GLFWDropEventType type, double xpos, double ypos, const char** mimes, size_t num_mimes, bool from_self) { if (!window->callbacks.drop_event) return 0; + if (num_mimes > 1) { + mime_dedup_set seen; + mime_dedup_set_init(&seen); + size_t write_pos = 0; + for (size_t i = 0; i < num_mimes; i++) { + if (mime_dedup_set_is_end(mime_dedup_set_get(&seen, mimes[i]))) { + if (!mime_dedup_set_is_end(mime_dedup_set_insert(&seen, mimes[i]))) + mimes[write_pos++] = mimes[i]; + else { + // OOM: keep remaining entries without further deduplication + mimes[write_pos++] = mimes[i]; + for (size_t j = i + 1; j < num_mimes; j++) mimes[write_pos++] = mimes[j]; + break; + } + } + } + num_mimes = write_pos; + mime_dedup_set_cleanup(&seen); + } GLFWDropEvent ev = { .mimes=mimes, .type=type, .xpos=xpos, .ypos=ypos, .num_mimes=num_mimes, .from_self=from_self, .read_data=type == GLFW_DROP_DATA_AVAILABLE ? _glfwPlatformReadAvailableDropData : NULL, From 9ef08fd8654a9b9e83bc24f0c8d57f0c3ea619dd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 19 May 2026 02:12:29 +0000 Subject: [PATCH 2/2] glfw/input.c: fix dedup to swap duplicates to end instead of overwriting pointers Agent-Logs-Url: https://github.com/kovidgoyal/kitty/sessions/071dfd57-73e7-4daa-8d35-955bec8b1c4b Co-authored-by: kovidgoyal <1308621+kovidgoyal@users.noreply.github.com> --- glfw/input.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/glfw/input.c b/glfw/input.c index 92d575502..8eb696c68 100644 --- a/glfw/input.c +++ b/glfw/input.c @@ -421,15 +421,22 @@ size_t _glfwInputDropEvent(_GLFWwindow *window, GLFWDropEventType type, double x size_t write_pos = 0; for (size_t i = 0; i < num_mimes; i++) { if (mime_dedup_set_is_end(mime_dedup_set_get(&seen, mimes[i]))) { - if (!mime_dedup_set_is_end(mime_dedup_set_insert(&seen, mimes[i]))) - mimes[write_pos++] = mimes[i]; - else { - // OOM: keep remaining entries without further deduplication - mimes[write_pos++] = mimes[i]; - for (size_t j = i + 1; j < num_mimes; j++) mimes[write_pos++] = mimes[j]; + if (mime_dedup_set_is_end(mime_dedup_set_insert(&seen, mimes[i]))) { + // OOM: shift remaining entries to write_pos and stop deduplicating + memmove(mimes + write_pos, mimes + i, (num_mimes - i) * sizeof(const char*)); + write_pos += num_mimes - i; break; } + // Swap the unique entry into write_pos; the displaced entry moves to + // position i where it will end up at or beyond the new num_mimes. + if (write_pos != i) { + const char *tmp = mimes[write_pos]; + mimes[write_pos] = mimes[i]; + mimes[i] = tmp; + } + write_pos++; } + // duplicate: left in-place; will end up at a position >= new num_mimes } num_mimes = write_pos; mime_dedup_set_cleanup(&seen);