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;
|
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
|
static bool
|
||||||
request_remote_files(Window *w, size_t i) {
|
request_remote_files(Window *w, size_t i) {
|
||||||
#define mi ds.items[i]
|
#define mi ds.items[i]
|
||||||
|
|
@ -1656,6 +1662,7 @@ request_remote_files(Window *w, size_t i) {
|
||||||
queue_payload_to_child(
|
queue_payload_to_child(
|
||||||
w->id, w->drag_source.client_id, &w->drag_source.pending, buf, header_sz, NULL, 0, false);
|
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].waiting_for_completion = true;
|
||||||
|
mi.remote_items[k].dir_entry_name = strdup(my_basename(mi.uri_list[k]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
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
|
static void
|
||||||
finish_remote_data_if_all_items_received(Window *w, unsigned mime_item_idx) {
|
finish_remote_data_if_all_items_received(Window *w, unsigned mime_item_idx) {
|
||||||
for (size_t i = 0; i < mi.num_remote_items; i++) {
|
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);
|
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) {
|
if (mi.is_uri_list && mi.requested_remote_files) {
|
||||||
for (size_t i = 0; i < mi.num_remote_items; i++) {
|
for (size_t i = 0; i < mi.num_remote_items; i++) {
|
||||||
if (mi.remote_items[i].waiting_for_completion && !mi.remote_items[i].completed)
|
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
|
#undef mi
|
||||||
|
|
|
||||||
|
|
@ -61,9 +61,9 @@ def create_fs(base, include_toplevel_working_symlink=True):
|
||||||
w(4096 * 3 + 113, 'some-image.png')
|
w(4096 * 3 + 113, 'some-image.png')
|
||||||
w(0, 'd1', 'f1')
|
w(0, 'd1', 'f1')
|
||||||
w(0, 'd1', 'f2')
|
w(0, 'd1', 'f2')
|
||||||
w(0, 'd1', 'sd', 'f1')
|
w(0, 'd1', 'sd', 'f11')
|
||||||
w(0, 'd1', 'sd', 'ssd', 'f1')
|
w(0, 'd1', 'sd', 'ssd', 'f111')
|
||||||
os.symlink('../moose', join('d1', 'sd', 'ssd', 's1'))
|
os.symlink('../moose', join('d1', 'sd', 'ssd', 's11'))
|
||||||
|
|
||||||
|
|
||||||
class TestDnDKitten(BaseTest):
|
class TestDnDKitten(BaseTest):
|
||||||
|
|
@ -388,20 +388,21 @@ class TestDnDKitten(BaseTest):
|
||||||
def read_drag_data(self, mime, timeout=10):
|
def read_drag_data(self, mime, timeout=10):
|
||||||
# self.pty.log_data_flow = True
|
# self.pty.log_data_flow = True
|
||||||
ans = b''
|
ans = b''
|
||||||
st = time.monotonic()
|
end_time = time.monotonic() + timeout
|
||||||
while time.monotonic() - st < timeout:
|
while time.monotonic() <= end_time:
|
||||||
try:
|
try:
|
||||||
chunk = dnd_test_drag_get_data(self.capture.window_id, mime)
|
chunk = dnd_test_drag_get_data(self.capture.window_id, mime)
|
||||||
if not chunk:
|
if not chunk:
|
||||||
break
|
return ans
|
||||||
ans += chunk
|
ans += chunk
|
||||||
except OSError as err:
|
except OSError as err:
|
||||||
if err.errno == errno.EAGAIN:
|
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
|
continue
|
||||||
chunk = ans = b''
|
chunk = ans = b''
|
||||||
raise
|
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):
|
def dnd_kitten_drag(self, remote_client, img_drop_path):
|
||||||
# self.pty.log_data_flow = True
|
# self.pty.log_data_flow = True
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue