mirror of
https://github.com/kovidgoyal/kitty.git
synced 2026-05-13 08:26:56 +00:00
More work on dnd kitten
This commit is contained in:
parent
12bdf972e0
commit
0a69b89a80
2 changed files with 20 additions and 10 deletions
13
kitty/dnd.c
13
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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue