From 0a69b89a80d237431edc5c9577864415ec805817 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 12 May 2026 12:23:57 +0530 Subject: [PATCH] More work on dnd kitten --- kitty/dnd.c | 13 +++++++++++-- kitty_tests/dnd_kitten.py | 17 +++++++++-------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/kitty/dnd.c b/kitty/dnd.c index 43332acf9..45152f6fa 100644 --- a/kitty/dnd.c +++ b/kitty/dnd.c @@ -1643,6 +1643,12 @@ is_file_url(const char *url) { return url != NULL && strlen(url) > sizeof("file://")-1 && memcmp(url, "file://", sizeof("file://")-1) == 0; } +const char* +my_basename(const char *path) { + const char *base = strrchr(path, '/'); // Change to '\\' for Windows + return base ? base + 1 : path; +} + static bool request_remote_files(Window *w, size_t i) { #define mi ds.items[i] @@ -1656,6 +1662,7 @@ request_remote_files(Window *w, size_t i) { queue_payload_to_child( w->id, w->drag_source.client_id, &w->drag_source.pending, buf, header_sz, NULL, 0, false); mi.remote_items[k].waiting_for_completion = true; + mi.remote_items[k].dir_entry_name = strdup(my_basename(mi.uri_list[k])); } } return true; @@ -2122,7 +2129,9 @@ drag_offer_start_to_child(Window *w, int32_t cell_x, int32_t cell_y, int32_t pix static void finish_remote_data_if_all_items_received(Window *w, unsigned mime_item_idx) { for (size_t i = 0; i < mi.num_remote_items; i++) { - if (mi.remote_items[i].waiting_for_completion && !mi.remote_items[i].completed) return; + if (mi.remote_items[i].waiting_for_completion && !mi.remote_items[i].completed) { + return; + } } finish_remote_data(w, mime_item_idx); } @@ -2494,7 +2503,7 @@ dnd_test_probe_state(PyObject *self UNUSED, PyObject *args) { if (mi.is_uri_list && mi.requested_remote_files) { for (size_t i = 0; i < mi.num_remote_items; i++) { if (mi.remote_items[i].waiting_for_completion && !mi.remote_items[i].completed) - return PyUnicode_FromString(mi.remote_items[i].dir_entry_name); + return PyUnicode_FromString(mi.remote_items[i].dir_entry_name ? mi.remote_items[i].dir_entry_name : ""); } } #undef mi diff --git a/kitty_tests/dnd_kitten.py b/kitty_tests/dnd_kitten.py index f504cdabc..dae659ddd 100644 --- a/kitty_tests/dnd_kitten.py +++ b/kitty_tests/dnd_kitten.py @@ -61,9 +61,9 @@ def create_fs(base, include_toplevel_working_symlink=True): w(4096 * 3 + 113, 'some-image.png') w(0, 'd1', 'f1') w(0, 'd1', 'f2') - w(0, 'd1', 'sd', 'f1') - w(0, 'd1', 'sd', 'ssd', 'f1') - os.symlink('../moose', join('d1', 'sd', 'ssd', 's1')) + w(0, 'd1', 'sd', 'f11') + w(0, 'd1', 'sd', 'ssd', 'f111') + os.symlink('../moose', join('d1', 'sd', 'ssd', 's11')) class TestDnDKitten(BaseTest): @@ -388,20 +388,21 @@ class TestDnDKitten(BaseTest): def read_drag_data(self, mime, timeout=10): # self.pty.log_data_flow = True ans = b'' - st = time.monotonic() - while time.monotonic() - st < timeout: + end_time = time.monotonic() + timeout + while time.monotonic() <= end_time: try: chunk = dnd_test_drag_get_data(self.capture.window_id, mime) if not chunk: - break + return ans ans += chunk except OSError as err: if err.errno == errno.EAGAIN: - self.pty.process_input_from_child(timeout=st + timeout - time.monotonic()) + self.pty.process_input_from_child(timeout=end_time - time.monotonic()) continue chunk = ans = b'' raise - return ans + chunk = ans = b'' + raise TimeoutError(f'timed out waiting for data from drag_get_data for {mime}') def dnd_kitten_drag(self, remote_client, img_drop_path): # self.pty.log_data_flow = True