Skip to content

Commit ba95be8

Browse files
committed
More work on DnD protocol
1 parent df20d4a commit ba95be8

2 files changed

Lines changed: 15 additions & 14 deletions

File tree

kitty/dnd.c

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,8 +1057,9 @@ drop_left_child(Window *w) {
10571057

10581058
#define ds w->drag_source
10591059

1060-
static void
1061-
drag_free_built_data(Window *w) {
1060+
void
1061+
drag_free_offer(Window *w) {
1062+
free(ds.mimes_buf); ds.mimes_buf = NULL; ds.bufsz = 0;
10621063
if (ds.items) {
10631064
for (size_t i=0; i < ds.num_mimes; i++) {
10641065
free(ds.items[i].optional_data);
@@ -1072,12 +1073,6 @@ drag_free_built_data(Window *w) {
10721073
if (ds.images[i].data) free(ds.images[i].data);
10731074
zero_at_ptr(ds.images + i);
10741075
}
1075-
}
1076-
1077-
void
1078-
drag_free_offer(Window *w) {
1079-
free(ds.mimes_buf); ds.mimes_buf = NULL; ds.bufsz = 0;
1080-
drag_free_built_data(w);
10811076
ds.allowed_operations = 0;
10821077
ds.state = DRAG_SOURCE_NONE;
10831078
ds.pre_sent_total_sz = 0;
@@ -1148,6 +1143,7 @@ drag_add_mimes(Window *w, int allowed_operations, uint32_t client_id, const char
11481143
while (p < end) {
11491144
if (*p) {
11501145
if (ds.num_mimes >= rough_count + 1) break;
1146+
ds.items[ds.num_mimes].is_uri_list = strcmp(p, "text/uri-list") == 0;
11511147
ds.items[ds.num_mimes++].mime_type = p;
11521148
p += strlen(p) + 1;
11531149
} else p++;
@@ -1367,8 +1363,9 @@ drag_get_data(Window *w, const char *mime_type, size_t *sz, int *err_code) {
13671363
}
13681364
// No fd yet, request data from the client
13691365
char buf[128];
1366+
ds.items[i].requested_remote_files = ds.is_remote_client && ds.items[i].is_uri_list;
13701367
int header_sz = snprintf(buf, sizeof(buf), "\x1b]%d;t=e:x=%d:y=%zu:Y=%d",
1371-
DND_CODE, DRAG_NOTIFY_FINISHED + 2, i, ds.is_remote_client);
1368+
DND_CODE, DRAG_NOTIFY_FINISHED + 2, i, ds.items[i].requested_remote_files);
13721369
queue_payload_to_child(w->id, w->drag_source.client_id, &w->drag_source.pending, buf, header_sz, NULL, 0, false);
13731370
*err_code = EAGAIN;
13741371
return NULL;
@@ -1427,8 +1424,10 @@ drag_process_item_data(Window *w, size_t idx, int has_more, const uint8_t *paylo
14271424
if (has_more == 0 && payload_sz == 0) {
14281425
ds.items[idx].data_decode_initialized = false;
14291426
if (ds.items[idx].fd_plus_one > 0) {
1430-
int ret = notify_drag_data_ready(global_state.drag_source.from_os_window, ds.items[idx].mime_type);
1431-
if (ret) cancel_drag(w, ret);
1427+
if (!ds.items[idx].requested_remote_files) {
1428+
int ret = notify_drag_data_ready(global_state.drag_source.from_os_window, ds.items[idx].mime_type);
1429+
if (ret) cancel_drag(w, ret);
1430+
}
14321431
}
14331432
return;
14341433
}
@@ -1465,8 +1464,10 @@ drag_process_item_data(Window *w, size_t idx, int has_more, const uint8_t *paylo
14651464
}
14661465
ds.items[idx].data_capacity += outlen;
14671466
// Notify as soon as any data is available
1468-
int ret = notify_drag_data_ready(global_state.drag_source.from_os_window, ds.items[idx].mime_type);
1469-
if (ret) cancel_drag(w, ret);
1467+
if (!ds.items[idx].requested_remote_files) {
1468+
int ret = notify_drag_data_ready(global_state.drag_source.from_os_window, ds.items[idx].mime_type);
1469+
if (ret) cancel_drag(w, ret);
1470+
}
14701471
}
14711472
}
14721473

kitty/state.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ typedef struct Window {
302302
char *mimes_buf; size_t num_mimes, bufsz;
303303
struct {
304304
const char *mime_type; uint8_t *optional_data; size_t data_size, data_capacity; base64_state base64_state;
305-
bool data_decode_initialized; int fd_plus_one;
305+
bool data_decode_initialized, is_uri_list, requested_remote_files; int fd_plus_one;
306306
} *items;
307307
struct {
308308
int width, height, fmt; uint8_t *data; size_t sz, capacity; bool started; base64_state base64_state;

0 commit comments

Comments
 (0)