From 8b3daa6a505cc69da08dcf43f6745cca836a1aed Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 21 Apr 2026 08:32:42 +0530 Subject: [PATCH] Fix drop data requests --- docs/dnd-protocol.rst | 6 +++--- kittens/dnd/main.go | 7 +++++-- kitty_tests/dnd_kitten.py | 5 ++++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/docs/dnd-protocol.rst b/docs/dnd-protocol.rst index b282e04bb..2abf192a9 100644 --- a/docs/dnd-protocol.rst +++ b/docs/dnd-protocol.rst @@ -106,9 +106,9 @@ Requesting data is done by sending an escape code of the form:: OSC _dnd_code ; t=r:x=idx ST -Here ``idx`` is a 1-based index into the list of MIME types sent previously. -This will request data for the specified MIME type. The terminal must respond -with a series of escape codes of the form:: +Here ``idx`` is a 1-based index into the list of MIME types sent in the ``t=M`` +drop event. This will request data for the specified MIME type. +The terminal must respond with a series of escape codes of the form:: OSC _dnd_code ; t=r:x=idx; base64 encoded data possibly chunked ST diff --git a/kittens/dnd/main.go b/kittens/dnd/main.go index 02b9a1678..774e07a96 100644 --- a/kittens/dnd/main.go +++ b/kittens/dnd/main.go @@ -248,8 +248,11 @@ func run_loop(opts *Options, drop_dests map[string]*drop_dest, drag_sources map[ } request_mime_data := func() { - for idx := range drop_status.accepted_mimes { - lp.QueueDnDData(DC{Type: 'r', X: idx + 1}) + accepted := utils.NewSetWithItems(drop_status.accepted_mimes...) + for idx, m := range drop_status.offered_mimes { + if accepted.Has(m) { + lp.QueueDnDData(DC{Type: 'r', X: idx + 1}) + } } } diff --git a/kitty_tests/dnd_kitten.py b/kitty_tests/dnd_kitten.py index b589931bb..608d2343f 100644 --- a/kitty_tests/dnd_kitten.py +++ b/kitty_tests/dnd_kitten.py @@ -185,10 +185,12 @@ class TestDnDKitten(BaseTest): all_mimes += ' image/png' dnd_test_fake_drop_event(self.capture.window_id, False, all_mimes.split(), copy[0] + 1, copy[1] + 1) self.wait_for_state('drop_action', GLFW_DRAG_OPERATION_COPY) + self.assertEqual('text/uri-list\x00image/png', self.probe_state('drop_mimes').rstrip('\x00')) dnd_test_fake_drop_event(self.capture.window_id, True, all_mimes.split(), copy[0] + 1, copy[1] + 1) self.send_dnd_command_to_kitten('DROP_MIMES') self.wait_for_responses(all_mimes) - self.wait_for_state('drop_data_requests', ((1,0,0), (2,0,0))) + self.assertEqual('text/uri-list\x00image/png', self.probe_state('drop_mimes').rstrip('\x00')) + self.wait_for_state('drop_data_requests', ((1,0,0), (4,0,0))) self.assertEqual('text/uri-list', self.probe_state('drop_getting_data_for_mime')) create_fs(self.src_data_dir) uri_list = [] @@ -197,5 +199,6 @@ class TestDnDKitten(BaseTest): uri_list = ['moose://cow', 'frog:march'] + uri_list uri_list.insert(3, 'ignore://me') dnd_test_fake_drop_data(self.capture.window_id, 'text/uri-list', '\r\n'.join(uri_list).encode()) + self.assertEqual('image/png', self.probe_state('drop_getting_data_for_mime')) self.send_dnd_command_to_kitten('DROP_IS_REMOTE') self.wait_for_responses(str(remote_client))