More work on dnd kitten

This commit is contained in:
Kovid Goyal 2026-05-12 12:23:57 +05:30
parent 12bdf972e0
commit 0a69b89a80
No known key found for this signature in database
GPG key ID: 06BC317B515ACE7C
2 changed files with 20 additions and 10 deletions

View file

@ -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

View file

@ -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